diff --git a/src/transaction/makeTransferTransaction.js b/src/transaction/makeTransferTransaction.js index 3d62bd2..5931ff7 100644 --- a/src/transaction/makeTransferTransaction.js +++ b/src/transaction/makeTransferTransaction.js @@ -5,45 +5,41 @@ import makeTransaction from './makeTransaction' /** * @public * Generate a `TRANSFER` transaction holding the `asset`, `metadata`, and `outputs`, that fulfills - * the `fulfilledOutputs` of `unspentTransaction`. - * @param {object} unspentTransaction Previous Transaction you have control over (i.e. can fulfill - * its Output Condition) - * @param {object} metadata Metadata for the Transaction + * the `fulfilledOutputs` of each `unspentTransaction`. + * @param {object[]} unspentOutputs Array of unspent Transactions' Outputs. + * Each item contains Transaction itself + * and index of unspent Output for that Transaction. * @param {object[]} outputs Array of Output objects to add to the Transaction. * Think of these as the recipients of the asset after the transaction. * For `TRANSFER` Transactions, this should usually just be a list of * Outputs wrapping Ed25519 Conditions generated from the public keys of * the recipients. - * @param {...number} OutputIndices Indices of the Outputs in `unspentTransaction` that this - * Transaction fulfills. - * Note that listed public keys listed must be used (and in - * the same order) to sign the Transaction - * (`signTransaction()`). + * @param {object} metadata Metadata for the Transaction - optional * @returns {object} Unsigned transaction -- make sure to call signTransaction() on it before * sending it off! */ -// TODO: -// - Make `metadata` optional argument export default function makeTransferTransaction( - unspentTransaction, - metadata, + unspentOutputs, outputs, - ...outputIndices + metadata ) { - const inputs = outputIndices.map((outputIndex) => { - const fulfilledOutput = unspentTransaction.outputs[outputIndex] + const inputs = unspentOutputs.map((unspentOutput) => { + const { tx, output_index } = unspentOutput + const fulfilledOutput = tx.outputs[output_index] const transactionLink = { - 'output_index': outputIndex, - 'transaction_id': unspentTransaction.id, + 'output_index': output_index, + 'transaction_id': tx.id, } return makeInputTemplate(fulfilledOutput.public_keys, transactionLink) }) const assetLink = { - 'id': unspentTransaction.operation === 'CREATE' ? unspentTransaction.id - : unspentTransaction.asset.id + 'id': unspentOutputs[0].tx.operation === 'CREATE' ? unspentOutputs[0].tx.id + : unspentOutputs[0].tx.asset.id } - return makeTransaction('TRANSFER', assetLink, metadata, outputs, inputs) + const meta = metadata || null + + return makeTransaction('TRANSFER', assetLink, meta, outputs, inputs) } diff --git a/test/constants.js b/test/constants.js index cbfa4c0..bcd9b5d 100644 --- a/test/constants.js +++ b/test/constants.js @@ -17,10 +17,9 @@ export const createTx = Transaction.makeCreateTransaction( alice.publicKey ) export const transferTx = Transaction.makeTransferTransaction( - createTx, - metaData, + [{ tx: createTx, output_index: 0 }], [aliceOutput], - 0 + metaData ) export const bob = new Ed25519Keypair() diff --git a/test/integration/test_integration.js b/test/integration/test_integration.js index b5e53fe..0d6f49c 100644 --- a/test/integration/test_integration.js +++ b/test/integration/test_integration.js @@ -59,10 +59,9 @@ test('Valid TRANSFER transaction with single Ed25519 input', t => { .then(({ id }) => conn.pollStatusAndFetchTransaction(id)) .then(() => { const transferTx = Transaction.makeTransferTransaction( - createTxSigned, - metaData, + [{ tx: createTxSigned, output_index: 0 }], [aliceOutput], - 0 + metaData ) const transferTxSigned = Transaction.signTransaction( transferTx, @@ -92,11 +91,9 @@ test('Valid TRANSFER transaction with multiple Ed25519 inputs', t => { .then(({ 'id': txId }) => conn.pollStatusAndFetchTransaction(txId)) .then(() => { const transferTx = Transaction.makeTransferTransaction( - createTxSigned, - metaData, + [{ tx: createTxSigned, output_index: 0 }, { tx: createTxSigned, output_index: 1 }], [Transaction.makeOutput(aliceCondition, '2')], - 0, - 1 + metaData ) const transferTxSigned = Transaction.signTransaction( transferTx, @@ -134,10 +131,9 @@ test('Search for spent and unspent outputs of a given public key', t => { // We spent output 1 (of 0, 1) const transferTx = Transaction.makeTransferTransaction( - createTxSigned, - metaData, + [{ tx: createTxSigned, output_index: 1 }], [trentOutput], - 1 + metaData ) const transferTxSigned = Transaction.signTransaction( transferTx, @@ -177,10 +173,9 @@ test('Search for unspent outputs for a given public key', t => { // We spent output 1 (of 0, 1, 2) const transferTx = Transaction.makeTransferTransaction( - createTxSigned, - metaData, + [{ tx: createTxSigned, output_index: 1 }], [trentOutput], - 1 + metaData ) const transferTxSigned = Transaction.signTransaction( transferTx, @@ -220,10 +215,9 @@ test('Search for spent outputs for a given public key', t => { // We spent output 1 (of 0, 1, 2) const transferTx = Transaction.makeTransferTransaction( - createTxSigned, - metaData, + [{ tx: createTxSigned, output_index: 1 }], [trentOutput], - 1 + metaData ) const transferTxSigned = Transaction.signTransaction( transferTx, diff --git a/test/transaction/test_cryptoconditions.js b/test/transaction/test_cryptoconditions.js index a842857..c5299d5 100644 --- a/test/transaction/test_cryptoconditions.js +++ b/test/transaction/test_cryptoconditions.js @@ -56,10 +56,9 @@ test('Fulfillment correctly formed', t => { alice.publicKey ) const txTransfer = Transaction.makeTransferTransaction( - txCreate, - {}, + [{ tx: txCreate, output_index: 0 }], [Transaction.makeOutput(Transaction.makeEd25519Condition(alice.publicKey))], - [0] + {} ) const msg = Transaction.serializeTransactionIntoCanonicalString(txTransfer) const txSigned = Transaction.signTransaction(txTransfer, alice.privateKey) diff --git a/test/transaction/test_transaction.js b/test/transaction/test_transaction.js index d5a28ed..002c82e 100644 --- a/test/transaction/test_transaction.js +++ b/test/transaction/test_transaction.js @@ -73,10 +73,9 @@ test('Create TRANSFER transaction based on CREATE transaction', t => { sinon.spy(makeTransaction, 'default') Transaction.makeTransferTransaction( - createTx, - metaData, + [{ tx: createTx, output_index: 0 }], [aliceOutput], - 0 + metaData ) const expected = [ 'TRANSFER', @@ -101,10 +100,9 @@ test('Create TRANSFER transaction based on TRANSFER transaction', t => { sinon.spy(makeTransaction, 'default') Transaction.makeTransferTransaction( - transferTx, - metaData, + [{ tx: transferTx, output_index: 0 }], [aliceOutput], - 0 + metaData ) const expected = [ 'TRANSFER',