From a9dee2ccf668a2ab2674d747b75ae5b05eb7192d Mon Sep 17 00:00:00 2001 From: Erik Dubovyk Date: Fri, 13 Sep 2024 15:04:40 +0300 Subject: [PATCH 1/4] testFlowERC1155PreviewDefinedFlowIOForERC20SingleElementArrays --- test/abstract/flow/AbstractPreviewTest.sol | 23 +++++++++++++ test/concrete/flowBasic/FlowPreviewTest.sol | 22 +------------ test/concrete/flowErc1155/FlowPreviewTest.sol | 12 +++++++ test/concrete/flowErc20/FlowPreviewTest.sol | 32 +----------------- test/concrete/flowErc721/FlowPreviewTest.sol | 33 +------------------ 5 files changed, 38 insertions(+), 84 deletions(-) diff --git a/test/abstract/flow/AbstractPreviewTest.sol b/test/abstract/flow/AbstractPreviewTest.sol index d1ef18e4..7fd425ed 100644 --- a/test/abstract/flow/AbstractPreviewTest.sol +++ b/test/abstract/flow/AbstractPreviewTest.sol @@ -122,4 +122,27 @@ contract AbstractPreviewTest is FlowBasicTest { assertEq(transferHash, abstractStackToFlowCall(flow, stack), "wrong compare Structs"); } + + /** + * @dev Tests the preview of defined Flow IO for ERC20 + * using single-element arrays. + */ + function flowPreviewDefinedFlowIOForERC20SingleElementArrays( + address alice, + uint256 erc20AmountIn, + uint256 erc20AmountOut + ) internal { + vm.label(alice, "alice"); + + (address flow,) = deployFlowWithConfig(); + assumeEtchable(alice, flow); + + (uint256[] memory stack, bytes32 transferHash) = mintAndBurnFlowStack( + alice, 20 ether, 10 ether, 5, onlyTransfersERC20toERC20(alice, flow, erc20AmountIn, erc20AmountOut) + ); + + assertEq(transferHash, abstractStackToFlowCall(flow, stack), "wrong compare Structs"); + } + + } diff --git a/test/concrete/flowBasic/FlowPreviewTest.sol b/test/concrete/flowBasic/FlowPreviewTest.sol index a56f7773..5379fc39 100644 --- a/test/concrete/flowBasic/FlowPreviewTest.sol +++ b/test/concrete/flowBasic/FlowPreviewTest.sol @@ -80,27 +80,7 @@ contract FlowPreviewTest is AbstractPreviewTest { uint256 erc20AmountIn, uint256 erc20AmountOut ) external { - vm.assume(sentinel != erc20AmountIn); - vm.assume(sentinel != erc20AmountOut); - - vm.label(alice, "alice"); - - (IFlowV5 flow,) = deployFlow(); - assumeEtchable(alice, address(flow)); - - ERC20Transfer[] memory erc20Transfers = new ERC20Transfer[](2); - erc20Transfers[0] = - ERC20Transfer({token: address(iTokenA), from: address(flow), to: alice, amount: erc20AmountOut}); - erc20Transfers[1] = - ERC20Transfer({token: address(iTokenA), from: alice, to: address(flow), amount: erc20AmountIn}); - - FlowTransferV1 memory flowTransfer = - FlowTransferV1(erc20Transfers, new ERC721Transfer[](0), new ERC1155Transfer[](0)); - uint256[] memory stack = generateFlowStack(flowTransfer); - - assertEq( - keccak256(abi.encode(flowTransfer)), keccak256(abi.encode(flow.stackToFlow(stack))), "wrong compare Structs" - ); + flowPreviewDefinedFlowIOForERC20SingleElementArrays(alice, erc20AmountIn, erc20AmountOut); } /** diff --git a/test/concrete/flowErc1155/FlowPreviewTest.sol b/test/concrete/flowErc1155/FlowPreviewTest.sol index ed2d5349..95e11609 100644 --- a/test/concrete/flowErc1155/FlowPreviewTest.sol +++ b/test/concrete/flowErc1155/FlowPreviewTest.sol @@ -68,6 +68,18 @@ contract FlowPreviewTest is FlowERC1155Test { flowPreviewDefinedFlowIOForERC721SingleElementArrays(alice, erc721TokenInId, erc721TokenOutId); } + /** + * @dev Tests the preview of defined Flow IO for ERC20 + * using single-element arrays. + */ + function testFlowERC1155PreviewDefinedFlowIOForERC20SingleElementArrays( + address alice, + uint256 erc20AmountIn, + uint256 erc20AmountOut + ) external { + flowPreviewDefinedFlowIOForERC20SingleElementArrays(alice, erc20AmountIn, erc20AmountOut); + } + /// Should preview empty flow io function testFlowERC1155PreviewEmptyFlowIO(string memory uri, address alice, uint256 amount) public { (IFlowERC1155V5 flow,) = deployIFlowERC1155V5({uri: uri}); diff --git a/test/concrete/flowErc20/FlowPreviewTest.sol b/test/concrete/flowErc20/FlowPreviewTest.sol index b7312b5e..0d67d1b1 100644 --- a/test/concrete/flowErc20/FlowPreviewTest.sol +++ b/test/concrete/flowErc20/FlowPreviewTest.sol @@ -76,41 +76,11 @@ contract FlowPreviewTest is FlowERC20Test { * using single-element arrays. */ function testFlowERC20PreviewDefinedFlowIOForERC20SingleElementArrays( - string memory name, - string memory symbol, address alice, uint256 erc20AmountIn, uint256 erc20AmountOut ) external { - vm.assume(sentinel != erc20AmountIn); - vm.assume(sentinel != erc20AmountOut); - - vm.label(alice, "alice"); - - (IFlowERC20V5 flow,) = deployFlowERC20(name, symbol); - assumeEtchable(alice, address(flow)); - - ERC20Transfer[] memory erc20Transfers = new ERC20Transfer[](2); - erc20Transfers[0] = - ERC20Transfer({token: address(iTokenA), from: address(flow), to: alice, amount: erc20AmountOut}); - erc20Transfers[1] = - ERC20Transfer({token: address(iTokenA), from: alice, to: address(flow), amount: erc20AmountIn}); - - ERC20SupplyChange[] memory mints = new ERC20SupplyChange[](1); - mints[0] = ERC20SupplyChange({account: alice, amount: 20 ether}); - - ERC20SupplyChange[] memory burns = new ERC20SupplyChange[](1); - burns[0] = ERC20SupplyChange({account: alice, amount: 10 ether}); - - FlowERC20IOV1 memory flowERC20IO = FlowERC20IOV1( - mints, burns, FlowTransferV1(erc20Transfers, new ERC721Transfer[](0), new ERC1155Transfer[](0)) - ); - - uint256[] memory stack = generateFlowStack(flowERC20IO); - - assertEq( - keccak256(abi.encode(flowERC20IO)), keccak256(abi.encode(flow.stackToFlow(stack))), "wrong compare Structs" - ); + flowPreviewDefinedFlowIOForERC20SingleElementArrays(alice, erc20AmountIn, erc20AmountOut); } /** diff --git a/test/concrete/flowErc721/FlowPreviewTest.sol b/test/concrete/flowErc721/FlowPreviewTest.sol index 36aef812..db3147d3 100644 --- a/test/concrete/flowErc721/FlowPreviewTest.sol +++ b/test/concrete/flowErc721/FlowPreviewTest.sol @@ -71,42 +71,11 @@ contract FlowPreviewTest is FlowERC721Test { * using single-element arrays. */ function testFlowERC721PreviewDefinedFlowIOForERC20SingleElementArrays( - string memory symbol, - string memory baseURI, address alice, uint256 erc20AmountIn, uint256 erc20AmountOut ) external { - vm.assume(sentinel != erc20AmountIn); - vm.assume(sentinel != erc20AmountOut); - - vm.label(alice, "alice"); - - (IFlowERC721V5 flow,) = deployFlowERC721({name: symbol, symbol: symbol, baseURI: baseURI}); - assumeEtchable(alice, address(flow)); - - ERC20Transfer[] memory erc20Transfers = new ERC20Transfer[](2); - erc20Transfers[0] = - ERC20Transfer({token: address(iTokenA), from: address(flow), to: alice, amount: erc20AmountOut}); - erc20Transfers[1] = - ERC20Transfer({token: address(iTokenA), from: alice, to: address(flow), amount: erc20AmountIn}); - - ERC721SupplyChange[] memory mints = new ERC721SupplyChange[](2); - mints[0] = ERC721SupplyChange({account: alice, id: 1}); - mints[1] = ERC721SupplyChange({account: alice, id: 2}); - - ERC721SupplyChange[] memory burns = new ERC721SupplyChange[](1); - burns[0] = ERC721SupplyChange({account: alice, id: 2}); - - FlowERC721IOV1 memory flowERC721IO = FlowERC721IOV1( - mints, burns, FlowTransferV1(erc20Transfers, new ERC721Transfer[](0), new ERC1155Transfer[](0)) - ); - - uint256[] memory stack = generateFlowStack(flowERC721IO); - - assertEq( - keccak256(abi.encode(flowERC721IO)), keccak256(abi.encode(flow.stackToFlow(stack))), "wrong compare Structs" - ); + flowPreviewDefinedFlowIOForERC20SingleElementArrays(alice, erc20AmountIn, erc20AmountOut); } /** From 5100ff3134da8300730e2ce7d59a3714e0e5f02f Mon Sep 17 00:00:00 2001 From: Erik Dubovyk Date: Fri, 13 Sep 2024 16:12:56 +0300 Subject: [PATCH 2/4] fix fmt --- test/abstract/flow/AbstractPreviewTest.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/abstract/flow/AbstractPreviewTest.sol b/test/abstract/flow/AbstractPreviewTest.sol index 7fd425ed..1176934a 100644 --- a/test/abstract/flow/AbstractPreviewTest.sol +++ b/test/abstract/flow/AbstractPreviewTest.sol @@ -143,6 +143,4 @@ contract AbstractPreviewTest is FlowBasicTest { assertEq(transferHash, abstractStackToFlowCall(flow, stack), "wrong compare Structs"); } - - } From 5f4c7ae4be85624c2770ef51f968bd175be9a34f Mon Sep 17 00:00:00 2001 From: Erik Dubovyk Date: Sun, 15 Sep 2024 12:31:56 +0300 Subject: [PATCH 3/4] function renamed --- test/abstract/flow/AbstractPreviewTest.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/abstract/flow/AbstractPreviewTest.sol b/test/abstract/flow/AbstractPreviewTest.sol index 59206e56..b553127f 100644 --- a/test/abstract/flow/AbstractPreviewTest.sol +++ b/test/abstract/flow/AbstractPreviewTest.sol @@ -138,7 +138,7 @@ contract AbstractPreviewTest is FlowBasicTest { assumeEtchable(alice, flow); (uint256[] memory stack, bytes32 transferHash) = mintAndBurnFlowStack( - alice, 20 ether, 10 ether, 5, onlyTransfersERC20toERC20(alice, flow, erc20AmountIn, erc20AmountOut) + alice, 20 ether, 10 ether, 5, createTransfersERC20toERC20(alice, flow, erc20AmountIn, erc20AmountOut) ); assertEq(transferHash, abstractStackToFlowCall(flow, stack), "wrong compare Structs"); From 2e8159101ecfb6f9a0dae5f5d30e75364cd8cfa5 Mon Sep 17 00:00:00 2001 From: Erik Dubovyk Date: Thu, 26 Sep 2024 18:04:06 +0300 Subject: [PATCH 4/4] updated for new abstraction structure --- test/concrete/flowBasic/FlowPreviewTest.sol | 15 ++++++++++++++- test/concrete/flowErc1155/FlowPreviewTest.sol | 15 ++++++++++++++- test/concrete/flowErc20/FlowPreviewTest.sol | 15 ++++++++++++++- test/concrete/flowErc721/FlowPreviewTest.sol | 16 +++++++++++++++- 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/test/concrete/flowBasic/FlowPreviewTest.sol b/test/concrete/flowBasic/FlowPreviewTest.sol index 1cf3c81f..25fd5466 100644 --- a/test/concrete/flowBasic/FlowPreviewTest.sol +++ b/test/concrete/flowBasic/FlowPreviewTest.sol @@ -146,7 +146,20 @@ contract FlowPreviewTest is FlowBasicTest { uint256 erc20AmountIn, uint256 erc20AmountOut ) external { - flowPreviewDefinedFlowIOForERC20SingleElementArrays(alice, erc20AmountIn, erc20AmountOut); + vm.label(alice, "alice"); + + (IFlowV5 flow,) = deployFlow(); + assumeEtchable(alice, address(flow)); + + (uint256[] memory stack, bytes32 transferHash) = mintAndBurnFlowStack( + alice, + 20 ether, + 10 ether, + 5, + createTransfersERC20toERC20(alice, address(flow), erc20AmountIn, erc20AmountOut) + ); + + assertEq(transferHash, keccak256(abi.encode(flow.stackToFlow(stack))), "wrong compare Structs"); } /** diff --git a/test/concrete/flowErc1155/FlowPreviewTest.sol b/test/concrete/flowErc1155/FlowPreviewTest.sol index 1e045c1b..80325f54 100644 --- a/test/concrete/flowErc1155/FlowPreviewTest.sol +++ b/test/concrete/flowErc1155/FlowPreviewTest.sol @@ -138,7 +138,20 @@ contract FlowPreviewTest is FlowERC1155Test { uint256 erc20AmountIn, uint256 erc20AmountOut ) external { - flowPreviewDefinedFlowIOForERC20SingleElementArrays(alice, erc20AmountIn, erc20AmountOut); + vm.label(alice, "alice"); + + (IFlowERC1155V5 flow,) = deployIFlowERC1155V5("https://www.rainprotocol.xyz/nft/"); + assumeEtchable(alice, address(flow)); + + (uint256[] memory stack, bytes32 transferHash) = mintAndBurnFlowStack( + alice, + 20 ether, + 10 ether, + 5, + createTransfersERC20toERC20(alice, address(flow), erc20AmountIn, erc20AmountOut) + ); + + assertEq(transferHash, keccak256(abi.encode(flow.stackToFlow(stack))), "wrong compare Structs"); } /// Should preview empty flow io diff --git a/test/concrete/flowErc20/FlowPreviewTest.sol b/test/concrete/flowErc20/FlowPreviewTest.sol index ed599ae8..d1197721 100644 --- a/test/concrete/flowErc20/FlowPreviewTest.sol +++ b/test/concrete/flowErc20/FlowPreviewTest.sol @@ -146,7 +146,20 @@ contract FlowPreviewTest is FlowERC20Test { uint256 erc20AmountIn, uint256 erc20AmountOut ) external { - flowPreviewDefinedFlowIOForERC20SingleElementArrays(alice, erc20AmountIn, erc20AmountOut); + vm.label(alice, "alice"); + + (IFlowERC20V5 flow,) = deployFlowERC20("Flow ERC20", "F20"); + assumeEtchable(alice, address(flow)); + + (uint256[] memory stack, bytes32 transferHash) = mintAndBurnFlowStack( + alice, + 20 ether, + 10 ether, + 5, + createTransfersERC20toERC20(alice, address(flow), erc20AmountIn, erc20AmountOut) + ); + + assertEq(transferHash, keccak256(abi.encode(flow.stackToFlow(stack))), "wrong compare Structs"); } /** diff --git a/test/concrete/flowErc721/FlowPreviewTest.sol b/test/concrete/flowErc721/FlowPreviewTest.sol index e33ff7cd..7e3b831f 100644 --- a/test/concrete/flowErc721/FlowPreviewTest.sol +++ b/test/concrete/flowErc721/FlowPreviewTest.sol @@ -146,7 +146,21 @@ contract FlowPreviewTest is FlowERC721Test { uint256 erc20AmountIn, uint256 erc20AmountOut ) external { - flowPreviewDefinedFlowIOForERC20SingleElementArrays(alice, erc20AmountIn, erc20AmountOut); + vm.label(alice, "alice"); + + (IFlowERC721V5 flow,) = + deployFlowERC721({name: "FlowErc721", symbol: "FErc721", baseURI: "https://www.rainprotocol.xyz/nft/"}); + assumeEtchable(alice, address(flow)); + + (uint256[] memory stack, bytes32 transferHash) = mintAndBurnFlowStack( + alice, + 20 ether, + 10 ether, + 5, + createTransfersERC20toERC20(alice, address(flow), erc20AmountIn, erc20AmountOut) + ); + + assertEq(transferHash, keccak256(abi.encode(flow.stackToFlow(stack))), "wrong compare Structs"); } /**