UNPKG

@ethereum-sourcify/contract-call-decoder

Version:

Library to decode Ethereum smart contract calls into human-readable descriptions using ABI and NatSpec

104 lines 9.03 kB
import test from 'ava'; import provider from 'eth-provider'; import { decodeContractCall, evaluate, findSelectorAndAbiItemFromSignatureHash, getMetadataFromAddress, MetadataSources, } from './ContractCallDecoder'; test('can evaluate call data', async (t) => { const ethereumProvider = provider('https://rpc.ankr.com/eth_goerli'); t.is(await evaluate('Set the tree age to `numYears` years', [ { constant: false, inputs: [{ name: 'numYears', type: 'uint256' }], name: 'setAge', outputs: [], payable: false, stateMutability: 'nonpayable', type: 'function', }, ], { to: '0x8521742d3f456bd237e312d6e30724960f72517a', data: '0xd5dcf127000000000000000000000000000000000000000000000000000000000000000a', }, ethereumProvider), 'Set the tree age to 10 years'); }); test.skip('get metadata of a non-contract address', async (t) => { const ethereumProvider = provider('https://ethereum-holesky.publicnode.com'); try { await getMetadataFromAddress({ address: '0x7dBA08Bdc233B28e2c99723c402Fc8F4e35AB53B', chainId: 17000, source: MetadataSources.BytecodeMetadata, rpcProvider: ethereumProvider, }); } catch (e) { t.is(e.message, `Bytecode not found while using "MetadataSources.BytecodeMetadata"`); } }); test('can extract metadata from address', async (t) => { t.is((await getMetadataFromAddress({ address: '0xb1FC6119024ca02EEBe30BD31a5D5368c05886Ac', chainId: 11155111, })).language, 'Solidity'); }); test('find by signature', async (t) => { const tx = { to: '0x8521742d3f456bd237e312d6e30724960f72517a', input: '0xd5dcf127000000000000000000000000000000000000000000000000000000000000000a', }; const functionSignatureHash = tx.input.slice(0, 10); const selectorAndAbi = findSelectorAndAbiItemFromSignatureHash(functionSignatureHash, [ { constant: false, inputs: [{ name: 'numYears', type: 'uint256' }], name: 'setAge', outputs: [], payable: false, stateMutability: 'nonpayable', type: 'function', }, ]); if (!selectorAndAbi) { return; } t.is(selectorAndAbi.abi.name, 'setAge'); }); test('evaluate calldata from tx getting metadata from sourcify', async (t) => { const tx = { to: '0x7Ad2e9521117D9C5fc47BE79aadA165D683B08ef', data: '0xf5a6259f000000000000000000000000000000000000000000000000000000000000000c', }; const decodedContractCall = await decodeContractCall(tx, { chainId: 11155111, }); if (!decodedContractCall) { return; } t.is(decodedContractCall.method.notice, 'This function will add 1 to 12'); }); test('evaluate calldata can correctly parse addresses, bigints and bytes', async (t) => { const tx = { to: '0x2f55daC1C137F3eE8c8513858f161671dDddf214', data: '0xb88d4fde0000000000000000000000007dba08bdc233b28e2c99723c402fc8f4e35ab55b0000000000000000000000007dba08bdc233b28e2c99723c402fc8f4e35ab55b000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004010101ff00000000000000000000000000000000000000000000000000000000', }; const decodedContractCall = await decodeContractCall(tx, { chainId: 1 }); if (!decodedContractCall) { return; } t.is(decodedContractCall.method.decodedParams[0], '0x7dBA08Bdc233B28e2c99723c402Fc8F4e35AB55B'); t.is(`${decodedContractCall.method.decodedParams[2]}`, '1'); t.is(`${decodedContractCall.method.decodedParams[3]}`, '0x010101ff'); }); test.skip('evaluate calldata from tx getting metadata from bytecode', async (t) => { const ethereumProvider = provider('https://ethereum-holesky.publicnode.com'); const tx = { to: '0x8b3436ba4c7638799ECce03d1a6500A03d71c7C1', data: '0xcea299370000000000000000000000000000000000000000000000000000000000000002', }; const decodedContractCall = await decodeContractCall(tx, { source: MetadataSources.BytecodeMetadata, rpcProvider: ethereumProvider, }); if (!decodedContractCall) { return; } t.is(decodedContractCall.method.notice, 'Set the new vale 4'); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJhY3RDYWxsRGVjb2Rlci5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9Db250cmFjdENhbGxEZWNvZGVyLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxJQUFJLE1BQU0sS0FBSyxDQUFDO0FBQ3ZCLE9BQU8sUUFBUSxNQUFNLGNBQWMsQ0FBQztBQUVwQyxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLFFBQVEsRUFDUix1Q0FBdUMsRUFDdkMsc0JBQXNCLEVBQ3RCLGVBQWUsR0FDaEIsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDckUsQ0FBQyxDQUFDLEVBQUUsQ0FDRixNQUFNLFFBQVEsQ0FDWixzQ0FBc0MsRUFDdEM7UUFDRTtZQUNFLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUMvQyxJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLEtBQUs7WUFDZCxlQUFlLEVBQUUsWUFBWTtZQUM3QixJQUFJLEVBQUUsVUFBVTtTQUNqQjtLQUNGLEVBQ0Q7UUFDRSxFQUFFLEVBQUUsNENBQTRDO1FBQ2hELElBQUksRUFBRSw0RUFBNEU7S0FDbkYsRUFDRCxnQkFBdUMsQ0FDeEMsRUFDRCw4QkFBOEIsQ0FDL0IsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUM3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