poker-helper
Version:
utility functions for poker
575 lines (540 loc) • 25.7 kB
JavaScript
'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;