@openzeppelin/wizard 0.4.1 → 0.4.3

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 (77) hide show
  1. package/dist/contract.d.ts +2 -0
  2. package/dist/contract.d.ts.map +1 -1
  3. package/dist/contract.js +8 -0
  4. package/dist/contract.js.map +1 -1
  5. package/dist/environments/hardhat/package-lock.json +2999 -5190
  6. package/dist/environments/hardhat/package.json +1 -1
  7. package/dist/environments/hardhat/upgradeable/package-lock.json +1875 -3396
  8. package/dist/environments/hardhat/upgradeable/package.json +2 -2
  9. package/dist/erc20.d.ts +6 -1
  10. package/dist/erc20.d.ts.map +1 -1
  11. package/dist/erc20.js +5 -2
  12. package/dist/erc20.js.map +1 -1
  13. package/dist/erc721.d.ts +6 -1
  14. package/dist/erc721.d.ts.map +1 -1
  15. package/dist/erc721.js +6 -3
  16. package/dist/erc721.js.map +1 -1
  17. package/dist/generate/erc20.d.ts.map +1 -1
  18. package/dist/generate/erc20.js +2 -1
  19. package/dist/generate/erc20.js.map +1 -1
  20. package/dist/generate/erc721.d.ts.map +1 -1
  21. package/dist/generate/erc721.js +2 -1
  22. package/dist/generate/erc721.js.map +1 -1
  23. package/dist/generate/governor.d.ts.map +1 -1
  24. package/dist/generate/governor.js +2 -0
  25. package/dist/generate/governor.js.map +1 -1
  26. package/dist/generate/sources.d.ts +5 -4
  27. package/dist/generate/sources.d.ts.map +1 -1
  28. package/dist/generate/sources.js +27 -17
  29. package/dist/generate/sources.js.map +1 -1
  30. package/dist/governor.d.ts +2 -0
  31. package/dist/governor.d.ts.map +1 -1
  32. package/dist/governor.js +41 -8
  33. package/dist/governor.js.map +1 -1
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +3 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/print.d.ts.map +1 -1
  39. package/dist/print.js +6 -4
  40. package/dist/print.js.map +1 -1
  41. package/dist/set-clock-mode.d.ts +6 -0
  42. package/dist/set-clock-mode.d.ts.map +1 -0
  43. package/dist/set-clock-mode.js +31 -0
  44. package/dist/set-clock-mode.js.map +1 -0
  45. package/dist/test.js +23 -5
  46. package/dist/test.js.map +1 -1
  47. package/dist/utils/duration.d.ts +1 -0
  48. package/dist/utils/duration.d.ts.map +1 -1
  49. package/dist/utils/duration.js +15 -1
  50. package/dist/utils/duration.js.map +1 -1
  51. package/dist/utils/version.d.ts +5 -0
  52. package/dist/utils/version.d.ts.map +1 -0
  53. package/dist/utils/version.js +8 -0
  54. package/dist/utils/version.js.map +1 -0
  55. package/dist/zip-foundry.d.ts.map +1 -1
  56. package/dist/zip-foundry.js +141 -32
  57. package/dist/zip-foundry.js.map +1 -1
  58. package/package.json +5 -3
  59. package/src/contract.ts +10 -0
  60. package/src/environments/hardhat/package-lock.json +2999 -5190
  61. package/src/environments/hardhat/package.json +1 -1
  62. package/src/environments/hardhat/upgradeable/package-lock.json +1875 -3396
  63. package/src/environments/hardhat/upgradeable/package.json +2 -2
  64. package/src/erc20.ts +11 -3
  65. package/src/erc721.ts +12 -4
  66. package/src/generate/erc20.ts +2 -1
  67. package/src/generate/erc721.ts +2 -1
  68. package/src/generate/governor.ts +2 -0
  69. package/src/generate/sources.ts +30 -18
  70. package/src/governor.ts +40 -10
  71. package/src/index.ts +3 -1
  72. package/src/print.ts +6 -2
  73. package/src/set-clock-mode.ts +33 -0
  74. package/src/test.ts +34 -6
  75. package/src/utils/duration.ts +18 -0
  76. package/src/utils/version.ts +4 -0
  77. package/src/zip-foundry.ts +141 -34
