Clones.test.js 2.4 KB

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