From 481c83daf26ed6b6caebeac2846ef8199a3e835d Mon Sep 17 00:00:00 2001 From: Eric Lau Date: Mon, 16 Oct 2023 17:16:44 -0400 Subject: [PATCH 1/4] Add AccessManaged --- packages/core/src/set-access-control.ts | 19 ++++++++++++++++++- packages/ui/src/AccessControlSection.svelte | 9 ++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/core/src/set-access-control.ts b/packages/core/src/set-access-control.ts index bd1772b4e..7394c31c1 100644 --- a/packages/core/src/set-access-control.ts +++ b/packages/core/src/set-access-control.ts @@ -1,7 +1,7 @@ import type { ContractBuilder, BaseFunction } from './contract'; import { supportsInterface } from './common-functions'; -export const accessOptions = [false, 'ownable', 'roles'] as const; +export const accessOptions = [false, 'ownable', 'roles', 'managed'] as const; export type Access = typeof accessOptions[number]; @@ -30,6 +30,15 @@ export function setAccessControl(c: ContractBuilder, access: Access) { c.addOverride(parents.AccessControl, supportsInterface); break; } + case 'managed': { + if (c.addParent(parents.AccessManaged, [ {lit: 'initialAuthority'} ])) { + c.addConstructorArgument({ + type: 'address', + name: 'initialAuthority' + }); + } + break; + } } } @@ -58,6 +67,10 @@ export function requireAccessControl(c: ContractBuilder, fn: BaseFunction, acces c.addModifier(`onlyRole(${roleId})`, fn); break; } + case 'managed': { + c.addModifier('restricted', fn); + break; + } } } @@ -70,4 +83,8 @@ const parents = { name: 'AccessControl', path: '@openzeppelin/contracts/access/AccessControl.sol', }, + AccessManaged: { + name: 'AccessManaged', + path: '@openzeppelin/contracts/access/manager/AccessManaged.sol', + }, }; diff --git a/packages/ui/src/AccessControlSection.svelte b/packages/ui/src/AccessControlSection.svelte index 92faa2e47..dac0f5b71 100644 --- a/packages/ui/src/AccessControlSection.svelte +++ b/packages/ui/src/AccessControlSection.svelte @@ -6,7 +6,7 @@ export let access: Access; export let required: boolean; - let defaultValueWhenEnabled: 'ownable' | 'roles' = 'ownable'; + let defaultValueWhenEnabled: 'ownable' | 'roles' | 'managed' = 'ownable'; let wasRequired = required; let wasAccess = access; @@ -57,6 +57,13 @@ Flexible mechanism with a separate role for each privileged action. A role can have many authorized accounts. + From 71f9aa9727d859afffc95952a304dfaa6eff6557 Mon Sep 17 00:00:00 2001 From: Eric Lau Date: Mon, 16 Oct 2023 17:40:29 -0400 Subject: [PATCH 2/4] Update tests, changelog --- packages/core/CHANGELOG.md | 4 + packages/core/src/custom.test.ts | 11 +++ packages/core/src/custom.test.ts.md | 14 +++ packages/core/src/custom.test.ts.snap | Bin 727 -> 772 bytes packages/core/src/erc1155.test.ts | 17 ++++ packages/core/src/erc1155.test.ts.md | 129 +++++++++++++++++++++++++ packages/core/src/erc1155.test.ts.snap | Bin 1489 -> 1688 bytes packages/core/src/erc20.test.ts | 17 ++++ packages/core/src/erc20.test.ts.md | 112 +++++++++++++++++++++ packages/core/src/erc20.test.ts.snap | Bin 1493 -> 1650 bytes packages/core/src/erc721.test.ts | 15 +++ packages/core/src/erc721.test.ts.md | 102 +++++++++++++++++++ packages/core/src/erc721.test.ts.snap | Bin 1707 -> 1858 bytes 13 files changed, 421 insertions(+) diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index a09050112..33eb301d8 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +- Add `managed` access control option for use with AccessManager. + ## 0.4.0 (2023-10-05) ### Breaking changes diff --git a/packages/core/src/custom.test.ts b/packages/core/src/custom.test.ts index 39d829ed0..2cfb60ce4 100644 --- a/packages/core/src/custom.test.ts +++ b/packages/core/src/custom.test.ts @@ -52,6 +52,10 @@ testCustom('access control roles', { access: 'roles', }); +testCustom('access control managed', { + access: 'managed', +}); + testCustom('upgradeable uups with access control disabled', { // API should override access to true since it is required for UUPS access: false, @@ -69,6 +73,13 @@ testAPIEquivalence('custom API full upgradeable', { upgradeable: 'uups', }); +testAPIEquivalence('custom API full upgradeable with managed', { + name: 'CustomContract', + access: 'managed', + pausable: true, + upgradeable: 'uups', +}); + test('custom API assert defaults', async t => { t.is(custom.print(custom.defaults), custom.print()); }); diff --git a/packages/core/src/custom.test.ts.md b/packages/core/src/custom.test.ts.md index f4fec0bf2..d616f680b 100644 --- a/packages/core/src/custom.test.ts.md +++ b/packages/core/src/custom.test.ts.md @@ -126,6 +126,20 @@ Generated by [AVA](https://avajs.dev). }␊ ` +## access control managed + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.20;␊ + ␊ + import "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ + ␊ + contract MyContract is AccessManaged {␊ + constructor(address initialAuthority) AccessManaged(initialAuthority) {}␊ + }␊ + ` + ## upgradeable uups with access control disabled > Snapshot 1 diff --git a/packages/core/src/custom.test.ts.snap b/packages/core/src/custom.test.ts.snap index 598964de469b2afa3427bafefaef22f05a2cae87..fa771bbde640cadea1415d6cefa1e60c0765bfd8 100644 GIT binary patch literal 772 zcmV+f1N;0zRzVXq(Z8lrgAB2I|-?@s4Y@^88e9i zYmRN%PAQ-scH9%}+#U8ndxKr}1lxTkaYCHXL94M%S|cGM=l6Zz&%f{AZNEpD`%ZrN zgcMc;_1!=!=3_}AmqVuH`&-Y03SPY3EIcjDp5l|jv*M}afV1|&MfC`~h)Ps#dWb6A z$4KmgR`a~X1swPgNJg-S)fl|lslBSb+^LsJE~837SAo`eKYpE-Zc2v0ki$U29zi(@ zm&MO%4jUhf4<~_r&V&M6dyFGGL7XFksS{I^PM|Q6PTNqaX%AcVrAE+ok(AEKh^CAd z-WN*{``!iyuSEd*(Qv6m;3_7{(DQ`$2r$J8L!yC5RAPMDKAql_Li>I|U442(>fuS&K|oh=k)UEHNhU`D9|-87@N)XzRB|Y03Cbt7W+nE; z`Vw1BadNm|*JG3FW+Wz_tdKejYqW4Q<-MqPcG)BjqvKHt`=|;DVWV_zbGfdhMfGr4 z8%ZD}vo{(RA0S(aQM2>IXdq)4qDCQ?&-Y+_W_OzW$<$s0gEF zDGQ9QR9kjSFTkszg)Zq2SY zSoPYL?F|8xLvMY9p3_4gsBh3q-=Oz;f7u_>kf^kk8cPUdzM1*v8_&#*Ga<}+FF$@p z3M+yf%ae+^SW?L4lqvb)#Bx4!h^gKDH2*sM)g-RoKBu z?1Mq?tjYzva3PS4U>mDBc)Qnn)q1(tu2wBZm4KE4gZW|nb6LHvMg*oDdJ;|uDo}V+ z{*vZU`BZ*53G8wv6xcmr9MJ{h91%>7n3^;^g^4tV5tWwqu-m@V2wE1B(m0vXl+oIJ zu>`U228i%l1fY+GOC>x@F;RoIEwo2~DOMN~4Md_I<7?U5<#jc%cRXq-%qZ}6M728L z-h^NaFiPeDG>YRNGs3iko4f;$ZsH8_M3tSGKFhtA8HgE6r;>9-bDxZB+B5XH)hKkaPIw zA4ax)ae}#Jj;sJ8?(kG3GfL6)VcA*JPN8y1hv-`vnb1>HCUn5aA|Xc6tmkrqT>TiK zkF6&mFjYuUNRo?W3axG~kr3EM!NoE?fx@=~f|@b{BK7RQx7{vtj94ggkf JW=Z=D001|@TS5Q; diff --git a/packages/core/src/erc1155.test.ts b/packages/core/src/erc1155.test.ts index 130d80653..d34232159 100644 --- a/packages/core/src/erc1155.test.ts +++ b/packages/core/src/erc1155.test.ts @@ -34,6 +34,10 @@ testERC1155('basic + roles', { access: 'roles', }); +testERC1155('basic + managed', { + access: 'managed', +}); + testERC1155('no updatable uri', { updatableUri: false, }); @@ -55,6 +59,11 @@ testERC1155('mintable + roles', { access: 'roles', }); +testERC1155('mintable + managed', { + mintable: true, + access: 'managed', +}); + testERC1155('supply tracking', { supply: true, }); @@ -75,6 +84,14 @@ testERC1155('full upgradeable uups', { upgradeable: 'uups', }); +testERC1155('full upgradeable transparent with managed', { + mintable: true, + access: 'managed', + burnable: true, + pausable: true, + upgradeable: 'uups', +}); + testAPIEquivalence('API default'); testAPIEquivalence('API basic', { name: 'CustomToken', uri: 'https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/' }); diff --git a/packages/core/src/erc1155.test.ts.md b/packages/core/src/erc1155.test.ts.md index 0dec66fc0..a86488b8b 100644 --- a/packages/core/src/erc1155.test.ts.md +++ b/packages/core/src/erc1155.test.ts.md @@ -62,6 +62,28 @@ Generated by [AVA](https://avajs.dev). }␊ ` +## basic + managed + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.20;␊ + ␊ + import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ + import "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ + ␊ + contract MyToken is ERC1155, AccessManaged {␊ + constructor(address initialAuthority)␊ + ERC1155("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/")␊ + AccessManaged(initialAuthority)␊ + {}␊ + ␊ + function setURI(string memory newuri) public restricted {␊ + _setURI(newuri);␊ + }␊ + }␊ + ` + ## no updatable uri > Snapshot 1 @@ -229,6 +251,42 @@ Generated by [AVA](https://avajs.dev). }␊ ` +## mintable + managed + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.20;␊ + ␊ + import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ + import "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ + ␊ + contract MyToken is ERC1155, AccessManaged {␊ + constructor(address initialAuthority)␊ + ERC1155("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/")␊ + AccessManaged(initialAuthority)␊ + {}␊ + ␊ + function setURI(string memory newuri) public restricted {␊ + _setURI(newuri);␊ + }␊ + ␊ + function mint(address account, uint256 id, uint256 amount, bytes memory data)␊ + public␊ + restricted␊ + {␊ + _mint(account, id, amount, data);␊ + }␊ + ␊ + function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)␊ + public␊ + restricted␊ + {␊ + _mintBatch(to, ids, amounts, data);␊ + }␊ + }␊ + ` + ## supply tracking > Snapshot 1 @@ -434,3 +492,74 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ` + +## full upgradeable transparent with managed + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.20;␊ + ␊ + import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155PausableUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ + import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊ + ␊ + contract MyToken is Initializable, ERC1155Upgradeable, AccessManagedUpgradeable, ERC1155PausableUpgradeable, ERC1155BurnableUpgradeable, UUPSUpgradeable {␊ + /// @custom:oz-upgrades-unsafe-allow constructor␊ + constructor() {␊ + _disableInitializers();␊ + }␊ + ␊ + function initialize(address initialAuthority) initializer public {␊ + __ERC1155_init("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + __AccessManaged_init(initialAuthority);␊ + __ERC1155Pausable_init();␊ + __ERC1155Burnable_init();␊ + __UUPSUpgradeable_init();␊ + }␊ + ␊ + function setURI(string memory newuri) public restricted {␊ + _setURI(newuri);␊ + }␊ + ␊ + function pause() public restricted {␊ + _pause();␊ + }␊ + ␊ + function unpause() public restricted {␊ + _unpause();␊ + }␊ + ␊ + function mint(address account, uint256 id, uint256 amount, bytes memory data)␊ + public␊ + restricted␊ + {␊ + _mint(account, id, amount, data);␊ + }␊ + ␊ + function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)␊ + public␊ + restricted␊ + {␊ + _mintBatch(to, ids, amounts, data);␊ + }␊ + ␊ + function _authorizeUpgrade(address newImplementation)␊ + internal␊ + restricted␊ + override␊ + {}␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function _update(address from, address to, uint256[] memory ids, uint256[] memory values)␊ + internal␊ + override(ERC1155Upgradeable, ERC1155PausableUpgradeable)␊ + {␊ + super._update(from, to, ids, values);␊ + }␊ + }␊ + ` diff --git a/packages/core/src/erc1155.test.ts.snap b/packages/core/src/erc1155.test.ts.snap index c836f1313db8cad2b6038e0128b1b86504219c38..7d7cee90e4314fc3871063d5b1126becd230fb6b 100644 GIT binary patch literal 1688 zcmV;J250#}RzV;Jb&_FRE(~H%ldKn3M^y^q886 zoFUUhIwp!riC|C_ToLpH5oPyqdv$ev-M?3*pry@A$3j&_oGZ`z1a@@f4J!HV;9$_S zg#*liC$|E;zTmtBqeq6$n2;7GI%>t(4uCda@)24w?4P~T#B8JJc_$10#i zA2>3+)!J9v8|Zc2bQ&&77bOo7hJy(331C!5JdKQnUt-9(SjaUpYR+xjeoghU@DUr~ z*{w4Wh=01~o7DjgBmzh~wvTq3&E3QH;j{f+@Fh4wstQlm);}*VB^sBcsfR*NLtSX; zqNW*`%n))BR2(z8phLOk<(=KVT5G@AuI(JupE{~n;`;fJxgH*!ITE&6z8s&Vsa4*~y1dp#V>IV=0yya{Vg+dq-7L&@BJJf%Do@lhyLadrrE~-_^X{qnD1|;wp zX=%5;_d(2U7w_fTZQW%s&wUTvMP0#ty%CoO`I;qql*#qYIMBz`EN3fot&lGlC!19f zEPkArZxRYD)5eMYWt3eq2*JlO{Cs#zgkaR>XYBSYV`;>my^i!`+m;!A_&jFEt$h1o zoLF6LLUbzRg6!bzzuNMwauuFd0g1r{aU0^qJri0y8*~f*#z6OXzB$`uLD%rCaxKvL zgA34Qu(3e64LnpHEywGVEx;nP^-C&W~0@=8p)!zck2USL-<7QV}`40F;{Kn+f^r9{y1`sbFJcs zJG4lnrhO2VgQA1G)e|W>oPN}`bRAfxB%T^_zM>LxgqzYZ(#cZJS$Yz4&dt))oO30j zQ?{eF!VcrPUrc0Hj&w7Lh@Sb|Bln4L*hMSQj%LwFpFU5E z#z#qtZG#1Sgcu)I;Kf0oOY&={!pnx|+o2#9UmvRtybeGtyx}(Yy~9rdrO(^$Tc;- zI;`zvuPE9y_Y66F_Edf+Idj+}0sVZk>O{vFA}irW78Jao;Q6HBA$^AKNz0l40SeY6 zVO2Lw9T}2ILA&oLY8=2d>IvZhpKr$MyhR#NqygD!!0Ga+N;K$W(Hnled;gDEZt(m4 zdCv_pPk@UYVIFgY^yW=EN5~TmPMzgv5Zc=&v)+!lQ>GN26}im}^HcqcLxRX<3%VK^ i%$9MB46yjC#Wc8HLM{6$=-mzf^#4DuShC68KL7yEusYQM literal 1489 zcmV;?1uptQRzV2sPRM~P@F$i(!$05-zX1LLJ>z-L*l}Kty=z~_GhJO>UHw(nSN*Qj zHmQEffBgdqEKG#jkYgQl0&U)yw>9kq3eiTf3ypdwa&WyIU{zemW{^ z`EU`>xI)^5%d4FG>`0;uObOsfG;5WDvL2HYU?GdLJ|L(k8D0gpY@1jIl$d>2hqqhj z*YYNMqC4)uRqiV1A;NMI0X_$enuw>7vHW`s8CT0wjf}GU*mFKpb1ZzsW_W&U_XXl# zZ1`?#J9e`)x6zMuV-Pru9kWUQem8*wB&OjX~O;I*1OeP4q z2r5pP+E7g$d13$Hu-rUqw95O(mG4~Bi*fsW$lMN(?ivZ-tX_{#_o1NH=pxXerb&Cw zGXCluK!yN4LyTbqalp`9i5W7~$$`2Dyi(F&X*&?&6(SJpKphp_WByXbzxSbHgl93> zLGXHpQ7?G$*DYj&C{)6bkW3j{XjA|5Wn$1V3$aq#xTsaBptT7F(stt0No~q+85#Yv zSloW{NEv-p@MYxWNd`m2pWU`P3dfgeKQ6tB`Ehq?s`FpGGTv-KbS~6}oapjD?Rs9h zNue!*#N>J99a4F_Hk3RYbj$z7K==1_7v1{>UDfl-tw85bo`Wue)i@E--+1Z8DGz!DG?8k$}PVHnj?yS z0&>avJ}B(Ifdj)FgWUDK<M!Oj;wyLc4Yza`3cXvnMH~+F^Lw*?U`P;mf%=&J zA+PqsZ+Jhv@>?tne_omDFr2P_c$6;Hd}iy342<1Vhb6#r6Zwqv*oj$@ofrL$JYF+C zu}qZQd&;jflaYSK8^xfnXv@wIDzLzHE{L_v!O(1Pm$_(VvDFr#gZRHphWU1iHy@&?Prf?C`3!ap8$PK3h_T7ynDi)Q-t4Sh5} z8rbz~a7KvnVOK^tkhzAjyLU!xID-!ru_!HxSk>~5w&jREND+$A^;QghgC%3*2@DRG z@R1lu++QaVK~vFl@JzKF8MlqeeZ_R%{PJ?7y6lV0c|-JGHAIic!Nx3Ecj0D}>ix#5 z%M<7bWr~4HX=mK#J^3p}J^y?%r=A}q^}MaFX0uvPTQ)63wg?jTy{F7}TBGV;w_%HwftJ&JA diff --git a/packages/core/src/erc20.test.ts b/packages/core/src/erc20.test.ts index 168cec0eb..41eccb535 100644 --- a/packages/core/src/erc20.test.ts +++ b/packages/core/src/erc20.test.ts @@ -44,6 +44,11 @@ testERC20('erc20 pausable with roles', { access: 'roles', }); +testERC20('erc20 pausable with managed', { + pausable: true, + access: 'managed', +}); + testERC20('erc20 burnable pausable', { burnable: true, pausable: true, @@ -103,6 +108,18 @@ testERC20('erc20 full upgradeable uups', { upgradeable: 'uups', }); +testERC20('erc20 full upgradeable uups managed', { + premint: '2000', + access: 'managed', + burnable: true, + mintable: true, + pausable: true, + permit: true, + votes: true, + flashmint: true, + upgradeable: 'uups', +}); + testAPIEquivalence('erc20 API default'); testAPIEquivalence('erc20 API basic', { name: 'CustomToken', symbol: 'CTK' }); diff --git a/packages/core/src/erc20.test.ts.md b/packages/core/src/erc20.test.ts.md index c3c3200b7..ad8a6b980 100644 --- a/packages/core/src/erc20.test.ts.md +++ b/packages/core/src/erc20.test.ts.md @@ -115,6 +115,44 @@ Generated by [AVA](https://avajs.dev). }␊ ` +## erc20 pausable with managed + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.20;␊ + ␊ + import "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ + import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";␊ + import "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ + import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ + ␊ + contract MyToken is ERC20, ERC20Pausable, AccessManaged, ERC20Permit {␊ + constructor(address initialAuthority)␊ + ERC20("MyToken", "MTK")␊ + AccessManaged(initialAuthority)␊ + ERC20Permit("MyToken")␊ + {}␊ + ␊ + function pause() public restricted {␊ + _pause();␊ + }␊ + ␊ + function unpause() public restricted {␊ + _unpause();␊ + }␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function _update(address from, address to, uint256 value)␊ + internal␊ + override(ERC20, ERC20Pausable)␊ + {␊ + super._update(from, to, value);␊ + }␊ + }␊ + ` + ## erc20 burnable pausable > Snapshot 1 @@ -460,3 +498,77 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ` + +## erc20 full upgradeable uups managed + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.20;␊ + ␊ + import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ + import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊ + ␊ + contract MyToken is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable, AccessManagedUpgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable, ERC20FlashMintUpgradeable, UUPSUpgradeable {␊ + /// @custom:oz-upgrades-unsafe-allow constructor␊ + constructor() {␊ + _disableInitializers();␊ + }␊ + ␊ + function initialize(address initialAuthority) initializer public {␊ + __ERC20_init("MyToken", "MTK");␊ + __ERC20Burnable_init();␊ + __ERC20Pausable_init();␊ + __AccessManaged_init(initialAuthority);␊ + __ERC20Permit_init("MyToken");␊ + __ERC20Votes_init();␊ + __ERC20FlashMint_init();␊ + __UUPSUpgradeable_init();␊ + ␊ + _mint(msg.sender, 2000 * 10 ** decimals());␊ + }␊ + ␊ + function pause() public restricted {␊ + _pause();␊ + }␊ + ␊ + function unpause() public restricted {␊ + _unpause();␊ + }␊ + ␊ + function mint(address to, uint256 amount) public restricted {␊ + _mint(to, amount);␊ + }␊ + ␊ + function _authorizeUpgrade(address newImplementation)␊ + internal␊ + restricted␊ + override␊ + {}␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function _update(address from, address to, uint256 value)␊ + internal␊ + override(ERC20Upgradeable, ERC20PausableUpgradeable, ERC20VotesUpgradeable)␊ + {␊ + super._update(from, to, value);␊ + }␊ + ␊ + function nonces(address owner)␊ + public␊ + view␊ + override(ERC20PermitUpgradeable, NoncesUpgradeable)␊ + returns (uint256)␊ + {␊ + return super.nonces(owner);␊ + }␊ + }␊ + ` diff --git a/packages/core/src/erc20.test.ts.snap b/packages/core/src/erc20.test.ts.snap index e9825af226eb36f83245dbab5dc72606af3cfa29..0614e1f380ac099e2dffdadc85e3a13e66a1c04c 100644 GIT binary patch literal 1650 zcmV-&295baRzVHj_uNcofS^i4 zZ0PoVJ|Bw+00000000B+TTgErMHFw6B2@PTH`L2uE>3V_69htyD%CV8iiq1Ne-K=V z#=GNWl--%_%xwNuMQ}izkT@VNoZ2HdJ_O%@1785~1^58W&iaWU`S<4<4Y0et{^jx(wh-ZHdDBKj;4Vh&K4@?5RXhd{T?jaJu#Lqz_`13B$;xVT zty00RN0|WChtxyl0(l;CFlktn2nH>|8-gAq(%9H}wAu{+u1F@;wV~#rGa;qIl<@Gu zHexOo5u-{x2ei-kf=K{#pvdYVLk*r+fV?Cz7tFT=Wwpg{yjG1SR_mbJ-ut||n4Oo7 zE`sMTDlaOLf{9Ws==hAlj)M$3{#n!U_cNyBPos@pySd_pufuvC^tsu33qNYs`(|Ob zthXI)Y(Q4fvJmHur>B!Kc`R)mL=ya;?V)WmDKNkU3k)4O3$aB-6-=SdZOod9GPt?an2RDNaWx;h-lW-lRN{T48kIz(wIn(+&e;` zOC5)vVse;p5k1*cdX z0Y)9fiy?e_OAFx#w{JoSx75$0;4yV37|5C&rf}|@3&cNMjs0FlHzWdVxAu28b`Ex) zZf$@E;22pJJeF=(t7ZnO(ldJI1RHgs?}(P|Vv>5W3ZNl!M87PM2Ie7?BJW7|tF3Q5 zZtZXF9kkZln@^OGbxo4Umvgf+d#cAGniGW~P2@Q&UM}nOWmjgPI0M}?Wgr(4c!+ER zjQCy4L9cEEj0m;CqFmGtbu;l?6v;6pv}pO_h%#x3!BdB}TTH2#Yc4-r;fUCX)xihNW)m#QAF#9}fwhHQ=584L^D1b#{2WEi>F$@NN}RVOYOZp zw#IO59fuk|p~9407M3&x-gPE+t@7=00_XE;MeH)`e;8ExhY47K^usta9CLWxY_ ziI`MBxx;jm+@4@`+C#3`G*1-2lmkOT7QYHznW41 zzB4wXE@xya8hAe)9Lz*L+4bs+jc7I-@I{7~F|;+pD5^7JWZaU(3_QE)&uh$79DajBD=GbG~w-oHRu;|xVcF0KY9HMst7^=00hw_kN^Mx literal 1493 zcmV;`1uFVMRzVX+?RLZ4LI-uh!@}i=xO)-^!yknjuSh04z^~xy1KgR ztLm?2-t>DmF$e7D-ylcahJ&8LkO?3)8+F96;j&Z0+4pZO%izY>Yug+5-oEEwYj53q zXZ?eKqkZtZtYtTbJRzWZiB=9cEP2_iDLjpY-Axm0^iiDpH>_7ok9UQ zE}=tqLW@olDJw=UiBY2xj94El3^2 zm7+p02ON&t{v?1HkYW`OlLoH}KwLtYaq5|z&{BCkUMi}I#R@1Mw!bKrKWx;>N-mokx3? z3AHj{PzcBwq!d|@0SaGwh(ZhWM&MZCvzjoZ>$w8=F!XGn5~l)!J5DOVLzp){{sf#E zwg)43iKkE`tQ|fG)-7d4Sotv&W}XXaHCTMSsK3~Fkzl)F+Md6s=Pei_ehMhDAxo$5 z{R1t9AK(8!q;OOIJ@p?G`xX;fvm+~=dm|3nM~wjYGP@1TL95w0-aG0Zy*StdkHG+% zrZEt(D-~k{MS+amnqa}c;n}=tIS5AxmI-u;8ZoH~M2UGqg~>+(ex=>LXU)z*yW8A7 z+%q|oeWg@AeJX_V7sBTq(R0SI9v~LoF_**MKe=Zq=xK94J zRAeN{KUdsj#Z9KE3`9{A3LSr4E2AT1T1BvytRuX&t~&yo@7a>WPO1!I3(^YsuwJi& zP4NddH^q5tBFC^sT(=-nu4};4TjwO)w&DaPE4>U;h~vCKe@-{CcHgEaF}CP5Sr&wU!;LTE}CBk zN@}}Fo5$nIbY;xgh`es7ZyW5?uWuPu>sKwQeq83NHH)HWzKafpi>{Pd;q2?Ki04HW zLC>~<=ZXW;f|7*^+c0xQl4S+;!9QA1|9UXDpl-!%N(ZJnr^4qw5Q%i~3GdE`ZEfK0O`)Cu3ZLPwspP zqJ%YRF^Q=>9U-zpft&caCIwUP5*riWB_@hLDc9)oE1tj*kKvZ;+ zj!x_Iqvmd=7Hw$hDQ$GGOkR=P1j&sA5>UQ7G&musA-oa+W5t>CICI2z4UeA^DpE!P vC0rZB;lAVA&=EYz@MR})-M| Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.20;␊ + ␊ + import "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ + ␊ + contract MyToken is ERC721, AccessManaged {␊ + constructor(address initialAuthority)␊ + ERC721("MyToken", "MTK")␊ + AccessManaged(initialAuthority)␊ + {}␊ + ␊ + function safeMint(address to, uint256 tokenId) public restricted {␊ + _safeMint(to, tokenId);␊ + }␊ + }␊ + ` + ## mintable + incremental > Snapshot 1 @@ -560,3 +582,83 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ` + +## full upgradeable uups + managed + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.20;␊ + ␊ + import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol";␊ + import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ + import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊ + ␊ + contract MyToken is Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, AccessManagedUpgradeable, ERC721BurnableUpgradeable, EIP712Upgradeable, ERC721VotesUpgradeable, UUPSUpgradeable {␊ + /// @custom:oz-upgrades-unsafe-allow constructor␊ + constructor() {␊ + _disableInitializers();␊ + }␊ + ␊ + function initialize(address initialAuthority) initializer public {␊ + __ERC721_init("MyToken", "MTK");␊ + __ERC721Enumerable_init();␊ + __ERC721Pausable_init();␊ + __AccessManaged_init(initialAuthority);␊ + __ERC721Burnable_init();␊ + __EIP712_init("MyToken", "1");␊ + __ERC721Votes_init();␊ + __UUPSUpgradeable_init();␊ + }␊ + ␊ + function pause() public restricted {␊ + _pause();␊ + }␊ + ␊ + function unpause() public restricted {␊ + _unpause();␊ + }␊ + ␊ + function safeMint(address to, uint256 tokenId) public restricted {␊ + _safeMint(to, tokenId);␊ + }␊ + ␊ + function _authorizeUpgrade(address newImplementation)␊ + internal␊ + restricted␊ + override␊ + {}␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function _update(address to, uint256 tokenId, address auth)␊ + internal␊ + override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, ERC721VotesUpgradeable)␊ + returns (address)␊ + {␊ + return super._update(to, tokenId, auth);␊ + }␊ + ␊ + function _increaseBalance(address account, uint128 value)␊ + internal␊ + override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721VotesUpgradeable)␊ + {␊ + super._increaseBalance(account, value);␊ + }␊ + ␊ + function supportsInterface(bytes4 interfaceId)␊ + public␊ + view␊ + override(ERC721Upgradeable, ERC721EnumerableUpgradeable)␊ + returns (bool)␊ + {␊ + return super.supportsInterface(interfaceId);␊ + }␊ + }␊ + ` diff --git a/packages/core/src/erc721.test.ts.snap b/packages/core/src/erc721.test.ts.snap index 6d5411a5f6a5537326aee6e7a123744c35ada944..6f3dca51c0b45e37b09f5dd385631599c6321789 100644 GIT binary patch literal 1858 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 BJ&ynY From ee6adb7de3a1c7d22e616a14030fc70a61783eff Mon Sep 17 00:00:00 2001 From: Eric Lau Date: Mon, 16 Oct 2023 17:44:59 -0400 Subject: [PATCH 3/4] Update help wording --- packages/ui/src/AccessControlSection.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/AccessControlSection.svelte b/packages/ui/src/AccessControlSection.svelte index dac0f5b71..401ed2e12 100644 --- a/packages/ui/src/AccessControlSection.svelte +++ b/packages/ui/src/AccessControlSection.svelte @@ -61,7 +61,7 @@ Managed - Enables a central contract to implement a policy that allows certain callers to access certain functions. + Enables a central contract to define a policy that allows certain callers to access certain functions. From 06be368ea69a06c3526e8dd270fe859f45ccd95d Mon Sep 17 00:00:00 2001 From: Eric Lau Date: Mon, 16 Oct 2023 17:46:56 -0400 Subject: [PATCH 4/4] Update changelog --- packages/core/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 33eb301d8..93c68d7ab 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -2,7 +2,7 @@ ## Unreleased -- Add `managed` access control option for use with AccessManager. +- Add `managed` access control option for use with AccessManager. ([#298](https://github.com/OpenZeppelin/contracts-wizard/pull/298)) ## 0.4.0 (2023-10-05)