12345678910111213141516171819202122232425262728293031323334353637383940 |
- const { network } = require('hardhat');
- const { promisify } = require('util');
- const queue = promisify(setImmediate);
- async function countPendingTransactions () {
- return parseInt(
- await network.provider.send('eth_getBlockTransactionCountByNumber', ['pending']),
- );
- }
- async function batchInBlock (txs) {
- try {
- // disable auto-mining
- await network.provider.send('evm_setAutomine', [false]);
- // send all transactions
- const promises = txs.map(fn => fn());
- // wait for node to have all pending transactions
- while (txs.length > await countPendingTransactions()) {
- await queue();
- }
- // mine one block
- await network.provider.send('evm_mine');
- // fetch receipts
- const receipts = await Promise.all(promises);
- // Sanity check, all tx should be in the same block
- const minedBlocks = new Set(receipts.map(({ receipt }) => receipt.blockNumber));
- expect(minedBlocks.size).to.equal(1);
- return receipts;
- } finally {
- // enable auto-mining
- await network.provider.send('evm_setAutomine', [true]);
- }
- }
- module.exports = {
- countPendingTransactions,
- batchInBlock,
- };
|