@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.
- package/dist/contract.d.ts +2 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +8 -0
- package/dist/contract.js.map +1 -1
- package/dist/environments/hardhat/package-lock.json +2999 -5190
- package/dist/environments/hardhat/package.json +1 -1
- package/dist/environments/hardhat/upgradeable/package-lock.json +1875 -3396
- package/dist/environments/hardhat/upgradeable/package.json +2 -2
- package/dist/erc20.d.ts +6 -1
- package/dist/erc20.d.ts.map +1 -1
- package/dist/erc20.js +5 -2
- package/dist/erc20.js.map +1 -1
- package/dist/erc721.d.ts +6 -1
- package/dist/erc721.d.ts.map +1 -1
- package/dist/erc721.js +6 -3
- package/dist/erc721.js.map +1 -1
- package/dist/generate/erc20.d.ts.map +1 -1
- package/dist/generate/erc20.js +2 -1
- package/dist/generate/erc20.js.map +1 -1
- package/dist/generate/erc721.d.ts.map +1 -1
- package/dist/generate/erc721.js +2 -1
- package/dist/generate/erc721.js.map +1 -1
- package/dist/generate/governor.d.ts.map +1 -1
- package/dist/generate/governor.js +2 -0
- package/dist/generate/governor.js.map +1 -1
- package/dist/generate/sources.d.ts +5 -4
- package/dist/generate/sources.d.ts.map +1 -1
- package/dist/generate/sources.js +27 -17
- package/dist/generate/sources.js.map +1 -1
- package/dist/governor.d.ts +2 -0
- package/dist/governor.d.ts.map +1 -1
- package/dist/governor.js +41 -8
- package/dist/governor.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/print.d.ts.map +1 -1
- package/dist/print.js +6 -4
- package/dist/print.js.map +1 -1
- package/dist/set-clock-mode.d.ts +6 -0
- package/dist/set-clock-mode.d.ts.map +1 -0
- package/dist/set-clock-mode.js +31 -0
- package/dist/set-clock-mode.js.map +1 -0
- package/dist/test.js +23 -5
- package/dist/test.js.map +1 -1
- package/dist/utils/duration.d.ts +1 -0
- package/dist/utils/duration.d.ts.map +1 -1
- package/dist/utils/duration.js +15 -1
- package/dist/utils/duration.js.map +1 -1
- package/dist/utils/version.d.ts +5 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +8 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/zip-foundry.d.ts.map +1 -1
- package/dist/zip-foundry.js +141 -32
- package/dist/zip-foundry.js.map +1 -1
- package/package.json +5 -3
- package/src/contract.ts +10 -0
- package/src/environments/hardhat/package-lock.json +2999 -5190
- package/src/environments/hardhat/package.json +1 -1
- package/src/environments/hardhat/upgradeable/package-lock.json +1875 -3396
- package/src/environments/hardhat/upgradeable/package.json +2 -2
- package/src/erc20.ts +11 -3
- package/src/erc721.ts +12 -4
- package/src/generate/erc20.ts +2 -1
- package/src/generate/erc721.ts +2 -1
- package/src/generate/governor.ts +2 -0
- package/src/generate/sources.ts +30 -18
- package/src/governor.ts +40 -10
- package/src/index.ts +3 -1
- package/src/print.ts +6 -2
- package/src/set-clock-mode.ts +33 -0
- package/src/test.ts +34 -6
- package/src/utils/duration.ts +18 -0
- package/src/utils/version.ts +4 -0
- package/src/zip-foundry.ts +141 -34
package/src/zip-foundry.ts
CHANGED
|
@@ -24,10 +24,14 @@ const test = (c: Contract, opts?: GenericOptions) => {
|
|
|
24
24
|
);
|
|
25
25
|
|
|
26
26
|
function getImports(c: Contract) {
|
|
27
|
-
|
|
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
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
vars.push(`address
|
|
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
|
-
|
|
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
|
-
|
|
130
|
-
'import "forge-std/Script.sol";',
|
|
131
|
-
|
|
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
|
-
|
|
140
|
-
|
|
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
|
|
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
|
|
162
|
-
|
|
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
|
|
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
|
-
|
|
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;
|