@openzeppelin/wizard 0.1.0

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 (235) hide show
  1. package/README.md +82 -0
  2. package/dist/add-pausable.d.ts +4 -0
  3. package/dist/add-pausable.d.ts.map +1 -0
  4. package/dist/add-pausable.js +30 -0
  5. package/dist/add-pausable.js.map +1 -0
  6. package/dist/api.d.ts +24 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +24 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/build-generic.d.ts +21 -0
  11. package/dist/build-generic.d.ts.map +1 -0
  12. package/dist/build-generic.js +24 -0
  13. package/dist/build-generic.js.map +1 -0
  14. package/dist/common-functions.d.ts +3 -0
  15. package/dist/common-functions.d.ts.map +1 -0
  16. package/dist/common-functions.js +13 -0
  17. package/dist/common-functions.js.map +1 -0
  18. package/dist/common-options.d.ts +11 -0
  19. package/dist/common-options.d.ts.map +1 -0
  20. package/dist/common-options.js +19 -0
  21. package/dist/common-options.js.map +1 -0
  22. package/dist/contract.d.ts +86 -0
  23. package/dist/contract.d.ts.map +1 -0
  24. package/dist/contract.js +125 -0
  25. package/dist/contract.js.map +1 -0
  26. package/dist/contract.test.d.ts +2 -0
  27. package/dist/contract.test.d.ts.map +1 -0
  28. package/dist/contract.test.js +147 -0
  29. package/dist/contract.test.js.map +1 -0
  30. package/dist/erc1155.d.ts +14 -0
  31. package/dist/erc1155.d.ts.map +1 -0
  32. package/dist/erc1155.js +130 -0
  33. package/dist/erc1155.js.map +1 -0
  34. package/dist/erc1155.test.d.ts +2 -0
  35. package/dist/erc1155.test.d.ts.map +1 -0
  36. package/dist/erc1155.test.js +80 -0
  37. package/dist/erc1155.test.js.map +1 -0
  38. package/dist/erc20.d.ts +19 -0
  39. package/dist/erc20.d.ts.map +1 -0
  40. package/dist/erc20.js +202 -0
  41. package/dist/erc20.js.map +1 -0
  42. package/dist/erc20.test.d.ts +2 -0
  43. package/dist/erc20.test.d.ts.map +1 -0
  44. package/dist/erc20.test.js +126 -0
  45. package/dist/erc20.test.js.map +1 -0
  46. package/dist/erc721.d.ts +18 -0
  47. package/dist/erc721.d.ts.map +1 -0
  48. package/dist/erc721.js +200 -0
  49. package/dist/erc721.js.map +1 -0
  50. package/dist/erc721.test.d.ts +2 -0
  51. package/dist/erc721.test.d.ts.map +1 -0
  52. package/dist/erc721.test.js +106 -0
  53. package/dist/erc721.test.js.map +1 -0
  54. package/dist/error.d.ts +8 -0
  55. package/dist/error.d.ts.map +1 -0
  56. package/dist/error.js +11 -0
  57. package/dist/error.js.map +1 -0
  58. package/dist/general.d.ts +8 -0
  59. package/dist/general.d.ts.map +1 -0
  60. package/dist/general.js +22 -0
  61. package/dist/general.js.map +1 -0
  62. package/dist/general.test.d.ts +2 -0
  63. package/dist/general.test.d.ts.map +1 -0
  64. package/dist/general.test.js +42 -0
  65. package/dist/general.test.js.map +1 -0
  66. package/dist/generate/alternatives.d.ts +7 -0
  67. package/dist/generate/alternatives.d.ts.map +1 -0
  68. package/dist/generate/alternatives.js +29 -0
  69. package/dist/generate/alternatives.js.map +1 -0
  70. package/dist/generate/erc1155.d.ts +3 -0
  71. package/dist/generate/erc1155.d.ts.map +1 -0
  72. package/dist/generate/erc1155.js +24 -0
  73. package/dist/generate/erc1155.js.map +1 -0
  74. package/dist/generate/erc20.d.ts +3 -0
  75. package/dist/generate/erc20.d.ts.map +1 -0
  76. package/dist/generate/erc20.js +28 -0
  77. package/dist/generate/erc20.js.map +1 -0
  78. package/dist/generate/erc721.d.ts +3 -0
  79. package/dist/generate/erc721.d.ts.map +1 -0
  80. package/dist/generate/erc721.js +28 -0
  81. package/dist/generate/erc721.js.map +1 -0
  82. package/dist/generate/governor.d.ts +3 -0
  83. package/dist/generate/governor.d.ts.map +1 -0
  84. package/dist/generate/governor.js +32 -0
  85. package/dist/generate/governor.js.map +1 -0
  86. package/dist/generate/sources.d.ts +16 -0
  87. package/dist/generate/sources.d.ts.map +1 -0
  88. package/dist/generate/sources.js +79 -0
  89. package/dist/generate/sources.js.map +1 -0
  90. package/dist/governor.d.ts +26 -0
  91. package/dist/governor.d.ts.map +1 -0
  92. package/dist/governor.js +386 -0
  93. package/dist/governor.js.map +1 -0
  94. package/dist/governor.test.d.ts +2 -0
  95. package/dist/governor.test.d.ts.map +1 -0
  96. package/dist/governor.test.js +104 -0
  97. package/dist/governor.test.js.map +1 -0
  98. package/dist/index.d.ts +17 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +25 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/kind.d.ts +4 -0
  103. package/dist/kind.d.ts.map +1 -0
  104. package/dist/kind.js +28 -0
  105. package/dist/kind.js.map +1 -0
  106. package/dist/options.d.ts +11 -0
  107. package/dist/options.d.ts.map +1 -0
  108. package/dist/options.js +40 -0
  109. package/dist/options.js.map +1 -0
  110. package/dist/print-versioned.d.ts +3 -0
  111. package/dist/print-versioned.d.ts.map +1 -0
  112. package/dist/print-versioned.js +12 -0
  113. package/dist/print-versioned.js.map +1 -0
  114. package/dist/print.d.ts +6 -0
  115. package/dist/print.d.ts.map +1 -0
  116. package/dist/print.js +182 -0
  117. package/dist/print.js.map +1 -0
  118. package/dist/scripts/prepare.d.ts +2 -0
  119. package/dist/scripts/prepare.d.ts.map +1 -0
  120. package/dist/scripts/prepare.js +52 -0
  121. package/dist/scripts/prepare.js.map +1 -0
  122. package/dist/set-access-control.d.ts +5 -0
  123. package/dist/set-access-control.d.ts.map +1 -0
  124. package/dist/set-access-control.js +38 -0
  125. package/dist/set-access-control.js.map +1 -0
  126. package/dist/set-info.d.ts +13 -0
  127. package/dist/set-info.d.ts.map +1 -0
  128. package/dist/set-info.js +17 -0
  129. package/dist/set-info.js.map +1 -0
  130. package/dist/set-upgradeable.d.ts +6 -0
  131. package/dist/set-upgradeable.d.ts.map +1 -0
  132. package/dist/set-upgradeable.js +43 -0
  133. package/dist/set-upgradeable.js.map +1 -0
  134. package/dist/test.d.ts +2 -0
  135. package/dist/test.d.ts.map +1 -0
  136. package/dist/test.js +23 -0
  137. package/dist/test.js.map +1 -0
  138. package/dist/utils/define-functions.d.ts +5 -0
  139. package/dist/utils/define-functions.d.ts.map +1 -0
  140. package/dist/utils/define-functions.js +11 -0
  141. package/dist/utils/define-functions.js.map +1 -0
  142. package/dist/utils/duration.d.ts +3 -0
  143. package/dist/utils/duration.d.ts.map +1 -0
  144. package/dist/utils/duration.js +31 -0
  145. package/dist/utils/duration.js.map +1 -0
  146. package/dist/utils/find-cover.d.ts +2 -0
  147. package/dist/utils/find-cover.d.ts.map +1 -0
  148. package/dist/utils/find-cover.js +23 -0
  149. package/dist/utils/find-cover.js.map +1 -0
  150. package/dist/utils/format-lines.d.ts +7 -0
  151. package/dist/utils/format-lines.d.ts.map +1 -0
  152. package/dist/utils/format-lines.js +30 -0
  153. package/dist/utils/format-lines.js.map +1 -0
  154. package/dist/utils/map-values.d.ts +2 -0
  155. package/dist/utils/map-values.d.ts.map +1 -0
  156. package/dist/utils/map-values.js +12 -0
  157. package/dist/utils/map-values.js.map +1 -0
  158. package/dist/utils/sorted-by.d.ts +2 -0
  159. package/dist/utils/sorted-by.d.ts.map +1 -0
  160. package/dist/utils/sorted-by.js +8 -0
  161. package/dist/utils/sorted-by.js.map +1 -0
  162. package/dist/utils/to-identifier.d.ts +2 -0
  163. package/dist/utils/to-identifier.d.ts.map +1 -0
  164. package/dist/utils/to-identifier.js +12 -0
  165. package/dist/utils/to-identifier.js.map +1 -0
  166. package/dist/utils/to-identifier.test.d.ts +2 -0
  167. package/dist/utils/to-identifier.test.d.ts.map +1 -0
  168. package/dist/utils/to-identifier.test.js +21 -0
  169. package/dist/utils/to-identifier.test.js.map +1 -0
  170. package/dist/utils/transitive-closure.d.ts +5 -0
  171. package/dist/utils/transitive-closure.d.ts.map +1 -0
  172. package/dist/utils/transitive-closure.js +27 -0
  173. package/dist/utils/transitive-closure.js.map +1 -0
  174. package/dist/zip.d.ts +4 -0
  175. package/dist/zip.d.ts.map +1 -0
  176. package/dist/zip.js +48 -0
  177. package/dist/zip.js.map +1 -0
  178. package/dist/zip.test.d.ts +2 -0
  179. package/dist/zip.test.d.ts.map +1 -0
  180. package/dist/zip.test.js +37 -0
  181. package/dist/zip.test.js.map +1 -0
  182. package/package.json +37 -0
  183. package/src/add-pausable.ts +32 -0
  184. package/src/api.ts +39 -0
  185. package/src/build-generic.ts +33 -0
  186. package/src/common-functions.ts +11 -0
  187. package/src/common-options.ts +24 -0
  188. package/src/contract.test.ts +164 -0
  189. package/src/contract.test.ts.md +272 -0
  190. package/src/contract.test.ts.snap +0 -0
  191. package/src/contract.ts +201 -0
  192. package/src/erc1155.test.ts +90 -0
  193. package/src/erc1155.test.ts.md +416 -0
  194. package/src/erc1155.test.ts.snap +0 -0
  195. package/src/erc1155.ts +160 -0
  196. package/src/erc20.test.ts +144 -0
  197. package/src/erc20.test.ts.md +571 -0
  198. package/src/erc20.test.ts.snap +0 -0
  199. package/src/erc20.ts +250 -0
  200. package/src/erc721.test.ts +122 -0
  201. package/src/erc721.test.ts.md +517 -0
  202. package/src/erc721.test.ts.snap +0 -0
  203. package/src/erc721.ts +250 -0
  204. package/src/error.ts +7 -0
  205. package/src/generate/alternatives.ts +38 -0
  206. package/src/generate/erc1155.ts +23 -0
  207. package/src/generate/erc20.ts +27 -0
  208. package/src/generate/erc721.ts +27 -0
  209. package/src/generate/governor.ts +30 -0
  210. package/src/generate/sources.ts +91 -0
  211. package/src/governor.test.ts +120 -0
  212. package/src/governor.test.ts.md +1419 -0
  213. package/src/governor.test.ts.snap +0 -0
  214. package/src/governor.ts +445 -0
  215. package/src/index.ts +23 -0
  216. package/src/kind.ts +30 -0
  217. package/src/options.ts +45 -0
  218. package/src/print-versioned.ts +12 -0
  219. package/src/print.ts +236 -0
  220. package/src/scripts/prepare.ts +60 -0
  221. package/src/set-access-control.ts +39 -0
  222. package/src/set-info.ts +24 -0
  223. package/src/set-upgradeable.ts +49 -0
  224. package/src/test.ts +21 -0
  225. package/src/utils/define-functions.ts +18 -0
  226. package/src/utils/duration.ts +34 -0
  227. package/src/utils/find-cover.ts +26 -0
  228. package/src/utils/format-lines.ts +31 -0
  229. package/src/utils/map-values.ts +10 -0
  230. package/src/utils/sorted-by.ts +3 -0
  231. package/src/utils/to-identifier.test.ts +20 -0
  232. package/src/utils/to-identifier.ts +7 -0
  233. package/src/utils/transitive-closure.ts +27 -0
  234. package/src/zip.test.ts +35 -0
  235. package/src/zip.ts +53 -0
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findCover = void 0;
4
+ const sorted_by_1 = require("./sorted-by");
5
+ // Greedy approximation of minimum set cover.
6
+ function findCover(sets, getElements) {
7
+ const sortedSets = (0, sorted_by_1.sortedBy)(sets.map(set => ({ set, elems: getElements(set) })), s => -s.elems.length);
8
+ const seen = new Set();
9
+ const res = [];
10
+ for (const { set, elems } of sortedSets) {
11
+ let included = false;
12
+ for (const e of elems) {
13
+ if (!included && !seen.has(e)) {
14
+ res.push(set);
15
+ included = true;
16
+ }
17
+ seen.add(e);
18
+ }
19
+ }
20
+ return res;
21
+ }
22
+ exports.findCover = findCover;
23
+ //# sourceMappingURL=find-cover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-cover.js","sourceRoot":"","sources":["../../src/utils/find-cover.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AAEvC,6CAA6C;AAE7C,SAAgB,SAAS,CAAmB,IAAS,EAAE,WAAkC;IACvF,MAAM,UAAU,GAAG,IAAA,oBAAQ,EACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EACnD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CACrB,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;IAChC,MAAM,GAAG,GAAG,EAAE,CAAC;IAEf,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE;QACvC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;YACrB,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC7B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC;aACjB;YACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACb;KACF;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AArBD,8BAqBC"}
@@ -0,0 +1,7 @@
1
+ import 'array.prototype.flatmap/auto';
2
+ export declare type Lines = string | typeof whitespace | Lines[];
3
+ declare const whitespace: unique symbol;
4
+ export declare function formatLines(...lines: Lines[]): string;
5
+ export declare function spaceBetween(...lines: Lines[][]): Lines[];
6
+ export {};
7
+ //# sourceMappingURL=format-lines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-lines.d.ts","sourceRoot":"","sources":["../../src/utils/format-lines.ts"],"names":[],"mappings":"AAAA,OAAO,8BAA8B,CAAC;AAEtC,oBAAY,KAAK,GAAG,MAAM,GAAG,OAAO,UAAU,GAAG,KAAK,EAAE,CAAC;AAEzD,QAAA,MAAM,UAAU,eAAuB,CAAC;AAExC,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,CAErD;AAiBD,wBAAgB,YAAY,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,CAKzD"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.spaceBetween = exports.formatLines = void 0;
4
+ require("array.prototype.flatmap/auto");
5
+ const whitespace = Symbol('whitespace');
6
+ function formatLines(...lines) {
7
+ return [...indentEach(0, lines)].join('\n') + '\n';
8
+ }
9
+ exports.formatLines = formatLines;
10
+ function* indentEach(indent, lines) {
11
+ for (const line of lines) {
12
+ if (line === whitespace) {
13
+ yield '';
14
+ }
15
+ else if (Array.isArray(line)) {
16
+ yield* indentEach(indent + 1, line);
17
+ }
18
+ else {
19
+ yield ' '.repeat(indent) + line;
20
+ }
21
+ }
22
+ }
23
+ function spaceBetween(...lines) {
24
+ return lines
25
+ .filter(l => l.length > 0)
26
+ .flatMap(l => [whitespace, ...l])
27
+ .slice(1);
28
+ }
29
+ exports.spaceBetween = spaceBetween;
30
+ //# sourceMappingURL=format-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-lines.js","sourceRoot":"","sources":["../../src/utils/format-lines.ts"],"names":[],"mappings":";;;AAAA,wCAAsC;AAItC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAExC,SAAgB,WAAW,CAAC,GAAG,KAAc;IAC3C,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACrD,CAAC;AAFD,kCAEC;AAED,QAAQ,CAAC,CAAC,UAAU,CAClB,MAAc,EACd,KAAc;IAEd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,IAAI,KAAK,UAAU,EAAE;YACvB,MAAM,EAAE,CAAC;SACV;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC9B,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;SACrC;aAAM;YACL,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;SACpC;KACF;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,GAAG,KAAgB;IAC9C,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SACzB,OAAO,CAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACvC,KAAK,CAAC,CAAC,CAAC,CAAC;AACd,CAAC;AALD,oCAKC"}
@@ -0,0 +1,2 @@
1
+ export declare function mapValues<K extends keyof any, V, W>(obj: Record<K, V>, fn: (val: V) => W): Record<K, W>;
2
+ //# sourceMappingURL=map-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-values.d.ts","sourceRoot":"","sources":["../../src/utils/map-values.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EACjD,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACjB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAChB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAMd"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapValues = void 0;
4
+ function mapValues(obj, fn) {
5
+ const res = {};
6
+ for (const key in obj) {
7
+ res[key] = fn(obj[key]);
8
+ }
9
+ return res;
10
+ }
11
+ exports.mapValues = mapValues;
12
+ //# sourceMappingURL=map-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-values.js","sourceRoot":"","sources":["../../src/utils/map-values.ts"],"names":[],"mappings":";;;AAAA,SAAgB,SAAS,CACvB,GAAiB,EACjB,EAAiB;IAEjB,MAAM,GAAG,GAAG,EAAkB,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;QACrB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;KACzB;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AATD,8BASC"}
@@ -0,0 +1,2 @@
1
+ export declare function sortedBy<T>(xs: Iterable<T>, fn: (x: T) => number): T[];
2
+ //# sourceMappingURL=sorted-by.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorted-by.d.ts","sourceRoot":"","sources":["../../src/utils/sorted-by.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,CAAC,EAAE,CAEtE"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sortedBy = void 0;
4
+ function sortedBy(xs, fn) {
5
+ return Array.from(xs).sort((a, b) => fn(a) - fn(b));
6
+ }
7
+ exports.sortedBy = sortedBy;
8
+ //# sourceMappingURL=sorted-by.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorted-by.js","sourceRoot":"","sources":["../../src/utils/sorted-by.ts"],"names":[],"mappings":";;;AAAA,SAAgB,QAAQ,CAAI,EAAe,EAAE,EAAoB;IAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAFD,4BAEC"}
@@ -0,0 +1,2 @@
1
+ export declare function toIdentifier(str: string, capitalize?: boolean): string;
2
+ //# sourceMappingURL=to-identifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-identifier.d.ts","sourceRoot":"","sources":["../../src/utils/to-identifier.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,MAAM,CAMpE"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toIdentifier = void 0;
4
+ function toIdentifier(str, capitalize = false) {
5
+ return str
6
+ .normalize('NFD').replace(/[\u0300-\u036f]/g, '') // remove accents
7
+ .replace(/^[^a-zA-Z$_]+/, '')
8
+ .replace(/^(.)/, c => capitalize ? c.toUpperCase() : c)
9
+ .replace(/[^\w$]+(.?)/g, (_, c) => c.toUpperCase());
10
+ }
11
+ exports.toIdentifier = toIdentifier;
12
+ //# sourceMappingURL=to-identifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-identifier.js","sourceRoot":"","sources":["../../src/utils/to-identifier.ts"],"names":[],"mappings":";;;AAAA,SAAgB,YAAY,CAAC,GAAW,EAAE,UAAU,GAAG,KAAK;IAC1D,OAAO,GAAG;SACP,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,iBAAiB;SAClE,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SACtD,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACxD,CAAC;AAND,oCAMC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=to-identifier.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-identifier.test.d.ts","sourceRoot":"","sources":["../../src/utils/to-identifier.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ava_1 = __importDefault(require("ava"));
7
+ const to_identifier_1 = require("./to-identifier");
8
+ (0, ava_1.default)('unmodified', t => {
9
+ t.is((0, to_identifier_1.toIdentifier)('abc'), 'abc');
10
+ });
11
+ (0, ava_1.default)('remove leading specials', t => {
12
+ t.is((0, to_identifier_1.toIdentifier)('--abc'), 'abc');
13
+ });
14
+ (0, ava_1.default)('remove specials and upcase next char', t => {
15
+ t.is((0, to_identifier_1.toIdentifier)('abc-def'), 'abcDef');
16
+ t.is((0, to_identifier_1.toIdentifier)('abc--def'), 'abcDef');
17
+ });
18
+ (0, ava_1.default)('capitalize', t => {
19
+ t.is((0, to_identifier_1.toIdentifier)('abc', true), 'Abc');
20
+ });
21
+ //# sourceMappingURL=to-identifier.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-identifier.test.js","sourceRoot":"","sources":["../../src/utils/to-identifier.test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAuB;AAEvB,mDAA+C;AAE/C,IAAA,aAAI,EAAC,YAAY,EAAE,CAAC,CAAC,EAAE;IACrB,CAAC,CAAC,EAAE,CAAC,IAAA,4BAAY,EAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAA,aAAI,EAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE;IAClC,CAAC,CAAC,EAAE,CAAC,IAAA,4BAAY,EAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAA,aAAI,EAAC,sCAAsC,EAAE,CAAC,CAAC,EAAE;IAC/C,CAAC,CAAC,EAAE,CAAC,IAAA,4BAAY,EAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,EAAE,CAAC,IAAA,4BAAY,EAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,IAAA,aAAI,EAAC,YAAY,EAAE,CAAC,CAAC,EAAE;IACrB,CAAC,CAAC,EAAE,CAAC,IAAA,4BAAY,EAAC,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ declare type T = string;
2
+ export declare function transitiveClosure(obj: Record<T, Iterable<T>>): Record<T, Set<T>>;
3
+ export declare function reachable(obj: Record<T, Iterable<T>>, key: T): Set<T>;
4
+ export {};
5
+ //# sourceMappingURL=transitive-closure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitive-closure.d.ts","sourceRoot":"","sources":["../../src/utils/transitive-closure.ts"],"names":[],"mappings":"AAAA,aAAK,CAAC,GAAG,MAAM,CAAC;AAEhB,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAQhF;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAcrE"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reachable = exports.transitiveClosure = void 0;
4
+ function transitiveClosure(obj) {
5
+ const closure = {};
6
+ for (const key in obj) {
7
+ closure[key] = reachable(obj, key);
8
+ }
9
+ return closure;
10
+ }
11
+ exports.transitiveClosure = transitiveClosure;
12
+ function reachable(obj, key) {
13
+ var _a;
14
+ let prevSize = 0;
15
+ const res = new Set(obj[key]);
16
+ while (prevSize < res.size) {
17
+ prevSize = res.size;
18
+ for (const k of res) {
19
+ for (const v of (_a = obj[k]) !== null && _a !== void 0 ? _a : []) {
20
+ res.add(v);
21
+ }
22
+ }
23
+ }
24
+ return res;
25
+ }
26
+ exports.reachable = reachable;
27
+ //# sourceMappingURL=transitive-closure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitive-closure.js","sourceRoot":"","sources":["../../src/utils/transitive-closure.ts"],"names":[],"mappings":";;;AAEA,SAAgB,iBAAiB,CAAC,GAA2B;IAC3D,MAAM,OAAO,GAAG,EAAuB,CAAC;IAExC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;KACpC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AARD,8CAQC;AAED,SAAgB,SAAS,CAAC,GAA2B,EAAE,GAAM;;IAC3D,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE9B,OAAO,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE;QAC1B,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE;YACnB,KAAK,MAAM,CAAC,IAAI,MAAA,GAAG,CAAC,CAAC,CAAC,mCAAI,EAAE,EAAE;gBAC5B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACZ;SACF;KACF;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAdD,8BAcC"}
package/dist/zip.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import JSZip from 'jszip';
2
+ import type { Contract } from './contract';
3
+ export declare function zipContract(c: Contract): JSZip;
4
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../src/zip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,QAAQ,EAA8C,MAAM,YAAY,CAAC;AAsBvF,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CA4B9C"}
package/dist/zip.js ADDED
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.zipContract = void 0;
7
+ const jszip_1 = __importDefault(require("jszip"));
8
+ const print_1 = require("./print");
9
+ const transitive_closure_1 = require("./utils/transitive-closure");
10
+ const openzeppelin_contracts_1 = __importDefault(require("../openzeppelin-contracts"));
11
+ const options_1 = require("./options");
12
+ const readme = (variant) => `\
13
+ # OpenZeppelin Contracts
14
+
15
+ The files in this directory were sourced unmodified from OpenZeppelin Contracts v${openzeppelin_contracts_1.default.version}.
16
+
17
+ They are not meant to be edited.
18
+
19
+ The originals can be found on [GitHub] and [npm].
20
+
21
+ [GitHub]: https://github.com/OpenZeppelin/openzeppelin-contracts${variant}/tree/v${openzeppelin_contracts_1.default.version}
22
+ [npm]: https://www.npmjs.com/package/@openzeppelin/contracts${variant}/v/${openzeppelin_contracts_1.default.version}
23
+
24
+ Generated with OpenZeppelin Contracts Wizard (https://zpl.in/wizard).
25
+ `;
26
+ function zipContract(c) {
27
+ const { transformImport } = (0, options_1.withHelpers)(c);
28
+ const contractsVariant = c.upgradeable ? '-upgradeable' : '';
29
+ const fileName = c.name + '.sol';
30
+ const dependencies = {
31
+ [fileName]: c.parents.map(p => transformImport(p.contract.path)),
32
+ ...openzeppelin_contracts_1.default.dependencies,
33
+ };
34
+ const allImports = (0, transitive_closure_1.reachable)(dependencies, fileName);
35
+ const zip = new jszip_1.default();
36
+ zip.file(fileName, (0, print_1.printContract)(c, { transformImport: p => './' + p }));
37
+ zip.file(`@openzeppelin/contracts${contractsVariant}/README.md`, readme(contractsVariant));
38
+ for (const importPath of allImports) {
39
+ const source = openzeppelin_contracts_1.default.sources[importPath];
40
+ if (source === undefined) {
41
+ throw new Error(`Source for ${importPath} not found`);
42
+ }
43
+ zip.file(importPath, source);
44
+ }
45
+ return zip;
46
+ }
47
+ exports.zipContract = zipContract;
48
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../src/zip.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,mCAAwC;AACxC,mEAAuD;AAEvD,uFAAkD;AAClD,uCAAwC;AAExC,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC;;;mFAG+C,gCAAS,CAAC,OAAO;;;;;;kEAMlC,OAAO,UAAU,gCAAS,CAAC,OAAO;8DACtC,OAAO,MAAM,gCAAS,CAAC,OAAO;;;CAG3F,CAAC;AAEF,SAAgB,WAAW,CAAC,CAAW;IACrC,MAAM,EAAE,eAAe,EAAE,GAAG,IAAA,qBAAW,EAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,gBAAgB,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC;IAEjC,MAAM,YAAY,GAAG;QACnB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChE,GAAG,gCAAS,CAAC,YAAY;KAC1B,CAAC;IAEF,MAAM,UAAU,GAAG,IAAA,8BAAS,EAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,IAAI,eAAK,EAAE,CAAC;IAExB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAA,qBAAa,EAAC,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzE,GAAG,CAAC,IAAI,CAAC,0BAA0B,gBAAgB,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAE3F,KAAK,MAAM,UAAU,IAAI,UAAU,EAAE;QACnC,MAAM,MAAM,GAAG,gCAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,MAAM,IAAI,KAAK,CAAC,cAAc,UAAU,YAAY,CAAC,CAAC;SACvD;QACD,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;KAC9B;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AA5BD,kCA4BC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=zip.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.test.d.ts","sourceRoot":"","sources":["../src/zip.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ava_1 = __importDefault(require("ava"));
7
+ const zip_1 = require("./zip");
8
+ const erc20_1 = require("./erc20");
9
+ const sources_1 = require("./generate/sources");
10
+ const build_generic_1 = require("./build-generic");
11
+ (0, ava_1.default)('erc20 basic', t => {
12
+ const c = (0, erc20_1.buildERC20)({ name: 'MyToken', symbol: 'MTK' });
13
+ const zip = (0, zip_1.zipContract)(c);
14
+ const files = Object.values(zip.files).map(f => f.name).sort();
15
+ t.deepEqual(files, [
16
+ '@openzeppelin/',
17
+ '@openzeppelin/contracts/',
18
+ '@openzeppelin/contracts/README.md',
19
+ '@openzeppelin/contracts/token/',
20
+ '@openzeppelin/contracts/token/ERC20/',
21
+ '@openzeppelin/contracts/token/ERC20/ERC20.sol',
22
+ '@openzeppelin/contracts/token/ERC20/IERC20.sol',
23
+ '@openzeppelin/contracts/token/ERC20/extensions/',
24
+ '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol',
25
+ '@openzeppelin/contracts/utils/',
26
+ '@openzeppelin/contracts/utils/Context.sol',
27
+ 'MyToken.sol',
28
+ ]);
29
+ });
30
+ (0, ava_1.default)('can zip all combinations', t => {
31
+ for (const { options } of (0, sources_1.generateSources)('all')) {
32
+ const c = (0, build_generic_1.buildGeneric)(options);
33
+ (0, zip_1.zipContract)(c);
34
+ }
35
+ t.pass();
36
+ });
37
+ //# sourceMappingURL=zip.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.test.js","sourceRoot":"","sources":["../src/zip.test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAuB;AAEvB,+BAAoC;AACpC,mCAAqC;AACrC,gDAAqD;AACrD,mDAA+C;AAE/C,IAAA,aAAI,EAAC,aAAa,EAAE,CAAC,CAAC,EAAE;IACtB,MAAM,CAAC,GAAG,IAAA,kBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,IAAA,iBAAW,EAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAE/D,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE;QACjB,gBAAgB;QAChB,0BAA0B;QAC1B,mCAAmC;QACnC,gCAAgC;QAChC,sCAAsC;QACtC,+CAA+C;QAC/C,gDAAgD;QAChD,iDAAiD;QACjD,mEAAmE;QACnE,gCAAgC;QAChC,2CAA2C;QAC3C,aAAa;KACd,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,aAAI,EAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE;IACnC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,IAAA,yBAAe,EAAC,KAAK,CAAC,EAAE;QAChD,MAAM,CAAC,GAAG,IAAA,4BAAY,EAAC,OAAO,CAAC,CAAC;QAChC,IAAA,iBAAW,EAAC,CAAC,CAAC,CAAC;KAChB;IACD,CAAC,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@openzeppelin/wizard",
3
+ "version": "0.1.0",
4
+ "description": "A boilerplate generator to get started with OpenZeppelin Contracts",
5
+ "license": "MIT",
6
+ "repository": "github:OpenZeppelin/contracts-wizard",
7
+ "main": "dist/index.js",
8
+ "ts:main": "src/index.ts",
9
+ "files": [
10
+ "/dist",
11
+ "/src",
12
+ "!*.test.{js,d.ts}{,.map}"
13
+ ],
14
+ "scripts": {
15
+ "prepare": "tsc && node dist/scripts/prepare.js",
16
+ "prepublish": "rimraf dist *.tsbuildinfo && hardhat clean",
17
+ "test": "ava",
18
+ "test:watch": "ava --watch"
19
+ },
20
+ "devDependencies": {
21
+ "@openzeppelin/contracts": "4.6.0",
22
+ "@openzeppelin/contracts-upgradeable": "4.6.0",
23
+ "@types/node": "^10.17.51",
24
+ "@types/rimraf": "^3.0.0",
25
+ "array.prototype.flat": "^1.2.4",
26
+ "ava": "^4.0.0",
27
+ "hardhat": "^2.1.1",
28
+ "jszip": "^3.6.0",
29
+ "rimraf": "^3.0.2",
30
+ "solidity-ast": "^0.4.18",
31
+ "ts-node": "^10.4.0",
32
+ "typescript": "^4.1.3"
33
+ },
34
+ "dependencies": {
35
+ "array.prototype.flatmap": "^1.2.4"
36
+ }
37
+ }
@@ -0,0 +1,32 @@
1
+ import type { ContractBuilder, BaseFunction } from './contract';
2
+ import { Access, setAccessControl } from './set-access-control';
3
+ import { defineFunctions } from './utils/define-functions';
4
+
5
+ export function addPausable(c: ContractBuilder, access: Access, pausableFns: BaseFunction[]) {
6
+ c.addParent({
7
+ name: 'Pausable',
8
+ path: '@openzeppelin/contracts/security/Pausable.sol',
9
+ });
10
+
11
+ for (const fn of pausableFns) {
12
+ c.addModifier('whenNotPaused', fn);
13
+ }
14
+
15
+ setAccessControl(c, functions.pause, access, 'PAUSER');
16
+ c.addFunctionCode('_pause();', functions.pause);
17
+
18
+ setAccessControl(c, functions.unpause, access, 'PAUSER');
19
+ c.addFunctionCode('_unpause();', functions.unpause);
20
+ }
21
+
22
+ const functions = defineFunctions({
23
+ pause: {
24
+ kind: 'public' as const,
25
+ args: [],
26
+ },
27
+
28
+ unpause: {
29
+ kind: 'public' as const,
30
+ args: [],
31
+ },
32
+ });
package/src/api.ts ADDED
@@ -0,0 +1,39 @@
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';
6
+
7
+ export interface WizardContractAPI<Options extends CommonOptions> {
8
+ /**
9
+ * Returns a string representation of a contract generated using the provided options. If opts is not provided, uses `defaults`.
10
+ */
11
+ print: (opts?: Options) => string,
12
+
13
+ /**
14
+ * The default options that are used for `print`.
15
+ */
16
+ defaults: Required<Options>;
17
+ }
18
+
19
+ export type ERC20 = WizardContractAPI<ERC20Options>;
20
+ export type ERC721 = WizardContractAPI<ERC721Options>;
21
+ export type ERC1155 = WizardContractAPI<ERC1155Options>;
22
+ export type Governor = WizardContractAPI<GovernorOptions>;
23
+
24
+ export const erc20: ERC20 = {
25
+ print: printERC20,
26
+ defaults: erc20defaults
27
+ }
28
+ export const erc721: ERC721 = {
29
+ print: printERC721,
30
+ defaults: erc721defaults
31
+ }
32
+ export const erc1155: ERC1155 = {
33
+ print: printERC1155,
34
+ defaults: erc1155defaults
35
+ }
36
+ export const governor: Governor = {
37
+ print: printGovernor,
38
+ defaults: governorDefaults
39
+ }
@@ -0,0 +1,33 @@
1
+ import { ERC20Options, buildERC20 } from './erc20';
2
+ import { ERC721Options, buildERC721 } from './erc721';
3
+ import { ERC1155Options, buildERC1155 } from './erc1155';
4
+ import { GovernorOptions, buildGovernor } from './governor';
5
+
6
+ export interface KindedOptions {
7
+ ERC20: { kind: 'ERC20' } & ERC20Options;
8
+ ERC721: { kind: 'ERC721' } & ERC721Options;
9
+ ERC1155: { kind: 'ERC1155' } & ERC1155Options;
10
+ Governor: { kind: 'Governor' } & GovernorOptions;
11
+ }
12
+
13
+ export type GenericOptions = KindedOptions[keyof KindedOptions];
14
+
15
+ export function buildGeneric(opts: GenericOptions) {
16
+ switch (opts.kind) {
17
+ case 'ERC20':
18
+ return buildERC20(opts);
19
+
20
+ case 'ERC721':
21
+ return buildERC721(opts);
22
+
23
+ case 'ERC1155':
24
+ return buildERC1155(opts);
25
+
26
+ case 'Governor':
27
+ return buildGovernor(opts);
28
+
29
+ default:
30
+ const _: never = opts;
31
+ throw new Error('Unknown ERC');
32
+ }
33
+ }
@@ -0,0 +1,11 @@
1
+ import type { BaseFunction } from './contract';
2
+
3
+ export const supportsInterface: BaseFunction = {
4
+ name: 'supportsInterface',
5
+ kind: 'public',
6
+ args: [
7
+ { name: 'interfaceId', type: 'bytes4' },
8
+ ],
9
+ returns: ['bool'],
10
+ mutability: 'view',
11
+ };
@@ -0,0 +1,24 @@
1
+ import type { Access } from "./set-access-control";
2
+ import type { Info } from "./set-info";
3
+ import { defaults as infoDefaults } from "./set-info";
4
+ import type { Upgradeable } from "./set-upgradeable";
5
+
6
+ export const defaults: Required<CommonOptions> = {
7
+ access: 'ownable',
8
+ upgradeable: false,
9
+ info: infoDefaults,
10
+ } as const;
11
+
12
+ export interface CommonOptions {
13
+ access?: Access;
14
+ upgradeable?: Upgradeable;
15
+ info?: Info;
16
+ }
17
+
18
+ export function withCommonDefaults(opts: CommonOptions): Required<CommonOptions> {
19
+ return {
20
+ access: opts.access ?? 'ownable',
21
+ upgradeable: opts.upgradeable ?? false,
22
+ info: opts.info ?? {},
23
+ };
24
+ }