From 8783d926125044accf3f86db0bc71454ff56d97e Mon Sep 17 00:00:00 2001 From: Stanley Date: Thu, 24 Oct 2024 18:43:02 -0400 Subject: [PATCH] burn to redeem module PoC --- script/BurnToRedeem.s.sol | 52 ++++++++++++++++ .../token/burnable/BurnToRedeemERC1155.sol | 61 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 script/BurnToRedeem.s.sol create mode 100644 src/module/token/burnable/BurnToRedeemERC1155.sol diff --git a/script/BurnToRedeem.s.sol b/script/BurnToRedeem.s.sol new file mode 100644 index 00000000..336dff15 --- /dev/null +++ b/script/BurnToRedeem.s.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.20; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; + +import {Role} from "src/Role.sol"; +import {ERC1155Core} from "src/core/token/ERC1155Core.sol"; +import {MintableERC1155} from "src/module/token/minting/MintableERC1155.sol"; +import {BatchMetadataERC1155} from "src/module/token/metadata/BatchMetadataERC1155.sol"; +import {BurnToRedeemERC1155} from "src/module/token/burnable/BurnToRedeemERC1155.sol"; + +contract BurnToRedeemScript is Script { + + ERC1155Core public core; + BurnToRedeemERC1155 public burnToRedeemModule; + BatchMetadataERC1155 public batchMetadataModule; + MintableERC1155 public mintableModule; + + function run() external { + uint256 deployerPrivateKey = vm.envUint("TEST_PRIVATE_KEY"); + address deployerAddress = vm.addr(deployerPrivateKey); + vm.startBroadcast(deployerPrivateKey); + + core = new ERC1155Core("test", "TEST", "", deployerAddress, new address[](0), new bytes[](0)); + mintableModule = new MintableERC1155(address(0x0)); + batchMetadataModule = new BatchMetadataERC1155(); + burnToRedeemModule = new BurnToRedeemERC1155(); + console.log("core deployed at: ", address(core)); + console.log("burn to redeem module deployed at: ", address(burnToRedeemModule)); + + core.installModule(address(burnToRedeemModule), ""); + console.log("burn to redeem module installed"); + + bytes memory encodedInstallParams = abi.encode(deployerAddress); + core.installModule(address(mintableModule), encodedInstallParams); + console.log("mintable module installed"); + + core.installModule(address(batchMetadataModule), ""); + console.log("batch metadata module installed"); + + core.grantRoles(deployerAddress, Role._MINTER_ROLE); + + core.mint(deployerAddress, 0, 10, "", ""); + console.log("minted 10 tokens to deployer"); + + BurnToRedeemERC1155(address(core)).burnToRedeem(deployerAddress, 0, 1); + console.log("burned 1 token to redeem"); + + vm.stopBroadcast(); + } +} diff --git a/src/module/token/burnable/BurnToRedeemERC1155.sol b/src/module/token/burnable/BurnToRedeemERC1155.sol new file mode 100644 index 00000000..bdd41302 --- /dev/null +++ b/src/module/token/burnable/BurnToRedeemERC1155.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.20; + +import {Module} from "../../../Module.sol"; +import {Role} from "../../../Role.sol"; +import {ERC1155} from "@solady/tokens/ERC1155.sol"; + +contract BurnToRedeemERC1155 is Module, ERC1155 { + + /*////////////////////////////////////////////////////////////// + ERRORS + //////////////////////////////////////////////////////////////*/ + + error BurnToRedeemInvalidTokenId(); + + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event BurnToRedeem(address indexed from, uint256 tokenIdBurned, uint256 tokenIdRedeemed); + + /*////////////////////////////////////////////////////////////// + MODULE CONFIG + //////////////////////////////////////////////////////////////*/ + + /// @notice Returns all implemented callback and module functions. + function getModuleConfig() external pure override returns (ModuleConfig memory config) { + config.fallbackFunctions = new FallbackFunction[](1); + + config.fallbackFunctions[0] = FallbackFunction({selector: this.burnToRedeem.selector, permissionBits: 0}); + + config.requiredInterfaces = new bytes4[](1); + config.requiredInterfaces[0] = 0xd9b67a26; // ERC1155 + } + + + /*////////////////////////////////////////////////////////////// + ERC1155 FUNCTIONS + //////////////////////////////////////////////////////////////*/ + function uri(uint256 tokenId) public view override returns (string memory) { + return ""; + } + + /*////////////////////////////////////////////////////////////// + FALLBACK FUNCTIONS + //////////////////////////////////////////////////////////////*/ + + /// @notice Set transferability for a token. + function burnToRedeem(address _from, uint256 _tokenId, uint256 _amount) external { + if (_tokenId > 4) { + revert BurnToRedeemInvalidTokenId(); + } + _burn(msg.sender, _from, _tokenId, _amount); + + uint256 redeemedTokenId = block.number % 99 + 100; + + _mint(msg.sender, redeemedTokenId, 1, ""); + + emit BurnToRedeem(msg.sender, _tokenId, redeemedTokenId); + } +}