diff --git a/.gitignore b/.gitignore index 10d6526..b17afa9 100644 --- a/.gitignore +++ b/.gitignore @@ -106,6 +106,7 @@ dist # TernJS port file .tern-port artifacts +deployments cache .pnp.* .yarn/* diff --git a/packages/contracts/.gitignore b/packages/contracts/.gitignore index 9f0543b..de153db 100644 --- a/packages/contracts/.gitignore +++ b/packages/contracts/.gitignore @@ -1,2 +1 @@ -deployments artifacts diff --git a/packages/contracts/contracts/OffchainResolver.sol b/packages/contracts/contracts/OffchainResolver.sol index 42df5b1..af33637 100644 --- a/packages/contracts/contracts/OffchainResolver.sol +++ b/packages/contracts/contracts/OffchainResolver.sol @@ -6,7 +6,7 @@ import "./IExtendedResolver.sol"; import "./SignatureVerifier.sol"; interface IResolverService { - function resolve(bytes calldata name, bytes calldata data) external view returns(bytes memory result, uint64 expires, bytes memory sig); + function resolve(bytes calldata name, bytes calldata data, address verifier) external view returns(bytes memory result, uint64 expires, bytes memory sig); } /** @@ -39,7 +39,7 @@ contract OffchainResolver is IExtendedResolver, SupportsInterface { * @return The return data, ABI encoded identically to the underlying function. */ function resolve(bytes calldata name, bytes calldata data) external override view returns(bytes memory) { - bytes memory callData = abi.encodeWithSelector(IResolverService.resolve.selector, name, data); + bytes memory callData = abi.encodeWithSelector(IResolverService.resolve.selector, name, data, address(this)); string[] memory urls = new string[](1); urls[0] = url; revert OffchainLookup( @@ -47,7 +47,7 @@ contract OffchainResolver is IExtendedResolver, SupportsInterface { urls, callData, OffchainResolver.resolveWithProof.selector, - abi.encode(callData, address(this)) + callData ); } diff --git a/packages/contracts/contracts/SignatureVerifier.sol b/packages/contracts/contracts/SignatureVerifier.sol index 8c9ed91..190338e 100644 --- a/packages/contracts/contracts/SignatureVerifier.sol +++ b/packages/contracts/contracts/SignatureVerifier.sol @@ -25,8 +25,7 @@ library SignatureVerifier { */ function verify(bytes calldata request, bytes calldata response) internal view returns(address, bytes memory) { (bytes memory result, uint64 expires, bytes memory sig) = abi.decode(response, (bytes, uint64, bytes)); - (bytes memory extraData, address sender) = abi.decode(request, (bytes, address)); - address signer = ECDSA.recover(makeSignatureHash(sender, expires, extraData, result), sig); + address signer = ECDSA.recover(makeSignatureHash(address(this), expires, request, result), sig); require( expires >= block.timestamp, "SignatureVerifier: Signature expired"); diff --git a/packages/contracts/hardhat.config.js b/packages/contracts/hardhat.config.js index 82fe413..7c75d77 100644 --- a/packages/contracts/hardhat.config.js +++ b/packages/contracts/hardhat.config.js @@ -1,28 +1,27 @@ // const { task } = require('hardhat/config'); -require('@nomiclabs/hardhat-etherscan'); -require('@nomiclabs/hardhat-ethers'); -require('@nomiclabs/hardhat-waffle'); -require('hardhat-deploy'); -require('hardhat-deploy-ethers'); +require("@nomiclabs/hardhat-etherscan"); +require("@nomiclabs/hardhat-ethers"); +require("@nomiclabs/hardhat-waffle"); +require("hardhat-deploy"); +require("hardhat-deploy-ethers"); real_accounts = undefined; if (process.env.DEPLOYER_KEY && process.env.OWNER_KEY) { real_accounts = [process.env.OWNER_KEY, process.env.DEPLOYER_KEY]; } const gatewayurl = - 'https://offchain-resolver-example.uc.r.appspot.com/{sender}/{data}.json'; + "https://offchain-resolver-example.uc.r.appspot.com/{sender}/{data}.json"; -let devgatewayurl = 'http://localhost:8080/{sender}/{data}.json'; +let devgatewayurl = "http://localhost:8080/{sender}/{data}.json"; if (process.env.REMOTE_GATEWAY) { - devgatewayurl = - `${process.env.REMOTE_GATEWAY}/{sender}/{data}.json`; + devgatewayurl = `${process.env.REMOTE_GATEWAY}/{sender}/{data}.json`; } /** * @type import('hardhat/config').HardhatUserConfig */ module.exports = { - solidity: '0.8.10', + solidity: "0.8.10", networks: { hardhat: { throwOnCallFailures: false, @@ -30,28 +29,35 @@ module.exports = { }, ropsten: { url: `https://ropsten.infura.io/v3/${process.env.INFURA_ID}`, - tags: ['test', 'demo'], + tags: ["test", "demo"], chainId: 3, accounts: real_accounts, gatewayurl, }, rinkeby: { url: `https://rinkeby.infura.io/v3/${process.env.INFURA_ID}`, - tags: ['test', 'demo'], + tags: ["test", "demo"], chainId: 4, accounts: real_accounts, gatewayurl, }, goerli: { url: `https://goerli.infura.io/v3/${process.env.INFURA_ID}`, - tags: ['test', 'demo'], + tags: ["test", "demo"], chainId: 5, accounts: real_accounts, gatewayurl, }, + sepolia: { + url: `https://sepolia.infura.io/v3/${process.env.INFURA_ID}`, + tags: ["test", "demo"], + chainId: 11155111, + accounts: real_accounts, + gatewayurl, + }, mainnet: { url: `https://mainnet.infura.io/v3/${process.env.INFURA_ID}`, - tags: ['demo'], + tags: ["demo"], chainId: 1, accounts: real_accounts, gatewayurl, @@ -62,7 +68,7 @@ module.exports = { }, namedAccounts: { signer: { - default: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', + default: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", }, deployer: { default: 1, diff --git a/packages/contracts/test/TestOffchainResolver.js b/packages/contracts/test/TestOffchainResolver.js index 34f520b..2ba1d42 100644 --- a/packages/contracts/test/TestOffchainResolver.js +++ b/packages/contracts/test/TestOffchainResolver.js @@ -78,10 +78,9 @@ describe('OffchainResolver', function (accounts) { it('resolves an address given a valid signature', async () => { // Generate the response data const response = defaultAbiCoder.encode(['bytes', 'uint64', 'bytes'], [resultData, expires, hexConcat([sig.r, sig._vs])]); - const encodedData = ethers.utils.defaultAbiCoder.encode(['bytes', 'address'], [callData, resolver.address]); // Call the function with the request and response - const [result] = iface.decodeFunctionResult("addr", await resolver.resolveWithProof(response, encodedData)); + const [result] = iface.decodeFunctionResult("addr", await resolver.resolveWithProof(response, callData)); expect(result).to.equal(TEST_ADDRESS); }); diff --git a/packages/gateway-worker/src/server.ts b/packages/gateway-worker/src/server.ts index a5f5dde..1462c29 100644 --- a/packages/gateway-worker/src/server.ts +++ b/packages/gateway-worker/src/server.ts @@ -102,7 +102,7 @@ export function makeServer( server.add(IResolverService_abi, [ { type: 'resolve', - func: async ([encodedName, data]: Result, request) => { + func: async ([encodedName, data, verifier]: Result, request) => { const name = decodeDnsName(Buffer.from(encodedName.slice(2), 'hex')); // Query the database const { result, validUntil } = await query(await db, name, data); @@ -112,7 +112,7 @@ export function makeServer( ['bytes', 'address', 'uint64', 'bytes32', 'bytes32'], [ '0x1900', - request?.to, + verifier, validUntil, ethers.utils.keccak256(request?.data || '0x'), ethers.utils.keccak256(result), diff --git a/packages/gateway-worker/test/server.test.ts b/packages/gateway-worker/test/server.test.ts index 0299eec..4eb3caf 100644 --- a/packages/gateway-worker/test/server.test.ts +++ b/packages/gateway-worker/test/server.test.ts @@ -77,6 +77,7 @@ describe('makeServer', () => { const outerData = IResolverService.encodeFunctionData('resolve', [ dnsName(name), innerData, + TEST_ADDRESS, ]); // Call the server with address and data const { status, body } = await server.call({ diff --git a/packages/gateway/src/server.ts b/packages/gateway/src/server.ts index ebd0be3..76664f4 100644 --- a/packages/gateway/src/server.ts +++ b/packages/gateway/src/server.ts @@ -97,7 +97,7 @@ export function makeServer(signer: ethers.utils.SigningKey, db: Database) { server.add(IResolverService_abi, [ { type: 'resolve', - func: async ([encodedName, data]: Result, request) => { + func: async ([encodedName, data, verifier]: Result, request) => { const name = decodeDnsName(Buffer.from(encodedName.slice(2), 'hex')); // Query the database const { result, validUntil } = await query(db, name, data); @@ -107,7 +107,7 @@ export function makeServer(signer: ethers.utils.SigningKey, db: Database) { ['bytes', 'address', 'uint64', 'bytes32', 'bytes32'], [ '0x1900', - request?.to, + verifier, validUntil, ethers.utils.keccak256(request?.data || '0x'), ethers.utils.keccak256(result), diff --git a/packages/gateway/test/server.test.ts b/packages/gateway/test/server.test.ts index 0299eec..4eb3caf 100644 --- a/packages/gateway/test/server.test.ts +++ b/packages/gateway/test/server.test.ts @@ -77,6 +77,7 @@ describe('makeServer', () => { const outerData = IResolverService.encodeFunctionData('resolve', [ dnsName(name), innerData, + TEST_ADDRESS, ]); // Call the server with address and data const { status, body } = await server.call({