From 7fbb794505c0cb5436ea3dec4fb1b82831e8e3a1 Mon Sep 17 00:00:00 2001 From: Zhiting Lin Date: Tue, 16 Apr 2019 10:56:18 +0800 Subject: [PATCH] update the estimate gas function. --- src/features/transactions/actions.js | 3 +- .../transactions/components/New/IssueAssets.jsx | 114 ++++++++++++++------- .../components/New/NormalTransactionForm.jsx | 6 -- src/features/transactions/transactions.js | 12 +-- 4 files changed, 87 insertions(+), 48 deletions(-) diff --git a/src/features/transactions/actions.js b/src/features/transactions/actions.js index 2a2aa0e..4944543 100644 --- a/src/features/transactions/actions.js +++ b/src/features/transactions/actions.js @@ -25,7 +25,8 @@ function preprocessTransaction(formParams) { } if (formParams.form === 'issueAssetTx') { - builder.actions = issueAssetTxActionBuilder(formParams, 'amount') + const gasPrice = formParams.state.estimateGas * Number(formParams.gasLevel) + builder.actions = issueAssetTxActionBuilder(formParams, Number(gasPrice), 'amount') } diff --git a/src/features/transactions/components/New/IssueAssets.jsx b/src/features/transactions/components/New/IssueAssets.jsx index d06229f..dc2feee 100644 --- a/src/features/transactions/components/New/IssueAssets.jsx +++ b/src/features/transactions/components/New/IssueAssets.jsx @@ -9,6 +9,7 @@ import { PasswordField, RadioField, KeyValueTable, + GasField, } from 'features/shared/components' import { Connection } from 'sdk' import {chainClient} from 'utility/environment' @@ -19,14 +20,16 @@ import React from 'react' import styles from './New.scss' import actions from 'actions' import { btmID } from 'utility/environment' -import { getAssetDecimal} from '../../transactions' +import {getAssetDecimal, issueAssetTxActionBuilder} from '../../transactions' import {withNamespaces} from 'react-i18next' class IssueAssets extends React.Component { constructor(props) { super(props) + this.connection = chainClient().connection this.state = { + estimateGas:null, counter: 1, } @@ -115,14 +118,65 @@ class IssueAssets extends React.Component { } + estimateNormalTransactionGas() { + const transaction = this.props.fields + const accountAlias = transaction.accountAlias.value + const accountId = transaction.accountId.value + const assetAlias = transaction.assetAlias.value + const assetId = transaction.assetId.value + const receivers = transaction.receivers + const addresses = receivers.map(x => x.address.value) + const amounts = receivers.map(x => Number(x.amount.value)) + + const {t, i18n} = this.props + + const noAccount = !accountAlias && !accountId + const noAsset = !assetAlias && !assetId + + if ( addresses.includes('') || amounts.includes(0)|| noAccount || noAsset) { + this.setState({estimateGas: null}) + return + } + + const actions = issueAssetTxActionBuilder(transaction, Math.pow(10, 7), 'amount.value' ) + + const body = {actions, ttl: 1} + this.connection.request('/build-transaction', body).then(resp => { + if (resp.status === 'fail') { + this.setState({estimateGas: null}) + const errorMsg = resp.code && i18n.exists(`btmError.${resp.code}`) && t(`btmError.${resp.code}`) || resp.msg + this.props.showError(new Error(errorMsg)) + return + } + + return this.connection.request('/estimate-transaction-gas', { + transactionTemplate: resp.data + }).then(resp => { + if (resp.status === 'fail') { + this.setState({estimateGas: null}) + const errorMsg = resp.code && i18n.exists(`btmError.${resp.code}`) && t(`btmError.${resp.code}`) || resp.msg + this.props.showError(new Error(errorMsg)) + return + } + this.setState({estimateGas: Math.ceil(resp.data.totalNeu/100000)*100000}) + }) + }) + } + render() { const { - fields: {assetAlias, assetId, receivers, password, submitAction, signTransaction, accountId, accountAlias, gas}, + fields: {assetAlias, assetId, receivers, password, submitAction, signTransaction, accountId, accountAlias, gasLevel}, error, handleSubmit, submitting } = this.props - const t = this.props.t + const t = this.props.t; + [accountAlias, accountId, assetAlias, assetId].forEach(key => { + key.onBlur = this.estimateNormalTransactionGas.bind(this) + }); + (receivers.map(receiver => receiver.amount)).forEach(amount =>{ + amount.onBlur = this.estimateNormalTransactionGas.bind(this) + }) let submitLabel = t('transaction.new.submit') if (submitAction.value == 'sign') { @@ -131,7 +185,7 @@ class IssueAssets extends React.Component { const options = [ {label: t('transaction.advance.submitToBlockchain') , value: 'submit'}, - {label: 'sign raw transaction', value: 'sign'} + {label: t('transaction.issue.signRaw'), value: 'sign'} ] const showBtmAmountUnit = (assetAlias.value === 'BTM' || assetId.value === btmID) @@ -151,14 +205,14 @@ class IssueAssets extends React.Component { const issueAssetId = issueAction.assetId assetId.value = issueAssetId - gas.value = transaction.fee / Math.pow(10, 8) + ' BTM' + gasLevel.value = transaction.fee / Math.pow(10, 8) + ' BTM' accountAlias.value = inputs.filter(input => input.type === 'spend')[0].address const assetDefinition = issueAction.assetDefinition assetItem = - + {assetItem} - +
{ submitAction.value === 'sign'? - : @@ -243,7 +297,7 @@ class IssueAssets extends React.Component { /> }
- +
{receivers.map((receiver, index) =>
- //
+ : - //
- // - - //
+
+ + {t('transaction.normal.feeDescription')} +
} - - + + { submitAction.value === 'sign' && @@ -403,6 +445,7 @@ const asyncValidate = (values, dispatch, props) => { const mapDispatchToProps = (dispatch) => ({ ...BaseNew.mapDispatchToProps('transaction')(dispatch), decode: (transaction) => dispatch( actions.transaction.decode(transaction)), + showError: err => dispatch({type: 'ERROR', payload: err}), }) const mapStateToProps = (state, ownProps) => ({ @@ -411,6 +454,7 @@ const mapStateToProps = (state, ownProps) => ({ initialValues:{ assetAlias: ownProps.location.query.alias, submitAction: 'submit', + gasLevel: '1', receivers:[{ id: 0, amount:'', @@ -435,7 +479,7 @@ export default withNamespaces('translations') (BaseNew.connect( 'signTransaction', 'accountAlias', 'accountId', - 'gas' + 'gasLevel' ], asyncValidate, asyncBlurFields: ['receivers[].address'], diff --git a/src/features/transactions/components/New/NormalTransactionForm.jsx b/src/features/transactions/components/New/NormalTransactionForm.jsx index 1d66e11..16f3f24 100644 --- a/src/features/transactions/components/New/NormalTransactionForm.jsx +++ b/src/features/transactions/components/New/NormalTransactionForm.jsx @@ -228,12 +228,6 @@ class NormalTxForm extends React.Component { > {t('commonWords.remove')} - - {/*{index===0 ?*/} - {/*+ :*/} - {/* this.removeReceiverItem(index)}>-*/} - {/*}*/} -
)}