1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-22 01:47:00 +01:00

Fix gas control flicker on send screen when switching between EIP-1559 networks (#12230)

Fix gas control flicker on send screen when switching between EIP-1559 networks
This commit is contained in:
Jyoti Puri 2021-09-30 17:27:59 +05:30 committed by GitHub
parent e238cbc568
commit 6187ab9b01
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 133 additions and 5 deletions

View File

@ -31,6 +31,11 @@
"name": "Test Account 2" "name": "Test Account 2"
} }
}, },
"networkDetails": {
"EIPS": {
"1559": true
}
},
"cachedBalances": {}, "cachedBalances": {},
"incomingTransactions": {}, "incomingTransactions": {},
"unapprovedTxs": { "unapprovedTxs": {

View File

@ -279,6 +279,16 @@ export function getUnapprovedTxs(state) {
return state.metamask.unapprovedTxs; return state.metamask.unapprovedTxs;
} }
/**
* Function returns true if network details are fetched and it is found to not support EIP-1559
*/
export function isNotEIP1559Network(state) {
return state.metamask.networkDetails?.EIPS[1559] === false;
}
/**
* Function returns true if network details are fetched and it is found to support EIP-1559
*/
export function isEIP1559Network(state) { export function isEIP1559Network(state) {
return state.metamask.networkDetails?.EIPS[1559] === true; return state.metamask.networkDetails?.EIPS[1559] === true;
} }

View File

@ -7,6 +7,7 @@ import reduceMetamask, {
getSendHexDataFeatureFlagState, getSendHexDataFeatureFlagState,
getSendToAccounts, getSendToAccounts,
getUnapprovedTxs, getUnapprovedTxs,
isNotEIP1559Network,
} from './metamask'; } from './metamask';
describe('MetaMask Reducers', () => { describe('MetaMask Reducers', () => {
@ -99,6 +100,9 @@ describe('MetaMask Reducers', () => {
gasPrice: '4a817c800', gasPrice: '4a817c800',
}, },
}, },
networkDetails: {
EIPS: { 1559: true },
},
}, },
{}, {},
), ),
@ -378,4 +382,36 @@ describe('MetaMask Reducers', () => {
}); });
}); });
}); });
describe('isNotEIP1559Network()', () => {
it('should return true if network does not supports EIP-1559', () => {
expect(
isNotEIP1559Network({
...mockState,
metamask: {
...mockState.metamask,
networkDetails: {
EIPS: { 1559: false },
},
},
}),
).toStrictEqual(true);
});
it('should return false if networkDetails.EIPS.1559 is not false', () => {
expect(isNotEIP1559Network(mockState)).toStrictEqual(false);
expect(
isNotEIP1559Network({
...mockState,
metamask: {
...mockState.metamask,
networkDetails: {
EIPS: { 1559: undefined },
},
},
}),
).toStrictEqual(false);
});
});
}); });

View File

@ -29,7 +29,7 @@ export default class SendContent extends Component {
gasIsExcessive: PropTypes.bool.isRequired, gasIsExcessive: PropTypes.bool.isRequired,
isEthGasPrice: PropTypes.bool, isEthGasPrice: PropTypes.bool,
noGasPrice: PropTypes.bool, noGasPrice: PropTypes.bool,
networkAndAccountSupports1559: PropTypes.bool, networkOrAccountNotSupports1559: PropTypes.bool,
}; };
render() { render() {
@ -40,7 +40,7 @@ export default class SendContent extends Component {
isEthGasPrice, isEthGasPrice,
noGasPrice, noGasPrice,
isAssetSendable, isAssetSendable,
networkAndAccountSupports1559, networkOrAccountNotSupports1559,
} = this.props; } = this.props;
let gasError; let gasError;
@ -59,7 +59,7 @@ export default class SendContent extends Component {
{this.maybeRenderAddContact()} {this.maybeRenderAddContact()}
<SendAssetRow /> <SendAssetRow />
<SendAmountRow /> <SendAmountRow />
{!networkAndAccountSupports1559 && <SendGasRow />} {networkOrAccountNotSupports1559 && <SendGasRow />}
{this.props.showHexData && <SendHexDataRow />} {this.props.showHexData && <SendHexDataRow />}
</div> </div>
</PageContainerContent> </PageContainerContent>

View File

@ -4,7 +4,7 @@ import {
getAddressBookEntry, getAddressBookEntry,
getIsEthGasPriceFetched, getIsEthGasPriceFetched,
getNoGasPriceFetched, getNoGasPriceFetched,
checkNetworkAndAccountSupports1559, checkNetworkOrAccountNotSupports1559,
} from '../../../selectors'; } from '../../../selectors';
import { getIsAssetSendable, getSendTo } from '../../../ducks/send'; import { getIsAssetSendable, getSendTo } from '../../../ducks/send';
@ -25,7 +25,9 @@ function mapStateToProps(state) {
isEthGasPrice: getIsEthGasPriceFetched(state), isEthGasPrice: getIsEthGasPriceFetched(state),
noGasPrice: getNoGasPriceFetched(state), noGasPrice: getNoGasPriceFetched(state),
to, to,
networkAndAccountSupports1559: checkNetworkAndAccountSupports1559(state), networkOrAccountNotSupports1559: checkNetworkOrAccountNotSupports1559(
state,
),
}; };
} }

