|
|
@ -1,20 +1,20 @@ |
|
|
|
const assert = require('assert') |
|
|
|
const assert = require('assert') |
|
|
|
const extend = require('xtend') |
|
|
|
// const extend = require('xtend')
|
|
|
|
const EventEmitter = require('events') |
|
|
|
const EventEmitter = require('events') |
|
|
|
const ethUtil = require('ethereumjs-util') |
|
|
|
const ethUtil = require('ethereumjs-util') |
|
|
|
const EthTx = require('ethereumjs-tx') |
|
|
|
const EthTx = require('ethereumjs-tx') |
|
|
|
const ObservableStore = require('obs-store') |
|
|
|
const ObservableStore = require('obs-store') |
|
|
|
const STORAGE_KEY = 'metamask-persistance-key' |
|
|
|
// const STORAGE_KEY = 'metamask-persistance-key'
|
|
|
|
const TransactionManager = require('../../app/scripts/transaction-manager') |
|
|
|
const TransactionManager = require('../../app/scripts/transaction-manager') |
|
|
|
const noop = () => true |
|
|
|
const noop = () => true |
|
|
|
const currentNetworkId = 42 |
|
|
|
const currentNetworkId = 42 |
|
|
|
const otherNetworkId = 36 |
|
|
|
const otherNetworkId = 36 |
|
|
|
const privKey = new Buffer('8718b9618a37d1fc78c436511fc6df3c8258d3250635bba617f33003270ec03e', 'hex') |
|
|
|
const privKey = new Buffer('8718b9618a37d1fc78c436511fc6df3c8258d3250635bba617f33003270ec03e', 'hex') |
|
|
|
|
|
|
|
|
|
|
|
describe('Transaction Manager', function() { |
|
|
|
describe('Transaction Manager', function () { |
|
|
|
let txManager |
|
|
|
let txManager |
|
|
|
|
|
|
|
|
|
|
|
beforeEach(function() { |
|
|
|
beforeEach(function () { |
|
|
|
txManager = new TransactionManager({ |
|
|
|
txManager = new TransactionManager({ |
|
|
|
networkStore: new ObservableStore({ network: currentNetworkId }), |
|
|
|
networkStore: new ObservableStore({ network: currentNetworkId }), |
|
|
|
txHistoryLimit: 10, |
|
|
|
txHistoryLimit: 10, |
|
|
@ -22,43 +22,43 @@ describe('Transaction Manager', function() { |
|
|
|
signTransaction: (ethTx) => new Promise((resolve) => { |
|
|
|
signTransaction: (ethTx) => new Promise((resolve) => { |
|
|
|
ethTx.sign(privKey) |
|
|
|
ethTx.sign(privKey) |
|
|
|
resolve() |
|
|
|
resolve() |
|
|
|
}) |
|
|
|
}), |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
describe('#validateTxParams', function () { |
|
|
|
describe('#validateTxParams', function () { |
|
|
|
it('returns null for positive values', function() { |
|
|
|
it('returns null for positive values', function () { |
|
|
|
var sample = { |
|
|
|
var sample = { |
|
|
|
value: '0x01' |
|
|
|
value: '0x01', |
|
|
|
} |
|
|
|
} |
|
|
|
var res = txManager.txProviderUtils.validateTxParams(sample, (err) => { |
|
|
|
txManager.txProviderUtils.validateTxParams(sample, (err) => { |
|
|
|
assert.equal(err, null, 'no error') |
|
|
|
assert.equal(err, null, 'no error') |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
it('returns error for negative values', function() { |
|
|
|
it('returns error for negative values', function () { |
|
|
|
var sample = { |
|
|
|
var sample = { |
|
|
|
value: '-0x01' |
|
|
|
value: '-0x01', |
|
|
|
} |
|
|
|
} |
|
|
|
var res = txManager.txProviderUtils.validateTxParams(sample, (err) => { |
|
|
|
txManager.txProviderUtils.validateTxParams(sample, (err) => { |
|
|
|
assert.ok(err, 'error') |
|
|
|
assert.ok(err, 'error') |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
describe('#getTxList', function() { |
|
|
|
describe('#getTxList', function () { |
|
|
|
it('when new should return empty array', function() { |
|
|
|
it('when new should return empty array', function () { |
|
|
|
var result = txManager.getTxList() |
|
|
|
var result = txManager.getTxList() |
|
|
|
assert.ok(Array.isArray(result)) |
|
|
|
assert.ok(Array.isArray(result)) |
|
|
|
assert.equal(result.length, 0) |
|
|
|
assert.equal(result.length, 0) |
|
|
|
}) |
|
|
|
}) |
|
|
|
it('should also return transactions from local storage if any', function() { |
|
|
|
it('should also return transactions from local storage if any', function () { |
|
|
|
|
|
|
|
|
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
describe('#addTx', function() { |
|
|
|
describe('#addTx', function () { |
|
|
|
it('adds a tx returned in getTxList', function() { |
|
|
|
it('adds a tx returned in getTxList', function () { |
|
|
|
var tx = { id: 1, status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
var tx = { id: 1, status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
var result = txManager.getTxList() |
|
|
|
var result = txManager.getTxList() |
|
|
@ -67,7 +67,7 @@ describe('Transaction Manager', function() { |
|
|
|
assert.equal(result[0].id, 1) |
|
|
|
assert.equal(result[0].id, 1) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
it('does not override txs from other networks', function() { |
|
|
|
it('does not override txs from other networks', function () { |
|
|
|
var tx = { id: 1, status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
var tx = { id: 1, status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
var tx2 = { id: 2, status: 'confirmed', metamaskNetworkId: otherNetworkId, txParams: {} } |
|
|
|
var tx2 = { id: 2, status: 'confirmed', metamaskNetworkId: otherNetworkId, txParams: {} } |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
txManager.addTx(tx, noop) |
|
|
@ -78,10 +78,10 @@ describe('Transaction Manager', function() { |
|
|
|
assert.equal(result2.length, 1, 'incorrect number of txs on network.') |
|
|
|
assert.equal(result2.length, 1, 'incorrect number of txs on network.') |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
it('cuts off early txs beyond a limit', function() { |
|
|
|
it('cuts off early txs beyond a limit', function () { |
|
|
|
const limit = txManager.txHistoryLimit |
|
|
|
const limit = txManager.txHistoryLimit |
|
|
|
for (let i = 0; i < limit + 1; i++) { |
|
|
|
for (let i = 0; i < limit + 1; i++) { |
|
|
|
let tx = { id: i, time: new Date(), status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
const tx = { id: i, time: new Date(), status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
} |
|
|
|
} |
|
|
|
var result = txManager.getTxList() |
|
|
|
var result = txManager.getTxList() |
|
|
@ -89,10 +89,10 @@ describe('Transaction Manager', function() { |
|
|
|
assert.equal(result[0].id, 1, 'early txs truncted') |
|
|
|
assert.equal(result[0].id, 1, 'early txs truncted') |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
it('cuts off early txs beyond a limit whether or not it is confirmed or rejected', function() { |
|
|
|
it('cuts off early txs beyond a limit whether or not it is confirmed or rejected', function () { |
|
|
|
const limit = txManager.txHistoryLimit |
|
|
|
const limit = txManager.txHistoryLimit |
|
|
|
for (let i = 0; i < limit + 1; i++) { |
|
|
|
for (let i = 0; i < limit + 1; i++) { |
|
|
|
let tx = { id: i, time: new Date(), status: 'rejected', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
const tx = { id: i, time: new Date(), status: 'rejected', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
} |
|
|
|
} |
|
|
|
var result = txManager.getTxList() |
|
|
|
var result = txManager.getTxList() |
|
|
@ -100,12 +100,12 @@ describe('Transaction Manager', function() { |
|
|
|
assert.equal(result[0].id, 1, 'early txs truncted') |
|
|
|
assert.equal(result[0].id, 1, 'early txs truncted') |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
it('cuts off early txs beyond a limit but does not cut unapproved txs', function() { |
|
|
|
it('cuts off early txs beyond a limit but does not cut unapproved txs', function () { |
|
|
|
var unconfirmedTx = { id: 0, time: new Date(), status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
var unconfirmedTx = { id: 0, time: new Date(), status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
txManager.addTx(unconfirmedTx, noop) |
|
|
|
txManager.addTx(unconfirmedTx, noop) |
|
|
|
const limit = txManager.txHistoryLimit |
|
|
|
const limit = txManager.txHistoryLimit |
|
|
|
for (let i = 1; i < limit + 1; i++) { |
|
|
|
for (let i = 1; i < limit + 1; i++) { |
|
|
|
let tx = { id: i, time: new Date(), status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
const tx = { id: i, time: new Date(), status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
} |
|
|
|
} |
|
|
|
var result = txManager.getTxList() |
|
|
|
var result = txManager.getTxList() |
|
|
@ -116,8 +116,8 @@ describe('Transaction Manager', function() { |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
describe('#setTxStatusSigned', function() { |
|
|
|
describe('#setTxStatusSigned', function () { |
|
|
|
it('sets the tx status to signed', function() { |
|
|
|
it('sets the tx status to signed', function () { |
|
|
|
var tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
var tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
txManager.addTx(tx, noop) |
|
|
|
txManager.setTxStatusSigned(1) |
|
|
|
txManager.setTxStatusSigned(1) |
|
|
@ -130,7 +130,7 @@ describe('Transaction Manager', function() { |
|
|
|
it('should emit a signed event to signal the exciton of callback', (done) => { |
|
|
|
it('should emit a signed event to signal the exciton of callback', (done) => { |
|
|
|
this.timeout(10000) |
|
|
|
this.timeout(10000) |
|
|
|
var tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
var tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
let noop = function () { |
|
|
|
const noop = function () { |
|
|
|
assert(true, 'event listener has been triggered and noop executed') |
|
|
|
assert(true, 'event listener has been triggered and noop executed') |
|
|
|
done() |
|
|
|
done() |
|
|
|
} |
|
|
|
} |
|
|
@ -140,8 +140,8 @@ describe('Transaction Manager', function() { |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
describe('#setTxStatusRejected', function() { |
|
|
|
describe('#setTxStatusRejected', function () { |
|
|
|
it('sets the tx status to rejected', function() { |
|
|
|
it('sets the tx status to rejected', function () { |
|
|
|
var tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
var tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
txManager.addTx(tx) |
|
|
|
txManager.addTx(tx) |
|
|
|
txManager.setTxStatusRejected(1) |
|
|
|
txManager.setTxStatusRejected(1) |
|
|
@ -155,18 +155,17 @@ describe('Transaction Manager', function() { |
|
|
|
this.timeout(10000) |
|
|
|
this.timeout(10000) |
|
|
|
var tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
var tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} } |
|
|
|
txManager.addTx(tx) |
|
|
|
txManager.addTx(tx) |
|
|
|
let noop = function (err, txId) { |
|
|
|
const noop = function (err, txId) { |
|
|
|
assert(true, 'event listener has been triggered and noop executed') |
|
|
|
assert(true, 'event listener has been triggered and noop executed') |
|
|
|
done() |
|
|
|
done() |
|
|
|
} |
|
|
|
} |
|
|
|
txManager.on('1:rejected', noop) |
|
|
|
txManager.on('1:rejected', noop) |
|
|
|
txManager.setTxStatusRejected(1) |
|
|
|
txManager.setTxStatusRejected(1) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
describe('#updateTx', function() { |
|
|
|
describe('#updateTx', function () { |
|
|
|
it('replaces the tx with the same id', function() { |
|
|
|
it('replaces the tx with the same id', function () { |
|
|
|
txManager.addTx({ id: '1', status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.addTx({ id: '1', status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.addTx({ id: '2', status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.addTx({ id: '2', status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.updateTx({ id: '1', status: 'blah', hash: 'foo', metamaskNetworkId: currentNetworkId, txParams: {} }) |
|
|
|
txManager.updateTx({ id: '1', status: 'blah', hash: 'foo', metamaskNetworkId: currentNetworkId, txParams: {} }) |
|
|
@ -175,19 +174,19 @@ describe('Transaction Manager', function() { |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
describe('#getUnapprovedTxList', function() { |
|
|
|
describe('#getUnapprovedTxList', function () { |
|
|
|
it('returns unapproved txs in a hash', function() { |
|
|
|
it('returns unapproved txs in a hash', function () { |
|
|
|
txManager.addTx({ id: '1', status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.addTx({ id: '1', status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.addTx({ id: '2', status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.addTx({ id: '2', status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
let result = txManager.getUnapprovedTxList() |
|
|
|
const result = txManager.getUnapprovedTxList() |
|
|
|
assert.equal(typeof result, 'object') |
|
|
|
assert.equal(typeof result, 'object') |
|
|
|
assert.equal(result['1'].status, 'unapproved') |
|
|
|
assert.equal(result['1'].status, 'unapproved') |
|
|
|
assert.equal(result['2'], undefined) |
|
|
|
assert.equal(result['2'], undefined) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
describe('#getTx', function() { |
|
|
|
describe('#getTx', function () { |
|
|
|
it('returns a tx with the requested id', function() { |
|
|
|
it('returns a tx with the requested id', function () { |
|
|
|
txManager.addTx({ id: '1', status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.addTx({ id: '1', status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.addTx({ id: '2', status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.addTx({ id: '2', status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
assert.equal(txManager.getTx('1').status, 'unapproved') |
|
|
|
assert.equal(txManager.getTx('1').status, 'unapproved') |
|
|
@ -195,19 +194,19 @@ describe('Transaction Manager', function() { |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
describe('#getFilteredTxList', function() { |
|
|
|
describe('#getFilteredTxList', function () { |
|
|
|
it('returns a tx with the requested data', function() { |
|
|
|
it('returns a tx with the requested data', function () { |
|
|
|
let txMetas = [ |
|
|
|
const txMetas = [ |
|
|
|
{ id: 0, status: 'unapproved', txParams: { from: '0xaa', to: '0xbb' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 0, status: 'unapproved', txParams: { from: '0xaa', to: '0xbb' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 1, status: 'unapproved', txParams: { from: '0xaa', to: '0xbb' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 1, status: 'unapproved', txParams: { from: '0xaa', to: '0xbb' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 2, status: 'unapproved', txParams: { from: '0xaa', to: '0xbb' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 2, status: 'unapproved', txParams: { from: '0xaa', to: '0xbb' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 3, status: 'unapproved', txParams: { from: '0xbb', to: '0xaa' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 3, status: 'unapproved', txParams: { from: '0xbb', to: '0xaa' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 4, status: 'unapproved', txParams: { from: '0xbb', to: '0xaa' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 4, status: 'unapproved', txParams: { from: '0xbb', to: '0xaa' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 5, status: 'confirmed', txParams: { from: '0xaa', to: '0xbb' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 5, status: 'confirmed', txParams: { from: '0xaa', to: '0xbb' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 6, status: 'confirmed', txParams: { from: '0xaa', to: '0xbb' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 6, status: 'confirmed', txParams: { from: '0xaa', to: '0xbb' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 7, status: 'confirmed', txParams: { from: '0xbb', to: '0xaa' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 7, status: 'confirmed', txParams: { from: '0xbb', to: '0xaa' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 8, status: 'confirmed', txParams: { from: '0xbb', to: '0xaa' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 8, status: 'confirmed', txParams: { from: '0xbb', to: '0xaa' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 9, status: 'confirmed', txParams: { from: '0xbb', to: '0xaa' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
{ id: 9, status: 'confirmed', txParams: { from: '0xbb', to: '0xaa' }, metamaskNetworkId: currentNetworkId }, |
|
|
|
] |
|
|
|
] |
|
|
|
txMetas.forEach((txMeta) => txManager.addTx(txMeta, noop)) |
|
|
|
txMetas.forEach((txMeta) => txManager.addTx(txMeta, noop)) |
|
|
|
let filterParams |
|
|
|
let filterParams |
|
|
@ -227,8 +226,8 @@ describe('Transaction Manager', function() { |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
describe('#sign replay-protected tx', function() { |
|
|
|
describe('#sign replay-protected tx', function () { |
|
|
|
it('prepares a tx with the chainId set', function() { |
|
|
|
it('prepares a tx with the chainId set', function () { |
|
|
|
txManager.addTx({ id: '1', status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.addTx({ id: '1', status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }, noop) |
|
|
|
txManager.signTransaction('1', (err, rawTx) => { |
|
|
|
txManager.signTransaction('1', (err, rawTx) => { |
|
|
|
if (err) return assert.fail('it should not fail') |
|
|
|
if (err) return assert.fail('it should not fail') |
|
|
@ -237,5 +236,4 @@ describe('Transaction Manager', function() { |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
}) |
|
|
|
}) |
|
|
|