OSDN Git Service

update and seperate the code in to submitContract
[bytom/Bytom-Dapp-Demo.git] / src / components / layout / save / action.js
1 import {
2   spendUTXOAction, spendWalletAction, controlProgramAction,
3   controlAddressAction, contractArguments
4 } from '../../util/bytomAction'
5 import { listDappUTXO, updateBalances
6 } from '../../util/api'
7 import GetContractArgs from '../../constants'
8 import { matchesUTXO } from '../../filter'
9 import { submitContract } from '../../util/submitContract'
10 import BigNumber from 'bignumber.js'
11
12 export function FixedLimitDeposit(amount, address) {
13   const object = {
14     address: address,
15     amount: amount,
16     parameter: [amount, address]
17   }
18   return submitContract(listDepositUTXO, createContractTransaction, updateDatatbaseBalance, object)
19 }
20
21 function listDepositUTXO() {
22   return listDappUTXO({
23     "program": GetContractArgs().depositProgram,
24     "asset": GetContractArgs().assetBill,
25     "sort": {
26       "by":"amount",
27       "order":"desc"
28     }
29   })
30 }
31
32 function createContractTransaction(resp, amount, address){
33   return new Promise((resolve, reject) => {
34     //utxo pre calculation
35     const limit = GetContractArgs().radio * 100000000
36     if (resp.length === 0) {
37       reject( 'Empty UTXO info, it might be that the utxo is locked. Please retry after 60s.')
38     } else if (amount < limit) {
39       reject( `Please enter an amount bigger or equal than ${limit}.`)
40     }
41
42     const result = matchesUTXO(resp, amount)
43     const billAmount = result.amount
44     const billAsset = result.asset
45     const utxo = result.hash
46
47     //contract calculation
48     if (amount > billAmount) {
49       reject('input amount must be smaller or equal to ' + billAmount + '.')
50     } else {
51       const input = []
52       const output = []
53
54       const args = contractArguments(amount, address)
55
56       input.push(spendUTXOAction(utxo))
57       input.push(spendWalletAction(amount, GetContractArgs().assetDeposited))
58
59       if (amount < billAmount) {
60         output.push(controlProgramAction(amount, GetContractArgs().assetDeposited, GetContractArgs().profitProgram))
61         output.push(controlAddressAction(amount, billAsset, address))
62         output.push(controlProgramAction((BigNumber(billAmount).minus(BigNumber(amount))).toNumber(), billAsset, GetContractArgs().depositProgram))
63       } else {
64         output.push(controlProgramAction(amount, GetContractArgs().assetDeposited, GetContractArgs().profitProgram))
65         output.push(controlAddressAction(billAmount, billAsset, address))
66       }
67
68       resolve({
69         input,
70         output,
71         args,
72         utxo
73       })
74     }
75   })
76 }
77
78 function updateDatatbaseBalance(resp, amount, address){
79  return updateBalances({
80     "tx_id": resp.message.result.data.transaction_hash,
81     address,
82     "asset": GetContractArgs().assetDeposited,
83     "amount": -amount
84   }).then(()=>{
85     return updateBalances({
86       "tx_id": resp.message.result.data.transaction_hash,
87       address,
88       "asset": GetContractArgs().assetBill,
89       "amount": amount
90     })
91   }).catch(err => {
92     throw err
93   })
94 }