diff --git a/index.d.ts b/index.d.ts index ea0948d..e603ac6 100644 --- a/index.d.ts +++ b/index.d.ts @@ -32,11 +32,9 @@ export interface TxManagerConfig { ESTIMATE_GAS?: boolean THROW_ON_REVERT?: boolean BLOCK_GAS_LIMIT?: number - PRIORITY_FEE_GWEI?: number BASE_FEE_RESERVE_PERCENTAGE?: number ENABLE_EIP1559?: boolean DEFAULT_PRIORITY_FEE?: number - PRIORITY_FEE_RESERVE_PERCENTAGE?: number } export interface TxManagerParams { @@ -80,7 +78,7 @@ export type MessageEvents = { } type TEventEmitter = typeof EventEmitter -declare interface TxManagerEventEmmiter extends TEventEmitter { +declare interface TxManagerEventEmitter extends TEventEmitter { on(event: U, listener: MessageEvents[U]): this on(event: 'confirmations', listener: MessageEvents['confirmations']): Promise @@ -92,7 +90,7 @@ export class Transaction { manager: TxManager tx: TransactionData private _promise: typeof PromiEvent - private _emitter: TxManagerEventEmmiter + private _emitter: TxManagerEventEmitter executed: boolean retries: number currentTxHash: string @@ -100,7 +98,7 @@ export class Transaction { constructor(tx: TransactionData, manager: TxManager) - send(): TxManagerEventEmmiter + send(): TxManagerEventEmitter replace(tx: TransactionData): Promise @@ -120,8 +118,6 @@ export class Transaction { private _hasError(message: string, errors: (string | RegExp)[]): boolean - private _getGasPrice(type: 'instant' | 'fast' | 'normal' | 'slow'): Promise - private _getLastNonce(): Promise private _getGasParams(): Promise diff --git a/src/Transaction.js b/src/Transaction.js index d6b0881..a9434ae 100644 --- a/src/Transaction.js +++ b/src/Transaction.js @@ -72,21 +72,27 @@ class Transaction { if (!tx.gasLimit) { const estimatedGasLimit = await this._estimateGas(tx) - tx.gasLimit = min( - estimatedGasLimit.mul(Math.floor(this.manager.config.GAS_LIMIT_MULTIPLIER * 100)).div(100), - this.manager.config.BLOCK_GAS_LIMIT, - ) - } + const gasLimit = estimatedGasLimit + .mul(Math.floor(this.manager.config.GAS_LIMIT_MULTIPLIER * 100)) + .div(100) + tx.gasLimit = this.manager.config.BLOCK_GAS_LIMIT + ? min(gasLimit, this.manager.config.BLOCK_GAS_LIMIT) + : gasLimit + } + // TODO: check if the new tx params is valid tx.chainId = this.tx.chainId tx.nonce = this.tx.nonce // can be different from `this.manager._nonce` // start no less than current tx gas params if (this.tx.gasPrice) { tx.gasPrice = max(this.tx.gasPrice, tx.gasPrice || 0) - } else { + } else if (this.tx.maxFeePerGas) { tx.maxFeePerGas = max(this.tx.maxFeePerGas, tx.maxFeePerGas || 0) tx.maxPriorityFeePerGas = max(this.tx.maxPriorityFeePerGas, tx.maxPriorityFeePerGas || 0) + } else { + const gasParams = await this._getGasParams() + tx = { ...tx, ...gasParams } } this.tx = { ...tx } @@ -418,9 +424,15 @@ class Transaction { */ async _getGasParams() { const maxGasPrice = parseUnits(this.manager.config.MAX_GAS_PRICE.toString(), 'gwei') - const gasParams = await this.manager._gasPriceOracle.getTxGasParams() - if (gasParams.gasPrice) gasParams.gasPrice = min(gasParams.gasPrice, maxGasPrice) - else gasParams.maxFeePerGas = min(gasParams?.maxFeePerGas, maxGasPrice) + const gasParams = await this.manager._gasPriceOracle.getTxGasParams({ + isLegacy: !this.manager.config.ENABLE_EIP1559, + }) + if (gasParams.gasPrice) { + gasParams.gasPrice = min(gasParams.gasPrice, maxGasPrice) + } else { + gasParams.maxFeePerGas = min(gasParams?.maxFeePerGas, maxGasPrice) + gasParams.maxPriorityFeePerGas = min(gasParams?.maxPriorityFeePerGas, maxGasPrice) + } gasParams.type = gasParams?.maxFeePerGas ? 2 : 0 return gasParams } diff --git a/test/TxManager.test.js b/test/TxManager.test.js index 5afe0b1..6ac7ee1 100644 --- a/test/TxManager.test.js +++ b/test/TxManager.test.js @@ -57,54 +57,68 @@ const getOptions = async () => { return { network, provider, options } } -const createTx = async transaction => { - const tx = this.manager.createTx(transaction) +const sendTx = async tx => { const receipt = await tx .send() .on('transactionHash', hash => console.log('hash', hash)) .on('mined', receipt => console.log('Mined in block', receipt.blockNumber)) .on('confirmations', confirmations => console.log('confirmations', confirmations)) console.log('receipt', receipt) + return receipt } const transactionTests = () => { it('should work legacy tx', async () => { - await createTx(tx1) + const tx = this.manager.createTx(tx1) + const receipt = await sendTx(tx) + receipt.type.should.equal(0) }) it('should work eip-1559 tx', async () => { - await createTx(tx5) + const tx = this.manager.createTx(tx5) + const receipt = await sendTx(tx) + receipt.type.should.equal(2) }) it('should fetch gas params', async () => { - await createTx(tx4) + const tx = this.manager.createTx(tx4) + await sendTx(tx) }) it('should bump gas params', async () => { - await createTx(tx2) + const tx = this.manager.createTx(tx2) + await sendTx(tx) }) it('should cancel', async () => { - await createTx(tx2) + const tx = this.manager.createTx(tx3) + setTimeout(() => tx.cancel(), 1000) + await sendTx(tx) }) it('should replace', async () => { - await createTx(tx2) + const tx = this.manager.createTx(tx3) + setTimeout(() => tx.replace(tx4), 1000) + const receipt = await sendTx(tx) + receipt.to.should.equal(tx4.to) }) it('should increase nonce', async () => { const currentNonce = await this.manager._wallet.getTransactionCount('latest') this.manager._nonce = currentNonce - 1 - await createTx(tx4) + const tx = this.manager.createTx(tx4) + await sendTx(tx) }) it('should disable eip-1559 transactions', async () => { this.manager.config.ENABLE_EIP1559 = false - await createTx(tx3) + const tx = this.manager.createTx(tx3) + const receipt = await sendTx(tx) + receipt.type.should.equal(0) this.manager.config.ENABLE_EIP1559 = true }) - it('should send multiple txs', async () => { + it.skip('should send multiple txs', async () => { const genTx = value => ({ value, to: '0x0039F22efB07A647557C7C5d17854CFD6D489eF3',