Multicall.test.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const { BN, expectRevert } = require('@openzeppelin/test-helpers');
  2. const ERC20MulticallMock = artifacts.require('$ERC20MulticallMock');
  3. contract('Multicall', function (accounts) {
  4. const [ deployer, alice, bob ] = accounts;
  5. const amount = 12000;
  6. beforeEach(async function () {
  7. this.multicallToken = await ERC20MulticallMock.new('name', 'symbol');
  8. await this.multicallToken.$_mint(deployer, amount);
  9. });
  10. it('batches function calls', async function () {
  11. expect(await this.multicallToken.balanceOf(alice)).to.be.bignumber.equal(new BN('0'));
  12. expect(await this.multicallToken.balanceOf(bob)).to.be.bignumber.equal(new BN('0'));
  13. await this.multicallToken.multicall([
  14. this.multicallToken.contract.methods.transfer(alice, amount / 2).encodeABI(),
  15. this.multicallToken.contract.methods.transfer(bob, amount / 3).encodeABI(),
  16. ], { from: deployer });
  17. expect(await this.multicallToken.balanceOf(alice)).to.be.bignumber.equal(new BN(amount / 2));
  18. expect(await this.multicallToken.balanceOf(bob)).to.be.bignumber.equal(new BN(amount / 3));
  19. });
  20. it('returns an array with the result of each call', async function () {
  21. const MulticallTest = artifacts.require('MulticallTest');
  22. const multicallTest = await MulticallTest.new({ from: deployer });
  23. await this.multicallToken.transfer(multicallTest.address, amount, { from: deployer });
  24. expect(await this.multicallToken.balanceOf(multicallTest.address)).to.be.bignumber.equal(new BN(amount));
  25. const recipients = [alice, bob];
  26. const amounts = [amount / 2, amount / 3].map(n => new BN(n));
  27. await multicallTest.checkReturnValues(this.multicallToken.address, recipients, amounts);
  28. });
  29. it('reverts previous calls', async function () {
  30. expect(await this.multicallToken.balanceOf(alice)).to.be.bignumber.equal(new BN('0'));
  31. const call = this.multicallToken.multicall([
  32. this.multicallToken.contract.methods.transfer(alice, amount).encodeABI(),
  33. this.multicallToken.contract.methods.transfer(bob, amount).encodeABI(),
  34. ], { from: deployer });
  35. await expectRevert(call, 'ERC20: transfer amount exceeds balance');
  36. expect(await this.multicallToken.balanceOf(alice)).to.be.bignumber.equal(new BN('0'));
  37. });
  38. it('bubbles up revert reasons', async function () {
  39. const call = this.multicallToken.multicall([
  40. this.multicallToken.contract.methods.transfer(alice, amount).encodeABI(),
  41. this.multicallToken.contract.methods.transfer(bob, amount).encodeABI(),
  42. ], { from: deployer });
  43. await expectRevert(call, 'ERC20: transfer amount exceeds balance');
  44. });
  45. });