57aa950a2f
* type definitions * remove Object.assign(), use BigNumber * path custom ethers provider to constructor. test * providers test * using gas-price-oracle v0.5.0 * manager params provider type * provider type fix * update deps * maxPriorityFee param, tests fix * fix: cancel/replace * fix: gasParams check * fix: handleRpcError with web3 provider Co-authored-by: Danil Kovtonyuk <danx.kov@gmail.com>
205 lines
6.0 KiB
JavaScript
205 lines
6.0 KiB
JavaScript
require('dotenv').config()
|
|
require('chai').should()
|
|
const { providers } = require('ethers')
|
|
const { parseUnits } = require('ethers').utils
|
|
const TxManager = require('../src/TxManager')
|
|
const Web3 = require('web3')
|
|
const { RPC_URL, PRIVATE_KEY } = process.env
|
|
|
|
const tx1 = {
|
|
value: 1,
|
|
gasPrice: parseUnits('2', 'gwei').toHexString(),
|
|
to: '0xA43Ce8Cc89Eff3AA5593c742fC56A30Ef2427CB0',
|
|
}
|
|
|
|
const tx2 = {
|
|
value: 1,
|
|
gasPrice: parseUnits('0.5', 'gwei').toHexString(),
|
|
to: '0xA43Ce8Cc89Eff3AA5593c742fC56A30Ef2427CB0',
|
|
}
|
|
|
|
const tx3 = {
|
|
value: 2,
|
|
to: '0x0039F22efB07A647557C7C5d17854CFD6D489eF3',
|
|
}
|
|
|
|
const tx4 = {
|
|
value: 1,
|
|
to: '0xA43Ce8Cc89Eff3AA5593c742fC56A30Ef2427CB0',
|
|
}
|
|
|
|
const tx5 = {
|
|
value: 1,
|
|
to: '0xA43Ce8Cc89Eff3AA5593c742fC56A30Ef2427CB0',
|
|
maxFeePerGas: parseUnits('7', 'gwei').toHexString(),
|
|
maxPriorityFeePerGas: parseUnits('1', 'gwei').toHexString(),
|
|
type: 2,
|
|
}
|
|
|
|
const defaultOptions = {
|
|
privateKey: PRIVATE_KEY,
|
|
rpcUrl: RPC_URL,
|
|
config: {
|
|
CONFIRMATIONS: 1,
|
|
GAS_BUMP_INTERVAL: 1000 * 20,
|
|
},
|
|
gasPriceOracleConfig: {
|
|
chainId: 1,
|
|
defaultRpc: RPC_URL,
|
|
},
|
|
provider: undefined,
|
|
}
|
|
|
|
const getOptions = async () => {
|
|
const provider = new providers.JsonRpcProvider(RPC_URL)
|
|
const network = await provider.getNetwork()
|
|
const options = { ...defaultOptions }
|
|
return { network, provider, options }
|
|
}
|
|
|
|
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 () => {
|
|
const tx = this.manager.createTx(tx1)
|
|
const receipt = await sendTx(tx)
|
|
receipt.type.should.equal(0)
|
|
})
|
|
|
|
it('should work eip-1559 tx', async () => {
|
|
const tx = this.manager.createTx(tx5)
|
|
const receipt = await sendTx(tx)
|
|
receipt.type.should.equal(2)
|
|
})
|
|
|
|
it('should fetch gas params', async () => {
|
|
const tx = this.manager.createTx(tx4)
|
|
await sendTx(tx)
|
|
})
|
|
|
|
it('should bump gas params', async () => {
|
|
const tx = this.manager.createTx(tx2)
|
|
await sendTx(tx)
|
|
})
|
|
|
|
it('should cancel', async () => {
|
|
const currentNonce = await this.manager._wallet.getTransactionCount('latest')
|
|
const tx = this.manager.createTx(tx3)
|
|
setTimeout(() => tx.cancel(), 1000)
|
|
const receipt = await sendTx(tx)
|
|
const transaction = await this.manager._provider.getTransaction(receipt.transactionHash)
|
|
transaction.value.toNumber().should.equal(0)
|
|
transaction.nonce.should.equal(currentNonce)
|
|
})
|
|
|
|
it('should replace', async () => {
|
|
const currentNonce = await this.manager._wallet.getTransactionCount('latest')
|
|
const tx = this.manager.createTx(tx3)
|
|
setTimeout(() => tx.replace(tx4), 1000)
|
|
const receipt = await sendTx(tx)
|
|
const transaction = await this.manager._provider.getTransaction(receipt.transactionHash)
|
|
receipt.to.should.equal(tx4.to)
|
|
transaction.nonce.should.equal(currentNonce)
|
|
})
|
|
|
|
it('should increase nonce', async () => {
|
|
const currentNonce = await this.manager._wallet.getTransactionCount('latest')
|
|
this.manager._nonce = currentNonce - 1
|
|
const tx = this.manager.createTx(tx4)
|
|
await sendTx(tx)
|
|
})
|
|
|
|
it('should disable eip-1559 transactions', async () => {
|
|
this.manager.config.ENABLE_EIP1559 = false
|
|
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 () => {
|
|
const genTx = value => ({
|
|
value,
|
|
to: '0x0039F22efB07A647557C7C5d17854CFD6D489eF3',
|
|
})
|
|
await Promise.all(Array.from({ length: 10 }).map(n => this.manager.createTx(genTx(n + 1)).send()))
|
|
}).timeout(600000)
|
|
}
|
|
|
|
describe('TxManager.default', () => {
|
|
before(async () => {
|
|
const {
|
|
network: { name, chainId },
|
|
options,
|
|
} = await getOptions()
|
|
options.chainId = chainId
|
|
console.log('default\n\n', 'network', { name, chainId }, '\n\n')
|
|
this.manager = new TxManager(options)
|
|
})
|
|
describe('#transaction', transactionTests)
|
|
})
|
|
|
|
describe('TxManager.EtherscanProvider', () => {
|
|
before(async () => {
|
|
const {
|
|
network: { name, chainId },
|
|
options,
|
|
} = await getOptions()
|
|
options.chainId = chainId
|
|
options.provider = new providers.EtherscanProvider(chainId, process.env.ETHERSCAN_API_KEY)
|
|
console.log('EtherscanProvider\n\n', 'network', { name, chainId }, '\n\n')
|
|
this.manager = new TxManager(options)
|
|
})
|
|
describe('#transaction', transactionTests)
|
|
})
|
|
|
|
describe('TxManager.AlchemyProvider', () => {
|
|
before(async () => {
|
|
const {
|
|
network: { name, chainId },
|
|
options,
|
|
} = await getOptions()
|
|
options.chainId = chainId
|
|
options.provider = new providers.AlchemyProvider(chainId, process.env.ALCHEMY_API_KEY)
|
|
console.log('AlchemyProvider\n\n', 'network', { name, chainId }, '\n\n')
|
|
this.manager = new TxManager(options)
|
|
})
|
|
describe('#transaction', transactionTests)
|
|
})
|
|
|
|
describe('TxManager.InfuraProvider', () => {
|
|
before(async () => {
|
|
const {
|
|
network: { name, chainId },
|
|
options,
|
|
} = await getOptions()
|
|
options.chainId = chainId
|
|
options.provider = new providers.InfuraProvider(chainId, process.env.INFURA_API_KEY)
|
|
console.log('InfuraProvider\n\n', 'network', { name, chainId }, '\n\n')
|
|
this.manager = new TxManager(options)
|
|
})
|
|
describe('#transaction', transactionTests)
|
|
})
|
|
|
|
describe('TxManager.Web3Provider', () => {
|
|
before(async () => {
|
|
const {
|
|
network: { name, chainId },
|
|
options,
|
|
} = await getOptions()
|
|
options.chainId = chainId
|
|
options.provider = new providers.Web3Provider(new Web3.providers.HttpProvider(RPC_URL))
|
|
console.log('Web3Provider\n\n', 'network', { name, chainId }, '\n\n')
|
|
this.manager = new TxManager(options)
|
|
})
|
|
describe('#transaction', transactionTests)
|
|
})
|