@rsksmart/rsk-contract-parser
Version:
A tool to parse/interact with contracts and decode events from the Rootstock blockchain.
83 lines (73 loc) • 3.03 kB
JavaScript
;Object.defineProperty(exports, "__esModule", { value: true });exports.NativeContractsEvents = NativeContractsEvents;exports.default = void 0;var _rskUtils = require("@rsksmart/rsk-utils");
var _utils = require("../utils");
var _FakeABI = _interopRequireDefault(require("./FakeABI"));function _interopRequireDefault(e) {return e && e.__esModule ? e : { default: e };}
function NativeContractsEvents({ bitcoinNetwork } = {}) {
const network = bitcoinNetwork || 'testnet';
const fakeAbi = (0, _FakeABI.default)(network);
const decodeAddress = (address) => {
address = Buffer.from((0, _rskUtils.remove0x)(address), 'hex');
return (0, _rskUtils.add0x)(address.toString('hex').slice(-40));
};
const decodeEventName = (name) => {
return Buffer.from((0, _rskUtils.remove0x)(name), 'hex').toString('ascii').replace(/\0/g, '');
};
const removeEmptyStartBytes = (d) => {
d = !Buffer.isBuffer(d) ? Buffer.from(d, 'hex') : d;
return d.slice(d.findIndex((x) => x > 0));
};
const decodeData = (data) => {
let decoded = _rskUtils.rlp.decode(data);
if (!Array.isArray(decoded)) decoded = [decoded];
return decoded.map((d) => (0, _rskUtils.add0x)(removeEmptyStartBytes(d).toString('hex')));
};
const getEventAbi = (eventName) => fakeAbi.find((a) => a.name === eventName && a.type === 'event');
const decodeByType = (type, value) => {
if (type === 'address') return decodeAddress(value);
return value;
};
const decodeInput = (input, value) => {
const { type, _filter } = input;
if (_filter && typeof _filter === 'function') {
value = _filter(value);
}
return decodeByType(type, value);
};
const removeCustomProperties = (obj) => {
const res = Object.assign({}, obj);
for (const p in res) {
if (p[0] === '_') delete res[p];
}
return res;
};
const cleanAbi = (abi) => {
abi = removeCustomProperties(abi);
const { inputs } = abi;
if (Array.isArray(inputs)) abi.inputs = inputs.map((input) => removeCustomProperties(input));
return abi;
};
const decodeLog = (log) => {
const topics = [...log.topics];
const event = decodeEventName(topics.shift());
const abi = getEventAbi(event);
if (event && abi) {
const { signature } = (0, _utils.getSignatureDataFromAbi)(abi);
log.event = event;
log.signature = signature;
log.abi = cleanAbi(abi);
log.args = [];
const decoder = abi._decoder || decodeData;
let dataDecoded = decoder(log.data);
if (!Array.isArray(dataDecoded)) dataDecoded = [dataDecoded];
for (const i in abi.inputs) {
const input = abi.inputs[i];
const { indexed } = input;
const value = indexed === true ? topics[i] : dataDecoded[i - topics.length];
const decoded = decodeInput(input, value);
if (decoded) log.args.push(decoded);
}
}
return log;
};
return Object.freeze({ decodeLog, abi: fakeAbi });
}var _default = exports.default =
NativeContractsEvents;