OSDN Git Service

update the build-chain-transactions function.
[bytom/bytom-electron.git] / src / features / transactions / actions.js
index 6574494..d883334 100644 (file)
@@ -1,8 +1,9 @@
 import uuid from 'uuid'
-import {chainClient} from 'utility/environment'
+import {chainClient, btmID} from 'utility/environment'
 import {parseNonblankJSON} from 'utility/string'
 import {push} from 'react-router-redux'
 import {baseCreateActions, baseListActions} from 'features/shared/actions'
+import { normalTxActionBuilder, issueAssetTxActionBuilder } from './transactions'
 
 const type = 'transaction'
 
@@ -19,44 +20,16 @@ function preprocessTransaction(formParams) {
   }
 
   if (formParams.form === 'normalTx') {
-    let gasPrice = 0
-    switch (formParams.gas.type) {
-      case 'Fast':
-        gasPrice = formParams.state.estimateGas * 2
-        break
-      case 'Customize':
-        gasPrice = formParams.gas.price
-        break
-      case 'Standard':
-      default:
-        gasPrice = formParams.state.estimateGas * 1
-        break
-    }
+    const gasPrice = formParams.state.estimateGas * Number(formParams.gasLevel)
+    builder.actions = normalTxActionBuilder(formParams,  Number(gasPrice), 'amount')
+  }
 
-    builder.actions.push({
-      accountAlias: formParams.accountAlias,
-      accountId: formParams.accountId,
-      assetAlias: 'BTM',
-      amount: Number(gasPrice),
-      type: 'spend_account'
-    })
-    builder.actions.push({
-      accountAlias: formParams.accountAlias,
-      accountId: formParams.accountId,
-      assetAlias: formParams.assetAlias,
-      assetId: formParams.assetId,
-      amount: formParams.amount,
-      type: 'spend_account'
-    })
-    builder.actions.push({
-      address: formParams.address,
-      assetAlias: formParams.assetAlias,
-      assetId: formParams.assetId,
-      amount: formParams.amount,
-      type: 'control_address'
-    })
+  if (formParams.form === 'issueAssetTx') {
+    const gasPrice = formParams.state.estimateGas * Number(formParams.gasLevel)
+    builder.actions = issueAssetTxActionBuilder(formParams, Number(gasPrice), 'amount')
   }
 
+
   if (builder.baseTransaction == '') {
     delete builder.baseTransaction
   }
@@ -119,41 +92,58 @@ form.submitForm = (formParams) => function (dispatch) {
   }
 
   // normal transactions
-  if(formParams.form === 'normalTx'){
+  if( formParams.form === 'normalTx'){
 
     const accountId = formParams.accountId
     const accountAlias = formParams.accountAlias
     const accountInfo = Object.assign({},  accountAlias!== ''? {alias: accountAlias}: {id: accountId})
 
+    const isBTM = (formParams.assetId === btmID) || (formParams.assetAlias === 'BTM')
+
     return client.accounts.query(accountInfo)
       .then( resp => {
         if(resp.data[0].xpubs.length > 1){
-          throw new Error('Your account has multiple keys, please use advanced transactions.')
+          throw {code: 'F_BTM003'}
         }
         const body = Object.assign({}, {xpub: resp.data[0].xpubs[0], password: formParams.password})
         return client.mockHsm.keys.checkPassword(body)
       })
       .then( result => {
         if(!result.data.checkResult){
-          throw new Error('Your password is wrong, please check your password.')
+          throw new Error('PasswordWrong')
         }
-        return client.transactions.build(builderFunction)
+        if(isBTM)
+          return client.transactions.buildChain(builderFunction)
+        else
+          return client.transactions.build(builderFunction)
       })
       .then( tpl => {
-        const body = Object.assign({}, {password: formParams.password, transaction: tpl.data})
-        return client.transactions.sign(body)
+        if(isBTM){
+          const body = Object.assign({}, {password: formParams.password, transactions: tpl.data})
+          return client.transactions.signBatch(body)
+        }
+        else{
+          const body = Object.assign({}, {password: formParams.password, transaction: tpl.data})
+          return client.transactions.sign(body)
+        }
       })
       .then(signed => {
         if(!signed.data.signComplete){
-          throw new Error('Signature failed.')
+          throw {code: 'F_BTM100'}
+        }
+        if(isBTM){
+          const rawTransactions = signed.data.transaction.map(tx => tx.rawTransaction)
+          return client.transactions.submitBatch(rawTransactions)
+        }
+        else{
+          return client.transactions.submit(signed.data.transaction.rawTransaction)
         }
-        return client.transactions.submit(signed.data.transaction.rawTransaction)
       })
       .then(submitSucceeded)
   }
 
   //advanced transactions
-  else{
+  else if( formParams.form === 'advancedTx' ){
     const buildPromise = (formParams.state.showAdvanced && formParams.signTransaction) ? null :
       client.transactions.build(builderFunction)
 
@@ -201,6 +191,43 @@ form.submitForm = (formParams) => function (dispatch) {
     return buildPromise
       .then(resp => signAndSubmitGeneratedTransaction(resp.data))
   }
+
+  //issue Asset transactions
+  else if( formParams.form === 'issueAssetTx'){
+    //submit action
+    const signAndSubmitTransaction = (transaction) => {
+      const body = Object.assign({}, {password: formParams.password, transaction: transaction})
+      return client.transactions.sign(body)
+        .then( signed =>{
+          if(!signed.data.signComplete){
+            const id = uuid.v4()
+            dispatch({
+              type: 'GENERATED_TX_HEX',
+              generated: {
+                id: id,
+                hex: JSON.stringify(signed.data.transaction),
+              },
+            })
+            dispatch(push(`/transactions/generated/${id}`))
+
+          }else{
+            return client.transactions.submit(signed.data.transaction.rawTransaction)
+              .then(submitSucceeded)
+          }
+        })
+    }
+
+    if (formParams.submitAction == 'submit') {
+      return client.transactions.build(builderFunction)
+        .then(tpl => signAndSubmitTransaction(tpl.data))
+    }
+
+    if( formParams.submitAction == 'sign' ){
+      const transaction = JSON.parse(formParams.signTransaction)
+      return signAndSubmitTransaction(transaction)
+    }
+
+  }
 }
 
 const decode = (data) => {
@@ -214,6 +241,7 @@ const decode = (data) => {
         }
       })
       .catch(err => {
+        dispatch({type: 'DECODE_TRANSACTION', data:[]})
         throw {_error: err}
       })
   }