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