From 1117244e76c141f8ad0fda981b11d6662890df31 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Tue, 18 Jul 2017 11:32:23 +0200 Subject: [PATCH 1/6] Update dapp in transfer creator for schema --- lib/transactions/crypto.js | 10 ++++------ lib/transactions/transfer.js | 4 ++-- test/transactions/transfer.js | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/transactions/crypto.js b/lib/transactions/crypto.js index a005fc13b..e8301c692 100644 --- a/lib/transactions/crypto.js +++ b/lib/transactions/crypto.js @@ -40,7 +40,7 @@ var fixedPoint = Math.pow(10, 8); */ function getTransactionBytes (transaction) { - + /** * @method isSendTransaction * @return {object} @@ -177,13 +177,11 @@ function getTransactionBytes (transaction) { */ function isDappTransferTransaction () { - var arrayBuf = new Buffer([]); - var dappBuffer = Buffer.from(transaction.asset.dapptransfer.dappid); - arrayBuf = Buffer.concat([arrayBuf, dappBuffer]); + var buf = Buffer.from(transaction.asset.inTransfer.dappId); return { - assetBytes: arrayBuf, - assetSize: arrayBuf.length + assetBytes: buf, + assetSize: buf.length }; } diff --git a/lib/transactions/transfer.js b/lib/transactions/transfer.js index 4b1a3f2d2..e75784eba 100644 --- a/lib/transactions/transfer.js +++ b/lib/transactions/transfer.js @@ -44,8 +44,8 @@ function createTransfer (secret, secondSecret, dappId, timeOffset) { senderPublicKey: keys.publicKey, timestamp: slots.getTime(time), asset: { - dapptransfer: { - dappid: dappId + inTransfer: { + dappId: dappId } } }; diff --git a/test/transactions/transfer.js b/test/transactions/transfer.js index 17cb76d18..adf3c44f6 100644 --- a/test/transactions/transfer.js +++ b/test/transactions/transfer.js @@ -37,7 +37,7 @@ describe('transfer.js', function () { }); it('should create a transfer dapp transaction with dapp id in asset', function () { - (transferTransaction.asset.dapptransfer.dappid).should.be.equal('1234213'); + (transferTransaction.asset.inTransfer.dappId).should.be.equal('1234213'); }); it('should create a transfer dapp transaction with first signature', function () { From 335a2f6987202c1244068a876fda600fdfa77c61 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Tue, 18 Jul 2017 11:38:03 +0200 Subject: [PATCH 2/6] Rename dapp createInTransfer function --- lib/transactions/transfer.js | 6 +++--- test/transactions/transfer.js | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/transactions/transfer.js b/lib/transactions/transfer.js index e75784eba..944feadb4 100644 --- a/lib/transactions/transfer.js +++ b/lib/transactions/transfer.js @@ -22,7 +22,7 @@ var constants = require('../constants.js'); var slots = require('../time/slots.js'); /** - * @method createTransfer + * @method createInTransfer * @param secret * @param secondSecret * @param dappId @@ -31,7 +31,7 @@ var slots = require('../time/slots.js'); * @return {Object} */ -function createTransfer (secret, secondSecret, dappId, timeOffset) { +function createInTransfer (secret, secondSecret, dappId, timeOffset) { var now = new Date().getTime(); var time = timeOffset ? now - timeOffset : now; var keys = crypto.getKeys(secret); @@ -62,5 +62,5 @@ function createTransfer (secret, secondSecret, dappId, timeOffset) { } module.exports = { - createTransfer: createTransfer + createInTransfer: createInTransfer }; diff --git a/test/transactions/transfer.js b/test/transactions/transfer.js index adf3c44f6..12419e0b2 100644 --- a/test/transactions/transfer.js +++ b/test/transactions/transfer.js @@ -16,16 +16,16 @@ describe('transfer.js', function () { }); it('should have properties', function () { - (transfer).should.have.property('createTransfer'); + (transfer).should.have.property('createInTransfer'); }); - describe('#createTransfer', function () { + describe('#createInTransfer', function () { - var createTransfer = lisk.transfer.createTransfer; - var transferTransaction = createTransfer('secret', 'secondSecret', '1234213'); + var createInTransfer = lisk.transfer.createInTransfer; + var transferTransaction = createInTransfer('secret', 'secondSecret', '1234213'); it('should be a function', function () { - (createTransfer).should.be.type('function'); + (createInTransfer).should.be.type('function'); }); it('should create a transfer dapp transaction', function () { @@ -49,9 +49,9 @@ describe('transfer.js', function () { }); it('should create a transfer dapp transaction with just one signature', function () { - var transferTransactionOneSignature = createTransfer('secret', '', '1234213'); - (transferTransactionOneSignature.signature).should.be.ok; - expect(transferTransactionOneSignature.secondSignature).to.be.undefined; + var transferTransactionOneSignature = createInTransfer('secret', '', '1234213'); + (transferTransactionOneSignature.signature).should.be.ok(); + (transferTransactionOneSignature).should.not.have.property('secondSignature'); }); it('should use time slots to get the time for the timestamp', function () { @@ -60,7 +60,7 @@ describe('transfer.js', function () { var time = 36174862; var stub = sinon.stub(slots, 'getTime').returns(time); - var trs = createTransfer('secret', null, '1234213'); + var trs = createInTransfer('secret', null, '1234213'); (trs).should.have.property('timestamp').and.be.equal(time); (stub.calledWithExactly(now.getTime())).should.be.true(); @@ -76,7 +76,7 @@ describe('transfer.js', function () { var time = 36174862; var stub = sinon.stub(slots, 'getTime').returns(time); - var trs = createTransfer('secret', null, '1234213', offset); + var trs = createInTransfer('secret', null, '1234213', offset); (trs).should.have.property('timestamp').and.be.equal(time); (stub.calledWithExactly(now.getTime() - offset)).should.be.true(); From 6e8aaa98ac9a12256e91b72cf1782420e395cb44 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Tue, 18 Jul 2017 11:42:46 +0200 Subject: [PATCH 3/6] Rearrange createInTransfer argument order --- lib/transactions/transfer.js | 2 +- test/transactions/transfer.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/transactions/transfer.js b/lib/transactions/transfer.js index 944feadb4..00c356ada 100644 --- a/lib/transactions/transfer.js +++ b/lib/transactions/transfer.js @@ -31,7 +31,7 @@ var slots = require('../time/slots.js'); * @return {Object} */ -function createInTransfer (secret, secondSecret, dappId, timeOffset) { +function createInTransfer (dappId, secret, secondSecret, timeOffset) { var now = new Date().getTime(); var time = timeOffset ? now - timeOffset : now; var keys = crypto.getKeys(secret); diff --git a/test/transactions/transfer.js b/test/transactions/transfer.js index 12419e0b2..d404078d2 100644 --- a/test/transactions/transfer.js +++ b/test/transactions/transfer.js @@ -22,7 +22,7 @@ describe('transfer.js', function () { describe('#createInTransfer', function () { var createInTransfer = lisk.transfer.createInTransfer; - var transferTransaction = createInTransfer('secret', 'secondSecret', '1234213'); + var transferTransaction = createInTransfer('1234213', 'secret', 'secondSecret'); it('should be a function', function () { (createInTransfer).should.be.type('function'); @@ -49,7 +49,7 @@ describe('transfer.js', function () { }); it('should create a transfer dapp transaction with just one signature', function () { - var transferTransactionOneSignature = createInTransfer('secret', '', '1234213'); + var transferTransactionOneSignature = createInTransfer('1234213', 'secret'); (transferTransactionOneSignature.signature).should.be.ok(); (transferTransactionOneSignature).should.not.have.property('secondSignature'); }); @@ -60,7 +60,7 @@ describe('transfer.js', function () { var time = 36174862; var stub = sinon.stub(slots, 'getTime').returns(time); - var trs = createInTransfer('secret', null, '1234213'); + var trs = createInTransfer('1234213', 'secret'); (trs).should.have.property('timestamp').and.be.equal(time); (stub.calledWithExactly(now.getTime())).should.be.true(); @@ -76,7 +76,7 @@ describe('transfer.js', function () { var time = 36174862; var stub = sinon.stub(slots, 'getTime').returns(time); - var trs = createInTransfer('secret', null, '1234213', offset); + var trs = createInTransfer('1234213', 'secret', null, offset); (trs).should.have.property('timestamp').and.be.equal(time); (stub.calledWithExactly(now.getTime() - offset)).should.be.true(); From 259e70e3e26e4b6dc907bb9d74fb6efa1de6a2e1 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Tue, 18 Jul 2017 11:46:38 +0200 Subject: [PATCH 4/6] Set amount in createInTransfer --- lib/transactions/transfer.js | 4 ++-- test/transactions/transfer.js | 22 ++++++++++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/transactions/transfer.js b/lib/transactions/transfer.js index 00c356ada..6b4a1c4d6 100644 --- a/lib/transactions/transfer.js +++ b/lib/transactions/transfer.js @@ -31,14 +31,14 @@ var slots = require('../time/slots.js'); * @return {Object} */ -function createInTransfer (dappId, secret, secondSecret, timeOffset) { +function createInTransfer (dappId, amount, secret, secondSecret, timeOffset) { var now = new Date().getTime(); var time = timeOffset ? now - timeOffset : now; var keys = crypto.getKeys(secret); var transaction = { type: 6, - amount: 0, + amount: amount, fee: constants.fees.send, recipientId: null, senderPublicKey: keys.publicKey, diff --git a/test/transactions/transfer.js b/test/transactions/transfer.js index d404078d2..9e82dbeaa 100644 --- a/test/transactions/transfer.js +++ b/test/transactions/transfer.js @@ -4,7 +4,6 @@ if (typeof module !== 'undefined' && module.exports) { var lisk = common.lisk; } describe('transfer.js', function () { - var transfer = lisk.transfer; it('should be ok', function () { @@ -20,9 +19,12 @@ describe('transfer.js', function () { }); describe('#createInTransfer', function () { - - var createInTransfer = lisk.transfer.createInTransfer; - var transferTransaction = createInTransfer('1234213', 'secret', 'secondSecret'); + var createInTransfer = transfer.createInTransfer; + var dappId = '1234213'; + var amount = 10e8; + var secret = 'secret'; + var secondSecret = 'secondSecret'; + var transferTransaction = createInTransfer(dappId, amount, secret, secondSecret); it('should be a function', function () { (createInTransfer).should.be.type('function'); @@ -37,7 +39,11 @@ describe('transfer.js', function () { }); it('should create a transfer dapp transaction with dapp id in asset', function () { - (transferTransaction.asset.inTransfer.dappId).should.be.equal('1234213'); + (transferTransaction.asset.inTransfer.dappId).should.be.equal(dappId); + }); + + it('should create a transfer dapp transaction with a provided amount', function () { + (transferTransaction.amount).should.be.equal(amount); }); it('should create a transfer dapp transaction with first signature', function () { @@ -49,7 +55,7 @@ describe('transfer.js', function () { }); it('should create a transfer dapp transaction with just one signature', function () { - var transferTransactionOneSignature = createInTransfer('1234213', 'secret'); + var transferTransactionOneSignature = createInTransfer(dappId, amount, secret); (transferTransactionOneSignature.signature).should.be.ok(); (transferTransactionOneSignature).should.not.have.property('secondSignature'); }); @@ -60,7 +66,7 @@ describe('transfer.js', function () { var time = 36174862; var stub = sinon.stub(slots, 'getTime').returns(time); - var trs = createInTransfer('1234213', 'secret'); + var trs = createInTransfer(dappId, amount, secret); (trs).should.have.property('timestamp').and.be.equal(time); (stub.calledWithExactly(now.getTime())).should.be.true(); @@ -76,7 +82,7 @@ describe('transfer.js', function () { var time = 36174862; var stub = sinon.stub(slots, 'getTime').returns(time); - var trs = createInTransfer('1234213', 'secret', null, offset); + var trs = createInTransfer(dappId, amount, secret, null, offset); (trs).should.have.property('timestamp').and.be.equal(time); (stub.calledWithExactly(now.getTime() - offset)).should.be.true(); From 11eb93e961f8e3153a26977d9b5e33aa321af933 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Tue, 18 Jul 2017 12:46:46 +0200 Subject: [PATCH 5/6] Add createOutTransfer function --- lib/transactions/crypto.js | 27 ++++-- lib/transactions/transfer.js | 33 +++++++- test/transactions/transfer.js | 153 ++++++++++++++++++++++++++++++---- 3 files changed, 190 insertions(+), 23 deletions(-) diff --git a/lib/transactions/crypto.js b/lib/transactions/crypto.js index e8301c692..ad0786837 100644 --- a/lib/transactions/crypto.js +++ b/lib/transactions/crypto.js @@ -172,11 +172,11 @@ function getTransactionBytes (transaction) { } /** - * @method isDappTransferTransaction + * @method isDappInTransferTransaction * @return {object} */ - function isDappTransferTransaction () { + function isDappInTransferTransaction () { var buf = Buffer.from(transaction.asset.inTransfer.dappId); return { @@ -185,6 +185,22 @@ function getTransactionBytes (transaction) { }; } + /** + * @method isDappOutTransferTransaction + * @return {object} + */ + + function isDappOutTransferTransaction () { + var dappBuf = Buffer.from(transaction.asset.outTransfer.dappId); + var transactionBuf = Buffer.from(transaction.asset.outTransfer.transactionId); + var buf = Buffer.concat([dappBuf, transactionBuf]); + + return { + assetBytes: buf, + assetSize: buf.length + }; + } + /** * `transactionType` describes the available transaction types. * @@ -199,7 +215,8 @@ function getTransactionBytes (transaction) { '3': isVoteTransaction, '4': isMultisignatureTransaction, '5': isDappTransaction, - '6': isDappTransferTransaction + '6': isDappInTransferTransaction, + '7': isDappOutTransferTransaction, }; return transactionType[transaction.type](); @@ -280,7 +297,6 @@ function createTransactionBuffer (transaction, options) { transactionBuffer.writeByte(0); } } - transactionBuffer.writeLong(transaction.amount); if (assetSize > 0) { @@ -358,7 +374,8 @@ function getId (transaction) { */ function getHash (transaction) { - return crypto.createHash('sha256').update(getBytes(transaction)).digest(); + var bytes = getBytes(transaction); + return crypto.createHash('sha256').update(bytes).digest(); } /** diff --git a/lib/transactions/transfer.js b/lib/transactions/transfer.js index 6b4a1c4d6..e711ba47b 100644 --- a/lib/transactions/transfer.js +++ b/lib/transactions/transfer.js @@ -61,6 +61,37 @@ function createInTransfer (dappId, amount, secret, secondSecret, timeOffset) { return transaction; } +function createOutTransfer (dappId, transactionId, recipientId, amount, secret, secondSecret, timeOffset) { + var now = new Date().getTime(); + var time = timeOffset ? now - timeOffset : now; + var keys = crypto.getKeys(secret); + + var transaction = { + type: 7, + amount: amount, + fee: constants.fees.send, + recipientId: recipientId, + senderPublicKey: keys.publicKey, + timestamp: slots.getTime(time), + asset: { + outTransfer: { + dappId: dappId, + transactionId: transactionId, + }, + }, + }; + + crypto.sign(transaction, keys); + + if (secondSecret) { + var secondKeys = crypto.getKeys(secondSecret); + crypto.secondSign(transaction, secondKeys); + } + + return transaction; +} + module.exports = { - createInTransfer: createInTransfer + createInTransfer: createInTransfer, + createOutTransfer: createOutTransfer }; diff --git a/test/transactions/transfer.js b/test/transactions/transfer.js index 9e82dbeaa..5fc7a752d 100644 --- a/test/transactions/transfer.js +++ b/test/transactions/transfer.js @@ -23,41 +23,58 @@ describe('transfer.js', function () { var dappId = '1234213'; var amount = 10e8; var secret = 'secret'; + var publicKey = '5d036a858ce89f844491762eb89e2bfbd50a4a0a0da658e4b2628b25b117ae09'; var secondSecret = 'secondSecret'; - var transferTransaction = createInTransfer(dappId, amount, secret, secondSecret); + var inTransferTransaction = createInTransfer(dappId, amount, secret, secondSecret); it('should be a function', function () { (createInTransfer).should.be.type('function'); }); - it('should create a transfer dapp transaction', function () { - (transferTransaction).should.be.type('object'); + it('should create an in transfer dapp transaction', function () { + (inTransferTransaction).should.be.type('object'); }); - it('should create a transfer dapp transaction type 6', function () { - (transferTransaction.type).should.be.equal(6); + it('should create an in transfer dapp transaction type 6', function () { + (inTransferTransaction).should.have.property('type').be.equal(6); }); - it('should create a transfer dapp transaction with dapp id in asset', function () { - (transferTransaction.asset.inTransfer.dappId).should.be.equal(dappId); + it('should create an in transfer dapp transaction with dapp id in asset', function () { + (inTransferTransaction) + .should.have.property('asset') + .with.property('inTransfer') + .with.property('dappId') + .equal(dappId); }); - it('should create a transfer dapp transaction with a provided amount', function () { - (transferTransaction.amount).should.be.equal(amount); + it('should create an in transfer dapp transaction with a provided amount', function () { + (inTransferTransaction).should.have.property('amount').equal(amount); }); - it('should create a transfer dapp transaction with first signature', function () { - (transferTransaction.signature).should.be.ok; + it('should create an in transfer dapp transaction with a default fee', function () { + (inTransferTransaction).should.have.property('fee').equal(0.1e8); }); - it('should create a transfer dapp transaction with second signature', function () { - (transferTransaction.signSignature).should.be.ok; + it('should create an in transfer dapp transaction with no recipient', function () { + (inTransferTransaction).should.have.property('recipientId').be.null(); }); - it('should create a transfer dapp transaction with just one signature', function () { - var transferTransactionOneSignature = createInTransfer(dappId, amount, secret); - (transferTransactionOneSignature.signature).should.be.ok(); - (transferTransactionOneSignature).should.not.have.property('secondSignature'); + it('should create an in transfer dapp transaction with senderPublicKey', function () { + (inTransferTransaction).should.have.property('senderPublicKey').equal(publicKey); + }); + + it('should create an in transfer dapp transaction with first signature', function () { + (inTransferTransaction).should.have.property('signature').and.be.ok(); + }); + + it('should create an in transfer dapp transaction with second signature', function () { + (inTransferTransaction).should.have.property('signSignature').and.be.ok(); + }); + + it('should create an in transfer dapp transaction with just one signature', function () { + var inTransferTransactionOneSignature = createInTransfer(dappId, amount, secret); + (inTransferTransactionOneSignature).should.have.property('signature').and.be.ok(); + (inTransferTransactionOneSignature).should.not.have.property('secondSignature'); }); it('should use time slots to get the time for the timestamp', function () { @@ -93,4 +110,106 @@ describe('transfer.js', function () { }); + describe('#createOutTransfer', function () { + var createOutTransfer = transfer.createOutTransfer; + var dappId = '1234213'; + var transactionId = '9876567'; + var recipientId = '989234L'; + var amount = 10e8; + var secret = 'secret'; + var publicKey = '5d036a858ce89f844491762eb89e2bfbd50a4a0a0da658e4b2628b25b117ae09'; + var secondSecret = 'secondSecret'; + var outTransferTransaction = createOutTransfer(dappId, transactionId, recipientId, amount, secret, secondSecret); + + it('should be a function', function () { + (createOutTransfer).should.be.type('function'); + }); + + it('should create an out transfer dapp transaction', function () { + (outTransferTransaction).should.be.type('object'); + }); + + it('should create an out transfer dapp transaction type 7', function () { + (outTransferTransaction).should.have.property('type').equal(7); + }); + + it('should create an out transfer dapp transaction with dapp id in asset', function () { + (outTransferTransaction) + .should.have.property('asset') + .with.property('outTransfer') + .with.property('dappId') + .equal(dappId); + }); + + it('should create an out transfer dapp transaction with transaction id in asset', function () { + (outTransferTransaction) + .should.have.property('asset') + .with.property('outTransfer') + .with.property('transactionId') + .equal(transactionId); + }); + + it('should create an out transfer dapp transaction with a provided amount', function () { + (outTransferTransaction).should.have.property('amount').equal(amount); + }); + + it('should create an out transfer dapp transaction with a default fee', function () { + (outTransferTransaction).should.have.property('fee').equal(0.1e8); + }); + + it('should create an out transfer dapp transaction with a provided recipient', function () { + (outTransferTransaction).should.have.property('recipientId').equal(recipientId); + }); + + it('should create an out transfer dapp transaction with senderPublicKey', function () { + (outTransferTransaction).should.have.property('senderPublicKey').equal(publicKey); + }); + + it('should create an out transfer dapp transaction with first signature', function () { + (outTransferTransaction).should.have.property('signature').be.ok(); + }); + + it('should create an out transfer dapp transaction with second signature', function () { + (outTransferTransaction).should.have.property('signSignature').be.ok(); + }); + + it('should create an out transfer dapp transaction with just one signature', function () { + var outTransferTransactionOneSignature = createOutTransfer(dappId, transactionId, recipientId, amount, secret); + (outTransferTransactionOneSignature).should.have.property('signature').be.ok(); + (outTransferTransactionOneSignature).should.not.have.property('secondSignature'); + }); + + it('should use time slots to get the time for the timestamp', function () { + var now = new Date(); + var clock = sinon.useFakeTimers(now, 'Date'); + var time = 36174862; + var stub = sinon.stub(slots, 'getTime').returns(time); + + var trs = createOutTransfer(dappId, transactionId, recipientId, amount, secret); + + (trs).should.have.property('timestamp').and.be.equal(time); + (stub.calledWithExactly(now.getTime())).should.be.true(); + + stub.restore(); + clock.restore(); + }); + + it('should use time slots with an offset to get the time for the timestamp', function () { + var now = new Date(); + var clock = sinon.useFakeTimers(now, 'Date'); + var offset = 10e3; + var time = 36174862; + var stub = sinon.stub(slots, 'getTime').returns(time); + + var trs = createOutTransfer(dappId, transactionId, recipientId, amount, secret, null, offset); + + (trs).should.have.property('timestamp').and.be.equal(time); + (stub.calledWithExactly(now.getTime() - offset)).should.be.true(); + + stub.restore(); + clock.restore(); + }); + + }); + }); From 2608b0018705c12de9980f97bbebddaf95f41fc9 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Tue, 18 Jul 2017 14:28:32 +0200 Subject: [PATCH 6/6] Update yuidoc annotations --- lib/transactions/transfer.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/transactions/transfer.js b/lib/transactions/transfer.js index e711ba47b..67ba2ed3f 100644 --- a/lib/transactions/transfer.js +++ b/lib/transactions/transfer.js @@ -23,9 +23,10 @@ var slots = require('../time/slots.js'); /** * @method createInTransfer + * @param dappId + * @param amount * @param secret * @param secondSecret - * @param dappId * @param timeOffset * * @return {Object} @@ -61,6 +62,19 @@ function createInTransfer (dappId, amount, secret, secondSecret, timeOffset) { return transaction; } +/** + * @method createOutTransfer + * @param dappId + * @param transactionId + * @param recipientId + * @param amount + * @param secret + * @param secondSecret + * @param timeOffset + * + * @return {Object} + */ + function createOutTransfer (dappId, transactionId, recipientId, amount, secret, secondSecret, timeOffset) { var now = new Date().getTime(); var time = timeOffset ? now - timeOffset : now;