UNPKG

@colony/colony-js-contract-client

Version:

Method-like interface for Smart Contracts

272 lines (240 loc) 8.6 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.convertInputValue = exports.convertOutputValue = exports.validateValueType = undefined; var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); exports.addParamType = addParamType; var _bs = require('bs58'); var _bs2 = _interopRequireDefault(_bs); var _bn = require('bn.js'); var _bn2 = _interopRequireDefault(_bn); var _web3Utils = require('web3-utils'); var _colonyJsUtils = require('@colony/colony-js-utils'); var _paramValidation = require('./paramValidation'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var passThrough = function passThrough(value) { return value; }; /** * A map of ParamTypes to ParamTypeDefs * For each ParamType (e.g. address), defines how a value should be validated * or converted for input/output. */ /* eslint-disable import/no-cycle */ var PARAM_TYPE_MAP = { '[address]': { validate: function validate(value) { if (!Array.isArray(value)) return false; return value.every(function (element) { return (0, _colonyJsUtils.isValidAddress)(element); }); }, convertOutput: function convertOutput(value) { if (!Array.isArray(value)) return []; return value.map(function (element) { return (0, _colonyJsUtils.isValidAddress)(element) ? element : null; }); }, convertInput: passThrough }, '[bigNumber]': { validate: function validate(value) { if (!Array.isArray(value)) return false; return value.every(function (element) { return (0, _colonyJsUtils.isBigNumber)(element); }); }, convertOutput: function convertOutput(value) { if (!Array.isArray(value)) return []; return value.map(function (element) { return (0, _colonyJsUtils.isBigNumber)(element) ? element : null; }); }, convertInput: passThrough }, '[hexString]': { validate: function validate(value) { if (!Array.isArray(value)) return false; return value.every(function (element) { return (0, _web3Utils.isHexStrict)(element); }); }, convertOutput: function convertOutput(value) { if (!Array.isArray(value)) return []; return value.map(function (element) { return (0, _web3Utils.toHex)(element); }); }, convertInput: passThrough }, '[number]': { validate: function validate(value) { if (!Array.isArray(value)) return false; return value.every(function (element) { return Number.isFinite(element); }); }, convertOutput: function convertOutput(value) { if (!Array.isArray(value)) return []; return value.map(function (element) { // convert BN (ethers or bn.js) var number = (0, _colonyJsUtils.isBigNumber)(element) ? element.toNumber() : element; return Number.isFinite(number) ? number : null; }); }, convertInput: passThrough }, address: { validate: _colonyJsUtils.isValidAddress, convertOutput: function convertOutput(value) { return (0, _colonyJsUtils.isValidAddress)(value) ? value : null; }, convertInput: passThrough }, // Either a valid address, or an empty address anyAddress: { validate: function validate(value) { return (0, _colonyJsUtils.isValidAddress)(value) || (0, _colonyJsUtils.isEmptyHexString)(value); }, convertInput: function convertInput(value) { // Expand `0x0` to a full-length address return value.padEnd(42, '0'); }, convertOutput: function convertOutput(value) { // Expand `0x0` to a full-length address (for a valid address) return (0, _colonyJsUtils.isValidAddress)(value) || (0, _colonyJsUtils.isEmptyHexString)(value) ? value.padEnd(42, '0') : null; } }, bigNumber: { validate: _colonyJsUtils.isBigNumber, convertOutput: function convertOutput(value) { if ((0, _colonyJsUtils.isBigNumber)(value)) { return value; } if (Number.isFinite(value)) { return new _bn2.default(value); } return null; }, convertInput: passThrough }, boolean: { validate: _paramValidation.isBoolean, convertOutput: function convertOutput(value) { return (0, _paramValidation.isBoolean)(value) ? value : null; }, convertInput: passThrough }, bytes32String: { validate: function validate(value) { // Must be a string and will fit into bytes32 return typeof value === 'string' && (0, _web3Utils.utf8ToHex)(value).length <= 66; }, convertOutput: function convertOutput(value) { // Will be returned as a hex string, we want the UTF-8 string return (0, _web3Utils.hexToUtf8)(value); }, convertInput: function convertInput(value) { // Adapter expects a 32 byte hex string, convert from UTF-8 and pad var converted = (0, _web3Utils.utf8ToHex)(value); return '0x' + converted.slice(2).padStart(64, '0'); } }, date: { validate: function validate(value) { // XXX This allows dates initialised without a value (or with `0` value) return value instanceof Date; }, convertOutput: function convertOutput(value) { var converted = parseInt((0, _colonyJsUtils.isBigNumber)(value) ? value.toNumber() : value, 10); // Recreate the date by adding milliseconds to the timestamp return converted > 0 ? new Date(converted * 1000) : null; }, convertInput: function convertInput(value) { // Dates are stored as timestamps without milliseconds return parseInt(value.setMilliseconds(0) / 1000, 10); } }, hexString: { validate: function validate(value) { return (0, _web3Utils.isHexStrict)(value); }, convertOutput: function convertOutput(value) { return (0, _web3Utils.toHex)(value); }, convertInput: passThrough }, number: { validate: function validate(value) { return Boolean(Number.isFinite(value)); }, convertOutput: function convertOutput(value) { var converted = (0, _colonyJsUtils.isBigNumber)(value) ? value.toNumber() : value; return Number.isFinite(converted) ? converted : null; }, convertInput: passThrough }, string: { validate: function validate(value) { return typeof value === 'string'; }, convertOutput: function convertOutput(value) { if ((0, _web3Utils.isHexStrict)(value)) { if ((0, _colonyJsUtils.isEmptyHexString)(value)) return null; try { return (0, _web3Utils.hexToUtf8)(value); } catch (error) { // ignore error: not a UTF8-encoded value } } return typeof value === 'string' && value.length ? value : null; }, convertInput: passThrough }, ipfsHash: { validate: function validate(value) { return typeof value === 'string' && value.slice(0, 2) === 'Qm' && value.length === 46; }, convertOutput: function convertOutput(value) { if ((0, _web3Utils.isHexStrict)(value) && !(0, _colonyJsUtils.isEmptyHexString)(value)) { var hex = '0x1220' + value.slice(2); var bytes = (0, _web3Utils.hexToBytes)(hex); return _bs2.default.encode(Buffer.from(bytes)); } return null; }, convertInput: function convertInput(value) { return '0x' + _bs2.default.decode(value).slice(2).toString('hex'); } } }; /** * Given the key of a ParamTypeDef (namely `validate`, `convertOutput` or * `convertInput`), a value and ParamType, pluck the appropriate function * from the type map and call it with the value. */ function typeMapFn(fnName, value, type) { var fn = PARAM_TYPE_MAP[type][fnName]; return fn(value); } function addParamType(type, def) { Object.assign(PARAM_TYPE_MAP, (0, _defineProperty3.default)({}, type, def)); } /** * Given a value and a ParamType, validate the value according to that type's * `validate` function */ var validateValueType = exports.validateValueType = typeMapFn.bind(undefined, 'validate'); /** * Given a value and a ParamType, convert the value according to that type's * `convertOutput` function */ var convertOutputValue = exports.convertOutputValue = typeMapFn.bind(undefined, 'convertOutput'); /** * Given a value and a ParamType, convert the value according to that type's * `convertInput` function */ var convertInputValue = exports.convertInputValue = typeMapFn.bind(undefined, 'convertInput'); //# sourceMappingURL=paramTypes.js.map