@openzeppelin/wizard 0.8.1 → 0.9.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.
- package/dist/account.js +8 -10
- package/dist/account.js.map +1 -1
- package/dist/common-options.js +3 -4
- package/dist/common-options.js.map +1 -1
- package/dist/contract.d.ts +25 -6
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +48 -7
- package/dist/contract.js.map +1 -1
- package/dist/custom.js +1 -2
- package/dist/custom.js.map +1 -1
- package/dist/erc1155.d.ts.map +1 -1
- package/dist/erc1155.js +6 -9
- package/dist/erc1155.js.map +1 -1
- package/dist/erc20.d.ts +1 -0
- package/dist/erc20.d.ts.map +1 -1
- package/dist/erc20.js +36 -27
- package/dist/erc20.js.map +1 -1
- package/dist/erc721.d.ts +1 -0
- package/dist/erc721.d.ts.map +1 -1
- package/dist/erc721.js +25 -17
- package/dist/erc721.js.map +1 -1
- package/dist/generate/alternatives.js +1 -1
- package/dist/generate/alternatives.js.map +1 -1
- package/dist/generate/erc20.d.ts.map +1 -1
- package/dist/generate/erc20.js +1 -0
- package/dist/generate/erc20.js.map +1 -1
- package/dist/generate/erc721.d.ts.map +1 -1
- package/dist/generate/erc721.js +1 -0
- package/dist/generate/erc721.js.map +1 -1
- package/dist/generate/stablecoin.d.ts.map +1 -1
- package/dist/generate/stablecoin.js +2 -0
- package/dist/generate/stablecoin.js.map +1 -1
- package/dist/governor.js +9 -10
- package/dist/governor.js.map +1 -1
- package/dist/infer-transpiled.js +1 -2
- package/dist/infer-transpiled.js.map +1 -1
- package/dist/options.js +1 -2
- package/dist/options.js.map +1 -1
- package/dist/print.d.ts.map +1 -1
- package/dist/print.js +24 -4
- package/dist/print.js.map +1 -1
- package/dist/scripts/prepare.js +1 -2
- package/dist/scripts/prepare.js.map +1 -1
- package/dist/set-access-control.d.ts.map +1 -1
- package/dist/set-access-control.js +1 -1
- package/dist/set-access-control.js.map +1 -1
- package/dist/set-namespaced-storage.d.ts +7 -0
- package/dist/set-namespaced-storage.d.ts.map +1 -0
- package/dist/set-namespaced-storage.js +61 -0
- package/dist/set-namespaced-storage.js.map +1 -0
- package/dist/stablecoin.js +5 -6
- package/dist/stablecoin.js.map +1 -1
- package/dist/utils/namespaced-slot.d.ts +5 -0
- package/dist/utils/namespaced-slot.d.ts.map +1 -0
- package/dist/utils/namespaced-slot.js +18 -0
- package/dist/utils/namespaced-slot.js.map +1 -0
- package/dist/utils/transitive-closure.js +1 -2
- package/dist/utils/transitive-closure.js.map +1 -1
- package/dist/zip-foundry.js +4 -4
- package/dist/zip-foundry.js.map +1 -1
- package/package.json +4 -1
- package/src/contract.ts +64 -9
- package/src/erc1155.ts +1 -3
- package/src/erc20.ts +43 -14
- package/src/erc721.ts +25 -9
- package/src/generate/erc20.ts +1 -0
- package/src/generate/erc721.ts +1 -0
- package/src/generate/stablecoin.ts +2 -0
- package/src/print.ts +34 -3
- package/src/set-access-control.ts +3 -1
- package/src/set-namespaced-storage.ts +69 -0
- package/src/stablecoin.ts +3 -1
- package/src/utils/namespaced-slot.ts +18 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-access-control.js","sourceRoot":"","sources":["../src/set-access-control.ts"],"names":[],"mappings":";;;AAUA,4CAgCC;AAKD,
|
|
1
|
+
{"version":3,"file":"set-access-control.js","sourceRoot":"","sources":["../src/set-access-control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ContractBuilder } from './contract';
|
|
2
|
+
/**
|
|
3
|
+
* Sets namespaced variables in storage struct, and adds a function to retrieve namespaced storage.
|
|
4
|
+
*/
|
|
5
|
+
export declare function setNamespacedStorage(c: ContractBuilder, structVariables: string[], namespacePrefix: string): void;
|
|
6
|
+
export declare function toStorageStructInstantiation(name: string): string;
|
|
7
|
+
//# sourceMappingURL=set-namespaced-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-namespaced-storage.d.ts","sourceRoot":"","sources":["../src/set-namespaced-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,eAAe,EAAkB,MAAM,YAAY,CAAC;AAIhF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,eAAe,EAAE,MAAM,QAe1G;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,UAExD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setNamespacedStorage = setNamespacedStorage;
|
|
4
|
+
exports.toStorageStructInstantiation = toStorageStructInstantiation;
|
|
5
|
+
const namespaced_slot_1 = require("./utils/namespaced-slot");
|
|
6
|
+
const error_1 = require("./error");
|
|
7
|
+
/**
|
|
8
|
+
* Sets namespaced variables in storage struct, and adds a function to retrieve namespaced storage.
|
|
9
|
+
*/
|
|
10
|
+
function setNamespacedStorage(c, structVariables, namespacePrefix) {
|
|
11
|
+
validateNoWhitespace(namespacePrefix);
|
|
12
|
+
const namespaceId = toNamespaceId(namespacePrefix, c.name);
|
|
13
|
+
const storageFn = makeStorageFunction(c.name);
|
|
14
|
+
const storageStruct = makeStorageStruct(c.name, namespaceId);
|
|
15
|
+
const namespacedStorageConstant = `${c.name.toUpperCase()}_STORAGE_LOCATION`;
|
|
16
|
+
structVariables.forEach(v => c.addStructVariable(storageStruct, v));
|
|
17
|
+
c.addConstantOrImmutableOrErrorDefinition(`bytes32 private constant ${namespacedStorageConstant} = ${(0, namespaced_slot_1.computeNamespacedStorageSlot)(namespaceId)};`, [`// keccak256(abi.encode(uint256(keccak256("${namespaceId}")) - 1)) & ~bytes32(uint256(0xff))`]);
|
|
18
|
+
c.addFunctionCode(`assembly { $.slot := ${namespacedStorageConstant} }`, storageFn);
|
|
19
|
+
}
|
|
20
|
+
function toStorageStructInstantiation(name) {
|
|
21
|
+
return `${name}Storage storage $ = ${makeStorageFunction(name).name}();`;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* According to ERC-7201, namespace ids should not contain any whitespace characters.
|
|
25
|
+
*/
|
|
26
|
+
function validateNoWhitespace(namespacePrefix) {
|
|
27
|
+
if (namespacePrefix.match(/\s+/)) {
|
|
28
|
+
throw new error_1.OptionsError({ namespacePrefix: 'Namespace prefix should not contain whitespace characters' });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Creates a namespace ID from a namespace prefix and a contract name.
|
|
33
|
+
* If the namespace prefix is empty, returns the contract name.
|
|
34
|
+
*/
|
|
35
|
+
function toNamespaceId(namespacePrefix, name) {
|
|
36
|
+
if (namespacePrefix.length === 0) {
|
|
37
|
+
return name;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
return `${namespacePrefix}.${name}`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function makeStorageFunction(name) {
|
|
44
|
+
const fn = {
|
|
45
|
+
name: `_get${name}Storage`,
|
|
46
|
+
kind: 'private',
|
|
47
|
+
mutability: 'pure',
|
|
48
|
+
args: [],
|
|
49
|
+
returns: [`${name}Storage storage $`],
|
|
50
|
+
};
|
|
51
|
+
return fn;
|
|
52
|
+
}
|
|
53
|
+
function makeStorageStruct(name, namespaceId) {
|
|
54
|
+
const struct = {
|
|
55
|
+
name: `${name}Storage`,
|
|
56
|
+
comments: [`/// @custom:storage-location erc7201:${namespaceId}`],
|
|
57
|
+
variables: [],
|
|
58
|
+
};
|
|
59
|
+
return struct;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=set-namespaced-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-namespaced-storage.js","sourceRoot":"","sources":["../src/set-namespaced-storage.ts"],"names":[],"mappings":";;AAOA,oDAeC;AAED,oEAEC;AAzBD,6DAAuE;AACvE,mCAAuC;AAEvC;;GAEG;AACH,SAAgB,oBAAoB,CAAC,CAAkB,EAAE,eAAyB,EAAE,eAAuB;IACzG,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAEtC,MAAM,WAAW,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7D,MAAM,yBAAyB,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAE7E,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IAEpE,CAAC,CAAC,uCAAuC,CACvC,4BAA4B,yBAAyB,MAAM,IAAA,8CAA4B,EAAC,WAAW,CAAC,GAAG,EACvG,CAAC,8CAA8C,WAAW,qCAAqC,CAAC,CACjG,CAAC;IACF,CAAC,CAAC,eAAe,CAAC,wBAAwB,yBAAyB,IAAI,EAAE,SAAS,CAAC,CAAC;AACtF,CAAC;AAED,SAAgB,4BAA4B,CAAC,IAAY;IACvD,OAAO,GAAG,IAAI,uBAAuB,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,eAAuB;IACnD,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,oBAAY,CAAC,EAAE,eAAe,EAAE,2DAA2D,EAAE,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,eAAuB,EAAE,IAAY;IAC1D,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,eAAe,IAAI,IAAI,EAAE,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,EAAE,GAAiB;QACvB,IAAI,EAAE,OAAO,IAAI,SAAS;QAC1B,IAAI,EAAE,SAAkB;QACxB,UAAU,EAAE,MAAM;QAClB,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,CAAC,GAAG,IAAI,mBAAmB,CAAC;KACtC,CAAC;IAEF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,WAAmB;IAC1D,MAAM,MAAM,GAAmB;QAC7B,IAAI,EAAE,GAAG,IAAI,SAAS;QACtB,QAAQ,EAAE,CAAC,wCAAwC,WAAW,EAAE,CAAC;QACjE,SAAS,EAAE,EAAE;KACd,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/stablecoin.js
CHANGED
|
@@ -16,13 +16,12 @@ exports.defaults = {
|
|
|
16
16
|
custodian: false,
|
|
17
17
|
};
|
|
18
18
|
function withDefaults(opts) {
|
|
19
|
-
var _a, _b, _c, _d;
|
|
20
19
|
return {
|
|
21
20
|
...(0, erc20_1.withDefaults)(opts),
|
|
22
|
-
name:
|
|
23
|
-
symbol:
|
|
24
|
-
limitations:
|
|
25
|
-
custodian:
|
|
21
|
+
name: opts.name ?? exports.defaults.name,
|
|
22
|
+
symbol: opts.symbol ?? exports.defaults.symbol,
|
|
23
|
+
limitations: opts.limitations ?? exports.defaults.limitations,
|
|
24
|
+
custodian: opts.custodian ?? exports.defaults.custodian,
|
|
26
25
|
};
|
|
27
26
|
}
|
|
28
27
|
function printStablecoin(opts = exports.defaults) {
|
|
@@ -81,7 +80,7 @@ function addCustodian(c, access) {
|
|
|
81
80
|
case 'roles': {
|
|
82
81
|
const roleOwner = 'custodian';
|
|
83
82
|
const roleId = 'CUSTODIAN_ROLE';
|
|
84
|
-
const addedConstant = c.
|
|
83
|
+
const addedConstant = c.addConstantOrImmutableOrErrorDefinition(`bytes32 public constant ${roleId} = keccak256("${roleId}");`);
|
|
85
84
|
if (roleOwner && addedConstant) {
|
|
86
85
|
c.addConstructorArgument({ type: 'address', name: roleOwner });
|
|
87
86
|
c.addConstructorCode(`_grantRole(${roleId}, ${roleOwner});`);
|
package/dist/stablecoin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stablecoin.js","sourceRoot":"","sources":["../src/stablecoin.ts"],"names":[],"mappings":";;;AAoCA,0CAEC;AAED,0DAEC;AAED,0CAiBC;AA3DD,6DAA8E;AAC9E,+DAA2D;AAC3D,mCAAwC;AAExC,mCAKiB;AAOJ,QAAA,QAAQ,GAAgC;IACnD,GAAG,gBAAa;IAChB,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,KAAK;IACb,WAAW,EAAE,KAAK;IAClB,SAAS,EAAE,KAAK;CACR,CAAC;AAEX,SAAS,YAAY,CAAC,IAAuB
|
|
1
|
+
{"version":3,"file":"stablecoin.js","sourceRoot":"","sources":["../src/stablecoin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespaced-slot.d.ts","sourceRoot":"","sources":["../../src/utils/namespaced-slot.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAW/D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.computeNamespacedStorageSlot = computeNamespacedStorageSlot;
|
|
4
|
+
const keccak_1 = require("ethereum-cryptography/keccak");
|
|
5
|
+
const utils_1 = require("ethereum-cryptography/utils");
|
|
6
|
+
/**
|
|
7
|
+
* Returns the ERC-7201 storage location for a given namespace id
|
|
8
|
+
*/
|
|
9
|
+
function computeNamespacedStorageSlot(id) {
|
|
10
|
+
const innerHash = (0, keccak_1.keccak256)((0, utils_1.utf8ToBytes)(id));
|
|
11
|
+
const minusOne = BigInt('0x' + (0, utils_1.toHex)(innerHash)) - 1n;
|
|
12
|
+
const minusOneBytes = (0, utils_1.hexToBytes)(minusOne.toString(16).padStart(64, '0'));
|
|
13
|
+
const outerHash = (0, keccak_1.keccak256)(minusOneBytes);
|
|
14
|
+
const mask = BigInt('0xff');
|
|
15
|
+
const masked = BigInt('0x' + (0, utils_1.toHex)(outerHash)) & ~mask;
|
|
16
|
+
return '0x' + masked.toString(16).padStart(64, '0');
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=namespaced-slot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespaced-slot.js","sourceRoot":"","sources":["../../src/utils/namespaced-slot.ts"],"names":[],"mappings":";;AAMA,oEAWC;AAjBD,yDAAyD;AACzD,uDAA6E;AAE7E;;GAEG;AACH,SAAgB,4BAA4B,CAAC,EAAU;IACrD,MAAM,SAAS,GAAG,IAAA,kBAAS,EAAC,IAAA,mBAAW,EAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,IAAA,aAAK,EAAC,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;IACtD,MAAM,aAAa,GAAG,IAAA,kBAAU,EAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAE1E,MAAM,SAAS,GAAG,IAAA,kBAAS,EAAC,aAAa,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,IAAA,aAAK,EAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IAEvD,OAAO,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -10,13 +10,12 @@ function transitiveClosure(obj) {
|
|
|
10
10
|
return closure;
|
|
11
11
|
}
|
|
12
12
|
function reachable(obj, key) {
|
|
13
|
-
var _a;
|
|
14
13
|
let prevSize = 0;
|
|
15
14
|
const res = new Set(obj[key]);
|
|
16
15
|
while (prevSize < res.size) {
|
|
17
16
|
prevSize = res.size;
|
|
18
17
|
for (const k of res) {
|
|
19
|
-
for (const v of
|
|
18
|
+
for (const v of obj[k] ?? []) {
|
|
20
19
|
res.add(v);
|
|
21
20
|
}
|
|
22
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transitive-closure.js","sourceRoot":"","sources":["../../src/utils/transitive-closure.ts"],"names":[],"mappings":";;AAEA,8CAQC;AAED,8BAcC;AAxBD,SAAgB,iBAAiB,CAAC,GAA2B;IAC3D,MAAM,OAAO,GAAG,EAAuB,CAAC;IAExC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,SAAS,CAAC,GAA2B,EAAE,GAAM
|
|
1
|
+
{"version":3,"file":"transitive-closure.js","sourceRoot":"","sources":["../../src/utils/transitive-closure.ts"],"names":[],"mappings":";;AAEA,8CAQC;AAED,8BAcC;AAxBD,SAAgB,iBAAiB,CAAC,GAA2B;IAC3D,MAAM,OAAO,GAAG,EAAuB,CAAC;IAExC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;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,CAAC;QAC3B,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/zip-foundry.js
CHANGED
|
@@ -72,7 +72,7 @@ const test = (c, opts) => {
|
|
|
72
72
|
(0, format_lines_1.spaceBetween)([`${c.name} public instance;`], [
|
|
73
73
|
'function setUp() public {',
|
|
74
74
|
getAddressVariables(c, args),
|
|
75
|
-
getDeploymentCode(c, args, false, opts
|
|
75
|
+
getDeploymentCode(c, args, false, opts?.upgradeable),
|
|
76
76
|
'}',
|
|
77
77
|
], getContractSpecificTestFunction()),
|
|
78
78
|
'}',
|
|
@@ -81,7 +81,7 @@ const test = (c, opts) => {
|
|
|
81
81
|
function getAddressVariables(c, args) {
|
|
82
82
|
const vars = [];
|
|
83
83
|
let i = 1; // private key index starts from 1 since it must be non-zero
|
|
84
|
-
if (c.upgradeable &&
|
|
84
|
+
if (c.upgradeable && opts?.upgradeable === 'transparent' && !args.includes('initialOwner')) {
|
|
85
85
|
vars.push(`address initialOwner = vm.addr(${i++});`);
|
|
86
86
|
}
|
|
87
87
|
for (const arg of args) {
|
|
@@ -124,7 +124,7 @@ const script = (c, opts) => {
|
|
|
124
124
|
const deploymentLines = [
|
|
125
125
|
'vm.startBroadcast();',
|
|
126
126
|
...getAddressVariables(c, args),
|
|
127
|
-
...getDeploymentCode(c, args, true, opts
|
|
127
|
+
...getDeploymentCode(c, args, true, opts?.upgradeable),
|
|
128
128
|
`console.log("${c.upgradeable ? 'Proxy' : 'Contract'} deployed to %s", address(instance));`,
|
|
129
129
|
'vm.stopBroadcast();',
|
|
130
130
|
];
|
|
@@ -136,7 +136,7 @@ const script = (c, opts) => {
|
|
|
136
136
|
}
|
|
137
137
|
function getAddressVariables(c, args) {
|
|
138
138
|
const vars = [];
|
|
139
|
-
if (c.upgradeable &&
|
|
139
|
+
if (c.upgradeable && opts?.upgradeable === 'transparent' && !args.includes('initialOwner')) {
|
|
140
140
|
vars.push('address initialOwner = <Set initialOwner address here>;');
|
|
141
141
|
}
|
|
142
142
|
for (const arg of args) {
|
package/dist/zip-foundry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zip-foundry.js","sourceRoot":"","sources":["../src/zip-foundry.ts"],"names":[],"mappings":";;;;;AAyTA,gCAUC;AAnUD,kDAA0B;AAG1B,mCAAwC;AACxC,oFAAuD;AACvD,uFAAkD;AAElD,uDAA2E;AAG3E,SAAS,SAAS,CAAC,CAAW;IAC5B,OAAO,CAAC,+BAA+B,CAAC,CAAC,OAAO,EAAE,EAAE,oBAAoB,+BAAgB,GAAG,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,+BAA+B,CAAC,CAAW;IAClD,0GAA0G;IAC1G,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC;AACjF,CAAC;AAED,SAAS,UAAU,CAAC,CAAW,EAAE,kBAA4B;IAC3D,MAAM,MAAM,GAAa,CAAC,GAAG,kBAAkB,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,sBAAsB,GAAG,+BAA+B,CAAC,CAAC,CAAC,CAAC;QAElE,MAAM,CAAC,IAAI,CACT,sBAAsB;YACpB,CAAC,CAAC,+EAA+E;YACjF,CAAC,CAAC,sEAAsE,CAC3E,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CACxB,CAAW,EACX,IAAc,EACd,uBAAgC,EAChC,WAAyB;IAEzB,MAAM,sBAAsB,GAAG,+BAA+B,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAExE,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,aAAa;YAChB,OAAO,iCAAiC,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;QAC3E,KAAK,MAAM;YACT,OAAO,iCAAiC,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACrE;YACE,OAAO,CAAC,GAAG,mBAAmB,kBAAkB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC;IAED,SAAS,iCAAiC,CAAC,uBAA+B,EAAE,mBAA4B;QACtG,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC;QAC5C,IAAI,mBAAmB,EAAE,CAAC;YACxB,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC;QACD,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,iBAAiB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,IAAI,sBAAsB,EAAE,CAAC;YAC3B,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,eAAe,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAC5B,CAAC;QAED,OAAO;YACL,sBAAsB,IAAI,sBAAsB;YAChD,sBAAsB,IAAI,mCAAmC;YAC7D,4BAA4B,uBAAuB,GAAG;YACtD,eAAe;YACf,IAAI;YACJ,kEAAkE;YAClE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACxD,CAAC,CAAC,GAAG,mBAAmB,cAAc,CAAC,CAAC,IAAI,mBAAmB;gBAC/D,CAAC,CAAC,GAAG,mBAAmB,cAAc,CAAC,CAAC,IAAI,UAAU;SACzD,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,CAAW,EAAE,IAAqB,EAAE,EAAE;IAClD,OAAO,IAAA,oCAAqB,EAC1B,CAAC,EACD,GAAG,IAAA,2BAAY,EAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,0CAA0C,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAC3G,CAAC;IAEF,SAAS,WAAW,CAAC,CAAW;QAC9B,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO;YACL,YAAY,CAAC,CAAC,IAAI,gBAAgB;YAClC,IAAA,2BAAY,EACV,CAAC,GAAG,CAAC,CAAC,IAAI,mBAAmB,CAAC,EAC9B;gBACE,2BAA2B;gBAC3B,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC;gBAC5B,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"zip-foundry.js","sourceRoot":"","sources":["../src/zip-foundry.ts"],"names":[],"mappings":";;;;;AAyTA,gCAUC;AAnUD,kDAA0B;AAG1B,mCAAwC;AACxC,oFAAuD;AACvD,uFAAkD;AAElD,uDAA2E;AAG3E,SAAS,SAAS,CAAC,CAAW;IAC5B,OAAO,CAAC,+BAA+B,CAAC,CAAC,OAAO,EAAE,EAAE,oBAAoB,+BAAgB,GAAG,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,+BAA+B,CAAC,CAAW;IAClD,0GAA0G;IAC1G,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC;AACjF,CAAC;AAED,SAAS,UAAU,CAAC,CAAW,EAAE,kBAA4B;IAC3D,MAAM,MAAM,GAAa,CAAC,GAAG,kBAAkB,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,sBAAsB,GAAG,+BAA+B,CAAC,CAAC,CAAC,CAAC;QAElE,MAAM,CAAC,IAAI,CACT,sBAAsB;YACpB,CAAC,CAAC,+EAA+E;YACjF,CAAC,CAAC,sEAAsE,CAC3E,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CACxB,CAAW,EACX,IAAc,EACd,uBAAgC,EAChC,WAAyB;IAEzB,MAAM,sBAAsB,GAAG,+BAA+B,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAExE,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,aAAa;YAChB,OAAO,iCAAiC,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;QAC3E,KAAK,MAAM;YACT,OAAO,iCAAiC,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACrE;YACE,OAAO,CAAC,GAAG,mBAAmB,kBAAkB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC;IAED,SAAS,iCAAiC,CAAC,uBAA+B,EAAE,mBAA4B;QACtG,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC;QAC5C,IAAI,mBAAmB,EAAE,CAAC;YACxB,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC;QACD,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,iBAAiB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,IAAI,sBAAsB,EAAE,CAAC;YAC3B,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,eAAe,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAC5B,CAAC;QAED,OAAO;YACL,sBAAsB,IAAI,sBAAsB;YAChD,sBAAsB,IAAI,mCAAmC;YAC7D,4BAA4B,uBAAuB,GAAG;YACtD,eAAe;YACf,IAAI;YACJ,kEAAkE;YAClE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACxD,CAAC,CAAC,GAAG,mBAAmB,cAAc,CAAC,CAAC,IAAI,mBAAmB;gBAC/D,CAAC,CAAC,GAAG,mBAAmB,cAAc,CAAC,CAAC,IAAI,UAAU;SACzD,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,CAAW,EAAE,IAAqB,EAAE,EAAE;IAClD,OAAO,IAAA,oCAAqB,EAC1B,CAAC,EACD,GAAG,IAAA,2BAAY,EAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,0CAA0C,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAC3G,CAAC;IAEF,SAAS,WAAW,CAAC,CAAW;QAC9B,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO;YACL,YAAY,CAAC,CAAC,IAAI,gBAAgB;YAClC,IAAA,2BAAY,EACV,CAAC,GAAG,CAAC,CAAC,IAAI,mBAAmB,CAAC,EAC9B;gBACE,2BAA2B;gBAC3B,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC;gBAC5B,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC;gBACpD,GAAG;aACJ,EACD,+BAA+B,EAAE,CAClC;YACD,GAAG;SACJ,CAAC;IACJ,CAAC;IAED,SAAS,mBAAmB,CAAC,CAAW,EAAE,IAAc;QACtD,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,4DAA4D;QACvE,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI,EAAE,WAAW,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3F,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,+BAA+B;QACtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClB,KAAK,OAAO,CAAC;gBACb,KAAK,QAAQ;oBACX,OAAO,CAAC,mCAAmC,EAAE,CAAC,8BAA8B,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;gBAEpG,KAAK,SAAS;oBACZ,OAAO,CAAC,kCAAkC,EAAE,CAAC,8BAA8B,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;gBAElG,KAAK,SAAS,CAAC;gBACf,KAAK,UAAU,CAAC;gBAChB,KAAK,QAAQ;oBACX,OAAO,CAAC,mCAAmC,EAAE,CAAC,uBAAuB,CAAC,EAAE,GAAG,CAAC,CAAC;gBAE/E;oBACE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,SAAS,cAAc,CAAC,CAAW;IACjC,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,cAAc,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;QAC/C,IAAI,cAAc,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,CAAW,EAAE,IAAqB,EAAE,EAAE;IACpD,OAAO,IAAA,oCAAqB,EAC1B,CAAC,EACD,GAAG,IAAA,2BAAY,EACb,SAAS,CAAC,CAAC,CAAC,EACZ,UAAU,CAAC,CAAC,EAAE,CAAC,8CAA8C,EAAE,gDAAgD,CAAC,CAAC,EACjH,SAAS,CAAC,CAAC,CAAC,CACb,CACF,CAAC;IAEF,SAAS,SAAS,CAAC,CAAW;QAC5B,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,eAAe,GAAG;YACtB,sBAAsB;YACtB,GAAG,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC;YAC/B,GAAG,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;YACtD,gBAAgB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,uCAAuC;YAC3F,qBAAqB;SACtB,CAAC;QACF,OAAO;YACL,YAAY,CAAC,CAAC,IAAI,oBAAoB;YACtC,IAAA,2BAAY,EACV,CAAC,4BAA4B,CAAC,EAC9B,CAAC,yBAAyB,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAC5G;YACD,GAAG;SACJ,CAAC;IACJ,CAAC;IAED,SAAS,mBAAmB,CAAC,CAAW,EAAE,IAAc;QACtD,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI,EAAE,WAAW,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3F,IAAI,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,GAAG,iBAAiB,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,oBAAoB,CAAC,KAAc;QAC1C,OAAO;YACL,uFAAuF;YACvF,IAAI;YACJ,GAAG,KAAK;YACR,IAAI;SACL,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6B/B,CAAC,CAAC,WAAW;IACX,CAAC,CAAC;;mEAE6D,gCAAS,CAAC,OAAO;;CAEnF;IACG,CAAC,CAAC;;uDAEiD,gCAAS,CAAC,OAAO;CAExE;;;;;;;;;;;;;;;;EAiBE,CAAC,CAAC,WAAW;IACX,CAAC,CAAC;;;;;;;;;;CAUL;IACG,CAAC,CAAC;;CAGN;;;;;;;;;;CAUC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC;;;;;;;;;;;;;;;;;;YAkBpB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;;;;;;;sBAQrB,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;;;CAInE,CAAC;AAEK,KAAK,UAAU,UAAU,CAAC,CAAW,EAAE,IAAqB;IACjE,MAAM,GAAG,GAAG,IAAI,eAAK,EAAE,CAAC;IAExB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,EAAE,IAAA,qBAAa,EAAC,CAAC,CAAC,CAAC,CAAC;IAChD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAChD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACpD,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openzeppelin/wizard",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "A boilerplate generator to get started with OpenZeppelin Contracts",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"repository": "https://github.com/OpenZeppelin/contracts-wizard",
|
|
@@ -21,6 +21,9 @@
|
|
|
21
21
|
"test:watch": "ava --watch",
|
|
22
22
|
"update-env": "rm ./src/environments/hardhat/package-lock.json && npm install --package-lock-only --prefix ./src/environments/hardhat && rm ./src/environments/hardhat/upgradeable/package-lock.json && npm install --package-lock-only --prefix ./src/environments/hardhat/upgradeable"
|
|
23
23
|
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"ethereum-cryptography": "^3.2.0"
|
|
26
|
+
},
|
|
24
27
|
"devDependencies": {
|
|
25
28
|
"@openzeppelin/community-contracts": "git+https://github.com/OpenZeppelin/openzeppelin-community-contracts.git#b0ddd27",
|
|
26
29
|
"@openzeppelin/contracts": "^5.4.0",
|
package/src/contract.ts
CHANGED
|
@@ -7,9 +7,10 @@ export interface Contract {
|
|
|
7
7
|
natspecTags: NatspecTag[];
|
|
8
8
|
imports: ImportContract[];
|
|
9
9
|
functions: ContractFunction[];
|
|
10
|
+
structs: ContractStruct[];
|
|
10
11
|
constructorCode: string[];
|
|
11
12
|
constructorArgs: FunctionArgument[];
|
|
12
|
-
|
|
13
|
+
variableOrErrorDefinitions: VariableOrErrorDefinition[];
|
|
13
14
|
upgradeable: boolean;
|
|
14
15
|
}
|
|
15
16
|
|
|
@@ -52,7 +53,13 @@ export interface ContractFunction extends BaseFunction {
|
|
|
52
53
|
comments: string[];
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
export
|
|
56
|
+
export interface ContractStruct {
|
|
57
|
+
name: string;
|
|
58
|
+
comments: string[];
|
|
59
|
+
variables: string[];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export type FunctionKind = 'internal' | 'public' | 'private';
|
|
56
63
|
export type FunctionMutability = (typeof mutabilityRank)[number];
|
|
57
64
|
|
|
58
65
|
// Order is important
|
|
@@ -72,6 +79,11 @@ export interface NatspecTag {
|
|
|
72
79
|
value: string;
|
|
73
80
|
}
|
|
74
81
|
|
|
82
|
+
export interface VariableOrErrorDefinition {
|
|
83
|
+
code: string;
|
|
84
|
+
comments?: string[];
|
|
85
|
+
}
|
|
86
|
+
|
|
75
87
|
export class ContractBuilder implements Contract {
|
|
76
88
|
readonly name: string;
|
|
77
89
|
license: string = 'MIT';
|
|
@@ -82,10 +94,11 @@ export class ContractBuilder implements Contract {
|
|
|
82
94
|
|
|
83
95
|
readonly constructorArgs: FunctionArgument[] = [];
|
|
84
96
|
readonly constructorCode: string[] = [];
|
|
85
|
-
readonly variableSet: Set<string> = new Set();
|
|
86
97
|
|
|
98
|
+
readonly variableOrErrorMap: Map<string, VariableOrErrorDefinition> = new Map<string, VariableOrErrorDefinition>();
|
|
87
99
|
private parentMap: Map<string, Parent> = new Map<string, Parent>();
|
|
88
100
|
private functionMap: Map<string, ContractFunction> = new Map();
|
|
101
|
+
private structMap: Map<string, ContractStruct> = new Map();
|
|
89
102
|
|
|
90
103
|
constructor(name: string) {
|
|
91
104
|
this.name = toIdentifier(name, true);
|
|
@@ -113,8 +126,12 @@ export class ContractBuilder implements Contract {
|
|
|
113
126
|
return [...this.functionMap.values()];
|
|
114
127
|
}
|
|
115
128
|
|
|
116
|
-
get
|
|
117
|
-
return [...this.
|
|
129
|
+
get structs(): ContractStruct[] {
|
|
130
|
+
return [...this.structMap.values()];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
get variableOrErrorDefinitions(): VariableOrErrorDefinition[] {
|
|
134
|
+
return [...this.variableOrErrorMap.values()];
|
|
118
135
|
}
|
|
119
136
|
|
|
120
137
|
addParent(contract: ImportContract, params: Value[] = []): boolean {
|
|
@@ -172,6 +189,19 @@ export class ContractBuilder implements Contract {
|
|
|
172
189
|
}
|
|
173
190
|
}
|
|
174
191
|
|
|
192
|
+
private addStruct(_struct: ContractStruct): ContractStruct {
|
|
193
|
+
const got = this.structMap.get(_struct.name);
|
|
194
|
+
if (got !== undefined) {
|
|
195
|
+
return got;
|
|
196
|
+
} else {
|
|
197
|
+
const struct: ContractStruct = {
|
|
198
|
+
..._struct,
|
|
199
|
+
};
|
|
200
|
+
this.structMap.set(_struct.name, struct);
|
|
201
|
+
return struct;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
175
205
|
addConstructorArgument(arg: FunctionArgument) {
|
|
176
206
|
this.constructorArgs.push(arg);
|
|
177
207
|
}
|
|
@@ -212,11 +242,36 @@ export class ContractBuilder implements Contract {
|
|
|
212
242
|
}
|
|
213
243
|
|
|
214
244
|
/**
|
|
215
|
-
* Note: The type in the
|
|
245
|
+
* Note: The type in the code is not currently transpiled, even if it refers to a contract
|
|
246
|
+
*/
|
|
247
|
+
addStateVariable(code: string, upgradeable: boolean): boolean {
|
|
248
|
+
if (upgradeable) {
|
|
249
|
+
throw new Error('State variables should not be used when upgradeable is true. Set namespaced storage instead.');
|
|
250
|
+
} else {
|
|
251
|
+
return this._addVariableOrErrorDefinition({ code });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Note: The type in the code is not currently transpiled, even if it refers to a contract
|
|
216
257
|
*/
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
258
|
+
addConstantOrImmutableOrErrorDefinition(code: string, comments?: string[]): boolean {
|
|
259
|
+
return this._addVariableOrErrorDefinition({ code, comments });
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
private _addVariableOrErrorDefinition(variableOrErrorDefinition: VariableOrErrorDefinition): boolean {
|
|
263
|
+
const present = this.variableOrErrorMap.has(variableOrErrorDefinition.code);
|
|
264
|
+
this.variableOrErrorMap.set(variableOrErrorDefinition.code, variableOrErrorDefinition);
|
|
265
|
+
return !present;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
addStructVariable(baseStruct: ContractStruct, code: string): boolean {
|
|
269
|
+
let struct = this.structMap.get(baseStruct.name);
|
|
270
|
+
if (!struct) {
|
|
271
|
+
struct = this.addStruct(baseStruct);
|
|
272
|
+
}
|
|
273
|
+
const present = struct.variables.includes(code);
|
|
274
|
+
if (!present) struct.variables.push(code);
|
|
220
275
|
return !present;
|
|
221
276
|
}
|
|
222
277
|
}
|
package/src/erc1155.ts
CHANGED
|
@@ -22,6 +22,7 @@ export interface ERC1155Options extends CommonOptions {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export const defaults: Required<ERC1155Options> = {
|
|
25
|
+
...commonDefaults,
|
|
25
26
|
name: 'MyToken',
|
|
26
27
|
uri: '',
|
|
27
28
|
burnable: false,
|
|
@@ -29,9 +30,6 @@ export const defaults: Required<ERC1155Options> = {
|
|
|
29
30
|
mintable: false,
|
|
30
31
|
supply: false,
|
|
31
32
|
updatableUri: true,
|
|
32
|
-
access: commonDefaults.access,
|
|
33
|
-
upgradeable: commonDefaults.upgradeable,
|
|
34
|
-
info: commonDefaults.info,
|
|
35
33
|
} as const;
|
|
36
34
|
|
|
37
35
|
function withDefaults(opts: ERC1155Options): Required<ERC1155Options> {
|
package/src/erc20.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { defineFunctions } from './utils/define-functions';
|
|
|
6
6
|
import type { CommonOptions } from './common-options';
|
|
7
7
|
import { withCommonDefaults, defaults as commonDefaults } from './common-options';
|
|
8
8
|
import { setUpgradeable } from './set-upgradeable';
|
|
9
|
+
import type { Upgradeable } from './set-upgradeable';
|
|
9
10
|
import { setInfo } from './set-info';
|
|
10
11
|
import { printContract } from './print';
|
|
11
12
|
import type { ClockMode } from './set-clock-mode';
|
|
@@ -13,6 +14,7 @@ import { clockModeDefault, setClockMode } from './set-clock-mode';
|
|
|
13
14
|
import { supportsInterface } from './common-functions';
|
|
14
15
|
import { OptionsError } from './error';
|
|
15
16
|
import { toUint256, UINT256_MAX } from './utils/convert-strings';
|
|
17
|
+
import { setNamespacedStorage, toStorageStructInstantiation } from './set-namespaced-storage';
|
|
16
18
|
|
|
17
19
|
export const crossChainBridgingOptions = [false, 'custom', 'superchain'] as const;
|
|
18
20
|
export type CrossChainBridging = (typeof crossChainBridgingOptions)[number];
|
|
@@ -34,9 +36,11 @@ export interface ERC20Options extends CommonOptions {
|
|
|
34
36
|
votes?: boolean | ClockMode;
|
|
35
37
|
flashmint?: boolean;
|
|
36
38
|
crossChainBridging?: CrossChainBridging;
|
|
39
|
+
namespacePrefix?: string;
|
|
37
40
|
}
|
|
38
41
|
|
|
39
42
|
export const defaults: Required<ERC20Options> = {
|
|
43
|
+
...commonDefaults,
|
|
40
44
|
name: 'MyToken',
|
|
41
45
|
symbol: 'MTK',
|
|
42
46
|
burnable: false,
|
|
@@ -49,9 +53,7 @@ export const defaults: Required<ERC20Options> = {
|
|
|
49
53
|
votes: false,
|
|
50
54
|
flashmint: false,
|
|
51
55
|
crossChainBridging: false,
|
|
52
|
-
|
|
53
|
-
upgradeable: commonDefaults.upgradeable,
|
|
54
|
-
info: commonDefaults.info,
|
|
56
|
+
namespacePrefix: 'myProject',
|
|
55
57
|
} as const;
|
|
56
58
|
|
|
57
59
|
export function withDefaults(opts: ERC20Options): Required<ERC20Options> {
|
|
@@ -68,6 +70,7 @@ export function withDefaults(opts: ERC20Options): Required<ERC20Options> {
|
|
|
68
70
|
votes: opts.votes ?? defaults.votes,
|
|
69
71
|
flashmint: opts.flashmint ?? defaults.flashmint,
|
|
70
72
|
crossChainBridging: opts.crossChainBridging ?? defaults.crossChainBridging,
|
|
73
|
+
namespacePrefix: opts.namespacePrefix ?? defaults.namespacePrefix,
|
|
71
74
|
};
|
|
72
75
|
}
|
|
73
76
|
|
|
@@ -89,7 +92,7 @@ export function buildERC20(opts: ERC20Options): ContractBuilder {
|
|
|
89
92
|
addBase(c, allOpts.name, allOpts.symbol);
|
|
90
93
|
|
|
91
94
|
if (allOpts.crossChainBridging) {
|
|
92
|
-
addCrossChainBridging(c, allOpts.crossChainBridging, access);
|
|
95
|
+
addCrossChainBridging(c, allOpts.crossChainBridging, access, upgradeable, allOpts.namespacePrefix);
|
|
93
96
|
}
|
|
94
97
|
|
|
95
98
|
if (allOpts.premint) {
|
|
@@ -304,7 +307,13 @@ function addFlashMint(c: ContractBuilder) {
|
|
|
304
307
|
});
|
|
305
308
|
}
|
|
306
309
|
|
|
307
|
-
function addCrossChainBridging(
|
|
310
|
+
function addCrossChainBridging(
|
|
311
|
+
c: ContractBuilder,
|
|
312
|
+
crossChainBridging: 'custom' | 'superchain',
|
|
313
|
+
access: Access,
|
|
314
|
+
upgradeable: Upgradeable,
|
|
315
|
+
namespacePrefix: string,
|
|
316
|
+
) {
|
|
308
317
|
const ERC20Bridgeable = {
|
|
309
318
|
name: 'ERC20Bridgeable',
|
|
310
319
|
path: `@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol`,
|
|
@@ -316,7 +325,7 @@ function addCrossChainBridging(c: ContractBuilder, crossChainBridging: 'custom'
|
|
|
316
325
|
c.addOverride(ERC20Bridgeable, functions._checkTokenBridge);
|
|
317
326
|
switch (crossChainBridging) {
|
|
318
327
|
case 'custom':
|
|
319
|
-
addCustomBridging(c, access);
|
|
328
|
+
addCustomBridging(c, access, upgradeable, namespacePrefix);
|
|
320
329
|
break;
|
|
321
330
|
case 'superchain':
|
|
322
331
|
addSuperchainERC20(c);
|
|
@@ -326,27 +335,45 @@ function addCrossChainBridging(c: ContractBuilder, crossChainBridging: 'custom'
|
|
|
326
335
|
throw new Error('Unknown value for `crossChainBridging`');
|
|
327
336
|
}
|
|
328
337
|
}
|
|
329
|
-
c.
|
|
338
|
+
c.addConstantOrImmutableOrErrorDefinition('error Unauthorized();');
|
|
330
339
|
}
|
|
331
340
|
|
|
332
|
-
function addCustomBridging(c: ContractBuilder, access: Access) {
|
|
341
|
+
function addCustomBridging(c: ContractBuilder, access: Access, upgradeable: Upgradeable, namespacePrefix: string) {
|
|
333
342
|
switch (access) {
|
|
334
343
|
case false:
|
|
335
344
|
case 'ownable': {
|
|
336
|
-
|
|
337
|
-
|
|
345
|
+
if (!upgradeable) {
|
|
346
|
+
const addedBridge = c.addStateVariable(`address public tokenBridge;`, false);
|
|
347
|
+
if (addedBridge) {
|
|
348
|
+
c.addConstructorArgument({ type: 'address', name: 'tokenBridge_' });
|
|
349
|
+
c.addConstructorCode(`require(tokenBridge_ != address(0), "Invalid tokenBridge_ address");`);
|
|
350
|
+
c.addConstructorCode(`tokenBridge = tokenBridge_;`);
|
|
351
|
+
}
|
|
352
|
+
c.setFunctionBody([`if (caller != tokenBridge) revert Unauthorized();`], functions._checkTokenBridge, 'view');
|
|
353
|
+
} else {
|
|
354
|
+
setNamespacedStorage(c, ['address tokenBridge;'], namespacePrefix);
|
|
355
|
+
|
|
338
356
|
c.addConstructorArgument({ type: 'address', name: 'tokenBridge_' });
|
|
339
357
|
c.addConstructorCode(`require(tokenBridge_ != address(0), "Invalid tokenBridge_ address");`);
|
|
340
|
-
|
|
358
|
+
|
|
359
|
+
c.addConstructorCode(toStorageStructInstantiation(c.name));
|
|
360
|
+
c.addConstructorCode(`$.tokenBridge = tokenBridge_;`);
|
|
361
|
+
|
|
362
|
+
c.setFunctionBody(
|
|
363
|
+
[toStorageStructInstantiation(c.name), `if (caller != $.tokenBridge) revert Unauthorized();`],
|
|
364
|
+
functions._checkTokenBridge,
|
|
365
|
+
'view',
|
|
366
|
+
);
|
|
341
367
|
}
|
|
342
|
-
c.setFunctionBody([`if (caller != tokenBridge) revert Unauthorized();`], functions._checkTokenBridge, 'view');
|
|
343
368
|
break;
|
|
344
369
|
}
|
|
345
370
|
case 'roles': {
|
|
346
371
|
setAccessControl(c, access);
|
|
347
372
|
const roleOwner = 'tokenBridge';
|
|
348
373
|
const roleId = 'TOKEN_BRIDGE_ROLE';
|
|
349
|
-
const addedRoleConstant = c.
|
|
374
|
+
const addedRoleConstant = c.addConstantOrImmutableOrErrorDefinition(
|
|
375
|
+
`bytes32 public constant ${roleId} = keccak256("${roleId}");`,
|
|
376
|
+
);
|
|
350
377
|
if (addedRoleConstant) {
|
|
351
378
|
c.addConstructorArgument({ type: 'address', name: roleOwner });
|
|
352
379
|
c.addConstructorCode(`_grantRole(${roleId}, ${roleOwner});`);
|
|
@@ -382,7 +409,9 @@ function addCustomBridging(c: ContractBuilder, access: Access) {
|
|
|
382
409
|
}
|
|
383
410
|
|
|
384
411
|
function addSuperchainERC20(c: ContractBuilder) {
|
|
385
|
-
c.
|
|
412
|
+
c.addConstantOrImmutableOrErrorDefinition(
|
|
413
|
+
'address internal constant SUPERCHAIN_TOKEN_BRIDGE = 0x4200000000000000000000000000000000000028;',
|
|
414
|
+
);
|
|
386
415
|
c.setFunctionBody(
|
|
387
416
|
['if (caller != SUPERCHAIN_TOKEN_BRIDGE) revert Unauthorized();'],
|
|
388
417
|
functions._checkTokenBridge,
|