1 import { chainClient } from 'utility/environment'
2 import { parseNonblankJSON } from 'utility/string'
3 import { push } from 'react-router-redux'
4 import { baseCreateActions, baseListActions } from 'features/shared/actions'
6 const type = 'transaction'
8 const list = baseListActions(type, {
11 const form = baseCreateActions(type)
13 function preprocessTransaction(formParams) {
14 const copy = JSON.parse(JSON.stringify(formParams))
16 baseTransaction: copy.baseTransaction,
17 actions: copy.actions,
20 if (builder.baseTransaction == '') {
21 delete builder.baseTransaction
24 if (formParams.submitAction == 'generate') {
25 builder.ttl = '1h' // 1 hour
28 for (let i in builder.actions) {
29 let a = builder.actions[i]
31 const intFields = ['amount', 'position']
32 intFields.forEach(key => {
35 if ((parseInt(value)+'') == value) {
36 a[key] = parseInt(value)
38 throw new Error(`Action ${parseInt(i)+1} ${key} must be an integer.`)
44 a.referenceData = parseNonblankJSON(a.referenceData)
46 throw new Error(`Action ${parseInt(i)+1} reference data should be valid JSON, or blank.`)
50 a.receiver = parseNonblankJSON(a.receiver)
52 throw new Error(`Action ${parseInt(i)+1} receiver should be valid JSON.`)
59 form.submitForm = (formParams) => function(dispatch) {
60 const buildPromise = chainClient().transactions.build(builder => {
61 const processed = preprocessTransaction(formParams)
63 builder.actions = processed.actions.map(action => {
65 address: action.address,
66 amount: action.amount,
67 account_id: action.accountId,
68 account_alias: action.accountAlias,
69 asset_id: action.assetId,
70 asset_alias: action.assetAlias,
73 if (action.receiver) {
75 control_program: action.receiver.controlProgram,
76 expires_at: action.receiver.expiresAt
81 if (processed.baseTransaction) {
82 builder.baseTransaction = processed.baseTransaction
86 if (formParams.submitAction == 'submit') {
88 .then(({data: tpl}) => {
89 const client = chainClient()
90 const body = Object.assign({}, {auth: '123456', 'transaction': tpl})
91 return client.connection.request('/sign-submit-transaction', body, true)
93 if (resp.status === 'fail') {
94 // TODO: deal with failure
98 dispatch(form.created())
100 pathname: '/transactions'