UNPKG

thor-devkit

Version:

Typescript library to aid DApp development on VeChain Thor

226 lines 16.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.abi = void 0; const ethers_1 = require("ethers"); const keccak_1 = require("./keccak"); const buffer_1 = require("buffer"); const _coder = new ethers_1.AbiCoder(); function processDecoded(type, value) { if (type.baseType === 'address') return value.toLowerCase(); if (type.baseType.startsWith('uint') || type.baseType.startsWith('int')) return value.toString(); if (type.baseType === 'array') return value.map((v) => processDecoded(type.arrayChildren, v)); if (type.baseType === 'tuple') { const processed = value.map((v, i) => processDecoded(type.components[i], v)); type.components.forEach((comp, i) => { if (comp.name) { processed[comp.name] = processed[i]; } }); return processed; } return value; } function toParamType(t) { return typeof t === 'string' ? ethers_1.ParamType.from(t) : ethers_1.ParamType.from({ name: t.name, type: t.type, components: t.components }); } function encodeValues(types, values) { var _a; try { return _coder.encode(types.map(toParamType), values); } catch (err) { throw new Error((_a = err.message) !== null && _a !== void 0 ? _a : String(err)); } } function decodeValues(types, data) { var _a; if (types.length === 0) return []; try { const pts = types.map(toParamType); const raw = _coder.decode(pts, data); return pts.map((pt, i) => processDecoded(pt, raw[i])); } catch (err) { throw new Error((_a = err.message) !== null && _a !== void 0 ? _a : String(err)); } } function formatSignature(fragment) { var _a; try { return ethers_1.Fragment.from(fragment).format('sighash'); } catch (err) { throw new Error((_a = err.message) !== null && _a !== void 0 ? _a : String(err)); } } /** encode/decode parameters of contract function call, event log, according to ABI JSON */ 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 encodeValues([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 decodeValues([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 encodeValues(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 = decodeValues(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' + (0, keccak_1.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' + (0, keccak_1.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' + (0, keccak_1.keccak256)(value).toString('hex'); } else if (typeof value === 'string' && /^0x[0-9a-f]+$/i.test(value) && value.length % 2 === 0) { // value is encoded topic = '0x' + (0, keccak_1.keccak256)(buffer_1.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 = decodeValues(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 || (exports.abi = abi = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FiaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBc0Q7QUFDdEQscUNBQW9DO0FBQ3BDLG1DQUErQjtBQUUvQixNQUFNLE1BQU0sR0FBRyxJQUFJLGlCQUFRLEVBQUUsQ0FBQTtBQUU3QixTQUFTLGNBQWMsQ0FBQyxJQUFlLEVBQUUsS0FBVTtJQUMvQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUztRQUMzQixPQUFRLEtBQWdCLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDMUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDbkUsT0FBUSxLQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ3ZDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxPQUFPO1FBQ3pCLE9BQVEsS0FBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuRixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxTQUFTLEdBQUksS0FBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUN6RCxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQyxVQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUFFLFNBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMs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