UNPKG

poker-helper

Version:
575 lines (540 loc) 25.7 kB
'use strict';Object.defineProperty(exports, "__esModule", { value: true });exports.Type = undefined;var _typeof2 = require('babel-runtime/helpers/typeof');var _typeof3 = _interopRequireDefault(_typeof2);var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);var _createClass2 = require('babel-runtime/helpers/createClass');var _createClass3 = _interopRequireDefault(_createClass2);var _ethereumjsUtil = require('ethereumjs-util');var _ethereumjsUtil2 = _interopRequireDefault(_ethereumjsUtil); var _bignumber = require('bignumber.js');var _bignumber2 = _interopRequireDefault(_bignumber); var _signer = require('./signer');var _signer2 = _interopRequireDefault(_signer);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} var Type = exports.Type = { // PLAYERS RECEIPTS LEAVE: 1, BET: 2, CHECK_PRE: 3, CHECK_FLOP: 4, CHECK_TURN: 5, CHECK_RIVER: 6, FOLD: 7, SIT_OUT: 8, SHOW: 9, // SESSION RECEIPTS CREATE_CONF: 10, RESET_CONF: 11, // ORACLE RECEIPTS DIST: 21, SETTLE: 25, WAIT: 26, // RECOVERY RECEIPTS RECOVERY: 30, UNLOCK: 31, UNLOCK_REQUEST: 32, MESSAGE: 41, FORWARD: 51 }; var jozDecimals = new _bignumber2.default(10).pow(9); function payReceipt(type, targetAddr) {for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {args[_key - 2] = arguments[_key];}var handId = args[0],babzAmount = args[1]; // size: 32bytes receipt var payload = Buffer.alloc(32); // <1 bytes 0x00 space for v> payload.writeUInt8(0, 0); // <3 bytes targetAddr> payload.write(targetAddr.replace('0x', '').substring(34, 40), 1, 'hex'); // <4 bytes handId> payload.writeUInt32BE(handId, 4); // <1 bytes receipt type> payload.writeUInt8(type, 8); // TODO: check max bet // 1000 * 100 JOHNYZ ~= 1 USD // 6 bytes for amount => (2^ 48) / 100000 => maxBet 2.800.000.000 USD // <6 bytes amount in JOHNYZ> var jozAmount = _ethereumjsUtil2.default.setLengthLeft(babzAmount.div(jozDecimals).toNumber(), 6); jozAmount.copy(payload, 9); return payload; } /** * A receipt should authenticate the signer to a contract function * a receipt should transport a destination address, ideally a nonce * and shall fit into few multiple of bytes32 * * FIX_LENGTH, SINGLE RECEIPTS: * <1 bytes 0x00 space for v> * <x bytes for destination address> (first bytes of contract address) * <32 -(x+1) bytes for payload> * [<32 bytes payload>] * [<32 bytes payload>] * this shall fit into few multiple of bytes32 * * FIX_LENGTH, SINGLE RECEIPTS sent to contract by: * func name(bytes32 r, bytes32 s, bytes32 pl0, [bytes32 pl1], ...) * * FIX_LENGTH, MULTIPLE RECEIPTS: * (sigs.length / 2) is the number of receipts * (receipts.length / (sigs.length / 2)) is length of one receipt * first byte of each receipt is v, should be replaced by 0x00 for verification * FIX_LENGTH, MULTIPLE RECEIPTS sent to contract by: * func name(bytes32[] sigs, bytes receipts) */var Receipt = function () { function Receipt(targetAddr) {(0, _classCallCheck3.default)(this, Receipt); this.targetAddr = targetAddr; } // leave create a leave receipt // a leave receipts is signed by the oracle to exit a player from the table // at a specific handId. // when the leave receipt is accepted in the contract, the exitHand of the player // is set to the handId provider in the receipt // and a nettingRequest is created at handId (0, _createClass3.default)(Receipt, [{ key: 'leave', value: function leave() {for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {args[_key2] = arguments[_key2];}var handId = args[0],leaverAddr = args[1]; // make leave receipt // size: 32bytes receipt var payload = Buffer.alloc(32); // <1 bytes 0x00 space for v> payload.writeUInt8(0, 0); // <7 bytes targetAddr> payload.write(this.targetAddr.replace('0x', '').substring(26, 40), 1, 'hex'); // <4 bytes handId> payload.writeUInt32BE(handId, 8); // <20 bytes signerAddr> payload.write(leaverAddr.replace('0x', ''), 12, 'hex'); return new _signer2.default(args, [payload], Type.LEAVE); } }, { key: 'bet', value: function bet() {for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {args[_key3] = arguments[_key3];} var payload = payReceipt.apply(undefined, [Type.BET, this.targetAddr].concat(args)); return new _signer2.default(args, [payload], Type.BET); } }, { key: 'checkPre', value: function checkPre() {for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {args[_key4] = arguments[_key4];} var payload = payReceipt.apply(undefined, [Type.CHECK_PRE, this.targetAddr].concat(args)); return new _signer2.default(args, [payload], Type.CHECK_PRE); } }, { key: 'checkFlop', value: function checkFlop() {for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {args[_key5] = arguments[_key5];} var payload = payReceipt.apply(undefined, [Type.CHECK_FLOP, this.targetAddr].concat(args)); return new _signer2.default(args, [payload], Type.CHECK_FLOP); } }, { key: 'checkTurn', value: function checkTurn() {for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {args[_key6] = arguments[_key6];} var payload = payReceipt.apply(undefined, [Type.CHECK_TURN, this.targetAddr].concat(args)); return new _signer2.default(args, [payload], Type.CHECK_TURN); } }, { key: 'checkRiver', value: function checkRiver() {for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {args[_key7] = arguments[_key7];} var payload = payReceipt.apply(undefined, [Type.CHECK_RIVER, this.targetAddr].concat(args)); return new _signer2.default(args, [payload], Type.CHECK_RIVER); } }, { key: 'fold', value: function fold() {for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {args[_key8] = arguments[_key8];} var payload = payReceipt.apply(undefined, [Type.FOLD, this.targetAddr].concat(args)); return new _signer2.default(args, [payload], Type.FOLD); } }, { key: 'sitOut', value: function sitOut() {for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {args[_key9] = arguments[_key9];} var payload = payReceipt.apply(undefined, [Type.SIT_OUT, this.targetAddr].concat(args)); return new _signer2.default(args, [payload], Type.SIT_OUT); } }, { key: 'show', value: function show() {for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {args[_key10] = arguments[_key10];} var payload = payReceipt.apply(undefined, [Type.SHOW, this.targetAddr].concat(args)); return new _signer2.default(args, [payload], Type.SHOW); } /** * distribution receipt */ }, { key: 'dist', value: function dist() {for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {args[_key11] = arguments[_key11];}var handId = args[0],claimId = args[1],babzOuts = args[2]; // size: 64bytes receipt var payload = Buffer.alloc(64); // <1 bytes 0x00 space for v> payload.writeUInt8(0, 0); // <3 bytes targetAddr> payload.write(this.targetAddr.replace('0x', '').substring(34, 40), 1, 'hex'); // <4 bytes handId> payload.writeUInt32BE(handId, 4); // <1 bytes receipt type> payload.writeUInt8(Type.DIST, 8); // <1 bytes claimId> payload.writeUInt8(claimId, 9); // pairs of: <1b pos><6b amount> // 3 in first receipt // 4 in next // max 7 outs in one hand var pos = 0; for (var i = 0; i < babzOuts.length; i += 1) { if (babzOuts[i] > 0) { var jozAmount = babzOuts[i].div(jozDecimals).round(); jozAmount = _ethereumjsUtil2.default.setLengthLeft(jozAmount.toNumber(), 6); payload.writeUInt8(i, 11 + pos * 7); jozAmount.copy(payload, 12 + pos * 7); pos += 1; } } // <1 bytes outs> payload.writeUInt8(pos, 10); return new _signer2.default(args, [payload.slice(0, 32), payload.slice(32, 64)], Type.DIST); } }, { key: 'settle', value: function settle() {for (var _len12 = arguments.length, args = Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {args[_key12] = arguments[_key12];} // structure is // <1b dest><1b dest><1b handsNetted><1b lhn>[2-10x<6b signed diff>] var fromHandId = args[0],toHandId = args[1],babzAmounts = args[2]; var payload = Buffer.alloc(64); // <4 bytes handId> payload.writeUInt32BE(fromHandId, 0); payload.writeUInt8(0, 0); // <1b targetAddr> payload.write(this.targetAddr.replace('0x', '').substring(38, 40), 1, 'hex'); // <1b handsNetted> payload.writeUInt8(toHandId - fromHandId, 2); var jozAmount = void 0; for (var i = 0; i < babzAmounts.length; i += 1) { jozAmount = babzAmounts[i].div(jozDecimals); if (jozAmount < 0) { jozAmount = new _bignumber2.default(2).pow(49).sub(jozAmount.abs()); } jozAmount = _ethereumjsUtil2.default.setLengthLeft(jozAmount.toNumber(), 6); jozAmount.copy(payload, 4 + i * 6); } return new _signer2.default(args, [payload.slice(0, 32), payload.slice(32, 64)], Type.SETTLE); } }, { key: 'wait', value: function wait() {for (var _len13 = arguments.length, args = Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {args[_key13] = arguments[_key13];} // structure is // <1b v><20b tableAddr><4b created> var _args$ = args[0],created = _args$ === undefined ? Math.floor(Date.now() / 1000) : _args$; var payload = Buffer.alloc(32); // <1 bytes v> payload.writeUInt8(0, 0); // <4 butes created> payload.writeUInt32BE(created, 1); // <20 bytes tableAddr> payload.write(this.targetAddr.replace('0x', ''), 5, 'hex'); return new _signer2.default(args, [payload], Type.WAIT); } }, { key: 'forward', value: function forward() {for (var _len14 = arguments.length, args = Array(_len14), _key14 = 0; _key14 < _len14; _key14++) {args[_key14] = arguments[_key14];}var nonce = args[0],destinationAddr = args[1],amount = args[2],data = args[3]; var dataHex = data.replace('0x', ''); var dataBuf = Buffer.alloc(dataHex.length / 2); dataBuf.write(dataHex, 'hex'); var amountBuf = void 0; if (typeof amount === 'undefined') { amountBuf = Buffer.alloc(32); } if ((typeof amount === 'undefined' ? 'undefined' : (0, _typeof3.default)(amount)) === 'object' && amount.toNumber) { amountBuf = _ethereumjsUtil2.default.setLengthLeft(amount.toNumber(), 32); } if (!amountBuf) { amountBuf = _ethereumjsUtil2.default.setLengthLeft(amount, 32); } var payload = Buffer.alloc(32); // <1 bytes 0x00 space for v> payload.writeUInt8(0, 0); // <7 bytes targetAddr> payload.write(this.targetAddr.replace('0x', '').substring(26, 40), 1, 'hex'); // <4 bytes nonce> payload.writeUInt32BE(nonce, 8); // <20 bytes destinationAddr> payload.write(destinationAddr.replace('0x', ''), 12, 'hex'); return new _signer2.default(args, [payload, amountBuf, dataBuf], Type.FORWARD); } }, { key: 'message', value: function message() {for (var _len15 = arguments.length, args = Array(_len15), _key15 = 0; _key15 < _len15; _key15++) {args[_key15] = arguments[_key15];}var msg = args[0],_args$2 = args[1],created = _args$2 === undefined ? Date.now() : _args$2; var msgLength = Buffer.byteLength(msg, 'utf8'); // make message receipt // 1b 0x00 space for v // 7b for time in milli // 20b table address // 4b for msg length in bytes // 1 + 7 + 20 + 4 + msgLength < 32 * 8 if (msgLength > 32 * 7) { throw Error('msg too long:' + msgLength); } // Buffer.alloc(size[, fill[, encoding]]) // If fill is undefined, the Buffer will be zero-filled. var sliceCount = Math.floor(msgLength / 32) + 2; var payload = Buffer.alloc(sliceCount * 32); // write timestamp to buffer var MAX_UINT32 = 0xFFFFFFFF; var big = ~~(created / MAX_UINT32); // eslint-disable-line no-bitwise var low = created % MAX_UINT32 - big; payload.writeUInt32BE(big, 0); payload.writeUInt32BE(low, 4); // <1 bytes 0x00 space for v> payload.writeUInt8(0, 0); // <20 bytes tableAddr> payload.write(this.targetAddr.replace('0x', ''), 8, 'hex'); // <4 bytes message length> payload.writeUInt32BE(msgLength, 28); // <xx bytes message> payload.write(msg, 32, 'utf8'); var slices = []; for (var i = 0; i < sliceCount; i += 1) { slices.push(payload.slice(i * 32, (i + 1) * 32)); } return new _signer2.default(args, slices, Type.MESSAGE); } /** * create Confirmation is sent to user by Email when signing up */ }, { key: 'createConf', value: function createConf() {for (var _len16 = arguments.length, args = Array(_len16), _key16 = 0; _key16 < _len16; _key16++) {args[_key16] = arguments[_key16];} // eslint-disable-line class-methods-use-this var accountId = args[0],_args$3 = args[1],created = _args$3 === undefined ? Math.floor(Date.now() / 1000) : _args$3; var payload = Buffer.alloc(32, 0); // <1 bytes 0x00 space for v> payload.writeUInt8(0, 0); // <4 bytes created time> payload.writeUInt32BE(created, 1); // <16 bytes account uuid> payload.write(accountId.replace(/-/g, ''), 5, 'hex'); return new _signer2.default(args, [payload], Type.CREATE_CONF); } /** * reset Confirmation is sent to user by Email when asking for password reset */ }, { key: 'resetConf', value: function resetConf() {for (var _len17 = arguments.length, args = Array(_len17), _key17 = 0; _key17 < _len17; _key17++) {args[_key17] = arguments[_key17];} // eslint-disable-line class-methods-use-this var accountId = args[0],oldSignerAddr = args[1],_args$4 = args[2],created = _args$4 === undefined ? Math.floor(Date.now() / 1000) : _args$4; var payload = Buffer.alloc(64, 0); // <1 bytes 0x00 space for v> payload.writeUInt8(0, 0); // <4 bytes created time> payload.writeUInt32BE(created, 1); // <16 bytes account uuid> payload.write(accountId.replace(/-/g, ''), 5, 'hex'); // <20 bytes oldSignerAddr> payload.write(oldSignerAddr.replace('0x', ''), 21, 'hex'); return new _signer2.default(args, [payload.slice(0, 32), payload.slice(32, 64)], Type.RESET_CONF); } /** * this receipt is sent to account controller contract * to change the signer address to a new one */ }, { key: 'recover', value: function recover() {for (var _len18 = arguments.length, args = Array(_len18), _key18 = 0; _key18 < _len18; _key18++) {args[_key18] = arguments[_key18];}var nonce = args[0],newSignerAddr = args[1]; // size: 32bytes receipt var payload = Buffer.alloc(32); // <1 bytes 0x00 space for v> payload.writeUInt8(0, 0); // <7 bytes targetAddr> payload.write(this.targetAddr.replace('0x', '').substring(26, 40), 1, 'hex'); // <4 bytes nonce> payload.writeUInt32BE(nonce, 8); // <20 bytes newSignerAddr> payload.write(newSignerAddr.replace('0x', ''), 12, 'hex'); return new _signer2.default(args, [payload], Type.RECOVERY); } }, { key: 'unlockRequest', value: function unlockRequest() {for (var _len19 = arguments.length, args = Array(_len19), _key19 = 0; _key19 < _len19; _key19++) {args[_key19] = arguments[_key19];} // eslint-disable-line class-methods-use-this var newOwner = args[0],_args$5 = args[1],created = _args$5 === undefined ? Math.floor(Date.now() / 1000) : _args$5; var payload = Buffer.alloc(32, 0); // <1 bytes 0x00 space for v> payload.writeUInt8(0, 0); // <4 bytes created time> payload.writeUInt32BE(created, 1); // <20 bytes newOwner> payload.write(newOwner.replace('0x', ''), 5, 'hex'); return new _signer2.default(args, [payload], Type.UNLOCK_REQUEST); } }, { key: 'unlock', value: function unlock() {for (var _len20 = arguments.length, args = Array(_len20), _key20 = 0; _key20 < _len20; _key20++) {args[_key20] = arguments[_key20];}var newOwner = args[0]; // make leave receipt // size: 32bytes receipt var payload = Buffer.alloc(32); // <1 bytes 0x00 space for v> payload.writeUInt8(0, 0); // <11 bytes targetAddr> payload.write(this.targetAddr.replace('0x', '').substring(18, 40), 1, 'hex'); // <20 bytes signerAddr> payload.write(newOwner.replace('0x', ''), 12, 'hex'); return new _signer2.default(args, [payload], Type.UNLOCK); } }], [{ key: 'parseToParams', value: function parseToParams( receipt) { var bufs = this.parseToBuf(receipt); if (bufs.type === Type.SETTLE) { var v = bufs.parts[2].readUInt8(0); bufs.parts[2].writeUInt8(0, 0); return ['0x' + v.toString(16) + bufs.parts[0].toString('hex') + bufs.parts[1].toString('hex'), '0x' + bufs.parts[2].toString('hex'), '0x' + bufs.parts[3].toString('hex')]; } return bufs.parts.map(function (buf) {return '0x' + buf.toString('hex');}); } }, { key: 'parse', value: function parse( receipt) { var bufs = this.parseToBuf(receipt); var rv = { signer: bufs.signer, type: bufs.type }; switch (bufs.type) { case Type.WAIT:{ rv.created = bufs.parts[2].readUInt32BE(1); rv.tableAddr = '0x' + bufs.parts[2].slice(5, 25).toString('hex'); break; } case Type.RESET_CONF:{ var p = bufs.parts[2]; var p2 = bufs.parts[3]; rv.created = p.readUInt32BE(1); rv.accountId = p.slice(5, 9).toString('hex') + '-' + p.slice(9, 11).toString('hex') + '-' + p.slice(11, 13).toString('hex') + '-' + p.slice(13, 15).toString('hex') + '-' + p.slice(15, 21).toString('hex'); rv.oldSignerAddr = '0x' + p.slice(21, 32).toString('hex') + p2.slice(0, 9).toString('hex'); break; } case Type.CREATE_CONF:{ var _p = bufs.parts[2]; rv.created = _p.readUInt32BE(1); rv.accountId = _p.slice(5, 9).toString('hex') + '-' + _p.slice(9, 11).toString('hex') + '-' + _p.slice(11, 13).toString('hex') + '-' + _p.slice(13, 15).toString('hex') + '-' + _p.slice(15, 21).toString('hex'); break; } case Type.LEAVE:{ rv.handId = bufs.parts[2].readUInt32BE(8); rv.leaverAddr = '0x' + bufs.parts[2].slice(12, 32).toString('hex'); break; } case Type.UNLOCK_REQUEST:{ rv.created = bufs.parts[2].readUInt32BE(1); rv.newOwner = '0x' + bufs.parts[2].slice(5, 25).toString('hex'); break; } case Type.SETTLE:{ var payload = Buffer.concat([bufs.parts[2], bufs.parts[3]]); rv.amounts = []; for (var i = 0; i < 10; i += 1) { rv.amounts[i] = new _bignumber2.default(payload.readIntBE(4 + i * 6, 6)).mul(jozDecimals); } rv.handsNetted = bufs.parts[2].readUInt8(2); rv.lhnByte = bufs.parts[2].readUInt8(3); break; } case Type.CHECK_PRE: case Type.CHECK_FLOP: case Type.CHECK_TURN: case Type.CHECK_RIVER: case Type.FOLD: case Type.SIT_OUT: case Type.SHOW: case Type.BET:{ rv.handId = bufs.parts[2].readUInt32BE(4); rv.amount = new _bignumber2.default(bufs.parts[2].readUIntBE(9, 6)).mul(jozDecimals); break; } case Type.DIST:{ rv.handId = bufs.parts[2].readUInt32BE(4); rv.claimId = bufs.parts[2].readUInt8(9); rv.outs = []; var size = bufs.parts[2].readUInt8(10); for (var _i = 0; _i < size; _i += 1) { var pos = bufs.parts[2].readUInt8(11 + _i * 7); var amount = new _bignumber2.default(bufs.parts[2].readUIntBE(12 + _i * 7, 6)).mul(jozDecimals); rv.outs[pos] = amount; } for (var _i2 = 0; _i2 < rv.outs.length; _i2 += 1) { if (!rv.outs[_i2]) { rv.outs[_i2] = new _bignumber2.default(0); } } break; } case Type.RECOVERY:{ rv.nonce = bufs.parts[2].readUInt32BE(8); rv.newSignerAddr = '0x' + bufs.parts[2].slice(12, 32).toString('hex'); break; } case Type.UNLOCK:{ rv.newOwner = '0x' + bufs.parts[2].slice(12, 32).toString('hex'); break; } case Type.FORWARD:{ rv.nonce = bufs.parts[2].readUInt32BE(8); rv.destinationAddr = '0x' + bufs.parts[2].slice(12, 32).toString('hex'); rv.amount = new _bignumber2.default(bufs.parts[3].toString('hex'), 16); rv.data = '0x' + bufs.parts[4].toString('hex'); break; } case Type.MESSAGE:{ rv.created = parseInt(bufs.parts[2].slice(1, 8).toString('hex'), 16); rv.tableAddr = '0x' + bufs.parts[2].slice(8, 28).toString('hex'); var msgLength = bufs.parts[2].readUInt32BE(28); var partsLength = Math.floor(msgLength / 32) + 1; rv.message = ''; for (var _i3 = 0; _i3 < partsLength; _i3 += 1) { if (msgLength >= 32) { rv.message += bufs.parts[3 + _i3].toString('utf8'); } else { rv.message += bufs.parts[3 + _i3].slice(0, msgLength).toString('utf8'); } msgLength -= 32; } break; } default:{ throw new Error('unknown receipt type: ' + bufs.type + '.'); }} return rv; } }, { key: 'parseToBuf', value: function parseToBuf( receipt) { var parts = receipt.split('.'); if (parts.length < 4) { throw new Error('malformed receipt.'); } var headBuf = Buffer.alloc(3); headBuf.write(parts[0], 'base64'); var type = headBuf.readUInt8(0); var r = Buffer.alloc(32); r.write(parts[1], 'base64'); var s = Buffer.alloc(32); s.write(parts[2], 'base64'); var first = Buffer.alloc(32); first.write(parts[3], 'base64'); var v = first.readUInt8(0); first.writeUInt8(0, 0); var partBufs = [r, s]; var hash = void 0; switch (type) { case Type.UNLOCK_REQUEST: case Type.CREATE_CONF: case Type.RECOVERY: case Type.BET: case Type.CHECK_PRE: case Type.CHECK_FLOP: case Type.CHECK_TURN: case Type.CHECK_RIVER: case Type.FOLD: case Type.SIT_OUT: case Type.SHOW: case Type.UNLOCK: case Type.WAIT: case Type.LEAVE:{ hash = _ethereumjsUtil2.default.sha3(first); first.writeUInt8(v, 0); partBufs.push(first); break; } case Type.FORWARD:{ var dataLength = Buffer.byteLength(parts[5], 'base64'); var data = Buffer.alloc(dataLength); data.write(parts[5], 'base64'); var amountBuf = Buffer.alloc(32); amountBuf.write(parts[4], 'base64'); hash = _ethereumjsUtil2.default.sha3(Buffer.concat([first, amountBuf, data])); first.writeUInt8(v, 0); partBufs.push(first); partBufs.push(amountBuf); partBufs.push(data); break; } case Type.SETTLE: case Type.RESET_CONF: case Type.DIST:{ var second = Buffer.alloc(32); second.write(parts[4], 'base64'); hash = _ethereumjsUtil2.default.sha3(Buffer.concat([first, second])); first.writeUInt8(v, 0); partBufs.push(first); partBufs.push(second); break; } case Type.MESSAGE:{ partBufs.push(null); var payloadBufs = [first]; for (var i = 4; i < parts.length; i += 1) { var partBuf = Buffer.alloc(32); partBuf.write(parts[i], 'base64'); partBufs.push(partBuf); payloadBufs.push(partBuf); } hash = _ethereumjsUtil2.default.sha3(Buffer.concat(payloadBufs)); first.writeUInt8(v, 0); partBufs[2] = first; break; } default:{ throw new Error('unknown receipt type: ' + type + '.'); }} var pub = _ethereumjsUtil2.default.ecrecover(hash, v, r, s); var signer = _ethereumjsUtil2.default.publicToAddress(pub); if (headBuf[1] !== signer[18] || headBuf[2] !== signer[19]) { throw new Error('signature verification failed'); } return { type: type, parts: partBufs, signer: '0x' + signer.toString('hex') }; } }]);return Receipt;}();exports.default = Receipt;