ethereum-web-token
Version:
EWT bundles Ethereum function-calls into [JWT](https://jwt.io/)-like tokens. It simplifies the use of ECDSA signatures for webapps and the development of [Smart Oracles](https://github.com/codius/codius/wiki/Smart-Oracles:-A-Simple,-Powerful-Approach-to-S
120 lines (89 loc) • 5.6 kB
JavaScript
'use strict';Object.defineProperty(exports, "__esModule", { value: true });var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);var _createClass2 = require('babel-runtime/helpers/createClass');var _createClass3 = _interopRequireDefault(_createClass2);var _utf = require('utf8');var _utf2 = _interopRequireDefault(_utf);
var _token = require('../token/token');var _token2 = _interopRequireDefault(_token);
var _bytesTaken = require('./bytesTaken');var _bytesTaken2 = _interopRequireDefault(_bytesTaken);
var _decodeResult = require('./decodeResult');var _decodeResult2 = _interopRequireDefault(_decodeResult);
var _paramType = require('../spec/paramType/paramType');var _paramType2 = _interopRequireDefault(_paramType);
var _slice = require('../util/slice');
var _sliceAs = require('../util/sliceAs');
var _types = require('../util/types');function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}var
Decoder = function () {function Decoder() {(0, _classCallCheck3.default)(this, Decoder);}(0, _createClass3.default)(Decoder, null, [{ key: 'decode', value: function decode(
params, data) {
if (!(0, _types.isArray)(params)) {
throw new Error('Parameters should be array of ParamType');
}
var slices = (0, _slice.sliceData)(data);
var offset = 0;
return params.map(function (param) {
var result = Decoder.decodeParam(param, slices, offset);
offset = result.newOffset;
return result.token;
});
} }, { key: 'peek', value: function peek(
slices, position) {
if (!slices || !slices[position]) {
throw new Error('Invalid position ' + position + ' in slices peek');
}
return slices[position];
} }, { key: 'takeBytes', value: function takeBytes(
slices, position, length) {
var slicesLength = Math.floor((length + 31) / 32);
var bytesStr = '';
for (var idx = 0; idx < slicesLength; idx++) {
bytesStr = '' + bytesStr + Decoder.peek(slices, position + idx);
}
var bytes = bytesStr.substr(0, length * 2).match(/.{1,2}/g).map(function (code) {return parseInt(code, 16);});
return new _bytesTaken2.default(bytes, position + slicesLength);
} }, { key: 'decodeParam', value: function decodeParam(
param, slices, offset) {
if (!(0, _types.isInstanceOf)(param, _paramType2.default)) {
throw new Error('param should be instanceof ParamType');
}
var tokens = [];
var taken = void 0;
var lengthOffset = void 0;
var length = void 0;
var newOffset = void 0;
switch (param.type) {
case 'address':
return new _decodeResult2.default(new _token2.default(param.type, (0, _sliceAs.asAddress)(Decoder.peek(slices, offset))), offset + 1);
case 'bool':
return new _decodeResult2.default(new _token2.default(param.type, (0, _sliceAs.asBool)(Decoder.peek(slices, offset))), offset + 1);
case 'int':
return new _decodeResult2.default(new _token2.default(param.type, (0, _sliceAs.asI32)(Decoder.peek(slices, offset))), offset + 1);
case 'uint':
return new _decodeResult2.default(new _token2.default(param.type, (0, _sliceAs.asU32)(Decoder.peek(slices, offset))), offset + 1);
case 'fixedBytes':
taken = Decoder.takeBytes(slices, offset, param.length);
return new _decodeResult2.default(new _token2.default(param.type, taken.bytes), taken.newOffset);
case 'bytes':
lengthOffset = (0, _sliceAs.asU32)(Decoder.peek(slices, offset)).div(32).toNumber();
length = (0, _sliceAs.asU32)(Decoder.peek(slices, lengthOffset)).toNumber();
taken = Decoder.takeBytes(slices, lengthOffset + 1, length);
return new _decodeResult2.default(new _token2.default(param.type, taken.bytes), offset + 1);
case 'string':
lengthOffset = (0, _sliceAs.asU32)(Decoder.peek(slices, offset)).div(32).toNumber();
length = (0, _sliceAs.asU32)(Decoder.peek(slices, lengthOffset)).toNumber();
taken = Decoder.takeBytes(slices, lengthOffset + 1, length);
var str = taken.bytes.map(function (code) {return String.fromCharCode(code);}).join('');
return new _decodeResult2.default(new _token2.default(param.type, _utf2.default.decode(str)), offset + 1);
case 'array':
lengthOffset = (0, _sliceAs.asU32)(Decoder.peek(slices, offset)).div(32).toNumber();
length = (0, _sliceAs.asU32)(Decoder.peek(slices, lengthOffset)).toNumber();
newOffset = lengthOffset + 1;
for (var idx = 0; idx < length; idx++) {
var result = Decoder.decodeParam(param.subtype, slices, newOffset);
newOffset = result.newOffset;
tokens.push(result.token);
}
return new _decodeResult2.default(new _token2.default(param.type, tokens), offset + 1);
case 'fixedArray':
newOffset = offset;
for (var _idx = 0; _idx < param.length; _idx++) {
var _result = Decoder.decodeParam(param.subtype, slices, newOffset);
newOffset = _result.newOffset;
tokens.push(_result.token);
}
return new _decodeResult2.default(new _token2.default(param.type, tokens), newOffset);
default:
throw new Error('Invalid param type ' + param.type + ' in decodeParam');}
} }]);return Decoder;}();exports.default = Decoder;module.exports = exports['default'];