Multicall.test.js 2.5 KB

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