From cde35ff966ba00abf4ebdac172c6ee971abfdeca Mon Sep 17 00:00:00 2001 From: GianfrancoBazzani Date: Thu, 20 Feb 2025 17:24:26 +0100 Subject: [PATCH 1/9] :nail_care: style: change modifiers order in initialize function --- packages/core/solidity/src/print.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/solidity/src/print.ts b/packages/core/solidity/src/print.ts index 65156a973..19851488c 100644 --- a/packages/core/solidity/src/print.ts +++ b/packages/core/solidity/src/print.ts @@ -61,7 +61,7 @@ function printConstructor(contract: Contract, helpers: Helpers): Lines[] { if (hasParentParams || hasConstructorCode || (helpers.upgradeable && parentsWithInitializers.length > 0)) { const parents = parentsWithInitializers .flatMap(p => printParentConstructor(p, helpers)); - const modifiers = helpers.upgradeable ? ['initializer public'] : parents; + const modifiers = helpers.upgradeable ? ['public initializer'] : parents; const args = contract.constructorArgs.map(a => printArgument(a, helpers)); const body = helpers.upgradeable ? spaceBetween( From d751ae37f30d4890fa2443baacfb9ce052849c0e Mon Sep 17 00:00:00 2001 From: GianfrancoBazzani Date: Thu, 20 Feb 2025 17:28:36 +0100 Subject: [PATCH 2/9] :nail_care: style: change modifiers order to follow solidity style guides --- packages/core/solidity/src/print.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/core/solidity/src/print.ts b/packages/core/solidity/src/print.ts index 19851488c..0cdc4d111 100644 --- a/packages/core/solidity/src/print.ts +++ b/packages/core/solidity/src/print.ts @@ -166,19 +166,20 @@ function printFunction(fn: ContractFunction, helpers: Helpers): Lines[] { if (fn.override.size <= 1 && fn.modifiers.length === 0 && fn.code.length === 0 && !fn.final) { return [] } - - const modifiers: string[] = [fn.kind, ...fn.modifiers]; + const modifiers: string[] = [fn.kind] if (fn.mutability !== 'nonpayable') { - modifiers.splice(1, 0, fn.mutability); + modifiers.push(fn.mutability); } - + if (fn.override.size === 1) { modifiers.push(`override`); } else if (fn.override.size > 1) { modifiers.push(`override(${[...fn.override].map(transformName).join(', ')})`); } + modifiers.push(...fn.modifiers); + if (fn.returns?.length) { modifiers.push(`returns (${fn.returns.join(', ')})`); } From b8141b09a7fd243fbe9ca1ad702feb1796dc6397 Mon Sep 17 00:00:00 2001 From: GianfrancoBazzani Date: Thu, 20 Feb 2025 18:24:21 +0100 Subject: [PATCH 3/9] :tea: test: fix tests --- .../core/solidity/src/contract.test.ts.md | 2 +- packages/core/solidity/src/custom.test.ts.md | 8 +- packages/core/solidity/src/erc1155.test.ts.md | 10 +- packages/core/solidity/src/erc20.test.ts.md | 10 +- packages/core/solidity/src/erc721.test.ts.md | 10 +- .../core/solidity/src/governor.test.ts.md | 4 +- .../core/solidity/src/zip-foundry.test.ts.md | 1211 ----------------- .../core/solidity/src/zip-hardhat.test.ts.md | 4 +- 8 files changed, 24 insertions(+), 1235 deletions(-) delete mode 100644 packages/core/solidity/src/zip-foundry.test.ts.md diff --git a/packages/core/solidity/src/contract.test.ts.md b/packages/core/solidity/src/contract.test.ts.md index 40be15d71..6a6339fc1 100644 --- a/packages/core/solidity/src/contract.test.ts.md +++ b/packages/core/solidity/src/contract.test.ts.md @@ -154,7 +154,7 @@ Generated by [AVA](https://avajs.dev). pragma solidity ^0.8.22;␊ ␊ contract Foo {␊ - function _otherFunction() internal whenNotPaused override(ERC20, OtherParent) {␊ + function _otherFunction() internal override(ERC20, OtherParent) whenNotPaused {␊ super._otherFunction();␊ }␊ }␊ diff --git a/packages/core/solidity/src/custom.test.ts.md b/packages/core/solidity/src/custom.test.ts.md index 24d1c542f..48150846a 100644 --- a/packages/core/solidity/src/custom.test.ts.md +++ b/packages/core/solidity/src/custom.test.ts.md @@ -76,15 +76,15 @@ Generated by [AVA](https://avajs.dev). _disableInitializers();␊ }␊ ␊ - function initialize(address initialOwner) initializer public {␊ + function initialize(address initialOwner) public initializer {␊ __Ownable_init(initialOwner);␊ __UUPSUpgradeable_init();␊ }␊ ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ - onlyOwner␊ override␊ + onlyOwner␊ {}␊ }␊ ` @@ -166,15 +166,15 @@ Generated by [AVA](https://avajs.dev). _disableInitializers();␊ }␊ ␊ - function initialize(address initialOwner) initializer public {␊ + function initialize(address initialOwner) public initializer {␊ __Ownable_init(initialOwner);␊ __UUPSUpgradeable_init();␊ }␊ ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ - onlyOwner␊ override␊ + onlyOwner␊ {}␊ }␊ ` diff --git a/packages/core/solidity/src/erc1155.test.ts.md b/packages/core/solidity/src/erc1155.test.ts.md index 1e1a7a793..bcb1b8c24 100644 --- a/packages/core/solidity/src/erc1155.test.ts.md +++ b/packages/core/solidity/src/erc1155.test.ts.md @@ -354,7 +354,7 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ function initialize(address defaultAdmin, address pauser, address minter)␊ - initializer public␊ + public initializer␊ {␊ __ERC1155_init("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ __AccessControl_init();␊ @@ -439,7 +439,7 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ function initialize(address defaultAdmin, address pauser, address minter, address upgrader)␊ - initializer public␊ + public initializer␊ {␊ __ERC1155_init("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ __AccessControl_init();␊ @@ -481,8 +481,8 @@ Generated by [AVA](https://avajs.dev). ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ - onlyRole(UPGRADER_ROLE)␊ override␊ + onlyRole(UPGRADER_ROLE)␊ {}␊ ␊ // The following functions are overrides required by Solidity.␊ @@ -526,7 +526,7 @@ Generated by [AVA](https://avajs.dev). _disableInitializers();␊ }␊ ␊ - function initialize(address initialAuthority) initializer public {␊ + function initialize(address initialAuthority) public initializer {␊ __ERC1155_init("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ __AccessManaged_init(initialAuthority);␊ __ERC1155Pausable_init();␊ @@ -562,8 +562,8 @@ Generated by [AVA](https://avajs.dev). ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ - restricted␊ override␊ + restricted␊ {}␊ ␊ // The following functions are overrides required by Solidity.␊ diff --git a/packages/core/solidity/src/erc20.test.ts.md b/packages/core/solidity/src/erc20.test.ts.md index 91dfa01d1..4adca6d9e 100644 --- a/packages/core/solidity/src/erc20.test.ts.md +++ b/packages/core/solidity/src/erc20.test.ts.md @@ -467,7 +467,7 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ function initialize(address defaultAdmin, address pauser, address recipient, address minter)␊ - initializer public␊ + public initializer␊ {␊ __ERC20_init("MyToken", "MTK");␊ __ERC20Burnable_init();␊ @@ -545,7 +545,7 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ function initialize(address defaultAdmin, address pauser, address recipient, address minter, address upgrader)␊ - initializer public␊ + public initializer␊ {␊ __ERC20_init("MyToken", "MTK");␊ __ERC20Burnable_init();␊ @@ -577,8 +577,8 @@ Generated by [AVA](https://avajs.dev). ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ - onlyRole(UPGRADER_ROLE)␊ override␊ + onlyRole(UPGRADER_ROLE)␊ {}␊ ␊ // The following functions are overrides required by Solidity.␊ @@ -627,7 +627,7 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ function initialize(address initialAuthority, address recipient)␊ - initializer public␊ + public initializer␊ {␊ __ERC20_init("MyToken", "MTK");␊ __ERC20Burnable_init();␊ @@ -655,8 +655,8 @@ Generated by [AVA](https://avajs.dev). ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ - restricted␊ override␊ + restricted␊ {}␊ ␊ // The following functions are overrides required by Solidity.␊ diff --git a/packages/core/solidity/src/erc721.test.ts.md b/packages/core/solidity/src/erc721.test.ts.md index 0e4a6e4af..18c397139 100644 --- a/packages/core/solidity/src/erc721.test.ts.md +++ b/packages/core/solidity/src/erc721.test.ts.md @@ -545,7 +545,7 @@ Generated by [AVA](https://avajs.dev). _disableInitializers();␊ }␊ ␊ - function initialize(address initialOwner) initializer public {␊ + function initialize(address initialOwner) public initializer {␊ __ERC721_init("MyToken", "MTK");␊ __ERC721Enumerable_init();␊ __ERC721Pausable_init();␊ @@ -619,7 +619,7 @@ Generated by [AVA](https://avajs.dev). _disableInitializers();␊ }␊ ␊ - function initialize(address initialOwner) initializer public {␊ + function initialize(address initialOwner) public initializer {␊ __ERC721_init("MyToken", "MTK");␊ __ERC721Enumerable_init();␊ __ERC721Pausable_init();␊ @@ -644,8 +644,8 @@ Generated by [AVA](https://avajs.dev). ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ - onlyOwner␊ override␊ + onlyOwner␊ {}␊ ␊ // The following functions are overrides required by Solidity.␊ @@ -700,7 +700,7 @@ Generated by [AVA](https://avajs.dev). _disableInitializers();␊ }␊ ␊ - function initialize(address initialAuthority) initializer public {␊ + function initialize(address initialAuthority) public initializer {␊ __ERC721_init("MyToken", "MTK");␊ __ERC721Enumerable_init();␊ __ERC721Pausable_init();␊ @@ -725,8 +725,8 @@ Generated by [AVA](https://avajs.dev). ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ - restricted␊ override␊ + restricted␊ {}␊ ␊ // The following functions are overrides required by Solidity.␊ diff --git a/packages/core/solidity/src/governor.test.ts.md b/packages/core/solidity/src/governor.test.ts.md index be68eb773..b53ef7dec 100644 --- a/packages/core/solidity/src/governor.test.ts.md +++ b/packages/core/solidity/src/governor.test.ts.md @@ -1832,7 +1832,7 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ function initialize(IVotes _token, TimelockControllerUpgradeable _timelock, address initialOwner)␊ - initializer public␊ + public initializer␊ {␊ __Governor_init("MyGovernor");␊ __GovernorCountingSimple_init();␊ @@ -1853,8 +1853,8 @@ Generated by [AVA](https://avajs.dev). ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ - onlyOwner␊ override␊ + onlyOwner␊ {}␊ ␊ // The following functions are overrides required by Solidity.␊ diff --git a/packages/core/solidity/src/zip-foundry.test.ts.md b/packages/core/solidity/src/zip-foundry.test.ts.md deleted file mode 100644 index 7b1a07b88..000000000 --- a/packages/core/solidity/src/zip-foundry.test.ts.md +++ /dev/null @@ -1,1211 +0,0 @@ -# Snapshot report for `src/zip-foundry.test.ts` - -The actual snapshot is saved in `zip-foundry.test.ts.snap`. - -Generated by [AVA](https://avajs.dev). - -## erc20 full - -> Snapshot 1 - - [ - `#!/usr/bin/env bash␊ - ␊ - # Check if git is installed␊ - if ! which git &> /dev/null␊ - then␊ - echo "git command not found. Install git and try again."␊ - exit 1␊ - fi␊ - ␊ - # Check if Foundry is installed␊ - if ! which forge &> /dev/null␊ - then␊ - echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ - exit 1␊ - fi␊ - ␊ - # Setup Foundry project␊ - if ! [ -f "foundry.toml" ]␊ - then␊ - echo "Initializing Foundry project..."␊ - ␊ - # Backup Wizard template readme to avoid it being overwritten␊ - mv README.md README-oz.md␊ - ␊ - # Initialize sample Foundry project␊ - forge init --force --no-commit --quiet␊ - ␊ - # Install OpenZeppelin Contracts␊ - forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-commit --quiet␊ - ␊ - # Remove unneeded Foundry template files␊ - rm src/Counter.sol␊ - rm script/Counter.s.sol␊ - rm test/Counter.t.sol␊ - rm README.md␊ - ␊ - # Restore Wizard template readme␊ - mv README-oz.md README.md␊ - ␊ - # Add remappings␊ - if [ -f "remappings.txt" ]␊ - then␊ - echo "" >> remappings.txt␊ - fi␊ - echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ - ␊ - # Perform initial git commit␊ - git add .␊ - git commit -m "openzeppelin: add wizard output" --quiet␊ - ␊ - echo "Done."␊ - else␊ - echo "Foundry project already initialized."␊ - fi␊ - `, - `# Sample Foundry Project␊ - ␊ - This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ - ␊ - ## Installing Foundry␊ - ␊ - See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ - ␊ - ## Initializing the project␊ - ␊ - \`\`\`␊ - bash setup.sh␊ - \`\`\`␊ - ␊ - ## Testing the contract␊ - ␊ - \`\`\`␊ - forge test␊ - \`\`\`␊ - ␊ - ## Deploying the contract␊ - ␊ - You can simulate a deployment by running the script:␊ - ␊ - \`\`\`␊ - forge script script/MyToken.s.sol␊ - \`\`\`␊ - ␊ - See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Script} from "forge-std/Script.sol";␊ - import {console} from "forge-std/console.sol";␊ - import {MyToken} from "src/MyToken.sol";␊ - ␊ - contract MyTokenScript is Script {␊ - function setUp() public {}␊ - ␊ - function run() public {␊ - // TODO: Set addresses for the variables below, then uncomment the following section:␊ - /*␊ - vm.startBroadcast();␊ - address defaultAdmin = ;␊ - address pauser = ;␊ - address recipient = ;␊ - address minter = ;␊ - MyToken instance = new MyToken(defaultAdmin, pauser, recipient, minter);␊ - console.log("Contract deployed to %s", address(instance));␊ - vm.stopBroadcast();␊ - */␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.0.0␊ - pragma solidity ^0.8.22;␊ - ␊ - import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ - import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ - import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";␊ - import {ERC20FlashMint} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";␊ - import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";␊ - import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ - import {ERC20Votes} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";␊ - import {Nonces} from "@openzeppelin/contracts/utils/Nonces.sol";␊ - ␊ - contract MyToken is ERC20, ERC20Burnable, ERC20Pausable, AccessControl, ERC20Permit, ERC20Votes, ERC20FlashMint {␊ - bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");␊ - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");␊ - ␊ - constructor(address defaultAdmin, address pauser, address recipient, address minter)␊ - ERC20("My Token", "MTK")␊ - ERC20Permit("My Token")␊ - {␊ - _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ - _grantRole(PAUSER_ROLE, pauser);␊ - _mint(recipient, 2000 * 10 ** decimals());␊ - _grantRole(MINTER_ROLE, minter);␊ - }␊ - ␊ - function pause() public onlyRole(PAUSER_ROLE) {␊ - _pause();␊ - }␊ - ␊ - function unpause() public onlyRole(PAUSER_ROLE) {␊ - _unpause();␊ - }␊ - ␊ - function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {␊ - _mint(to, amount);␊ - }␊ - ␊ - // The following functions are overrides required by Solidity.␊ - ␊ - function _update(address from, address to, uint256 value)␊ - internal␊ - override(ERC20, ERC20Pausable, ERC20Votes)␊ - {␊ - super._update(from, to, value);␊ - }␊ - ␊ - function nonces(address owner)␊ - public␊ - view␊ - override(ERC20Permit, Nonces)␊ - returns (uint256)␊ - {␊ - return super.nonces(owner);␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Test} from "forge-std/Test.sol";␊ - import {MyToken} from "src/MyToken.sol";␊ - ␊ - contract MyTokenTest is Test {␊ - MyToken public instance;␊ - ␊ - function setUp() public {␊ - address defaultAdmin = vm.addr(1);␊ - address pauser = vm.addr(2);␊ - address recipient = vm.addr(3);␊ - address minter = vm.addr(4);␊ - instance = new MyToken(defaultAdmin, pauser, recipient, minter);␊ - }␊ - ␊ - function testName() public view {␊ - assertEq(instance.name(), "My Token");␊ - }␊ - }␊ - `, - ] - -## erc20 uups, roles - -> Snapshot 1 - - [ - `#!/usr/bin/env bash␊ - ␊ - # Check if git is installed␊ - if ! which git &> /dev/null␊ - then␊ - echo "git command not found. Install git and try again."␊ - exit 1␊ - fi␊ - ␊ - # Check if Foundry is installed␊ - if ! which forge &> /dev/null␊ - then␊ - echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ - exit 1␊ - fi␊ - ␊ - # Setup Foundry project␊ - if ! [ -f "foundry.toml" ]␊ - then␊ - echo "Initializing Foundry project..."␊ - ␊ - # Backup Wizard template readme to avoid it being overwritten␊ - mv README.md README-oz.md␊ - ␊ - # Initialize sample Foundry project␊ - forge init --force --no-commit --quiet␊ - ␊ - # Install OpenZeppelin Contracts and Upgrades␊ - forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-commit --quiet␊ - forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-commit --quiet␊ - ␊ - # Remove unneeded Foundry template files␊ - rm src/Counter.sol␊ - rm script/Counter.s.sol␊ - rm test/Counter.t.sol␊ - rm README.md␊ - ␊ - # Restore Wizard template readme␊ - mv README-oz.md README.md␊ - ␊ - # Add remappings␊ - if [ -f "remappings.txt" ]␊ - then␊ - echo "" >> remappings.txt␊ - fi␊ - echo "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ - echo "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/" >> remappings.txt␊ - ␊ - # Add settings in foundry.toml␊ - echo "" >> foundry.toml␊ - echo "ffi = true" >> foundry.toml␊ - echo "ast = true" >> foundry.toml␊ - echo "build_info = true" >> foundry.toml␊ - echo "extra_output = [\\"storageLayout\\"]" >> foundry.toml␊ - ␊ - # Perform initial git commit␊ - git add .␊ - git commit -m "openzeppelin: add wizard output" --quiet␊ - ␊ - echo "Done."␊ - else␊ - echo "Foundry project already initialized."␊ - fi␊ - `, - `# Sample Foundry Project␊ - ␊ - This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ - ␊ - ## Installing Foundry␊ - ␊ - See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ - ␊ - ## Initializing the project␊ - ␊ - \`\`\`␊ - bash setup.sh␊ - \`\`\`␊ - ␊ - ## Testing the contract␊ - ␊ - \`\`\`␊ - forge test --force␊ - \`\`\`␊ - ␊ - ## Deploying the contract␊ - ␊ - You can simulate a deployment by running the script:␊ - ␊ - \`\`\`␊ - forge script script/MyToken.s.sol --force␊ - \`\`\`␊ - ␊ - See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Script} from "forge-std/Script.sol";␊ - import {console} from "forge-std/console.sol";␊ - import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ - import {MyToken} from "src/MyToken.sol";␊ - ␊ - contract MyTokenScript is Script {␊ - function setUp() public {}␊ - ␊ - function run() public {␊ - // TODO: Set addresses for the variables below, then uncomment the following section:␊ - /*␊ - vm.startBroadcast();␊ - address defaultAdmin = ;␊ - address upgrader = ;␊ - address proxy = Upgrades.deployUUPSProxy(␊ - "MyToken.sol",␊ - abi.encodeCall(MyToken.initialize, (defaultAdmin, upgrader))␊ - );␊ - MyToken instance = MyToken(proxy);␊ - console.log("Proxy deployed to %s", address(instance));␊ - vm.stopBroadcast();␊ - */␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.0.0␊ - pragma solidity ^0.8.22;␊ - ␊ - import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ - import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";␊ - import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";␊ - import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ - import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊ - ␊ - contract MyToken is Initializable, ERC20Upgradeable, ERC20PermitUpgradeable, AccessControlUpgradeable, UUPSUpgradeable {␊ - bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE");␊ - ␊ - /// @custom:oz-upgrades-unsafe-allow constructor␊ - constructor() {␊ - _disableInitializers();␊ - }␊ - ␊ - function initialize(address defaultAdmin, address upgrader)␊ - initializer public␊ - {␊ - __ERC20_init("My Token", "MTK");␊ - __ERC20Permit_init("My Token");␊ - __AccessControl_init();␊ - __UUPSUpgradeable_init();␊ - ␊ - _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ - _grantRole(UPGRADER_ROLE, upgrader);␊ - }␊ - ␊ - function _authorizeUpgrade(address newImplementation)␊ - internal␊ - onlyRole(UPGRADER_ROLE)␊ - override␊ - {}␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Test} from "forge-std/Test.sol";␊ - import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ - import {MyToken} from "src/MyToken.sol";␊ - ␊ - contract MyTokenTest is Test {␊ - MyToken public instance;␊ - ␊ - function setUp() public {␊ - address defaultAdmin = vm.addr(1);␊ - address upgrader = vm.addr(2);␊ - address proxy = Upgrades.deployUUPSProxy(␊ - "MyToken.sol",␊ - abi.encodeCall(MyToken.initialize, (defaultAdmin, upgrader))␊ - );␊ - instance = MyToken(proxy);␊ - }␊ - ␊ - function testName() public view {␊ - assertEq(instance.name(), "My Token");␊ - }␊ - }␊ - `, - ] - -## erc721 uups, ownable - -> Snapshot 1 - - [ - `#!/usr/bin/env bash␊ - ␊ - # Check if git is installed␊ - if ! which git &> /dev/null␊ - then␊ - echo "git command not found. Install git and try again."␊ - exit 1␊ - fi␊ - ␊ - # Check if Foundry is installed␊ - if ! which forge &> /dev/null␊ - then␊ - echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ - exit 1␊ - fi␊ - ␊ - # Setup Foundry project␊ - if ! [ -f "foundry.toml" ]␊ - then␊ - echo "Initializing Foundry project..."␊ - ␊ - # Backup Wizard template readme to avoid it being overwritten␊ - mv README.md README-oz.md␊ - ␊ - # Initialize sample Foundry project␊ - forge init --force --no-commit --quiet␊ - ␊ - # Install OpenZeppelin Contracts and Upgrades␊ - forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-commit --quiet␊ - forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-commit --quiet␊ - ␊ - # Remove unneeded Foundry template files␊ - rm src/Counter.sol␊ - rm script/Counter.s.sol␊ - rm test/Counter.t.sol␊ - rm README.md␊ - ␊ - # Restore Wizard template readme␊ - mv README-oz.md README.md␊ - ␊ - # Add remappings␊ - if [ -f "remappings.txt" ]␊ - then␊ - echo "" >> remappings.txt␊ - fi␊ - echo "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ - echo "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/" >> remappings.txt␊ - ␊ - # Add settings in foundry.toml␊ - echo "" >> foundry.toml␊ - echo "ffi = true" >> foundry.toml␊ - echo "ast = true" >> foundry.toml␊ - echo "build_info = true" >> foundry.toml␊ - echo "extra_output = [\\"storageLayout\\"]" >> foundry.toml␊ - ␊ - # Perform initial git commit␊ - git add .␊ - git commit -m "openzeppelin: add wizard output" --quiet␊ - ␊ - echo "Done."␊ - else␊ - echo "Foundry project already initialized."␊ - fi␊ - `, - `# Sample Foundry Project␊ - ␊ - This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ - ␊ - ## Installing Foundry␊ - ␊ - See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ - ␊ - ## Initializing the project␊ - ␊ - \`\`\`␊ - bash setup.sh␊ - \`\`\`␊ - ␊ - ## Testing the contract␊ - ␊ - \`\`\`␊ - forge test --force␊ - \`\`\`␊ - ␊ - ## Deploying the contract␊ - ␊ - You can simulate a deployment by running the script:␊ - ␊ - \`\`\`␊ - forge script script/MyToken.s.sol --force␊ - \`\`\`␊ - ␊ - See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Script} from "forge-std/Script.sol";␊ - import {console} from "forge-std/console.sol";␊ - import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ - import {MyToken} from "src/MyToken.sol";␊ - ␊ - contract MyTokenScript is Script {␊ - function setUp() public {}␊ - ␊ - function run() public {␊ - // TODO: Set addresses for the variables below, then uncomment the following section:␊ - /*␊ - vm.startBroadcast();␊ - address initialOwner = ;␊ - address proxy = Upgrades.deployUUPSProxy(␊ - "MyToken.sol",␊ - abi.encodeCall(MyToken.initialize, (initialOwner))␊ - );␊ - MyToken instance = MyToken(proxy);␊ - console.log("Proxy deployed to %s", address(instance));␊ - vm.stopBroadcast();␊ - */␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.0.0␊ - pragma solidity ^0.8.22;␊ - ␊ - import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊ - import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ - import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ - import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊ - ␊ - contract MyToken is Initializable, ERC721Upgradeable, OwnableUpgradeable, UUPSUpgradeable {␊ - /// @custom:oz-upgrades-unsafe-allow constructor␊ - constructor() {␊ - _disableInitializers();␊ - }␊ - ␊ - function initialize(address initialOwner) initializer public {␊ - __ERC721_init("My Token", "MTK");␊ - __Ownable_init(initialOwner);␊ - __UUPSUpgradeable_init();␊ - }␊ - ␊ - function _authorizeUpgrade(address newImplementation)␊ - internal␊ - onlyOwner␊ - override␊ - {}␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Test} from "forge-std/Test.sol";␊ - import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ - import {MyToken} from "src/MyToken.sol";␊ - ␊ - contract MyTokenTest is Test {␊ - MyToken public instance;␊ - ␊ - function setUp() public {␊ - address initialOwner = vm.addr(1);␊ - address proxy = Upgrades.deployUUPSProxy(␊ - "MyToken.sol",␊ - abi.encodeCall(MyToken.initialize, (initialOwner))␊ - );␊ - instance = MyToken(proxy);␊ - }␊ - ␊ - function testName() public view {␊ - assertEq(instance.name(), "My Token");␊ - }␊ - }␊ - `, - ] - -## erc1155 basic - -> Snapshot 1 - - [ - `#!/usr/bin/env bash␊ - ␊ - # Check if git is installed␊ - if ! which git &> /dev/null␊ - then␊ - echo "git command not found. Install git and try again."␊ - exit 1␊ - fi␊ - ␊ - # Check if Foundry is installed␊ - if ! which forge &> /dev/null␊ - then␊ - echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ - exit 1␊ - fi␊ - ␊ - # Setup Foundry project␊ - if ! [ -f "foundry.toml" ]␊ - then␊ - echo "Initializing Foundry project..."␊ - ␊ - # Backup Wizard template readme to avoid it being overwritten␊ - mv README.md README-oz.md␊ - ␊ - # Initialize sample Foundry project␊ - forge init --force --no-commit --quiet␊ - ␊ - # Install OpenZeppelin Contracts␊ - forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-commit --quiet␊ - ␊ - # Remove unneeded Foundry template files␊ - rm src/Counter.sol␊ - rm script/Counter.s.sol␊ - rm test/Counter.t.sol␊ - rm README.md␊ - ␊ - # Restore Wizard template readme␊ - mv README-oz.md README.md␊ - ␊ - # Add remappings␊ - if [ -f "remappings.txt" ]␊ - then␊ - echo "" >> remappings.txt␊ - fi␊ - echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ - ␊ - # Perform initial git commit␊ - git add .␊ - git commit -m "openzeppelin: add wizard output" --quiet␊ - ␊ - echo "Done."␊ - else␊ - echo "Foundry project already initialized."␊ - fi␊ - `, - `# Sample Foundry Project␊ - ␊ - This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ - ␊ - ## Installing Foundry␊ - ␊ - See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ - ␊ - ## Initializing the project␊ - ␊ - \`\`\`␊ - bash setup.sh␊ - \`\`\`␊ - ␊ - ## Testing the contract␊ - ␊ - \`\`\`␊ - forge test␊ - \`\`\`␊ - ␊ - ## Deploying the contract␊ - ␊ - You can simulate a deployment by running the script:␊ - ␊ - \`\`\`␊ - forge script script/MyToken.s.sol␊ - \`\`\`␊ - ␊ - See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Script} from "forge-std/Script.sol";␊ - import {console} from "forge-std/console.sol";␊ - import {MyToken} from "src/MyToken.sol";␊ - ␊ - contract MyTokenScript is Script {␊ - function setUp() public {}␊ - ␊ - function run() public {␊ - // TODO: Set addresses for the variables below, then uncomment the following section:␊ - /*␊ - vm.startBroadcast();␊ - address initialOwner = ;␊ - MyToken instance = new MyToken(initialOwner);␊ - console.log("Contract deployed to %s", address(instance));␊ - vm.stopBroadcast();␊ - */␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.0.0␊ - pragma solidity ^0.8.22;␊ - ␊ - import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ - import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ - ␊ - contract MyToken is ERC1155, Ownable {␊ - constructor(address initialOwner)␊ - ERC1155("https://myuri/{id}")␊ - Ownable(initialOwner)␊ - {}␊ - ␊ - function setURI(string memory newuri) public onlyOwner {␊ - _setURI(newuri);␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Test} from "forge-std/Test.sol";␊ - import {MyToken} from "src/MyToken.sol";␊ - ␊ - contract MyTokenTest is Test {␊ - MyToken public instance;␊ - ␊ - function setUp() public {␊ - address initialOwner = vm.addr(1);␊ - instance = new MyToken(initialOwner);␊ - }␊ - ␊ - function testUri() public view {␊ - assertEq(instance.uri(0), "https://myuri/{id}");␊ - }␊ - }␊ - `, - ] - -## erc1155 transparent, ownable - -> Snapshot 1 - - [ - `#!/usr/bin/env bash␊ - ␊ - # Check if git is installed␊ - if ! which git &> /dev/null␊ - then␊ - echo "git command not found. Install git and try again."␊ - exit 1␊ - fi␊ - ␊ - # Check if Foundry is installed␊ - if ! which forge &> /dev/null␊ - then␊ - echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ - exit 1␊ - fi␊ - ␊ - # Setup Foundry project␊ - if ! [ -f "foundry.toml" ]␊ - then␊ - echo "Initializing Foundry project..."␊ - ␊ - # Backup Wizard template readme to avoid it being overwritten␊ - mv README.md README-oz.md␊ - ␊ - # Initialize sample Foundry project␊ - forge init --force --no-commit --quiet␊ - ␊ - # Install OpenZeppelin Contracts and Upgrades␊ - forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-commit --quiet␊ - forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-commit --quiet␊ - ␊ - # Remove unneeded Foundry template files␊ - rm src/Counter.sol␊ - rm script/Counter.s.sol␊ - rm test/Counter.t.sol␊ - rm README.md␊ - ␊ - # Restore Wizard template readme␊ - mv README-oz.md README.md␊ - ␊ - # Add remappings␊ - if [ -f "remappings.txt" ]␊ - then␊ - echo "" >> remappings.txt␊ - fi␊ - echo "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ - echo "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/" >> remappings.txt␊ - ␊ - # Add settings in foundry.toml␊ - echo "" >> foundry.toml␊ - echo "ffi = true" >> foundry.toml␊ - echo "ast = true" >> foundry.toml␊ - echo "build_info = true" >> foundry.toml␊ - echo "extra_output = [\\"storageLayout\\"]" >> foundry.toml␊ - ␊ - # Perform initial git commit␊ - git add .␊ - git commit -m "openzeppelin: add wizard output" --quiet␊ - ␊ - echo "Done."␊ - else␊ - echo "Foundry project already initialized."␊ - fi␊ - `, - `# Sample Foundry Project␊ - ␊ - This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ - ␊ - ## Installing Foundry␊ - ␊ - See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ - ␊ - ## Initializing the project␊ - ␊ - \`\`\`␊ - bash setup.sh␊ - \`\`\`␊ - ␊ - ## Testing the contract␊ - ␊ - \`\`\`␊ - forge test --force␊ - \`\`\`␊ - ␊ - ## Deploying the contract␊ - ␊ - You can simulate a deployment by running the script:␊ - ␊ - \`\`\`␊ - forge script script/MyToken.s.sol --force␊ - \`\`\`␊ - ␊ - See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Script} from "forge-std/Script.sol";␊ - import {console} from "forge-std/console.sol";␊ - import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ - import {MyToken} from "src/MyToken.sol";␊ - ␊ - contract MyTokenScript is Script {␊ - function setUp() public {}␊ - ␊ - function run() public {␊ - // TODO: Set addresses for the variables below, then uncomment the following section:␊ - /*␊ - vm.startBroadcast();␊ - address initialOwner = ;␊ - address proxy = Upgrades.deployTransparentProxy(␊ - "MyToken.sol",␊ - initialOwner,␊ - abi.encodeCall(MyToken.initialize, (initialOwner))␊ - );␊ - MyToken instance = MyToken(proxy);␊ - console.log("Proxy deployed to %s", address(instance));␊ - vm.stopBroadcast();␊ - */␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.0.0␊ - pragma solidity ^0.8.22;␊ - ␊ - import {ERC1155Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol";␊ - import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ - import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ - ␊ - contract MyToken is Initializable, ERC1155Upgradeable, OwnableUpgradeable {␊ - /// @custom:oz-upgrades-unsafe-allow constructor␊ - constructor() {␊ - _disableInitializers();␊ - }␊ - ␊ - function initialize(address initialOwner) initializer public {␊ - __ERC1155_init("https://myuri/{id}");␊ - __Ownable_init(initialOwner);␊ - }␊ - ␊ - function setURI(string memory newuri) public onlyOwner {␊ - _setURI(newuri);␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Test} from "forge-std/Test.sol";␊ - import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ - import {MyToken} from "src/MyToken.sol";␊ - ␊ - contract MyTokenTest is Test {␊ - MyToken public instance;␊ - ␊ - function setUp() public {␊ - address initialOwner = vm.addr(1);␊ - address proxy = Upgrades.deployTransparentProxy(␊ - "MyToken.sol",␊ - initialOwner,␊ - abi.encodeCall(MyToken.initialize, (initialOwner))␊ - );␊ - instance = MyToken(proxy);␊ - }␊ - ␊ - function testUri() public view {␊ - assertEq(instance.uri(0), "https://myuri/{id}");␊ - }␊ - }␊ - `, - ] - -## custom basic - -> Snapshot 1 - - [ - `#!/usr/bin/env bash␊ - ␊ - # Check if git is installed␊ - if ! which git &> /dev/null␊ - then␊ - echo "git command not found. Install git and try again."␊ - exit 1␊ - fi␊ - ␊ - # Check if Foundry is installed␊ - if ! which forge &> /dev/null␊ - then␊ - echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ - exit 1␊ - fi␊ - ␊ - # Setup Foundry project␊ - if ! [ -f "foundry.toml" ]␊ - then␊ - echo "Initializing Foundry project..."␊ - ␊ - # Backup Wizard template readme to avoid it being overwritten␊ - mv README.md README-oz.md␊ - ␊ - # Initialize sample Foundry project␊ - forge init --force --no-commit --quiet␊ - ␊ - # Install OpenZeppelin Contracts␊ - forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-commit --quiet␊ - ␊ - # Remove unneeded Foundry template files␊ - rm src/Counter.sol␊ - rm script/Counter.s.sol␊ - rm test/Counter.t.sol␊ - rm README.md␊ - ␊ - # Restore Wizard template readme␊ - mv README-oz.md README.md␊ - ␊ - # Add remappings␊ - if [ -f "remappings.txt" ]␊ - then␊ - echo "" >> remappings.txt␊ - fi␊ - echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ - ␊ - # Perform initial git commit␊ - git add .␊ - git commit -m "openzeppelin: add wizard output" --quiet␊ - ␊ - echo "Done."␊ - else␊ - echo "Foundry project already initialized."␊ - fi␊ - `, - `# Sample Foundry Project␊ - ␊ - This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ - ␊ - ## Installing Foundry␊ - ␊ - See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ - ␊ - ## Initializing the project␊ - ␊ - \`\`\`␊ - bash setup.sh␊ - \`\`\`␊ - ␊ - ## Testing the contract␊ - ␊ - \`\`\`␊ - forge test␊ - \`\`\`␊ - ␊ - ## Deploying the contract␊ - ␊ - You can simulate a deployment by running the script:␊ - ␊ - \`\`\`␊ - forge script script/MyContract.s.sol␊ - \`\`\`␊ - ␊ - See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Script} from "forge-std/Script.sol";␊ - import {console} from "forge-std/console.sol";␊ - import {MyContract} from "src/MyContract.sol";␊ - ␊ - contract MyContractScript is Script {␊ - function setUp() public {}␊ - ␊ - function run() public {␊ - vm.startBroadcast();␊ - MyContract instance = new MyContract();␊ - console.log("Contract deployed to %s", address(instance));␊ - vm.stopBroadcast();␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.0.0␊ - pragma solidity ^0.8.22;␊ - ␊ - contract MyContract {␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Test} from "forge-std/Test.sol";␊ - import {MyContract} from "src/MyContract.sol";␊ - ␊ - contract MyContractTest is Test {␊ - MyContract public instance;␊ - ␊ - function setUp() public {␊ - instance = new MyContract();␊ - }␊ - ␊ - function testSomething() public {␊ - // Add your test here␊ - }␊ - }␊ - `, - ] - -## custom transparent, managed - -> Snapshot 1 - - [ - `#!/usr/bin/env bash␊ - ␊ - # Check if git is installed␊ - if ! which git &> /dev/null␊ - then␊ - echo "git command not found. Install git and try again."␊ - exit 1␊ - fi␊ - ␊ - # Check if Foundry is installed␊ - if ! which forge &> /dev/null␊ - then␊ - echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ - exit 1␊ - fi␊ - ␊ - # Setup Foundry project␊ - if ! [ -f "foundry.toml" ]␊ - then␊ - echo "Initializing Foundry project..."␊ - ␊ - # Backup Wizard template readme to avoid it being overwritten␊ - mv README.md README-oz.md␊ - ␊ - # Initialize sample Foundry project␊ - forge init --force --no-commit --quiet␊ - ␊ - # Install OpenZeppelin Contracts and Upgrades␊ - forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-commit --quiet␊ - forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-commit --quiet␊ - ␊ - # Remove unneeded Foundry template files␊ - rm src/Counter.sol␊ - rm script/Counter.s.sol␊ - rm test/Counter.t.sol␊ - rm README.md␊ - ␊ - # Restore Wizard template readme␊ - mv README-oz.md README.md␊ - ␊ - # Add remappings␊ - if [ -f "remappings.txt" ]␊ - then␊ - echo "" >> remappings.txt␊ - fi␊ - echo "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ - echo "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/" >> remappings.txt␊ - ␊ - # Add settings in foundry.toml␊ - echo "" >> foundry.toml␊ - echo "ffi = true" >> foundry.toml␊ - echo "ast = true" >> foundry.toml␊ - echo "build_info = true" >> foundry.toml␊ - echo "extra_output = [\\"storageLayout\\"]" >> foundry.toml␊ - ␊ - # Perform initial git commit␊ - git add .␊ - git commit -m "openzeppelin: add wizard output" --quiet␊ - ␊ - echo "Done."␊ - else␊ - echo "Foundry project already initialized."␊ - fi␊ - `, - `# Sample Foundry Project␊ - ␊ - This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ - ␊ - ## Installing Foundry␊ - ␊ - See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ - ␊ - ## Initializing the project␊ - ␊ - \`\`\`␊ - bash setup.sh␊ - \`\`\`␊ - ␊ - ## Testing the contract␊ - ␊ - \`\`\`␊ - forge test --force␊ - \`\`\`␊ - ␊ - ## Deploying the contract␊ - ␊ - You can simulate a deployment by running the script:␊ - ␊ - \`\`\`␊ - forge script script/MyContract.s.sol --force␊ - \`\`\`␊ - ␊ - See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Script} from "forge-std/Script.sol";␊ - import {console} from "forge-std/console.sol";␊ - import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ - import {MyContract} from "src/MyContract.sol";␊ - ␊ - contract MyContractScript is Script {␊ - function setUp() public {}␊ - ␊ - function run() public {␊ - // TODO: Set addresses for the variables below, then uncomment the following section:␊ - /*␊ - vm.startBroadcast();␊ - address initialOwner = ;␊ - address initialAuthority = ;␊ - address proxy = Upgrades.deployTransparentProxy(␊ - "MyContract.sol",␊ - initialOwner,␊ - abi.encodeCall(MyContract.initialize, (initialAuthority))␊ - );␊ - MyContract instance = MyContract(proxy);␊ - console.log("Proxy deployed to %s", address(instance));␊ - vm.stopBroadcast();␊ - */␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.0.0␊ - pragma solidity ^0.8.22;␊ - ␊ - import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ - import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ - ␊ - contract MyContract is Initializable, AccessManagedUpgradeable {␊ - /// @custom:oz-upgrades-unsafe-allow constructor␊ - constructor() {␊ - _disableInitializers();␊ - }␊ - ␊ - function initialize(address initialAuthority) initializer public {␊ - __AccessManaged_init(initialAuthority);␊ - }␊ - }␊ - `, - `// SPDX-License-Identifier: MIT␊ - pragma solidity ^0.8.22;␊ - ␊ - import {Test} from "forge-std/Test.sol";␊ - import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ - import {MyContract} from "src/MyContract.sol";␊ - ␊ - contract MyContractTest is Test {␊ - MyContract public instance;␊ - ␊ - function setUp() public {␊ - address initialOwner = vm.addr(1);␊ - address initialAuthority = vm.addr(2);␊ - address proxy = Upgrades.deployTransparentProxy(␊ - "MyContract.sol",␊ - initialOwner,␊ - abi.encodeCall(MyContract.initialize, (initialAuthority))␊ - );␊ - instance = MyContract(proxy);␊ - }␊ - ␊ - function testSomething() public {␊ - // Add your test here␊ - }␊ - }␊ - `, - ] diff --git a/packages/core/solidity/src/zip-hardhat.test.ts.md b/packages/core/solidity/src/zip-hardhat.test.ts.md index 6b047a954..17b7438f5 100644 --- a/packages/core/solidity/src/zip-hardhat.test.ts.md +++ b/packages/core/solidity/src/zip-hardhat.test.ts.md @@ -160,7 +160,7 @@ Generated by [AVA](https://avajs.dev). _disableInitializers();␊ }␊ ␊ - function initialize(address initialOwner) initializer public {␊ + function initialize(address initialOwner) public initializer {␊ __ERC721_init("My Token", "MTK");␊ __Ownable_init(initialOwner);␊ __UUPSUpgradeable_init();␊ @@ -168,8 +168,8 @@ Generated by [AVA](https://avajs.dev). ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ - onlyOwner␊ override␊ + onlyOwner␊ {}␊ }␊ `, From c24bf2e99f31b2677d05b389a1d83bef34e012f5 Mon Sep 17 00:00:00 2001 From: GianfrancoBazzani Date: Thu, 20 Feb 2025 18:37:45 +0100 Subject: [PATCH 4/9] :newspaper: docs: add testing documentation and command aliasing --- README.md | 2 ++ packages/core/cairo/package.json | 1 + packages/core/solidity/package.json | 1 + 3 files changed, 4 insertions(+) diff --git a/README.md b/README.md index 423e357e1..17bd31b6a 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ Contracts Wizard is a web application to interactively build a contract out of c Install dependencies with `yarn install`. `packages/core` contains the code generation logic for each language under separately named subfolders. + * Run `yarn test` to run the tests. + * Run `yarn test:update-snapshots` to update AVA snapshots and run the tests. `packages/ui` is the interface built in Svelte. From the `packages/ui` directory, run `yarn dev` to spin up a local server to develop the UI. diff --git a/packages/core/cairo/package.json b/packages/core/cairo/package.json index 3e61b4fda..659340299 100644 --- a/packages/core/cairo/package.json +++ b/packages/core/cairo/package.json @@ -18,6 +18,7 @@ "update_scarb_project": "ts-node src/scripts/update-scarb-project.ts", "prepublish": "rimraf dist *.tsbuildinfo", "test": "ava", + "test:update-snapshots": "ava --update-snapshots", "test:watch": "ava --watch", "version": "node ../../../scripts/bump-changelog.js" }, diff --git a/packages/core/solidity/package.json b/packages/core/solidity/package.json index c744fc962..c15b622f1 100644 --- a/packages/core/solidity/package.json +++ b/packages/core/solidity/package.json @@ -17,6 +17,7 @@ "prepare": "tsc && node dist/scripts/prepare.js", "prepublish": "rimraf dist *.tsbuildinfo && hardhat clean", "test": "ava", + "test:update-snapshots": "ava --update-snapshots", "test:watch": "ava --watch", "version": "node ../../../scripts/bump-changelog.js", "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" From c2dbf448bb8ed37a8e44cc16e47a5286a91ff6d0 Mon Sep 17 00:00:00 2001 From: GianfrancoBazzani Date: Thu, 20 Feb 2025 18:47:32 +0100 Subject: [PATCH 5/9] :tea: test: generate testing snapshots --- .../core/solidity/src/contract.test.ts.snap | Bin 974 -> 978 bytes .../core/solidity/src/custom.test.ts.snap | Bin 827 -> 829 bytes .../core/solidity/src/erc1155.test.ts.snap | Bin 1784 -> 1776 bytes packages/core/solidity/src/erc20.test.ts.snap | Bin 1968 -> 1967 bytes .../core/solidity/src/erc721.test.ts.snap | Bin 2140 -> 2138 bytes .../core/solidity/src/governor.test.ts.snap | Bin 2462 -> 2460 bytes .../core/solidity/src/zip-foundry.test.ts.md | 1211 +++++++++++++++++ .../solidity/src/zip-foundry.test.ts.snap | Bin 3483 -> 3486 bytes packages/core/solidity/src/zip-foundry.ts | 8 +- .../solidity/src/zip-hardhat.test.ts.snap | Bin 2299 -> 2299 bytes 10 files changed, 1215 insertions(+), 4 deletions(-) create mode 100644 packages/core/solidity/src/zip-foundry.test.ts.md diff --git a/packages/core/solidity/src/contract.test.ts.snap b/packages/core/solidity/src/contract.test.ts.snap index 3b63457a1e0771dd73b607938f19353e13794965..ddca348d738e707aefaac3813d3d478b07a43e0f 100644 GIT binary patch literal 978 zcmV;@11+Qn+rQuM z``zcyFTASHojdaBOH@?($Q{m02I?#zMg zecOiVsdLwdFH#4Y#Ni7rGDSU#ViYc2n912TOz%&*0XmNd9x4P(11pR`c#_{xsueCxVNPr4OiZovhX+HOnG#wlO0N`*Ym53b0MPW$y z7xFR3k$e%>{+07Xu)NYFP`RUBfHQvyIKw}RHJjaIsP&_d)Y_VnHYw_1Q&g=XpGP66 zi~mBJTs+cliaP$Z=sz=}|0vr#3OZi44KpYQlYFt&|4>4j>WT@%{bT|OqY5d z#(A(ySO+pjSik)b>&C-+Mb%JD#rbqQg4#lY>(wWdW?`rSrz?zh2rbLBJLq8RAsTQu zj(dAD`($|L-A*0^DW3TYsTOL;E^{?SB8je<#Rogl2EyFV34J!Z+YsS<|BKMoFD(jf z*geNg8Jmt%aCq8*xN6Avp~v!>$NxJ0TLERN5Xd=8B6Cp`VWb48#YoZMM0X8hLv_53 z%x3o+iu~%M@@nhF=;j1%sZbgoPj^%gi}}rcklSOkt?!xmFEwxNGi3VN|1#C{ z)<*Q&Na{+dr0S=b?75-dlOC(5OBR?XeuQuqPL{{ISNC;RDHq}Q2CdiqMk@}d z61pH{B+$M2+q}l|&4iD}BQX>iqC<%fPL1f5Q?LF{48{+8#kfL5h1_etmkBd)lzF@z z{YL}+o1H{&+cu0lkyJbwmFPr*s-8+LLV)M2kke|-*;iJ0%jBd01`*k AsQ>@~ literal 974 zcmV;<12OzTRzVe4zW<@ zOGpz8$RCRc00000000B+SG#W$F&Ixkyt1+J68aPgl#28&jQ}AkB$NUY5|2VVv<$7B zyYCv)JNvMGeNZ~Uz`zC)JC6~G0WpD?*gCN?@i(x5U_!oL(m1&U`cRWf+>+Qn+rQuM z``zcyFTJYIomu(p6)LKHLEBWxH>k>sKp6t%-%jhS&Cv!0S zz_wv*^wPxOHR>RfIC#}Xrl?0zoQLaI$8)v~BRmL+qE#PZo~jz$43XWzFhrj+7)kb% zFm=W%S*2Vk$V@;$a-X_XEy7gEI%k#3!?|1o+7-@WDYu+UFwZpx;^hg1L}(Cg(BCyf z-}O4Pjo4`ra-m?ULc}t7f(MYd>l@ z`k_prV8m~9)KL^J-ySKKiV**dCCaYOTWY*4qY#Ca3S||7-a6TGIG)vP#uM$qbgAcI zoCmvvbyvm+>-Ya*U4K|_sv3&XIG=7sP+LfFz511;Sr}-*=?bGALd!Dk4m#9&hz8t^ z(OgH zsVk+9pCf{js-I%A7lwLId#s)=SzwO%5yAyHT^{aU-Pc*AT!cRuwBGa^tvH-Y=z@@u zK=+i=l|q~gJOiB2S_S{&4vHRO87MO+|3=%eNEp#28=2N(D|a&eGi;@8YXD!ccO6H*f0( zvW*ZHryq+500000000B+R^4jbFceN!#=v*m6KK6kpovRiFq)f&wu3;^l(vC(um;6G zNyKDHNOIF8^kVF4w|j%`<@N@<9=2uIa?&Loqot$1l)v-)9ep}CgFfZnXZ7s|Xrd_$ zyijQ#5XG=iBd*n#8{fwopM75|y(&dt`DN+#i?1cuMJGplXSD<30aH+G`M@+85Rlub z-8yw#7wz&uU`_fI(3t2E>Ih&TK?tCPp4Q{odnK^L3# z_w}ubfr4Ni<-aPt!1}7BYngP{Wk+aehMPCZ?LF#wYQFWr0Ad1vH5~ zO<^e1JU?sH;^))a|HMy0DZ00&_laT)NX|(iO1FD-@|PjVgXfw`qH%WBGwpunznrmVI&|)73IHbDi2ZULI zG?bX>V@{#6xBsEpJvi+(_u8$)-f`z(f5SGLdp3)s9bkrs3vTCmxn(i2{di2YlN48E zA}L6^mhDQ680_+)ZzhteCso_BGXFn+1+Hqvl_lxYs)G5v&phul&-=`S?K8gtIKYQr HT-1u7 literal 827 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 XGEt8`$aC{6oSXj-u2U_NnpFS*DrJ1x diff --git a/packages/core/solidity/src/erc721.test.ts.snap b/packages/core/solidity/src/erc721.test.ts.snap index 130d22e5752dfb28647944c927148056e3e26fbc..b68226b5bfcd06fd81bffdb6696e5aef44da021c 100644 GIT binary patch literal 2138 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 diff --git a/packages/core/solidity/src/governor.test.ts.snap b/packages/core/solidity/src/governor.test.ts.snap index 0cb4d9b5107c75adae9c2f1bffd6a8768968df72..6eeccd8ef69a4395db5594c4979a994d7596cad5 100644 GIT binary patch delta 221 zcmV<303!dM6Pyz=K~_N^Q*L2!b7*gLAa*kf0{~BMX_p526i|EE>ZHjmsu`&>JCNZu z1{6K+Ytz>=@(Qss$_RfigJ4ciSa{){oaj)V#Ene!KdfkG-q!S@%7%$Q>G^D}pthBH zqtk2dS2iz%MT^&K2l-2~+n+WuqLXh`=n#fKn_W$4H1o3~bs<9bNgk(i;O0gSl(vnvGB6c Xj=NUNG0k0`dy(e<++PIbAOZmZhwf`f delta 223 zcmV<503iRI6P^p8RW%2EVZ~$_RhYgWyO(n5T`LwI@21CvjU7{SPaenYT5)sIp<=PkKIEE2wQ{ z-stq2`<2ZLVbS9C+Cl!3?DnTkjOgTB6*`3B&t_K>8qNIdNL`4Kz0!}0o}3X*ua4ro z>{G66b2Xqm)#ctG32$kBXe{Wodnsg&v1rW}NM;;G*MHfhxx*t^Oj%?!vBdH=Lyv`* Zg?8MvT8?S%^4yCw{|6wvlVuxZW;gp diff --git a/packages/core/solidity/src/zip-foundry.test.ts.md b/packages/core/solidity/src/zip-foundry.test.ts.md new file mode 100644 index 000000000..27bad0fe8 --- /dev/null +++ b/packages/core/solidity/src/zip-foundry.test.ts.md @@ -0,0 +1,1211 @@ +# Snapshot report for `src/zip-foundry.test.ts` + +The actual snapshot is saved in `zip-foundry.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## erc20 full + +> Snapshot 1 + + [ + `#!/usr/bin/env bash␊ + ␊ + # Check if git is installed␊ + if ! which git &> /dev/null␊ + then␊ + echo "git command not found. Install git and try again."␊ + exit 1␊ + fi␊ + ␊ + # Check if Foundry is installed␊ + if ! which forge &> /dev/null␊ + then␊ + echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ + exit 1␊ + fi␊ + ␊ + # Setup Foundry project␊ + if ! [ -f "foundry.toml" ]␊ + then␊ + echo "Initializing Foundry project..."␊ + ␊ + # Backup Wizard template readme to avoid it being overwritten␊ + mv README.md README-oz.md␊ + ␊ + # Initialize sample Foundry project␊ + forge init --force --no-git --quiet␊ + ␊ + # Install OpenZeppelin Contracts␊ + forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-git --quiet␊ + ␊ + # Remove unneeded Foundry template files␊ + rm src/Counter.sol␊ + rm script/Counter.s.sol␊ + rm test/Counter.t.sol␊ + rm README.md␊ + ␊ + # Restore Wizard template readme␊ + mv README-oz.md README.md␊ + ␊ + # Add remappings␊ + if [ -f "remappings.txt" ]␊ + then␊ + echo "" >> remappings.txt␊ + fi␊ + echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ + ␊ + # Perform initial git commit␊ + git add .␊ + git commit -m "openzeppelin: add wizard output" --quiet␊ + ␊ + echo "Done."␊ + else␊ + echo "Foundry project already initialized."␊ + fi␊ + `, + `# Sample Foundry Project␊ + ␊ + This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ + ␊ + ## Installing Foundry␊ + ␊ + See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ + ␊ + ## Initializing the project␊ + ␊ + \`\`\`␊ + bash setup.sh␊ + \`\`\`␊ + ␊ + ## Testing the contract␊ + ␊ + \`\`\`␊ + forge test␊ + \`\`\`␊ + ␊ + ## Deploying the contract␊ + ␊ + You can simulate a deployment by running the script:␊ + ␊ + \`\`\`␊ + forge script script/MyToken.s.sol␊ + \`\`\`␊ + ␊ + See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Script} from "forge-std/Script.sol";␊ + import {console} from "forge-std/console.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + ␊ + contract MyTokenScript is Script {␊ + function setUp() public {}␊ + ␊ + function run() public {␊ + // TODO: Set addresses for the variables below, then uncomment the following section:␊ + /*␊ + vm.startBroadcast();␊ + address defaultAdmin = ;␊ + address pauser = ;␊ + address recipient = ;␊ + address minter = ;␊ + MyToken instance = new MyToken(defaultAdmin, pauser, recipient, minter);␊ + console.log("Contract deployed to %s", address(instance));␊ + vm.stopBroadcast();␊ + */␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.0.0␊ + pragma solidity ^0.8.22;␊ + ␊ + import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ + import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ + import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";␊ + import {ERC20FlashMint} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";␊ + import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";␊ + import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ + import {ERC20Votes} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";␊ + import {Nonces} from "@openzeppelin/contracts/utils/Nonces.sol";␊ + ␊ + contract MyToken is ERC20, ERC20Burnable, ERC20Pausable, AccessControl, ERC20Permit, ERC20Votes, ERC20FlashMint {␊ + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");␊ + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");␊ + ␊ + constructor(address defaultAdmin, address pauser, address recipient, address minter)␊ + ERC20("My Token", "MTK")␊ + ERC20Permit("My Token")␊ + {␊ + _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ + _grantRole(PAUSER_ROLE, pauser);␊ + _mint(recipient, 2000 * 10 ** decimals());␊ + _grantRole(MINTER_ROLE, minter);␊ + }␊ + ␊ + function pause() public onlyRole(PAUSER_ROLE) {␊ + _pause();␊ + }␊ + ␊ + function unpause() public onlyRole(PAUSER_ROLE) {␊ + _unpause();␊ + }␊ + ␊ + function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {␊ + _mint(to, amount);␊ + }␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function _update(address from, address to, uint256 value)␊ + internal␊ + override(ERC20, ERC20Pausable, ERC20Votes)␊ + {␊ + super._update(from, to, value);␊ + }␊ + ␊ + function nonces(address owner)␊ + public␊ + view␊ + override(ERC20Permit, Nonces)␊ + returns (uint256)␊ + {␊ + return super.nonces(owner);␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Test} from "forge-std/Test.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + ␊ + contract MyTokenTest is Test {␊ + MyToken public instance;␊ + ␊ + function setUp() public {␊ + address defaultAdmin = vm.addr(1);␊ + address pauser = vm.addr(2);␊ + address recipient = vm.addr(3);␊ + address minter = vm.addr(4);␊ + instance = new MyToken(defaultAdmin, pauser, recipient, minter);␊ + }␊ + ␊ + function testName() public view {␊ + assertEq(instance.name(), "My Token");␊ + }␊ + }␊ + `, + ] + +## erc20 uups, roles + +> Snapshot 1 + + [ + `#!/usr/bin/env bash␊ + ␊ + # Check if git is installed␊ + if ! which git &> /dev/null␊ + then␊ + echo "git command not found. Install git and try again."␊ + exit 1␊ + fi␊ + ␊ + # Check if Foundry is installed␊ + if ! which forge &> /dev/null␊ + then␊ + echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ + exit 1␊ + fi␊ + ␊ + # Setup Foundry project␊ + if ! [ -f "foundry.toml" ]␊ + then␊ + echo "Initializing Foundry project..."␊ + ␊ + # Backup Wizard template readme to avoid it being overwritten␊ + mv README.md README-oz.md␊ + ␊ + # Initialize sample Foundry project␊ + forge init --force --no-git --quiet␊ + ␊ + # Install OpenZeppelin Contracts and Upgrades␊ + forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-git --quiet␊ + ␊ + # Remove unneeded Foundry template files␊ + rm src/Counter.sol␊ + rm script/Counter.s.sol␊ + rm test/Counter.t.sol␊ + rm README.md␊ + ␊ + # Restore Wizard template readme␊ + mv README-oz.md README.md␊ + ␊ + # Add remappings␊ + if [ -f "remappings.txt" ]␊ + then␊ + echo "" >> remappings.txt␊ + fi␊ + echo "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ + echo "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/" >> remappings.txt␊ + ␊ + # Add settings in foundry.toml␊ + echo "" >> foundry.toml␊ + echo "ffi = true" >> foundry.toml␊ + echo "ast = true" >> foundry.toml␊ + echo "build_info = true" >> foundry.toml␊ + echo "extra_output = [\\"storageLayout\\"]" >> foundry.toml␊ + ␊ + # Perform initial git commit␊ + git add .␊ + git commit -m "openzeppelin: add wizard output" --quiet␊ + ␊ + echo "Done."␊ + else␊ + echo "Foundry project already initialized."␊ + fi␊ + `, + `# Sample Foundry Project␊ + ␊ + This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ + ␊ + ## Installing Foundry␊ + ␊ + See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ + ␊ + ## Initializing the project␊ + ␊ + \`\`\`␊ + bash setup.sh␊ + \`\`\`␊ + ␊ + ## Testing the contract␊ + ␊ + \`\`\`␊ + forge test --force␊ + \`\`\`␊ + ␊ + ## Deploying the contract␊ + ␊ + You can simulate a deployment by running the script:␊ + ␊ + \`\`\`␊ + forge script script/MyToken.s.sol --force␊ + \`\`\`␊ + ␊ + See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Script} from "forge-std/Script.sol";␊ + import {console} from "forge-std/console.sol";␊ + import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + ␊ + contract MyTokenScript is Script {␊ + function setUp() public {}␊ + ␊ + function run() public {␊ + // TODO: Set addresses for the variables below, then uncomment the following section:␊ + /*␊ + vm.startBroadcast();␊ + address defaultAdmin = ;␊ + address upgrader = ;␊ + address proxy = Upgrades.deployUUPSProxy(␊ + "MyToken.sol",␊ + abi.encodeCall(MyToken.initialize, (defaultAdmin, upgrader))␊ + );␊ + MyToken instance = MyToken(proxy);␊ + console.log("Proxy deployed to %s", address(instance));␊ + vm.stopBroadcast();␊ + */␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.0.0␊ + pragma solidity ^0.8.22;␊ + ␊ + import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ + import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";␊ + import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";␊ + import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ + import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊ + ␊ + contract MyToken is Initializable, ERC20Upgradeable, ERC20PermitUpgradeable, AccessControlUpgradeable, UUPSUpgradeable {␊ + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE");␊ + ␊ + /// @custom:oz-upgrades-unsafe-allow constructor␊ + constructor() {␊ + _disableInitializers();␊ + }␊ + ␊ + function initialize(address defaultAdmin, address upgrader)␊ + public initializer␊ + {␊ + __ERC20_init("My Token", "MTK");␊ + __ERC20Permit_init("My Token");␊ + __AccessControl_init();␊ + __UUPSUpgradeable_init();␊ + ␊ + _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ + _grantRole(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + function _authorizeUpgrade(address newImplementation)␊ + internal␊ + override␊ + onlyRole(UPGRADER_ROLE)␊ + {}␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Test} from "forge-std/Test.sol";␊ + import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + ␊ + contract MyTokenTest is Test {␊ + MyToken public instance;␊ + ␊ + function setUp() public {␊ + address defaultAdmin = vm.addr(1);␊ + address upgrader = vm.addr(2);␊ + address proxy = Upgrades.deployUUPSProxy(␊ + "MyToken.sol",␊ + abi.encodeCall(MyToken.initialize, (defaultAdmin, upgrader))␊ + );␊ + instance = MyToken(proxy);␊ + }␊ + ␊ + function testName() public view {␊ + assertEq(instance.name(), "My Token");␊ + }␊ + }␊ + `, + ] + +## erc721 uups, ownable + +> Snapshot 1 + + [ + `#!/usr/bin/env bash␊ + ␊ + # Check if git is installed␊ + if ! which git &> /dev/null␊ + then␊ + echo "git command not found. Install git and try again."␊ + exit 1␊ + fi␊ + ␊ + # Check if Foundry is installed␊ + if ! which forge &> /dev/null␊ + then␊ + echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ + exit 1␊ + fi␊ + ␊ + # Setup Foundry project␊ + if ! [ -f "foundry.toml" ]␊ + then␊ + echo "Initializing Foundry project..."␊ + ␊ + # Backup Wizard template readme to avoid it being overwritten␊ + mv README.md README-oz.md␊ + ␊ + # Initialize sample Foundry project␊ + forge init --force --no-git --quiet␊ + ␊ + # Install OpenZeppelin Contracts and Upgrades␊ + forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-git --quiet␊ + ␊ + # Remove unneeded Foundry template files␊ + rm src/Counter.sol␊ + rm script/Counter.s.sol␊ + rm test/Counter.t.sol␊ + rm README.md␊ + ␊ + # Restore Wizard template readme␊ + mv README-oz.md README.md␊ + ␊ + # Add remappings␊ + if [ -f "remappings.txt" ]␊ + then␊ + echo "" >> remappings.txt␊ + fi␊ + echo "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ + echo "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/" >> remappings.txt␊ + ␊ + # Add settings in foundry.toml␊ + echo "" >> foundry.toml␊ + echo "ffi = true" >> foundry.toml␊ + echo "ast = true" >> foundry.toml␊ + echo "build_info = true" >> foundry.toml␊ + echo "extra_output = [\\"storageLayout\\"]" >> foundry.toml␊ + ␊ + # Perform initial git commit␊ + git add .␊ + git commit -m "openzeppelin: add wizard output" --quiet␊ + ␊ + echo "Done."␊ + else␊ + echo "Foundry project already initialized."␊ + fi␊ + `, + `# Sample Foundry Project␊ + ␊ + This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ + ␊ + ## Installing Foundry␊ + ␊ + See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ + ␊ + ## Initializing the project␊ + ␊ + \`\`\`␊ + bash setup.sh␊ + \`\`\`␊ + ␊ + ## Testing the contract␊ + ␊ + \`\`\`␊ + forge test --force␊ + \`\`\`␊ + ␊ + ## Deploying the contract␊ + ␊ + You can simulate a deployment by running the script:␊ + ␊ + \`\`\`␊ + forge script script/MyToken.s.sol --force␊ + \`\`\`␊ + ␊ + See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Script} from "forge-std/Script.sol";␊ + import {console} from "forge-std/console.sol";␊ + import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + ␊ + contract MyTokenScript is Script {␊ + function setUp() public {}␊ + ␊ + function run() public {␊ + // TODO: Set addresses for the variables below, then uncomment the following section:␊ + /*␊ + vm.startBroadcast();␊ + address initialOwner = ;␊ + address proxy = Upgrades.deployUUPSProxy(␊ + "MyToken.sol",␊ + abi.encodeCall(MyToken.initialize, (initialOwner))␊ + );␊ + MyToken instance = MyToken(proxy);␊ + console.log("Proxy deployed to %s", address(instance));␊ + vm.stopBroadcast();␊ + */␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.0.0␊ + pragma solidity ^0.8.22;␊ + ␊ + import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊ + import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ + import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ + import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊ + ␊ + contract MyToken is Initializable, ERC721Upgradeable, OwnableUpgradeable, UUPSUpgradeable {␊ + /// @custom:oz-upgrades-unsafe-allow constructor␊ + constructor() {␊ + _disableInitializers();␊ + }␊ + ␊ + function initialize(address initialOwner) public initializer {␊ + __ERC721_init("My Token", "MTK");␊ + __Ownable_init(initialOwner);␊ + __UUPSUpgradeable_init();␊ + }␊ + ␊ + function _authorizeUpgrade(address newImplementation)␊ + internal␊ + override␊ + onlyOwner␊ + {}␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Test} from "forge-std/Test.sol";␊ + import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + ␊ + contract MyTokenTest is Test {␊ + MyToken public instance;␊ + ␊ + function setUp() public {␊ + address initialOwner = vm.addr(1);␊ + address proxy = Upgrades.deployUUPSProxy(␊ + "MyToken.sol",␊ + abi.encodeCall(MyToken.initialize, (initialOwner))␊ + );␊ + instance = MyToken(proxy);␊ + }␊ + ␊ + function testName() public view {␊ + assertEq(instance.name(), "My Token");␊ + }␊ + }␊ + `, + ] + +## erc1155 basic + +> Snapshot 1 + + [ + `#!/usr/bin/env bash␊ + ␊ + # Check if git is installed␊ + if ! which git &> /dev/null␊ + then␊ + echo "git command not found. Install git and try again."␊ + exit 1␊ + fi␊ + ␊ + # Check if Foundry is installed␊ + if ! which forge &> /dev/null␊ + then␊ + echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ + exit 1␊ + fi␊ + ␊ + # Setup Foundry project␊ + if ! [ -f "foundry.toml" ]␊ + then␊ + echo "Initializing Foundry project..."␊ + ␊ + # Backup Wizard template readme to avoid it being overwritten␊ + mv README.md README-oz.md␊ + ␊ + # Initialize sample Foundry project␊ + forge init --force --no-git --quiet␊ + ␊ + # Install OpenZeppelin Contracts␊ + forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-git --quiet␊ + ␊ + # Remove unneeded Foundry template files␊ + rm src/Counter.sol␊ + rm script/Counter.s.sol␊ + rm test/Counter.t.sol␊ + rm README.md␊ + ␊ + # Restore Wizard template readme␊ + mv README-oz.md README.md␊ + ␊ + # Add remappings␊ + if [ -f "remappings.txt" ]␊ + then␊ + echo "" >> remappings.txt␊ + fi␊ + echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ + ␊ + # Perform initial git commit␊ + git add .␊ + git commit -m "openzeppelin: add wizard output" --quiet␊ + ␊ + echo "Done."␊ + else␊ + echo "Foundry project already initialized."␊ + fi␊ + `, + `# Sample Foundry Project␊ + ␊ + This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ + ␊ + ## Installing Foundry␊ + ␊ + See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ + ␊ + ## Initializing the project␊ + ␊ + \`\`\`␊ + bash setup.sh␊ + \`\`\`␊ + ␊ + ## Testing the contract␊ + ␊ + \`\`\`␊ + forge test␊ + \`\`\`␊ + ␊ + ## Deploying the contract␊ + ␊ + You can simulate a deployment by running the script:␊ + ␊ + \`\`\`␊ + forge script script/MyToken.s.sol␊ + \`\`\`␊ + ␊ + See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Script} from "forge-std/Script.sol";␊ + import {console} from "forge-std/console.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + ␊ + contract MyTokenScript is Script {␊ + function setUp() public {}␊ + ␊ + function run() public {␊ + // TODO: Set addresses for the variables below, then uncomment the following section:␊ + /*␊ + vm.startBroadcast();␊ + address initialOwner = ;␊ + MyToken instance = new MyToken(initialOwner);␊ + console.log("Contract deployed to %s", address(instance));␊ + vm.stopBroadcast();␊ + */␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.0.0␊ + pragma solidity ^0.8.22;␊ + ␊ + import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + ␊ + contract MyToken is ERC1155, Ownable {␊ + constructor(address initialOwner)␊ + ERC1155("https://myuri/{id}")␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setURI(string memory newuri) public onlyOwner {␊ + _setURI(newuri);␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Test} from "forge-std/Test.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + ␊ + contract MyTokenTest is Test {␊ + MyToken public instance;␊ + ␊ + function setUp() public {␊ + address initialOwner = vm.addr(1);␊ + instance = new MyToken(initialOwner);␊ + }␊ + ␊ + function testUri() public view {␊ + assertEq(instance.uri(0), "https://myuri/{id}");␊ + }␊ + }␊ + `, + ] + +## erc1155 transparent, ownable + +> Snapshot 1 + + [ + `#!/usr/bin/env bash␊ + ␊ + # Check if git is installed␊ + if ! which git &> /dev/null␊ + then␊ + echo "git command not found. Install git and try again."␊ + exit 1␊ + fi␊ + ␊ + # Check if Foundry is installed␊ + if ! which forge &> /dev/null␊ + then␊ + echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ + exit 1␊ + fi␊ + ␊ + # Setup Foundry project␊ + if ! [ -f "foundry.toml" ]␊ + then␊ + echo "Initializing Foundry project..."␊ + ␊ + # Backup Wizard template readme to avoid it being overwritten␊ + mv README.md README-oz.md␊ + ␊ + # Initialize sample Foundry project␊ + forge init --force --no-git --quiet␊ + ␊ + # Install OpenZeppelin Contracts and Upgrades␊ + forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-git --quiet␊ + ␊ + # Remove unneeded Foundry template files␊ + rm src/Counter.sol␊ + rm script/Counter.s.sol␊ + rm test/Counter.t.sol␊ + rm README.md␊ + ␊ + # Restore Wizard template readme␊ + mv README-oz.md README.md␊ + ␊ + # Add remappings␊ + if [ -f "remappings.txt" ]␊ + then␊ + echo "" >> remappings.txt␊ + fi␊ + echo "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ + echo "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/" >> remappings.txt␊ + ␊ + # Add settings in foundry.toml␊ + echo "" >> foundry.toml␊ + echo "ffi = true" >> foundry.toml␊ + echo "ast = true" >> foundry.toml␊ + echo "build_info = true" >> foundry.toml␊ + echo "extra_output = [\\"storageLayout\\"]" >> foundry.toml␊ + ␊ + # Perform initial git commit␊ + git add .␊ + git commit -m "openzeppelin: add wizard output" --quiet␊ + ␊ + echo "Done."␊ + else␊ + echo "Foundry project already initialized."␊ + fi␊ + `, + `# Sample Foundry Project␊ + ␊ + This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ + ␊ + ## Installing Foundry␊ + ␊ + See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ + ␊ + ## Initializing the project␊ + ␊ + \`\`\`␊ + bash setup.sh␊ + \`\`\`␊ + ␊ + ## Testing the contract␊ + ␊ + \`\`\`␊ + forge test --force␊ + \`\`\`␊ + ␊ + ## Deploying the contract␊ + ␊ + You can simulate a deployment by running the script:␊ + ␊ + \`\`\`␊ + forge script script/MyToken.s.sol --force␊ + \`\`\`␊ + ␊ + See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Script} from "forge-std/Script.sol";␊ + import {console} from "forge-std/console.sol";␊ + import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + ␊ + contract MyTokenScript is Script {␊ + function setUp() public {}␊ + ␊ + function run() public {␊ + // TODO: Set addresses for the variables below, then uncomment the following section:␊ + /*␊ + vm.startBroadcast();␊ + address initialOwner = ;␊ + address proxy = Upgrades.deployTransparentProxy(␊ + "MyToken.sol",␊ + initialOwner,␊ + abi.encodeCall(MyToken.initialize, (initialOwner))␊ + );␊ + MyToken instance = MyToken(proxy);␊ + console.log("Proxy deployed to %s", address(instance));␊ + vm.stopBroadcast();␊ + */␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.0.0␊ + pragma solidity ^0.8.22;␊ + ␊ + import {ERC1155Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol";␊ + import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ + import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ + ␊ + contract MyToken is Initializable, ERC1155Upgradeable, OwnableUpgradeable {␊ + /// @custom:oz-upgrades-unsafe-allow constructor␊ + constructor() {␊ + _disableInitializers();␊ + }␊ + ␊ + function initialize(address initialOwner) public initializer {␊ + __ERC1155_init("https://myuri/{id}");␊ + __Ownable_init(initialOwner);␊ + }␊ + ␊ + function setURI(string memory newuri) public onlyOwner {␊ + _setURI(newuri);␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Test} from "forge-std/Test.sol";␊ + import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + ␊ + contract MyTokenTest is Test {␊ + MyToken public instance;␊ + ␊ + function setUp() public {␊ + address initialOwner = vm.addr(1);␊ + address proxy = Upgrades.deployTransparentProxy(␊ + "MyToken.sol",␊ + initialOwner,␊ + abi.encodeCall(MyToken.initialize, (initialOwner))␊ + );␊ + instance = MyToken(proxy);␊ + }␊ + ␊ + function testUri() public view {␊ + assertEq(instance.uri(0), "https://myuri/{id}");␊ + }␊ + }␊ + `, + ] + +## custom basic + +> Snapshot 1 + + [ + `#!/usr/bin/env bash␊ + ␊ + # Check if git is installed␊ + if ! which git &> /dev/null␊ + then␊ + echo "git command not found. Install git and try again."␊ + exit 1␊ + fi␊ + ␊ + # Check if Foundry is installed␊ + if ! which forge &> /dev/null␊ + then␊ + echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ + exit 1␊ + fi␊ + ␊ + # Setup Foundry project␊ + if ! [ -f "foundry.toml" ]␊ + then␊ + echo "Initializing Foundry project..."␊ + ␊ + # Backup Wizard template readme to avoid it being overwritten␊ + mv README.md README-oz.md␊ + ␊ + # Initialize sample Foundry project␊ + forge init --force --no-git --quiet␊ + ␊ + # Install OpenZeppelin Contracts␊ + forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-git --quiet␊ + ␊ + # Remove unneeded Foundry template files␊ + rm src/Counter.sol␊ + rm script/Counter.s.sol␊ + rm test/Counter.t.sol␊ + rm README.md␊ + ␊ + # Restore Wizard template readme␊ + mv README-oz.md README.md␊ + ␊ + # Add remappings␊ + if [ -f "remappings.txt" ]␊ + then␊ + echo "" >> remappings.txt␊ + fi␊ + echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ + ␊ + # Perform initial git commit␊ + git add .␊ + git commit -m "openzeppelin: add wizard output" --quiet␊ + ␊ + echo "Done."␊ + else␊ + echo "Foundry project already initialized."␊ + fi␊ + `, + `# Sample Foundry Project␊ + ␊ + This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ + ␊ + ## Installing Foundry␊ + ␊ + See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ + ␊ + ## Initializing the project␊ + ␊ + \`\`\`␊ + bash setup.sh␊ + \`\`\`␊ + ␊ + ## Testing the contract␊ + ␊ + \`\`\`␊ + forge test␊ + \`\`\`␊ + ␊ + ## Deploying the contract␊ + ␊ + You can simulate a deployment by running the script:␊ + ␊ + \`\`\`␊ + forge script script/MyContract.s.sol␊ + \`\`\`␊ + ␊ + See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Script} from "forge-std/Script.sol";␊ + import {console} from "forge-std/console.sol";␊ + import {MyContract} from "src/MyContract.sol";␊ + ␊ + contract MyContractScript is Script {␊ + function setUp() public {}␊ + ␊ + function run() public {␊ + vm.startBroadcast();␊ + MyContract instance = new MyContract();␊ + console.log("Contract deployed to %s", address(instance));␊ + vm.stopBroadcast();␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.0.0␊ + pragma solidity ^0.8.22;␊ + ␊ + contract MyContract {␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Test} from "forge-std/Test.sol";␊ + import {MyContract} from "src/MyContract.sol";␊ + ␊ + contract MyContractTest is Test {␊ + MyContract public instance;␊ + ␊ + function setUp() public {␊ + instance = new MyContract();␊ + }␊ + ␊ + function testSomething() public {␊ + // Add your test here␊ + }␊ + }␊ + `, + ] + +## custom transparent, managed + +> Snapshot 1 + + [ + `#!/usr/bin/env bash␊ + ␊ + # Check if git is installed␊ + if ! which git &> /dev/null␊ + then␊ + echo "git command not found. Install git and try again."␊ + exit 1␊ + fi␊ + ␊ + # Check if Foundry is installed␊ + if ! which forge &> /dev/null␊ + then␊ + echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ + exit 1␊ + fi␊ + ␊ + # Setup Foundry project␊ + if ! [ -f "foundry.toml" ]␊ + then␊ + echo "Initializing Foundry project..."␊ + ␊ + # Backup Wizard template readme to avoid it being overwritten␊ + mv README.md README-oz.md␊ + ␊ + # Initialize sample Foundry project␊ + forge init --force --no-git --quiet␊ + ␊ + # Install OpenZeppelin Contracts and Upgrades␊ + forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-git --quiet␊ + ␊ + # Remove unneeded Foundry template files␊ + rm src/Counter.sol␊ + rm script/Counter.s.sol␊ + rm test/Counter.t.sol␊ + rm README.md␊ + ␊ + # Restore Wizard template readme␊ + mv README-oz.md README.md␊ + ␊ + # Add remappings␊ + if [ -f "remappings.txt" ]␊ + then␊ + echo "" >> remappings.txt␊ + fi␊ + echo "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ + echo "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/" >> remappings.txt␊ + ␊ + # Add settings in foundry.toml␊ + echo "" >> foundry.toml␊ + echo "ffi = true" >> foundry.toml␊ + echo "ast = true" >> foundry.toml␊ + echo "build_info = true" >> foundry.toml␊ + echo "extra_output = [\\"storageLayout\\"]" >> foundry.toml␊ + ␊ + # Perform initial git commit␊ + git add .␊ + git commit -m "openzeppelin: add wizard output" --quiet␊ + ␊ + echo "Done."␊ + else␊ + echo "Foundry project already initialized."␊ + fi␊ + `, + `# Sample Foundry Project␊ + ␊ + This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ + ␊ + ## Installing Foundry␊ + ␊ + See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ + ␊ + ## Initializing the project␊ + ␊ + \`\`\`␊ + bash setup.sh␊ + \`\`\`␊ + ␊ + ## Testing the contract␊ + ␊ + \`\`\`␊ + forge test --force␊ + \`\`\`␊ + ␊ + ## Deploying the contract␊ + ␊ + You can simulate a deployment by running the script:␊ + ␊ + \`\`\`␊ + forge script script/MyContract.s.sol --force␊ + \`\`\`␊ + ␊ + See [Solidity scripting guide](https://book.getfoundry.sh/tutorials/solidity-scripting) for more information.␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Script} from "forge-std/Script.sol";␊ + import {console} from "forge-std/console.sol";␊ + import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ + import {MyContract} from "src/MyContract.sol";␊ + ␊ + contract MyContractScript is Script {␊ + function setUp() public {}␊ + ␊ + function run() public {␊ + // TODO: Set addresses for the variables below, then uncomment the following section:␊ + /*␊ + vm.startBroadcast();␊ + address initialOwner = ;␊ + address initialAuthority = ;␊ + address proxy = Upgrades.deployTransparentProxy(␊ + "MyContract.sol",␊ + initialOwner,␊ + abi.encodeCall(MyContract.initialize, (initialAuthority))␊ + );␊ + MyContract instance = MyContract(proxy);␊ + console.log("Proxy deployed to %s", address(instance));␊ + vm.stopBroadcast();␊ + */␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.0.0␊ + pragma solidity ^0.8.22;␊ + ␊ + import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ + import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ + ␊ + contract MyContract is Initializable, AccessManagedUpgradeable {␊ + /// @custom:oz-upgrades-unsafe-allow constructor␊ + constructor() {␊ + _disableInitializers();␊ + }␊ + ␊ + function initialize(address initialAuthority) public initializer {␊ + __AccessManaged_init(initialAuthority);␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.22;␊ + ␊ + import {Test} from "forge-std/Test.sol";␊ + import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";␊ + import {MyContract} from "src/MyContract.sol";␊ + ␊ + contract MyContractTest is Test {␊ + MyContract public instance;␊ + ␊ + function setUp() public {␊ + address initialOwner = vm.addr(1);␊ + address initialAuthority = vm.addr(2);␊ + address proxy = Upgrades.deployTransparentProxy(␊ + "MyContract.sol",␊ + initialOwner,␊ + abi.encodeCall(MyContract.initialize, (initialAuthority))␊ + );␊ + instance = MyContract(proxy);␊ + }␊ + ␊ + function testSomething() public {␊ + // Add your test here␊ + }␊ + }␊ + `, + ] diff --git a/packages/core/solidity/src/zip-foundry.test.ts.snap b/packages/core/solidity/src/zip-foundry.test.ts.snap index ff70636f2ccd6bb0ae61e77dd5aad4bac260f928..62b421708ef41f60cad7ba820632bd98485b91cd 100644 GIT binary patch literal 3486 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 Jf|NOd007U=n=b$W diff --git a/packages/core/solidity/src/zip-foundry.ts b/packages/core/solidity/src/zip-foundry.ts index 96b88122e..221c0ea7e 100644 --- a/packages/core/solidity/src/zip-foundry.ts +++ b/packages/core/solidity/src/zip-foundry.ts @@ -272,15 +272,15 @@ then mv README.md README-oz.md # Initialize sample Foundry project - forge init --force --no-commit --quiet + forge init --force --no-git --quiet ${c.upgradeable ? `\ # Install OpenZeppelin Contracts and Upgrades - forge install OpenZeppelin/openzeppelin-contracts-upgradeable@v${contracts.version} --no-commit --quiet - forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-commit --quiet\ + forge install OpenZeppelin/openzeppelin-contracts-upgradeable@v${contracts.version} --no-git --quiet + forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-git --quiet\ ` : `\ # Install OpenZeppelin Contracts - forge install OpenZeppelin/openzeppelin-contracts@v${contracts.version} --no-commit --quiet\ + forge install OpenZeppelin/openzeppelin-contracts@v${contracts.version} --no-git --quiet\ `} # Remove unneeded Foundry template files diff --git a/packages/core/solidity/src/zip-hardhat.test.ts.snap b/packages/core/solidity/src/zip-hardhat.test.ts.snap index f43bf594ae9e4546608e6bc26e3f51ee442c9560..231d727b36f907a67f823f6b68da22f925af94cf 100644 GIT binary patch delta 587 zcmV-R0<``65&ID`K~_N^Q*L2!b7*gLAa*kf0|0R(KB;1^bPbh`SJP0V&h?xgdIgK) zM^|Uk>*39LuCK8&z6O73XET-)c})k2*9ZD_NiUmg3J+{B6441Ad8tBp66qJ%evq&? z`aF$r<^qGGO-(BGE@T+jIog}?01Jl3u%tC8W&9t#YQ~?5PULSYm*$5}&2N2Y@YP$} z8JxX6oi%AHC$#+S*VTU9DYhT=v_Su#G$N@tmLfgTwZbhJQOAFu;~$;kBRVzRl6X>F;t1ea?$QD}BZ#j#iUV)O?y3E<7fvTK;lE1Gv?J zQjuJ4Hp5{oX!C!B`lH+xhDCR$F;0qPPJ-Is*>t56`s6!=P%khBN3oz2$Lqf)_FC(P&M87hO6oNxL96NK`kWGh4ScpnKXS7XG_?r7jX-#Wrgg|4nhmIi~sA) zT|8Vy7yrtx$4X0O@mlHiUk}YMJLZ=i^UIEM-teCyZ@7fZj&n1Ja~=rKFDovR6jCd@P)y+HX06aO~`Wt zA`_gYGD2Ae6I!t{z6O6e0g-k&IZX$N*9Tgvq?gS#g$FhmiRgrmyi_4PiS!F>KSgr?Vza<%E{M{kqzZJH_^+o)+l;lSU-<#!{pwx>mRaBkF(nll+GE>4n=5gZ_5* z9{+M?>pf1-vp2j8$!E(9UC3#S{=#|sx_NvE!fUsemT;Fy>P=Jlg};|k_=i^z3a=vc zmum=pePdP%|8M7VD7^Ob+_yPeIQ?Btq0f0yXr<4%#L;RpikeUJ!iC2KRm)#aXaKi5 zP%4tk&1N`^1#N$xP=A!W!m#M>G{#Ah%t=uDJDaXlLZ5tx5b6cS;3yV!;&?q-GdT)s zCtA_@Dee4}_6~L$j?6zLjQFT+P#X<#`Rgr&#%yHBtJQ_ku87VlX*3sSK~LS8voO|tZJMN z*{yKq$~v#67pkTk-*7cu9~a9@DyW4-x=L(=;B}5^;l`CEM6P?Lan1wb`DMig_{700 ZyR7*3FpCeF@@rPA@ju{sH9HnG003)wFkJuu From 9cfee184a2071d5d3fc299e86ce8ce9bff40932c Mon Sep 17 00:00:00 2001 From: GianfrancoBazzani Date: Fri, 21 Feb 2025 00:36:38 +0100 Subject: [PATCH 6/9] :new: chore: add changes to changelog --- packages/core/solidity/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/solidity/CHANGELOG.md b/packages/core/solidity/CHANGELOG.md index 4db5a7710..04a026372 100644 --- a/packages/core/solidity/CHANGELOG.md +++ b/packages/core/solidity/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +- Fix modifiers order to follow Solidity style guides. ([#450](https://github.com/OpenZeppelin/contracts-wizard/pull/450)) + ## 0.5.1 (2025-02-05) - **Potentially breaking changes**: From dba7cd7256f9518e13c5d2339180ef7b5216d044 Mon Sep 17 00:00:00 2001 From: GianfrancoBazzani Date: Fri, 21 Feb 2025 00:50:12 +0100 Subject: [PATCH 7/9] :arrow_right_hook: test: revert --no-git --- .../core/solidity/src/zip-foundry.test.ts.md | 36 +++++++++--------- .../solidity/src/zip-foundry.test.ts.snap | Bin 3486 -> 3480 bytes packages/core/solidity/src/zip-foundry.ts | 8 ++-- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/core/solidity/src/zip-foundry.test.ts.md b/packages/core/solidity/src/zip-foundry.test.ts.md index 27bad0fe8..3c6d2afd8 100644 --- a/packages/core/solidity/src/zip-foundry.test.ts.md +++ b/packages/core/solidity/src/zip-foundry.test.ts.md @@ -34,10 +34,10 @@ Generated by [AVA](https://avajs.dev). mv README.md README-oz.md␊ ␊ # Initialize sample Foundry project␊ - forge init --force --no-git --quiet␊ + forge init --force --no-commit --quiet␊ ␊ # Install OpenZeppelin Contracts␊ - forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-commit --quiet␊ ␊ # Remove unneeded Foundry template files␊ rm src/Counter.sol␊ @@ -231,11 +231,11 @@ Generated by [AVA](https://avajs.dev). mv README.md README-oz.md␊ ␊ # Initialize sample Foundry project␊ - forge init --force --no-git --quiet␊ + forge init --force --no-commit --quiet␊ ␊ # Install OpenZeppelin Contracts and Upgrades␊ - forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-git --quiet␊ - forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-commit --quiet␊ + forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-commit --quiet␊ ␊ # Remove unneeded Foundry template files␊ rm src/Counter.sol␊ @@ -422,11 +422,11 @@ Generated by [AVA](https://avajs.dev). mv README.md README-oz.md␊ ␊ # Initialize sample Foundry project␊ - forge init --force --no-git --quiet␊ + forge init --force --no-commit --quiet␊ ␊ # Install OpenZeppelin Contracts and Upgrades␊ - forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-git --quiet␊ - forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-commit --quiet␊ + forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-commit --quiet␊ ␊ # Remove unneeded Foundry template files␊ rm src/Counter.sol␊ @@ -602,10 +602,10 @@ Generated by [AVA](https://avajs.dev). mv README.md README-oz.md␊ ␊ # Initialize sample Foundry project␊ - forge init --force --no-git --quiet␊ + forge init --force --no-commit --quiet␊ ␊ # Install OpenZeppelin Contracts␊ - forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-commit --quiet␊ ␊ # Remove unneeded Foundry template files␊ rm src/Counter.sol␊ @@ -753,11 +753,11 @@ Generated by [AVA](https://avajs.dev). mv README.md README-oz.md␊ ␊ # Initialize sample Foundry project␊ - forge init --force --no-git --quiet␊ + forge init --force --no-commit --quiet␊ ␊ # Install OpenZeppelin Contracts and Upgrades␊ - forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-git --quiet␊ - forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-commit --quiet␊ + forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-commit --quiet␊ ␊ # Remove unneeded Foundry template files␊ rm src/Counter.sol␊ @@ -931,10 +931,10 @@ Generated by [AVA](https://avajs.dev). mv README.md README-oz.md␊ ␊ # Initialize sample Foundry project␊ - forge init --force --no-git --quiet␊ + forge init --force --no-commit --quiet␊ ␊ # Install OpenZeppelin Contracts␊ - forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --no-commit --quiet␊ ␊ # Remove unneeded Foundry template files␊ rm src/Counter.sol␊ @@ -1066,11 +1066,11 @@ Generated by [AVA](https://avajs.dev). mv README.md README-oz.md␊ ␊ # Initialize sample Foundry project␊ - forge init --force --no-git --quiet␊ + forge init --force --no-commit --quiet␊ ␊ # Install OpenZeppelin Contracts and Upgrades␊ - forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-git --quiet␊ - forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-git --quiet␊ + forge install OpenZeppelin/openzeppelin-contracts-upgradeable@vX.Y.Z --no-commit --quiet␊ + forge install OpenZeppelin/openzeppelin-foundry-upgrades --no-commit --quiet␊ ␊ # Remove unneeded Foundry template files␊ rm src/Counter.sol␊ diff --git a/packages/core/solidity/src/zip-foundry.test.ts.snap b/packages/core/solidity/src/zip-foundry.test.ts.snap index 62b421708ef41f60cad7ba820632bd98485b91cd..803c20175524ea099b63f6108f9459a9f75573bf 100644 GIT binary patch literal 3480 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 GfdBxwp{(No literal 3486 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 Date: Thu, 20 Feb 2025 19:18:10 -0500 Subject: [PATCH 8/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 17bd31b6a..a7f80f460 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Contracts Wizard is a web application to interactively build a contract out of c Install dependencies with `yarn install`. -`packages/core` contains the code generation logic for each language under separately named subfolders. +`packages/core` contains the code generation logic for each language under separately named subfolders. From each language's subfolder: * Run `yarn test` to run the tests. * Run `yarn test:update-snapshots` to update AVA snapshots and run the tests. From 7a3afabf403eac75ede365747e4de5e90c50af28 Mon Sep 17 00:00:00 2001 From: Eric Lau Date: Thu, 20 Feb 2025 22:27:56 -0500 Subject: [PATCH 9/9] Fix readme formatting --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a7f80f460..0d7b59113 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ Contracts Wizard is a web application to interactively build a contract out of c Install dependencies with `yarn install`. `packages/core` contains the code generation logic for each language under separately named subfolders. From each language's subfolder: - * Run `yarn test` to run the tests. - * Run `yarn test:update-snapshots` to update AVA snapshots and run the tests. +- Run `yarn test` to run the tests. +- Run `yarn test:update-snapshots` to update AVA snapshots and run the tests. `packages/ui` is the interface built in Svelte. From the `packages/ui` directory, run `yarn dev` to spin up a local server to develop the UI.