OSDN Git Service

update BigNumber.js error correction.
[bytom/Bytom-Dapp-Demo.git] / src / components / layout / save / action.js
index 4a8d974..ea49419 100644 (file)
@@ -1,41 +1,92 @@
-import { spendUTXOAction, spendWalletAction, controlProgramAction, controlAddressAction, listUTXO } from '../../bytom'
+import {
+  spendUTXOAction, spendWalletAction, controlProgramAction,
+  controlAddressAction, listDappUTXO, updateUtxo, updateBalances,
+  contractArguments
+} from '../../bytom'
+import GetContractArgs from '../../constants'
+import { matchesUTXO } from '../../filter'
+import BigNumber from 'bignumber.js'
 
 export function FixedLimitDeposit(amount, address) {
+  return new Promise((resolve, reject) => {
+    return listDappUTXO({
+      "program": GetContractArgs().depositProgram,
+      "asset": GetContractArgs().assetBill,
+      "sort": {
+        "by":"amount",
+        "order":"desc"
+      }
+    }).then(resp => {
+      const limit =  GetContractArgs().radio * 100000000
+      if(resp.length === 0) {
+        throw 'Empty UTXO info, it might be that the utxo is locked. Please retry after 60s.'
+      }else if(amount < limit){
+        throw `Please enter an amount bigger or equal than ${limit}.`
+      }
 
-  const depositProgram = "203f98494c8fcce82a1da8054cda521295333a6c7a6ea3b861a27fd766a5cea5731600140014f19df269f9334bdcb496da6b63b275d494470164015001500500c817a8040500e40b540220bbc81814b304cf4e129582b094672b917d28e1109aab4569697d72f102af07c84d4302597a64370200005479cda069c35b790400e1f5059600a05c797ba19a53795579a19a695a790400e1f5059653790400e1f505967800a07800a09a6955797b957c9600a069c35b797c9f9161645b010000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec1696332020000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c1696343020000547acd9f69587a587aae7cac747800c0"
-  const profitProgram = "203f98494c8fcce82a1da8054cda521295333a6c7a6ea3b861a27fd766a5cea5731600140014f19df269f9334bdcb496da6b63b275d49447016401500500c817a8040500e40b540220df4638860378a2203466833c935efa19f513ac3aae2cb52d36cee7fa5010b0794ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac747800c0"
+      const result = matchesUTXO(resp, amount)
+      const billAmount = result.amount
+      const billAsset = result.asset
+      const utxo = result.hash
 
-  listUTXO({
-    "filter": {
-      "script": depositProgram,
-      "asset":"df4638860378a2203466833c935efa19f513ac3aae2cb52d36cee7fa5010b079"
-    }
-  }).then(resp => {
-    const billAmount = resp.amount
-    const billAsset = resp.asset
-    const utxo = resp.hash
+      if(amount > billAmount){
+        throw 'input amount must be smaller or equal to ' + billAmount +'.'
+      }else{
+        const input = []
+        const output = []
 
+        const args = contractArguments(amount, address)
 
-    const gas = 40000000
-    const assetDeposited = "bbc81814b304cf4e129582b094672b917d28e1109aab4569697d72f102af07c8"
-    const btm = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+        input.push(spendUTXOAction(utxo))
+        input.push(spendWalletAction(amount, GetContractArgs().assetDeposited))
 
-    const input = []
-    const output = []
+        if(amount < billAmount){
+          output.push(controlProgramAction(amount, GetContractArgs().assetDeposited, GetContractArgs().profitProgram))
+          output.push(controlAddressAction(amount, billAsset, address))
+          output.push(controlProgramAction((BigNumber(billAmount).minus(BigNumber(amount))).toNumber(), billAsset, GetContractArgs().depositProgram))
+        }else{
+          output.push(controlProgramAction(amount, GetContractArgs().assetDeposited, GetContractArgs().profitProgram))
+          output.push(controlAddressAction(billAmount, billAsset, address))
+        }
 
-    input.push(spendUTXOAction(utxo, amount, address))
-    input.push(spendWalletAction(amount, assetDeposited))
-    input.push(spendWalletAction(gas, btm))
-
-    if(amount < billAmount){
-      output.push(controlProgramAction(amount, assetDeposited, profitProgram))
-      output.push(controlAddressAction(amount, billAsset, address))
-      output.push(controlProgramAction((billAmount-amount), billAsset, depositProgram))
-    }else{
-      output.push(controlProgramAction(amount, assetDeposited, profitProgram))
-      output.push(controlAddressAction(billAmount, billAsset, address))
-    }
-
-    window.bytom.advancedTransfer(input, output)
+        updateUtxo({"hash": utxo})
+          .then(()=>{
+          window.bytom.advancedTransfer(input, output, GetContractArgs().gas*10000000, args, 1)
+            .then((resp) => {
+              if(resp.action === 'reject'){
+                reject('user reject the request')
+              }else if(resp.action === 'success'){
+                updateBalances({
+                  "tx_id": resp.message.result.data.transaction_hash,
+                  address,
+                  "asset": GetContractArgs().assetDeposited,
+                  "amount": -amount
+                }).then(()=>{
+                  updateBalances({
+                    "tx_id": resp.message.result.data.transaction_hash,
+                    address,
+                    "asset": GetContractArgs().assetBill,
+                    "amount": amount
+                  }).then(()=>{
+                    resolve()
+                  }).catch(err => {
+                    throw err
+                  })
+                }).catch(err => {
+                  throw err
+                })
+              }
+            })
+            .catch(err => {
+              throw err
+            })
+          })
+          .catch(err => {
+            throw err
+          })
+      }
+    }).catch(err => {
+      reject(err)
+    })
   })
-}
\ No newline at end of file
+}