@@ -24,10 +24,14 @@ const test = (c: Contract, opts?: GenericOptions) => {
24
24
  );
25
25
 
26
26
  function getImports(c: Contract) {
27
- return [
28
- 'import "forge-std/Test.sol";',
29
- `import "../src/${c.name}.sol";`,
27
+ const result = [
28
+ 'import {Test} from "forge-std/Test.sol";',
30
29
  ];
30
+ if (c.upgradeable) {
31
+ result.push('import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";');
32
+ }
33
+ result.push(`import {${c.name}} from "src/${c.name}.sol";`);
34
+ return result;
31
35
  }
32
36
 
33
37
  function getTestCase(c: Contract) {
@@ -40,10 +44,8 @@ const test = (c: Contract, opts?: GenericOptions) => {
40
44
  ],
41
45
  [
42
46
  'function setUp() public {',
43
- getAddressVariables(args),
44
- [
45
- `instance = new ${getDeploymentCall(c, args)};`,
46
- ],
47
+ getAddressVariables(c, args),
48
+ getDeploymentCode(c, args),
47
49
  '}',
48
50
  ],
49
51
  getContractSpecificTestFunction(),
@@ -52,11 +54,45 @@ const test = (c: Contract, opts?: GenericOptions) => {
52
54
  ];
53
55
  }
54
56
 
55
- function getAddressVariables(args: string[]): Lines[] {
57
+ function getDeploymentCode(c: Contract, args: string[]): Lines[] {
58
+ if (c.upgradeable) {
59
+ if (opts?.upgradeable === 'transparent') {
60
+ return [
61
+ `address proxy = Upgrades.deployTransparentProxy(`,
62
+ [
63
+ `"${c.name}.sol",`,
64
+ `initialOwner,`,
65
+ `abi.encodeCall(${c.name}.initialize, (${args.join(', ')}))`
66
+ ],
67
+ ');',
68
+ `instance = ${c.name}(proxy);`,
69
+ ];
70
+ } else {
71
+ return [
72
+ `address proxy = Upgrades.deployUUPSProxy(`,
73
+ [
74
+ `"${c.name}.sol",`,
75
+ `abi.encodeCall(${c.name}.initialize, (${args.join(', ')}))`
76
+ ],
77
+ ');',
78
+ `instance = ${c.name}(proxy);`,
79
+ ];
80
+ }
81
+ } else {
82
+ return [
83
+ `instance = new ${c.name}(${args.join(', ')});`,
84
+ ];
85
+ }
86
+ }
87
+
88
+ function getAddressVariables(c: Contract, args: string[]): Lines[] {
56
89
  const vars = [];
57
- for (let i = 0; i < args.length; i++) {
58
- // use i + 1 as the private key since it must be non-zero
59
- vars.push(`address ${args[i]} = vm.addr(${i + 1});`);
90
+ let i = 1; // private key index starts from 1 since it must be non-zero
91
+ if (c.upgradeable && opts?.upgradeable === 'transparent' && !args.includes('initialOwner')) {
92
+ vars.push(`address initialOwner = vm.addr(${i++});`);
93
+ }
94
+ for (const arg of args) {
95
+ vars.push(`address ${arg} = vm.addr(${i++});`);
60
96
  }
61
97
  return vars;
62
98
  }
@@ -67,7 +103,7 @@ const test = (c: Contract, opts?: GenericOptions) => {
67
103
  case 'ERC20':
68
104
  case 'ERC721':
69
105
  return [
70
- 'function testName() public {',
106
+ 'function testName() public view {',
71
107
  [
72
108
  `assertEq(instance.name(), "${opts.name}");`
73
109
  ],
@@ -76,7 +112,7 @@ const test = (c: Contract, opts?: GenericOptions) => {
76
112
 
77
113
  case 'ERC1155':
78
114
  return [
79
- 'function testUri() public {',
115
+ 'function testUri() public view {',
80
116
  [
81
117
  `assertEq(instance.uri(0), "${opts.uri}");`
82
118
  ],
@@ -111,11 +147,7 @@ function getAddressArgs(c: Contract): string[] {
111
147
  return args;
112
148
  }
113
149
 
114
- function getDeploymentCall(c: Contract, args: string[]): string {
115
- return `${c.name}(${args.join(', ')})`;
116
- }
117
-
118
- const script = (c: Contract) => {
150
+ const script = (c: Contract, opts?: GenericOptions) => {
119
151
  return formatLinesWithSpaces(
120
152
  2,
121
153
  ...spaceBetween(
@@ -126,18 +158,24 @@ const script = (c: Contract) => {
126
158
  );
127
159
 
128
160
  function getImports(c: Contract) {
129
- return [
130
- 'import "forge-std/Script.sol";',
131
- `import "../src/${c.name}.sol";`,
161
+ const result = [
162
+ 'import {Script} from "forge-std/Script.sol";',
163
+ 'import {console} from "forge-std/console.sol";',
132
164
  ];
165
+ if (c.upgradeable) {
166
+ result.push('import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";');
167
+ }
168
+ result.push(`import {${c.name}} from "src/${c.name}.sol";`);
169
+ return result;
133
170
  }
134
171
 
135
172
  function getScript(c: Contract) {
136
173
  const args = getAddressArgs(c);
137
174
  const deploymentLines = [
138
175
  'vm.startBroadcast();',
139
- `${c.name} instance = new ${getDeploymentCall(c, args)};`,
140
- 'console.log("Contract deployed to %s", address(instance));',
176
+ ...getAddressVariables(c, args),
177
+ ...getDeploymentCode(c, args),
178
+ `console.log("${c.upgradeable ? 'Proxy' : 'Contract'} deployed to %s", address(instance));`,
141
179
  'vm.stopBroadcast();',
142
180
  ];
143
181
  return [
@@ -156,15 +194,59 @@ const script = (c: Contract) => {
156
194
  ];
157
195
  }
158
196
 
159
- function addTodoAndCommentOut(lines: string[]) {
197
+ function getDeploymentCode(c: Contract, args: string[]): Lines[] {
198
+ if (c.upgradeable) {
199
+ if (opts?.upgradeable === 'transparent') {
200
+ return [
201
+ `address proxy = Upgrades.deployTransparentProxy(`,
202
+ [
203
+ `"${c.name}.sol",`,
204
+ `initialOwner,`,
205
+ `abi.encodeCall(${c.name}.initialize, (${args.join(', ')}))`
206
+ ],
207
+ ');',
208
+ `${c.name} instance = ${c.name}(proxy);`,
209
+ ];
210
+ } else {
211
+ return [
212
+ `address proxy = Upgrades.deployUUPSProxy(`,
213
+ [
214
+ `"${c.name}.sol",`,
215
+ `abi.encodeCall(${c.name}.initialize, (${args.join(', ')}))`
216
+ ],
217
+ ');',
218
+ `${c.name} instance = ${c.name}(proxy);`,
219
+ ];
220
+ }
221
+ } else {
222
+ return [
223
+ `${c.name} instance = new ${c.name}(${args.join(', ')});`,
224
+ ];
225
+ }
226
+ }
227
+
228
+ function getAddressVariables(c: Contract, args: string[]): Lines[] {
229
+ const vars = [];
230
+ if (c.upgradeable && opts?.upgradeable === 'transparent' && !args.includes('initialOwner')) {
231
+ vars.push('address initialOwner = <Set initialOwner address here>;');
232
+ }
233
+ for (const arg of args) {
234
+ vars.push(`address ${arg} = <Set ${arg} address here>;`);
235
+ }
236
+ return vars;
237
+ }
238
+
239
+ function addTodoAndCommentOut(lines: Lines[]) {
160
240
  return [
161
- '// TODO: Set addresses for the contract arguments below, then uncomment the following lines',
162
- ...lines.map(l => `// ${l}`),
241
+ '// TODO: Set addresses for the variables below, then uncomment the following section:',
242
+ '/*',
243
+ ...lines,
244
+ '*/',
163
245
  ];
164
246
  }
165
247
  };
166
248
 
167
- const setupSh = `\
249
+ const setupSh = (c: Contract) => `\
168
250
  #!/usr/bin/env bash
169
251
 
170
252
  # Check if git is installed
@@ -186,23 +268,48 @@ if ! [ -f "foundry.toml" ]
186
268
  then
187
269
  echo "Initializing Foundry project..."
188
270
 
271
+ # Backup Wizard template readme to avoid it being overwritten
272
+ mv README.md README-oz.md
273
+
189
274
  # Initialize sample Foundry project
190
275
  forge init --force --no-commit --quiet
191
276
 
277
+ ${c.upgradeable ? `\
278
+ # Install OpenZeppelin Contracts and Upgrades
279
+ forge install OpenZeppelin/openzeppelin-contracts-upgradeable@v${contracts.version} --no-commit --quiet
280
+ forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-commit --quiet\
281
+ ` : `\
192
282
  # Install OpenZeppelin Contracts
193
- forge install OpenZeppelin/openzeppelin-contracts@v${contracts.version} --no-commit --quiet
283
+ forge install OpenZeppelin/openzeppelin-contracts@v${contracts.version} --no-commit --quiet\
284
+ `}
194
285
 
195
- # Remove template contracts
286
+ # Remove unneeded Foundry template files
196
287
  rm src/Counter.sol
197
288
  rm script/Counter.s.sol
198
289
  rm test/Counter.t.sol
290
+ rm README.md
291
+
292
+ # Restore Wizard template readme
293
+ mv README-oz.md README.md
199
294
 
200
295
  # Add remappings
201
296
  if [ -f "remappings.txt" ]
202
297
  then
203
298
  echo "" >> remappings.txt
204
299
  fi
205
- echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" >> remappings.txt
300
+ ${c.upgradeable ? `\
301
+ echo "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/" >> remappings.txt
302
+ echo "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/" >> remappings.txt
303
+
304
+ # Add settings in foundry.toml
305
+ echo "" >> foundry.toml
306
+ echo "ffi = true" >> foundry.toml
307
+ echo "ast = true" >> foundry.toml
308
+ echo "build_info = true" >> foundry.toml
309
+ echo "extra_output = [\\"storageLayout\\"]" >> foundry.toml\
310
+ ` : `\
311
+ echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" >> remappings.txt\
312
+ `}
206
313
 
207
314
  # Perform initial git commit
208
315
  git add .
@@ -232,7 +339,7 @@ bash setup.sh
232
339
  ## Testing the contract
233
340
 
234
341
  \`\`\`
235
- forge test
342
+ forge test${c.upgradeable ? ' --force' : ''}
236
343
  \`\`\`
237
344
 
238
345
  ## Deploying the contract
@@ -240,7 +347,7 @@ forge test
240
347
  You can simulate a deployment by running the script:
241
348
 
242
349
  \`\`\`
243
- forge script script/${c.name}.s.sol
350
+ forge script script/${c.name}.s.sol${c.upgradeable ? ' --force' : ''}
244
351
  \`\`\`
245
352
 
246
353
  See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.
@@ -251,8 +358,8 @@ export async function zipFoundry(c: Contract, opts?: GenericOptions) {
251
358
 
252
359
  zip.file(`src/${c.name}.sol`, printContract(c));
253
360
  zip.file(`test/${c.name}.t.sol`, test(c, opts));
254
- zip.file(`script/${c.name}.s.sol`, script(c));
255
- zip.file('setup.sh', setupSh);
361
+ zip.file(`script/${c.name}.s.sol`, script(c, opts));
362
+ zip.file('setup.sh', setupSh(c));
256
363
  zip.file('README.md', readme(c));
257
364
 
258
365
  return zip;