X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fcomponents%2Flayout%2Fprofit%2Faction.js;h=cd1e626679c45564cc6cc9c8038ac62f8013e1e9;hb=d1f568a0aed072fef425dc857cd5e5b6598e9fa1;hp=fdbd7d95c7c6c75c5e93f732bb0a7b541fdaf6a8;hpb=0b4a451108aa5abaa9c505d09a0aa8799337d1b7;p=bytom%2FBytom-Dapp-Demo.git diff --git a/src/components/layout/profit/action.js b/src/components/layout/profit/action.js index fdbd7d9..cd1e626 100644 --- a/src/components/layout/profit/action.js +++ b/src/components/layout/profit/action.js @@ -1,50 +1,105 @@ -import { spendUTXOAction, spendWalletAction, controlProgramAction, controlAddressAction, listUTXO } from '../../bytom' +import { + spendUTXOAction, spendWalletAction, controlProgramAction, controlAddressAction, + updateBalances, updateUtxo, listDappUTXO, contractArguments +} from '../../bytom' +import GetContractArgs from '../../constants' +import { matchesUTXO } from '../../filter' +import BigNumber from 'bignumber.js' -export function FixedLimitProfit(amountBill, saver) { +export function FixedLimitProfit(account, amountBill, saver) { + return new Promise((resolve, reject) => { + return listDappUTXO({ + "program": GetContractArgs().profitProgram, + "asset": GetContractArgs().assetDeposited, + "sort": { + "by":"amount", + "order":"desc" + } + }).then(resp => { + if(resp.length === 0) { + throw 'Empty UTXO info, it might be that the utxo is locked. Please retry after 60s.' + }else if(amountBill < 100000000){ + throw 'Please enter an amount bigger or equal than 100000000.' + } - const program = "203f98494c8fcce82a1da8054cda521295333a6c7a6ea3b861a27fd766a5cea5731600140014f19df269f9334bdcb496da6b63b275d49447016401500500c817a8040500e40b540220df4638860378a2203466833c935efa19f513ac3aae2cb52d36cee7fa5010b0794ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac747800c0" + const radio = BigNumber( GetContractArgs().radio ) + const profitAmount = radio.multipliedBy(amountBill).toNumber() - listUTXO({ - "filter": { - "script": program, - "asset":"bbc81814b304cf4e129582b094672b917d28e1109aab4569697d72f102af07c8" - } - }).then(resp => { - const capitalAmount = resp.amount - const capitalAsset = resp.asset - const utxo = resp.hash + const result = matchesUTXO(resp, profitAmount) + const capitalAmount = result.amount + const capitalAsset = result.asset + const utxo = result.hash - const gas = 40000000 - const assetBill = "df4638860378a2203466833c935efa19f513ac3aae2cb52d36cee7fa5010b079" - const btm = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + if(profitAmount > capitalAmount) { + throw 'input amount must be smaller or equal to ' + capitalAmount/radio.toNumber() + '.' + }else{ + const input = [] + const output = [] - const input = [] - const output = [] + const sAmountBill = BigNumber(amountBill).div( 100000000 ) + const sTotalAmountBill = BigNumber(GetContractArgs().totalAmountBill).div( 100000000 ) + const multiplyResult = BigNumber( GetContractArgs().totalAmountCapital).multipliedBy( sAmountBill ) + const gain = multiplyResult.div( sTotalAmountBill ).toNumber() - const totalAmountBill = 10000000000 - const totalAmountCapital = 20000000000 + if( multiplyResult.isGreaterThan( 9223372036854775807 ) ){ + throw 'The entered amount is too big, please reduce the amount.' + } - const sAmountBill = amountBill/100000000 - const sTotalAmountBill = totalAmountBill/100000000 - const gain = totalAmountCapital*sAmountBill/sTotalAmountBill + const args = contractArguments(amountBill, saver) - const banker = "00140014f19df269f9334bdcb496da6b63b275d49447" + input.push(spendUTXOAction(utxo)) + input.push(spendWalletAction(amountBill, GetContractArgs().assetBill)) - input.push(spendUTXOAction(utxo, amountBill, saver)) - input.push(spendWalletAction(amountBill, assetBill)) - input.push(spendWalletAction(gas, btm)) - - if(amountBill < capitalAmount){ - output.push(controlProgramAction(amountBill, assetBill, banker )) - output.push(controlAddressAction(gain, capitalAsset, saver)) - output.push(controlProgramAction((capitalAmount - gain), capitalAsset, program)) - }else{ - output.push(controlProgramAction(amountBill, assetBill, banker )) - output.push(controlAddressAction(capitalAmount, capitalAsset, saver)) - } - - window.bytom.advancedTransfer(input, output) + if( gain < capitalAmount ){ + output.push(controlProgramAction(amountBill, GetContractArgs().assetBill, GetContractArgs().banker )) + output.push(controlAddressAction(gain, capitalAsset, saver)) + output.push(controlProgramAction((BigNumber(capitalAmount).minus(gain)).toNumber(), capitalAsset, GetContractArgs().profitProgram)) + }else{ + output.push(controlProgramAction(amountBill, GetContractArgs().assetBill, GetContractArgs().banker )) + output.push(controlAddressAction(capitalAmount, capitalAsset, saver)) + } + 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'){ + const transactionHash = resp.message.result.data.transaction_hash + updateBalances({ + "tx_id": transactionHash, + "address": saver, + "asset": GetContractArgs().assetDeposited, + "amount": profitAmount + }).then(()=>{ + updateBalances({ + "tx_id": transactionHash, + "address": account.address, + "asset": GetContractArgs().assetBill, + "amount": -amountBill + }).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