diff --git a/commitlint.config.js b/commitlint.config.js index 4b99c3f306..7774c2d6d3 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -75,6 +75,7 @@ module.exports = { 'ME-', 'ANT-', 'CGARD-', + 'CGD-', 'CHALO-', 'CECHO-', 'CSHLD-', diff --git a/modules/abstract-eth/src/lib/transactionBuilder.ts b/modules/abstract-eth/src/lib/transactionBuilder.ts index 85c284fb6c..0fa6380f95 100644 --- a/modules/abstract-eth/src/lib/transactionBuilder.ts +++ b/modules/abstract-eth/src/lib/transactionBuilder.ts @@ -539,8 +539,13 @@ export abstract class TransactionBuilder extends BaseTransactionBuilder { this.validateValue(new BigNumber(fee.gasLimit)); } if (fee.eip1559) { - this.validateValue(new BigNumber(fee.eip1559.maxFeePerGas)); - this.validateValue(new BigNumber(fee.eip1559.maxPriorityFeePerGas)); + const maxFee = new BigNumber(fee.eip1559.maxFeePerGas); + const priorityFee = new BigNumber(fee.eip1559.maxPriorityFeePerGas); + this.validateValue(maxFee); + this.validateValue(priorityFee); + if (priorityFee.isGreaterThan(maxFee)) { + throw new BuildTransactionError('maxPriorityFeePerGas cannot exceed maxFeePerGas'); + } } if (fee.gasPrice) { this.validateValue(new BigNumber(fee.gasPrice)); diff --git a/modules/abstract-eth/test/unit/transactionBuilder/walletInitialization.ts b/modules/abstract-eth/test/unit/transactionBuilder/walletInitialization.ts index 6db8f4b5f7..09dac4493e 100644 --- a/modules/abstract-eth/test/unit/transactionBuilder/walletInitialization.ts +++ b/modules/abstract-eth/test/unit/transactionBuilder/walletInitialization.ts @@ -129,3 +129,17 @@ export async function testRecoveryTransactionWithoutData(txBuilder: TransactionB await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing contract call data field'); }); } + +export function testEip1559PriorityFeeExceedsMaxFee(txBuilder: TransactionBuilder) { + it('fail when maxPriorityFeePerGas exceeds maxFeePerGas', () => { + (() => + txBuilder.fee({ + eip1559: { + maxFeePerGas: '1000000000', + maxPriorityFeePerGas: '9000000000', + }, + fee: '1000000000', + gasLimit: '21000', + })).should.throw('maxPriorityFeePerGas cannot exceed maxFeePerGas'); + }); +} diff --git a/modules/sdk-coin-eth/test/unit/transactionBuilder/walletInitialization.ts b/modules/sdk-coin-eth/test/unit/transactionBuilder/walletInitialization.ts index 0d99acff03..53a73a51ae 100644 --- a/modules/sdk-coin-eth/test/unit/transactionBuilder/walletInitialization.ts +++ b/modules/sdk-coin-eth/test/unit/transactionBuilder/walletInitialization.ts @@ -301,6 +301,26 @@ describe('Eth Transaction builder wallet initialization', function () { should.doesNotThrow(() => txBuilder.fee({ fee: '10' })); }); + it('eip1559 maxPriorityFeePerGas must not exceed maxFeePerGas', () => { + const txBuilder: any = getBuilder('eth'); + assert.throws( + () => + txBuilder.fee({ + fee: '1000000000', + gasLimit: '21000', + eip1559: { maxFeePerGas: '1000000000', maxPriorityFeePerGas: '9000000000' }, + }), + /maxPriorityFeePerGas cannot exceed maxFeePerGas/ + ); + should.doesNotThrow(() => + txBuilder.fee({ + fee: '1000000000', + gasLimit: '21000', + eip1559: { maxFeePerGas: '1000000000', maxPriorityFeePerGas: '1000000000' }, + }) + ); + }); + it('a private key', () => { const txBuilder: any = getBuilder('eth'); assert.throws(() => txBuilder.validateKey({ key: 'abc' }), /Invalid key/);