@colony/colony-js-contract-client
Version:
Method-like interface for Smart Contracts
272 lines (240 loc) • 8.6 kB
JavaScript
;
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