@openzeppelin/wizard 0.9.0 → 0.10.2
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/README.md +17 -57
- package/dist/account.js +13 -8
- package/dist/account.js.map +1 -1
- package/dist/api.d.ts +11 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +9 -0
- package/dist/api.js.map +1 -1
- package/dist/environments/hardhat/package-lock.json +64 -64
- package/dist/environments/hardhat/package.json +2 -2
- package/dist/environments/hardhat/upgradeable/package-lock.json +69 -69
- package/dist/environments/hardhat/upgradeable/package.json +4 -4
- package/dist/erc20.js +1 -1
- package/dist/generate/account.js +1 -1
- package/dist/generate/account.js.map +1 -1
- package/dist/generate/stablecoin.js +2 -2
- package/dist/generate/stablecoin.js.map +1 -1
- package/dist/get-versioned-remappings.d.ts +3 -0
- package/dist/get-versioned-remappings.d.ts.map +1 -0
- package/dist/get-versioned-remappings.js +15 -0
- package/dist/get-versioned-remappings.js.map +1 -0
- package/dist/print.d.ts.map +1 -1
- package/dist/print.js +4 -3
- package/dist/print.js.map +1 -1
- package/dist/set-upgradeable.d.ts.map +1 -1
- package/dist/set-upgradeable.js +2 -0
- package/dist/set-upgradeable.js.map +1 -1
- package/dist/signer.d.ts +12 -8
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +49 -18
- package/dist/signer.js.map +1 -1
- package/dist/stablecoin.d.ts +2 -2
- package/dist/stablecoin.d.ts.map +1 -1
- package/dist/stablecoin.js +44 -62
- package/dist/stablecoin.js.map +1 -1
- package/dist/utils/convert-strings.d.ts +3 -3
- package/dist/utils/convert-strings.js +3 -3
- package/dist/utils/version.d.ts +1 -1
- package/dist/utils/version.js +1 -1
- package/dist/zip-hardhat.d.ts.map +1 -1
- package/dist/zip-hardhat.js +1 -0
- package/dist/zip-hardhat.js.map +1 -1
- package/package.json +3 -3
- package/src/account.ts +14 -8
- package/src/api.ts +21 -0
- package/src/environments/hardhat/package-lock.json +64 -64
- package/src/environments/hardhat/package.json +3 -3
- package/src/environments/hardhat/upgradeable/package-lock.json +69 -69
- package/src/environments/hardhat/upgradeable/package.json +5 -5
- package/src/erc20.ts +1 -1
- package/src/generate/account.ts +1 -1
- package/src/generate/stablecoin.ts +2 -2
- package/src/get-versioned-remappings.ts +10 -0
- package/src/print.ts +7 -3
- package/src/set-upgradeable.ts +2 -0
- package/src/signer.ts +53 -19
- package/src/stablecoin.ts +49 -68
- package/src/utils/convert-strings.ts +3 -3
- package/src/utils/version.ts +1 -1
- package/src/zip-hardhat.ts +1 -0
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
"license": "ISC",
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"@nomicfoundation/hardhat-toolbox": "^6.1.0",
|
|
13
|
-
"@openzeppelin/contracts": "^5.
|
|
14
|
-
"@openzeppelin/contracts-upgradeable": "^5.
|
|
13
|
+
"@openzeppelin/contracts": "^5.5.0",
|
|
14
|
+
"@openzeppelin/contracts-upgradeable": "^5.5.0",
|
|
15
15
|
"@openzeppelin/hardhat-upgrades": "^3.0.0",
|
|
16
|
-
"hardhat": "^2.
|
|
16
|
+
"hardhat": "^2.22.0"
|
|
17
17
|
}
|
|
18
18
|
},
|
|
19
19
|
"node_modules/@adraffy/ens-normalize": {
|
|
@@ -1924,20 +1924,20 @@
|
|
|
1924
1924
|
}
|
|
1925
1925
|
},
|
|
1926
1926
|
"node_modules/@openzeppelin/contracts": {
|
|
1927
|
-
"version": "5.
|
|
1928
|
-
"resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.
|
|
1929
|
-
"integrity": "sha512-
|
|
1927
|
+
"version": "5.5.0",
|
|
1928
|
+
"resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.5.0.tgz",
|
|
1929
|
+
"integrity": "sha512-R8hq4zmKKWP2c7OxeRgAcjZwvF5W0Qq2OIX7degrtdM52Q9xYr4MLJdUAVPKGUewNJ1qo+M6YiZLLnNUnjP/gg==",
|
|
1930
1930
|
"dev": true,
|
|
1931
1931
|
"license": "MIT"
|
|
1932
1932
|
},
|
|
1933
1933
|
"node_modules/@openzeppelin/contracts-upgradeable": {
|
|
1934
|
-
"version": "5.
|
|
1935
|
-
"resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.
|
|
1936
|
-
"integrity": "sha512-
|
|
1934
|
+
"version": "5.5.0",
|
|
1935
|
+
"resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.5.0.tgz",
|
|
1936
|
+
"integrity": "sha512-Va5hKG5oaK0EE5bXTVWugcGimMHazxL+SL523dH6WVbGiuLXwuWr9oxtLyPHQSVGtgmlIgtKNR5V+OUpCIUwFQ==",
|
|
1937
1937
|
"dev": true,
|
|
1938
1938
|
"license": "MIT",
|
|
1939
1939
|
"peerDependencies": {
|
|
1940
|
-
"@openzeppelin/contracts": "5.
|
|
1940
|
+
"@openzeppelin/contracts": "5.5.0"
|
|
1941
1941
|
}
|
|
1942
1942
|
},
|
|
1943
1943
|
"node_modules/@openzeppelin/defender-sdk-base-client": {
|
|
@@ -3963,19 +3963,28 @@
|
|
|
3963
3963
|
}
|
|
3964
3964
|
},
|
|
3965
3965
|
"node_modules/chokidar": {
|
|
3966
|
-
"version": "
|
|
3967
|
-
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-
|
|
3968
|
-
"integrity": "sha512-
|
|
3966
|
+
"version": "3.6.0",
|
|
3967
|
+
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
|
|
3968
|
+
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
|
|
3969
3969
|
"dev": true,
|
|
3970
3970
|
"license": "MIT",
|
|
3971
3971
|
"dependencies": {
|
|
3972
|
-
"
|
|
3972
|
+
"anymatch": "~3.1.2",
|
|
3973
|
+
"braces": "~3.0.2",
|
|
3974
|
+
"glob-parent": "~5.1.2",
|
|
3975
|
+
"is-binary-path": "~2.1.0",
|
|
3976
|
+
"is-glob": "~4.0.1",
|
|
3977
|
+
"normalize-path": "~3.0.0",
|
|
3978
|
+
"readdirp": "~3.6.0"
|
|
3973
3979
|
},
|
|
3974
3980
|
"engines": {
|
|
3975
|
-
"node": ">=
|
|
3981
|
+
"node": ">= 8.10.0"
|
|
3976
3982
|
},
|
|
3977
3983
|
"funding": {
|
|
3978
3984
|
"url": "https://paulmillr.com/funding/"
|
|
3985
|
+
},
|
|
3986
|
+
"optionalDependencies": {
|
|
3987
|
+
"fsevents": "~2.3.2"
|
|
3979
3988
|
}
|
|
3980
3989
|
},
|
|
3981
3990
|
"node_modules/ci-info": {
|
|
@@ -5486,9 +5495,9 @@
|
|
|
5486
5495
|
}
|
|
5487
5496
|
},
|
|
5488
5497
|
"node_modules/hardhat": {
|
|
5489
|
-
"version": "2.26.
|
|
5490
|
-
"resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.26.
|
|
5491
|
-
"integrity": "sha512-
|
|
5498
|
+
"version": "2.26.5",
|
|
5499
|
+
"resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.26.5.tgz",
|
|
5500
|
+
"integrity": "sha512-TvFKUPGRaoemeVpnKsXt5I+kVCNrzP2cLwyNUveu0JKf2Q0lzh6LTgVBsWyYPlXAwBzyUQ6fsL98UgyF/QdOfA==",
|
|
5492
5501
|
"dev": true,
|
|
5493
5502
|
"license": "MIT",
|
|
5494
5503
|
"dependencies": {
|
|
@@ -5718,6 +5727,22 @@
|
|
|
5718
5727
|
"@scure/base": "~1.1.0"
|
|
5719
5728
|
}
|
|
5720
5729
|
},
|
|
5730
|
+
"node_modules/hardhat/node_modules/chokidar": {
|
|
5731
|
+
"version": "4.0.3",
|
|
5732
|
+
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
|
|
5733
|
+
"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
|
|
5734
|
+
"dev": true,
|
|
5735
|
+
"license": "MIT",
|
|
5736
|
+
"dependencies": {
|
|
5737
|
+
"readdirp": "^4.0.1"
|
|
5738
|
+
},
|
|
5739
|
+
"engines": {
|
|
5740
|
+
"node": ">= 14.16.0"
|
|
5741
|
+
},
|
|
5742
|
+
"funding": {
|
|
5743
|
+
"url": "https://paulmillr.com/funding/"
|
|
5744
|
+
}
|
|
5745
|
+
},
|
|
5721
5746
|
"node_modules/hardhat/node_modules/ethereum-cryptography": {
|
|
5722
5747
|
"version": "1.2.0",
|
|
5723
5748
|
"resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz",
|
|
@@ -5756,6 +5781,20 @@
|
|
|
5756
5781
|
"graceful-fs": "^4.1.6"
|
|
5757
5782
|
}
|
|
5758
5783
|
},
|
|
5784
|
+
"node_modules/hardhat/node_modules/readdirp": {
|
|
5785
|
+
"version": "4.1.2",
|
|
5786
|
+
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
|
|
5787
|
+
"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
|
|
5788
|
+
"dev": true,
|
|
5789
|
+
"license": "MIT",
|
|
5790
|
+
"engines": {
|
|
5791
|
+
"node": ">= 14.18.0"
|
|
5792
|
+
},
|
|
5793
|
+
"funding": {
|
|
5794
|
+
"type": "individual",
|
|
5795
|
+
"url": "https://paulmillr.com/funding/"
|
|
5796
|
+
}
|
|
5797
|
+
},
|
|
5759
5798
|
"node_modules/hardhat/node_modules/universalify": {
|
|
5760
5799
|
"version": "0.1.2",
|
|
5761
5800
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
|
|
@@ -6772,31 +6811,6 @@
|
|
|
6772
6811
|
"node": ">= 14.0.0"
|
|
6773
6812
|
}
|
|
6774
6813
|
},
|
|
6775
|
-
"node_modules/mocha/node_modules/chokidar": {
|
|
6776
|
-
"version": "3.6.0",
|
|
6777
|
-
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
|
|
6778
|
-
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
|
|
6779
|
-
"dev": true,
|
|
6780
|
-
"license": "MIT",
|
|
6781
|
-
"dependencies": {
|
|
6782
|
-
"anymatch": "~3.1.2",
|
|
6783
|
-
"braces": "~3.0.2",
|
|
6784
|
-
"glob-parent": "~5.1.2",
|
|
6785
|
-
"is-binary-path": "~2.1.0",
|
|
6786
|
-
"is-glob": "~4.0.1",
|
|
6787
|
-
"normalize-path": "~3.0.0",
|
|
6788
|
-
"readdirp": "~3.6.0"
|
|
6789
|
-
},
|
|
6790
|
-
"engines": {
|
|
6791
|
-
"node": ">= 8.10.0"
|
|
6792
|
-
},
|
|
6793
|
-
"funding": {
|
|
6794
|
-
"url": "https://paulmillr.com/funding/"
|
|
6795
|
-
},
|
|
6796
|
-
"optionalDependencies": {
|
|
6797
|
-
"fsevents": "~2.3.2"
|
|
6798
|
-
}
|
|
6799
|
-
},
|
|
6800
6814
|
"node_modules/mocha/node_modules/glob": {
|
|
6801
6815
|
"version": "8.1.0",
|
|
6802
6816
|
"resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
|
|
@@ -6831,19 +6845,6 @@
|
|
|
6831
6845
|
"node": ">=10"
|
|
6832
6846
|
}
|
|
6833
6847
|
},
|
|
6834
|
-
"node_modules/mocha/node_modules/readdirp": {
|
|
6835
|
-
"version": "3.6.0",
|
|
6836
|
-
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
|
|
6837
|
-
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
|
|
6838
|
-
"dev": true,
|
|
6839
|
-
"license": "MIT",
|
|
6840
|
-
"dependencies": {
|
|
6841
|
-
"picomatch": "^2.2.1"
|
|
6842
|
-
},
|
|
6843
|
-
"engines": {
|
|
6844
|
-
"node": ">=8.10.0"
|
|
6845
|
-
}
|
|
6846
|
-
},
|
|
6847
6848
|
"node_modules/mocha/node_modules/supports-color": {
|
|
6848
6849
|
"version": "8.1.1",
|
|
6849
6850
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
|
|
@@ -7500,17 +7501,16 @@
|
|
|
7500
7501
|
}
|
|
7501
7502
|
},
|
|
7502
7503
|
"node_modules/readdirp": {
|
|
7503
|
-
"version": "
|
|
7504
|
-
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-
|
|
7505
|
-
"integrity": "sha512-
|
|
7504
|
+
"version": "3.6.0",
|
|
7505
|
+
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
|
|
7506
|
+
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
|
|
7506
7507
|
"dev": true,
|
|
7507
7508
|
"license": "MIT",
|
|
7508
|
-
"
|
|
7509
|
-
"
|
|
7509
|
+
"dependencies": {
|
|
7510
|
+
"picomatch": "^2.2.1"
|
|
7510
7511
|
},
|
|
7511
|
-
"
|
|
7512
|
-
"
|
|
7513
|
-
"url": "https://paulmillr.com/funding/"
|
|
7512
|
+
"engines": {
|
|
7513
|
+
"node": ">=8.10.0"
|
|
7514
7514
|
}
|
|
7515
7515
|
},
|
|
7516
7516
|
"node_modules/rechoir": {
|
|
@@ -8643,14 +8643,14 @@
|
|
|
8643
8643
|
}
|
|
8644
8644
|
},
|
|
8645
8645
|
"node_modules/tinyglobby": {
|
|
8646
|
-
"version": "0.2.
|
|
8647
|
-
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.
|
|
8648
|
-
"integrity": "sha512-
|
|
8646
|
+
"version": "0.2.15",
|
|
8647
|
+
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
|
|
8648
|
+
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
|
|
8649
8649
|
"dev": true,
|
|
8650
8650
|
"license": "MIT",
|
|
8651
8651
|
"dependencies": {
|
|
8652
|
-
"fdir": "^6.
|
|
8653
|
-
"picomatch": "^4.0.
|
|
8652
|
+
"fdir": "^6.5.0",
|
|
8653
|
+
"picomatch": "^4.0.3"
|
|
8654
8654
|
},
|
|
8655
8655
|
"engines": {
|
|
8656
8656
|
"node": ">=12.0.0"
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
"author": "",
|
|
10
10
|
"license": "ISC",
|
|
11
11
|
"devDependencies": {
|
|
12
|
-
"@openzeppelin/contracts": "^5.4.0",
|
|
13
|
-
"@openzeppelin/contracts-upgradeable": "^5.4.0",
|
|
14
|
-
"@openzeppelin/hardhat-upgrades": "^3.0.0",
|
|
15
12
|
"@nomicfoundation/hardhat-toolbox": "^6.1.0",
|
|
16
|
-
"
|
|
13
|
+
"@openzeppelin/contracts": "^5.5.0",
|
|
14
|
+
"@openzeppelin/contracts-upgradeable": "^5.5.0",
|
|
15
|
+
"@openzeppelin/hardhat-upgrades": "^3.0.0",
|
|
16
|
+
"hardhat": "^2.22.0"
|
|
17
17
|
}
|
|
18
|
-
}
|
|
18
|
+
}
|
package/src/erc20.ts
CHANGED
|
@@ -237,7 +237,7 @@ function addPremint(
|
|
|
237
237
|
* Check for potential premint overflow assuming the user's contract has decimals() = 18
|
|
238
238
|
*
|
|
239
239
|
* @param baseUnits The base units of the token, before applying power of 10
|
|
240
|
-
* @param decimalPlace If positive, the number of assumed decimal places in the least significant digits of `
|
|
240
|
+
* @param decimalPlace If positive, the number of assumed decimal places in the least significant digits of `baseUnits`. Ignored if <= 0.
|
|
241
241
|
* @throws OptionsError if the calculated value would overflow uint256
|
|
242
242
|
*/
|
|
243
243
|
function checkPotentialPremintOverflow(baseUnits: bigint, decimalPlace: number) {
|
package/src/generate/account.ts
CHANGED
|
@@ -8,7 +8,7 @@ const account = {
|
|
|
8
8
|
signatureValidation: [false, 'ERC1271', 'ERC7739'] as const,
|
|
9
9
|
ERC721Holder: [false, true] as const,
|
|
10
10
|
ERC1155Holder: [false, true] as const,
|
|
11
|
-
signer: ['
|
|
11
|
+
signer: ['ECDSA', 'EIP7702', 'Multisig', 'MultisigWeighted', 'P256', 'RSA', 'WebAuthn'] as const,
|
|
12
12
|
batchedExecution: [false, true] as const,
|
|
13
13
|
ERC7579Modules: [false, 'AccountERC7579', 'AccountERC7579Hooked'] as const,
|
|
14
14
|
access: [false] as const,
|
|
@@ -43,8 +43,8 @@ const erc20Full = {
|
|
|
43
43
|
};
|
|
44
44
|
|
|
45
45
|
const stablecoinExtensions = {
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
restrictions: [false, 'allowlist', 'blocklist'] as const,
|
|
47
|
+
freezable: booleans,
|
|
48
48
|
upgradeable: [false] as const,
|
|
49
49
|
};
|
|
50
50
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CommonOptions } from './common-options';
|
|
2
|
+
import contracts from '../openzeppelin-contracts';
|
|
3
|
+
|
|
4
|
+
export function getVersionedRemappings(opts?: CommonOptions): string[] {
|
|
5
|
+
const remappings = [`@openzeppelin/contracts/=@openzeppelin/contracts@${contracts.version}/`];
|
|
6
|
+
if (opts?.upgradeable) {
|
|
7
|
+
remappings.push(`@openzeppelin/contracts-upgradeable/=@openzeppelin/contracts-upgradeable@${contracts.version}/`);
|
|
8
|
+
}
|
|
9
|
+
return remappings;
|
|
10
|
+
}
|
package/src/print.ts
CHANGED
|
@@ -101,16 +101,20 @@ function printConstructor(contract: Contract, helpers: Helpers): Lines[] {
|
|
|
101
101
|
if (hasParentParams || hasConstructorCode || (helpers.upgradeable && parentsWithInitializers.length > 0)) {
|
|
102
102
|
if (helpers.upgradeable) {
|
|
103
103
|
const upgradeableParents = parentsWithInitializers.filter(p => inferTranspiled(p.contract));
|
|
104
|
-
|
|
104
|
+
// Omit Initializable and UUPSUpgradeable since they don't have explicit constructors
|
|
105
|
+
const nonUpgradeableParentsWithConstructors = contract.parents.filter(
|
|
106
|
+
p =>
|
|
107
|
+
!inferTranspiled(p.contract) && p.contract.name !== 'Initializable' && p.contract.name !== 'UUPSUpgradeable',
|
|
108
|
+
);
|
|
105
109
|
const constructor = printFunction2(
|
|
106
110
|
[
|
|
107
|
-
|
|
111
|
+
nonUpgradeableParentsWithConstructors.length > 0
|
|
108
112
|
? '/// @custom:oz-upgrades-unsafe-allow-reachable constructor'
|
|
109
113
|
: '/// @custom:oz-upgrades-unsafe-allow constructor',
|
|
110
114
|
],
|
|
111
115
|
'constructor',
|
|
112
116
|
[],
|
|
113
|
-
|
|
117
|
+
nonUpgradeableParentsWithConstructors.flatMap(p => printParentConstructor(p, helpers)),
|
|
114
118
|
['_disableInitializers();'],
|
|
115
119
|
);
|
|
116
120
|
const initializer = printFunction2(
|
package/src/set-upgradeable.ts
CHANGED
|
@@ -21,6 +21,7 @@ function setUpgradeableBase(
|
|
|
21
21
|
c.addParent({
|
|
22
22
|
name: 'Initializable',
|
|
23
23
|
path: '@openzeppelin/contracts/proxy/utils/Initializable.sol',
|
|
24
|
+
transpiled: false,
|
|
24
25
|
});
|
|
25
26
|
|
|
26
27
|
switch (upgradeable) {
|
|
@@ -32,6 +33,7 @@ function setUpgradeableBase(
|
|
|
32
33
|
const UUPSUpgradeable = {
|
|
33
34
|
name: 'UUPSUpgradeable',
|
|
34
35
|
path: '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol',
|
|
36
|
+
transpiled: false,
|
|
35
37
|
};
|
|
36
38
|
c.addParent(UUPSUpgradeable);
|
|
37
39
|
c.addOverride(UUPSUpgradeable, functions._authorizeUpgrade);
|
package/src/signer.ts
CHANGED
|
@@ -3,7 +3,16 @@ import { OptionsError } from './error';
|
|
|
3
3
|
import type { Upgradeable } from './set-upgradeable';
|
|
4
4
|
import { defineFunctions } from './utils/define-functions';
|
|
5
5
|
|
|
6
|
-
export const SignerOptions = [
|
|
6
|
+
export const SignerOptions = [
|
|
7
|
+
false,
|
|
8
|
+
'ECDSA',
|
|
9
|
+
'EIP7702',
|
|
10
|
+
'Multisig',
|
|
11
|
+
'MultisigWeighted',
|
|
12
|
+
'P256',
|
|
13
|
+
'RSA',
|
|
14
|
+
'WebAuthn',
|
|
15
|
+
] as const;
|
|
7
16
|
export type SignerOptions = (typeof SignerOptions)[number];
|
|
8
17
|
|
|
9
18
|
export function addSigner(c: ContractBuilder, signer: SignerOptions, upgradeable: Upgradeable): void {
|
|
@@ -13,11 +22,11 @@ export function addSigner(c: ContractBuilder, signer: SignerOptions, upgradeable
|
|
|
13
22
|
c.addOverride({ name: signerName }, signerFunctions._rawSignatureValidation);
|
|
14
23
|
|
|
15
24
|
switch (signer) {
|
|
16
|
-
case '
|
|
25
|
+
case 'EIP7702':
|
|
17
26
|
c.addParent(signers[signer]);
|
|
18
27
|
if (upgradeable) {
|
|
19
28
|
throw new OptionsError({
|
|
20
|
-
|
|
29
|
+
eip7702: 'EOAs can upgrade by redelegating to a new account',
|
|
21
30
|
upgradeable: 'EOAs can upgrade by redelegating to a new account',
|
|
22
31
|
});
|
|
23
32
|
}
|
|
@@ -34,25 +43,37 @@ export function addSigner(c: ContractBuilder, signer: SignerOptions, upgradeable
|
|
|
34
43
|
);
|
|
35
44
|
break;
|
|
36
45
|
}
|
|
46
|
+
case 'WebAuthn': {
|
|
47
|
+
signerArgs.P256.forEach(arg => c.addConstructorArgument(arg));
|
|
48
|
+
c.addParent(
|
|
49
|
+
signers.P256,
|
|
50
|
+
signerArgs.P256.map(arg => ({ lit: arg.name })),
|
|
51
|
+
);
|
|
52
|
+
c.addParent(signers[signer]);
|
|
53
|
+
c.addImportOnly({
|
|
54
|
+
name: 'AbstractSigner',
|
|
55
|
+
path: '@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol',
|
|
56
|
+
transpiled: false,
|
|
57
|
+
});
|
|
58
|
+
c.addOverride({ name: 'AbstractSigner', transpiled: false }, signerFunctions._rawSignatureValidation);
|
|
59
|
+
c.addOverride({ name: 'SignerP256' }, signerFunctions._rawSignatureValidation);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
default: {
|
|
63
|
+
const _: never = signer;
|
|
64
|
+
throw new Error('Unknown signer');
|
|
65
|
+
}
|
|
37
66
|
}
|
|
38
67
|
}
|
|
39
68
|
|
|
40
69
|
export const signers = {
|
|
41
|
-
ERC7702: {
|
|
42
|
-
name: 'SignerERC7702',
|
|
43
|
-
path: '@openzeppelin/contracts/utils/cryptography/signers/SignerERC7702.sol',
|
|
44
|
-
},
|
|
45
70
|
ECDSA: {
|
|
46
71
|
name: 'SignerECDSA',
|
|
47
72
|
path: '@openzeppelin/contracts/utils/cryptography/signers/SignerECDSA.sol',
|
|
48
73
|
},
|
|
49
|
-
|
|
50
|
-
name: '
|
|
51
|
-
path: '@openzeppelin/contracts/utils/cryptography/signers/
|
|
52
|
-
},
|
|
53
|
-
RSA: {
|
|
54
|
-
name: 'SignerRSA',
|
|
55
|
-
path: '@openzeppelin/contracts/utils/cryptography/signers/SignerRSA.sol',
|
|
74
|
+
EIP7702: {
|
|
75
|
+
name: 'SignerEIP7702',
|
|
76
|
+
path: '@openzeppelin/contracts/utils/cryptography/signers/SignerEIP7702.sol',
|
|
56
77
|
},
|
|
57
78
|
Multisig: {
|
|
58
79
|
name: 'MultiSignerERC7913',
|
|
@@ -62,18 +83,26 @@ export const signers = {
|
|
|
62
83
|
name: 'MultiSignerERC7913Weighted',
|
|
63
84
|
path: '@openzeppelin/contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol',
|
|
64
85
|
},
|
|
86
|
+
P256: {
|
|
87
|
+
name: 'SignerP256',
|
|
88
|
+
path: '@openzeppelin/contracts/utils/cryptography/signers/SignerP256.sol',
|
|
89
|
+
},
|
|
90
|
+
RSA: {
|
|
91
|
+
name: 'SignerRSA',
|
|
92
|
+
path: '@openzeppelin/contracts/utils/cryptography/signers/SignerRSA.sol',
|
|
93
|
+
},
|
|
94
|
+
WebAuthn: {
|
|
95
|
+
name: 'SignerWebAuthn',
|
|
96
|
+
path: '@openzeppelin/contracts/utils/cryptography/signers/SignerWebAuthn.sol',
|
|
97
|
+
},
|
|
65
98
|
};
|
|
66
99
|
|
|
67
|
-
export const signerArgs: Record<Exclude<SignerOptions, false | '
|
|
100
|
+
export const signerArgs: Record<Exclude<SignerOptions, false | 'EIP7702'>, { name: string; type: string }[]> = {
|
|
68
101
|
ECDSA: [{ name: 'signer', type: 'address' }],
|
|
69
102
|
P256: [
|
|
70
103
|
{ name: 'qx', type: 'bytes32' },
|
|
71
104
|
{ name: 'qy', type: 'bytes32' },
|
|
72
105
|
],
|
|
73
|
-
RSA: [
|
|
74
|
-
{ name: 'e', type: 'bytes memory' },
|
|
75
|
-
{ name: 'n', type: 'bytes memory' },
|
|
76
|
-
],
|
|
77
106
|
Multisig: [
|
|
78
107
|
{ name: 'signers', type: 'bytes[] memory' },
|
|
79
108
|
{ name: 'threshold', type: 'uint64' },
|
|
@@ -83,6 +112,11 @@ export const signerArgs: Record<Exclude<SignerOptions, false | 'ERC7702'>, { nam
|
|
|
83
112
|
{ name: 'weights', type: 'uint64[] memory' },
|
|
84
113
|
{ name: 'threshold', type: 'uint64' },
|
|
85
114
|
],
|
|
115
|
+
RSA: [
|
|
116
|
+
{ name: 'e', type: 'bytes memory' },
|
|
117
|
+
{ name: 'n', type: 'bytes memory' },
|
|
118
|
+
],
|
|
119
|
+
WebAuthn: [],
|
|
86
120
|
};
|
|
87
121
|
|
|
88
122
|
export const signerFunctions = defineFunctions({
|
package/src/stablecoin.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Contract, ContractBuilder } from './contract';
|
|
2
2
|
import type { Access } from './set-access-control';
|
|
3
|
-
import {
|
|
3
|
+
import { requireAccessControl } from './set-access-control';
|
|
4
4
|
import { defineFunctions } from './utils/define-functions';
|
|
5
5
|
import { printContract } from './print';
|
|
6
6
|
import type { ERC20Options } from './erc20';
|
|
@@ -12,16 +12,16 @@ import {
|
|
|
12
12
|
} from './erc20';
|
|
13
13
|
|
|
14
14
|
export interface StablecoinOptions extends ERC20Options {
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
restrictions?: false | 'allowlist' | 'blocklist';
|
|
16
|
+
freezable?: boolean;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export const defaults: Required<StablecoinOptions> = {
|
|
20
20
|
...erc20defaults,
|
|
21
21
|
name: 'MyStablecoin',
|
|
22
22
|
symbol: 'MST',
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
restrictions: false,
|
|
24
|
+
freezable: false,
|
|
25
25
|
} as const;
|
|
26
26
|
|
|
27
27
|
function withDefaults(opts: StablecoinOptions): Required<StablecoinOptions> {
|
|
@@ -29,8 +29,8 @@ function withDefaults(opts: StablecoinOptions): Required<StablecoinOptions> {
|
|
|
29
29
|
...withERC20Defaults(opts),
|
|
30
30
|
name: opts.name ?? defaults.name,
|
|
31
31
|
symbol: opts.symbol ?? defaults.symbol,
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
restrictions: opts.restrictions ?? defaults.restrictions,
|
|
33
|
+
freezable: opts.freezable ?? defaults.freezable,
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -39,7 +39,7 @@ export function printStablecoin(opts: StablecoinOptions = defaults): string {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
export function isAccessControlRequired(opts: Partial<StablecoinOptions>): boolean {
|
|
42
|
-
return opts.mintable || opts.
|
|
42
|
+
return opts.mintable || opts.restrictions !== false || opts.freezable || opts.pausable || opts.upgradeable === 'uups';
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
export function buildStablecoin(opts: StablecoinOptions): Contract {
|
|
@@ -50,96 +50,70 @@ export function buildStablecoin(opts: StablecoinOptions): Contract {
|
|
|
50
50
|
|
|
51
51
|
const c = buildERC20(allOpts);
|
|
52
52
|
|
|
53
|
-
if (allOpts.
|
|
54
|
-
|
|
53
|
+
if (allOpts.freezable) {
|
|
54
|
+
addFreezable(c, allOpts.access);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
if (allOpts.
|
|
58
|
-
|
|
57
|
+
if (allOpts.restrictions) {
|
|
58
|
+
addRestrictions(c, allOpts.access, allOpts.restrictions);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
return c;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
function
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
name:
|
|
68
|
-
path: `@openzeppelin/community-contracts/token/ERC20/extensions
|
|
64
|
+
function addRestrictions(c: ContractBuilder, access: Access, mode: 'allowlist' | 'blocklist') {
|
|
65
|
+
const isAllowlist = mode === 'allowlist';
|
|
66
|
+
const ERC20Restricted = {
|
|
67
|
+
name: 'ERC20Restricted',
|
|
68
|
+
path: `@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Restricted.sol`,
|
|
69
69
|
};
|
|
70
70
|
|
|
71
|
-
c.addParent(
|
|
72
|
-
c.addOverride(
|
|
73
|
-
c.addOverride(ERC20Limitation, functions._approve);
|
|
71
|
+
c.addParent(ERC20Restricted);
|
|
72
|
+
c.addOverride(ERC20Restricted, functions._update);
|
|
74
73
|
|
|
75
|
-
|
|
74
|
+
if (isAllowlist) {
|
|
75
|
+
c.addOverride(ERC20Restricted, functions.isUserAllowed);
|
|
76
|
+
c.setFunctionBody([`return getRestriction(user) == Restriction.ALLOWED;`], functions.isUserAllowed);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const [addFn, removeFn] = isAllowlist
|
|
76
80
|
? [functions.allowUser, functions.disallowUser]
|
|
77
81
|
: [functions.blockUser, functions.unblockUser];
|
|
78
82
|
|
|
79
83
|
requireAccessControl(c, addFn, access, 'LIMITER', 'limiter');
|
|
80
|
-
c.addFunctionCode(`_${
|
|
84
|
+
c.addFunctionCode(`_${isAllowlist ? 'allow' : 'block'}User(user);`, addFn);
|
|
81
85
|
|
|
82
86
|
requireAccessControl(c, removeFn, access, 'LIMITER', 'limiter');
|
|
83
|
-
c.addFunctionCode(`
|
|
87
|
+
c.addFunctionCode(`_resetUser(user);`, removeFn);
|
|
84
88
|
}
|
|
85
89
|
|
|
86
|
-
function
|
|
87
|
-
const
|
|
88
|
-
name: '
|
|
89
|
-
path: '@openzeppelin/community-contracts/token/ERC20/extensions/
|
|
90
|
+
function addFreezable(c: ContractBuilder, access: Access) {
|
|
91
|
+
const ERC20Freezable = {
|
|
92
|
+
name: 'ERC20Freezable',
|
|
93
|
+
path: '@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Freezable.sol',
|
|
90
94
|
};
|
|
91
95
|
|
|
92
|
-
c.addParent(
|
|
93
|
-
c.addOverride(
|
|
94
|
-
c.addOverride(ERC20Custodian, functions._isCustodian);
|
|
96
|
+
c.addParent(ERC20Freezable);
|
|
97
|
+
c.addOverride(ERC20Freezable, functions._update);
|
|
95
98
|
|
|
96
99
|
if (access === false) {
|
|
97
100
|
access = 'ownable';
|
|
98
101
|
}
|
|
99
102
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
case 'ownable': {
|
|
104
|
-
c.setFunctionBody([`return user == owner();`], functions._isCustodian);
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
case 'roles': {
|
|
108
|
-
const roleOwner = 'custodian';
|
|
109
|
-
const roleId = 'CUSTODIAN_ROLE';
|
|
110
|
-
const addedConstant = c.addConstantOrImmutableOrErrorDefinition(
|
|
111
|
-
`bytes32 public constant ${roleId} = keccak256("${roleId}");`,
|
|
112
|
-
);
|
|
113
|
-
if (roleOwner && addedConstant) {
|
|
114
|
-
c.addConstructorArgument({ type: 'address', name: roleOwner });
|
|
115
|
-
c.addConstructorCode(`_grantRole(${roleId}, ${roleOwner});`);
|
|
116
|
-
}
|
|
117
|
-
c.setFunctionBody([`return hasRole(CUSTODIAN_ROLE, user);`], functions._isCustodian);
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
case 'managed': {
|
|
121
|
-
c.addImportOnly({
|
|
122
|
-
name: 'AuthorityUtils',
|
|
123
|
-
path: `@openzeppelin/contracts/access/manager/AuthorityUtils.sol`,
|
|
124
|
-
});
|
|
125
|
-
const logic = [
|
|
126
|
-
`(bool immediate,) = AuthorityUtils.canCallWithDelay(authority(), user, address(this), bytes4(_msgData()[0:4]));`,
|
|
127
|
-
`return immediate;`,
|
|
128
|
-
];
|
|
129
|
-
c.setFunctionBody(logic, functions._isCustodian);
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
103
|
+
const freezeFn = functions.freeze;
|
|
104
|
+
requireAccessControl(c, freezeFn, access, 'FREEZER', 'freezer');
|
|
105
|
+
c.setFunctionBody([`_setFrozen(user, amount);`], freezeFn);
|
|
133
106
|
}
|
|
134
107
|
|
|
135
108
|
const functions = {
|
|
136
109
|
...erc20functions,
|
|
137
110
|
...defineFunctions({
|
|
138
|
-
|
|
139
|
-
kind: '
|
|
140
|
-
args: [
|
|
141
|
-
|
|
142
|
-
|
|
111
|
+
freeze: {
|
|
112
|
+
kind: 'public' as const,
|
|
113
|
+
args: [
|
|
114
|
+
{ name: 'user', type: 'address' },
|
|
115
|
+
{ name: 'amount', type: 'uint256' },
|
|
116
|
+
],
|
|
143
117
|
},
|
|
144
118
|
|
|
145
119
|
allowUser: {
|
|
@@ -161,5 +135,12 @@ const functions = {
|
|
|
161
135
|
kind: 'public' as const,
|
|
162
136
|
args: [{ name: 'user', type: 'address' }],
|
|
163
137
|
},
|
|
138
|
+
|
|
139
|
+
isUserAllowed: {
|
|
140
|
+
kind: 'public' as const,
|
|
141
|
+
args: [{ name: 'user', type: 'address' }],
|
|
142
|
+
returns: ['bool'],
|
|
143
|
+
mutability: 'view' as const,
|
|
144
|
+
},
|
|
164
145
|
}),
|
|
165
146
|
};
|