From 8369e1c87e0446aecc8601f56b1a5d6374f2a1eb Mon Sep 17 00:00:00 2001 From: Ryan Collins Date: Thu, 2 Oct 2025 12:42:25 +0200 Subject: [PATCH 1/5] chore: boilerplate copypasta --- contracts/src/xYield/xYieldToken.sol | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 contracts/src/xYield/xYieldToken.sol diff --git a/contracts/src/xYield/xYieldToken.sol b/contracts/src/xYield/xYieldToken.sol new file mode 100644 index 00000000..27666f33 --- /dev/null +++ b/contracts/src/xYield/xYieldToken.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract xYieldToken is ERC20 { + address public immutable minter; + + constructor(address _minter, string memory name, string memory symbol) ERC20(name, symbol) { + require(_minter != address(0), "Minter address cannot be zero"); + minter = _minter; + } + + modifier onlyMinter() { + require(msg.sender == minter, "Caller is not the minter"); + _; + } + + function mint(address to, uint256 amount) external onlyMinter { + _mint(to, amount); + } + + /// @dev The standard burn function is already public and allows any holder to burn their own tokens, + /// emitting a Transfer event to address(0) as the burn signal. +} \ No newline at end of file From 133aba97fe422f913b910dc9054cfcb1a12168bf Mon Sep 17 00:00:00 2001 From: Ryan Collins Date: Wed, 8 Oct 2025 07:33:35 -0400 Subject: [PATCH 2/5] fix: name change --- contracts/src/xYield/{xYieldToken.sol => MintableERC20.sol} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contracts/src/xYield/{xYieldToken.sol => MintableERC20.sol} (95%) diff --git a/contracts/src/xYield/xYieldToken.sol b/contracts/src/xYield/MintableERC20.sol similarity index 95% rename from contracts/src/xYield/xYieldToken.sol rename to contracts/src/xYield/MintableERC20.sol index 27666f33..061fbdce 100644 --- a/contracts/src/xYield/xYieldToken.sol +++ b/contracts/src/xYield/MintableERC20.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.18; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -contract xYieldToken is ERC20 { +contract MintableERC20 is ERC20 { address public immutable minter; constructor(address _minter, string memory name, string memory symbol) ERC20(name, symbol) { From 6617d34392175b05e5856757183a0a1c321df376 Mon Sep 17 00:00:00 2001 From: Ryan Collins Date: Wed, 8 Oct 2025 07:49:30 -0400 Subject: [PATCH 3/5] feat: mintable erc-20 deploy --- .../deploy/xYield/DeployMintableERC20.s.sol | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 contracts/script/deploy/xYield/DeployMintableERC20.s.sol diff --git a/contracts/script/deploy/xYield/DeployMintableERC20.s.sol b/contracts/script/deploy/xYield/DeployMintableERC20.s.sol new file mode 100644 index 00000000..a1d1c85b --- /dev/null +++ b/contracts/script/deploy/xYield/DeployMintableERC20.s.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.30; + +import {MintableERC20} from "../../../src/xYield/MintableERC20.sol"; +import { DeploymentUtils } from "../../lib/DeploymentUtils.sol"; + +contract DeployMintableERC20 is DeploymentUtils { + MintableERC20 private token; + + function deploy() external { + selectMainnetOrSepoliaFork("base"); + startBroadcastWithDeployerKeyIfItExists(); + + token = new MintableERC20(address(0x6c8E1d54297aAe7C34f1F5cF73559e621a394eFb), "xyUSDC", "xyUSDC"); + + vm.stopBroadcast(); + } +} \ No newline at end of file From 79866bbea20f1e00d0adcbb154427d64c45c4fbe Mon Sep 17 00:00:00 2001 From: Ryan Collins Date: Wed, 8 Oct 2025 07:50:16 -0400 Subject: [PATCH 4/5] fix: forge fmt --- contracts/script/deploy/xYield/DeployMintableERC20.s.sol | 6 +++--- contracts/src/xYield/MintableERC20.sol | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/script/deploy/xYield/DeployMintableERC20.s.sol b/contracts/script/deploy/xYield/DeployMintableERC20.s.sol index a1d1c85b..229276f3 100644 --- a/contracts/script/deploy/xYield/DeployMintableERC20.s.sol +++ b/contracts/script/deploy/xYield/DeployMintableERC20.s.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.30; -import {MintableERC20} from "../../../src/xYield/MintableERC20.sol"; +import { MintableERC20 } from "../../../src/xYield/MintableERC20.sol"; import { DeploymentUtils } from "../../lib/DeploymentUtils.sol"; contract DeployMintableERC20 is DeploymentUtils { - MintableERC20 private token; + MintableERC20 private token; function deploy() external { selectMainnetOrSepoliaFork("base"); @@ -15,4 +15,4 @@ contract DeployMintableERC20 is DeploymentUtils { vm.stopBroadcast(); } -} \ No newline at end of file +} diff --git a/contracts/src/xYield/MintableERC20.sol b/contracts/src/xYield/MintableERC20.sol index 061fbdce..ee563b05 100644 --- a/contracts/src/xYield/MintableERC20.sol +++ b/contracts/src/xYield/MintableERC20.sol @@ -22,4 +22,4 @@ contract MintableERC20 is ERC20 { /// @dev The standard burn function is already public and allows any holder to burn their own tokens, /// emitting a Transfer event to address(0) as the burn signal. -} \ No newline at end of file +} From 5a0a57b3a323d370458c3687adcbd47dacf41a7c Mon Sep 17 00:00:00 2001 From: Ryan Collins Date: Fri, 10 Oct 2025 07:53:54 -0400 Subject: [PATCH 5/5] fix: decimals -> 6 --- .../src/xYield/{xYieldToken.sol => MintableERC20.sol} | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) rename contracts/src/xYield/{xYieldToken.sol => MintableERC20.sol} (88%) diff --git a/contracts/src/xYield/xYieldToken.sol b/contracts/src/xYield/MintableERC20.sol similarity index 88% rename from contracts/src/xYield/xYieldToken.sol rename to contracts/src/xYield/MintableERC20.sol index 407bf159..c6ecd888 100644 --- a/contracts/src/xYield/xYieldToken.sol +++ b/contracts/src/xYield/MintableERC20.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.30; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -contract XyieldToken is ERC20 { +contract MintableERC20 is ERC20 { address public minter; /// @notice Emitted when the address authorized to mint is updated. @@ -23,6 +23,12 @@ contract XyieldToken is ERC20 { minter = _minter; } + /// @notice Returns the number of decimals used to get its user representation + /// @return The number of decimals + function decimals() public pure override returns (uint8) { + return 6; + } + modifier onlyMinter() { if (msg.sender != minter) revert NotAuthorized(); _;