Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated data models for 1.0 #35

Merged
merged 10 commits into from
Jun 20, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ before_install:
-e BIGCHAINDB_KEYPAIR_PRIVATE=5C5Cknco7YxBRP9AgB1cbUVTL4FAcooxErLygw1DeG2D
-e BIGCHAINDB_DATABASE_BACKEND=mongodb
-e BIGCHAINDB_DATABASE_HOST=172.17.0.1
bigchaindb/bigchaindb:0.10.2
bigchaindb/bigchaindb:master
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm guessing we want to change this to 1.0.0rc1 at some point

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup

start

script: yarn test
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,12 @@
"babel-runtime": "^6.22.0",
"cross-env": "^5.0.1",
"eslint": "^3.14.1",
"eslint-config-ascribe": "^3.0.1",
"eslint-config-ascribe": "^3.0.4",
"eslint-plugin-import": "^2.2.0",
"husky": "^0.13.4",
"release-it": "^2.7.3",
"rimraf": "^2.5.4",
"sinon": "^2.3.4",
"webpack": "^2.2.1"
},
"dependencies": {
Expand Down
7 changes: 5 additions & 2 deletions src/transaction/makeOutput.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
* Create an Output from a Condition.
* Note: Assumes the given Condition was generated from a single public key (e.g. a Ed25519 Condition)
* @param {object} condition Condition (e.g. a Ed25519 Condition from `makeEd25519Condition()`)
* @param {number} amount Amount of the output
* @param {string} amount Amount of the output
* @returns {object} An Output usable in a Transaction
*/
export default function makeOutput(condition, amount = 1) {
export default function makeOutput(condition, amount = '1') {
if (typeof amount !== 'string') {
throw new TypeError('`amount` must be of type string')
}
return {
'amount': amount,
condition,
Expand Down
14 changes: 8 additions & 6 deletions src/transaction/makeTransferTransaction.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,27 @@ import makeTransaction from './makeTransaction'
* 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} fulfilledOutputs Indices of the Outputs in `unspentTransaction` that this
* @param {...number} OutputIndices Indices of the Outputs in `unspentTransaction` that this
* Transaction fulfills.
* Note that the public keys listed in the fulfilled Outputs
* must be used (and in the same order) to sign the Transaction
* Note that listed public keys listed must be used (and in
* the same order) to sign the Transaction
* (`signTransaction()`).
* @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,
outputs,
...fulfilledOutputs
...outputIndices
) {
const inputs = fulfilledOutputs.map((outputIndex) => {
const inputs = outputIndices.map((outputIndex) => {
const fulfilledOutput = unspentTransaction.outputs[outputIndex]
const transactionLink = {
'output': outputIndex,
'txid': unspentTransaction.id,
'transaction_id': unspentTransaction.id,
}

return makeInputTemplate(fulfilledOutput.public_keys, transactionLink)
Expand Down
132 changes: 132 additions & 0 deletions test/transaction/test_transaction.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
import test from 'ava'
import sinon from 'sinon'

import { Transaction, Ed25519Keypair } from '../../src'
import * as makeTransaction from '../../src/transaction/makeTransaction' // eslint-disable-line
import makeInputTemplate from '../../src/transaction/makeInputTemplate'


// TODO: Find out if ava has something like conftest, if so put this there.
const alice = new Ed25519Keypair()
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use output of respective functions as strings/dicts here

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Created an issue: #45

const aliceCondition = Transaction.makeEd25519Condition(alice.publicKey)
const aliceOutput = Transaction.makeOutput(aliceCondition)
const assetMessage = { assetMessage: 'assetMessage' }
const metaDataMessage = { metaDataMessage: 'metaDataMessage' }
const createTx = Transaction.makeCreateTransaction(
assetMessage,
metaDataMessage,
[aliceOutput],
alice.publicKey
)
const transferTx = Transaction.makeTransferTransaction(
createTx,
metaDataMessage,
[aliceOutput],
0
)


test('Create valid output with default amount', t => {
const condition = {
details: {
public_key: 'abc'
}
}
const expected = {
amount: '1',
condition,
public_keys: ['abc']
}
const res = Transaction.makeOutput(condition)
t.deepEqual(res, expected)
})


test('Create valid output with custom amount', t => {
const condition = {
details: {
public_key: 'abc'
}
}
const customAmount = '1337'
const expected = {
amount: customAmount,
condition,
public_keys: ['abc']
}
const res = Transaction.makeOutput(condition, customAmount)
t.deepEqual(res, expected)
})

test('Pass condition not based on public_keys to makeOutput', t => {
const condition = {
details: {
idea: 'just pretend this is e.g. a hashlock'
}
}
const expected = {
amount: '1',
condition,
public_keys: []
}
const res = Transaction.makeOutput(condition)
t.deepEqual(res, expected)
})


test('makeOutput throws TypeError with incorrect amount type', t => {
t.throws(() => Transaction.makeOutput({}, 1337), TypeError)
})


test('Create TRANSFER transaction based on CREATE transaction', t => {
sinon.spy(makeTransaction, 'default')

Transaction.makeTransferTransaction(
createTx,
metaDataMessage,
[aliceOutput],
0
)
const expected = [
'TRANSFER',
{ id: createTx.id },
metaDataMessage,
[aliceOutput],
[makeInputTemplate(
[alice.publicKey],
{ output: 0, transaction_id: createTx.id }
)]
]

// NOTE: `src/transaction/makeTransaction` is `export default`, hence we
// can only mock `makeTransaction.default` with a hack:
// See: https://stackoverflow.com/a/33676328/1263876
t.truthy(makeTransaction.default.calledWith(...expected))
makeTransaction.default.restore()
})


test('Create TRANSFER transaction based on TRANSFER transaction', t => {
sinon.spy(makeTransaction, 'default')

Transaction.makeTransferTransaction(
transferTx,
metaDataMessage,
[aliceOutput],
0
)
const expected = [
'TRANSFER',
{ id: transferTx.asset.id },
metaDataMessage,
[aliceOutput],
[makeInputTemplate(
[alice.publicKey],
{ output: 0, transaction_id: transferTx.id }
)]
]

t.truthy(makeTransaction.default.calledWith(...expected))
makeTransaction.default.restore()
})