diff --git a/.gitignore b/.gitignore index 85198aa..1c7f414 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Compiler files cache/ out/ +src/artifacts # Ignores development broadcast logs !/broadcast diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 0000000..662ac05 --- /dev/null +++ b/remappings.txt @@ -0,0 +1,6 @@ +@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ +ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/ +erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/ +forge-std/=lib/forge-std/src/ +halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/ +openzeppelin-contracts/=lib/openzeppelin-contracts/ diff --git a/script/Counter.s.sol b/script/Counter.s.sol deleted file mode 100644 index cdc1fe9..0000000 --- a/script/Counter.s.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Script, console} from "forge-std/Script.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterScript is Script { - Counter public counter; - - function setUp() public {} - - function run() public { - vm.startBroadcast(); - - counter = new Counter(); - - vm.stopBroadcast(); - } -} diff --git a/src/AuthorizedMinter.sol b/src/AuthorizedMinter.sol new file mode 100644 index 0000000..d8f868c --- /dev/null +++ b/src/AuthorizedMinter.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import "@openzeppelin/contracts/utils/Context.sol"; + + +abstract contract AuthorizedMinter is Context { + mapping (address => bool) public authorizedMinters; + + event MinterAuthorized(address minter); + event MinterDeAuthorized(address minter); + + error MinterUnauthorized(address); + + modifier onlyAuthorizedMinter() { + __checkAuthorizedMinter(); + _; + } + + function __checkAuthorizedMinter() internal view virtual { + if (!authorizedMinters[_msgSender()] == true) { + revert MinterUnauthorized(_msgSender()); + } + } + + function _authorizeMinter(address minter) internal { + authorizedMinters[minter] = true; + + emit MinterAuthorized(minter); + } + + function _deAuthorizeMinter(address minter) internal { + authorizedMinters[minter] = false; + + emit MinterDeAuthorized(minter); + } +} \ No newline at end of file diff --git a/src/Counter.sol b/src/Counter.sol deleted file mode 100644 index aded799..0000000 --- a/src/Counter.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -contract Counter { - uint256 public number; - - function setNumber(uint256 newNumber) public { - number = newNumber; - } - - function increment() public { - number++; - } -} diff --git a/src/WrappedReact.sol b/src/WrappedReact.sol new file mode 100644 index 0000000..0e7ea80 --- /dev/null +++ b/src/WrappedReact.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "./AuthorizedMinter.sol"; + +contract WrappedReact is ERC20, Ownable, AuthorizedMinter { + constructor() + ERC20("Wrapped REACT", "wREACT") + Ownable(msg.sender) + {} + + function authorizeMinter(address minter) public onlyOwner { + _authorizeMinter(minter); + } + + function deAuthorizeMinter(address minter) public onlyOwner { + _deAuthorizeMinter(minter); + } + + function mint(address to, uint256 amount) public onlyAuthorizedMinter { + _mint(to, amount); + } + + function burn(address from, uint amount) public onlyAuthorizedMinter { + _burn(from, amount); + } +} diff --git a/test/Counter.t.sol b/test/Counter.t.sol deleted file mode 100644 index 54b724f..0000000 --- a/test/Counter.t.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Test, console} from "forge-std/Test.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterTest is Test { - Counter public counter; - - function setUp() public { - counter = new Counter(); - counter.setNumber(0); - } - - function test_Increment() public { - counter.increment(); - assertEq(counter.number(), 1); - } - - function testFuzz_SetNumber(uint256 x) public { - counter.setNumber(x); - assertEq(counter.number(), x); - } -}