@colony/colony-js-contract-client
Version:
Method-like interface for Smart Contracts
179 lines (134 loc) • 6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _colonyJsUtils = require('@colony/colony-js-utils');
var _ContractClient = require('./ContractClient');
var _ContractClient2 = _interopRequireDefault(_ContractClient);
var _paramConversion = require('../modules/paramConversion');
var _paramValidation = require('../modules/paramValidation');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Abstract class for interacting with contract methods.
*/
/* eslint-disable import/no-cycle */
var ContractMethod = function () {
(0, _createClass3.default)(ContractMethod, null, [{
key: '_applyDefaultValues',
/**
* Given input values, method parameters and default values, iterate through
* the parameters and construct and object with the properties from the
* input values (if they are defined) or default values.
*/
value: function _applyDefaultValues(inputValues) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var defaultValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
// XXX it's possible to do this in a more succinct way, but adding
// properties in this way preserves type safety
var values = Object.assign({}, inputValues);
params.forEach(function (_ref) {
var _ref2 = (0, _slicedToArray3.default)(_ref, 1),
name = _ref2[0];
values[name] = Object.hasOwnProperty.call(values, name) ? values[name] : defaultValues[name];
});
return values;
}
}]);
function ContractMethod() {
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
client = _ref3.client,
defaultValues = _ref3.defaultValues,
functionName = _ref3.functionName,
name = _ref3.name,
input = _ref3.input,
output = _ref3.output;
(0, _classCallCheck3.default)(this, ContractMethod);
this.name = name;
this.client = client;
this.input = input;
this.functionName = functionName;
this.assertValid = (0, _colonyJsUtils.makeAssert)('Validation failed for ' + name);
if (defaultValues) this.defaultValues = defaultValues;
if (output) this.output = output;
}
/**
* Given named input values, transform these with the expected parameters
* in order to get an array of arguments expected by the contract function.
*/
/**
* Given arguments to call the contract method with, return
* transaction data as a hex string.
*/
(0, _createClass3.default)(ContractMethod, [{
key: 'createTransactionData',
value: function createTransactionData(callArgs) {
return this.client.createTransactionData(this.functionName, callArgs);
}
/**
* Given input values, apply default values and validate them against the
* expected params
*/
}, {
key: 'validate',
value: function validate(inputValues) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.input;
var defaultValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.defaultValues;
// eslint-disable-next-line no-underscore-dangle
var values = this.constructor._applyDefaultValues(inputValues, params, defaultValues);
return (0, _paramValidation.validateParams)(values, params, this.assertValid);
}
/**
* Given input values, map them against the expected parameters,
* with the appropriate conversion for each type.
*/
}, {
key: 'convertInputValues',
value: function convertInputValues(inputValues) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.input;
return (0, _paramConversion.convertInputValues)(inputValues, params);
}
/**
* Given the result of a contract method call, transform these with the
* expected output parameters in order to get named output values as the
* method's `OutputValues`.
*/
}, {
key: 'convertOutputValues',
value: function convertOutputValues(callResult,
// eslint-disable-next-line no-unused-vars
inputValues) {
var values = [].concat(callResult);
var parsedResult = this.output.reduce(function (acc, _ref4, index) {
var _ref5 = (0, _slicedToArray3.default)(_ref4, 1),
name = _ref5[0];
return Object.assign(acc, (0, _defineProperty3.default)({}, name, values[index]));
}, {});
return (0, _paramConversion.convertOutputValues)(parsedResult, this.output);
}
/**
* Given input values, get default values, then validate them and return
* parsed method args.
*/
}, {
key: 'getValidatedArgs',
value: function getValidatedArgs(inputValues) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.input;
var defaultValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.defaultValues;
// eslint-disable-next-line no-underscore-dangle
var values = this.constructor._applyDefaultValues(inputValues, params, defaultValues);
this.validate(values, params);
return params && params.length ? this.convertInputValues(values, params) : [];
}
}]);
return ContractMethod;
}();
exports.default = ContractMethod;
//# sourceMappingURL=ContractMethod.js.map