Clones.test.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. const { expectEvent } = require('@openzeppelin/test-helpers');
  2. const { computeCreate2Address } = require('../helpers/create2');
  3. const { expect } = require('chai');
  4. const { expectRevertCustomError } = require('../helpers/customError');
  5. const shouldBehaveLikeClone = require('./Clones.behaviour');
  6. const Clones = artifacts.require('$Clones');
  7. contract('Clones', function (accounts) {
  8. const [deployer] = accounts;
  9. describe('clone', function () {
  10. shouldBehaveLikeClone(async (implementation, initData, opts = {}) => {
  11. const factory = await Clones.new();
  12. const receipt = await factory.$clone(implementation);
  13. const address = receipt.logs.find(({ event }) => event === 'return$clone').args.instance;
  14. await web3.eth.sendTransaction({ from: deployer, to: address, value: opts.value, data: initData });
  15. return { address };
  16. });
  17. });
  18. describe('cloneDeterministic', function () {
  19. shouldBehaveLikeClone(async (implementation, initData, opts = {}) => {
  20. const salt = web3.utils.randomHex(32);
  21. const factory = await Clones.new();
  22. const receipt = await factory.$cloneDeterministic(implementation, salt);
  23. const address = receipt.logs.find(({ event }) => event === 'return$cloneDeterministic').args.instance;
  24. await web3.eth.sendTransaction({ from: deployer, to: address, value: opts.value, data: initData });
  25. return { address };
  26. });
  27. it('address already used', async function () {
  28. const implementation = web3.utils.randomHex(20);
  29. const salt = web3.utils.randomHex(32);
  30. const factory = await Clones.new();
  31. // deploy once
  32. expectEvent(await factory.$cloneDeterministic(implementation, salt), 'return$cloneDeterministic');
  33. // deploy twice
  34. await expectRevertCustomError(factory.$cloneDeterministic(implementation, salt), 'ERC1167FailedCreateClone', []);
  35. });
  36. it('address prediction', async function () {
  37. const implementation = web3.utils.randomHex(20);
  38. const salt = web3.utils.randomHex(32);
  39. const factory = await Clones.new();
  40. const predicted = await factory.$predictDeterministicAddress(implementation, salt);
  41. const creationCode = [
  42. '0x3d602d80600a3d3981f3363d3d373d3d3d363d73',
  43. implementation.replace(/0x/, '').toLowerCase(),
  44. '5af43d82803e903d91602b57fd5bf3',
  45. ].join('');
  46. expect(computeCreate2Address(salt, creationCode, factory.address)).to.be.equal(predicted);
  47. expectEvent(await factory.$cloneDeterministic(implementation, salt), 'return$cloneDeterministic', {
  48. instance: predicted,
  49. });
  50. });
  51. });
  52. });