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