diff --git a/src/diamond/example/ExampleDiamond.sol b/src/diamond/example/ExampleDiamond.sol index 337ca300..94d52356 100644 --- a/src/diamond/example/ExampleDiamond.sol +++ b/src/diamond/example/ExampleDiamond.sol @@ -41,7 +41,9 @@ contract ExampleDiamond { /** * Setting ERC721 token details */ - ERC721MetadataMod.setMetadata({_name: "ExampleDiamondNFT", _symbol: "EDN", _baseURI: "https://example.com/metadata/"}); + ERC721MetadataMod.setMetadata({ + _name: "ExampleDiamondNFT", _symbol: "EDN", _baseURI: "https://example.com/metadata/" + }); /** * Registering ERC165 interfaces */ diff --git a/src/token/ERC20/Approve/ERC20ApproveMod.sol b/src/token/ERC20/Approve/ERC20ApproveMod.sol index c9eeffe4..de4b310e 100644 --- a/src/token/ERC20/Approve/ERC20ApproveMod.sol +++ b/src/token/ERC20/Approve/ERC20ApproveMod.sol @@ -51,12 +51,14 @@ function getStorage() pure returns (ERC20Storage storage s) { * @dev Sets the allowance for the spender. * @param _spender The address to approve for spending. * @param _value The amount of tokens to approve. + * @return True if the approval was successful. */ -function approve(address _spender, uint256 _value) { +function approve(address _spender, uint256 _value) returns (bool) { if (_spender == address(0)) { revert ERC20InvalidSpender(address(0)); } ERC20Storage storage s = getStorage(); s.allowance[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); + return true; } diff --git a/src/token/ERC20/Transfer/ERC20TransferMod.sol b/src/token/ERC20/Transfer/ERC20TransferMod.sol index f0524297..0d446317 100644 --- a/src/token/ERC20/Transfer/ERC20TransferMod.sol +++ b/src/token/ERC20/Transfer/ERC20TransferMod.sol @@ -94,8 +94,9 @@ function getStorage() pure returns (ERC20Storage storage s) { * @param _from The address to send tokens from. * @param _to The address to send tokens to. * @param _value The number of tokens to transfer. + * @return True if the transfer was successful. */ -function transferFrom(address _from, address _to, uint256 _value) { +function transferFrom(address _from, address _to, uint256 _value) returns (bool) { ERC20Storage storage s = getStorage(); if (_from == address(0)) { revert ERC20InvalidSender(address(0)); @@ -119,6 +120,7 @@ function transferFrom(address _from, address _to, uint256 _value) { } s.balanceOf[_to] += _value; emit Transfer(_from, _to, _value); + return true; } /** @@ -126,8 +128,9 @@ function transferFrom(address _from, address _to, uint256 _value) { * @dev Updates balances directly without allowance mechanism. * @param _to The address to send tokens to. * @param _value The number of tokens to transfer. + * @return True if the transfer was successful. */ -function transfer(address _to, uint256 _value) { +function transfer(address _to, uint256 _value) returns (bool) { ERC20Storage storage s = getStorage(); if (_to == address(0)) { revert ERC20InvalidReceiver(address(0)); @@ -141,5 +144,6 @@ function transfer(address _to, uint256 _value) { } s.balanceOf[_to] += _value; emit Transfer(msg.sender, _to, _value); + return true; } diff --git a/test/Base.t.sol b/test/Base.t.sol index b8f63d3c..7c09900e 100644 --- a/test/Base.t.sol +++ b/test/Base.t.sol @@ -36,9 +36,9 @@ abstract contract Base_Test is Constants, Modifiers, StdAssertions, StdCheats { createTestUsers(); defaults.setUsers(users); - setVariables(defaults, users); // set in modifier contract + setVariables(defaults, users); - setMsgSender(users.alice); // alice default caller + setMsgSender(users.alice); } /*////////////////////////////////////////////////////////////// diff --git a/test/harnesses/token/ERC20/ERC20/ERC20Harness.sol b/test/harnesses/token/ERC20/ERC20/ERC20Harness.sol deleted file mode 100644 index efdb9b55..00000000 --- a/test/harnesses/token/ERC20/ERC20/ERC20Harness.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.30; - -/* Compose - * https://compose.diamonds - */ - -import "src/token/ERC20/ERC20/ERC20Mod.sol" as ERC20Mod; - -/** - * @title ERC20Harness - * @notice Test harness that exposes LibERC20's internal functions as external - * @dev Required for testing since LibERC20 only has internal functions - */ -contract ERC20Harness { - /** - * @notice Exposes ERC20Mod.mint as an external function - */ - function mint(address _account, uint256 _value) external { - ERC20Mod.mint(_account, _value); - } - - /** - * @notice Exposes ERC20Mod.burn as an external function - */ - function burn(address _account, uint256 _value) external { - ERC20Mod.burn(_account, _value); - } - - /** - * @notice Exposes ERC20Mod.transferFrom as an external function - */ - function transferFrom(address _from, address _to, uint256 _value) external returns (bool) { - return ERC20Mod.transferFrom(_from, _to, _value); - } - - /** - * @notice Exposes ERC20Mod.transfer as an external function - */ - function transfer(address _to, uint256 _value) external returns (bool) { - return ERC20Mod.transfer(_to, _value); - } - - /** - * @notice Exposes ERC20Mod.approve as an external function - */ - function approve(address _spender, uint256 _value) external returns (bool) { - return ERC20Mod.approve(_spender, _value); - } - - function totalSupply() external view returns (uint256) { - return ERC20Mod.getStorage().totalSupply; - } - - function balanceOf(address _account) external view returns (uint256) { - return ERC20Mod.getStorage().balanceOf[_account]; - } - - function allowance(address _owner, address _spender) external view returns (uint256) { - return ERC20Mod.getStorage().allowance[_owner][_spender]; - } -} diff --git a/test/harnesses/token/ERC20/ERC20/ERC20MetadataFacetHarness.sol b/test/harnesses/token/ERC20/ERC20/ERC20MetadataFacetHarness.sol deleted file mode 100644 index 9c8366e1..00000000 --- a/test/harnesses/token/ERC20/ERC20/ERC20MetadataFacetHarness.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.30; - -/* Compose - * https://compose.diamonds - */ - -import {ERC20MetadataFacet} from "src/token/ERC20/ERC20/ERC20MetadataFacet.sol"; - -/** - * @title ERC20MetadataFacetHarness - * @notice Test harness for ERC20MetadataFacet that adds initialization for testing - */ -contract ERC20MetadataFacetHarness is ERC20MetadataFacet { - /** - * @notice Initialize the ERC20 metadata storage - * @dev Only used for testing - production diamonds should initialize in constructor - */ - function initialize(string memory _name, string memory _symbol, uint8 _decimals) external { - ERC20MetadataStorage storage s = getStorage(); - s.name = _name; - s.symbol = _symbol; - s.decimals = _decimals; - } -} diff --git a/test/harnesses/token/ERC20/ERC20ApproveModHarness.sol b/test/harnesses/token/ERC20/ERC20ApproveModHarness.sol new file mode 100644 index 00000000..e17eb340 --- /dev/null +++ b/test/harnesses/token/ERC20/ERC20ApproveModHarness.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.30; + +/* Compose + * https://compose.diamonds + */ + +import "src/token/ERC20/Approve/ERC20ApproveMod.sol" as ERC20ApproveMod; + +/** + * @title ERC20ApproveModHarness + * @notice Test harness that exposes ERC20ApproveMod functions as external + */ +contract ERC20ApproveModHarness { + /** + * @notice Exposes ERC20ApproveMod.approve as an external function + */ + function approve(address _spender, uint256 _value) external returns (bool) { + return ERC20ApproveMod.approve(_spender, _value); + } +} diff --git a/test/harnesses/token/ERC20/ERC20BurnModHarness.sol b/test/harnesses/token/ERC20/ERC20BurnModHarness.sol new file mode 100644 index 00000000..13910348 --- /dev/null +++ b/test/harnesses/token/ERC20/ERC20BurnModHarness.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.30; + +/* Compose + * https://compose.diamonds + */ + +import "src/token/ERC20/Burn/ERC20BurnMod.sol" as ERC20BurnMod; + +/** + * @title ERC20BurnModHarness + * @notice Test harness that exposes ERC20BurnMod functions as external + */ +contract ERC20BurnModHarness { + /** + * @notice Exposes ERC20BurnMod.burnERC20 as an external function + */ + function burn(address _account, uint256 _value) external { + ERC20BurnMod.burnERC20(_account, _value); + } +} diff --git a/test/harnesses/token/ERC20/ERC20MintModHarness.sol b/test/harnesses/token/ERC20/ERC20MintModHarness.sol new file mode 100644 index 00000000..41686090 --- /dev/null +++ b/test/harnesses/token/ERC20/ERC20MintModHarness.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.30; + +/* Compose + * https://compose.diamonds + */ + +import "src/token/ERC20/Mint/ERC20MintMod.sol" as ERC20MintMod; + +/** + * @title ERC20MintModHarness + * @notice Test harness that exposes ERC20MintMod functions as external + */ +contract ERC20MintModHarness { + /** + * @notice Exposes ERC20Mod.mintERC20 as an external function + */ + function mint(address _account, uint256 _value) external { + ERC20MintMod.mintERC20(_account, _value); + } +} diff --git a/test/harnesses/token/ERC20/ERC20TransferModHarness.sol b/test/harnesses/token/ERC20/ERC20TransferModHarness.sol new file mode 100644 index 00000000..e2550867 --- /dev/null +++ b/test/harnesses/token/ERC20/ERC20TransferModHarness.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.30; + +/* Compose + * https://compose.diamonds + */ + +import "src/token/ERC20/Transfer/ERC20TransferMod.sol" as ERC20TransferMod; + +/** + * @title ERC20TransferModHarness + * @notice Test harness that exposes ERC20TransferMod functions as external + */ +contract ERC20TransferModHarness { + /** + * @notice Exposes ERC20TransferMod.transferFrom as an external function + */ + function transferFrom(address _from, address _to, uint256 _value) external returns (bool) { + return ERC20TransferMod.transferFrom(_from, _to, _value); + } + + /** + * @notice Exposes ERC20TransferMod.transfer as an external function + */ + function transfer(address _to, uint256 _value) external returns (bool) { + return ERC20TransferMod.transfer(_to, _value); + } +} diff --git a/test/token/ERC20/ERC20/ERC20BurnFacet.t.sol b/test/token/ERC20/ERC20/ERC20BurnFacet similarity index 100% rename from test/token/ERC20/ERC20/ERC20BurnFacet.t.sol rename to test/token/ERC20/ERC20/ERC20BurnFacet diff --git a/test/token/ERC20/ERC20/ERC20PermitFacet.t.sol b/test/token/ERC20/ERC20/ERC20PermitFacet similarity index 100% rename from test/token/ERC20/ERC20/ERC20PermitFacet.t.sol rename to test/token/ERC20/ERC20/ERC20PermitFacet diff --git a/test/token/ERC20/ERC20/harnesses/ERC20BurnFacetHarness.sol b/test/token/ERC20/ERC20/harnesses/ERC20BurnFacetHarness similarity index 100% rename from test/token/ERC20/ERC20/harnesses/ERC20BurnFacetHarness.sol rename to test/token/ERC20/ERC20/harnesses/ERC20BurnFacetHarness diff --git a/test/token/ERC20/ERC20/harnesses/ERC20PermitFacetHarness.sol b/test/token/ERC20/ERC20/harnesses/ERC20PermitFacetHarness similarity index 100% rename from test/token/ERC20/ERC20/harnesses/ERC20PermitFacetHarness.sol rename to test/token/ERC20/ERC20/harnesses/ERC20PermitFacetHarness diff --git a/test/token/ERC20/ERC20Bridgeble/ERC20Bridgeable.t.sol b/test/token/ERC20/ERC20Bridgeble/ERC20Bridgeable similarity index 100% rename from test/token/ERC20/ERC20Bridgeble/ERC20Bridgeable.t.sol rename to test/token/ERC20/ERC20Bridgeble/ERC20Bridgeable diff --git a/test/token/ERC20/ERC20Bridgeble/ERC20BridgeableFacet.t.sol b/test/token/ERC20/ERC20Bridgeble/ERC20BridgeableFacet similarity index 100% rename from test/token/ERC20/ERC20Bridgeble/ERC20BridgeableFacet.t.sol rename to test/token/ERC20/ERC20Bridgeble/ERC20BridgeableFacet diff --git a/test/token/ERC20/ERC20Bridgeble/harnesses/ERC20BridgeableHarness.sol b/test/token/ERC20/ERC20Bridgeble/harnesses/ERC20BridgeableHarness similarity index 100% rename from test/token/ERC20/ERC20Bridgeble/harnesses/ERC20BridgeableHarness.sol rename to test/token/ERC20/ERC20Bridgeble/harnesses/ERC20BridgeableHarness diff --git a/test/token/ERC721/ERC721/ERC721.t.sol b/test/token/ERC721/ERC721/ERC721 similarity index 100% rename from test/token/ERC721/ERC721/ERC721.t.sol rename to test/token/ERC721/ERC721/ERC721 diff --git a/test/token/ERC721/ERC721/ERC721BurnFacet.t.sol b/test/token/ERC721/ERC721/ERC721BurnFacet similarity index 100% rename from test/token/ERC721/ERC721/ERC721BurnFacet.t.sol rename to test/token/ERC721/ERC721/ERC721BurnFacet diff --git a/test/token/ERC721/ERC721/ERC721Facet.t.sol b/test/token/ERC721/ERC721/ERC721Facet similarity index 100% rename from test/token/ERC721/ERC721/ERC721Facet.t.sol rename to test/token/ERC721/ERC721/ERC721Facet diff --git a/test/token/ERC721/ERC721/harnesses/ERC721BurnFacetHarness.sol b/test/token/ERC721/ERC721/harnesses/ERC721BurnFacetHarness similarity index 100% rename from test/token/ERC721/ERC721/harnesses/ERC721BurnFacetHarness.sol rename to test/token/ERC721/ERC721/harnesses/ERC721BurnFacetHarness diff --git a/test/token/ERC721/ERC721/harnesses/ERC721FacetHarness.sol b/test/token/ERC721/ERC721/harnesses/ERC721FacetHarness similarity index 100% rename from test/token/ERC721/ERC721/harnesses/ERC721FacetHarness.sol rename to test/token/ERC721/ERC721/harnesses/ERC721FacetHarness diff --git a/test/token/ERC721/ERC721/harnesses/ERC721Harness.sol b/test/token/ERC721/ERC721/harnesses/ERC721Harness similarity index 100% rename from test/token/ERC721/ERC721/harnesses/ERC721Harness.sol rename to test/token/ERC721/ERC721/harnesses/ERC721Harness diff --git a/test/token/ERC721/ERC721Enumerable/ERC721Enumerable.t.sol b/test/token/ERC721/ERC721Enumerable/ERC721Enumerable similarity index 100% rename from test/token/ERC721/ERC721Enumerable/ERC721Enumerable.t.sol rename to test/token/ERC721/ERC721Enumerable/ERC721Enumerable diff --git a/test/token/ERC721/ERC721Enumerable/ERC721EnumerableBurnFacet.t.sol b/test/token/ERC721/ERC721Enumerable/ERC721EnumerableBurnFacet similarity index 100% rename from test/token/ERC721/ERC721Enumerable/ERC721EnumerableBurnFacet.t.sol rename to test/token/ERC721/ERC721Enumerable/ERC721EnumerableBurnFacet diff --git a/test/token/ERC721/ERC721Enumerable/ERC721EnumerableFacet.t.sol b/test/token/ERC721/ERC721Enumerable/ERC721EnumerableFacet similarity index 100% rename from test/token/ERC721/ERC721Enumerable/ERC721EnumerableFacet.t.sol rename to test/token/ERC721/ERC721Enumerable/ERC721EnumerableFacet diff --git a/test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableBurnFacetHarness.sol b/test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableBurnFacetHarness similarity index 100% rename from test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableBurnFacetHarness.sol rename to test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableBurnFacetHarness diff --git a/test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableFacetHarness.sol b/test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableFacetHarness similarity index 100% rename from test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableFacetHarness.sol rename to test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableFacetHarness diff --git a/test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableHarness.sol b/test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableHarness similarity index 100% rename from test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableHarness.sol rename to test/token/ERC721/ERC721Enumerable/harnesses/ERC721EnumerableHarness diff --git a/test/unit/token/ERC20/Approve/facet/fuzz/approve.t.sol b/test/unit/token/ERC20/Approve/facet/fuzz/approve.t.sol new file mode 100644 index 00000000..84b65f22 --- /dev/null +++ b/test/unit/token/ERC20/Approve/facet/fuzz/approve.t.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.30; + +/* Compose + * https://compose.diamonds + */ + +import {stdError} from "forge-std/StdError.sol"; +import {Base_Test} from "test/Base.t.sol"; +import {ERC20StorageUtils} from "test/utils/storage/ERC20StorageUtils.sol"; + +import {ERC20ApproveFacet} from "src/token/ERC20/Approve/ERC20ApproveFacet.sol"; + +/** + * @dev BTT spec: test/trees/ERC20.tree + */ +contract Approve_ERC20ApproveFacet_Fuzz_Unit_Test is Base_Test { + using ERC20StorageUtils for address; + + ERC20ApproveFacet internal facet; + + function setUp() public virtual override { + Base_Test.setUp(); + facet = new ERC20ApproveFacet(); + vm.label(address(facet), "ERC20ApproveFacet"); + } + + function testFuzz_ShouldRevert_SpenderIsZeroAddress(uint256 value) external { + vm.expectRevert(abi.encodeWithSelector(ERC20ApproveFacet.ERC20InvalidSpender.selector, ADDRESS_ZERO)); + facet.approve(ADDRESS_ZERO, value); + } + + function testFuzz_Approve(address spender, uint256 value) external whenSpenderNotZeroAddress { + vm.assume(spender != ADDRESS_ZERO); + + vm.expectEmit(address(facet)); + emit ERC20ApproveFacet.Approval(users.alice, spender, value); + bool result = facet.approve(spender, value); + + assertEq(result, true, "approve failed"); + assertEq(address(facet).allowance(users.alice, spender), value); + } +} + diff --git a/test/unit/token/ERC20/ERC20/mod/fuzz/approve.t.sol b/test/unit/token/ERC20/Approve/mod/fuzz/approve.t.sol similarity index 64% rename from test/unit/token/ERC20/ERC20/mod/fuzz/approve.t.sol rename to test/unit/token/ERC20/Approve/mod/fuzz/approve.t.sol index 582b414a..bf2394e4 100644 --- a/test/unit/token/ERC20/ERC20/mod/fuzz/approve.t.sol +++ b/test/unit/token/ERC20/Approve/mod/fuzz/approve.t.sol @@ -7,19 +7,22 @@ pragma solidity >=0.8.30; import {stdError} from "forge-std/StdError.sol"; import {Base_Test} from "test/Base.t.sol"; -import {ERC20Harness} from "test/harnesses/token/ERC20/ERC20/ERC20Harness.sol"; +import {ERC20StorageUtils} from "test/utils/storage/ERC20StorageUtils.sol"; +import {ERC20ApproveModHarness} from "test/harnesses/token/ERC20/ERC20ApproveModHarness.sol"; -import "src/token/ERC20/ERC20/ERC20Mod.sol"; +import "src/token/ERC20/Approve/ERC20ApproveMod.sol"; /** * @dev BTT spec: test/trees/ERC20.tree */ -contract Approve_ERC20Mod_Fuzz_Unit_Test is Base_Test { - ERC20Harness internal harness; +contract Approve_ERC20ApproveMod_Fuzz_Unit_Test is Base_Test { + using ERC20StorageUtils for address; + + ERC20ApproveModHarness internal harness; function setUp() public override { Base_Test.setUp(); - harness = new ERC20Harness(); + harness = new ERC20ApproveModHarness(); } function testFuzz_ShouldRevert_SpenderIsZeroAddress(uint256 value) external { @@ -35,6 +38,6 @@ contract Approve_ERC20Mod_Fuzz_Unit_Test is Base_Test { bool result = harness.approve(spender, value); assertEq(result, true, "approve failed"); - assertEq(harness.allowance(users.alice, spender), value); + assertEq(address(harness).allowance(users.alice, spender), value); } } diff --git a/test/unit/token/ERC20/ERC20/mod/fuzz/burn.t.sol b/test/unit/token/ERC20/Burn/mod/fuzz/burn.t.sol similarity index 61% rename from test/unit/token/ERC20/ERC20/mod/fuzz/burn.t.sol rename to test/unit/token/ERC20/Burn/mod/fuzz/burn.t.sol index 42b5e9d2..b7bf369f 100644 --- a/test/unit/token/ERC20/ERC20/mod/fuzz/burn.t.sol +++ b/test/unit/token/ERC20/Burn/mod/fuzz/burn.t.sol @@ -7,19 +7,23 @@ pragma solidity >=0.8.30; import {stdError} from "forge-std/StdError.sol"; import {Base_Test} from "test/Base.t.sol"; -import {ERC20Harness} from "test/harnesses/token/ERC20/ERC20/ERC20Harness.sol"; +import {ERC20StorageUtils} from "test/utils/storage/ERC20StorageUtils.sol"; +import {ERC20BurnModHarness} from "test/harnesses/token/ERC20/ERC20BurnModHarness.sol"; -import "src/token/ERC20/ERC20/ERC20Mod.sol"; +import "src/token/ERC20/Burn/ERC20BurnMod.sol"; /** * @dev BTT spec: test/trees/ERC20.tree */ -contract Burn_ERC20Mod_Fuzz_Unit_Test is Base_Test { - ERC20Harness internal harness; +contract Burn_ERC20BurnMod_Fuzz_Unit_Test is Base_Test { + using ERC20StorageUtils for address; + + ERC20BurnModHarness internal harness; function setUp() public override { Base_Test.setUp(); - harness = new ERC20Harness(); + harness = new ERC20BurnModHarness(); + vm.label(address(harness), "ERC20BurnModHarness"); } function testFuzz_ShouldRevert_Account_ZeroAddress(uint256 value) external { @@ -35,7 +39,7 @@ contract Burn_ERC20Mod_Fuzz_Unit_Test is Base_Test { vm.assume(balance < MAX_UINT256); value = bound(value, balance + 1, MAX_UINT256); - harness.mint(account, balance); + address(harness).mint(account, balance); vm.expectRevert(abi.encodeWithSelector(ERC20InsufficientBalance.selector, account, balance, value)); harness.burn(account, value); @@ -50,16 +54,16 @@ contract Burn_ERC20Mod_Fuzz_Unit_Test is Base_Test { balance = bound(balance, 1, MAX_UINT256); value = bound(value, 1, balance); - harness.mint(account, balance); + address(harness).mint(account, balance); - uint256 beforeTotalSupply = harness.totalSupply(); - uint256 beforeBalanceOfAccount = harness.balanceOf(account); + uint256 beforeTotalSupply = address(harness).totalSupply(); + uint256 beforeBalanceOfAccount = address(harness).balanceOf(account); vm.expectEmit(address(harness)); emit Transfer(account, ADDRESS_ZERO, value); harness.burn(account, value); - assertEq(harness.totalSupply(), beforeTotalSupply - value, "totalSupply"); - assertEq(harness.balanceOf(account), beforeBalanceOfAccount - value, "balanceOf(account)"); + assertEq(address(harness).totalSupply(), beforeTotalSupply - value, "totalSupply"); + assertEq(address(harness).balanceOf(account), beforeBalanceOfAccount - value, "balanceOf(account)"); } } diff --git a/test/unit/token/ERC20/ERC20/transfer-facet/fuzz/approve.t.sol b/test/unit/token/ERC20/ERC20/transfer-facet/fuzz/approve.t.sol deleted file mode 100644 index a0e7b7f1..00000000 --- a/test/unit/token/ERC20/ERC20/transfer-facet/fuzz/approve.t.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.30; - -/* Compose - * https://compose.diamonds - */ - -import {stdError} from "forge-std/StdError.sol"; -import {ERC20TransferFacet_Base_Test} from "../ERC20TransferFacetBase.t.sol"; - -import {ERC20TransferFacet} from "src/token/ERC20/ERC20/ERC20TransferFacet.sol"; - -/** - * @dev BTT spec: test/trees/ERC20.tree - */ -contract Approve_ERC20TransferFacet_Fuzz_Unit_Test is ERC20TransferFacet_Base_Test { - function testFuzz_ShouldRevert_SpenderIsZeroAddress(uint256 value) external { - vm.expectRevert(abi.encodeWithSelector(ERC20TransferFacet.ERC20InvalidSpender.selector, ADDRESS_ZERO)); - facet.approve(ADDRESS_ZERO, value); - } - - function testFuzz_Approve(address spender, uint256 value) external whenSpenderNotZeroAddress { - vm.assume(spender != ADDRESS_ZERO); - - vm.expectEmit(address(facet)); - emit ERC20TransferFacet.Approval(users.alice, spender, value); - bool result = facet.approve(spender, value); - - assertEq(result, true, "approve failed"); - assertEq(facet.allowance(users.alice, spender), value); - } -} diff --git a/test/unit/token/ERC20/ERC20/mod/fuzz/mint.t.sol b/test/unit/token/ERC20/Mint/mod/fuzz/mint.t.sol similarity index 60% rename from test/unit/token/ERC20/ERC20/mod/fuzz/mint.t.sol rename to test/unit/token/ERC20/Mint/mod/fuzz/mint.t.sol index 4d58f9d4..ab53f7a2 100644 --- a/test/unit/token/ERC20/ERC20/mod/fuzz/mint.t.sol +++ b/test/unit/token/ERC20/Mint/mod/fuzz/mint.t.sol @@ -7,19 +7,23 @@ pragma solidity >=0.8.30; import {stdError} from "forge-std/StdError.sol"; import {Base_Test} from "test/Base.t.sol"; -import {ERC20Harness} from "test/harnesses/token/ERC20/ERC20/ERC20Harness.sol"; +import {ERC20StorageUtils} from "test/utils/storage/ERC20StorageUtils.sol"; +import {ERC20MintModHarness} from "test/harnesses/token/ERC20/ERC20MintModHarness.sol"; -import "src/token/ERC20/ERC20/ERC20Mod.sol"; +import "src/token/ERC20/Mint/ERC20MintMod.sol"; /** * @dev BTT spec: test/trees/ERC20.tree */ -contract Mint_ERC20Mod_Fuzz_Unit_Test is Base_Test { - ERC20Harness internal harness; +contract Mint_ERC20MintMod_Fuzz_Unit_Test is Base_Test { + using ERC20StorageUtils for address; + + ERC20MintModHarness internal harness; function setUp() public override { Base_Test.setUp(); - harness = new ERC20Harness(); + harness = new ERC20MintModHarness(); + vm.label(address(harness), "ERC20MintModHarness"); } function testFuzz_ShouldRevert_Account_ZeroAddress(uint256 value) external { @@ -47,14 +51,14 @@ contract Mint_ERC20Mod_Fuzz_Unit_Test is Base_Test { { vm.assume(account != ADDRESS_ZERO); - uint256 beforeTotalSupply = harness.totalSupply(); - uint256 beforeBalanceOfAccount = harness.balanceOf(account); + uint256 beforeTotalSupply = address(harness).totalSupply(); + uint256 beforeBalanceOfAccount = address(harness).balanceOf(account); vm.expectEmit(address(harness)); emit Transfer(ADDRESS_ZERO, account, value); harness.mint(account, value); - assertEq(harness.totalSupply(), beforeTotalSupply + value, "totalSupply"); - assertEq(harness.balanceOf(account), beforeBalanceOfAccount + value, "balanceOf(account)"); + assertEq(address(harness).totalSupply(), beforeTotalSupply + value, "totalSupply"); + assertEq(address(harness).balanceOf(account), beforeBalanceOfAccount + value, "balanceOf(account)"); } } diff --git a/test/unit/token/ERC20/ERC20/transfer-facet/ERC20TransferFacetBase.t.sol b/test/unit/token/ERC20/Transfer/facet/ERC20TransferFacetBase.t.sol similarity index 83% rename from test/unit/token/ERC20/ERC20/transfer-facet/ERC20TransferFacetBase.t.sol rename to test/unit/token/ERC20/Transfer/facet/ERC20TransferFacetBase.t.sol index 1e02d64c..14dc671e 100644 --- a/test/unit/token/ERC20/ERC20/transfer-facet/ERC20TransferFacetBase.t.sol +++ b/test/unit/token/ERC20/Transfer/facet/ERC20TransferFacetBase.t.sol @@ -6,7 +6,7 @@ pragma solidity >=0.8.30 <0.9.0; */ import {Base_Test} from "test/Base.t.sol"; -import {ERC20TransferFacet} from "src/token/ERC20/ERC20/ERC20TransferFacet.sol"; +import {ERC20TransferFacet} from "src/token/ERC20/Transfer/ERC20TransferFacet.sol"; contract ERC20TransferFacet_Base_Test is Base_Test { ERC20TransferFacet internal facet; diff --git a/test/unit/token/ERC20/ERC20/transfer-facet/fuzz/transfer.t.sol b/test/unit/token/ERC20/Transfer/facet/fuzz/transfer.t.sol similarity index 80% rename from test/unit/token/ERC20/ERC20/transfer-facet/fuzz/transfer.t.sol rename to test/unit/token/ERC20/Transfer/facet/fuzz/transfer.t.sol index fb5f58da..638d8e58 100644 --- a/test/unit/token/ERC20/ERC20/transfer-facet/fuzz/transfer.t.sol +++ b/test/unit/token/ERC20/Transfer/facet/fuzz/transfer.t.sol @@ -8,7 +8,7 @@ pragma solidity >=0.8.30; import {ERC20TransferFacet_Base_Test} from "../ERC20TransferFacetBase.t.sol"; import {ERC20StorageUtils} from "test/utils/storage/ERC20StorageUtils.sol"; -import {ERC20TransferFacet} from "src/token/ERC20/ERC20/ERC20TransferFacet.sol"; +import {ERC20TransferFacet} from "src/token/ERC20/Transfer/ERC20TransferFacet.sol"; /** * @dev BTT spec: test/trees/ERC20.tree @@ -56,8 +56,8 @@ contract Transfer_ERC20TransferFacet_Fuzz_Unit_Test is ERC20TransferFacet_Base_T bool result = facet.transfer(to, 0); assertEq(result, true, "transfer failed"); - assertEq(facet.balanceOf(users.alice), senderBalance, "balanceOf(users.alice)"); - assertEq(facet.balanceOf(to), receiverBalance, "balanceOf(to)"); + assertEq(address(facet).balanceOf(users.alice), senderBalance, "balanceOf(users.alice)"); + assertEq(address(facet).balanceOf(to), receiverBalance, "balanceOf(to)"); } function testFuzz_Transfer(address to, uint256 balance, uint256 value) @@ -72,15 +72,15 @@ contract Transfer_ERC20TransferFacet_Fuzz_Unit_Test is ERC20TransferFacet_Base_T address(facet).mint(users.alice, balance); - uint256 beforeBalanceOfAlice = facet.balanceOf(users.alice); - uint256 beforeBalanceOfTo = facet.balanceOf(to); + uint256 beforeBalanceOfAlice = address(facet).balanceOf(users.alice); + uint256 beforeBalanceOfTo = address(facet).balanceOf(to); vm.expectEmit(address(facet)); emit ERC20TransferFacet.Transfer(users.alice, to, value); bool result = facet.transfer(to, value); assertEq(result, true, "transfer failed"); - assertEq(facet.balanceOf(users.alice), beforeBalanceOfAlice - value, "balanceOf(users.alice)"); - assertEq(facet.balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); + assertEq(address(facet).balanceOf(users.alice), beforeBalanceOfAlice - value, "balanceOf(users.alice)"); + assertEq(address(facet).balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); } } diff --git a/test/unit/token/ERC20/ERC20/transfer-facet/fuzz/transferFrom.t.sol b/test/unit/token/ERC20/Transfer/facet/fuzz/transferFrom.t.sol similarity index 77% rename from test/unit/token/ERC20/ERC20/transfer-facet/fuzz/transferFrom.t.sol rename to test/unit/token/ERC20/Transfer/facet/fuzz/transferFrom.t.sol index 07fcc5d9..edf4a8b4 100644 --- a/test/unit/token/ERC20/ERC20/transfer-facet/fuzz/transferFrom.t.sol +++ b/test/unit/token/ERC20/Transfer/facet/fuzz/transferFrom.t.sol @@ -8,7 +8,7 @@ pragma solidity >=0.8.30; import {ERC20TransferFacet_Base_Test} from "../ERC20TransferFacetBase.t.sol"; import {ERC20StorageUtils} from "test/utils/storage/ERC20StorageUtils.sol"; -import {ERC20TransferFacet} from "src/token/ERC20/ERC20/ERC20TransferFacet.sol"; +import {ERC20TransferFacet} from "src/token/ERC20/Transfer/ERC20TransferFacet.sol"; /** * @dev BTT spec: test/trees/ERC20.tree @@ -41,8 +41,7 @@ contract TransferFrom_ERC20TransferFacet_Fuzz_Unit_Test is ERC20TransferFacet_Ba allowance = bound(allowance, 0, MAX_UINT256 - 1); value = bound(value, allowance + 1, MAX_UINT256); - setMsgSender(from); - facet.approve(users.sender, allowance); + address(facet).setAllowance(from, users.sender, allowance); setMsgSender(users.sender); vm.expectRevert( @@ -68,9 +67,7 @@ contract TransferFrom_ERC20TransferFacet_Fuzz_Unit_Test is ERC20TransferFacet_Ba balance = bound(balance, 0, value - 1); // balance < value address(facet).mint(from, balance); - - setMsgSender(from); - facet.approve(users.sender, allowance); + address(facet).setAllowance(from, users.sender, allowance); setMsgSender(users.sender); vm.expectRevert( @@ -104,20 +101,18 @@ contract TransferFrom_ERC20TransferFacet_Fuzz_Unit_Test is ERC20TransferFacet_Ba address(facet).mint(from, fromBalance); address(facet).mint(to, toBalance); - setMsgSender(from); - facet.approve(users.sender, allowance); - setMsgSender(users.sender); + address(facet).setAllowance(from, users.sender, allowance); - uint256 beforeAllowance = facet.allowance(from, users.sender); + uint256 beforeAllowance = address(facet).allowance(from, users.sender); vm.expectEmit(address(facet)); emit ERC20TransferFacet.Transfer(from, to, 0); bool result = facet.transferFrom(from, to, 0); assertEq(result, true, "transferFrom failed"); - assertEq(facet.balanceOf(from), fromBalance, "balanceOf(from)"); - assertEq(facet.balanceOf(to), toBalance, "balanceOf(to)"); - assertEq(facet.allowance(from, users.sender), beforeAllowance, "allowance should be unchanged"); + assertEq(address(facet).balanceOf(from), fromBalance, "balanceOf(from)"); + assertEq(address(facet).balanceOf(to), toBalance, "balanceOf(to)"); + assertEq(address(facet).allowance(from, users.sender), beforeAllowance, "allowance should be unchanged"); } function testFuzz_TransferFrom_InfiniteApproval(address from, address to, uint256 value, uint256 balance) @@ -136,21 +131,19 @@ contract TransferFrom_ERC20TransferFacet_Fuzz_Unit_Test is ERC20TransferFacet_Ba balance = bound(balance, value, MAX_UINT256); address(facet).mint(from, balance); - - setMsgSender(from); - facet.approve(users.sender, MAX_UINT256); + address(facet).setAllowance(from, users.sender, MAX_UINT256); setMsgSender(users.sender); - uint256 beforeBalanceOfFrom = facet.balanceOf(from); - uint256 beforeBalanceOfTo = facet.balanceOf(to); + uint256 beforeBalanceOfFrom = address(facet).balanceOf(from); + uint256 beforeBalanceOfTo = address(facet).balanceOf(to); vm.expectEmit(address(facet)); emit ERC20TransferFacet.Transfer(from, to, value); bool result = facet.transferFrom(from, to, value); assertEq(result, true, "transfer failed"); - assertEq(facet.balanceOf(from), beforeBalanceOfFrom - value, "balanceOf(from)"); - assertEq(facet.balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); + assertEq(address(facet).balanceOf(from), beforeBalanceOfFrom - value, "balanceOf(from)"); + assertEq(address(facet).balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); } function testFuzz_TransferFrom(address from, address to, uint256 value, uint256 allowance, uint256 balance) @@ -170,21 +163,19 @@ contract TransferFrom_ERC20TransferFacet_Fuzz_Unit_Test is ERC20TransferFacet_Ba balance = bound(balance, value, MAX_UINT256); address(facet).mint(from, balance); - - setMsgSender(from); - facet.approve(users.sender, allowance); + address(facet).setAllowance(from, users.sender, allowance); setMsgSender(users.sender); - uint256 beforeBalanceOfFrom = facet.balanceOf(from); - uint256 beforeBalanceOfTo = facet.balanceOf(to); + uint256 beforeBalanceOfFrom = address(facet).balanceOf(from); + uint256 beforeBalanceOfTo = address(facet).balanceOf(to); vm.expectEmit(address(facet)); emit ERC20TransferFacet.Transfer(from, to, value); bool result = facet.transferFrom(from, to, value); assertEq(result, true, "transfer failed"); - assertEq(facet.balanceOf(from), beforeBalanceOfFrom - value, "balanceOf(from)"); - assertEq(facet.balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); - assertEq(facet.allowance(from, users.sender), allowance - value, "allowance(from, users.sender)"); + assertEq(address(facet).balanceOf(from), beforeBalanceOfFrom - value, "balanceOf(from)"); + assertEq(address(facet).balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); + assertEq(address(facet).allowance(from, users.sender), allowance - value, "allowance(from, users.sender)"); } } diff --git a/test/unit/token/ERC20/Transfer/mod/ERC20TransferModBase.t.sol b/test/unit/token/ERC20/Transfer/mod/ERC20TransferModBase.t.sol new file mode 100644 index 00000000..26974e48 --- /dev/null +++ b/test/unit/token/ERC20/Transfer/mod/ERC20TransferModBase.t.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.30 <0.9.0; + +/* Compose + * https://compose.diamonds + */ + +import {Base_Test} from "test/Base.t.sol"; +import {ERC20TransferModHarness} from "test/harnesses/token/ERC20/ERC20TransferModHarness.sol"; + +contract ERC20TransferMod_Base_Test is Base_Test { + ERC20TransferModHarness internal harness; + + function setUp() public virtual override { + Base_Test.setUp(); + harness = new ERC20TransferModHarness(); + vm.label(address(harness), "ERC20TransferModHarness"); + } +} diff --git a/test/unit/token/ERC20/ERC20/mod/fuzz/transfer.t.sol b/test/unit/token/ERC20/Transfer/mod/fuzz/transfer.t.sol similarity index 64% rename from test/unit/token/ERC20/ERC20/mod/fuzz/transfer.t.sol rename to test/unit/token/ERC20/Transfer/mod/fuzz/transfer.t.sol index 1c111a3f..b253f068 100644 --- a/test/unit/token/ERC20/ERC20/mod/fuzz/transfer.t.sol +++ b/test/unit/token/ERC20/Transfer/mod/fuzz/transfer.t.sol @@ -6,21 +6,16 @@ pragma solidity >=0.8.30; */ import {stdError} from "forge-std/StdError.sol"; -import {Base_Test} from "test/Base.t.sol"; -import {ERC20Harness} from "test/harnesses/token/ERC20/ERC20/ERC20Harness.sol"; +import {ERC20TransferMod_Base_Test} from "../ERC20TransferModBase.t.sol"; +import {ERC20StorageUtils} from "test/utils/storage/ERC20StorageUtils.sol"; -import "src/token/ERC20/ERC20/ERC20Mod.sol"; +import "src/token/ERC20/Transfer/ERC20TransferMod.sol"; /** * @dev BTT spec: test/trees/ERC20.tree */ -contract Transfer_ERC20Mod_Fuzz_Unit_Test is Base_Test { - ERC20Harness internal harness; - - function setUp() public override { - Base_Test.setUp(); - harness = new ERC20Harness(); - } +contract Transfer_ERC20TransferMod_Fuzz_Unit_Test is ERC20TransferMod_Base_Test { + using ERC20StorageUtils for address; function testFuzz_ShouldRevert_ReceiverIsZeroAddress(uint256 value) external { vm.expectRevert(abi.encodeWithSelector(ERC20InvalidReceiver.selector, ADDRESS_ZERO)); @@ -35,7 +30,7 @@ contract Transfer_ERC20Mod_Fuzz_Unit_Test is Base_Test { vm.assume(balance < MAX_UINT256); value = bound(value, balance + 1, MAX_UINT256); - harness.mint(users.alice, balance); + address(harness).mint(users.alice, balance); vm.expectRevert(abi.encodeWithSelector(ERC20InsufficientBalance.selector, users.alice, balance, value)); harness.transfer(to, value); @@ -51,17 +46,17 @@ contract Transfer_ERC20Mod_Fuzz_Unit_Test is Base_Test { balance = bound(balance, 1, MAX_UINT256); value = bound(value, 1, balance); - harness.mint(users.alice, balance); + address(harness).mint(users.alice, balance); - uint256 beforeBalanceOfAlice = harness.balanceOf(users.alice); - uint256 beforeBalanceOfTo = harness.balanceOf(to); + uint256 beforeBalanceOfAlice = address(harness).balanceOf(users.alice); + uint256 beforeBalanceOfTo = address(harness).balanceOf(to); vm.expectEmit(address(harness)); emit Transfer(users.alice, to, value); bool result = harness.transfer(to, value); assertEq(result, true, "transfer failed"); - assertEq(harness.balanceOf(users.alice), beforeBalanceOfAlice - value, "balanceOf(users.alice)"); - assertEq(harness.balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); + assertEq(address(harness).balanceOf(users.alice), beforeBalanceOfAlice - value, "balanceOf(users.alice)"); + assertEq(address(harness).balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); } } diff --git a/test/unit/token/ERC20/ERC20/mod/fuzz/transferFrom.t.sol b/test/unit/token/ERC20/Transfer/mod/fuzz/transferFrom.t.sol similarity index 71% rename from test/unit/token/ERC20/ERC20/mod/fuzz/transferFrom.t.sol rename to test/unit/token/ERC20/Transfer/mod/fuzz/transferFrom.t.sol index 167a543c..c8cb1792 100644 --- a/test/unit/token/ERC20/ERC20/mod/fuzz/transferFrom.t.sol +++ b/test/unit/token/ERC20/Transfer/mod/fuzz/transferFrom.t.sol @@ -6,21 +6,16 @@ pragma solidity >=0.8.30; */ import {stdError} from "forge-std/StdError.sol"; -import {Base_Test} from "test/Base.t.sol"; -import {ERC20Harness} from "test/harnesses/token/ERC20/ERC20/ERC20Harness.sol"; +import {ERC20TransferMod_Base_Test} from "../ERC20TransferModBase.t.sol"; +import {ERC20StorageUtils} from "test/utils/storage/ERC20StorageUtils.sol"; -import "src/token/ERC20/ERC20/ERC20Mod.sol"; +import "src/token/ERC20/Transfer/ERC20TransferMod.sol"; /** * @dev BTT spec: test/trees/ERC20.tree */ -contract TransferFrom_ERC20Mod_Fuzz_Unit_Test is Base_Test { - ERC20Harness internal harness; - - function setUp() public override { - Base_Test.setUp(); - harness = new ERC20Harness(); - } +contract TransferFrom_ERC20TransferMod_Fuzz_Unit_Test is ERC20TransferMod_Base_Test { + using ERC20StorageUtils for address; function testFuzz_ShouldRevert_SenderIsZeroAddress(address to, uint256 value) external { vm.expectRevert(abi.encodeWithSelector(ERC20InvalidSender.selector, ADDRESS_ZERO)); @@ -47,8 +42,7 @@ contract TransferFrom_ERC20Mod_Fuzz_Unit_Test is Base_Test { allowance = bound(allowance, 0, MAX_UINT256 - 1); value = bound(value, allowance + 1, MAX_UINT256); - setMsgSender(from); - harness.approve(users.sender, allowance); + address(harness).setAllowance(from, users.sender, allowance); setMsgSender(users.sender); vm.expectRevert(abi.encodeWithSelector(ERC20InsufficientAllowance.selector, users.sender, allowance, value)); @@ -69,10 +63,8 @@ contract TransferFrom_ERC20Mod_Fuzz_Unit_Test is Base_Test { allowance = bound(allowance, value, MAX_UINT256); // allowance >= value balance = bound(balance, 0, value - 1); // balance < value - harness.mint(from, balance); - - setMsgSender(from); - harness.approve(users.sender, allowance); + address(harness).mint(from, balance); + address(harness).setAllowance(from, users.sender, allowance); setMsgSender(users.sender); vm.expectRevert(abi.encodeWithSelector(ERC20InsufficientBalance.selector, from, balance, value)); @@ -94,22 +86,20 @@ contract TransferFrom_ERC20Mod_Fuzz_Unit_Test is Base_Test { value = bound(value, 1, MAX_UINT256); balance = bound(balance, value, MAX_UINT256); - harness.mint(from, balance); - - setMsgSender(from); - harness.approve(users.sender, MAX_UINT256); + address(harness).mint(from, balance); + address(harness).setAllowance(from, users.sender, MAX_UINT256); setMsgSender(users.sender); - uint256 beforeBalanceOfFrom = harness.balanceOf(from); - uint256 beforeBalanceOfTo = harness.balanceOf(to); + uint256 beforeBalanceOfFrom = address(harness).balanceOf(from); + uint256 beforeBalanceOfTo = address(harness).balanceOf(to); vm.expectEmit(address(harness)); emit Transfer(from, to, value); bool result = harness.transferFrom(from, to, value); assertEq(result, true, "transfer failed"); - assertEq(harness.balanceOf(from), beforeBalanceOfFrom - value, "balanceOf(from)"); - assertEq(harness.balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); + assertEq(address(harness).balanceOf(from), beforeBalanceOfFrom - value, "balanceOf(from)"); + assertEq(address(harness).balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); } function testFuzz_TransferFrom(address from, address to, uint256 value, uint256 allowance, uint256 balance) @@ -128,22 +118,20 @@ contract TransferFrom_ERC20Mod_Fuzz_Unit_Test is Base_Test { allowance = bound(allowance, value, MAX_UINT256 - 1); balance = bound(balance, value, MAX_UINT256); - harness.mint(from, balance); - - setMsgSender(from); - harness.approve(users.sender, allowance); + address(harness).mint(from, balance); + address(harness).setAllowance(from, users.sender, allowance); setMsgSender(users.sender); - uint256 beforeBalanceOfFrom = harness.balanceOf(from); - uint256 beforeBalanceOfTo = harness.balanceOf(to); + uint256 beforeBalanceOfFrom = address(harness).balanceOf(from); + uint256 beforeBalanceOfTo = address(harness).balanceOf(to); vm.expectEmit(address(harness)); emit Transfer(from, to, value); bool result = harness.transferFrom(from, to, value); assertEq(result, true, "transfer failed"); - assertEq(harness.balanceOf(from), beforeBalanceOfFrom - value, "balanceOf(from)"); - assertEq(harness.balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); - assertEq(harness.allowance(from, users.sender), allowance - value, "allowance(from, users.sender)"); + assertEq(address(harness).balanceOf(from), beforeBalanceOfFrom - value, "balanceOf(from)"); + assertEq(address(harness).balanceOf(to), beforeBalanceOfTo + value, "balanceOf(to)"); + assertEq(address(harness).allowance(from, users.sender), allowance - value, "allowance(from, users.sender)"); } } diff --git a/test/utils/storage/ERC20StorageUtils.sol b/test/utils/storage/ERC20StorageUtils.sol index 630642a6..eade2ba0 100644 --- a/test/utils/storage/ERC20StorageUtils.sol +++ b/test/utils/storage/ERC20StorageUtils.sol @@ -15,7 +15,7 @@ import {Vm} from "forge-std/Vm.sol"; library ERC20StorageUtils { Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - bytes32 internal constant ERC20_TRANSFER_STORAGE_POSITION = keccak256("compose.erc20.transfer"); + bytes32 internal constant STORAGE_POSITION = keccak256("erc20"); /*////////////////////////////////////////////////////////////// GETTERS @@ -31,17 +31,17 @@ library ERC20StorageUtils { */ function balanceOf(address target, address owner) internal view returns (uint256) { - bytes32 slot = keccak256(abi.encode(owner, uint256(ERC20_TRANSFER_STORAGE_POSITION))); + bytes32 slot = keccak256(abi.encode(owner, uint256(STORAGE_POSITION))); return uint256(vm.load(target, slot)); } function totalSupply(address target) internal view returns (uint256) { - bytes32 slot = bytes32(uint256(ERC20_TRANSFER_STORAGE_POSITION) + 1); + bytes32 slot = bytes32(uint256(STORAGE_POSITION) + 1); return uint256(vm.load(target, slot)); } function allowance(address target, address owner, address spender) internal view returns (uint256) { - bytes32 ownerSlot = keccak256(abi.encode(owner, uint256(ERC20_TRANSFER_STORAGE_POSITION) + 2)); + bytes32 ownerSlot = keccak256(abi.encode(owner, uint256(STORAGE_POSITION) + 2)); bytes32 slot = keccak256(abi.encode(spender, ownerSlot)); return uint256(vm.load(target, slot)); } @@ -51,17 +51,17 @@ library ERC20StorageUtils { //////////////////////////////////////////////////////////////*/ function setBalance(address target, address owner, uint256 balance) internal { - bytes32 slot = keccak256(abi.encode(owner, uint256(ERC20_TRANSFER_STORAGE_POSITION))); + bytes32 slot = keccak256(abi.encode(owner, uint256(STORAGE_POSITION))); vm.store(target, slot, bytes32(balance)); } function setTotalSupply(address target, uint256 supply) internal { - bytes32 slot = bytes32(uint256(ERC20_TRANSFER_STORAGE_POSITION) + 1); + bytes32 slot = bytes32(uint256(STORAGE_POSITION) + 1); vm.store(target, slot, bytes32(supply)); } function setAllowance(address target, address owner, address spender, uint256 amount) internal { - bytes32 ownerSlot = keccak256(abi.encode(owner, uint256(ERC20_TRANSFER_STORAGE_POSITION) + 2)); + bytes32 ownerSlot = keccak256(abi.encode(owner, uint256(STORAGE_POSITION) + 2)); bytes32 slot = keccak256(abi.encode(spender, ownerSlot)); vm.store(target, slot, bytes32(amount)); }