From 6fa2b2e7e5771dabc4981425360b283caccfd2ef Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 23 Jun 2017 10:24:23 +0200 Subject: [PATCH 1/4] encode public_keys array for threshold conditions --- src/transaction/makeOutput.js | 14 ++++++++++--- test/transaction/test_cryptoconditions.js | 25 ++++++++++++++--------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/transaction/makeOutput.js b/src/transaction/makeOutput.js index 820f3c3..3e48895 100644 --- a/src/transaction/makeOutput.js +++ b/src/transaction/makeOutput.js @@ -10,10 +10,18 @@ export default function makeOutput(condition, amount = '1') { if (typeof amount !== 'string') { throw new TypeError('`amount` must be of type string') } + const publicKeys = [] + const getPublicKeys = details => { + if (details.type === 'ed25519-sha-256') { + publicKeys.push(details.public_key) + } else if (details.type === 'threshold-sha-256') { + details.subfulfillments.map(getPublicKeys) + } + } + getPublicKeys(condition.details) return { - 'amount': amount, condition, - 'public_keys': condition.details.hasOwnProperty('public_key') ? - [condition.details.public_key] : [], + 'amount': amount, + 'public_keys': publicKeys, } } diff --git a/test/transaction/test_cryptoconditions.js b/test/transaction/test_cryptoconditions.js index a60b87c..34288e9 100644 --- a/test/transaction/test_cryptoconditions.js +++ b/test/transaction/test_cryptoconditions.js @@ -21,19 +21,24 @@ test('Threshold condition encoding', t => { const publicKey = '4zvwRjXUKGfvwnParsHAS3HuSVzV5cA4McphgmoCtajS' const condition = Transaction.makeThresholdCondition( 1, [Transaction.makeEd25519Condition(publicKey, false)]) + const output = Transaction.makeOutput(condition) const target = { - details: { - type: 'threshold-sha-256', - threshold: 1, - subfulfillments: [{ - type: 'ed25519-sha-256', - public_key: publicKey, - signature: null, - }] + condition: { + details: { + type: 'threshold-sha-256', + threshold: 1, + subfulfillments: [{ + type: 'ed25519-sha-256', + public_key: publicKey, + signature: null, + }] + }, + uri: 'ni:///sha-256;VBIfZSoBprUQy-LVNAzaZ2q-eyWbrcPKtBg1PuNXIpQ?fpt=threshold-sha-256&cost=132096&subtypes=ed25519-sha-256', }, - uri: 'ni:///sha-256;VBIfZSoBprUQy-LVNAzaZ2q-eyWbrcPKtBg1PuNXIpQ?fpt=threshold-sha-256&cost=132096&subtypes=ed25519-sha-256' + amount: '1', + public_keys: [publicKey] } - t.deepEqual(target, condition) + t.deepEqual(target, output) }) From b22cf39aa28f4033f6e70ea7e523b5e8de8c1add Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 23 Jun 2017 10:30:08 +0200 Subject: [PATCH 2/4] public_keys array is a set --- src/transaction/makeOutput.js | 4 +++- test/transaction/test_cryptoconditions.js | 22 +++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/transaction/makeOutput.js b/src/transaction/makeOutput.js index 3e48895..bbd628e 100644 --- a/src/transaction/makeOutput.js +++ b/src/transaction/makeOutput.js @@ -13,7 +13,9 @@ export default function makeOutput(condition, amount = '1') { const publicKeys = [] const getPublicKeys = details => { if (details.type === 'ed25519-sha-256') { - publicKeys.push(details.public_key) + if (publicKeys.indexOf(details.public_key) === -1) { + publicKeys.push(details.public_key) + } } else if (details.type === 'threshold-sha-256') { details.subfulfillments.map(getPublicKeys) } diff --git a/test/transaction/test_cryptoconditions.js b/test/transaction/test_cryptoconditions.js index 34288e9..4419451 100644 --- a/test/transaction/test_cryptoconditions.js +++ b/test/transaction/test_cryptoconditions.js @@ -19,21 +19,29 @@ test('Ed25519 condition encoding', t => { test('Threshold condition encoding', t => { const publicKey = '4zvwRjXUKGfvwnParsHAS3HuSVzV5cA4McphgmoCtajS' + const ed25519 = Transaction.makeEd25519Condition(publicKey, false) const condition = Transaction.makeThresholdCondition( - 1, [Transaction.makeEd25519Condition(publicKey, false)]) + 1, [ed25519, ed25519]) const output = Transaction.makeOutput(condition) const target = { condition: { details: { type: 'threshold-sha-256', threshold: 1, - subfulfillments: [{ - type: 'ed25519-sha-256', - public_key: publicKey, - signature: null, - }] + subfulfillments: [ + { + type: 'ed25519-sha-256', + public_key: publicKey, + signature: null, + }, + { + type: 'ed25519-sha-256', + public_key: publicKey, + signature: null, + } + ] }, - uri: 'ni:///sha-256;VBIfZSoBprUQy-LVNAzaZ2q-eyWbrcPKtBg1PuNXIpQ?fpt=threshold-sha-256&cost=132096&subtypes=ed25519-sha-256', + uri: 'ni:///sha-256;xTeBhQj7ae5Tym7cp83fwtkesQnhdwNwDEMIYwnf2g0?fpt=threshold-sha-256&cost=133120&subtypes=ed25519-sha-256', }, amount: '1', public_keys: [publicKey] From 96ce4f39416a2eff89146eba5f90430ab1da01e6 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 23 Jun 2017 10:44:55 +0200 Subject: [PATCH 3/4] fix transaction tests --- test/transaction/test_transaction.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/transaction/test_transaction.js b/test/transaction/test_transaction.js index 1df642f..407bb55 100644 --- a/test/transaction/test_transaction.js +++ b/test/transaction/test_transaction.js @@ -17,6 +17,7 @@ import { test('Create valid output with default amount', t => { const condition = { details: { + type: 'ed25519-sha-256', public_key: 'abc' } } @@ -33,6 +34,7 @@ test('Create valid output with default amount', t => { test('Create valid output with custom amount', t => { const condition = { details: { + type: 'ed25519-sha-256', public_key: 'abc' } } From 69c1fa29a21ad5527b68aa7b476a3f0bb24323ca Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 23 Jun 2017 10:46:31 +0200 Subject: [PATCH 4/4] use includes instead of indexOf --- src/transaction/makeOutput.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transaction/makeOutput.js b/src/transaction/makeOutput.js index bbd628e..5edf426 100644 --- a/src/transaction/makeOutput.js +++ b/src/transaction/makeOutput.js @@ -13,7 +13,7 @@ export default function makeOutput(condition, amount = '1') { const publicKeys = [] const getPublicKeys = details => { if (details.type === 'ed25519-sha-256') { - if (publicKeys.indexOf(details.public_key) === -1) { + if (!publicKeys.includes(details.public_key)) { publicKeys.push(details.public_key) } } else if (details.type === 'threshold-sha-256') {