1 import uuid from 'uuid'
2 import { chainClient, chainSigner } from 'utility/environment'
3 import { parseNonblankJSON } from 'utility/string'
4 import { push } from 'react-router-redux'
5 import { baseCreateActions, baseListActions } from 'features/shared/actions'
7 const type = 'transaction'
9 const list = baseListActions(type, {
12 const form = baseCreateActions(type)
14 function preprocessTransaction(formParams) {
15 const copy = JSON.parse(JSON.stringify(formParams))
17 baseTransaction: copy.baseTransaction,
18 actions: copy.actions,
21 if (builder.baseTransaction == '') {
22 delete builder.baseTransaction
25 if (formParams.submitAction == 'generate') {
26 builder.ttl = '1h' // 1 hour
29 for (let i in builder.actions) {
30 let a = builder.actions[i]
32 const intFields = ['amount', 'position']
33 intFields.forEach(key => {
36 if ((parseInt(value)+'') == value) {
37 a[key] = parseInt(value)
39 throw new Error(`Action ${parseInt(i)+1} ${key} must be an integer.`)
45 a.referenceData = parseNonblankJSON(a.referenceData)
47 throw new Error(`Action ${parseInt(i)+1} reference data should be valid JSON, or blank.`)
51 a.receiver = parseNonblankJSON(a.receiver)
53 throw new Error(`Action ${parseInt(i)+1} receiver should be valid JSON.`)
60 function getTemplateXpubs(tpl) {
62 tpl['signing_instructions'].forEach((instruction) => {
63 instruction['witness_components'].forEach((component) => {
64 component.keys.forEach((key) => {
72 form.submitForm = (formParams) => function(dispatch) {
73 const buildPromise = chainClient().transactions.build(builder => {
74 const processed = preprocessTransaction(formParams)
76 builder.actions = processed.actions.map(action => {
78 amount: action.amount,
79 account_id: action.accountId,
80 account_alias: action.accountAlias,
81 asset_id: action.assetId,
82 asset_alias: action.assetAlias,
86 builder.actions.push({
87 account_id: '08ALDMJ900A02',
89 asset_id:'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
90 type:'spend_account'})
91 if (processed.baseTransaction) {
92 builder.baseTransaction = processed.baseTransaction
96 if (formParams.submitAction == 'submit') {
98 .then(({data: tpl}) => {
99 const client = chainClient()
100 const body = Object.assign({}, {Auth: '123456', 'transaction': tpl})
101 return client.connection.request('/sign-submit-transaction', body, true)
103 if (resp.status === 'fail') {
104 // TODO: deal with failure
108 dispatch(form.created())
110 pathname: `/transactions/${resp.data.txid}`,
118 // submitAction == 'generate'
121 const data = tpl.data
122 const signer = chainSigner()
124 getTemplateXpubs(data).forEach(key => {
125 signer.addKey(key, chainClient().mockHsm.signerConnection)
128 return signer.sign({...data, allowAdditionalActions: true})
133 type: 'GENERATED_TX_HEX',
136 hex: signed.rawTransaction,
139 dispatch(push(`/transactions/generated/${id}`))