@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
JavaScript
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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