From 588d6b553b4ffab293c61a08b2ba8f1331dc0e8a Mon Sep 17 00:00:00 2001 From: Makoto Inoue <2630+makoto@users.noreply.github.com> Date: Fri, 26 Apr 2024 17:07:54 +0100 Subject: [PATCH] Npm (#39) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make testResolver work * Update bun.lockb * Add coinType * Make text record work * Add hardhat-storage-layout * Use the real Resolver contracts * Add contenthash * Add comment * Update README * Change the license to ENS labs * Remove console.log * Add an explanation * typo * Remove L1Verifier.sol * Remove L1Verifier.sol * Rename test * Add hardhat-deploy * Add deployment script * Remove deployment addresses * Apply suggestions from code review Add indentation Co-authored-by: Nick Johnson * Add immutable and constants * Remove getStatic * Fix the wrong constants * Update bun.lockb * Remove contracts-bedrock * Update bun.lockb * Add bun * Remove package-lock.json * update bun.lockb * Use BrowserProvider * Revert to use fork * Put immutable and constant together * Use bytes20 instead * Apply suggestions from code review Co-authored-by: Nick Johnson * Remove gasLimit and gas * Add test for the empty record * Remove remote * Remove RECORD_VERSIONS_REF constant * Copy crosschain resolver to crosschain reverse resolver * Rename the function name * Add crosschain reverse registrar * Update README.md * Replace OwnedResolver with DelegatableResolverFactory * replace target with targets * Add isAuthorised * Add test for setTarget * Modify deployment code * Remove getTarget and add TargetSet event * WIP: Adding NameWrapper into test * Use L2ReverseRegistrar * Revert L1Resolver.sol and update L1ReverseResolver.sol storage slot location * Update storage slot info * Enable ccip read on name * Add clearRecords and fixed typo * Fix failing test temporarily * Update ens-contracts * Update bun * Commit bun * Update ens-contracts on crosschain-reverse-resolver * Recreate bun.lockb * Crosschain resolver with reverse registrar with deploy script (#18) * Update deploy scripts * Remove console.log * Remove blank space from the file * Add deployment script * Update deployment readme * Add getname * Add setname * Add setup script * Add getaddr * Add approve * Fix wildcard for subname * Update bun * Deploy l2 reverse registrar to base goerli * Add base deployment * Added instruction on subname registrar * Added instruction on how to register names * Add support interface (#21) * Add support interface * Use ens-contracts IExtendedResolver * Add support interface to reverse registrar * Change test name * Update L1 deployment contract address for base and OP * Remove offset from getTarget * Inherit Interfaces * Inherit interfaces for ReverseResolver * Add ERC165 signature * Add metadata (#22) * Add Metadata service * Add MetadataChanged event, change setTarget argument and TargetSet event * Update bun.lockb * Update bun.lockb * Remove comment * remove id function and get rid of node from TargetSet * Update comment, link to ENSIP16 and add variable name on the return argument of metadata function * Fix failing tests * Remove resolver name from metadata * Update comment and move MetadataChanged * Remove id * Arb deployment (#23) * Add support interface * Use ens-contracts IExtendedResolver * Add support interface to reverse registrar * Change test name * Update L1 deployment contract address for base and OP * Add arbitrum deployment script and deployed contract info * Update README * Add IERC165 * Remove DelegatableResolverRegistrar * Add Sepolia verifier contracts and gateway deployment details (#26) * Add OP sepolia gateway info * Add deployed addresses for base * Add arbitrum sepolia deployment address * Remove console.log * Update comment * Add environment on wrangler.toml * Add .wrangler to gitignore * Sepolia resolvers (#27) * Add crosschain resolver details * Updated @ensdomains/ens-contracts ensdomains/ens-contracts#feature/crosschain-resolver-with-reverse-registrar to the latest commit * Change slot * Add ReverseRegistrar deployment details * Update reverse registrar deployed addresses * Add Op sepolia reverse registrar deployment info * Added L1Resolver contract deployment details * Remove comment out * Add bun.lockb * Update bun.lockb * Change ens- ontracts to point to l2-deployment branch * Fix failing test * Update bun.lockb * Add L2ReverseRegistrar to deps.sol on crosschain-resolver (was throwing error) * Fix failing test * Remove unused subheader * Redeploy base l1 resolver * Update README.md * Added Base Reverse Resolver contract address * Add Arbitrum Reverse Resolver deployement * Redeploy ArbL1ReverseResolver with correct L2 Resolver Address * Redeploy l2 contracts with official reverse record namespace (cointype.reverse) * Sepolia resolvers with analytics (#30) * WIP * Fix errors * Ignore favicon * Update bun.lockb * Fix lint error * Update gateway url * Add console.log * Changed endpoint * Update apiEndpoint * Add sender and calldata to props * Move Tracker to evm-gateway * Revert "Move Tracker to evm-gateway" This reverts commit 5d3ba373c43b84e05ce98d6b517db98b9d767cf1. * WIP * Downgrade to 4.20231121.0 * Bump it to the latest * Add type * Replace tracker with @ensdomains/server-analytics * Pass custom apiEndpoint and props * Add GATEWAY_DOMAIN and ENDPOINT_URL * Point to correct branch * Fix CORS problem * Add gateway log tracker to OP * Fix lint error * Update readme * Default reverse resolver (#33) * Change ens-contracts to use default-reverse-resolver * Add suport for DefaultReverseResolver * Add hexToAddress to extract address * Add faulback to name function * Add fallback for text * Use imported IDefaultReverseResolver * Update bun.lockb and README * Update comment * Move DefaultReverseResolver * Add DefaultReverseResolver * Update bun.lockb * Add support for resolve on DefaultReverseResolver * Deployed new contracts * Add setdefaultname * Update README.md * Update README.md * Remove console.log * Point to default-reverse-resolver-2 * Reswitch to default-reverse-resolver * Update bun.ockb * Add whitespace * Check if invalid address * Override .text * Fix TypeError: ambiguous function error * Re-point to default-reverse-resolver * Added wait * Update storage location after removing Owner * Added wait on crosschain resolver * Use L2ReverseRevolver and fix broken test * Update ens-contracts branch * Eip 5559 support (#34) * Add IResolverSetter * Simplify metadata function * Fix failing tests * Add test for EIP 5559 * Added wait * Rename from IResolverSetter to IAddrSetter * Add resolveDeferral * Store chainId directly * Rename from resolveDeferral to setAddr * Remove crosschain-resolver and crosschain-reverse-resolver * Add .yalc to .gitignore * v0.1.0-beta.1 * Pushed all versions to 0.1.0-beta.2 * Add repo info and bump to beta.3 * Add links to arb related repos * Remove old deployment info * Revert removed scripts * Recreate bun.lockb * Remove console.log and tidy up props * Fix linting error * Fix linting error * remove log result util (#40) * remove log result util * bump server-analytics version, update types and functions * bypass frozen-lockfile flag for deps update * bypass frozen-lockfile flag for deps update * lint * revert frozen-lockfile flag * keep rozen-lockfile disabled * lint * Rename sepoliaforbase to sepoliaForBase * Update op-gateway/README.md Co-authored-by: Nick Johnson * move propsDecoder (#41) * move propsDecoder * Add Request as type * Update workers-types * Fix lint error * v0.1.0-beta.4 * v0.1.0-beta.4 * v0.1.0-beta.4 * Bump the version to beta.4 --------- Co-authored-by: Nick Johnson Co-authored-by: tate Co-authored-by: Muhammed Tanrıkulu --- .github/workflows/main.yml | 4 +- .gitignore | 3 +- README.md | 30 +- arb-gateway/README.md | 14 +- arb-gateway/package.json | 5 +- arb-gateway/src/worker.ts | 32 +- arb-gateway/wrangler.toml | 8 +- arb-verifier/README.md | 32 +- arb-verifier/arguments.js | 6 + arb-verifier/deploy_l1/00_arb_verifier.ts | 2 + arb-verifier/hardhat.config.ts | 27 +- arb-verifier/package.json | 2 +- arb-verifier/test/testArbVerifier.ts | 6 +- bun.lockb | Bin 689024 -> 572120 bytes crosschain-resolver/.gitignore | 12 - crosschain-resolver/LICENSE | 21 -- crosschain-resolver/README.md | 86 ----- crosschain-resolver/contracts/L1Resolver.sol | 214 ------------- crosschain-resolver/contracts/deps.sol | 26 -- .../deploy_l1/10_l1resolver.ts | 21 -- .../deploy_l2/01_l2resolver.ts | 26 -- .../deploy_l2/02_l2resolver_factory.ts | 18 -- crosschain-resolver/hardhat.config.ts | 61 ---- crosschain-resolver/package.json | 48 --- crosschain-resolver/scripts/test.js | 45 --- crosschain-resolver/test/testResolver.ts | 293 ------------------ crosschain-resolver/tsconfig.json | 14 - evm-gateway/README.md | 8 +- evm-gateway/package.json | 13 +- evm-gateway/src/index.ts | 2 +- evm-gateway/src/utils.ts | 23 +- evm-verifier/README.md | 6 + evm-verifier/package.json | 12 +- l1-gateway/README.md | 10 +- l1-gateway/package.json | 15 +- l1-gateway/src/worker.ts | 3 +- l1-verifier/README.md | 6 + l1-verifier/package.json | 16 +- op-gateway/README.md | 37 +-- op-gateway/package.json | 4 +- op-gateway/src/worker.ts | 35 ++- op-gateway/wrangler.toml | 10 +- op-verifier/README.md | 39 +++ op-verifier/arguments.js | 6 + op-verifier/deploy_l1/00_op_verifier.ts | 9 +- op-verifier/deploy_l1/10_testl1.ts | 2 +- .../deploy_l2/{01_testl2 .ts => 01_testl2.ts} | 4 +- op-verifier/hardhat.config.ts | 52 +++- op-verifier/package.json | 2 +- package.json | 13 +- tsconfig.json | 1 - 51 files changed, 401 insertions(+), 983 deletions(-) create mode 100644 arb-verifier/arguments.js delete mode 100644 crosschain-resolver/.gitignore delete mode 100644 crosschain-resolver/LICENSE delete mode 100644 crosschain-resolver/README.md delete mode 100644 crosschain-resolver/contracts/L1Resolver.sol delete mode 100644 crosschain-resolver/contracts/deps.sol delete mode 100644 crosschain-resolver/deploy_l1/10_l1resolver.ts delete mode 100644 crosschain-resolver/deploy_l2/01_l2resolver.ts delete mode 100644 crosschain-resolver/deploy_l2/02_l2resolver_factory.ts delete mode 100644 crosschain-resolver/hardhat.config.ts delete mode 100644 crosschain-resolver/package.json delete mode 100644 crosschain-resolver/scripts/test.js delete mode 100644 crosschain-resolver/test/testResolver.ts delete mode 100644 crosschain-resolver/tsconfig.json create mode 100644 op-verifier/arguments.js rename op-verifier/deploy_l2/{01_testl2 .ts => 01_testl2.ts} (82%) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e455a517..03582ba3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,7 +23,7 @@ jobs: node-version: ${{ matrix.node }} - name: Install Dependencies - run: bun install --frozen-lockfile --ignore-scripts + run: bun install --ignore-scripts - name: Build run: bun run build @@ -44,7 +44,7 @@ jobs: bun-version: 1.0.7 - name: Install Dependencies - run: bun install --frozen-lockfile --ignore-scripts + run: bun install --ignore-scripts - name: Build run: bun run build diff --git a/.gitignore b/.gitignore index 243acd73..05f8e7f4 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,8 @@ _cjs op-verifier/deployments/opDevnetL1 op-verifier/deployments/opDevnetL2 artifacts -deployments cache .env typechain-types +.wrangler +.yalc diff --git a/README.md b/README.md index 8142636f..ee729d65 100644 --- a/README.md +++ b/README.md @@ -95,4 +95,32 @@ This repository also contains the end-to-end tests for the entire stack. An instantiation of `evm-gateway` that targets Optimism. Combined with `op-verifier`, makes it possible for L1 contracts to fetch contract state data from Optimism. ### [op-verifier](/op-verifier/) -A complete Solidity library that facilitates sending CCIP-Read requests for Optimism state, and verifying the responses. \ No newline at end of file +A complete Solidity library that facilitates sending CCIP-Read requests for Optimism state, and verifying the responses. + +### [arb-gateway](/arb-gateway/) +An instantiation of `evm-gateway` that targets Optimism. Combined with `arb-verifier`, makes it possible for L1 contracts to fetch contract state data from Arbitrum. + +### [arb-verifier](/arb-verifier/) +A complete Solidity library that facilitates sending CCIP-Read requests for Arbitrum state, and verifying the responses. + +## How to setup locally + +``` +gh repo clone ensdomains/evmgateway +bun install # `@ensdomains/@ensdomains` not found error will be thrown +bun run workspace evm-gateway build +bun install +bun run test +``` + +## Troubleshooting + +### Error HH12: Trying to use a non-local installation of Hardhat, which is not supported. + +`yarn test` spawns `hardhat test` in the forked process. When `hardhat` command is installed under the node_modules of under each workspace, it complains that it's using locally installed hardhat. Remove hardhat from local node_modules and make sure it's only installed under the root `node_modules` + +``` +rm -rf *-*/node_modules/hardhat +rm bun.lockb +bun install +``` \ No newline at end of file diff --git a/arb-gateway/README.md b/arb-gateway/README.md index 61f3ed1a..a317c7de 100644 --- a/arb-gateway/README.md +++ b/arb-gateway/README.md @@ -21,12 +21,14 @@ bun run dev ``` cd arb-gateway -npm install -g bun wrangler -wrangler login -wrangler secret put L1_PROVIDER_URL -wrangler secret put L2_PROVIDER_URL -wrangler secret put L2_ROLLUP -bun run deploy +npm install -g wrangler +wrngler login + +wrangler secret put L1_PROVIDER_URL --env sepolia +wrangler secret put L2_PROVIDER_URL --env sepolia +wrangler secret put L2_ROLLUP --env sepolia +wrangler secret put ENDPOINT_URL --env sepolia +yarn deploy --env sepolia ``` ## How to test diff --git a/arb-gateway/package.json b/arb-gateway/package.json index b61ec7fa..b090e491 100644 --- a/arb-gateway/package.json +++ b/arb-gateway/package.json @@ -57,7 +57,9 @@ }, "dependencies": { "@chainlink/ccip-read-server": "^0.2.1", - "@ensdomains/evm-gateway": "^0.1.0", + "@cloudflare/workers-types": "^4.20240423.0", + "@ensdomains/evm-gateway": "0.1.0-beta.4", + "@ensdomains/server-analytics": "0.0.1-alpha.5", "@ethereumjs/block": "^5.0.0", "@nomicfoundation/ethereumjs-block": "^5.0.2", "commander": "^11.0.0", @@ -65,6 +67,5 @@ }, "devDependencies": { "@commander-js/extra-typings": "^11.0.0" - } } diff --git a/arb-gateway/src/worker.ts b/arb-gateway/src/worker.ts index 40b9f348..30276b80 100644 --- a/arb-gateway/src/worker.ts +++ b/arb-gateway/src/worker.ts @@ -1,14 +1,32 @@ +import { Request as CFWRequest } from '@cloudflare/workers-types'; import { Server } from '@ensdomains/ccip-read-cf-worker'; -import type { Router } from '@ensdomains/evm-gateway'; +import { propsDecoder, type Router } from '@ensdomains/evm-gateway'; import { InMemoryBlockCache } from './blockCache/InMemoryBlockCache.js'; +import { Tracker } from '@ensdomains/server-analytics'; interface Env { L1_PROVIDER_URL: string; L2_PROVIDER_URL: string; L2_ROLLUP: string; + GATEWAY_DOMAIN: string; + ENDPOINT_URL: string; } let app: Router; -async function fetch(request: Request, env: Env) { + +async function fetch(request: CFWRequest, env: Env) { + // Set PROVIDER_URL under .dev.vars locally. Set the key as secret remotely with `wrangler secret put WORKER_PROVIDER_URL` + const { + L1_PROVIDER_URL, + L2_PROVIDER_URL, + L2_ROLLUP, + GATEWAY_DOMAIN, + ENDPOINT_URL, + } = env; + const tracker = new Tracker(GATEWAY_DOMAIN, { + apiEndpoint: ENDPOINT_URL, + enableLogging: true, + }); + // Loading libraries dynamically as a temp work around. // Otherwise, deployment thorws "Error: Script startup exceeded CPU time limit." error if (!app) { @@ -17,13 +35,10 @@ async function fetch(request: Request, env: Env) { const EVMGateway = (await import('@ensdomains/evm-gateway')).EVMGateway; const ArbProofService = (await import('./ArbProofService.js')) .ArbProofService; - // Set PROVIDER_URL under .dev.vars locally. Set the key as secret remotely with `wrangler secret put WORKER_PROVIDER_URL` - const { L1_PROVIDER_URL, L2_PROVIDER_URL, L2_ROLLUP } = env; const l1Provider = new ethers.JsonRpcProvider(L1_PROVIDER_URL); const l2Provider = new ethers.JsonRpcProvider(L2_PROVIDER_URL); - console.log({ L1_PROVIDER_URL, L2_PROVIDER_URL }); const gateway = new EVMGateway( new ArbProofService( l1Provider, @@ -37,7 +52,12 @@ async function fetch(request: Request, env: Env) { gateway.add(server); app = server.makeApp('/'); } - return app.handle(request); + + const props = propsDecoder(request); + await tracker.trackEvent(request, 'request', { props }, true); + return app + .handle(request) + .then(tracker.logResult.bind(null, propsDecoder, request)); } export default { diff --git a/arb-gateway/wrangler.toml b/arb-gateway/wrangler.toml index 3cff5948..e7999351 100644 --- a/arb-gateway/wrangler.toml +++ b/arb-gateway/wrangler.toml @@ -2,7 +2,8 @@ name = "arb-gateway-worker" account_id = "15dcc9085cb794bb4f29d3e8177ac880" main = "./src/worker.ts" node_compat = true -compatibility_date = "2023-10-13" +compatibility_date = "2024-01-25" + [dev] port = 8080 @@ -10,4 +11,7 @@ port = 8080 [build] command = "bun run build" -[vars] +[env.sepolia] +name = "arb-sepolia-gateway-worker" +[env.sepolia.vars] +GATEWAY_DOMAIN="arb-sepolia-gateway-worker.ens-cf.workers.dev" \ No newline at end of file diff --git a/arb-verifier/README.md b/arb-verifier/README.md index ce5d8671..06870eca 100644 --- a/arb-verifier/README.md +++ b/arb-verifier/README.md @@ -46,17 +46,43 @@ bun run test ## Deployments -### L2 +### Goerli + +#### L2 - TestL2.sol = [0xAdef74372444e716C0473dEe1F9Cb3108EFa3818](https://goerli.arbiscan.io/address/0xAdef74372444e716C0473dEe1F9Cb3108EFa3818#code) -### L1 +#### L1 - ArbVerifier = [0x9E46DeE08Ad370bEFa7858c0E9a6c87f2D7E57A1](https://goerli.etherscan.io/address/0x9E46DeE08Ad370bEFa7858c0E9a6c87f2D7E57A1#code) - TestL1.sol = [0x0d6c6B70cd561EB59e6818D832197fFad60840AB](https://goerli.etherscan.io/address/0x0d6c6B70cd561EB59e6818D832197fFad60840AB#code) -### Gateway server +#### Gateway server - https://arb-gateway-worker.ens-cf.workers.dev + +### Sepolia + +#### L2 + +- TestL2.sol = [0x162A433068F51e18b7d13932F27e66a3f99E6890](https://api-sepolia.arbiscan.io/address/0x162A433068F51e18b7d13932F27e66a3f99E6890#code) + +#### L1 + +- ArbVerifier = [0x6820E47CED34D6F275c6d26C3876D48B2c1fdf27](https://sepolia.etherscan.io/address/0x6820E47CED34D6F275c6d26C3876D48B2c1fdf27#code) +- TestL1.sol = [0x50200c7Ccb1abD927184396547ea8dD1A18CAA3A](https://sepolia.etherscan.io/address/0x50200c7Ccb1abD927184396547ea8dD1A18CAA3A#code) + +deploying "ArbVerifier" (tx: 0x61ae88749f911f1e09d7c073f34a13bb843c71fafaf93a1266423798bd3aadc6)...: deployed at 0x6820E47CED34D6F275c6d26C3876D48B2c1fdf27 with 3872186 gas +deploying "TestL1" (tx: 0x0a7b6b74357d20f33cb89df12da3db34b5cd3c764403888420108ca13f0126fa)...: deployed at 0x50200c7Ccb1abD927184396547ea8dD1A18CAA3A with 2411152 gas + +#### Gateway url + +- https://arb-sepolia-gateway-worker.ens-cf.workers.dev + +## Testing gateway + +``` +TARGET_ADDRESS=$TEST_L1_ADDRESS PROVIDER_URL=$L1_PROVIDER_URL npx hardhat run ../l1-verifier/scripts/remote.ts --network sepolia +``` \ No newline at end of file diff --git a/arb-verifier/arguments.js b/arb-verifier/arguments.js new file mode 100644 index 00000000..05cfa91c --- /dev/null +++ b/arb-verifier/arguments.js @@ -0,0 +1,6 @@ +module.exports = [ + [ + 'https://arb-sepolia-gateway-worker.ens-cf.workers.dev/{sender}/{data}.json' + ], + '0xd80810638dbDF9081b72C1B33c65375e807281C8' +]; diff --git a/arb-verifier/deploy_l1/00_arb_verifier.ts b/arb-verifier/deploy_l1/00_arb_verifier.ts index 078f0985..78ac3a56 100644 --- a/arb-verifier/deploy_l1/00_arb_verifier.ts +++ b/arb-verifier/deploy_l1/00_arb_verifier.ts @@ -5,10 +5,12 @@ import 'dotenv/config'; const GATEWAY_URLS = { arbDevnetL1: 'http://localhost:8089/{sender}/{data}.json', goerli: 'https://arb-gateway-worker.ens-cf.workers.dev/{sender}/{data}.json', + sepolia: 'https://arb-sepolia-gateway-worker.ens-cf.workers.dev/{sender}/{data}.json', }; const ROLLUP_ADDRESSES = { goerli: '0x45e5cAea8768F42B385A366D3551Ad1e0cbFAb17', + sepolia: '0xd80810638dbDF9081b72C1B33c65375e807281C8', }; const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/arb-verifier/hardhat.config.ts b/arb-verifier/hardhat.config.ts index 9b5f07e4..3da3d073 100644 --- a/arb-verifier/hardhat.config.ts +++ b/arb-verifier/hardhat.config.ts @@ -38,16 +38,33 @@ const config: HardhatUserConfig = { l2: 'arbitrumGoerli', }, }, + sepolia: { + url: L1_PROVIDER_URL, + accounts: [DEPLOYER_PRIVATE_KEY], + deploy: ['deploy_l1/'], + chainId:11155111, + companionNetworks: { + l2: 'arbitrumSepolia', + }, + }, arbitrumGoerli: { url: 'https://rpc.goerli.arbitrum.gateway.fm', accounts: [DEPLOYER_PRIVATE_KEY], deploy: ['deploy_l2/'], }, + arbitrumSepolia: { + chainId: 421614, + url: 'https://sepolia-rollup.arbitrum.io/rpc', + accounts: [DEPLOYER_PRIVATE_KEY], + deploy: [ "deploy_l2/" ], + }, }, etherscan: { apiKey: { goerli: L1_ETHERSCAN_API_KEY, + sepolia: L1_ETHERSCAN_API_KEY, arbitrumGoerli: L2_ETHERSCAN_API_KEY, + arbitrumSepolia: L2_ETHERSCAN_API_KEY, }, customChains: [ { @@ -55,9 +72,17 @@ const config: HardhatUserConfig = { chainId: 421613, urls: { apiURL: 'https://api-goerli.arbiscan.io/api', - browserURL: 'https://api-goerli.arbiscan.io.io', + browserURL: 'https://api-goerli.arbiscan.io', }, }, + { + network: "arbitrumSepolia", + chainId: 421614, + urls: { + apiURL: "https://api-sepolia.arbiscan.io/api", + browserURL: "https://api-sepolia.arbiscan.io" + } + } ], }, namedAccounts: { diff --git a/arb-verifier/package.json b/arb-verifier/package.json index 02175715..1e045a13 100644 --- a/arb-verifier/package.json +++ b/arb-verifier/package.json @@ -38,7 +38,7 @@ }, "dependencies": { "@arbitrum/nitro-contracts": "^1.1.0", - "@ensdomains/evm-verifier": "^0.1.0", + "@ensdomains/evm-verifier": "0.1.0-beta.4", "dotenv": "^16.3.1" } } diff --git a/arb-verifier/test/testArbVerifier.ts b/arb-verifier/test/testArbVerifier.ts index 4729498b..99edc8f8 100644 --- a/arb-verifier/test/testArbVerifier.ts +++ b/arb-verifier/test/testArbVerifier.ts @@ -46,12 +46,12 @@ describe('ArbVerifier', () => { const rollupAddress = process.env.ROLLUP_ADDRESS; // When testing against Goerli, replace with this address // const rollupAddress = '0x45e5cAea8768F42B385A366D3551Ad1e0cbFAb17'; - + const chainId = hre.network.config.chainId const gateway = await makeArbGateway( - (hre.network.config as any).url, + (hre.network.config as any).url, (hre.config.networks[hre.network.companionNetworks.l2] as any).url, rollupAddress, - 5, + chainId, ); const server = new Server() gateway.add(server) diff --git a/bun.lockb b/bun.lockb index 36b93ba31c09bdb0ef213534955b62b8d1c5da91..7c6c560a6a3730c31e9c6ccaca1e18d06d5ffa59 100755 GIT binary patch delta 145362 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
D5O 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 s+w9mScp9u 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 AApigX diff --git a/crosschain-resolver/.gitignore b/crosschain-resolver/.gitignore deleted file mode 100644 index 3360da73..00000000 --- a/crosschain-resolver/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -node_modules -.env -coverage -coverage.json -typechain -typechain-types - -# Hardhat files -cache -artifacts -deployments - diff --git a/crosschain-resolver/LICENSE b/crosschain-resolver/LICENSE deleted file mode 100644 index 677d485f..00000000 --- a/crosschain-resolver/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 ENS Labs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/crosschain-resolver/README.md b/crosschain-resolver/README.md deleted file mode 100644 index e94b6b1a..00000000 --- a/crosschain-resolver/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# @ensdomains/crosschain-resolver - -A resolver contract that is built on top of evm-verifier. - -For a detailed readme and usage instructions, see the [monorepo readme](https://github.com/ensdomains/evmgateway/tree/main). - - -## How it is defined - -When the resolver has the following storage layout, - -``` - contract Resolver { - // node => version - mapping(bytes32 => uint64) public recordVersions; - // versionable_addresses[recordVersions[node]][node][coinType] - // version => node => cointype - mapping(uint64 => mapping(bytes32 => mapping(uint256 => bytes))) versionable_addresses; -``` - -Run `yarn storage` to find out storage slot for each variable - -``` -// Storage slot -// ┌────────────────────────────┬──────────────────────────────┬──────────────┬ -// │ contract │ state_variable │ storage_slot │ -// ├────────────────────────────┼──────────────────────────────┼──────────────┼ -// │ DelegatableResolver │ recordVersions │ 0 │ -// │ DelegatableResolver │ versionable_abis │ 1 │ -// │ DelegatableResolver │ versionable_addresses │ 2 │ -``` - -Then define the l1 function - -``` - function addr( - bytes32 node, - uint256 coinType - ) public view returns (bytes memory) { - EVMFetcher.newFetchRequest(verifier, target) - .getStatic(0) // storage_slot of recordVersions - .element(node) - .getDynamic(2) // storage_slot of versionable_addresses - .ref(0) // Referencing the result of `.getStatic(0)` - .element(node) - .element(coinType) - .fetch(this.addrCoinTypeCallback.selector, ''); // recordVersions -``` - -Storage verificaton can only verify the data of l2. When the function result needs some transformation, transform inside the callback function as follows. - -``` - function addrCallback( - bytes[] memory values, - bytes memory - ) public pure returns (address) { - return bytesToAddress(values[1]); - } -``` - - - -## Deploying (Goerli) - -Create `.env` and set the following variables - - -- DEPLOYER_PRIVATE_KEY -- L1_PROVIDER_URL -- L2_PROVIDER_URL -- L1_ETHERSCAN_API_KEY -- L2_ETHERSCAN_API_KEY -- OP_VERIFIER_ADDRESS=0x0c2746F20C9c97DBf718de10c04943cf408230A3 - -``` -bun run hardhat deploy --network optimismGoerli -``` - -Followed by the L1 contract: - -``` -bun run hardhat deploy --network goerli -``` - - -## Deployments diff --git a/crosschain-resolver/contracts/L1Resolver.sol b/crosschain-resolver/contracts/L1Resolver.sol deleted file mode 100644 index e166744c..00000000 --- a/crosschain-resolver/contracts/L1Resolver.sol +++ /dev/null @@ -1,214 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -import {EVMFetcher} from '@ensdomains/evm-verifier/contracts/EVMFetcher.sol'; -import {EVMFetchTarget} from '@ensdomains/evm-verifier/contracts/EVMFetchTarget.sol'; -import {IEVMVerifier} from '@ensdomains/evm-verifier/contracts/IEVMVerifier.sol'; -import "@ensdomains/ens-contracts/contracts/registry/ENS.sol"; -import {INameWrapper} from "@ensdomains/ens-contracts/contracts/wrapper/INameWrapper.sol"; -import {BytesUtils} from "@ensdomains/ens-contracts/contracts/dnssec-oracle/BytesUtils.sol"; -import {IAddrResolver} from "@ensdomains/ens-contracts/contracts/resolvers/profiles/IAddrResolver.sol"; -import {IAddressResolver} from "@ensdomains/ens-contracts/contracts/resolvers/profiles/IAddressResolver.sol"; -import {ITextResolver} from "@ensdomains/ens-contracts/contracts/resolvers/profiles/ITextResolver.sol"; -import {IContentHashResolver} from "@ensdomains/ens-contracts/contracts/resolvers/profiles/IContentHashResolver.sol"; - - -contract L1Resolver is EVMFetchTarget { - using EVMFetcher for EVMFetcher.EVMFetchRequest; - using BytesUtils for bytes; - IEVMVerifier immutable verifier; - ENS immutable ens; - INameWrapper immutable nameWrapper; - mapping(bytes32 => address) targets; - uint256 constant COIN_TYPE_ETH = 60; - uint256 constant RECORD_VERSIONS_SLOT = 0; - uint256 constant VERSIONABLE_ADDRESSES_SLOT = 2; - uint256 constant VERSIONABLE_HASHES_SLOT = 3; - uint256 constant VERSIONABLE_TEXTS_SLOT = 10; - - event TargetSet(bytes32 indexed node, address target); - - function isAuthorised(bytes32 node) internal view returns (bool) { - // TODO: Add support for - // trustedETHController - // trustedReverseRegistrar - // isApprovedForAll - // isApprovedFor - address owner = ens.owner(node); - if (owner == address(nameWrapper)) { - owner = nameWrapper.ownerOf(uint256(node)); - } - return owner == msg.sender; - } - - modifier authorised(bytes32 node) { - require(isAuthorised(node)); - _; - } - - constructor( - IEVMVerifier _verifier, - ENS _ens, - INameWrapper _nameWrapper - ){ - require(address(_nameWrapper) != address(0), "Name Wrapper address must be set"); - require(address(_verifier) != address(0), "Verifier address must be set"); - require(address(_ens) != address(0), "Registry address must be set"); - verifier = _verifier; - ens = _ens; - nameWrapper = _nameWrapper; - } - - /** - * Set target address to verify aagainst - * @param node The ENS node to query. - * @param target The L2 resolver address to verify against. - */ - function setTarget(bytes32 node, address target) public authorised(node){ - targets[node] = target; - emit TargetSet(node, target); - } - - /** - * @dev Returns the L2 target address that can answer queries for `name`. - * @param name DNS encoded ENS name to query - * @param offset The offset of the label to query recursively. - * @return node The node of the name - * @return target The L2 resolver address to verify against. - */ - function getTarget( - bytes memory name, - uint256 offset - ) public view returns (bytes32 node, address target) { - uint256 len = name.readUint8(offset); - node = bytes32(0); - if (len > 0) { - bytes32 label = name.keccak(offset + 1, len); - (node, target) = getTarget( - name, - offset + len + 1 - ); - node = keccak256(abi.encodePacked(node, label)); - if(targets[node] != address(0)){ - return ( - node, - targets[node] - ); - } - } else { - return ( - bytes32(0), - address(0) - ); - } - return (node, target); - } - - /** - * @dev Resolve and verify a record stored in l2 target address. It supports subname by fetching target recursively to the nearlest parent. - * @param name DNS encoded ENS name to query - * @param data The actual calldata - * @return result result of the call - */ - function resolve(bytes calldata name, bytes calldata data) external view returns (bytes memory result) { - (, address target) = getTarget(name, 0); - bytes4 selector = bytes4(data); - - if (selector == IAddrResolver.addr.selector) { - (bytes32 node) = abi.decode(data[4:], (bytes32)); - return _addr(node, target); - } - if (selector == IAddressResolver.addr.selector) { - (bytes32 node, uint256 cointype) = abi.decode(data[4:], (bytes32, uint256)); - return _addr(node, cointype, target); - } - if (selector == ITextResolver.text.selector) { - (bytes32 node, string memory key) = abi.decode(data[4:], (bytes32, string)); - return bytes(_text(node, key, target)); - } - if (selector == IContentHashResolver.contenthash.selector) { - (bytes32 node) = abi.decode(data[4:], (bytes32)); - return _contenthash(node, target); - } - } - - function _addr(bytes32 node, address target) private view returns (bytes memory) { - EVMFetcher.newFetchRequest(verifier, target) - .getStatic(RECORD_VERSIONS_SLOT) - .element(node) - .getDynamic(VERSIONABLE_ADDRESSES_SLOT) - .ref(0) - .element(node) - .element(COIN_TYPE_ETH) - .fetch(this.addrCallback.selector, ''); // recordVersions - } - - function addrCallback( - bytes[] memory values, - bytes memory - ) public pure returns (bytes memory) { - return abi.encode(address(bytes20(values[1]))); - } - - function _addr( - bytes32 node, - uint256 coinType, - address target - ) private view returns (bytes memory) { - EVMFetcher.newFetchRequest(verifier, target) - .getStatic(RECORD_VERSIONS_SLOT) - .element(node) - .getDynamic(VERSIONABLE_ADDRESSES_SLOT) - .ref(0) - .element(node) - .element(coinType) - .fetch(this.addrCoinTypeCallback.selector, ''); - } - - function addrCoinTypeCallback( - bytes[] memory values, - bytes memory - ) public pure returns (bytes memory) { - return abi.encode(values[1]); - } - - function _text( - bytes32 node, - string memory key, - address target - ) private view returns (bytes memory) { - EVMFetcher.newFetchRequest(verifier, target) - .getStatic(RECORD_VERSIONS_SLOT) - .element(node) - .getDynamic(VERSIONABLE_TEXTS_SLOT) - .ref(0) - .element(node) - .element(key) - .fetch(this.textCallback.selector, ''); - } - - function textCallback( - bytes[] memory values, - bytes memory - ) public pure returns (bytes memory) { - return abi.encode(string(values[1])); - } - - function _contenthash(bytes32 node, address target) private view returns (bytes memory) { - EVMFetcher.newFetchRequest(verifier, target) - .getStatic(RECORD_VERSIONS_SLOT) - .element(node) - .getDynamic(VERSIONABLE_HASHES_SLOT) - .ref(0) - .element(node) - .fetch(this.contenthashCallback.selector, ''); - } - - function contenthashCallback( - bytes[] memory values, - bytes memory - ) public pure returns (bytes memory) { - return abi.encode(values[1]); - } - -} diff --git a/crosschain-resolver/contracts/deps.sol b/crosschain-resolver/contracts/deps.sol deleted file mode 100644 index 402a0d3f..00000000 --- a/crosschain-resolver/contracts/deps.sol +++ /dev/null @@ -1,26 +0,0 @@ -import "@ensdomains/ens-contracts/contracts/registry/ENSRegistry.sol"; -import "@ensdomains/ens-contracts/contracts/wrapper/NameWrapper.sol"; -import "@ensdomains/ens-contracts/contracts/ethregistrar/BaseRegistrarImplementation.sol"; -import "@ensdomains/ens-contracts/contracts/wrapper/StaticMetadataService.sol"; -import "@ensdomains/l1-verifier/contracts/L1Verifier.sol"; -import {ReverseRegistrar} from "@ensdomains/ens-contracts/contracts/reverseRegistrar/ReverseRegistrar.sol"; -import {PublicResolver} from "@ensdomains/ens-contracts/contracts/resolvers/PublicResolver.sol"; -import {DelegatableResolver} from "@ensdomains/ens-contracts/contracts/resolvers/DelegatableResolver.sol"; -import {DelegatableResolverFactory} from "@ensdomains/ens-contracts/contracts/resolvers/DelegatableResolverFactory.sol"; -// Storage slot -// ┌────────────────────────────┬──────────────────────────────┬──────────────┬ -// │ contract │ state_variable │ storage_slot │ -// ├────────────────────────────┼──────────────────────────────┼──────────────┼ -// │ DelegatableResolver │ recordVersions │ 0 │ -// │ DelegatableResolver │ versionable_abis │ 1 │ -// │ DelegatableResolver │ versionable_addresses │ 2 │ -// │ DelegatableResolver │ versionable_hashes │ 3 │ -// │ DelegatableResolver │ versionable_zonehashes │ 4 │ -// │ DelegatableResolver │ versionable_records │ 5 │ -// │ DelegatableResolver │ versionable_nameEntriesCount │ 6 │ -// │ DelegatableResolver │ versionable_interfaces │ 7 │ -// │ DelegatableResolver │ versionable_names │ 8 │ -// │ DelegatableResolver │ versionable_pubkeys │ 9 │ -// │ DelegatableResolver │ versionable_texts │ 10 │ -// │ DelegatableResolver │ operators │ 11 │ -// │ DelegatableResolverFactory │ implementation │ 0 │ diff --git a/crosschain-resolver/deploy_l1/10_l1resolver.ts b/crosschain-resolver/deploy_l1/10_l1resolver.ts deleted file mode 100644 index 8de02b18..00000000 --- a/crosschain-resolver/deploy_l1/10_l1resolver.ts +++ /dev/null @@ -1,21 +0,0 @@ -import {HardhatRuntimeEnvironment} from 'hardhat/types'; -import {DeployFunction} from 'hardhat-deploy/types'; - - -const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const {deployments, getNamedAccounts} = hre; - const {deploy} = deployments; - - const {deployer} = await getNamedAccounts(); - - const OP_VERIFIER_ADDRESS = process.env.OP_VERIFIER_ADDRESS - if(!OP_VERIFIER_ADDRESS) throw ('Set $OP_VERIFIER_ADDRESS') - console.log({OP_VERIFIER_ADDRESS}) - await deploy('L1Resolver', { - from: deployer, - args: [OP_VERIFIER_ADDRESS], - log: true, - }); -}; -export default func; -func.tags = ['L1Resolver']; diff --git a/crosschain-resolver/deploy_l2/01_l2resolver.ts b/crosschain-resolver/deploy_l2/01_l2resolver.ts deleted file mode 100644 index 67d28a1a..00000000 --- a/crosschain-resolver/deploy_l2/01_l2resolver.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {HardhatRuntimeEnvironment} from 'hardhat/types'; -import {DeployFunction} from 'hardhat-deploy/types'; - -const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const {deployments, getNamedAccounts} = hre; - const {deploy} = deployments; - - const {deployer} = await getNamedAccounts(); - console.log({deployer}) - const impl = await deploy('DelegatableResolver', { - from: deployer, - args: [], - log: true, - }); - const implAddress = impl.address - console.log(`DelegatableResolver is deployed at ${implAddress}`) - const factory = await deploy('DelegatableResolverFactory', { - from: deployer, - args: [impl.address], - log: true, - }); - await factory.wait() - console.log(`DelegatableResolverFactory is deployed at ${factory.address}`) -}; -export default func; -func.tags = ['DelegatableResolver']; diff --git a/crosschain-resolver/deploy_l2/02_l2resolver_factory.ts b/crosschain-resolver/deploy_l2/02_l2resolver_factory.ts deleted file mode 100644 index c58029a5..00000000 --- a/crosschain-resolver/deploy_l2/02_l2resolver_factory.ts +++ /dev/null @@ -1,18 +0,0 @@ -import {HardhatRuntimeEnvironment} from 'hardhat/types'; -import {DeployFunction} from 'hardhat-deploy/types'; - -const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const {deployments} = hre; - const {deploy} = deployments; - const DelegatableResolver = await hre.companionNetworks['l2'].deployments.get('DelegatableResolver'); - console.log({DelegatableResolver}) - const factory = await deploy('DelegatableResolverFactory', { - from: deployer, - args: [DelegatableResolver.address], - log: true - }); - console.log(`DelegatableResolverFactory is deployed at ${factory.address} with ${DelegatableResolver.address}`) -}; -export default func; -module.exports.dependencies = ['DelegatableResolver']; -func.tags = ['DelegatableResolverFactory']; diff --git a/crosschain-resolver/hardhat.config.ts b/crosschain-resolver/hardhat.config.ts deleted file mode 100644 index 9e54c70e..00000000 --- a/crosschain-resolver/hardhat.config.ts +++ /dev/null @@ -1,61 +0,0 @@ -import '@nomicfoundation/hardhat-toolbox'; -import { HardhatUserConfig } from 'hardhat/config'; -import "hardhat-storage-layout"; -import 'hardhat-deploy'; -import 'hardhat-deploy-ethers'; -const DEPLOYER_PRIVATE_KEY = process.env.DEPLOYER_PRIVATE_KEY ?? "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"; -const L1_PROVIDER_URL = process.env.L1_PROVIDER_URL || ''; -const L1_ETHERSCAN_API_KEY = process.env.L1_ETHERSCAN_API_KEY || ''; -const L2_ETHERSCAN_API_KEY = process.env.L2_ETHERSCAN_API_KEY || ''; - -const config: HardhatUserConfig = { - solidity: { - version: "0.8.19", - settings: { - optimizer: { - enabled: true, - runs: 1200 - }, - viaIR: true, - }, - }, - networks: { - ganache: { - url: `http://localhost:${parseInt(process.env['RPC_PORT'] || '8545')}`, - }, - goerli: { - url: L1_PROVIDER_URL, - accounts: [DEPLOYER_PRIVATE_KEY], - deploy: [ "deploy_l1/" ], - companionNetworks: { - l2: "optimismGoerli", - }, - }, - optimismGoerli: { - url: "https://goerli.optimism.io", - accounts: [DEPLOYER_PRIVATE_KEY], - deploy: [ "deploy_l2/" ], - } - }, - etherscan: { - apiKey: { - goerli: L1_ETHERSCAN_API_KEY, - optimismGoerli: L2_ETHERSCAN_API_KEY - }, - customChains: [ - { - network: "optimismGoerli", - chainId: 420, - urls: { - apiURL: "https://api-goerli-optimism.etherscan.io/api", - browserURL: "https://goerli-optimism.etherscan.io" - } - } - ] - }, - namedAccounts: { - 'deployer': 0, - } -}; - -export default config; diff --git a/crosschain-resolver/package.json b/crosschain-resolver/package.json deleted file mode 100644 index f8b26c53..00000000 --- a/crosschain-resolver/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "@ensdomains/crosschain-resolver", - "license": "MIT", - "version": "0.1.0", - "scripts": { - "build": "echo 'building crosschain-resolver' && hardhat compile", - "test": "node scripts/test.js", - "storage": "hardhat check", - "clean": "rm -fr artifacts cache node_modules typechain-types", - "lint": "exit 0" - }, - "devDependencies": { - "@ensdomains/l1-gateway": "workspace:*", - "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-toolbox": "^3.0.0", - "@nomicfoundation/hardhat-verify": "^1.0.0", - "@nomiclabs/hardhat-ganache": "^2.0.1", - "@typechain/ethers-v6": "^0.4.0", - "@typechain/hardhat": "^8.0.0", - "@types/chai": "^4.2.0", - "@types/express": "^4.17.18", - "@types/mocha": ">=9.1.0", - "@types/supertest": "^2.0.14", - "chai": "^4.2.0", - "dns-packet": "^5.6.1", - "ethers": "^6.8.0", - "express": "^4.18.2", - "ganache": "^7.9.1", - "hardhat": "^2.17.4", - "hardhat-deploy": "^0.11.43", - "hardhat-deploy-ethers": "^0.4.1", - "hardhat-gas-reporter": "^1.0.8", - "hardhat-storage-layout": "^0.1.7", - "solidity-bytes-utils": "^0.8.0", - "solidity-coverage": "^0.8.1", - "supertest": "^6.3.3", - "ts-node": "^10.9.1", - "typechain": "^8.2.0", - "typescript": "^5.2.2" - }, - "dependencies": { - "@ensdomains/ens-contracts": "ensdomains/ens-contracts#delegatable-resolver-with-factory", - "@ensdomains/evm-verifier": "^0.1.0", - "@eth-optimism/contracts": "^0.6.0" - } -} diff --git a/crosschain-resolver/scripts/test.js b/crosschain-resolver/scripts/test.js deleted file mode 100644 index c7bba803..00000000 --- a/crosschain-resolver/scripts/test.js +++ /dev/null @@ -1,45 +0,0 @@ -const { fork } = require('node:child_process'); -const ganache = require('ganache'); -const options = { - logging: { - quiet: true, - }, -}; - -async function main() { - const server = ganache.server(options); - console.log('Starting server'); - const port = await new Promise((resolve, reject) => { - server.listen(0, async (err) => { - console.log(`Listening on port ${server.address().port}`); - if (err) reject(err); - resolve(server.address().port); - }); - }); - - console.log('Starting hardhat'); - const code = await new Promise((resolve) => { - const hh = fork( - '../node_modules/.bin/hardhat', - ['test', '--network', 'ganache'], - { - stdio: 'inherit', - env: { - RPC_PORT: port.toString(), - }, - } - ); - hh.on('close', (code) => resolve(code)); - }); - - console.log('Shutting down'); - server.close(); - process.exit(code); -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/crosschain-resolver/test/testResolver.ts b/crosschain-resolver/test/testResolver.ts deleted file mode 100644 index a3690431..00000000 --- a/crosschain-resolver/test/testResolver.ts +++ /dev/null @@ -1,293 +0,0 @@ -import { makeL1Gateway } from '@ensdomains/l1-gateway'; -import { Server } from '@chainlink/ccip-read-server'; -import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider'; -import type { HardhatEthersHelpers } from '@nomicfoundation/hardhat-ethers/types'; -import { expect } from 'chai'; -import { - BrowserProvider, - Contract, - JsonRpcProvider, - Signer, - ethers as ethersT -} from 'ethers'; -import { FetchRequest } from 'ethers'; -import { ethers } from 'hardhat'; -import { EthereumProvider } from 'hardhat/types'; -import request from 'supertest'; -import packet from 'dns-packet'; -const labelhash = (label) => ethers.keccak256(ethers.toUtf8Bytes(label)) -const encodeName = (name) => '0x' + packet.name.encode(name).toString('hex') -const name = 'foo.eth' -const node = ethers.namehash(name) -const encodedname = encodeName(name) - -const EMPTY_ADDRESS = '0x0000000000000000000000000000000000000000' -const EMPTY_BYTES32 = - '0x0000000000000000000000000000000000000000000000000000000000000000' - - -type ethersObj = typeof ethersT & - Omit & { - provider: Omit & { - _hardhatProvider: EthereumProvider; - }; - }; - -declare module 'hardhat/types/runtime' { - const ethers: ethersObj; - interface HardhatRuntimeEnvironment { - ethers: ethersObj; - } -} - -describe('Crosschain Resolver', () => { - let provider: BrowserProvider; - let signer: Signer; - let verifier: Contract; - let target: Contract; - let l2contract: Contract; - let ens: Contract; - let wrapper: Contract; - let baseRegistrar: Contract; - let signerAddress, resolverAddress, wrapperAddress - - before(async () => { - // Hack to get a 'real' ethers provider from hardhat. The default `HardhatProvider` - // doesn't support CCIP-read. - provider = new ethers.BrowserProvider(ethers.provider._hardhatProvider); - // provider.on("debug", (x: any) => console.log(JSON.stringify(x, undefined, 2))); - signer = await provider.getSigner(0); - signerAddress = await signer.getAddress() - const gateway = makeL1Gateway(provider as unknown as JsonRpcProvider); - const server = new Server() - gateway.add(server) - const app = server.makeApp('/') - const getUrl = FetchRequest.createGetUrlFunc(); - ethers.FetchRequest.registerGetUrl(async (req: FetchRequest) => { - if(req.url != "test:") return getUrl(req); - - const r = request(app).post('/'); - if (req.hasBody()) { - r.set('Content-Type', 'application/json').send( - ethers.toUtf8String(req.body) - ); - } - const response = await r; - return { - statusCode: response.statusCode, - statusMessage: response.ok ? 'OK' : response.statusCode.toString(), - body: ethers.toUtf8Bytes(JSON.stringify(response.body)), - headers: { - 'Content-Type': 'application/json', - }, - }; - }); - const ensFactory = await ethers.getContractFactory('ENSRegistry',signer); - ens = await ensFactory.deploy(); - const ensAddress = await ens.getAddress() - const baseRegistrarFactory = await ethers.getContractFactory('BaseRegistrarImplementation',signer); - baseRegistrar = await baseRegistrarFactory.deploy(ensAddress,ethers.namehash('eth')) - const baseRegistrarAddress = await baseRegistrar.getAddress() - await baseRegistrar.addController(signerAddress) - const metaDataserviceFactory = await ethers.getContractFactory('StaticMetadataService',signer); - const metaDataservice = await metaDataserviceFactory.deploy('https://ens.domains') - const metaDataserviceAddress = await metaDataservice.getAddress() - const reverseRegistrarFactory = await ethers.getContractFactory('ReverseRegistrar',signer); - const reverseRegistrar = await reverseRegistrarFactory.deploy(ensAddress) - const reverseRegistrarAddress = await reverseRegistrar.getAddress() - await ens.setSubnodeOwner(EMPTY_BYTES32, labelhash('reverse'), signerAddress) - await ens.setSubnodeOwner(ethers.namehash('reverse'),labelhash('addr'), reverseRegistrarAddress) - await ens.setSubnodeOwner(EMPTY_BYTES32, labelhash('eth'), baseRegistrarAddress) - await baseRegistrar.register(labelhash('foo'), signerAddress, 100000000) - const publicResolverFactory = await ethers.getContractFactory('PublicResolver',signer); - const publicResolver = await publicResolverFactory.deploy( - ensAddress, - '0x0000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000', - reverseRegistrarAddress, - ) - const publicResolverAddress = await publicResolver.getAddress() - await reverseRegistrar.setDefaultResolver(publicResolverAddress) - - const wrapperFactory = await ethers.getContractFactory('NameWrapper',signer); - await provider.send('evm_mine', []); - wrapper = await wrapperFactory.deploy( - ensAddress, - baseRegistrarAddress, - metaDataserviceAddress - ); - wrapperAddress = await wrapper.getAddress() - const l1VerifierFactory = await ethers.getContractFactory( - 'L1Verifier', - signer - ); - verifier = await l1VerifierFactory.deploy(['test:']); - const impl = await ethers.getContractFactory( - 'DelegatableResolver', - signer - ); - const implContract = await impl.deploy(); - const testL2Factory = await ethers.getContractFactory( - 'DelegatableResolverFactory', - signer - ); - const l2factoryContract = await testL2Factory.deploy(await implContract.getAddress()); - const tx = await l2factoryContract.create(await signer.getAddress()); - await provider.send('evm_mine', []); - await tx.wait() - const logs = await l2factoryContract.queryFilter("NewDelegatableResolver") - const [resolver] = logs[0].args - resolverAddress = resolver - const testL1Factory = await ethers.getContractFactory( - 'L1Resolver', - signer - ); - const verifierAddress = await verifier.getAddress() - target = await testL1Factory.deploy(verifierAddress, ensAddress, wrapperAddress); - // Mine an empty block so we have something to prove against - await provider.send('evm_mine', []); - l2contract = impl.attach(resolverAddress) - }); - - it("should not allow non owner to set target", async() => { - const incorrectnode = ethers.namehash('notowned.eth') - const incorrectname = encodeName('notowned.eth') - // For some reason expect().to.be.reverted isn't working - // Throwing Error: missing revert data (action="estimateGas"... - try{ - await target.setTarget(incorrectnode, resolverAddress) - }catch(e){ - } - - const result = await target.getTarget(incorrectname, 0) - expect(result[1]).to.equal(EMPTY_ADDRESS); - }) - - it("should allow owner to set target", async() => { - await target.setTarget(node, signerAddress) - const result = await target.getTarget(encodeName(name), 0) - expect(result[1]).to.equal(signerAddress); - }) - - it("subname should get target of its parent", async() => { - const subname = 'd.foo.eth' - const encodedsubname = encodeName(subname) - const subnode = ethers.namehash(subname) - await target.setTarget(node, signerAddress) - const result = await target.getTarget(encodedsubname, 0) - expect(result[0]).to.equal(subnode); - expect(result[1]).to.equal(signerAddress); - }) - - it("should allow wrapped owner to set target", async() => { - const label = 'wrapped' - const tokenId = labelhash(label) - await baseRegistrar.setApprovalForAll(wrapperAddress, true) - await baseRegistrar.register(tokenId, signerAddress, 100000000) - await wrapper.wrapETH2LD( - label, - signerAddress, - 0, // CAN_DO_EVERYTHING - EMPTY_ADDRESS, - ) - const wrappedtnode = ethers.namehash(`${label}.eth`) - await target.setTarget(wrappedtnode, resolverAddress) - const encodedname = encodeName(`${label}.eth`) - const result = await target.getTarget(encodedname, 0) - expect(result[1]).to.equal(resolverAddress); - }) - - it("should resolve empty ETH Address", async() => { - await target.setTarget(node, resolverAddress) - const addr = '0x0000000000000000000000000000000000000000' - await l2contract.clearRecords(node) - const result = await l2contract['addr(bytes32)'](node) - expect(ethers.getAddress(result)).to.equal(addr); - await provider.send("evm_mine", []); - - const i = new ethers.Interface(["function addr(bytes32) returns(address)"]) - const calldata = i.encodeFunctionData("addr", [node]) - const result2 = await target.resolve(encodedname, calldata, { enableCcipRead: true }) - const decoded = i.decodeFunctionResult("addr", result2) - expect(decoded[0]).to.equal(addr); - }) - - it("should resolve ETH Address", async() => { - await target.setTarget(node, resolverAddress) - const addr = '0x5A384227B65FA093DEC03Ec34e111Db80A040615' - await l2contract.clearRecords(node) - await l2contract['setAddr(bytes32,address)'](node, addr) - const result = await l2contract['addr(bytes32)'](node) - expect(ethers.getAddress(result)).to.equal(addr); - await provider.send("evm_mine", []); - - const i = new ethers.Interface(["function addr(bytes32) returns(address)"]) - const calldata = i.encodeFunctionData("addr", [node]) - const result2 = await target.resolve(encodedname, calldata, { enableCcipRead: true }) - const decoded = i.decodeFunctionResult("addr", result2) - expect(decoded[0]).to.equal(addr); - }) - - it("should resolve ETH Address for subname", async() => { - await target.setTarget(node, resolverAddress) - const addr = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045' - await l2contract.clearRecords(node) - const subname = 'd.foo.eth' - const subnode = ethers.namehash(subname) - const encodedsubname = encodeName(subname) - await l2contract['setAddr(bytes32,address)'](subnode, addr) - const result = await l2contract['addr(bytes32)'](subnode) - expect(ethers.getAddress(result)).to.equal(addr); - await provider.send("evm_mine", []); - const i = new ethers.Interface(["function addr(bytes32) returns(address)"]) - const calldata = i.encodeFunctionData("addr", [subnode]) - - const result2 = await target.resolve(encodedsubname, calldata, { enableCcipRead: true }) - const decoded = i.decodeFunctionResult("addr", result2) - expect(decoded[0]).to.equal(addr); - }) - - it("should resolve non ETH Address", async() => { - await target.setTarget(node, resolverAddress) - const addr = '0x76a91462e907b15cbf27d5425399ebf6f0fb50ebb88f1888ac' - const coinType = 0 // BTC - await l2contract.clearRecords(node) - await l2contract['setAddr(bytes32,uint256,bytes)'](node, coinType, addr) - await provider.send("evm_mine", []); - - const i = new ethers.Interface(["function addr(bytes32,uint256) returns(bytes)"]) - const calldata = i.encodeFunctionData("addr", [node, coinType]) - const result2 = await target.resolve(encodedname, calldata, { enableCcipRead: true }) - const decoded = i.decodeFunctionResult("addr", result2) - expect(decoded[0]).to.equal(addr); - }) - - it("should resolve text record", async() => { - await target.setTarget(node, resolverAddress) - const key = 'name' - const value = 'nick.eth' - await l2contract.clearRecords(node) - await l2contract.setText(node, key, value) - await provider.send("evm_mine", []); - - const i = new ethers.Interface(["function text(bytes32,string) returns(string)"]) - const calldata = i.encodeFunctionData("text", [node, key]) - const result2 = await target.resolve(encodedname, calldata, { enableCcipRead: true }) - const decoded = i.decodeFunctionResult("text", result2) - expect(decoded[0]).to.equal(value); - }) - - it("should test contenthash", async() => { - await target.setTarget(node, resolverAddress) - const contenthash = '0xe3010170122029f2d17be6139079dc48696d1f582a8530eb9805b561eda517e22a892c7e3f1f' - await l2contract.clearRecords(node) - await l2contract.setContenthash(node, contenthash) - await provider.send("evm_mine", []); - - const i = new ethers.Interface(["function contenthash(bytes32) returns(bytes)"]) - const calldata = i.encodeFunctionData("contenthash", [node]) - const result2 = await target.resolve(encodedname, calldata, { enableCcipRead: true }) - const decoded = i.decodeFunctionResult("contenthash", result2) - expect(decoded[0]).to.equal(contenthash); - }) -}); diff --git a/crosschain-resolver/tsconfig.json b/crosschain-resolver/tsconfig.json deleted file mode 100644 index 2e8555d7..00000000 --- a/crosschain-resolver/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../tsconfig.json", - "include": ["./scripts", "./test"], - "files": ["hardhat.config.ts"], - "compilerOptions": { - "esModuleInterop": true, - "verbatimModuleSyntax": false, - "allowSyntheticDefaultImports": true, - "target": "ES2020", - "module": "CommonJS", - "moduleResolution": "Node", - "skipLibCheck": true - } -} diff --git a/evm-gateway/README.md b/evm-gateway/README.md index d596b5fa..93b779ae 100644 --- a/evm-gateway/README.md +++ b/evm-gateway/README.md @@ -4,6 +4,12 @@ A framework for constructing generic CCIP-Read gateways targeting different EVM- implements all the functionality required to fetch and verify multiple storage slots from an EVM-compatible chain, omitting only the L2-specific logic of determining a block to target, and verifying the root of the generated proof. -See [@ensdomains/l1-gateway][https://github.com/ensdomains/evmgateway/tree/main/l1-gateway] for an example implementation. +See [@ensdomains/l1-gateway](https://github.com/ensdomains/evmgateway/tree/main/l1-gateway) for an example implementation. For a detailed readme and usage instructions, see the [monorepo readme](https://github.com/ensdomains/evmgateway/tree/main). + +## Installation + +``` +bun add @ensdomains/evm-gateway +``` \ No newline at end of file diff --git a/evm-gateway/package.json b/evm-gateway/package.json index 66901332..050e1c2d 100644 --- a/evm-gateway/package.json +++ b/evm-gateway/package.json @@ -1,11 +1,12 @@ { "name": "@ensdomains/evm-gateway", - "version": "0.1.0", + "version": "0.1.0-beta.4", "author": "Nick Johnson", "main": "./_cjs/index.js", "module": "./_esm/index.js", "dependencies": { "@chainlink/ccip-read-server": "^0.2.1", + "@cloudflare/workers-types": "^4.20240423.0", "@ensdomains/ccip-read-cf-worker": "^0.0.1", "ethers": "^6.7.1" }, @@ -18,6 +19,14 @@ "./package.json": "./package.json" }, "description": "A generic CCIP-Read gateway for fetching state proofs of data on other EVM chains", + "repository": { + "type": "git", + "url": "https://github.com/ensdomains/evmgateway.git" + }, + "bugs": { + "url": "https://github.com/ensdomains/evmgateway/issues" + }, + "homepage": "https://github.com/ensdomains/evmgateway/tree/main/evm-gateway", "engines": { "node": ">=10", "bun": ">=1.0.4" @@ -45,7 +54,7 @@ "build:esm": "tsc --project tsconfig.build.json --module es2022 --outDir ./_esm && echo > ./_esm/package.json '{\"type\":\"module\",\"sideEffects\":false}'", "build:types": "tsc --project ./tsconfig.build.json --module esnext --declarationDir ./_types --emitDeclarationOnly --declaration --declarationMap", "build": "echo 'building evm-gateway...' && bun run clean && bun run build:cjs && bun run build:esm && bun run build:types", - "prepublishOnly": "bun ../scripts/prepublishOnly.ts", + "prepublishOnly": "bun run build", "lint": "eslint . --ext .ts", "prepare": "bun run build", "clean": "rm -fr _cjs _esm _types" diff --git a/evm-gateway/src/index.ts b/evm-gateway/src/index.ts index 39e5e5a3..b582ddbc 100644 --- a/evm-gateway/src/index.ts +++ b/evm-gateway/src/index.ts @@ -1,4 +1,4 @@ export { EVMGateway, StorageLayout } from './EVMGateway.js'; export { EVMProofHelper, type StateProof } from './EVMProofHelper.js'; export type { IProofService, ProvableBlock } from './IProofService.js'; -export type { Router } from './utils.js'; +export { propsDecoder, type Router } from './utils.js'; diff --git a/evm-gateway/src/utils.ts b/evm-gateway/src/utils.ts index 170d588f..e3975480 100644 --- a/evm-gateway/src/utils.ts +++ b/evm-gateway/src/utils.ts @@ -1,3 +1,24 @@ +import { type Request as CFWRequest } from '@cloudflare/workers-types'; +import { type PropsDecoder } from '@ensdomains/server-analytics'; export interface Router { - handle: (request: Request) => void; + handle: (request: CFWRequest) => Promise; } + +export const propsDecoder: PropsDecoder = ( + request?: CFWRequest +) => { + if (!request || !request.url) { + return {}; + } + const trackingData = request.url.match( + /\/0x[a-fA-F0-9]{40}\/0x[a-fA-F0-9]{1,}\.json/ + ); + if (trackingData) { + return { + sender: trackingData[0].slice(1, 42), + calldata: trackingData[0].slice(44).replace('.json', ''), + }; + } else { + return {}; + } +}; diff --git a/evm-verifier/README.md b/evm-verifier/README.md index 5839957c..5d301d93 100644 --- a/evm-verifier/README.md +++ b/evm-verifier/README.md @@ -2,3 +2,9 @@ A Solidity library that verifies state proofs generated by an [evm-gateway](https://github.com/ensdomains/evmgateway/tree/main/evm-gateway) instance. This library implements all the functionality required make CCIP-Read calls to an EVM gateway and verify the responses, except for verifying the root of the proof. This library is intended to be used by libraries for specific EVM-compatible chains that implement the missing functionality. For a detailed readme and usage instructions, see the [monorepo readme](https://github.com/ensdomains/evmgateway/tree/main). + +## Installation + +``` +bun add @ensdomains/evm-verifier +``` \ No newline at end of file diff --git a/evm-verifier/package.json b/evm-verifier/package.json index e46b0b5a..5eb2dd8c 100644 --- a/evm-verifier/package.json +++ b/evm-verifier/package.json @@ -1,9 +1,19 @@ { "name": "@ensdomains/evm-verifier", "license": "MIT", - "version": "0.1.0", + "version": " 0.1.0-beta.4", + "author": "ENS labs", + "repository": { + "type": "git", + "url": "https://github.com/ensdomains/evmgateway.git" + }, + "bugs": { + "url": "https://github.com/ensdomains/evmgateway/issues" + }, + "homepage": "https://github.com/ensdomains/evmgateway/tree/main/evm-verifier", "scripts": { "build": "echo 'building evm-verifier...' && bun hardhat compile", + "prepublishOnly": "bun run build", "test": "bun hardhat test", "clean": "rm -fr artifacts cache node_modules typechain-types", "lint": "exit 0" diff --git a/l1-gateway/README.md b/l1-gateway/README.md index acb245b2..b8827101 100644 --- a/l1-gateway/README.md +++ b/l1-gateway/README.md @@ -9,6 +9,12 @@ target for testing the entire framework end-to-end. It may also prove useful for contracts that wish to trustlessly establish the content of storage variables of other contracts, or historic values for storage variables of any contract. +## Installation + +``` +bun add @ensdomains/l1-gateway +``` + ## How to use l1-gateway locally via cloudflare dev env (aka wrangler) ``` @@ -33,8 +39,8 @@ bun run deploy ## How to test ``` -cd ../l1-verifier l1-gateway -PROVIDER_URL=$PROVIDER_URL TARGET_ADDRESS=$TARGET_ADDRESS bun run remote_test +cd ../l1-verifier +PROVIDER_URL=$PROVIDER_URL TARGET_ADDRESS=$TARGET_ADDRESS yarn remote_test ``` ## Current deployments diff --git a/l1-gateway/package.json b/l1-gateway/package.json index e63432b3..d0b17221 100644 --- a/l1-gateway/package.json +++ b/l1-gateway/package.json @@ -1,9 +1,16 @@ { "name": "@ensdomains/l1-gateway", - "version": "0.1.0", + "version": "0.1.0-beta.4", "author": "Nick Johnson", "license": "MIT", - "type": "module", + "repository": { + "type": "git", + "url": "https://github.com/ensdomains/evmgateway.git" + }, + "bugs": { + "url": "https://github.com/ensdomains/evmgateway/issues" + }, + "homepage": "https://github.com/ensdomains/evmgateway/tree/main/l1-gateway", "main": "./_cjs/index.js", "module": "./_esm/index.js", "types": "./_types/index.d.ts", @@ -45,7 +52,7 @@ "build:esm": "tsc --project tsconfig.build.json --module es2022 --outDir ./_esm && echo > ./_esm/package.json '{\"type\":\"module\",\"sideEffects\":false}'", "build:types": "tsc --project ./tsconfig.build.json --module esnext --declarationDir ./_types --emitDeclarationOnly --declaration --declarationMap", "build": "echo 'building l1-gateway...' && bun run clean && bun run build:cjs && bun run build:esm && bun run build:types", - "prepublishOnly": "bun ../scripts/prepublishOnly.ts", + "prepublishOnly": "bun run build", "lint": "eslint . --ext .ts", "prepare": "bun run build", "clean": "rm -fr _cjs _esm _types" @@ -58,7 +65,7 @@ "dependencies": { "@chainlink/ccip-read-server": "^0.2.1", "@commander-js/extra-typings": "^11.0.0", - "@ensdomains/evm-gateway": "^0.1.0", + "@ensdomains/evm-gateway": "0.1.0-beta.4", "@ethereumjs/block": "^5.0.0", "@nomicfoundation/ethereumjs-block": "^5.0.2", "commander": "^11.0.0", diff --git a/l1-gateway/src/worker.ts b/l1-gateway/src/worker.ts index bdff5f3c..97b7f52c 100644 --- a/l1-gateway/src/worker.ts +++ b/l1-gateway/src/worker.ts @@ -1,10 +1,11 @@ +import { Request as CFWRequest } from '@cloudflare/workers-types'; import { Server } from '@ensdomains/ccip-read-cf-worker'; import type { Router } from '@ensdomains/evm-gateway'; interface Env { WORKER_PROVIDER_URL: string; } let app: Router; -async function fetch(request: Request, env: Env) { +async function fetch(request: CFWRequest, env: Env) { // Loading libraries dynamically as a temp work around. // Otherwise, deployment thorws "Error: Script startup exceeded CPU time limit." error if (!app) { diff --git a/l1-verifier/README.md b/l1-verifier/README.md index ada69e43..e6daf784 100644 --- a/l1-verifier/README.md +++ b/l1-verifier/README.md @@ -4,3 +4,9 @@ A complete Solidity library that facilitates sending CCIP-Read requests for L1 s This repository also contains the end-to-end tests for the entire stack. For a detailed readme and usage instructions, see the [monorepo readme](https://github.com/ensdomains/evmgateway/tree/main). + +## Installation + +``` +bun add @ensdomains/l1-verifier +``` diff --git a/l1-verifier/package.json b/l1-verifier/package.json index dc9cc669..fb565e31 100644 --- a/l1-verifier/package.json +++ b/l1-verifier/package.json @@ -1,7 +1,15 @@ { "name": "@ensdomains/l1-verifier", "license": "MIT", - "version": "0.1.0", + "version": "0.1.0-beta.4", + "repository": { + "type": "git", + "url": "https://github.com/ensdomains/evmgateway.git" + }, + "bugs": { + "url": "https://github.com/ensdomains/evmgateway/issues" + }, + "homepage": "https://github.com/ensdomains/evmgateway/tree/main/l1-verifier", "scripts": { "build": "echo 'building l1-verifier...' && bun hardhat compile", "test": "node ./scripts/test.js", @@ -10,7 +18,7 @@ "lint": "exit 0" }, "devDependencies": { - "@ensdomains/l1-gateway": "workspace:*", + "@ensdomains/l1-gateway": "0.1.0-beta.4", "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.0", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", @@ -37,8 +45,8 @@ "typescript": "^5.2.2" }, "dependencies": { + "@ensdomains/evm-verifier": "0.1.0-beta.4", "@eth-optimism/contracts": "^0.6.0", - "@eth-optimism/contracts-bedrock": "^0.16.2", - "@ensdomains/evm-verifier": "^0.1.0" + "@eth-optimism/contracts-bedrock": "^0.16.2" } } diff --git a/op-gateway/README.md b/op-gateway/README.md index 498b3d44..9109e5fd 100644 --- a/op-gateway/README.md +++ b/op-gateway/README.md @@ -19,38 +19,19 @@ bun run dev ``` cd op-gateway -npm install -g bun wrangler +npm install -g wrangler wrangler login -wrangler secret put L1_PROVIDER_URL -wrangler secret put L2_PROVIDER_URL -wrangler secret put L2_OUTPUT_ORACLE -wrangler secret put DELAY -bun run deploy +wrangler secret put L1_PROVIDER_URL --env op-sepolia|base-sepolia +wrangler secret put L2_PROVIDER_URL --env op-sepolia|base-sepolia +wrangler secret put L2_OUTPUT_ORACLE --env op-sepolia|base-sepolia +wrangler secret put DELAY --env op-sepolia|base-sepolia +wrangler secret put ENDPOINT_URL --env op-sepolia|base-sepolia +yarn deploy --env op-sepolia|base-sepolia ``` ## How to test ``` -cd ../l1-verifier l1-gateway -PROVIDER_URL=$PROVIDER_URL TARGET_ADDRESS=$TARGET_ADDRESS bun run remote_test +cd ../l1-verifier +PROVIDER_URL=$PROVIDER_URL TARGET_ADDRESS=$TARGET_ADDRESS yarn remote_test ``` - -## Current deployments - -### Goerli - -#### Contracts - -- OPVerifier = [0x0c2746F20C9c97DBf718de10c04943cf408230A3](https://goerli.etherscan.io/address/0x0c2746F20C9c97DBf718de10c04943cf408230A3) - -#### Example contracts - -- TestL1 = [0x5057276e2BD7750Be043595ac6d21dE31e900c3c](https://goerli.etherscan.io/address/0x5057276e2BD7750Be043595ac6d21dE31e900c3c) - -#### Example contracts(OptimismGoerli) - -- TestL2 = [0x0FEcD0Fec173807204c7B31e36384acEeB048b0A](https://goerli-optimism.etherscan.io/address/0x0FEcD0Fec173807204c7B31e36384acEeB048b0A) - -#### Gateway - -- http://op-gateway-worker.ens-cf.workers.dev diff --git a/op-gateway/package.json b/op-gateway/package.json index 91fcc538..55aee90d 100644 --- a/op-gateway/package.json +++ b/op-gateway/package.json @@ -57,8 +57,10 @@ }, "dependencies": { "@chainlink/ccip-read-server": "^0.2.1", + "@cloudflare/workers-types": "^4.20240423.0", "@commander-js/extra-typings": "^11.0.0", - "@ensdomains/evm-gateway": "^0.1.0", + "@ensdomains/evm-gateway": "0.1.0-beta.4", + "@ensdomains/server-analytics": "0.0.1-alpha.5", "@ethereumjs/block": "^5.0.0", "@nomicfoundation/ethereumjs-block": "^5.0.2", "commander": "^11.0.0", diff --git a/op-gateway/src/worker.ts b/op-gateway/src/worker.ts index 1ed3959d..daac73f9 100644 --- a/op-gateway/src/worker.ts +++ b/op-gateway/src/worker.ts @@ -1,21 +1,41 @@ +import { Request as CFWRequest } from '@cloudflare/workers-types'; import { Server } from '@ensdomains/ccip-read-cf-worker'; -import type { Router } from '@ensdomains/evm-gateway'; +import { propsDecoder, type Router } from '@ensdomains/evm-gateway'; +import { Tracker } from '@ensdomains/server-analytics'; + interface Env { L1_PROVIDER_URL: string; L2_PROVIDER_URL: string; L2_OUTPUT_ORACLE: string; DELAY: number; + GATEWAY_DOMAIN: string; + ENDPOINT_URL: string; } + let app: Router; -async function fetch(request: Request, env: Env) { + +async function fetch(request: CFWRequest, env: Env) { + // Set PROVIDER_URL under .dev.vars locally. Set the key as secret remotely with `wrangler secret put WORKER_PROVIDER_URL` + const { + L1_PROVIDER_URL, + L2_PROVIDER_URL, + L2_OUTPUT_ORACLE, + DELAY, + GATEWAY_DOMAIN, + ENDPOINT_URL, + } = env; + + const tracker = new Tracker(GATEWAY_DOMAIN, { + apiEndpoint: ENDPOINT_URL, + enableLogging: true, + }); + // Loading libraries dynamically as a temp work around. // Otherwise, deployment thorws "Error: Script startup exceeded CPU time limit." error if (!app) { const ethers = await import('ethers'); const EVMGateway = (await import('@ensdomains/evm-gateway')).EVMGateway; const OPProofService = (await import('./OPProofService.js')).OPProofService; - // Set PROVIDER_URL under .dev.vars locally. Set the key as secret remotely with `wrangler secret put WORKER_PROVIDER_URL` - const { L1_PROVIDER_URL, L2_PROVIDER_URL, L2_OUTPUT_ORACLE, DELAY } = env; const l1Provider = new ethers.JsonRpcProvider(L1_PROVIDER_URL); const l2Provider = new ethers.JsonRpcProvider(L2_PROVIDER_URL); @@ -33,7 +53,12 @@ async function fetch(request: Request, env: Env) { gateway.add(server); app = server.makeApp('/'); } - return app.handle(request); + + const props = propsDecoder(request); + await tracker.trackEvent(request, 'request', { props }, true); + return app + .handle(request) + .then(tracker.logResult.bind(null, propsDecoder, request)); } export default { diff --git a/op-gateway/wrangler.toml b/op-gateway/wrangler.toml index 8b00b549..26a9e49c 100644 --- a/op-gateway/wrangler.toml +++ b/op-gateway/wrangler.toml @@ -1,4 +1,3 @@ -name = "op-gateway-worker" account_id = "15dcc9085cb794bb4f29d3e8177ac880" main = "./src/worker.ts" node_compat = true @@ -10,4 +9,11 @@ port = 8080 [build] command = "bun run build" -[vars] +[env.base-sepolia] +name = "base-sepolia-gateway-worker" +[env.base-sepolia.vars] +GATEWAY_DOMAIN="base-sepolia-gateway-worker.ens-cf.workers.dev" +[env.op-sepolia] +name = "op-sepolia-gateway-worker" +[env.op-sepolia.vars] +GATEWAY_DOMAIN="op-sepolia-gateway-worker.ens-cf.workers.dev" \ No newline at end of file diff --git a/op-verifier/README.md b/op-verifier/README.md index caa6a4ec..bb4249a4 100644 --- a/op-verifier/README.md +++ b/op-verifier/README.md @@ -29,3 +29,42 @@ hardhat test --network opDevnetL1 ``` The tests will require small modifications to work on public testnets; specifically, contract addresses are currently fetched from `http://localhost:8080/addresses.json`; this will need to be made conditional on the network being used. + +## Deployed addresses + +### Optimism + +#### L1 + +- OPVerifier = [0x0e8DA38565915B7e74e2d78F80ba1BF815F34116](https://sepolia.etherscan.io/address/0x0e8DA38565915B7e74e2d78F80ba1BF815F34116#code) +- TestL1 = [0x00198c6c94522A81698190ADF411641995Eb180c](https://sepolia.etherscan.io/address/0x00198c6c94522A81698190ADF411641995Eb180c#code +) +#### L2 + +- TestL2 = [0x94fbCE7ca1a0152cfC99F90f4421d31cf356c896](https://sepolia-optimism.etherscan.io/address/0x94fbCE7ca1a0152cfC99F90f4421d31cf356c896) + +#### Gateway url + +- https://op-sepolia-gateway-worker.ens-cf.workers.dev/{sender}/{data}.json + +### Base + +#### L1 + +- OPVerifier = [0xAdef74372444e716C0473dEe1F9Cb3108EFa3818](https://sepolia.etherscan.io/address/0xAdef74372444e716C0473dEe1F9Cb3108EFa3818#code +) +- TestL1 = [0x540C93800699C044dB8cf1f0F059ca0FA5CaED92](https://sepolia.etherscan.io/address/0x540C93800699C044dB8cf1f0F059ca0FA5CaED92#code) + +#### L2 + +- TestL2 = [0x94fbCE7ca1a0152cfC99F90f4421d31cf356c896](https://sepolia.basescan.org/address/0x94fbCE7ca1a0152cfC99F90f4421d31cf356c896#code) + +#### Gateway url + +- https://base-sepolia-gateway-worker.ens-cf.workers.dev/{sender}/{data}.json + +## Testing gateway + +``` +TARGET_ADDRESS=$TEST_L1_ADDRESS PROVIDER_URL=$L1_PROVIDER_URL npx hardhat run ../l1-verifier/scripts/remote.ts --network sepolia +``` \ No newline at end of file diff --git a/op-verifier/arguments.js b/op-verifier/arguments.js new file mode 100644 index 00000000..0fbd8739 --- /dev/null +++ b/op-verifier/arguments.js @@ -0,0 +1,6 @@ +module.exports = [ + [ + 'https://base-sepolia-gateway-worker.ens-cf.workers.dev/{sender}/{data}.json' + ], + '0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254' +]; diff --git a/op-verifier/deploy_l1/00_op_verifier.ts b/op-verifier/deploy_l1/00_op_verifier.ts index b041f8ba..f2af7982 100644 --- a/op-verifier/deploy_l1/00_op_verifier.ts +++ b/op-verifier/deploy_l1/00_op_verifier.ts @@ -5,10 +5,14 @@ import fs from 'fs'; const GATEWAY_URLS = { 'opDevnetL1':'http://localhost:8080/{sender}/{data}.json', 'goerli':'https://op-gateway-worker.ens-cf.workers.dev/{sender}/{data}.json', + 'sepolia':'https://op-sepolia-gateway-worker.ens-cf.workers.dev/{sender}/{data}.json', + 'sepoliaForBase':'https://base-sepolia-gateway-worker.ens-cf.workers.dev/{sender}/{data}.json', } const L2_OUTPUT_ORACLE_ADDRESSES = { - 'goerli': '0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0' + 'goerli': '0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0', + 'sepolia': '0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F', + 'sepoliaForBase': '0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254', } const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { @@ -20,12 +24,13 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const opAddresses = await (await fetch("http://localhost:8080/addresses.json")).json(); L2_OUTPUT_ORACLE_ADDRESS = opAddresses.L2OutputOracleProxy }else{ + GATEWAY_URL = GATEWAY_URLS[network.name] L2_OUTPUT_ORACLE_ADDRESS = L2_OUTPUT_ORACLE_ADDRESSES[network.name] } console.log('OPVerifier', [[GATEWAY_URL], L2_OUTPUT_ORACLE_ADDRESS]) await deploy('OPVerifier', { from: deployer, - args: [[GATEWAY_URLS[network.name]], L2_OUTPUT_ORACLE_ADDRESS], + args: [[GATEWAY_URL], L2_OUTPUT_ORACLE_ADDRESS], log: true, }); }; diff --git a/op-verifier/deploy_l1/10_testl1.ts b/op-verifier/deploy_l1/10_testl1.ts index 503ce80c..712c2f5b 100644 --- a/op-verifier/deploy_l1/10_testl1.ts +++ b/op-verifier/deploy_l1/10_testl1.ts @@ -10,7 +10,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const OPVerifier = await deployments.get('OPVerifier'); const TestL2 = await hre.companionNetworks['l2'].deployments.get('TestL2'); - + console.log(`TestL1 is deployed with OPVerifier.address ${OPVerifier.address} and TestL2.address ${TestL2.address} as argments`) await deploy('TestL1', { from: deployer, args: [OPVerifier.address, TestL2.address], diff --git a/op-verifier/deploy_l2/01_testl2 .ts b/op-verifier/deploy_l2/01_testl2.ts similarity index 82% rename from op-verifier/deploy_l2/01_testl2 .ts rename to op-verifier/deploy_l2/01_testl2.ts index 369e8f47..0249c3b7 100644 --- a/op-verifier/deploy_l2/01_testl2 .ts +++ b/op-verifier/deploy_l2/01_testl2.ts @@ -2,7 +2,7 @@ import {HardhatRuntimeEnvironment} from 'hardhat/types'; import {DeployFunction} from 'hardhat-deploy/types'; const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const {deployments, getNamedAccounts} = hre; + const {deployments, getNamedAccounts, network} = hre; const {deploy} = deployments; const {deployer} = await getNamedAccounts(); @@ -14,4 +14,4 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }); }; export default func; -func.tags = ['TestL2']; +func.tags = ['TestL2']; \ No newline at end of file diff --git a/op-verifier/hardhat.config.ts b/op-verifier/hardhat.config.ts index 98f86054..4f93ecc4 100644 --- a/op-verifier/hardhat.config.ts +++ b/op-verifier/hardhat.config.ts @@ -36,12 +36,42 @@ const config: HardhatUserConfig = { url: "https://goerli.optimism.io", accounts: [DEPLOYER_PRIVATE_KEY], deploy: [ "deploy_l2/" ], - } + }, + sepolia: { + url: L1_PROVIDER_URL, + accounts: [DEPLOYER_PRIVATE_KEY], + deploy: [ "deploy_l1/" ], + companionNetworks: { + l2: "optimismSepolia", + }, + }, + sepoliaForBase: { + url: L1_PROVIDER_URL, + accounts: [DEPLOYER_PRIVATE_KEY], + deploy: [ "deploy_l1/" ], + companionNetworks: { + l2: "baseSepolia", + }, + }, + optimismSepolia: { + url: "https://sepolia.optimism.io", + accounts: [DEPLOYER_PRIVATE_KEY], + deploy: [ "deploy_l2/" ], + }, + baseSepolia: { + url: "https://sepolia.base.org", + accounts: [DEPLOYER_PRIVATE_KEY], + deploy: [ "deploy_l2/" ], + }, }, etherscan: { apiKey: { goerli: L1_ETHERSCAN_API_KEY, - optimismGoerli: L2_ETHERSCAN_API_KEY + sepolia: L1_ETHERSCAN_API_KEY, + optimismGoerli: L2_ETHERSCAN_API_KEY, + baseGoerli: L2_ETHERSCAN_API_KEY, + optimismSepolia: L2_ETHERSCAN_API_KEY, + baseSepolia: L2_ETHERSCAN_API_KEY, }, customChains: [ { @@ -51,7 +81,23 @@ const config: HardhatUserConfig = { apiURL: "https://api-goerli-optimism.etherscan.io/api", browserURL: "https://goerli-optimism.etherscan.io" } - } + }, + { + network: "optimismSepolia", + chainId: 11155420, + urls: { + apiURL: "https://api-sepolia-optimism.etherscan.io/api", + browserURL: "https://sepolia-optimism.etherscan.io" + } + }, + { + network: "baseSepolia", + chainId: 84532, + urls: { + apiURL: "https://api-sepolia.basescan.org/api", + browserURL: "https://sepolia.basescan.org" + } + }, ] }, namedAccounts: { diff --git a/op-verifier/package.json b/op-verifier/package.json index 6d2795ae..e4de99e5 100644 --- a/op-verifier/package.json +++ b/op-verifier/package.json @@ -37,7 +37,7 @@ "typescript": "^5.2.2" }, "dependencies": { - "@ensdomains/evm-verifier": "^0.1.0", + "@ensdomains/evm-verifier": "0.1.0-beta.4", "@eth-optimism/contracts": "^0.6.0", "@eth-optimism/contracts-bedrock": "^0.16.2" } diff --git a/package.json b/package.json index eb970e6f..bd0a9a5a 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,13 @@ "evm-verifier", "l1-verifier", "op-verifier", - "arb-verifier", - "crosschain-resolver" + "arb-verifier" ], "scripts": { "env": "env", "workspace": "bun ./scripts/workspace.ts", "build": "bun run workspace evm-gateway build && bun run workspace -evm-gateway build", - "test": "bun run workspace l1-verifier test && bun run workspace crosschain-resolver test", + "test": "bun run workspace l1-verifier test", "lint": "bun run workspace all lint", "prepare": "husky install" }, @@ -28,14 +27,14 @@ }, "repository": { "type": "git", - "url": "https://github.com/Arachnid/evm-l2-gateway.git" + "url": "https://github.com/ensdomains/evmgateway.git" }, - "author": "@smartcontractkit", + "author": "ENS labs", "license": "MIT", "bugs": { - "url": "https://github.com/arachnid/evm-l2-gateway/issues" + "url": "https://github.com/ensdomains/evmgateway/issues" }, - "homepage": "https://github.com/arachnid/evm-l2-gateway#readme", + "homepage": "https://github.com/ensdomains/evmgateway#readme", "resolutions": { "@eth-optimism/sdk/**/ethers": "^5.7.0" }, diff --git a/tsconfig.json b/tsconfig.json index 42ea5e16..e4dc3b47 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,7 +37,6 @@ "ES2022", // By using ES2022 we get access to the `.cause` property on `Error` instances. "DOM" // For `btoa` and `atob`. ], - // Skip type checking for node modules "skipLibCheck": true }