mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Update gas when hex data changes on send screen
This commit is contained in:
parent
3741927d8d
commit
918fb71df3
@ -917,6 +917,7 @@ function updateGasData ({
|
|||||||
selectedToken,
|
selectedToken,
|
||||||
to,
|
to,
|
||||||
value,
|
value,
|
||||||
|
data,
|
||||||
}) {
|
}) {
|
||||||
return (dispatch) => {
|
return (dispatch) => {
|
||||||
dispatch(actions.gasLoadingStarted())
|
dispatch(actions.gasLoadingStarted())
|
||||||
@ -937,6 +938,7 @@ function updateGasData ({
|
|||||||
to,
|
to,
|
||||||
value,
|
value,
|
||||||
estimateGasPrice,
|
estimateGasPrice,
|
||||||
|
data,
|
||||||
}),
|
}),
|
||||||
])
|
])
|
||||||
})
|
})
|
||||||
|
@ -15,18 +15,24 @@ export default class SendContent extends Component {
|
|||||||
showHexData: PropTypes.bool,
|
showHexData: PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
updateGas = (updateData) => this.props.updateGas(updateData)
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
<PageContainerContent>
|
<PageContainerContent>
|
||||||
<div className="send-v2__form">
|
<div className="send-v2__form">
|
||||||
<SendFromRow />
|
<SendFromRow />
|
||||||
<SendToRow
|
<SendToRow
|
||||||
updateGas={(updateData) => this.props.updateGas(updateData)}
|
updateGas={this.updateGas}
|
||||||
scanQrCode={ _ => this.props.scanQrCode()}
|
scanQrCode={ _ => this.props.scanQrCode()}
|
||||||
/>
|
/>
|
||||||
<SendAmountRow updateGas={(updateData) => this.props.updateGas(updateData)} />
|
<SendAmountRow updateGas={this.updateGas} />
|
||||||
<SendGasRow />
|
<SendGasRow />
|
||||||
{ this.props.showHexData ? <SendHexDataRow /> : null }
|
{(this.props.showHexData && (
|
||||||
|
<SendHexDataRow
|
||||||
|
updateGas={this.updateGas}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
</PageContainerContent>
|
</PageContainerContent>
|
||||||
)
|
)
|
||||||
|
@ -7,6 +7,7 @@ export default class SendHexDataRow extends Component {
|
|||||||
data: PropTypes.string,
|
data: PropTypes.string,
|
||||||
inError: PropTypes.bool,
|
inError: PropTypes.bool,
|
||||||
updateSendHexData: PropTypes.func.isRequired,
|
updateSendHexData: PropTypes.func.isRequired,
|
||||||
|
updateGas: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
static contextTypes = {
|
static contextTypes = {
|
||||||
@ -14,9 +15,10 @@ export default class SendHexDataRow extends Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
onInput = (event) => {
|
onInput = (event) => {
|
||||||
const {updateSendHexData} = this.props
|
const {updateSendHexData, updateGas} = this.props
|
||||||
event.target.value = event.target.value.replace(/\n/g, '')
|
const data = event.target.value.replace(/\n/g, '') || null
|
||||||
updateSendHexData(event.target.value || null)
|
updateSendHexData(data)
|
||||||
|
updateGas({ data })
|
||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
|
@ -62,7 +62,7 @@ export default class SendTransactionScreen extends PersistentForm {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateGas ({ to: updatedToAddress, amount: value } = {}) {
|
updateGas ({ to: updatedToAddress, amount: value, data } = {}) {
|
||||||
const {
|
const {
|
||||||
amount,
|
amount,
|
||||||
blockGasLimit,
|
blockGasLimit,
|
||||||
@ -86,6 +86,7 @@ export default class SendTransactionScreen extends PersistentForm {
|
|||||||
selectedToken,
|
selectedToken,
|
||||||
to: getToAddressForGasUpdate(updatedToAddress, currentToAddress),
|
to: getToAddressForGasUpdate(updatedToAddress, currentToAddress),
|
||||||
value: value || amount,
|
value: value || amount,
|
||||||
|
data,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,9 +86,10 @@ function mapDispatchToProps (dispatch) {
|
|||||||
selectedToken,
|
selectedToken,
|
||||||
to,
|
to,
|
||||||
value,
|
value,
|
||||||
|
data,
|
||||||
}) => {
|
}) => {
|
||||||
!editingTransactionId
|
!editingTransactionId
|
||||||
? dispatch(updateGasData({ recentBlocks, selectedAddress, selectedToken, blockGasLimit, to, value }))
|
? dispatch(updateGasData({ recentBlocks, selectedAddress, selectedToken, blockGasLimit, to, value, data }))
|
||||||
: dispatch(setGasTotal(calcGasTotal(gasLimit, gasPrice)))
|
: dispatch(setGasTotal(calcGasTotal(gasLimit, gasPrice)))
|
||||||
},
|
},
|
||||||
updateSendTokenBalance: ({ selectedToken, tokenContract, address }) => {
|
updateSendTokenBalance: ({ selectedToken, tokenContract, address }) => {
|
||||||
|
@ -200,16 +200,34 @@ function doesAmountErrorRequireUpdate ({
|
|||||||
return amountErrorRequiresUpdate
|
return amountErrorRequiresUpdate
|
||||||
}
|
}
|
||||||
|
|
||||||
async function estimateGas ({ selectedAddress, selectedToken, blockGasLimit, to, value, gasPrice, estimateGasMethod }) {
|
async function estimateGas ({
|
||||||
|
selectedAddress,
|
||||||
|
selectedToken,
|
||||||
|
blockGasLimit,
|
||||||
|
to,
|
||||||
|
value,
|
||||||
|
data,
|
||||||
|
gasPrice,
|
||||||
|
estimateGasMethod,
|
||||||
|
}) {
|
||||||
const paramsForGasEstimate = { from: selectedAddress, value, gasPrice }
|
const paramsForGasEstimate = { from: selectedAddress, value, gasPrice }
|
||||||
|
|
||||||
if (selectedToken) {
|
if (selectedToken) {
|
||||||
paramsForGasEstimate.value = '0x0'
|
paramsForGasEstimate.value = '0x0'
|
||||||
paramsForGasEstimate.data = generateTokenTransferData({ toAddress: to, amount: value, selectedToken })
|
paramsForGasEstimate.data = generateTokenTransferData({ toAddress: to, amount: value, selectedToken })
|
||||||
|
paramsForGasEstimate.to = selectedToken.address
|
||||||
|
} else {
|
||||||
|
if (data) {
|
||||||
|
paramsForGasEstimate.data = data
|
||||||
|
}
|
||||||
|
|
||||||
|
if (to) {
|
||||||
|
paramsForGasEstimate.to = to
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if recipient has no code, gas is 21k max:
|
// if recipient has no code, gas is 21k max:
|
||||||
if (!selectedToken) {
|
if (!selectedToken && !data) {
|
||||||
const code = Boolean(to) && await global.eth.getCode(to)
|
const code = Boolean(to) && await global.eth.getCode(to)
|
||||||
if (!code || code === '0x') {
|
if (!code || code === '0x') {
|
||||||
return SIMPLE_GAS_COST
|
return SIMPLE_GAS_COST
|
||||||
@ -218,8 +236,6 @@ async function estimateGas ({ selectedAddress, selectedToken, blockGasLimit, to,
|
|||||||
return BASE_TOKEN_GAS_COST
|
return BASE_TOKEN_GAS_COST
|
||||||
}
|
}
|
||||||
|
|
||||||
paramsForGasEstimate.to = selectedToken ? selectedToken.address : to
|
|
||||||
|
|
||||||
// if not, fall back to block gasLimit
|
// if not, fall back to block gasLimit
|
||||||
paramsForGasEstimate.gas = ethUtil.addHexPrefix(multiplyCurrencies(blockGasLimit, 0.95, {
|
paramsForGasEstimate.gas = ethUtil.addHexPrefix(multiplyCurrencies(blockGasLimit, 0.95, {
|
||||||
multiplicandBase: 16,
|
multiplicandBase: 16,
|
||||||
|
@ -289,6 +289,7 @@ describe('Send Component', function () {
|
|||||||
selectedToken: 'mockSelectedToken',
|
selectedToken: 'mockSelectedToken',
|
||||||
to: '',
|
to: '',
|
||||||
value: 'mockAmount',
|
value: 'mockAmount',
|
||||||
|
data: undefined,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
@ -105,6 +105,7 @@ describe('send container', () => {
|
|||||||
selectedToken: { address: '0x1' },
|
selectedToken: { address: '0x1' },
|
||||||
to: 'mockTo',
|
to: 'mockTo',
|
||||||
value: 'mockValue',
|
value: 'mockValue',
|
||||||
|
data: undefined,
|
||||||
}
|
}
|
||||||
|
|
||||||
it('should dispatch a setGasTotal action when editingTransactionId is truthy', () => {
|
it('should dispatch a setGasTotal action when editingTransactionId is truthy', () => {
|
||||||
@ -117,14 +118,14 @@ describe('send container', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should dispatch an updateGasData action when editingTransactionId is falsy', () => {
|
it('should dispatch an updateGasData action when editingTransactionId is falsy', () => {
|
||||||
const { selectedAddress, selectedToken, recentBlocks, blockGasLimit, to, value } = mockProps
|
const { selectedAddress, selectedToken, recentBlocks, blockGasLimit, to, value, data } = mockProps
|
||||||
mapDispatchToPropsObject.updateAndSetGasTotal(
|
mapDispatchToPropsObject.updateAndSetGasTotal(
|
||||||
Object.assign({}, mockProps, {editingTransactionId: false})
|
Object.assign({}, mockProps, {editingTransactionId: false})
|
||||||
)
|
)
|
||||||
assert(dispatchSpy.calledOnce)
|
assert(dispatchSpy.calledOnce)
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
actionSpies.updateGasData.getCall(0).args[0],
|
actionSpies.updateGasData.getCall(0).args[0],
|
||||||
{ selectedAddress, selectedToken, recentBlocks, blockGasLimit, to, value }
|
{ selectedAddress, selectedToken, recentBlocks, blockGasLimit, to, value, data }
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -367,6 +367,18 @@ describe('send utils', () => {
|
|||||||
assert.equal(result, '0xabc16')
|
assert.equal(result, '0xabc16')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should call ethQuery.estimateGas without a recipient if the recipient is empty and data passed', async () => {
|
||||||
|
const data = 'mockData'
|
||||||
|
const to = ''
|
||||||
|
const result = await estimateGas({...baseMockParams, data, to})
|
||||||
|
assert.equal(baseMockParams.estimateGasMethod.callCount, 1)
|
||||||
|
assert.deepEqual(
|
||||||
|
baseMockParams.estimateGasMethod.getCall(0).args[0],
|
||||||
|
{ gasPrice: undefined, value: undefined, data, from: baseExpectedCall.from, gas: baseExpectedCall.gas},
|
||||||
|
)
|
||||||
|
assert.equal(result, '0xabc16')
|
||||||
|
})
|
||||||
|
|
||||||
it(`should return ${SIMPLE_GAS_COST} if ethQuery.getCode does not return '0x'`, async () => {
|
it(`should return ${SIMPLE_GAS_COST} if ethQuery.getCode does not return '0x'`, async () => {
|
||||||
assert.equal(baseMockParams.estimateGasMethod.callCount, 0)
|
assert.equal(baseMockParams.estimateGasMethod.callCount, 0)
|
||||||
const result = await estimateGas(Object.assign({}, baseMockParams, { to: '0x123' }))
|
const result = await estimateGas(Object.assign({}, baseMockParams, { to: '0x123' }))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user