@openzeppelin/wizard 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +26 -1
  2. package/dist/add-pausable.d.ts.map +1 -1
  3. package/dist/add-pausable.js +2 -2
  4. package/dist/add-pausable.js.map +1 -1
  5. package/dist/api.d.ts +8 -0
  6. package/dist/api.d.ts.map +1 -1
  7. package/dist/api.js +15 -5
  8. package/dist/api.js.map +1 -1
  9. package/dist/build-generic.d.ts +4 -0
  10. package/dist/build-generic.d.ts.map +1 -1
  11. package/dist/build-generic.js +3 -0
  12. package/dist/build-generic.js.map +1 -1
  13. package/dist/common-options.js +2 -2
  14. package/dist/common-options.js.map +1 -1
  15. package/dist/custom.d.ts +11 -0
  16. package/dist/custom.d.ts.map +1 -0
  17. package/dist/custom.js +47 -0
  18. package/dist/custom.js.map +1 -0
  19. package/dist/custom.test.d.ts +2 -0
  20. package/dist/custom.test.d.ts.map +1 -0
  21. package/dist/custom.test.js +70 -0
  22. package/dist/custom.test.js.map +1 -0
  23. package/dist/erc1155.d.ts +2 -0
  24. package/dist/erc1155.d.ts.map +1 -1
  25. package/dist/erc1155.js +16 -7
  26. package/dist/erc1155.js.map +1 -1
  27. package/dist/erc1155.test.js +11 -0
  28. package/dist/erc1155.test.js.map +1 -1
  29. package/dist/erc20.d.ts +1 -0
  30. package/dist/erc20.d.ts.map +1 -1
  31. package/dist/erc20.js +8 -3
  32. package/dist/erc20.js.map +1 -1
  33. package/dist/erc20.test.js +7 -0
  34. package/dist/erc20.test.js.map +1 -1
  35. package/dist/erc721.d.ts +1 -0
  36. package/dist/erc721.d.ts.map +1 -1
  37. package/dist/erc721.js +7 -2
  38. package/dist/erc721.js.map +1 -1
  39. package/dist/erc721.test.js +6 -0
  40. package/dist/erc721.test.js.map +1 -1
  41. package/dist/generate/custom.d.ts +3 -0
  42. package/dist/generate/custom.d.ts.map +1 -0
  43. package/dist/generate/custom.js +20 -0
  44. package/dist/generate/custom.js.map +1 -0
  45. package/dist/generate/erc1155.d.ts.map +1 -1
  46. package/dist/generate/erc1155.js +1 -0
  47. package/dist/generate/erc1155.js.map +1 -1
  48. package/dist/generate/sources.d.ts.map +1 -1
  49. package/dist/generate/sources.js +5 -1
  50. package/dist/generate/sources.js.map +1 -1
  51. package/dist/governor.d.ts +1 -0
  52. package/dist/governor.d.ts.map +1 -1
  53. package/dist/governor.js +7 -1
  54. package/dist/governor.js.map +1 -1
  55. package/dist/governor.test.js +4 -0
  56. package/dist/governor.test.js.map +1 -1
  57. package/dist/index.d.ts +1 -1
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +2 -1
  60. package/dist/index.js.map +1 -1
  61. package/dist/kind.js +1 -0
  62. package/dist/kind.js.map +1 -1
  63. package/dist/print.d.ts.map +1 -1
  64. package/dist/print.js +16 -12
  65. package/dist/print.js.map +1 -1
  66. package/dist/set-access-control.d.ts +9 -2
  67. package/dist/set-access-control.d.ts.map +1 -1
  68. package/dist/set-access-control.js +27 -6
  69. package/dist/set-access-control.js.map +1 -1
  70. package/dist/set-upgradeable.d.ts.map +1 -1
  71. package/dist/set-upgradeable.js +1 -1
  72. package/dist/set-upgradeable.js.map +1 -1
  73. package/dist/test.js +30 -1
  74. package/dist/test.js.map +1 -1
  75. package/package.json +3 -3
  76. package/src/add-pausable.ts +3 -3
  77. package/src/api.ts +25 -8
  78. package/src/build-generic.ts +5 -0
  79. package/src/common-options.ts +2 -2
  80. package/src/custom.test.ts +80 -0
  81. package/src/custom.test.ts.md +154 -0
  82. package/src/custom.test.ts.snap +0 -0
  83. package/src/custom.ts +55 -0
  84. package/src/erc1155.test.ts +13 -0
  85. package/src/erc1155.test.ts.md +16 -0
  86. package/src/erc1155.test.ts.snap +0 -0
  87. package/src/erc1155.ts +17 -7
  88. package/src/erc20.test.ts +8 -0
  89. package/src/erc20.ts +8 -4
  90. package/src/erc721.test.ts +7 -0
  91. package/src/erc721.ts +7 -3
  92. package/src/generate/custom.ts +19 -0
  93. package/src/generate/erc1155.ts +1 -0
  94. package/src/generate/sources.ts +6 -1
  95. package/src/governor.test.ts +5 -0
  96. package/src/governor.ts +6 -1
  97. package/src/index.ts +1 -1
  98. package/src/kind.ts +1 -0
  99. package/src/print.ts +17 -12
  100. package/src/set-access-control.ts +27 -4
  101. package/src/set-upgradeable.ts +2 -2
  102. package/src/test.ts +34 -2
  103. package/dist/general.d.ts +0 -8
  104. package/dist/general.d.ts.map +0 -1
  105. package/dist/general.js +0 -22
  106. package/dist/general.js.map +0 -1
  107. package/dist/general.test.d.ts +0 -2
  108. package/dist/general.test.d.ts.map +0 -1
  109. package/dist/general.test.js +0 -42
  110. package/dist/general.test.js.map +0 -1