View File

@ -32,6 +32,7 @@ import { DAY } from '../../shared/constants/time';
import { import {
getNativeCurrency, getNativeCurrency,
getConversionRate, getConversionRate,
isNotEIP1559Network,
isEIP1559Network, isEIP1559Network,
} from '../ducks/metamask/metamask'; } from '../ducks/metamask/metamask';
@ -92,6 +93,10 @@ export function isEIP1559Account(state) {
return currentKeyring && currentKeyring.type !== KEYRING_TYPES.TREZOR; return currentKeyring && currentKeyring.type !== KEYRING_TYPES.TREZOR;
} }
/**
* The function returns true if network and account details are fetched and
* both of them support EIP-1559.
*/
export function checkNetworkAndAccountSupports1559(state) { export function checkNetworkAndAccountSupports1559(state) {
const networkSupports1559 = isEIP1559Network(state); const networkSupports1559 = isEIP1559Network(state);
const accountSupports1559 = isEIP1559Account(state); const accountSupports1559 = isEIP1559Account(state);
@ -99,6 +104,17 @@ export function checkNetworkAndAccountSupports1559(state) {
return networkSupports1559 && accountSupports1559; return networkSupports1559 && accountSupports1559;
} }
/**
* The function returns true if network and account details are fetched and
* either of them do not support EIP-1559.
*/
export function checkNetworkOrAccountNotSupports1559(state) {
const networkNotSupports1559 = isNotEIP1559Network(state);
const accountSupports1559 = isEIP1559Account(state);
return networkNotSupports1559 || accountSupports1559 === false;
}
/** /**
* Checks if the current wallet is a hardware wallet. * Checks if the current wallet is a hardware wallet.
* @param {Object} state * @param {Object} state

View File

@ -78,6 +78,65 @@ describe('Selectors', () => {
}); });
}); });
describe('#checkNetworkOrAccountNotSupports1559', () => {
it('returns false if network and account supports EIP-1559', () => {
const not1559Network = selectors.checkNetworkOrAccountNotSupports1559({
...mockState,
metamask: {
...mockState.metamask,
keyrings: [
{
type: 'Ledger Hardware',
accounts: ['0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc'],
},
],
},
});
expect(not1559Network).toStrictEqual(false);
});
it('returns true if network does not support EIP-1559', () => {
let not1559Network = selectors.checkNetworkOrAccountNotSupports1559({
...mockState,
metamask: {
...mockState.metamask,
networkDetails: {
EIPS: { 1559: undefined },
},
},
});
expect(not1559Network).toStrictEqual(true);
not1559Network = selectors.checkNetworkOrAccountNotSupports1559({
...mockState,
metamask: {
...mockState.metamask,
networkDetails: {
EIPS: { 1559: false },
},
},
});
expect(not1559Network).toStrictEqual(true);
});
it('returns true if account does not support EIP-1559', () => {
const networkOrAccountNotSupports1559 = selectors.checkNetworkOrAccountNotSupports1559(
{
...mockState,
metamask: {
...mockState.metamask,
keyrings: [
{
type: 'Trezor Hardware',
accounts: ['0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc'],
},
],
},
},
);
expect(networkOrAccountNotSupports1559).toStrictEqual(true);
});
});
describe('#getAddressBook', () => { describe('#getAddressBook', () => {
it('should return the address book', () => { it('should return the address book', () => {
expect(selectors.getAddressBook(mockState)).toStrictEqual([ expect(selectors.getAddressBook(mockState)).toStrictEqual([