UNPKG

@ethereum-sourcify/contract-call-decoder

Version:

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

118 lines 10.5 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const ava_1 = __importDefault(require("ava")); const eth_provider_1 = __importDefault(require("eth-provider")); const ContractCallDecoder_1 = require("./ContractCallDecoder"); (0, ava_1.default)('can evaluate call data', (t) => __awaiter(void 0, void 0, void 0, function* () { const ethereumProvider = (0, eth_provider_1.default)('https://rpc.ankr.com/eth_goerli'); t.is(yield (0, ContractCallDecoder_1.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'); })); ava_1.default.skip('get metadata of a non-contract address', (t) => __awaiter(void 0, void 0, void 0, function* () { const ethereumProvider = (0, eth_provider_1.default)('https://ethereum-holesky.publicnode.com'); try { yield (0, ContractCallDecoder_1.getMetadataFromAddress)({ address: '0x7dBA08Bdc233B28e2c99723c402Fc8F4e35AB53B', chainId: 17000, source: ContractCallDecoder_1.MetadataSources.BytecodeMetadata, rpcProvider: ethereumProvider, }); } catch (e) { t.is(e.message, `Bytecode not found while using "MetadataSources.BytecodeMetadata"`); } })); (0, ava_1.default)('can extract metadata from address', (t) => __awaiter(void 0, void 0, void 0, function* () { t.is((yield (0, ContractCallDecoder_1.getMetadataFromAddress)({ address: '0xb1FC6119024ca02EEBe30BD31a5D5368c05886Ac', chainId: 11155111, })).language, 'Solidity'); })); (0, ava_1.default)('find by signature', (t) => __awaiter(void 0, void 0, void 0, function* () { const tx = { to: '0x8521742d3f456bd237e312d6e30724960f72517a', input: '0xd5dcf127000000000000000000000000000000000000000000000000000000000000000a', }; const functionSignatureHash = tx.input.slice(0, 10); const selectorAndAbi = (0, ContractCallDecoder_1.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'); })); (0, ava_1.default)('evaluate calldata from tx getting metadata from sourcify', (t) => __awaiter(void 0, void 0, void 0, function* () { const tx = { to: '0x7Ad2e9521117D9C5fc47BE79aadA165D683B08ef', data: '0xf5a6259f000000000000000000000000000000000000000000000000000000000000000c', }; const decodedContractCall = yield (0, ContractCallDecoder_1.decodeContractCall)(tx, { chainId: 11155111, }); if (!decodedContractCall) { return; } t.is(decodedContractCall.method.notice, 'This function will add 1 to 12'); })); (0, ava_1.default)('evaluate calldata can correctly parse addresses, bigints and bytes', (t) => __awaiter(void 0, void 0, void 0, function* () { const tx = { to: '0x2f55daC1C137F3eE8c8513858f161671dDddf214', data: '0xb88d4fde0000000000000000000000007dba08bdc233b28e2c99723c402fc8f4e35ab55b0000000000000000000000007dba08bdc233b28e2c99723c402fc8f4e35ab55b000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004010101ff00000000000000000000000000000000000000000000000000000000', }; const decodedContractCall = yield (0, ContractCallDecoder_1.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'); })); ava_1.default.skip('evaluate calldata from tx getting metadata from bytecode', (t) => __awaiter(void 0, void 0, void 0, function* () { const ethereumProvider = (0, eth_provider_1.default)('https://ethereum-holesky.publicnode.com'); const tx = { to: '0x8b3436ba4c7638799ECce03d1a6500A03d71c7C1', data: '0xcea299370000000000000000000000000000000000000000000000000000000000000002', }; const decodedContractCall = yield (0, ContractCallDecoder_1.decodeContractCall)(tx, { source: ContractCallDecoder_1.MetadataSources.BytecodeMetadata, rpcProvider: ethereumProvider, }); if (!decodedContractCall) { return; } t.is(decodedContractCall.method.notice, 'Set the new vale 4'); })); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJhY3RDYWxsRGVjb2Rlci5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9Db250cmFjdENhbGxEZWNvZGVyLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFDQSw4Q0FBdUI7QUFDdkIsZ0VBQW9DO0FBRXBDLCtEQU0rQjtBQUUvQixJQUFBLGFBQUksRUFBQyx3QkFBd0IsRUFBRSxDQUFPLENBQUMsRUFBRSxFQUFFO0lBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxzQkFBUSxFQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDckUsQ0FBQyxDQUFDLEVBQUUsQ0FDRixNQUFNLElBQUEsOEJBQVEsRUFDWixzQ0FBc0MsRUFDdEM7UUFDRTtZQUNFLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUMvQyxJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLEtBQUs7WUFDZCxlQUFlLEVBQUUsWUFBWTtZQUM3QixJQUFJLEVBQUUsVUFBVTtTQUNqQjtLQUNGLEVBQ0Q7UUFDRSxFQUFFLEVBQUUsNENBQTRDO1FBQ2hELElBQUksRUFBRSw0RUFBNEU7S0FDbkYsRUFDRCxnQkFBdUMsQ0FDeEMsRUFDRCw4QkFBOEIsQ0FDL0IsQ0FBQztBQUNKLENBQUMsQ0FBQSxDQUFDLENBQUM7QUFFSCxhQUFJLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLENBQU8sQ0FBQyxFQUFFLEVBQUU7SUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLHNCQUFRLEVBQUMseUNBQXlDLENBQUMsQ0FBQztJQUM3RSxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUEsNENBQXNCLEVBQUM7WUFDM0IsT0FBTyxFQUFFLDRDQUE0QztZQUNyRCxPQUFPLEVBQUUsS0FBSztZ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