@@ -1,21 +1,42 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setAccessControl = exports.accessOptions = void 0;
3
+ exports.requireAccessControl = exports.setAccessControl = exports.accessOptions = void 0;
4
4
  const common_functions_1 = require("./common-functions");
5
- exports.accessOptions = ['ownable', 'roles'];
6
- function setAccessControl(c, fn, access, role) {
5
+ exports.accessOptions = [false, 'ownable', 'roles'];
6
+ /**
7
+ * Sets access control for the contract by adding inheritance.
8
+ */
9
+ function setAccessControl(c, access) {
7
10
  switch (access) {
8
11
  case 'ownable': {
9
12
  c.addParent(parents.Ownable);
10
- c.addModifier('onlyOwner', fn);
11
13
  break;
12
14
  }
13
15
  case 'roles': {
14
- const roleId = role + '_ROLE';
15
16
  if (c.addParent(parents.AccessControl)) {
16
17
  c.addConstructorCode('_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);');
17
18
  }
18
19
  c.addOverride(parents.AccessControl.name, common_functions_1.supportsInterface);
20
+ break;
21
+ }
22
+ }
23
+ }
24
+ exports.setAccessControl = setAccessControl;
25
+ /**
26
+ * Enables access control for the contract and restricts the given function with access control.
27
+ */
28
+ function requireAccessControl(c, fn, access, role) {
29
+ if (access === false) {
30
+ access = 'ownable';
31
+ }
32
+ setAccessControl(c, access);
33
+ switch (access) {
34
+ case 'ownable': {
35
+ c.addModifier('onlyOwner', fn);
36
+ break;
37
+ }
38
+ case 'roles': {
39
+ const roleId = role + '_ROLE';
19
40
  if (c.addVariable(`bytes32 public constant ${roleId} = keccak256("${roleId}");`)) {
20
41
  c.addConstructorCode(`_grantRole(${roleId}, msg.sender);`);
21
42
  }
@@ -24,7 +45,7 @@ function setAccessControl(c, fn, access, role) {
24
45
  }
25
46
  }
26
47
  }
27
- exports.setAccessControl = setAccessControl;
48
+ exports.requireAccessControl = requireAccessControl;
28
49
  const parents = {
29
50
  Ownable: {
30
51
  name: 'Ownable',
@@ -1 +1 @@
1
- {"version":3,"file":"set-access-control.js","sourceRoot":"","sources":["../src/set-access-control.ts"],"names":[],"mappings":";;;AACA,yDAAuD;AAE1C,QAAA,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU,CAAC;AAI3D,SAAgB,gBAAgB,CAAC,CAAkB,EAAE,EAAgB,EAAE,MAAc,EAAE,IAAY;IACjG,QAAQ,MAAM,EAAE;QACd,KAAK,SAAS,CAAC,CAAC;YACd,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC/B,MAAM;SACP;QACD,KAAK,OAAO,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;gBACtC,CAAC,CAAC,kBAAkB,CAAC,6CAA6C,CAAC,CAAC;aACrE;YACD,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,oCAAiB,CAAC,CAAC;YAC7D,IAAI,CAAC,CAAC,WAAW,CAAC,2BAA2B,MAAM,iBAAiB,MAAM,KAAK,CAAC,EAAE;gBAChF,CAAC,CAAC,kBAAkB,CAAC,cAAc,MAAM,gBAAgB,CAAC,CAAC;aAC5D;YACD,CAAC,CAAC,WAAW,CAAC,YAAY,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM;SACP;KACF;AACH,CAAC;AApBD,4CAoBC;AAED,MAAM,OAAO,GAAG;IACd,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,4CAA4C;KACnD;IACD,aAAa,EAAE;QACb,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,kDAAkD;KACzD;CACF,CAAC"}
1
+ {"version":3,"file":"set-access-control.js","sourceRoot":"","sources":["../src/set-access-control.ts"],"names":[],"mappings":";;;AACA,yDAAuD;AAE1C,QAAA,aAAa,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AAIlE;;GAEG;AACH,SAAgB,gBAAgB,CAAC,CAAkB,EAAE,MAAc;IACjE,QAAQ,MAAM,EAAE;QACd,KAAK,SAAS,CAAC,CAAC;YACd,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM;SACP;QACD,KAAK,OAAO,CAAC,CAAC;YACZ,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;gBACtC,CAAC,CAAC,kBAAkB,CAAC,6CAA6C,CAAC,CAAC;aACrE;YACD,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,oCAAiB,CAAC,CAAC;YAC7D,MAAM;SACP;KACF;AACH,CAAC;AAdD,4CAcC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,CAAkB,EAAE,EAAgB,EAAE,MAAc,EAAE,IAAY;IACrG,IAAI,MAAM,KAAK,KAAK,EAAE;QACpB,MAAM,GAAG,SAAS,CAAC;KACpB;IAED,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAE5B,QAAQ,MAAM,EAAE;QACd,KAAK,SAAS,CAAC,CAAC;YACd,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC/B,MAAM;SACP;QACD,KAAK,OAAO,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,CAAC,WAAW,CAAC,2BAA2B,MAAM,iBAAiB,MAAM,KAAK,CAAC,EAAE;gBAChF,CAAC,CAAC,kBAAkB,CAAC,cAAc,MAAM,gBAAgB,CAAC,CAAC;aAC5D;YACD,CAAC,CAAC,WAAW,CAAC,YAAY,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM;SACP;KACF;AACH,CAAC;AArBD,oDAqBC;AAED,MAAM,OAAO,GAAG;IACd,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,4CAA4C;KACnD;IACD,aAAa,EAAE;QACb,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,kDAAkD;KACzD;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"set-upgradeable.d.ts","sourceRoot":"","sources":["../src/set-upgradeable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,MAAM,EAAoB,MAAM,sBAAsB,CAAC;AAGhE,eAAO,MAAM,kBAAkB,yCAA0C,CAAC;AAE1E,oBAAY,WAAW,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAE5D,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,QA+B1F"}
1
+ {"version":3,"file":"set-upgradeable.d.ts","sourceRoot":"","sources":["../src/set-upgradeable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,MAAM,EAAwB,MAAM,sBAAsB,CAAC;AAGpE,eAAO,MAAM,kBAAkB,yCAA0C,CAAC;AAE1E,oBAAY,WAAW,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAE5D,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,QA+B1F"}
@@ -16,7 +16,7 @@ function setUpgradeable(c, upgradeable, access) {
16
16
  switch (upgradeable) {
17
17
  case 'transparent': break;
18
18
  case 'uups': {
19
- (0, set_access_control_1.setAccessControl)(c, functions._authorizeUpgrade, access, 'UPGRADER');
19
+ (0, set_access_control_1.requireAccessControl)(c, functions._authorizeUpgrade, access, 'UPGRADER');
20
20
  c.addParent({
21
21
  name: 'UUPSUpgradeable',
22
22
  path: '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol',
@@ -1 +1 @@
1
- {"version":3,"file":"set-upgradeable.js","sourceRoot":"","sources":["../src/set-upgradeable.ts"],"names":[],"mappings":";;;AACA,6DAAgE;AAChE,+DAA2D;AAE9C,QAAA,kBAAkB,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAU,CAAC;AAI1E,SAAgB,cAAc,CAAC,CAAkB,EAAE,WAAwB,EAAE,MAAc;IACzF,IAAI,WAAW,KAAK,KAAK,EAAE;QACzB,OAAO;KACR;IAED,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;IAErB,CAAC,CAAC,SAAS,CAAC;QACV,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,uDAAuD;KAC9D,CAAC,CAAC;IAEH,QAAQ,WAAW,EAAE;QACnB,KAAK,aAAa,CAAC,CAAC,MAAM;QAE1B,KAAK,MAAM,CAAC,CAAC;YACX,IAAA,qCAAgB,EAAC,CAAC,EAAE,SAAS,CAAC,iBAAiB,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YACrE,CAAC,CAAC,SAAS,CAAC;gBACV,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,yDAAyD;aAChE,CAAC,CAAC;YACH,CAAC,CAAC,WAAW,CAAC,iBAAiB,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC9D,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACnD,MAAM;SACP;QAED,OAAO,CAAC,CAAC;YACP,MAAM,CAAC,GAAU,WAAW,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;SACpD;KACF;AACH,CAAC;AA/BD,wCA+BC;AAED,MAAM,SAAS,GAAG,IAAA,kCAAe,EAAC;IAChC,iBAAiB,EAAE;QACjB,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;SAC/C;QACD,IAAI,EAAE,UAAU;KACjB;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"set-upgradeable.js","sourceRoot":"","sources":["../src/set-upgradeable.ts"],"names":[],"mappings":";;;AACA,6DAAoE;AACpE,+DAA2D;AAE9C,QAAA,kBAAkB,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAU,CAAC;AAI1E,SAAgB,cAAc,CAAC,CAAkB,EAAE,WAAwB,EAAE,MAAc;IACzF,IAAI,WAAW,KAAK,KAAK,EAAE;QACzB,OAAO;KACR;IAED,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;IAErB,CAAC,CAAC,SAAS,CAAC;QACV,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,uDAAuD;KAC9D,CAAC,CAAC;IAEH,QAAQ,WAAW,EAAE;QACnB,KAAK,aAAa,CAAC,CAAC,MAAM;QAE1B,KAAK,MAAM,CAAC,CAAC;YACX,IAAA,yCAAoB,EAAC,CAAC,EAAE,SAAS,CAAC,iBAAiB,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YACzE,CAAC,CAAC,SAAS,CAAC;gBACV,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,yDAAyD;aAChE,CAAC,CAAC;YACH,CAAC,CAAC,WAAW,CAAC,iBAAiB,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC9D,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACnD,MAAM;SACP;QAED,OAAO,CAAC,CAAC;YACP,MAAM,CAAC,GAAU,WAAW,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;SACpD;KACF;AACH,CAAC;AA/BD,wCA+BC;AAED,MAAM,SAAS,GAAG,IAAA,kCAAe,EAAC;IAChC,iBAAiB,EAAE;QACjB,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;SAC/C;QACD,IAAI,EAAE,UAAU;KACjB;CACF,CAAC,CAAC"}
package/dist/test.js CHANGED
@@ -5,9 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const ava_1 = __importDefault(require("ava"));
7
7
  const hardhat_1 = __importDefault(require("hardhat"));
8
- require("util");
9
8
  const path_1 = __importDefault(require("path"));
10
9
  const sources_1 = require("./generate/sources");
10
+ const api_1 = require("./api");
11
11
  (0, ava_1.default)('result compiles', async (t) => {
12
12
  const generatedSourcesPath = path_1.default.join(hardhat_1.default.config.paths.sources, 'generated');
13
13
  await (0, sources_1.writeGeneratedSources)(generatedSourcesPath, 'all');
@@ -20,4 +20,33 @@ const sources_1 = require("./generate/sources");
20
20
  await hardhat_1.default.run('compile');
21
21
  t.pass();
22
22
  });
23
+ function isAccessControlRequired(opts) {
24
+ switch (opts.kind) {
25
+ case 'ERC20':
26
+ return api_1.erc20.isAccessControlRequired(opts);
27
+ case 'ERC721':
28
+ return api_1.erc721.isAccessControlRequired(opts);
29
+ case 'ERC1155':
30
+ return api_1.erc1155.isAccessControlRequired(opts);
31
+ case 'Governor':
32
+ return api_1.governor.isAccessControlRequired(opts);
33
+ case 'Custom':
34
+ return api_1.custom.isAccessControlRequired(opts);
35
+ default:
36
+ throw new Error("No such kind");
37
+ }
38
+ }
39
+ (0, ava_1.default)('is access control required', async (t) => {
40
+ for (const contract of (0, sources_1.generateSources)('all')) {
41
+ const regexOwnable = /import.*Ownable(Upgradeable)?.sol.*/gm;
42
+ if (!contract.options.access) {
43
+ if (isAccessControlRequired(contract.options)) {
44
+ t.regex(contract.source, regexOwnable, JSON.stringify(contract.options));
45
+ }
46
+ else {
47
+ t.notRegex(contract.source, regexOwnable, JSON.stringify(contract.options));
48
+ }
49
+ }
50
+ }
51
+ });
23
52
  //# sourceMappingURL=test.js.map
package/dist/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAuB;AACvB,sDAA0B;AAC1B,gBAAiC;AACjC,gDAAwB;AAExB,gDAA2D;AAE3D,IAAA,aAAI,EAAC,iBAAiB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAChC,MAAM,oBAAoB,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9E,MAAM,IAAA,+BAAqB,EAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;IAEzD,2EAA2E;IAC3E,2EAA2E;IAC3E,wCAAwC;IACxC,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,iBAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE;QACxD,QAAQ,CAAC,eAAe,GAAG,EAAE,CAAC;KAC/B;IAED,MAAM,iBAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAuB;AACvB,sDAA0B;AAC1B,gDAAwB;AAExB,gDAA4E;AAE5E,+BAAiE;AAEjE,IAAA,aAAI,EAAC,iBAAiB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAChC,MAAM,oBAAoB,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9E,MAAM,IAAA,+BAAqB,EAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;IAEzD,2EAA2E;IAC3E,2EAA2E;IAC3E,wCAAwC;IACxC,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,iBAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE;QACxD,QAAQ,CAAC,eAAe,GAAG,EAAE,CAAC;KAC/B;IAED,MAAM,iBAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC,CAAC;AAEH,SAAS,uBAAuB,CAAC,IAAoB;IACnD,QAAO,IAAI,CAAC,IAAI,EAAE;QAChB,KAAK,OAAO;YACV,OAAO,WAAK,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC7C,KAAK,QAAQ;YACX,OAAO,YAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC9C,KAAK,SAAS;YACZ,OAAO,aAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC/C,KAAK,UAAU;YACb,OAAO,cAAQ,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAChD,KAAK,QAAQ;YACX,OAAO,YAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC9C;YACE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;KACnC;AACH,CAAC;AAED,IAAA,aAAI,EAAC,4BAA4B,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC3C,KAAK,MAAM,QAAQ,IAAI,IAAA,yBAAe,EAAC,KAAK,CAAC,EAAE;QAC7C,MAAM,YAAY,GAAG,uCAAuC,CAAC;QAE7D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE;YAC5B,IAAI,uBAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAC7C,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;aAC1E;iBAAM;gBACL,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;aAC7E;SACF;KACF;AACH,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openzeppelin/wizard",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "A boilerplate generator to get started with OpenZeppelin Contracts",
5
5
  "license": "MIT",
6
6
  "repository": "github:OpenZeppelin/contracts-wizard",
@@ -18,8 +18,8 @@
18
18
  "test:watch": "ava --watch"
19
19
  },
20
20
  "devDependencies": {
21
- "@openzeppelin/contracts": "4.6.0",
22
- "@openzeppelin/contracts-upgradeable": "4.6.0",
21
+ "@openzeppelin/contracts": "4.7.0",
22
+ "@openzeppelin/contracts-upgradeable": "4.7.0",
23
23
  "@types/node": "^10.17.51",
24
24
  "@types/rimraf": "^3.0.0",
25
25
  "array.prototype.flat": "^1.2.4",
@@ -1,5 +1,5 @@
1
1
  import type { ContractBuilder, BaseFunction } from './contract';
2
- import { Access, setAccessControl } from './set-access-control';
2
+ import { Access, requireAccessControl } from './set-access-control';
3
3
  import { defineFunctions } from './utils/define-functions';
4
4
 
5
5
  export function addPausable(c: ContractBuilder, access: Access, pausableFns: BaseFunction[]) {
@@ -12,10 +12,10 @@ export function addPausable(c: ContractBuilder, access: Access, pausableFns: Bas
12
12
  c.addModifier('whenNotPaused', fn);
13
13
  }
14
14
 
15
- setAccessControl(c, functions.pause, access, 'PAUSER');
15
+ requireAccessControl(c, functions.pause, access, 'PAUSER');
16
16
  c.addFunctionCode('_pause();', functions.pause);
17
17
 
18
- setAccessControl(c, functions.unpause, access, 'PAUSER');
18
+ requireAccessControl(c, functions.unpause, access, 'PAUSER');
19
19
  c.addFunctionCode('_unpause();', functions.unpause);
20
20
  }
21
21
 
package/src/api.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import type { CommonOptions } from './common-options';
2
- import { printERC20, defaults as erc20defaults, ERC20Options } from './erc20';
3
- import { printERC721, defaults as erc721defaults, ERC721Options } from './erc721';
4
- import { printERC1155, defaults as erc1155defaults, ERC1155Options } from './erc1155';
5
- import { printGovernor, defaults as governorDefaults, GovernorOptions } from './governor';
2
+ import { printERC20, defaults as erc20defaults, isAccessControlRequired as erc20IsAccessControlRequired, ERC20Options } from './erc20';
3
+ import { printERC721, defaults as erc721defaults, isAccessControlRequired as erc721IsAccessControlRequired, ERC721Options } from './erc721';
4
+ import { printERC1155, defaults as erc1155defaults, isAccessControlRequired as erc1155IsAccessControlRequired, ERC1155Options } from './erc1155';
5
+ import { printGovernor, defaults as governorDefaults, isAccessControlRequired as governorIsAccessControlRequired, GovernorOptions } from './governor';
6
+ import { printCustom, defaults as customDefaults, isAccessControlRequired as customIsAccessControlRequired, CustomOptions } from './custom';
6
7
 
7
8
  export interface WizardContractAPI<Options extends CommonOptions> {
8
9
  /**
@@ -14,26 +15,42 @@ export interface WizardContractAPI<Options extends CommonOptions> {
14
15
  * The default options that are used for `print`.
15
16
  */
16
17
  defaults: Required<Options>;
18
+
19
+ /**
20
+ * Whether any of the provided options require access control to be enabled. If this returns `true`, then calling `print` with the
21
+ * same options would cause the `access` option to default to `'ownable'` if it was `undefined` or `false`.
22
+ */
23
+ isAccessControlRequired: (opts: Partial<Options>) => boolean,
17
24
  }
18
25
 
19
26
  export type ERC20 = WizardContractAPI<ERC20Options>;
20
27
  export type ERC721 = WizardContractAPI<ERC721Options>;
21
28
  export type ERC1155 = WizardContractAPI<ERC1155Options>;
22
29
  export type Governor = WizardContractAPI<GovernorOptions>;
30
+ export type Custom = WizardContractAPI<CustomOptions>;
23
31
 
24
32
  export const erc20: ERC20 = {
25
33
  print: printERC20,
26
- defaults: erc20defaults
34
+ defaults: erc20defaults,
35
+ isAccessControlRequired: erc20IsAccessControlRequired
27
36
  }
28
37
  export const erc721: ERC721 = {
29
38
  print: printERC721,
30
- defaults: erc721defaults
39
+ defaults: erc721defaults,
40
+ isAccessControlRequired: erc721IsAccessControlRequired
31
41
  }
32
42
  export const erc1155: ERC1155 = {
33
43
  print: printERC1155,
34
- defaults: erc1155defaults
44
+ defaults: erc1155defaults,
45
+ isAccessControlRequired: erc1155IsAccessControlRequired
35
46
  }
36
47
  export const governor: Governor = {
37
48
  print: printGovernor,
38
- defaults: governorDefaults
49
+ defaults: governorDefaults,
50
+ isAccessControlRequired: governorIsAccessControlRequired
51
+ }
52
+ export const custom: Custom = {
53
+ print: printCustom,
54
+ defaults: customDefaults,
55
+ isAccessControlRequired: customIsAccessControlRequired
39
56
  }
@@ -1,3 +1,4 @@
1
+ import { CustomOptions, buildCustom } from './custom';
1
2
  import { ERC20Options, buildERC20 } from './erc20';
2
3
  import { ERC721Options, buildERC721 } from './erc721';
3
4
  import { ERC1155Options, buildERC1155 } from './erc1155';
@@ -8,6 +9,7 @@ export interface KindedOptions {
8
9
  ERC721: { kind: 'ERC721' } & ERC721Options;
9
10
  ERC1155: { kind: 'ERC1155' } & ERC1155Options;
10
11
  Governor: { kind: 'Governor' } & GovernorOptions;
12
+ Custom: { kind: 'Custom' } & CustomOptions;
11
13
  }
12
14
 
13
15
  export type GenericOptions = KindedOptions[keyof KindedOptions];
@@ -26,6 +28,9 @@ export function buildGeneric(opts: GenericOptions) {
26
28
  case 'Governor':
27
29
  return buildGovernor(opts);
28
30
 
31
+ case 'Custom':
32
+ return buildCustom(opts);
33
+
29
34
  default:
30
35
  const _: never = opts;
31
36
  throw new Error('Unknown ERC');
@@ -4,7 +4,7 @@ import { defaults as infoDefaults } from "./set-info";
4
4
  import type { Upgradeable } from "./set-upgradeable";
5
5
 
6
6
  export const defaults: Required<CommonOptions> = {
7
- access: 'ownable',
7
+ access: false,
8
8
  upgradeable: false,
9
9
  info: infoDefaults,
10
10
  } as const;
@@ -17,7 +17,7 @@ export interface CommonOptions {
17
17
 
18
18
  export function withCommonDefaults(opts: CommonOptions): Required<CommonOptions> {
19
19
  return {
20
- access: opts.access ?? 'ownable',
20
+ access: opts.access ?? false,
21
21
  upgradeable: opts.upgradeable ?? false,
22
22
  info: opts.info ?? {},
23
23
  };
@@ -0,0 +1,80 @@
1
+ import test from 'ava';
2
+ import { custom } from '.';
3
+
4
+ import { buildCustom, CustomOptions } from './custom';
5
+ import { printContract } from './print';
6
+
7
+ function testCustom(title: string, opts: Partial<CustomOptions>) {
8
+ test(title, t => {
9
+ const c = buildCustom({
10
+ name: 'MyContract',
11
+ ...opts,
12
+ });
13
+ t.snapshot(printContract(c));
14
+ });
15
+ }
16
+
17
+ /**
18
+ * Tests external API for equivalence with internal API
19
+ */
20
+ function testAPIEquivalence(title: string, opts?: CustomOptions) {
21
+ test(title, t => {
22
+ t.is(custom.print(opts), printContract(buildCustom({
23
+ name: 'MyContract',
24
+ ...opts,
25
+ })));
26
+ });
27
+ }
28
+
29
+ testCustom('custom', {});
30
+
31
+ testCustom('pausable', {
32
+ pausable: true,
33
+ });
34
+
35
+ testCustom('upgradeable transparent', {
36
+ upgradeable: 'transparent',
37
+ });
38
+
39
+ testCustom('upgradeable uups', {
40
+ upgradeable: 'uups',
41
+ });
42
+
43
+ testCustom('access control disabled', {
44
+ access: false,
45
+ });
46
+
47
+ testCustom('access control ownable', {
48
+ access: 'ownable',
49
+ });
50
+
51
+ testCustom('access control roles', {
52
+ access: 'roles',
53
+ });
54
+
55
+ testCustom('upgradeable uups with access control disabled', {
56
+ // API should override access to true since it is required for UUPS
57
+ access: false,
58
+ upgradeable: 'uups',
59
+ });
60
+
61
+ testAPIEquivalence('custom API default');
62
+
63
+ testAPIEquivalence('custom API basic', { name: 'CustomContract' });
64
+
65
+ testAPIEquivalence('custom API full upgradeable', {
66
+ name: 'CustomContract',
67
+ access: 'roles',
68
+ pausable: true,
69
+ upgradeable: 'uups',
70
+ });
71
+
72
+ test('custom API assert defaults', async t => {
73
+ t.is(custom.print(custom.defaults), custom.print());
74
+ });
75
+
76
+ test('API isAccessControlRequired', async t => {
77
+ t.is(custom.isAccessControlRequired({ pausable: true }), true);
78
+ t.is(custom.isAccessControlRequired({ upgradeable: 'uups' }), true);
79
+ t.is(custom.isAccessControlRequired({ upgradeable: 'transparent' }), false);
80
+ });
@@ -0,0 +1,154 @@
1
+ # Snapshot report for `src/custom.test.ts`
2
+
3
+ The actual snapshot is saved in `custom.test.ts.snap`.
4
+
5
+ Generated by [AVA](https://avajs.dev).
6
+
7
+ ## custom
8
+
9
+ > Snapshot 1
10
+
11
+ `// SPDX-License-Identifier: MIT␊
12
+ pragma solidity ^0.8.4;␊
13
+
14
+ contract MyContract {␊
15
+ }␊
16
+ `
17
+
18
+ ## pausable
19
+
20
+ > Snapshot 1
21
+
22
+ `// SPDX-License-Identifier: MIT␊
23
+ pragma solidity ^0.8.4;␊
24
+
25
+ import "@openzeppelin/contracts/security/Pausable.sol";␊
26
+ import "@openzeppelin/contracts/access/Ownable.sol";␊
27
+
28
+ contract MyContract is Pausable, Ownable {␊
29
+ function pause() public onlyOwner {␊
30
+ _pause();␊
31
+ }␊
32
+
33
+ function unpause() public onlyOwner {␊
34
+ _unpause();␊
35
+ }␊
36
+ }␊
37
+ `
38
+
39
+ ## upgradeable transparent
40
+
41
+ > Snapshot 1
42
+
43
+ `// SPDX-License-Identifier: MIT␊
44
+ pragma solidity ^0.8.4;␊
45
+
46
+ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊
47
+
48
+ contract MyContract is Initializable {␊
49
+ /// @custom:oz-upgrades-unsafe-allow constructor␊
50
+ constructor() {␊
51
+ _disableInitializers();␊
52
+ }␊
53
+ }␊
54
+ `
55
+
56
+ ## upgradeable uups
57
+
58
+ > Snapshot 1
59
+
60
+ `// SPDX-License-Identifier: MIT␊
61
+ pragma solidity ^0.8.4;␊
62
+
63
+ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊
64
+ import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊
65
+ import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊
66
+
67
+ contract MyContract is Initializable, OwnableUpgradeable, UUPSUpgradeable {␊
68
+ /// @custom:oz-upgrades-unsafe-allow constructor␊
69
+ constructor() {␊
70
+ _disableInitializers();␊
71
+ }␊
72
+
73
+ function initialize() initializer public {␊
74
+ __Ownable_init();␊
75
+ __UUPSUpgradeable_init();␊
76
+ }␊
77
+
78
+ function _authorizeUpgrade(address newImplementation)␊
79
+ internal␊
80
+ onlyOwner␊
81
+ override␊
82
+ {}␊
83
+ }␊
84
+ `
85
+
86
+ ## access control disabled
87
+
88
+ > Snapshot 1
89
+
90
+ `// SPDX-License-Identifier: MIT␊
91
+ pragma solidity ^0.8.4;␊
92
+
93
+ contract MyContract {␊
94
+ }␊
95
+ `
96
+
97
+ ## access control ownable
98
+
99
+ > Snapshot 1
100
+
101
+ `// SPDX-License-Identifier: MIT␊
102
+ pragma solidity ^0.8.4;␊
103
+
104
+ import "@openzeppelin/contracts/access/Ownable.sol";␊
105
+
106
+ contract MyContract is Ownable {␊
107
+ }␊
108
+ `
109
+
110
+ ## access control roles
111
+
112
+ > Snapshot 1
113
+
114
+ `// SPDX-License-Identifier: MIT␊
115
+ pragma solidity ^0.8.4;␊
116
+
117
+ import "@openzeppelin/contracts/access/AccessControl.sol";␊
118
+
119
+ contract MyContract is AccessControl {␊
120
+ constructor() {␊
121
+ _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);␊
122
+ }␊
123
+ }␊
124
+ `
125
+
126
+ ## upgradeable uups with access control disabled
127
+
128
+ > Snapshot 1
129
+
130
+ `// SPDX-License-Identifier: MIT␊
131
+ pragma solidity ^0.8.4;␊
132
+
133
+ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊
134
+ import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊
135
+ import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊
136
+
137
+ contract MyContract is Initializable, OwnableUpgradeable, UUPSUpgradeable {␊
138
+ /// @custom:oz-upgrades-unsafe-allow constructor␊
139
+ constructor() {␊
140
+ _disableInitializers();␊
141
+ }␊
142
+
143
+ function initialize() initializer public {␊
144
+ __Ownable_init();␊
145
+ __UUPSUpgradeable_init();␊
146
+ }␊
147
+
148
+ function _authorizeUpgrade(address newImplementation)␊
149
+ internal␊
150
+ onlyOwner␊
151
+ override␊
152
+ {}␊
153
+ }␊
154
+ `
Binary file
package/src/custom.ts ADDED
@@ -0,0 +1,55 @@
1
+ import { Contract, ContractBuilder } from './contract';
2
+ import { CommonOptions, withCommonDefaults, defaults as commonDefaults } from './common-options';
3
+ import { setUpgradeable } from './set-upgradeable';
4
+ import { setInfo } from './set-info';
5
+ import { setAccessControl } from './set-access-control';
6
+ import { addPausable } from './add-pausable';
7
+ import { printContract } from './print';
8
+
9
+ export interface CustomOptions extends CommonOptions {
10
+ name: string;
11
+ pausable?: boolean;
12
+ }
13
+
14
+ export const defaults: Required<CustomOptions> = {
15
+ name: 'MyContract',
16
+ pausable: false,
17
+ access: commonDefaults.access,
18
+ upgradeable: commonDefaults.upgradeable,
19
+ info: commonDefaults.info,
20
+ } as const;
21
+
22
+ function withDefaults(opts: CustomOptions): Required<CustomOptions> {
23
+ return {
24
+ ...opts,
25
+ ...withCommonDefaults(opts),
26
+ pausable: opts.pausable ?? defaults.pausable,
27
+ };
28
+ }
29
+
30
+ export function printCustom(opts: CustomOptions = defaults): string {
31
+ return printContract(buildCustom(opts));
32
+ }
33
+
34
+ export function isAccessControlRequired(opts: Partial<CustomOptions>): boolean {
35
+ return opts.pausable || opts.upgradeable === 'uups';
36
+ }
37
+
38
+ export function buildCustom(opts: CustomOptions): Contract {
39
+ const allOpts = withDefaults(opts);
40
+
41
+ const c = new ContractBuilder(allOpts.name);
42
+
43
+ const { access, upgradeable, info } = allOpts;
44
+
45
+ if (allOpts.pausable) {
46
+ addPausable(c, access, []);
47
+ }
48
+
49
+ setAccessControl(c, access);
50
+ setUpgradeable(c, upgradeable, access);
51
+ setInfo(c, info);
52
+
53
+ return c;
54
+ }
55
+
@@ -34,6 +34,10 @@ testERC1155('basic + roles', {
34
34
  access: 'roles',
35
35
  });
36
36
 
37
+ testERC1155('no updatable uri', {
38
+ updatableUri: false,
39
+ });
40
+
37
41
  testERC1155('burnable', {
38
42
  burnable: true,
39
43
  });
@@ -87,4 +91,13 @@ testAPIEquivalence('API full upgradeable', {
87
91
 
88
92
  test('API assert defaults', async t => {
89
93
  t.is(erc1155.print(erc1155.defaults), erc1155.print());
94
+ });
95
+
96
+ test('API isAccessControlRequired', async t => {
97
+ t.is(erc1155.isAccessControlRequired({ updatableUri: false, mintable: true }), true);
98
+ t.is(erc1155.isAccessControlRequired({ updatableUri: false, pausable: true }), true);
99
+ t.is(erc1155.isAccessControlRequired({ updatableUri: false, upgradeable: 'uups' }), true);
100
+ t.is(erc1155.isAccessControlRequired({ updatableUri: true }), true);
101
+ t.is(erc1155.isAccessControlRequired({ updatableUri: false}), false);
102
+ t.is(erc1155.isAccessControlRequired({}), true); // updatableUri is true by default
90
103
  });
@@ -62,6 +62,22 @@ Generated by [AVA](https://avajs.dev).
62
62
  }␊
63
63
  `
64
64
 
65
+ ## no updatable uri
66
+
67
+ > Snapshot 1
68
+
69
+ `// SPDX-License-Identifier: MIT␊
70
+ pragma solidity ^0.8.4;␊
71
+
72
+ import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊
73
+
74
+ contract MyToken is ERC1155 {␊
75
+ constructor()␊
76
+ ERC1155("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/")␊
77
+ {}␊
78
+ }␊
79
+ `
80
+
65
81
  ## burnable
66
82
 
67
83
  > Snapshot 1
Binary file