thor-devkit
Version:
Typescript library to aid DApp development on VeChain Thor
215 lines • 14.8 kB
JavaScript
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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