UNPKG

thor-devkit

Version:

Typescript library to aid DApp development on VeChain Thor

215 lines 14.8 kB
import { AbiCoder, formatSignature as _formatSignature } from '@vechain/ethers/utils/abi-coder'; import { keccak256 } from './keccak'; import { Buffer } from 'buffer'; class Coder extends AbiCoder { constructor() { super((type, value) => { if ((type.match(/^u?int/) && !Array.isArray(value) && typeof value !== 'object') || value._ethersType === 'BigNumber') { return value.toString(); } return value; }); } encode(types, values) { try { return super.encode(types, values); } catch (err) { if (err.reason) { throw new Error(err.reason); } throw err; } } decode(types, data) { try { return super.decode(types, data); } catch (err) { if (err.reason) { throw new Error(err.reason); } throw err; } } } const coder = new Coder(); function formatSignature(fragment) { try { return _formatSignature(fragment) .replace(/\(tuple\(/g, '((') .replace(/,tuple\(/g, ',('); } catch (err) { if (err.reason) { throw new Error(err.reason); } throw err; } } /** encode/decode parameters of contract function call, event log, according to ABI JSON */ export var abi; (function (abi) { /** * encode single parameter * @param type type of the parameter * @param value value of the parameter * @returns encoded value in hex string */ function encodeParameter(type, value) { return coder.encode([type], [value]); } abi.encodeParameter = encodeParameter; /** * decode single parameter * @param type type of the parameter * @param data encoded parameter in hex string * @returns decoded value */ function decodeParameter(type, data) { return coder.decode([type], data)[0]; } abi.decodeParameter = decodeParameter; /** * encode a group of parameters * @param types type array * @param values value array * @returns encoded values in hex string */ function encodeParameters(types, values) { return coder.encode(types, values); } abi.encodeParameters = encodeParameters; /** * decode a group of parameters * @param types type array * @param data encoded values in hex string * @returns decoded object */ function decodeParameters(types, data) { const result = coder.decode(types, data); const decoded = {}; types.forEach((t, i) => { decoded[i] = result[i]; if (t.name) { decoded[t.name] = result[i]; } }); return decoded; } abi.decodeParameters = decodeParameters; /** for contract function */ class Function { /** * create a function object * @param definition abi definition of the function */ constructor(definition) { this.definition = definition; this.canonicalName = formatSignature(definition); this.signature = '0x' + keccak256(this.canonicalName).slice(0, 4).toString('hex'); } /** * encode input parameters into call data * @param args arguments for the function */ encode(...args) { return this.signature + encodeParameters(this.definition.inputs, args).slice(2); } /** * decode output data * @param outputData output data to decode */ decode(outputData) { return decodeParameters(this.definition.outputs, outputData); } } abi.Function = Function; /** for contract event */ class Event { /** for contract event */ constructor(definition) { this.definition = definition; this.canonicalName = formatSignature(definition); this.signature = '0x' + keccak256(this.canonicalName).toString('hex'); } /** * encode an object of indexed keys into topics. * @param indexed an object contains indexed keys */ encode(indexed) { const topics = []; if (!this.definition.anonymous) { topics.push(this.signature); } for (const input of this.definition.inputs) { if (!input.indexed) { continue; } const value = indexed[input.name]; if (value === undefined || value === null) { topics.push(null); } else { let topic; // https://docs.soliditylang.org/en/v0.8.11/abi-spec.html#encoding-of-indexed-event-parameters if (isValueType(input.type)) { topic = encodeParameter(input.type, value); } else { if (input.type === 'string') { topic = '0x' + keccak256(value).toString('hex'); // tslint:disable-next-line:max-line-length } else if (typeof value === 'string' && /^0x[0-9a-f]+$/i.test(value) && value.length % 2 === 0) { // value is encoded topic = '0x' + keccak256(Buffer.from(value.slice(2), 'hex')).toString('hex'); } else { throw new Error(`event.encode: invalid ${input.type} value`); } } topics.push(topic); } } return topics; } /** * decode event log * @param data data in event output * @param topics topics in event */ decode(data, topics) { if (!this.definition.anonymous) { topics = topics.slice(1); } if (this.definition.inputs.filter(t => t.indexed).length !== topics.length) { throw new Error('invalid topics count'); } const decodedNonIndexed = coder.decode(this.definition.inputs.filter(t => !t.indexed), data); const decoded = {}; this.definition.inputs.forEach((t, i) => { if (t.indexed) { const topic = topics.shift(); decoded[i] = isValueType(t.type) ? decodeParameter(t.type, topic) : topic; } else { decoded[i] = decodedNonIndexed.shift(); } if (t.name) { decoded[t.name] = decoded[i]; } }); return decoded; } } abi.Event = Event; function isValueType(type) { return (type === 'address' || type === 'bool' || /^(u?int)(\d*)$/.test(type) || /^bytes(\d+)$/.test(type)); } })(abi || (abi = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FiaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQy9GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUUvQixNQUFNLEtBQU0sU0FBUSxRQUFRO0lBQ3hCO1FBQ0ksS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7Z0JBQzVFLEtBQUssQ0FBQyxXQUFXLEtBQUssV0FBVyxFQUFFO2dCQUNuQyxPQUFPLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQTthQUMxQjtZQUNELE9BQU8sS0FBSyxDQUFBO1FBQ2hCLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUE2QyxFQUFFLE1BQWE7UUFDdEUsSUFBSTtZQUNBLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7U0FDckM7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNWLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDWixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTthQUM5QjtZQUNELE1BQU0sR0FBRyxDQUFBO1NBQ1o7SUFDTCxDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQTZDLEVBQUUsSUFBWTtRQUNyRSxJQUFJO1lBQ0EsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENB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