From 400229bb1708f8af5e066cbb681b1441f8f69d7f Mon Sep 17 00:00:00 2001 From: tate Date: Wed, 21 Aug 2024 15:10:25 +1000 Subject: [PATCH 1/2] feat(wip): viem --- .vscode/settings.json | 3 + arb-gateway/package.json | 12 +- arb-gateway/src/ArbProofService.ts | 332 ++-- arb-gateway/src/abi/rollupABI.ts | 1634 +---------------- arb-gateway/src/blockCache/IBlockCache.ts | 16 +- .../src/blockCache/InMemoryBlockCache.ts | 29 +- arb-gateway/src/index.ts | 38 +- arb-gateway/src/server.ts | 43 +- arb-gateway/src/worker.ts | 52 +- arb-gateway/wrangler.toml | 8 +- arb-verifier/hardhat.config.ts | 19 +- arb-verifier/package.json | 1 + arb-verifier/test/testArbVerifier.ts | 277 ++- arb-verifier/tsconfig.json | 9 +- bun.lockb | Bin 605288 -> 649088 bytes evm-gateway/package.json | 3 +- evm-gateway/src/EVMGateway.ts | 194 +- evm-gateway/src/EVMProofHelper.ts | 77 +- evm-gateway/src/IProofService.ts | 26 +- evm-gateway/src/utils.ts | 44 +- package.json | 2 +- 21 files changed, 641 insertions(+), 2178 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..25fa6215 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} diff --git a/arb-gateway/package.json b/arb-gateway/package.json index b090e491..5961c212 100644 --- a/arb-gateway/package.json +++ b/arb-gateway/package.json @@ -56,16 +56,18 @@ } }, "dependencies": { - "@chainlink/ccip-read-server": "^0.2.1", "@cloudflare/workers-types": "^4.20240423.0", + "@ensdomains/ccip-read-router": "^0.0.5", "@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", + "@whatwg-node/server": "^0.9.47", "commander": "^11.0.0", - "ethers": "^6.7.1" + "itty-router": "^5.0.18", + "viem": "^2.19.8" }, "devDependencies": { - "@commander-js/extra-typings": "^11.0.0" + "@types/node": "^22.4.1", + "@commander-js/extra-typings": "^11.0.0", + "wrangler": "^3.72.0" } } diff --git a/arb-gateway/src/ArbProofService.ts b/arb-gateway/src/ArbProofService.ts index f31aad03..b71ffe20 100644 --- a/arb-gateway/src/ArbProofService.ts +++ b/arb-gateway/src/ArbProofService.ts @@ -1,160 +1,200 @@ /* eslint-disable prettier/prettier */ -import { EVMProofHelper, convertIntoMerkleTrieProof, type IProofService } from '@ensdomains/evm-gateway'; -import { AbiCoder, Contract, EventLog, ethers, toBeHex, type AddressLike, toNumber } from 'ethers'; -import rollupAbi from "./abi/rollupABI.js"; +import { + EVMProofHelper, + convertIntoMerkleTrieProof, + type IProofService, +} from '@ensdomains/evm-gateway'; +import { + encodeAbiParameters, + getContract, + parseAbiParameters, + toHex, + toRlp, + zeroHash, + type Address, + type Block, + type Client, + type GetContractReturnType, + type Hex, +} from 'viem'; +import { getBlock } from 'viem/actions'; + +import { rollupAbi } from './abi/rollupAbi.js'; import type { IBlockCache } from './blockCache/IBlockCache.js'; + export interface ArbProvableBlock { - number: number - sendRoot: string, - nodeIndex: string, - rlpEncodedBlock: string + number: number; + sendRoot: Hex; + nodeIndex: bigint; + rlpEncodedBlock: Hex; } - /** * The proofService class can be used to calculate proofs for a given target and slot on the Arbitrum network. * It's also capable of proofing long types such as mappings or string by using all included slots in the proof. * */ export class ArbProofService implements IProofService { - private readonly l2Provider: ethers.JsonRpcProvider; - private readonly rollup: Contract; - private readonly helper: EVMProofHelper; - private readonly cache: IBlockCache; - - - constructor( - l1Provider: ethers.JsonRpcProvider, - l2Provider: ethers.JsonRpcProvider, - l2RollupAddress: string, - cache: IBlockCache - - ) { - this.l2Provider = l2Provider; - this.rollup = new Contract( - l2RollupAddress, - rollupAbi, - l1Provider - ); - this.helper = new EVMProofHelper(l2Provider); - this.cache = cache - } - - async getStorageAt(block: ArbProvableBlock, address: AddressLike, slot: bigint): Promise { - return this.helper.getStorageAt(block.number, address, slot); - } - - - /** - * @dev Fetches a set of proofs for the requested state slots. - * @param block A `ProvableBlock` returned by `getProvableBlock`. - * @param address The address of the contract to fetch data from. - * @param slots An array of slots to fetch data for. - * @returns A proof of the given slots, encoded in a manner that this service's - * corresponding decoding library will understand. - */ - async getProofs( - block: ArbProvableBlock, - address: AddressLike, - slots: bigint[] - ): Promise { - const proof = await this.helper.getProofs(block.number, address, slots); - - return AbiCoder.defaultAbiCoder().encode( - [ - 'tuple(bytes32 version, bytes32 sendRoot, uint64 nodeIndex,bytes rlpEncodedBlock)', - 'tuple(bytes stateTrieWitness, bytes[] storageProofs)', - ], - [ - { - version: - '0x0000000000000000000000000000000000000000000000000000000000000000', - sendRoot: block.sendRoot, - nodeIndex: block.nodeIndex, - rlpEncodedBlock: block.rlpEncodedBlock - }, - convertIntoMerkleTrieProof(proof) - ] - ); - } - /** - * Retrieves information about the latest provable block in the Arbitrum Rollup. - * - * @returns { Promise } A promise that resolves to an object containing information about the provable block. - * @throws Throws an error if any of the underlying operations fail. - * - * @typedef { Object } ArbProvableBlock - * @property { string } rlpEncodedBlock - The RLP - encoded block information. - * @property { string } sendRoot - The send root of the provable block. - * @property { string } blockHash - The hash of the provable block. - * @property { number } nodeIndex - The index of the node corresponding to the provable block. - * @property { number } number - The block number of the provable block. - */ - public async getProvableBlock(): Promise { - //Retrieve the latest pending node that has been committed to the rollup. - const nodeIndex = await this.rollup.latestNodeCreated() - const [l2blockRaw, sendRoot] = await this.getL2BlockForNode(nodeIndex) - - const blockarray = [ - l2blockRaw.parentHash, - l2blockRaw.sha3Uncles, - l2blockRaw.miner, - l2blockRaw.stateRoot, - l2blockRaw.transactionsRoot, - l2blockRaw.receiptsRoot, - l2blockRaw.logsBloom, - toBeHex(l2blockRaw.difficulty), - toBeHex(l2blockRaw.number), - toBeHex(l2blockRaw.gasLimit), - toBeHex(l2blockRaw.gasUsed), - toBeHex(l2blockRaw.timestamp), - l2blockRaw.extraData, - l2blockRaw.mixHash, - l2blockRaw.nonce, - toBeHex(l2blockRaw.baseFeePerGas) - ] - - //Rlp encode the block to pass it as an argument - const rlpEncodedBlock = ethers.encodeRlp(blockarray) - - return { - rlpEncodedBlock, - sendRoot, - nodeIndex: nodeIndex, - number: toNumber(l2blockRaw.number) - } - } - /** - * Fetches the corrospending L2 block for a given node index and returns it along with the send root. - * @param {bigint} nodeIndex - The index of the node for which to fetch the block. - * @returns {Promise<[Record, string]>} A promise that resolves to a tuple containing the fetched block and the send root. - */ - private async getL2BlockForNode(nodeIndex: bigint): Promise<[Record, string]> { - - //We first check if we have the block cached - const cachedBlock = await this.cache.getBlock(nodeIndex) - if (cachedBlock) { - return [cachedBlock.block, cachedBlock.sendRoot] - } - - //We fetch the node created event for the node index we just retrieved. - const nodeEventFilter = await this.rollup.filters.NodeCreated(nodeIndex); - const nodeEvents = await this.rollup.queryFilter(nodeEventFilter); - const assertion = (nodeEvents[0] as EventLog).args!.assertion - //Instead of using the AssertionHelper contract we can extract sendRoot from the assertion. Avoiding the deployment of the AssertionHelper contract and an additional RPC call. - const [blockHash, sendRoot] = assertion[1][0][0] - - - //The L1 rollup only provides us with the block hash. In order to ensure that the stateRoot we're using for the proof is indeed part of the block, we need to fetch the block. And provide it to the proof. - const l2blockRaw = await this.l2Provider.send('eth_getBlockByHash', [ - blockHash, - false - ]); - - //Cache the block for future use - await this.cache.setBlock(nodeIndex, l2blockRaw, sendRoot) - - return [l2blockRaw, sendRoot] + private readonly l2Client: Client; + private readonly rollup: GetContractReturnType; + private readonly helper: EVMProofHelper; + private readonly cache: IBlockCache; + + constructor({ + l1Client, + l2Client, + l2RollupAddress, + cache, + }: { + l1Client: Client; + l2Client: Client; + l2RollupAddress: Address; + cache: IBlockCache; + }) { + this.l2Client = l2Client; + this.rollup = getContract({ + abi: rollupAbi, + address: l2RollupAddress, + client: l1Client, + }); + this.helper = new EVMProofHelper(l2Client); + this.cache = cache; + } + + async getStorageAt({ + block, + address, + slot, + }: { + block: ArbProvableBlock; + address: Address; + slot: bigint; + }): Promise { + return this.helper.getStorageAt({ + blockNumber: block.number, + address, + slot, + }); + } + + /** + * @dev Fetches a set of proofs for the requested state slots. + * @param block A `ProvableBlock` returned by `getProvableBlock`. + * @param address The address of the contract to fetch data from. + * @param slots An array of slots to fetch data for. + * @returns A proof of the given slots, encoded in a manner that this service's + * corresponding decoding library will understand. + */ + async getProofs({ + block, + address, + slots, + }: { + block: ArbProvableBlock; + address: Address; + slots: bigint[]; + }): Promise { + const proof = await this.helper.getProofs({ + blockNumber: block.number, + address, + slots, + }); + + return encodeAbiParameters( + parseAbiParameters([ + '(bytes32 version, bytes32 sendRoot, uint64 nodeIndex,bytes rlpEncodedBlock)', + '(bytes stateTrieWitness, bytes[] storageProofs)', + ]), + [ + { + version: zeroHash, + sendRoot: block.sendRoot, + nodeIndex: BigInt(block.nodeIndex), + rlpEncodedBlock: block.rlpEncodedBlock, + }, + convertIntoMerkleTrieProof(proof), + ] + ); + } + /** + * Retrieves information about the latest provable block in the Arbitrum Rollup. + * + * @returns { Promise } A promise that resolves to an object containing information about the provable block. + * @throws Throws an error if any of the underlying operations fail. + * + * @typedef { Object } ArbProvableBlock + * @property { string } rlpEncodedBlock - The RLP - encoded block information. + * @property { string } sendRoot - The send root of the provable block. + * @property { string } blockHash - The hash of the provable block. + * @property { number } nodeIndex - The index of the node corresponding to the provable block. + * @property { number } number - The block number of the provable block. + */ + public async getProvableBlock(): Promise { + //Retrieve the latest pending node that has been committed to the rollup. + const nodeIndex = await this.rollup.read.latestNodeCreated(); + const [l2blockRaw, sendRoot] = await this.getL2BlockForNode(nodeIndex); + + const blockarray = [ + l2blockRaw.parentHash, + l2blockRaw.sha3Uncles, + l2blockRaw.miner, + l2blockRaw.stateRoot, + l2blockRaw.transactionsRoot, + l2blockRaw.receiptsRoot, + l2blockRaw.logsBloom!, + toHex(l2blockRaw.difficulty), + toHex(l2blockRaw.number!), + toHex(l2blockRaw.gasLimit), + toHex(l2blockRaw.gasUsed), + toHex(l2blockRaw.timestamp), + l2blockRaw.extraData, + l2blockRaw.mixHash, + l2blockRaw.nonce!, + toHex(l2blockRaw.baseFeePerGas!), + ]; + + //Rlp encode the block to pass it as an argument + const rlpEncodedBlock = toRlp(blockarray); + + return { + rlpEncodedBlock, + sendRoot, + nodeIndex: nodeIndex, + number: Number(l2blockRaw.number!), + }; + } + /** + * Fetches the corrospending L2 block for a given node index and returns it along with the send root. + * @param {bigint} nodeIndex - The index of the node for which to fetch the block. + * @returns {Promise<[Record, string]>} A promise that resolves to a tuple containing the fetched block and the send root. + */ + private async getL2BlockForNode(nodeIndex: bigint): Promise<[Block, Hex]> { + //We first check if we have the block cached + const cachedBlock = await this.cache.getBlock(nodeIndex); + if (cachedBlock) { + return [cachedBlock.block, cachedBlock.sendRoot]; } + //We fetch the node created event for the node index we just retrieved. + const nodeEvents = await this.rollup.getEvents.NodeCreated( + { + nodeNum: nodeIndex, + }, + { fromBlock: 0n, toBlock: 'latest' } + ); + const assertion = nodeEvents[0].args.assertion!; + //Instead of using the AssertionHelper contract we can extract sendRoot from the assertion. Avoiding the deployment of the AssertionHelper contract and an additional RPC call. + const [blockHash, sendRoot] = assertion.afterState.globalState.bytes32Vals; + + //The L1 rollup only provides us with the block hash. In order to ensure that the stateRoot we're using for the proof is indeed part of the block, we need to fetch the block. And provide it to the proof. + const l2BlockRaw = await getBlock(this.l2Client, { + blockHash, + includeTransactions: false, + }); + + //Cache the block for future use + await this.cache.setBlock({ nodeIndex, block: l2BlockRaw, sendRoot }); + + return [l2BlockRaw, sendRoot]; + } } diff --git a/arb-gateway/src/abi/rollupABI.ts b/arb-gateway/src/abi/rollupABI.ts index c839f3ec..431ecce8 100644 --- a/arb-gateway/src/abi/rollupABI.ts +++ b/arb-gateway/src/abi/rollupABI.ts @@ -1,60 +1,16 @@ -export default [ +export const rollupAbi = [ { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'previousAdmin', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'newAdmin', - type: 'address', - }, - ], - name: 'AdminChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'beacon', - type: 'address', - }, - ], - name: 'BeaconUpgraded', - type: 'event', - }, - { - anonymous: false, - inputs: [ + inputs: [], + name: 'latestNodeCreated', + outputs: [ { - indexed: true, internalType: 'uint64', - name: 'nodeNum', + name: '', type: 'uint64', }, - { - indexed: false, - internalType: 'bytes32', - name: 'blockHash', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'bytes32', - name: 'sendRoot', - type: 'bytes32', - }, ], - name: 'NodeConfirmed', - type: 'event', + stateMutability: 'view', + type: 'function', }, { anonymous: false, @@ -176,1578 +132,4 @@ export default [ name: 'NodeCreated', type: 'event', }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint64', - name: 'nodeNum', - type: 'uint64', - }, - ], - name: 'NodeRejected', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'Paused', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint64', - name: 'challengeIndex', - type: 'uint64', - }, - { - indexed: false, - internalType: 'address', - name: 'asserter', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'challenger', - type: 'address', - }, - { - indexed: false, - internalType: 'uint64', - name: 'challengedNode', - type: 'uint64', - }, - ], - name: 'RollupChallengeStarted', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bytes32', - name: 'machineHash', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - ], - name: 'RollupInitialized', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'Unpaused', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'implementation', - type: 'address', - }, - ], - name: 'Upgraded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'implementation', - type: 'address', - }, - ], - name: 'UpgradedSecondary', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'initialBalance', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'finalBalance', - type: 'uint256', - }, - ], - name: 'UserStakeUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'initialBalance', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'finalBalance', - type: 'uint256', - }, - ], - name: 'UserWithdrawableFundsUpdated', - type: 'event', - }, - { - inputs: [], - name: 'VALIDATOR_AFK_BLOCKS', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: '_stakerMap', - outputs: [ - { - internalType: 'uint256', - name: 'amountStaked', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'index', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'latestStakedNode', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'currentChallenge', - type: 'uint64', - }, - { - internalType: 'bool', - name: 'isStaked', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'stakerAddress', - type: 'address', - }, - ], - name: 'addToDeposit', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'amountStaked', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'baseStake', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'bridge', - outputs: [ - { - internalType: 'contract IBridge', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'chainId', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'challengeManager', - outputs: [ - { - internalType: 'contract IChallengeManager', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'challengeIndex', - type: 'uint256', - }, - { - internalType: 'address', - name: 'winningStaker', - type: 'address', - }, - { - internalType: 'address', - name: 'losingStaker', - type: 'address', - }, - ], - name: 'completeChallenge', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'blockHash', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 'sendRoot', - type: 'bytes32', - }, - ], - name: 'confirmNextNode', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'confirmPeriodBlocks', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint64', - name: 'nodeNum', - type: 'uint64', - }, - ], - name: 'countStakedZombies', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint64', - name: 'nodeNum', - type: 'uint64', - }, - ], - name: 'countZombiesStakedOnChildren', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address[2]', - name: 'stakers', - type: 'address[2]', - }, - { - internalType: 'uint64[2]', - name: 'nodeNums', - type: 'uint64[2]', - }, - { - internalType: 'enum MachineStatus[2]', - name: 'machineStatuses', - type: 'uint8[2]', - }, - { - components: [ - { - internalType: 'bytes32[2]', - name: 'bytes32Vals', - type: 'bytes32[2]', - }, - { - internalType: 'uint64[2]', - name: 'u64Vals', - type: 'uint64[2]', - }, - ], - internalType: 'struct GlobalState[2]', - name: 'globalStates', - type: 'tuple[2]', - }, - { - internalType: 'uint64', - name: 'numBlocks', - type: 'uint64', - }, - { - internalType: 'bytes32', - name: 'secondExecutionHash', - type: 'bytes32', - }, - { - internalType: 'uint256[2]', - name: 'proposedTimes', - type: 'uint256[2]', - }, - { - internalType: 'bytes32[2]', - name: 'wasmModuleRoots', - type: 'bytes32[2]', - }, - ], - name: 'createChallenge', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'currentChallenge', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'currentRequiredStake', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'extraChallengeTimeBlocks', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'firstUnresolvedNode', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - components: [ - { - components: [ - { - internalType: 'bytes32[2]', - name: 'bytes32Vals', - type: 'bytes32[2]', - }, - { - internalType: 'uint64[2]', - name: 'u64Vals', - type: 'uint64[2]', - }, - ], - internalType: 'struct GlobalState', - name: 'globalState', - type: 'tuple', - }, - { - internalType: 'enum MachineStatus', - name: 'machineStatus', - type: 'uint8', - }, - ], - internalType: 'struct RollupLib.ExecutionState', - name: 'beforeState', - type: 'tuple', - }, - { - components: [ - { - components: [ - { - internalType: 'bytes32[2]', - name: 'bytes32Vals', - type: 'bytes32[2]', - }, - { - internalType: 'uint64[2]', - name: 'u64Vals', - type: 'uint64[2]', - }, - ], - internalType: 'struct GlobalState', - name: 'globalState', - type: 'tuple', - }, - { - internalType: 'enum MachineStatus', - name: 'machineStatus', - type: 'uint8', - }, - ], - internalType: 'struct RollupLib.ExecutionState', - name: 'afterState', - type: 'tuple', - }, - { - internalType: 'uint64', - name: 'numBlocks', - type: 'uint64', - }, - ], - internalType: 'struct RollupLib.Assertion', - name: 'assertion', - type: 'tuple', - }, - ], - name: 'getL2BlockHash', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint64', - name: 'nodeNum', - type: 'uint64', - }, - ], - name: 'getNode', - outputs: [ - { - components: [ - { - internalType: 'bytes32', - name: 'stateHash', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 'challengeHash', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 'confirmData', - type: 'bytes32', - }, - { - internalType: 'uint64', - name: 'prevNum', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'deadlineBlock', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'noChildConfirmedBeforeBlock', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'stakerCount', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'childStakerCount', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'firstChildBlock', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'latestChildNumber', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'createdAtBlock', - type: 'uint64', - }, - { - internalType: 'bytes32', - name: 'nodeHash', - type: 'bytes32', - }, - ], - internalType: 'struct Node', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'getStaker', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'amountStaked', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'index', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'latestStakedNode', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'currentChallenge', - type: 'uint64', - }, - { - internalType: 'bool', - name: 'isStaked', - type: 'bool', - }, - ], - internalType: 'struct IRollupCore.Staker', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint64', - name: 'stakerNum', - type: 'uint64', - }, - ], - name: 'getStakerAddress', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'inbox', - outputs: [ - { - internalType: 'contract IInbox', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_stakeToken', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'isERC20Enabled', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'isStaked', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'isStakedOnLatestConfirmed', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'isValidator', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'isZombie', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'lastStakeBlock', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'latestConfirmed', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'latestNodeCreated', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'latestStakedNode', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'loserStakeEscrow', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'minimumAssertionPeriod', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint64', - name: 'nodeNum', - type: 'uint64', - }, - { - internalType: 'bytes32', - name: 'nodeHash', - type: 'bytes32', - }, - ], - name: 'newStakeOnExistingNode', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - components: [ - { - components: [ - { - internalType: 'bytes32[2]', - name: 'bytes32Vals', - type: 'bytes32[2]', - }, - { - internalType: 'uint64[2]', - name: 'u64Vals', - type: 'uint64[2]', - }, - ], - internalType: 'struct GlobalState', - name: 'globalState', - type: 'tuple', - }, - { - internalType: 'enum MachineStatus', - name: 'machineStatus', - type: 'uint8', - }, - ], - internalType: 'struct RollupLib.ExecutionState', - name: 'beforeState', - type: 'tuple', - }, - { - components: [ - { - components: [ - { - internalType: 'bytes32[2]', - name: 'bytes32Vals', - type: 'bytes32[2]', - }, - { - internalType: 'uint64[2]', - name: 'u64Vals', - type: 'uint64[2]', - }, - ], - internalType: 'struct GlobalState', - name: 'globalState', - type: 'tuple', - }, - { - internalType: 'enum MachineStatus', - name: 'machineStatus', - type: 'uint8', - }, - ], - internalType: 'struct RollupLib.ExecutionState', - name: 'afterState', - type: 'tuple', - }, - { - internalType: 'uint64', - name: 'numBlocks', - type: 'uint64', - }, - ], - internalType: 'struct RollupLib.Assertion', - name: 'assertion', - type: 'tuple', - }, - { - internalType: 'bytes32', - name: 'expectedNodeHash', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'prevNodeInboxMaxCount', - type: 'uint256', - }, - ], - name: 'newStakeOnNewNode', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint64', - name: 'nodeNum', - type: 'uint64', - }, - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'nodeHasStaker', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'outbox', - outputs: [ - { - internalType: 'contract IOutbox', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'paused', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'proxiableUUID', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'target', - type: 'uint256', - }, - ], - name: 'reduceDeposit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'stakerAddress', - type: 'address', - }, - ], - name: 'rejectNextNode', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'startIndex', - type: 'uint256', - }, - ], - name: 'removeOldZombies', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'removeWhitelistAfterFork', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'removeWhitelistAfterValidatorAfk', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'zombieNum', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxNodes', - type: 'uint256', - }, - ], - name: 'removeZombie', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'nodeNum', - type: 'uint256', - }, - ], - name: 'requireUnresolved', - outputs: [], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'requireUnresolvedExists', - outputs: [], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'blockNumber', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'firstUnresolvedNodeNum', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'latestCreatedNode', - type: 'uint64', - }, - ], - name: 'requiredStake', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'stakerAddress', - type: 'address', - }, - ], - name: 'returnOldDeposit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rollupDeploymentBlock', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rollupEventInbox', - outputs: [ - { - internalType: 'contract IRollupEventInbox', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'sequencerInbox', - outputs: [ - { - internalType: 'contract ISequencerInbox', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint64', - name: 'nodeNum', - type: 'uint64', - }, - { - internalType: 'bytes32', - name: 'nodeHash', - type: 'bytes32', - }, - ], - name: 'stakeOnExistingNode', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - components: [ - { - components: [ - { - internalType: 'bytes32[2]', - name: 'bytes32Vals', - type: 'bytes32[2]', - }, - { - internalType: 'uint64[2]', - name: 'u64Vals', - type: 'uint64[2]', - }, - ], - internalType: 'struct GlobalState', - name: 'globalState', - type: 'tuple', - }, - { - internalType: 'enum MachineStatus', - name: 'machineStatus', - type: 'uint8', - }, - ], - internalType: 'struct RollupLib.ExecutionState', - name: 'beforeState', - type: 'tuple', - }, - { - components: [ - { - components: [ - { - internalType: 'bytes32[2]', - name: 'bytes32Vals', - type: 'bytes32[2]', - }, - { - internalType: 'uint64[2]', - name: 'u64Vals', - type: 'uint64[2]', - }, - ], - internalType: 'struct GlobalState', - name: 'globalState', - type: 'tuple', - }, - { - internalType: 'enum MachineStatus', - name: 'machineStatus', - type: 'uint8', - }, - ], - internalType: 'struct RollupLib.ExecutionState', - name: 'afterState', - type: 'tuple', - }, - { - internalType: 'uint64', - name: 'numBlocks', - type: 'uint64', - }, - ], - internalType: 'struct RollupLib.Assertion', - name: 'assertion', - type: 'tuple', - }, - { - internalType: 'bytes32', - name: 'expectedNodeHash', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'prevNodeInboxMaxCount', - type: 'uint256', - }, - ], - name: 'stakeOnNewNode', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'stakeToken', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'stakerCount', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalWithdrawableFunds', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'validatorUtils', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'validatorWalletCreator', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'validatorWhitelistDisabled', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'wasmModuleRoot', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'withdrawStakerFunds', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'withdrawableFunds', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'zombieNum', - type: 'uint256', - }, - ], - name: 'zombieAddress', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'zombieCount', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'zombieNum', - type: 'uint256', - }, - ], - name: 'zombieLatestStakedNode', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, -]; +] as const; diff --git a/arb-gateway/src/blockCache/IBlockCache.ts b/arb-gateway/src/blockCache/IBlockCache.ts index 66fc6732..b277e31b 100644 --- a/arb-gateway/src/blockCache/IBlockCache.ts +++ b/arb-gateway/src/blockCache/IBlockCache.ts @@ -1,3 +1,5 @@ +import type { Block, Hex } from 'viem'; + /** * Interface for a block cache. */ @@ -9,8 +11,8 @@ export interface IBlockCache { */ getBlock(nodeIndex: bigint): Promise<{ nodeIndex: bigint; - block: Record; - sendRoot: string; + block: Block; + sendRoot: Hex; } | null>; /** @@ -20,9 +22,9 @@ export interface IBlockCache { * @param sendRoot The send root associated with the block. * @returns A promise that resolves when the block is successfully set in the cache. */ - setBlock( - nodeIndex: bigint, - block: Record, - sendRoot: string - ): Promise; + setBlock(params: { + nodeIndex: bigint; + block: Block; + sendRoot: Hex; + }): Promise; } diff --git a/arb-gateway/src/blockCache/InMemoryBlockCache.ts b/arb-gateway/src/blockCache/InMemoryBlockCache.ts index f95b966d..c1c6ff33 100644 --- a/arb-gateway/src/blockCache/InMemoryBlockCache.ts +++ b/arb-gateway/src/blockCache/InMemoryBlockCache.ts @@ -1,24 +1,25 @@ +import type { Block, Hex } from 'viem'; import type { IBlockCache } from './IBlockCache.js'; //Dummy in memory cache for storing block data. Replace with something more sophisticated like redis in the future export class InMemoryBlockCache implements IBlockCache { - private block: Record; + private block: Block | null; private nodeIndex: bigint; - private sendRoot: string; + private sendRoot: Hex; constructor() { - this.block = {}; + this.block = null; this.nodeIndex = 0n; - this.sendRoot = ''; + this.sendRoot = '0x'; } public async getBlock(nodeIndex: bigint): Promise<{ nodeIndex: bigint; - block: Record; - sendRoot: string; + block: Block; + sendRoot: Hex; } | null> { //Cache miss - if (nodeIndex !== this.nodeIndex) { + if (nodeIndex !== this.nodeIndex || this.block === null) { console.log('Cache miss for nodeIndex: ', nodeIndex); return null; } @@ -30,11 +31,15 @@ export class InMemoryBlockCache implements IBlockCache { }; } - public async setBlock( - nodeIndex: bigint, - block: Record, - sendRoot: string - ) { + public async setBlock({ + nodeIndex, + block, + sendRoot, + }: { + nodeIndex: bigint; + block: Block; + sendRoot: Hex; + }) { console.log('Setting new block for nodeIndex: ', nodeIndex); this.nodeIndex = nodeIndex; diff --git a/arb-gateway/src/index.ts b/arb-gateway/src/index.ts index 87ee7ef0..32ea6762 100644 --- a/arb-gateway/src/index.ts +++ b/arb-gateway/src/index.ts @@ -1,25 +1,31 @@ import { EVMGateway } from '@ensdomains/evm-gateway'; -import { JsonRpcProvider } from 'ethers'; +import { createClient, http, type Address } from 'viem'; + import { ArbProofService, type ArbProvableBlock } from './ArbProofService.js'; import { InMemoryBlockCache } from './blockCache/InMemoryBlockCache.js'; export type ArbGateway = EVMGateway; -export async function makeArbGateway( - l1providerUrl: string, - l2providerUrl: string, - l2RollupAddress: string -): Promise { - const l1Provider = new JsonRpcProvider(l1providerUrl); - const l2Provider = new JsonRpcProvider(l2providerUrl); - return new EVMGateway( - new ArbProofService( - l1Provider, - l2Provider, - l2RollupAddress, - new InMemoryBlockCache() - ) - ); +export async function createArbGateway({ + l1ProviderUrl, + l2ProviderUrl, + l2RollupAddress, +}: { + l1ProviderUrl: string; + l2ProviderUrl: string; + l2RollupAddress: Address; +}) { + const l1Client = createClient({ transport: http(l1ProviderUrl) }); + const l2Client = createClient({ transport: http(l2ProviderUrl) }); + + const proofService = new ArbProofService({ + l1Client, + l2Client, + l2RollupAddress, + cache: new InMemoryBlockCache(), + }); + + return new EVMGateway(proofService); } export { ArbProofService, type ArbProvableBlock }; diff --git a/arb-gateway/src/server.ts b/arb-gateway/src/server.ts index 6f6ae898..0827f95e 100644 --- a/arb-gateway/src/server.ts +++ b/arb-gateway/src/server.ts @@ -1,7 +1,8 @@ -import { Server } from '@chainlink/ccip-read-server'; import { Command } from '@commander-js/extra-typings'; +import { CcipReadRouter } from '@ensdomains/ccip-read-router'; import { EVMGateway } from '@ensdomains/evm-gateway'; -import { JsonRpcProvider } from 'ethers'; +import { createClient, http, isAddress } from 'viem'; + import { ArbProofService } from './ArbProofService.js'; import { InMemoryBlockCache } from './blockCache/InMemoryBlockCache.js'; @@ -25,28 +26,24 @@ const program = new Command() program.parse(); -(async () => { - const options = program.opts(); +const { l1ProviderUrl, l2ProviderUrl, l2RollupAddress, port } = program.opts(); +if (!isAddress(l2RollupAddress)) + throw new Error('Invalid address format for L2 rollup'); - const l1Provider = new JsonRpcProvider(options.l1ProviderUrl); - const l2Provider = new JsonRpcProvider(options.l2ProviderUrl); +const l1Client = createClient({ transport: http(l1ProviderUrl) }); +const l2Client = createClient({ transport: http(l2ProviderUrl) }); - const gateway = new EVMGateway( - new ArbProofService( - l1Provider, - l2Provider, - options.l2RollupAddress, - new InMemoryBlockCache() - ) - ); - const server = new Server(); - gateway.add(server); - const app = server.makeApp('/'); +const proofService = new ArbProofService({ + l1Client, + l2Client, + l2RollupAddress, + cache: new InMemoryBlockCache(), +}); - const port = parseInt(options.port); - if (String(port) !== options.port) throw new Error('Invalid port'); +const gateway = new EVMGateway(proofService); +const router = CcipReadRouter({ + port, +}); +gateway.add(router); - app.listen(port, function () { - console.log(`Listening on ${port}`); - }); -})(); +export default router; diff --git a/arb-gateway/src/worker.ts b/arb-gateway/src/worker.ts index 5c1fb73b..29af9fc6 100644 --- a/arb-gateway/src/worker.ts +++ b/arb-gateway/src/worker.ts @@ -1,18 +1,20 @@ import { Request as CFWRequest } from '@cloudflare/workers-types'; -import { Server } from '@ensdomains/ccip-read-cf-worker'; -import { propsDecoder, type Router } from '@ensdomains/evm-gateway'; -import { InMemoryBlockCache } from './blockCache/InMemoryBlockCache.js'; +import { CcipReadRouter } from '@ensdomains/ccip-read-router'; +import { EVMGateway, propsDecoder } from '@ensdomains/evm-gateway'; import { Tracker } from '@ensdomains/server-analytics'; +import { createClient, http, type Address } from 'viem'; + +import { ArbProofService } from './ArbProofService.js'; +import { InMemoryBlockCache } from './blockCache/InMemoryBlockCache.js'; + interface Env { L1_PROVIDER_URL: string; L2_PROVIDER_URL: string; - L2_ROLLUP: string; + L2_ROLLUP: Address; GATEWAY_DOMAIN: string; ENDPOINT_URL: string; } -let app: Router; - 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 { @@ -27,36 +29,24 @@ async function fetch(request: CFWRequest, env: Env) { 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 ArbProofService = (await import('./ArbProofService.js')) - .ArbProofService; + const l1Client = createClient({ transport: http(L1_PROVIDER_URL) }); + const l2Client = createClient({ transport: http(L2_PROVIDER_URL) }); - const l1Provider = new ethers.JsonRpcProvider(L1_PROVIDER_URL); - const l2Provider = new ethers.JsonRpcProvider(L2_PROVIDER_URL); - - const gateway = new EVMGateway( - new ArbProofService( - l1Provider, - l2Provider, - L2_ROLLUP, - new InMemoryBlockCache() - ) - ); + const proofService = new ArbProofService({ + l1Client, + l2Client, + l2RollupAddress: L2_ROLLUP, + cache: new InMemoryBlockCache(), + }); - const server = new Server(); - gateway.add(server); - app = server.makeApp('/'); - } + const gateway = new EVMGateway(proofService); + const router = CcipReadRouter(); + gateway.add(router); const props = propsDecoder(request); await tracker.trackEvent(request, 'request', { props }, true); - return app - .handle(request) + return router + .fetch(request) .then(tracker.logResult.bind(tracker, propsDecoder, request)); } diff --git a/arb-gateway/wrangler.toml b/arb-gateway/wrangler.toml index e7999351..b648b648 100644 --- a/arb-gateway/wrangler.toml +++ b/arb-gateway/wrangler.toml @@ -1,17 +1,13 @@ name = "arb-gateway-worker" account_id = "15dcc9085cb794bb4f29d3e8177ac880" main = "./src/worker.ts" -node_compat = true compatibility_date = "2024-01-25" [dev] -port = 8080 - -[build] -command = "bun run build" +port = 8089 [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 +GATEWAY_DOMAIN = "arb-sepolia-gateway-worker.ens-cf.workers.dev" diff --git a/arb-verifier/hardhat.config.ts b/arb-verifier/hardhat.config.ts index 3da3d073..bbba34b0 100644 --- a/arb-verifier/hardhat.config.ts +++ b/arb-verifier/hardhat.config.ts @@ -1,8 +1,7 @@ -import '@nomicfoundation/hardhat-toolbox'; +import '@nomicfoundation/hardhat-toolbox-viem'; import 'hardhat-deploy'; -import 'hardhat-deploy-ethers'; import { HardhatUserConfig } from 'hardhat/config'; -import 'ethers'; + const DEPLOYER_PRIVATE_KEY = process.env.DEPLOYER_PRIVATE_KEY || 'ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'; @@ -42,7 +41,7 @@ const config: HardhatUserConfig = { url: L1_PROVIDER_URL, accounts: [DEPLOYER_PRIVATE_KEY], deploy: ['deploy_l1/'], - chainId:11155111, + chainId: 11155111, companionNetworks: { l2: 'arbitrumSepolia', }, @@ -56,7 +55,7 @@ const config: HardhatUserConfig = { chainId: 421614, url: 'https://sepolia-rollup.arbitrum.io/rpc', accounts: [DEPLOYER_PRIVATE_KEY], - deploy: [ "deploy_l2/" ], + deploy: ['deploy_l2/'], }, }, etherscan: { @@ -76,13 +75,13 @@ const config: HardhatUserConfig = { }, }, { - network: "arbitrumSepolia", + network: 'arbitrumSepolia', chainId: 421614, urls: { - apiURL: "https://api-sepolia.arbiscan.io/api", - browserURL: "https://api-sepolia.arbiscan.io" - } - } + 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 1e045a13..b96156b9 100644 --- a/arb-verifier/package.json +++ b/arb-verifier/package.json @@ -14,6 +14,7 @@ "@nomicfoundation/hardhat-ethers": "^3.0.0", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomicfoundation/hardhat-toolbox": "^3.0.0", + "@nomicfoundation/hardhat-toolbox-viem": "^3.0.0", "@nomicfoundation/hardhat-verify": "^1.0.0", "@typechain/ethers-v6": "^0.4.0", "@typechain/hardhat": "^8.0.0", diff --git a/arb-verifier/test/testArbVerifier.ts b/arb-verifier/test/testArbVerifier.ts index aa304fc3..31375af0 100644 --- a/arb-verifier/test/testArbVerifier.ts +++ b/arb-verifier/test/testArbVerifier.ts @@ -1,191 +1,172 @@ -import { Server } from '@chainlink/ccip-read-server'; -import { makeArbGateway } from '@ensdomains/arb-gateway'; -import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider'; -import type { HardhatEthersHelpers } from '@nomicfoundation/hardhat-ethers/types'; import { expect } from 'chai'; +import hre from 'hardhat'; import { - AbiCoder, + ccipRequest, concat, - Contract, - FetchRequest, - Provider, - Signer, - ethers as ethersT -} from 'ethers'; -import express from 'express'; -import hre, { ethers } from 'hardhat'; -import { EthereumProvider } from 'hardhat/types'; -import request from 'supertest'; - -type ethersObj = typeof ethersT & - Omit & { - provider: Omit & { - _hardhatProvider: EthereumProvider; - }; + ContractFunctionExecutionError, + ContractFunctionRevertedError, + createClient, + custom, + encodeAbiParameters, + getContract, + type Address, + type Hex, +} from 'viem'; +import { estimateGas } from 'viem/actions'; + +const getDeployment = async () => { + const clientWithoutCcipRead = createClient({ + transport: await hre.viem + .getPublicClient() + .then((v) => custom(v, { retryCount: 0 })), + ccipRead: false, + }); + const targetDeployment = await hre.deployments.get('TestL1'); + const contract = await hre.viem.getContractAt( + 'TestL1', + targetDeployment.address as Address + ); + type Contract = typeof contract; + const ccipReadDisabledContract = getContract({ + abi: contract.abi, + address: contract.address, + client: clientWithoutCcipRead, + }); + const estimateCallbackGas = new Proxy( + ccipReadDisabledContract.read as unknown as { + [fn in keyof Contract['read']]: ( + ...args: Parameters + ) => Promise; + }, + { + get(target, prop) { + return async (...args: never[]) => { + const result = await target[prop as keyof typeof target]( + ...args + ).catch((e) => e); + if (!(result instanceof ContractFunctionExecutionError)) + throw new Error('Expected error'); + + if (!(result.cause instanceof ContractFunctionRevertedError)) + throw new Error('Expected error'); + + const revertData = result.cause.data; + // string name check good enough for now + if (revertData?.errorName !== 'OffchainLookup') + throw new Error('Expected error'); + + const [sender, urls, callData, callbackSelector, extraData] = + revertData.args as [Hex, string[], Hex, Hex, Hex]; + const ccipResult = await ccipRequest({ + data: callData, + sender, + urls, + }); + + const estimatedGas = await estimateGas(clientWithoutCcipRead, { + to: sender, + data: concat([ + callbackSelector, + encodeAbiParameters( + [{ type: 'bytes' }, { type: 'bytes' }], + [ccipResult, extraData] + ), + ]), + }); + + console.log(`Gas estimate ${estimatedGas}`); + + return estimatedGas; + }; + }, + } + ); + return { + ...contract, + estimateCallbackGas, }; - -declare module 'hardhat/types/runtime' { - const ethers: ethersObj; - interface HardhatRuntimeEnvironment { - ethers: ethersObj; - } -} -const estimateCCIPReadCallbackGas = async (provider, cb) => { - try{ - await cb() - }catch(e){ - const [sender, urls, data, callbackFunction, extraData ] = e.revert.args - const url = `http://localhost:8080/${sender}/${data}.json` - const responseData:any = await (await fetch(url)).json() - const encoder = new AbiCoder() - const encoded = encoder.encode([ "bytes", "bytes" ], [responseData.data, extraData]); - const newdata = concat([ callbackFunction, encoded ]) - const result2 = await provider.estimateGas({ - to: sender, - data:newdata - }); - console.log(`Gas estimate ${result2}`) - } -} +}; describe('ArbVerifier', () => { - let provider: Provider; - let signer: Signer; - let gateway: express.Application; - let target: Contract; - - before(async () => { - // Hack to get a 'real' ethers provider from hardhat. The default `HardhatProvider` - // doesn't support CCIP-read. - provider = new ethers.BrowserProvider(hre.network.provider); - signer = await provider.getSigner(0); - - //Rollup address according to sequencer config. Unfortunately, there is no endpoint to fetch it at runtime from the rollup. - //The address can be found at nitro-testnode-sequencer-1/config/deployment.json - 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.config.networks[hre.network.companionNetworks.l2] as any).url, - rollupAddress, - chainId, - ); - const server = new Server() - gateway.add(server) - const app = server.makeApp('/') - - - // Replace ethers' fetch function with one that calls the gateway directly. - 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 targetDeployment = await hre.deployments.get('TestL1'); - target = await ethers.getContractAt('TestL1', targetDeployment.address, signer); - }) - it('simple proofs for fixed values', async () => { - const result = await target.getLatest({ enableCcipRead: true }); - expect(Number(result)).to.equal(42); - await estimateCCIPReadCallbackGas(provider, ()=>{ - return target.getLatest({ enableCcipRead: false }); - }) + const target = await getDeployment(); + const result = await target.read.getLatest(); + expect(result).to.equal(42n); + + await target.estimateCallbackGas.getLatest(); }); it('simple proofs for dynamic values', async () => { - const result = await target.getName({ enableCcipRead: true }); + const target = await getDeployment(); + const result = await target.read.getName(); expect(result).to.equal('Satoshi'); - await estimateCCIPReadCallbackGas(provider, ()=>{ - return target.getName({ enableCcipRead: false }); - }) + + await target.estimateCallbackGas.getName(); }); it('nested proofs for dynamic values', async () => { - const result = await target.getHighscorer(42, { enableCcipRead: true }); + const target = await getDeployment(); + const result = await target.read.getHighscorer([42n]); expect(result).to.equal('Hal Finney'); - await estimateCCIPReadCallbackGas(provider, ()=>{ - return target.getHighscorer(42, { enableCcipRead: false }); - }) + + await target.estimateCallbackGas.getHighscorer([42n]); }); it('nested proofs for long dynamic values', async () => { - const result = await target.getHighscorer(1, { enableCcipRead: true }); + const target = await getDeployment(); + const result = await target.read.getHighscorer([1n]); expect(result).to.equal( 'Hubert Blaine Wolfeschlegelsteinhausenbergerdorff Sr.' ); - await estimateCCIPReadCallbackGas(provider, ()=>{ - return target.getHighscorer(1, { enableCcipRead: false }); - }) + + await target.estimateCallbackGas.getHighscorer([1n]); }); it('nested proofs with lookbehind', async () => { - const result = await target.getLatestHighscore({ enableCcipRead: true }); - expect(Number(result)).to.equal(12345); - await estimateCCIPReadCallbackGas(provider, ()=>{ - return target.getLatestHighscore({ enableCcipRead: false }); - }) + const target = await getDeployment(); + const result = await target.read.getLatestHighscore(); + expect(result).to.equal(12345n); + + await target.estimateCallbackGas.getLatestHighscore(); }); it('nested proofs with lookbehind for dynamic values', async () => { - const result = await target.getLatestHighscorer({ enableCcipRead: true }); + const target = await getDeployment(); + const result = await target.read.getLatestHighscorer(); expect(result).to.equal('Hal Finney'); - await estimateCCIPReadCallbackGas(provider, ()=>{ - return target.getLatestHighscorer({ enableCcipRead: false }); - }) + + await target.estimateCallbackGas.getLatestHighscorer(); }); it('mappings with variable-length keys', async () => { - const result = await target.getNickname('Money Skeleton', { - enableCcipRead: true, - }); + const target = await getDeployment(); + const result = await target.read.getNickname(['Money Skeleton']); expect(result).to.equal('Vitalik Buterin'); - await estimateCCIPReadCallbackGas(provider, ()=>{ - return target.getNickname('Money Skeleton', { - enableCcipRead: false, - }); - }) + + await target.estimateCallbackGas.getNickname(['Money Skeleton']); }); it('nested proofs of mappings with variable-length keys', async () => { - const result = await target.getPrimaryNickname({ enableCcipRead: true }); + const target = await getDeployment(); + const result = await target.read.getPrimaryNickname(); expect(result).to.equal('Hal Finney'); - await estimateCCIPReadCallbackGas(provider, ()=>{ - return target.getPrimaryNickname({ enableCcipRead: false }); - }) + + await target.estimateCallbackGas.getPrimaryNickname(); }); it('treats uninitialized storage elements as zeroes', async () => { - const result = await target.getZero({ enableCcipRead: true }); - expect(Number(result)).to.equal(0); - await estimateCCIPReadCallbackGas(provider, ()=>{ - return target.getZero({ enableCcipRead: false }); - }) + const target = await getDeployment(); + const result = await target.read.getZero(); + expect(result).to.equal(0n); + + await target.estimateCallbackGas.getZero(); }); it('treats uninitialized dynamic values as empty strings', async () => { - const result = await target.getNickname('Santa', { enableCcipRead: true }); - expect(result).to.equal(""); - await estimateCCIPReadCallbackGas(provider, ()=>{ - return target.getNickname('Santa', { enableCcipRead: false }); - }) - }) + const target = await getDeployment(); + const result = await target.read.getNickname(['Santa']); + expect(result).to.equal(''); + + await target.estimateCallbackGas.getNickname(['Santa']); + }); }); diff --git a/arb-verifier/tsconfig.json b/arb-verifier/tsconfig.json index 06d169db..9fa8dedb 100644 --- a/arb-verifier/tsconfig.json +++ b/arb-verifier/tsconfig.json @@ -1,6 +1,11 @@ { - //"extends": "../tsconfig.json", - "include": ["./scripts", "./test", "../arb-gateway/src/ArbProofService.ts"], + "extends": "../tsconfig.json", + "include": [ + "./scripts", + "./test", + "../arb-gateway/src/ArbProofService.ts", + "./artifacts" + ], "files": ["hardhat.config.ts"], "compilerOptions": { "esModuleInterop": true, diff --git a/bun.lockb b/bun.lockb index d2e2579f87ee39ee3a48230c67afdb84a8d2e575..a220d1c4d4d7ff75029e3d5d4e4d6a2d9ecaf96a 100755 GIT binary patch delta 135539 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 Og;c(Fu?ARe<^KbP1X+my delta 109027 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 ITa?iKFD@4$EdT%j diff --git a/evm-gateway/package.json b/evm-gateway/package.json index 4ae0aa48..08672521 100644 --- a/evm-gateway/package.json +++ b/evm-gateway/package.json @@ -8,6 +8,7 @@ "@chainlink/ccip-read-server": "^0.2.1", "@cloudflare/workers-types": "^4.20240423.0", "@ensdomains/ccip-read-cf-worker": "^0.0.1", + "abitype": "^1.0.6", "ethers": "^6.7.1" }, "exports": { @@ -63,4 +64,4 @@ "type": "module", "types": "./_types/index.d.ts", "typings": "./_types/index.d.ts" -} \ No newline at end of file +} diff --git a/evm-gateway/src/EVMGateway.ts b/evm-gateway/src/EVMGateway.ts index e1093e79..9f60477d 100644 --- a/evm-gateway/src/EVMGateway.ts +++ b/evm-gateway/src/EVMGateway.ts @@ -1,15 +1,20 @@ -import type { HandlerDescription } from '@chainlink/ccip-read-server'; -import type { Fragment, Interface, JsonFragment } from '@ethersproject/abi'; import { - concat, - dataSlice, - getBytes, - solidityPackedKeccak256, - toBigInt, - zeroPadValue, -} from 'ethers'; + bytesToBigInt, + bytesToHex, + concatHex, + encodePacked, + hexToBigInt, + hexToBytes, + keccak256, + padHex, + sliceBytes, + sliceHex, + type Address, + type Hex, +} from 'viem'; import type { IProofService, ProvableBlock } from './IProofService.js'; +import type { GenericRouter } from './utils.js'; const OP_FOLLOW_CONST = 0 << 5; const OP_FOLLOW_REF = 1 << 5; @@ -29,17 +34,10 @@ export enum StorageLayout { interface StorageElement { slots: bigint[]; - value: () => Promise; + value: () => Promise; isDynamic: boolean; } -interface Server { - add: ( - abi: string | readonly (string | Fragment | JsonFragment)[] | Interface, - handlers: HandlerDescription[] - ) => void; -} - function memoize(fn: () => Promise): () => Promise { let promise: Promise | undefined; return () => { @@ -52,24 +50,19 @@ function memoize(fn: () => Promise): () => Promise { // traverse mapping at slot using key solidity-style // https://docs.soliditylang.org/en/latest/internals/layout_in_storage.html#mappings-and-dynamic-arrays -function followSolidityMapping(slot: bigint, key: string) { - return BigInt(solidityPackedKeccak256(['bytes', 'uint256'], [key, slot])); +function followSolidityMapping(slot: bigint, key: Hex) { + return BigInt(keccak256(encodePacked(['bytes', 'uint256'], [key, slot]))); } -// see: EVMProofHelper.uint256FromBytes() -function uint256FromBytes(hex: string): bigint { - return hex === '0x' ? 0n : BigInt(hex.slice(0, 66)); -} +export class EVMGateway { + readonly proofService: IProofService; -export class EVMGateway { - readonly proofService: IProofService; - - constructor(proofService: IProofService) { + constructor(proofService: IProofService) { this.proofService = proofService; } - add(server: Server) { - const abi = [ + add(router: router): void { + router.add({ /** * This function implements a simple VM for fetching proofs for EVM contract storage data. * Programs consist of an array of `commands` and an array of `constants`. Each `command` is a @@ -104,25 +97,22 @@ export class EVMGateway { * The final result of this hashing operation is used as the base slot number for the storage * lookup. This mirrors Solidity's recursive hashing operation for determining storage slot locations. */ - 'function getStorageSlots(address addr, bytes32[] memory commands, bytes[] memory constants) external view returns(bytes memory witness)', - ]; - server.add(abi, [ - { - type: 'getStorageSlots', - func: async (args) => { - try { - const [addr, commands, constants] = args; - const proofs = await this.createProofs(addr, commands, constants); - return [proofs]; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (e: any) { - console.log(e.stack); - throw e; - } - }, + type: 'function getStorageSlots(address addr, bytes32[] memory commands, bytes[] memory constants) external view returns(bytes memory witness)', + handle: async ([addr, commands, constants]) => { + try { + const proofs = await this.createProofs({ + address: addr, + commands, + constants, + }); + return [proofs]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (e: any) { + console.log(e.stack); + throw e; + } }, - ]); - return server; + }); } /** @@ -131,23 +121,27 @@ export class EVMGateway { * @param paths Each element of this array specifies a Solidity-style path derivation for a storage slot ID. * See README.md for details of the encoding. */ - async createProofs( - address: string, - commands: string[], - constants: string[] - ): Promise { + async createProofs({ + address, + commands, + constants, + }: { + address: Address; + commands: readonly Hex[]; + constants: readonly Hex[]; + }): Promise { const block = await this.proofService.getProvableBlock(); const requests: Promise[] = []; // For each request, spawn a promise to compute the set of slots required for (let i = 0; i < commands.length; i++) { requests.push( - this.getValueFromPath( + this.getValueFromPath({ block, address, - commands[i], + command: commands[i], constants, - requests.slice() - ) + requests: requests.slice(), + }) ); } // Resolve all the outstanding requests @@ -155,15 +149,19 @@ export class EVMGateway { const slots = Array.prototype.concat( ...results.map((result) => result.slots) ); - return this.proofService.getProofs(block, address, slots); + return this.proofService.getProofs({ block, address, slots }); } - private async computeFirstSlot( - command: string, - constants: string[], - requests: Promise[] - ): Promise<{ slot: bigint; isDynamic: boolean }> { - const commandWord = getBytes(command); + private async computeFirstSlot({ + command, + constants, + requests, + }: { + command: Hex; + constants: readonly Hex[]; + requests: Promise[]; + }): Promise<{ slot: bigint; isDynamic: boolean }> { + const commandWord = hexToBytes(command); const flags = commandWord[0]; const isDynamic = (flags & 0x01) != 0; let slot = 0n; @@ -183,7 +181,7 @@ export class EVMGateway { break; } case OP_ADD_CONST: { - slot += uint256FromBytes(constants[operand]); + slot += hexToBigInt(constants[operand]); break; } default: @@ -193,19 +191,26 @@ export class EVMGateway { return { slot, isDynamic }; } - private async getDynamicValue( - block: T, - address: string, - slot: bigint - ): Promise { - const firstValue = getBytes( - await this.proofService.getStorageAt(block, address, slot) - ); + private async getDynamicValue({ + block, + address, + slot, + }: { + block: provableBlock; + address: Address; + slot: bigint; + }): Promise { + const firstValue = await this.proofService + .getStorageAt({ block, address, slot }) + .then((v) => hexToBytes(v)); + // Decode Solidity dynamic value encoding if (firstValue[31] & 0x01) { // Long value: first slot is `length * 2 + 1`, following slots are data. - const len = (Number(toBigInt(firstValue)) - 1) / 2; - const hashedSlot = toBigInt(solidityPackedKeccak256(['uint256'], [slot])); + const len = (Number(bytesToBigInt(firstValue)) - 1) / 2; + const hashedSlot = hexToBigInt( + keccak256(encodePacked(['uint256'], [slot])) + ); const slotNumbers = Array(Math.ceil(len / 32)) .fill(BigInt(hashedSlot)) .map((i, idx) => i + BigInt(idx)); @@ -215,10 +220,10 @@ export class EVMGateway { value: memoize(async () => { const values = await Promise.all( slotNumbers.map((slot) => - this.proofService.getStorageAt(block, address, slot) + this.proofService.getStorageAt({ block, address, slot }) ) ); - return dataSlice(concat(values), 0, len); + return sliceHex(concatHex(values), 0, len); }), }; } else { @@ -227,37 +232,44 @@ export class EVMGateway { return { slots: [slot], isDynamic: true, - value: () => Promise.resolve(dataSlice(firstValue, 0, len)), + value: () => + Promise.resolve(bytesToHex(sliceBytes(firstValue, 0, len))), }; } } - private async getValueFromPath( - block: T, - address: string, - command: string, - constants: string[], - requests: Promise[] - ): Promise { - const { slot, isDynamic } = await this.computeFirstSlot( + private async getValueFromPath({ + block, + address, + command, + constants, + requests, + }: { + block: provableBlock; + address: Address; + command: Hex; + constants: readonly Hex[]; + requests: Promise[]; + }): Promise { + const { slot, isDynamic } = await this.computeFirstSlot({ command, constants, - requests - ); + requests, + }); if (!isDynamic) { return { slots: [slot], isDynamic, value: memoize(async () => - zeroPadValue( - await this.proofService.getStorageAt(block, address, slot), - 32 + padHex( + await this.proofService.getStorageAt({ block, address, slot }), + { size: 32 } ) ), }; } else { - return this.getDynamicValue(block, address, slot); + return this.getDynamicValue({ block, address, slot }); } } } diff --git a/evm-gateway/src/EVMProofHelper.ts b/evm-gateway/src/EVMProofHelper.ts index d4395163..4514a505 100644 --- a/evm-gateway/src/EVMProofHelper.ts +++ b/evm-gateway/src/EVMProofHelper.ts @@ -1,25 +1,10 @@ -import { toBeHex, type AddressLike, type JsonRpcProvider } from 'ethers'; - -/** - * Response of the eth_getProof RPC method. - */ -interface EthGetProofResponse { - accountProof: string; - balance: string; - codeHash: string; - nonce: string; - storageHash: string; - storageProof: { - key: string; - value: string; - proof: string; - }[]; -} +import { toHex, type Address, type Client, type Hex } from 'viem'; +import { getProof, getStorageAt } from 'viem/actions'; export interface StateProof { - stateTrieWitness: string; - storageProofs: string[]; - stateRoot: string; + stateTrieWitness: Hex[]; + storageProofs: Hex[][]; + stateRoot: Hex; } /** @@ -28,10 +13,10 @@ export interface StateProof { * */ export class EVMProofHelper { - private readonly provider: JsonRpcProvider; + private readonly client: Client; - constructor(provider: JsonRpcProvider) { - this.provider = provider; + constructor(client: Client) { + this.client = client; } /** @@ -41,12 +26,20 @@ export class EVMProofHelper { * @param slot The slot to fetch. * @returns The value in `slot` of `address` at block `block` */ - getStorageAt( - blockNo: number, - address: AddressLike, - slot: bigint - ): Promise { - return this.provider.getStorage(address, slot, blockNo); + async getStorageAt({ + blockNumber, + address, + slot, + }: { + blockNumber: number; + address: Address; + slot: bigint; + }): Promise { + return getStorageAt(this.client, { + address, + blockNumber: BigInt(blockNumber), + slot: toHex(slot), + }).then((v) => v ?? '0x'); } /** @@ -57,20 +50,20 @@ export class EVMProofHelper { * @returns A proof of the given slots, encoded in a manner that this service's * corresponding decoding library will understand. */ - async getProofs( - blockNo: number, - address: AddressLike, - slots: bigint[] - ): Promise { - const args = [ + async getProofs({ + blockNumber, + address, + slots, + }: { + blockNumber: number; + address: Address; + slots: bigint[]; + }): Promise { + const proofs = await getProof(this.client, { address, - slots.map((slot) => toBeHex(slot, 32)), - '0x' + blockNo.toString(16), - ]; - const proofs: EthGetProofResponse = await this.provider.send( - 'eth_getProof', - args - ); + blockNumber: BigInt(blockNumber), + storageKeys: slots.map((s) => toHex(s, { size: 32 })), + }); return { stateTrieWitness: proofs.accountProof, storageProofs: proofs.storageProof.map((proof) => proof.proof), diff --git a/evm-gateway/src/IProofService.ts b/evm-gateway/src/IProofService.ts index 8344eaf4..31741eb2 100644 --- a/evm-gateway/src/IProofService.ts +++ b/evm-gateway/src/IProofService.ts @@ -1,12 +1,12 @@ -import type { AddressLike } from 'ethers'; +import type { Address, Hex } from 'viem'; export interface ProvableBlock {} -export interface IProofService { +export interface IProofService { /** * @dev Returns an object representing a block whose state can be proven on L1. */ - getProvableBlock(): Promise; + getProvableBlock(): Promise; /** * @dev Returns the value of a contract state slot at the specified block @@ -15,7 +15,15 @@ export interface IProofService { * @param slot The slot to fetch. * @returns The value in `slot` of `address` at block `block` */ - getStorageAt(block: T, address: AddressLike, slot: bigint): Promise; + getStorageAt({ + block, + address, + slot, + }: { + block: provableBlock; + address: Address; + slot: bigint; + }): Promise; /** * @dev Fetches a set of proofs for the requested state slots. @@ -25,5 +33,13 @@ export interface IProofService { * @returns A proof of the given slots, encoded in a manner that this service's * corresponding decoding library will understand. */ - getProofs(block: T, address: AddressLike, slots: bigint[]): Promise; + getProofs({ + block, + address, + slots, + }: { + block: provableBlock; + address: Address; + slots: bigint[]; + }): Promise; } diff --git a/evm-gateway/src/utils.ts b/evm-gateway/src/utils.ts index 79c2315d..ca57f484 100644 --- a/evm-gateway/src/utils.ts +++ b/evm-gateway/src/utils.ts @@ -1,14 +1,46 @@ import { type Request as CFWRequest } from '@cloudflare/workers-types'; import { type PropsDecoder } from '@ensdomains/server-analytics'; -import { AbiCoder } from 'ethers'; +import { + encodeAbiParameters, + parseAbiParameter, + type AbiFunction, + type Address, + type Hex, + type ParseAbiItem, +} from 'viem'; + +import type { AbiParametersToPrimitiveTypes } from 'abitype'; import { type StateProof } from './EVMProofHelper.js'; + export interface Router { handle: (request: CFWRequest) => Promise; } -export const propsDecoder: PropsDecoder = ( - request?: CFWRequest -) => { +type ParseAbiFunction = + ParseAbiItem extends AbiFunction ? ParseAbiItem : never; + +type AddAbiHandlerParameters = { + type: signature; + handle: AbiFunctionHandler>; +}; + +type RpcRequest = { + to: Address; + data: Hex; +}; +export type AbiFunctionHandler = ( + args: AbiParametersToPrimitiveTypes, + req: RpcRequest +) => + | Promise> + | AbiParametersToPrimitiveTypes; +export type GenericRouter = { + add: ( + params: AddAbiHandlerParameters + ) => void; +}; + +export const propsDecoder: PropsDecoder = (request) => { if (!request || !request.url) { return {}; } @@ -25,8 +57,8 @@ export const propsDecoder: PropsDecoder = ( } }; -const flatten = (data: string) => { - return AbiCoder.defaultAbiCoder().encode(['bytes[]'], [data]); +const flatten = (data: Hex[]) => { + return encodeAbiParameters([parseAbiParameter('bytes[]')], [data]); }; export const convertIntoMerkleTrieProof = (proof: StateProof) => { diff --git a/package.json b/package.json index 78309488..ed6733a0 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "eslint-plugin-prettier": "^5.0.0", "husky": "^6.0.0", "prettier": "^3.0.3", - "typescript": "^5.2.2" + "typescript": "^5.5.4" }, "dependencies": { "@ensdomains/ccip-read-cf-worker": "^0.0.3", From a4740e388eef66c8f58991b616ce7a93afb8a6a9 Mon Sep 17 00:00:00 2001 From: tate Date: Thu, 22 Aug 2024 18:35:06 +1000 Subject: [PATCH 2/2] yep yep yep yep --- arb-gateway/src/server.ts | 2 +- bun.lockb | Bin 649088 -> 616968 bytes evm-gateway/src/utils.ts | 6 +- l1-gateway/package.json | 4 +- l1-gateway/src/L1ProofService.ts | 130 +++++++++----- l1-gateway/src/index.ts | 10 +- l1-gateway/src/server.ts | 26 ++- l1-gateway/src/worker.ts | 35 ++-- .../{hardhat.config.ts => hardhat.config.cts} | 4 +- l1-verifier/package.json | 28 +-- l1-verifier/scripts/test.js | 92 +++++----- l1-verifier/test/testL1Verifier.ts | 159 +++++++----------- l1-verifier/tsconfig.json | 16 +- 13 files changed, 260 insertions(+), 252 deletions(-) rename l1-verifier/{hardhat.config.ts => hardhat.config.cts} (79%) diff --git a/arb-gateway/src/server.ts b/arb-gateway/src/server.ts index 0827f95e..104dde5c 100644 --- a/arb-gateway/src/server.ts +++ b/arb-gateway/src/server.ts @@ -39,8 +39,8 @@ const proofService = new ArbProofService({ l2RollupAddress, cache: new InMemoryBlockCache(), }); - const gateway = new EVMGateway(proofService); + const router = CcipReadRouter({ port, }); diff --git a/bun.lockb b/bun.lockb index a220d1c4d4d7ff75029e3d5d4e4d6a2d9ecaf96a..ead956b63878c776895e1b7e9e9e4c8436bf9884 100755 GIT binary patch delta 156870 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 aD>-)`(%qhsAa1M$F|Af?gwGG@Xyy+Y92VsO delta 176845 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 Promise; diff --git a/l1-gateway/package.json b/l1-gateway/package.json index 30fdb82d..0f6457fd 100644 --- a/l1-gateway/package.json +++ b/l1-gateway/package.json @@ -3,6 +3,7 @@ "version": "0.1.0-beta.4", "author": "Nick Johnson", "license": "MIT", + "type": "module", "repository": { "type": "git", "url": "https://github.com/ensdomains/evmgateway.git" @@ -65,10 +66,11 @@ "dependencies": { "@chainlink/ccip-read-server": "^0.2.1", "@commander-js/extra-typings": "^11.0.0", + "@ensdomains/ccip-read-router": "^0.0.5", "@ensdomains/evm-gateway": "0.1.0-beta.4", "@ethereumjs/block": "^5.0.0", "@nomicfoundation/ethereumjs-block": "^5.0.2", "commander": "^11.0.0", "ethers": "^6.7.1" } -} \ No newline at end of file +} diff --git a/l1-gateway/src/L1ProofService.ts b/l1-gateway/src/L1ProofService.ts index 639aa09b..0855bcf5 100644 --- a/l1-gateway/src/L1ProofService.ts +++ b/l1-gateway/src/L1ProofService.ts @@ -1,43 +1,48 @@ -import { - AbiCoder, - encodeRlp as encodeRlp_, - type AddressLike, - type JsonRpcProvider, -} from 'ethers'; - import { EVMProofHelper, convertIntoMerkleTrieProof, type IProofService, } from '@ensdomains/evm-gateway'; -import { Block, type JsonRpcBlock } from '@ethereumjs/block'; -type RlpObject = Uint8Array | Array; -const encodeRlp = encodeRlp_ as (object: RlpObject) => string; +import { + encodeAbiParameters, + parseAbiParameters, + toRlp, + type Address, + type Client, + type Hex, +} from 'viem'; +import { getBlock } from 'viem/actions'; export type L1ProvableBlock = number; +const toIdkHex = (val: bigint): Hex => { + if (val === 0n) return '0x'; + const hexxed = val.toString(16); + return `0x${hexxed.length % 2 === 0 ? hexxed : `0${hexxed}`}`; +}; + /** * The proofService class can be used to calculate proofs for a given target and slot on the Optimism Bedrock network. * It's also capable of proofing long types such as mappings or string by using all included slots in the proof. * */ export class L1ProofService implements IProofService { - private readonly provider: JsonRpcProvider; + private readonly client: Client; private readonly helper: EVMProofHelper; - constructor(provider: JsonRpcProvider) { - this.provider = provider; - this.helper = new EVMProofHelper(provider); + constructor(client: Client) { + this.client = client; + this.helper = new EVMProofHelper(client); } /** * @dev Returns an object representing a block whose state can be proven on L1. */ - async getProvableBlock(): Promise { - const block = await this.provider.getBlock('latest'); + async getProvableBlock(): Promise { + const block = await getBlock(this.client, { blockTag: 'latest' }); if (!block) throw new Error('No block found'); - return block.number - 1; + return Number(block.number) - 1; } /** @@ -47,12 +52,16 @@ export class L1ProofService implements IProofService { * @param slot The slot to fetch. * @returns The value in `slot` of `address` at block `block` */ - getStorageAt( - block: L1ProvableBlock, - address: AddressLike, - slot: bigint - ): Promise { - return this.helper.getStorageAt(block, address, slot); + getStorageAt({ + block, + address, + slot, + }: { + block: L1ProvableBlock; + address: Address; + slot: bigint; + }): Promise { + return this.helper.getStorageAt({ blockNumber: block, address, slot }); } /** @@ -63,24 +72,65 @@ export class L1ProofService implements IProofService { * @returns A proof of the given slots, encoded in a manner that this service's * corresponding decoding library will understand. */ - async getProofs( - blockNo: L1ProvableBlock, - address: AddressLike, - slots: bigint[] - ): Promise { - const proof = await this.helper.getProofs(blockNo, address, slots); - const rpcBlock: JsonRpcBlock = await this.provider.send( - 'eth_getBlockByNumber', - ['0x' + blockNo.toString(16), false] - ); - const block = Block.fromRPC(rpcBlock); - const blockHeader = encodeRlp(block.header.raw()); - return AbiCoder.defaultAbiCoder().encode( + async getProofs({ + block, + address, + slots, + }: { + block: L1ProvableBlock; + address: Address; + slots: bigint[]; + }): Promise { + const proof = await this.helper.getProofs({ + blockNumber: block, + address, + slots, + }); + const comparisonBlock = await getBlock(this.client, { + blockNumber: BigInt(block), + includeTransactions: false, + }); + + if (!comparisonBlock) throw new Error('Block not found'); + + const headerArray = [ + comparisonBlock.parentHash, + comparisonBlock.sha3Uncles, + comparisonBlock.miner, + comparisonBlock.stateRoot, + comparisonBlock.transactionsRoot, + comparisonBlock.receiptsRoot, + comparisonBlock.logsBloom!, + toIdkHex(comparisonBlock.difficulty), + toIdkHex(comparisonBlock.number!), + toIdkHex(comparisonBlock.gasLimit), + toIdkHex(comparisonBlock.gasUsed), // 10 + toIdkHex(comparisonBlock.timestamp), + comparisonBlock.extraData, + comparisonBlock.mixHash, + comparisonBlock.nonce!, + toIdkHex(comparisonBlock.baseFeePerGas!), // 15 + ...(comparisonBlock.withdrawalsRoot + ? [comparisonBlock.withdrawalsRoot] + : (['0x'] as const)), // anvil ??? + ...(typeof comparisonBlock.blobGasUsed === 'bigint' + ? [ + toIdkHex(comparisonBlock.blobGasUsed), + toIdkHex(comparisonBlock.excessBlobGas), + ] + : []), + ]; + + const blockHeader = toRlp(headerArray) as Hex; + return encodeAbiParameters( + parseAbiParameters([ + '(uint256 blockNumber, bytes blockHeader)', + '(bytes stateTrieWitness, bytes[] storageProofs)', + ]), [ - 'tuple(uint256 blockNo, bytes blockHeader)', - 'tuple(bytes stateTrieWitness, bytes[] storageProofs)', - ], - [{ blockNo, blockHeader }, convertIntoMerkleTrieProof(proof)] + { blockNumber: BigInt(block), blockHeader }, + convertIntoMerkleTrieProof(proof), + ] ); } } diff --git a/l1-gateway/src/index.ts b/l1-gateway/src/index.ts index 68e1c08c..7fb04eaa 100644 --- a/l1-gateway/src/index.ts +++ b/l1-gateway/src/index.ts @@ -1,11 +1,15 @@ import { EVMGateway } from '@ensdomains/evm-gateway'; -import { JsonRpcProvider } from 'ethers'; +import { createClient, http } from 'viem'; import { L1ProofService, type L1ProvableBlock } from './L1ProofService.js'; export type L1Gateway = EVMGateway; -export function makeL1Gateway(provider: JsonRpcProvider): L1Gateway { - return new EVMGateway(new L1ProofService(provider)); +export function createL1Gateway(providerUrl: string): L1Gateway { + const client = createClient({ transport: http(providerUrl) }); + + const proofService = new L1ProofService(client); + + return new EVMGateway(proofService); } export { L1ProofService, type L1ProvableBlock }; diff --git a/l1-gateway/src/server.ts b/l1-gateway/src/server.ts index 058bec29..caff51a6 100644 --- a/l1-gateway/src/server.ts +++ b/l1-gateway/src/server.ts @@ -1,7 +1,8 @@ -import { Server } from '@chainlink/ccip-read-server'; import { Command } from '@commander-js/extra-typings'; +import { CcipReadRouter } from '@ensdomains/ccip-read-router'; import { EVMGateway } from '@ensdomains/evm-gateway'; -import { ethers } from 'ethers'; +import { createClient, http } from 'viem'; + import { L1ProofService } from './L1ProofService.js'; const program = new Command() @@ -10,18 +11,13 @@ const program = new Command() program.parse(); -const options = program.opts(); -const provider = new ethers.JsonRpcProvider(options.providerUrl); -const gateway = new EVMGateway(new L1ProofService(provider)); -const server = new Server(); -gateway.add(server); -const app = server.makeApp('/'); +const { port, providerUrl } = program.opts(); + +const client = createClient({ transport: http(providerUrl) }); +const proofService = new L1ProofService(client); +const gateway = new EVMGateway(proofService); -const port = parseInt(options.port); -if (String(port) !== options.port) throw new Error('Invalid port'); +const router = CcipReadRouter({ port }); +gateway.add(router); -(async () => { - app.listen(port, function () { - console.log(`Listening on ${port}`); - }); -})(); +export default router; diff --git a/l1-gateway/src/worker.ts b/l1-gateway/src/worker.ts index 97b7f52c..d4caf972 100644 --- a/l1-gateway/src/worker.ts +++ b/l1-gateway/src/worker.ts @@ -1,25 +1,24 @@ -import { Request as CFWRequest } from '@cloudflare/workers-types'; -import { Server } from '@ensdomains/ccip-read-cf-worker'; -import type { Router } from '@ensdomains/evm-gateway'; +import type { Request as CFWRequest } from '@cloudflare/workers-types'; +import { CcipReadRouter } from '@ensdomains/ccip-read-router'; +import { EVMGateway } from '@ensdomains/evm-gateway'; +import { createClient, http } from 'viem'; +import { L1ProofService } from './L1ProofService.js'; + interface Env { WORKER_PROVIDER_URL: string; } -let app: Router; + 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) { - const ethers = await import('ethers'); - const EVMGateway = (await import('@ensdomains/evm-gateway')).EVMGateway; - const L1ProofService = (await import('./L1ProofService.js')).L1ProofService; - const { WORKER_PROVIDER_URL } = env; - const provider = new ethers.JsonRpcProvider(WORKER_PROVIDER_URL); - const gateway = new EVMGateway(new L1ProofService(provider)); - const server = new Server(); - gateway.add(server); - app = server.makeApp('/'); - } - return app.handle(request); + const { WORKER_PROVIDER_URL } = env; + + const client = createClient({ transport: http(WORKER_PROVIDER_URL) }); + const proofService = new L1ProofService(client); + const gateway = new EVMGateway(proofService); + + const router = CcipReadRouter(); + gateway.add(router); + + return router.fetch(request); } export default { diff --git a/l1-verifier/hardhat.config.ts b/l1-verifier/hardhat.config.cts similarity index 79% rename from l1-verifier/hardhat.config.ts rename to l1-verifier/hardhat.config.cts index a9b0a319..76563b8f 100644 --- a/l1-verifier/hardhat.config.ts +++ b/l1-verifier/hardhat.config.cts @@ -1,10 +1,10 @@ -import '@nomicfoundation/hardhat-toolbox'; +import '@nomicfoundation/hardhat-toolbox-viem'; import { HardhatUserConfig } from 'hardhat/config'; const config: HardhatUserConfig = { solidity: '0.8.19', networks: { - ganache: { + anvil: { url: `http://localhost:${parseInt(process.env['RPC_PORT'] || '8545')}`, }, }, diff --git a/l1-verifier/package.json b/l1-verifier/package.json index fb565e31..7af0a851 100644 --- a/l1-verifier/package.json +++ b/l1-verifier/package.json @@ -2,6 +2,7 @@ "name": "@ensdomains/l1-verifier", "license": "MIT", "version": "0.1.0-beta.4", + "type": "module", "repository": { "type": "git", "url": "https://github.com/ensdomains/evmgateway.git" @@ -11,37 +12,26 @@ }, "homepage": "https://github.com/ensdomains/evmgateway/tree/main/l1-verifier", "scripts": { - "build": "echo 'building l1-verifier...' && bun hardhat compile", + "hh": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only' hardhat", + "build": "echo 'building l1-verifier...' && bun hh compile", "test": "node ./scripts/test.js", - "remote_test": "hardhat run scripts/remote.ts", + "remote_test": "hh run scripts/remote.ts", "clean": "rm -fr artifacts cache node_modules typechain-types", "lint": "exit 0" }, "devDependencies": { + "@ensdomains/ccip-read-router": "^0.0.5", "@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", - "@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", + "@nomicfoundation/hardhat-toolbox-viem": "^3.0.0", "@types/chai": "^4.2.0", "@types/express": "^4.17.18", "@types/mocha": ">=9.1.0", "@types/supertest": "^2.0.14", + "@viem/anvil": "^0.0.10", + "@whatwg-node/server": "^0.9.49", "chai": "^4.2.0", - "ethers": "^6.8.0", - "express": "^4.18.2", - "ganache": "^7.9.1", - "hardhat": "^2.17.4", - "hardhat-gas-reporter": "^1.0.8", - "solidity-bytes-utils": "^0.8.0", - "solidity-coverage": "^0.8.1", - "supertest": "^6.3.3", + "hardhat": "^2.22.9", "ts-node": "^10.9.1", - "typechain": "^8.2.0", "typescript": "^5.2.2" }, "dependencies": { diff --git a/l1-verifier/scripts/test.js b/l1-verifier/scripts/test.js index c7bba803..b69651e6 100644 --- a/l1-verifier/scripts/test.js +++ b/l1-verifier/scripts/test.js @@ -1,45 +1,49 @@ -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; +import { CcipReadRouter } from '@ensdomains/ccip-read-router'; +import { EVMGateway } from '@ensdomains/evm-gateway'; +import { L1ProofService } from '@ensdomains/l1-gateway'; +import { createAnvil } from '@viem/anvil'; +import { createServerAdapter } from '@whatwg-node/server'; +import { fork } from 'child_process'; +import { createServer } from 'http'; +import { createClient, http } from 'viem'; + +const SERVER_PORT = 3001; + +const anvil = createAnvil(); + +await anvil.start(); + +const client = createClient({ + transport: http(`http://${anvil.host}:${anvil.port}`), }); +const proofService = new L1ProofService(client); +const gateway = new EVMGateway(proofService); + +const router = CcipReadRouter(); +gateway.add(router); +const ccipReadServer = createServerAdapter(router.fetch); + +const httpServer = createServer(ccipReadServer); +httpServer.listen(SERVER_PORT); + +console.log('Starting hardhat'); +const code = await new Promise((resolve) => { + const hh = fork( + '../node_modules/.bin/hardhat', + ['test', '--network', 'anvil'], + { + stdio: 'inherit', + env: { + NODE_OPTIONS: '--experimental-loader ts-node/esm/transpile-only', + RPC_PORT: anvil.port.toString(), + SERVER_PORT: SERVER_PORT.toString(), + }, + } + ); + hh.on('close', (c) => resolve(c ?? 0)); +}); + +console.log('Shutting down'); +httpServer.close(); +anvil.stop(); +process.exit(code); diff --git a/l1-verifier/test/testL1Verifier.ts b/l1-verifier/test/testL1Verifier.ts index 09cad51b..35d82fba 100644 --- a/l1-verifier/test/testL1Verifier.ts +++ b/l1-verifier/test/testL1Verifier.ts @@ -1,155 +1,112 @@ -import { Server } from '@chainlink/ccip-read-server'; -import { makeL1Gateway } from '@ensdomains/l1-gateway'; -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, - FetchRequest, - JsonRpcProvider, - Signer, - ethers as ethersT, -} from 'ethers'; -import { ethers } from 'hardhat'; -import { EthereumProvider } from 'hardhat/types'; -import request from 'supertest'; - -type ethersObj = typeof ethersT & - Omit & { - provider: Omit & { - _hardhatProvider: EthereumProvider; - }; - }; - -declare module 'hardhat/types/runtime' { - const ethers: ethersObj; - interface HardhatRuntimeEnvironment { - ethers: ethersObj; - } -} +import hre from 'hardhat'; -describe('L1Verifier', () => { - let provider: BrowserProvider; - let signer: Signer; - let verifier: Contract; - let target: Contract; - - 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); - 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 l1VerifierFactory = await ethers.getContractFactory( - 'L1Verifier', - signer - ); - verifier = await l1VerifierFactory.deploy(['test:']); +async function fixture() { + const client = await hre.viem.getPublicClient(); - const testL2Factory = await ethers.getContractFactory('TestL2', signer); - const l2contract = await testL2Factory.deploy(); + const l1Verifier = await hre.viem.deployContract('L1Verifier', [ + [`http://0.0.0.0:${process.env.SERVER_PORT}/{sender}/{data}.json`], + ]); + const l2Contract = await hre.viem.deployContract('TestL2', []); + const target = await hre.viem.deployContract('TestL1', [ + l1Verifier.address, + l2Contract.address, + ]); - const testL1Factory = await ethers.getContractFactory('TestL1', signer); - target = await testL1Factory.deploy( - await verifier.getAddress(), - await l2contract.getAddress() - ); - // Mine an empty block so we have something to prove against - await provider.send('evm_mine', []); - }); + return { client, l1Verifier, target }; +} +describe('L1Verifier', () => { it('simple proofs for fixed values', async () => { - const result = await target.getLatest({ enableCcipRead: true }); - expect(Number(result)).to.equal(42); + const { target } = await fixture(); + + const result = await target.read.getLatest(); + expect(result).to.equal(42n); }); it('simple proofs for dynamic values', async () => { - const result = await target.getName({ enableCcipRead: true }); + const { target } = await fixture(); + + const result = await target.read.getName(); expect(result).to.equal('Satoshi'); }); it('nested proofs for dynamic values', async () => { - const result = await target.getHighscorer(42, { enableCcipRead: true }); + const { target } = await fixture(); + + const result = await target.read.getHighscorer([42n]); expect(result).to.equal('Hal Finney'); }); it('nested proofs for long dynamic values', async () => { - const result = await target.getHighscorer(1, { enableCcipRead: true }); + const { target } = await fixture(); + + const result = await target.read.getHighscorer([1n]); expect(result).to.equal( 'Hubert Blaine Wolfeschlegelsteinhausenbergerdorff Sr.' ); }); it('nested proofs with lookbehind', async () => { - const result = await target.getLatestHighscore({ enableCcipRead: true }); - expect(Number(result)).to.equal(12345); + const { target } = await fixture(); + + const result = await target.read.getLatestHighscore(); + expect(result).to.equal(12345n); }); it('nested proofs with lookbehind for dynamic values', async () => { - const result = await target.getLatestHighscorer({ enableCcipRead: true }); + const { target } = await fixture(); + + const result = await target.read.getLatestHighscorer(); expect(result).to.equal('Hal Finney'); }); it('mappings with variable-length keys', async () => { - const result = await target.getNickname('Money Skeleton', { - enableCcipRead: true, - }); + const { target } = await fixture(); + + const result = await target.read.getNickname(['Money Skeleton']); expect(result).to.equal('Vitalik Buterin'); }); it('nested proofs of mappings with variable-length keys', async () => { - const result = await target.getPrimaryNickname({ enableCcipRead: true }); + const { target } = await fixture(); + + const result = await target.read.getPrimaryNickname(); expect(result).to.equal('Hal Finney'); }); it('treats uninitialized storage elements as zeroes', async () => { - const result = await target.getZero({ enableCcipRead: true }); - expect(Number(result)).to.equal(0); + const { target } = await fixture(); + + const result = await target.read.getZero(); + expect(result).to.equal(0n); }); it('treats uninitialized dynamic values as empty strings', async () => { - const result = await target.getNickname('Santa', { enableCcipRead: true }); + const { target } = await fixture(); + + const result = await target.read.getNickname(['Santa']); expect(result).to.equal(''); }); it('will index on uninitialized values', async () => { - const result = await target.getZeroIndex({ enableCcipRead: true }); - expect(Number(result)).to.equal(1); + const { target } = await fixture(); + + const result = await target.read.getZeroIndex(); + expect(result).to.equal(1n); }); it('will read static value from a struct in a map', async () => { - const result = await target.getStructOffsetValue(1, { enableCcipRead: true }); - expect(Number(result)).to.equal(1337); + const { target } = await fixture(); + + const result = await target.read.getStructOffsetValue([1n]); + expect(result).to.equal(1337n); }); it('will read dynamic value from map in a struct in a map', async () => { - const result = await target.getStructLatestMappedValue('Nick', { enableCcipRead: true }); + const { target } = await fixture(); + + const result = await target.read.getStructLatestMappedValue(['Nick']); expect(result).to.equal('Johnson'); }); - }); diff --git a/l1-verifier/tsconfig.json b/l1-verifier/tsconfig.json index 2e8555d7..cb289869 100644 --- a/l1-verifier/tsconfig.json +++ b/l1-verifier/tsconfig.json @@ -1,14 +1,20 @@ { "extends": "../tsconfig.json", - "include": ["./scripts", "./test"], - "files": ["hardhat.config.ts"], + "include": ["./scripts", "./test", "./artifacts"], + "files": ["hardhat.config.cts"], "compilerOptions": { "esModuleInterop": true, "verbatimModuleSyntax": false, "allowSyntheticDefaultImports": true, - "target": "ES2020", - "module": "CommonJS", - "moduleResolution": "Node", + "target": "ES2022", + "module": "Node16", + "moduleDetection": "force", + "moduleResolution": "NodeNext", "skipLibCheck": true + }, + "ts-node": { + "experimentalResolver": true, + "experimentalSpecifierResolution": "node", + "files": true } }