js-conflux-sdk
Version:
JavaScript Conflux Software Development Kit
59 lines (51 loc) • 1.78 kB
JavaScript
/*
@see https://solidity.readthedocs.io/en/v0.5.13/abi-spec.html
@see https://solidity.readthedocs.io/en/v0.5.13/abi-spec.html#encoding-of-indexed-event-parameters
*/
const { assert } = require('../../util');
const BaseCoder = require('./BaseCoder');
const NullCoder = require('./NullCoder');
const AddressCoder = require('./AddressCoder');
const IntegerCoder = require('./IntegerCoder');
const BoolCoder = require('./BoolCoder');
const BytesCoder = require('./BytesCoder');
const StringCoder = require('./StringCoder');
const TupleCoder = require('./TupleCoder');
const ArrayCoder = require('./ArrayCoder');
// TODO FixedCoder
/**
* Get coder by abi component.
*
* @param {object} component
* @param {string} component.type
* @param {string} [component.name]
* @param {array} [component.components] - For TupleCoder
* @return {BaseCoder}
*/
function valueCoder(component) {
// must parse ArrayCoder first, others sorted by probability
const coder = ArrayCoder.from(component, valueCoder) // recursion
|| TupleCoder.from(component, valueCoder) // recursion
|| AddressCoder.from(component)
|| IntegerCoder.from(component)
|| StringCoder.from(component)
|| BytesCoder.from(component)
|| BoolCoder.from(component)
|| NullCoder.from(component);
assert(coder instanceof BaseCoder, {
message: 'can not found matched coder',
component,
});
return coder;
}
function formatType({ name, inputs }) {
return `${name}(${inputs.map(param => valueCoder(param).type).join(',')})`;
}
function formatFullName({ name, inputs }) {
return `${name}(${inputs.map(param => `${valueCoder(param).type} ${param.indexed ? 'indexed ' : ''}${param.name}`).join(', ')})`;
}
module.exports = {
valueCoder,
formatType,
formatFullName,
};