From e1a3a6d87b520cbd2f0d1a605f3f6d792729f4d2 Mon Sep 17 00:00:00 2001 From: Vectorized Date: Wed, 19 Jul 2023 20:10:05 +0000 Subject: [PATCH] Fix stack too deep --- .gas-snapshot | 86 +++++++++++++++++++++--------------------- src/tokens/ERC1155.sol | 3 +- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 38bc3bd41..b2696fabb 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -115,50 +115,50 @@ EIP712Test:testHashTypedDataOnClone() (gas: 40165) EIP712Test:testHashTypedDataOnCloneWithChaindIdChange() (gas: 49524) EIP712Test:testHashTypedDataWithChaindIdChange() (gas: 45785) EIP712Test:test__codesize() (gas: 9193) -ERC1155HooksTest:testERC1155Hooks() (gas: 4412905) -ERC1155HooksTest:test__codesize() (gas: 12143) -ERC1155Test:testApproveAll(address,bool) (runs: 256, μ: 44353, ~: 38845) +ERC1155HooksTest:testERC1155Hooks() (gas: 4415113) +ERC1155HooksTest:test__codesize() (gas: 12151) +ERC1155Test:testApproveAll(address,bool) (runs: 256, μ: 44436, ~: 38849) ERC1155Test:testAuthorizedEquivalence(address,address,bool) (runs: 256, μ: 715, ~: 715) -ERC1155Test:testBalanceOfBatchWithArrayMismatchReverts(uint256) (runs: 256, μ: 31379, ~: 33368) -ERC1155Test:testBatchBalanceOf(uint256) (runs: 256, μ: 107665, ~: 93576) -ERC1155Test:testBatchBurn(uint256) (runs: 256, μ: 181578, ~: 162446) -ERC1155Test:testBatchBurnInsufficientBalanceReverts(uint256) (runs: 256, μ: 168363, ~: 173601) -ERC1155Test:testBatchBurnWithArrayLengthMismatchReverts(uint256) (runs: 256, μ: 42955, ~: 42270) -ERC1155Test:testBatchMintToEOA(uint256) (runs: 256, μ: 123592, ~: 148367) -ERC1155Test:testBatchMintToERC1155Recipient(uint256) (runs: 256, μ: 778145, ~: 778213) -ERC1155Test:testBatchMintToNonERC1155RecipientReverts(uint256) (runs: 256, μ: 172802, ~: 185933) -ERC1155Test:testBatchMintToRevertingERC1155RecipientReverts(uint256) (runs: 256, μ: 322745, ~: 315670) -ERC1155Test:testBatchMintToWrongReturnDataERC1155RecipientReverts(uint256) (runs: 256, μ: 298742, ~: 318728) -ERC1155Test:testBatchMintToZeroReverts(uint256) (runs: 256, μ: 75980, ~: 65221) -ERC1155Test:testBatchMintWithArrayMismatchReverts(uint256) (runs: 256, μ: 33299, ~: 35512) -ERC1155Test:testBurn(uint256) (runs: 256, μ: 91255, ~: 82410) -ERC1155Test:testBurnInsufficientBalanceReverts(uint256) (runs: 256, μ: 97079, ~: 97475) -ERC1155Test:testDirectSetApprovalForAll(address,address,bool) (runs: 256, μ: 21404, ~: 15497) -ERC1155Test:testMintToEOA(uint256) (runs: 256, μ: 72246, ~: 71726) -ERC1155Test:testMintToERC1155Recipient(uint256) (runs: 256, μ: 672621, ~: 653322) -ERC1155Test:testMintToNonERC155RecipientReverts(uint256) (runs: 256, μ: 103209, ~: 103253) -ERC1155Test:testMintToRevertingERC155RecipientReverts(uint256) (runs: 256, μ: 281325, ~: 281372) -ERC1155Test:testMintToWrongReturnDataERC155RecipientReverts(uint256) (runs: 256, μ: 235877, ~: 235943) -ERC1155Test:testMintToZeroReverts(uint256) (runs: 256, μ: 33087, ~: 33055) -ERC1155Test:testSafeBatchTransfer() (gas: 8345801) -ERC1155Test:testSafeBatchTransferFromToEOA(uint256) (runs: 256, μ: 205666, ~: 189049) -ERC1155Test:testSafeBatchTransferFromToERC1155Recipient(uint256) (runs: 256, μ: 873871, ~: 888325) -ERC1155Test:testSafeBatchTransferFromToNonERC1155RecipientReverts(uint256) (runs: 256, μ: 250751, ~: 268303) -ERC1155Test:testSafeBatchTransferFromToRevertingERC1155RecipientReverts(uint256) (runs: 256, μ: 435272, ~: 446913) -ERC1155Test:testSafeBatchTransferFromToWrongReturnDataERC1155RecipientReverts(uint256) (runs: 256, μ: 342008, ~: 330056) -ERC1155Test:testSafeBatchTransferFromToZeroReverts(uint256) (runs: 256, μ: 141570, ~: 124639) -ERC1155Test:testSafeBatchTransferFromWithArrayLengthMismatchReverts(uint256) (runs: 256, μ: 50543, ~: 66552) -ERC1155Test:testSafeBatchTransferInsufficientBalanceReverts(uint256) (runs: 256, μ: 171652, ~: 173708) -ERC1155Test:testSafeTransferFromInsufficientBalanceReverts(uint256) (runs: 256, μ: 99166, ~: 99834) -ERC1155Test:testSafeTransferFromSelf(uint256) (runs: 256, μ: 106139, ~: 105783) -ERC1155Test:testSafeTransferFromSelfInsufficientBalanceReverts(uint256) (runs: 256, μ: 71423, ~: 72152) -ERC1155Test:testSafeTransferFromToEOA(uint256) (runs: 256, μ: 118929, ~: 111938) -ERC1155Test:testSafeTransferFromToERC1155Recipient(uint256) (runs: 256, μ: 760947, ~: 782211) -ERC1155Test:testSafeTransferFromToNonERC155RecipientReverts(uint256) (runs: 256, μ: 140160, ~: 139781) -ERC1155Test:testSafeTransferFromToRevertingERC1155RecipientReverts(uint256) (runs: 256, μ: 317173, ~: 318486) -ERC1155Test:testSafeTransferFromToWrongReturnDataERC1155RecipientReverts(uint256) (runs: 256, μ: 272758, ~: 272555) -ERC1155Test:testSafeTransferFromToZeroReverts(uint256) (runs: 256, μ: 71026, ~: 71524) -ERC1155Test:test__codesize() (gas: 43539) +ERC1155Test:testBalanceOfBatchWithArrayMismatchReverts(uint256) (runs: 256, μ: 31230, ~: 33355) +ERC1155Test:testBatchBalanceOf(uint256) (runs: 256, μ: 110062, ~: 93598) +ERC1155Test:testBatchBurn(uint256) (runs: 256, μ: 175206, ~: 161774) +ERC1155Test:testBatchBurnInsufficientBalanceReverts(uint256) (runs: 256, μ: 168400, ~: 173601) +ERC1155Test:testBatchBurnWithArrayLengthMismatchReverts(uint256) (runs: 256, μ: 43072, ~: 42605) +ERC1155Test:testBatchMintToEOA(uint256) (runs: 256, μ: 120375, ~: 100134) +ERC1155Test:testBatchMintToERC1155Recipient(uint256) (runs: 256, μ: 790641, ~: 782144) +ERC1155Test:testBatchMintToNonERC1155RecipientReverts(uint256) (runs: 256, μ: 169367, ~: 185609) +ERC1155Test:testBatchMintToRevertingERC1155RecipientReverts(uint256) (runs: 256, μ: 329794, ~: 316153) +ERC1155Test:testBatchMintToWrongReturnDataERC1155RecipientReverts(uint256) (runs: 256, μ: 292237, ~: 318393) +ERC1155Test:testBatchMintToZeroReverts(uint256) (runs: 256, μ: 75439, ~: 65179) +ERC1155Test:testBatchMintWithArrayMismatchReverts(uint256) (runs: 256, μ: 33434, ~: 35513) +ERC1155Test:testBurn(uint256) (runs: 256, μ: 91067, ~: 82550) +ERC1155Test:testBurnInsufficientBalanceReverts(uint256) (runs: 256, μ: 97203, ~: 97741) +ERC1155Test:testDirectSetApprovalForAll(address,address,bool) (runs: 256, μ: 21249, ~: 15497) +ERC1155Test:testMintToEOA(uint256) (runs: 256, μ: 72197, ~: 71726) +ERC1155Test:testMintToERC1155Recipient(uint256) (runs: 256, μ: 671065, ~: 653345) +ERC1155Test:testMintToNonERC155RecipientReverts(uint256) (runs: 256, μ: 103274, ~: 103244) +ERC1155Test:testMintToRevertingERC155RecipientReverts(uint256) (runs: 256, μ: 281328, ~: 281372) +ERC1155Test:testMintToWrongReturnDataERC155RecipientReverts(uint256) (runs: 256, μ: 235962, ~: 235951) +ERC1155Test:testMintToZeroReverts(uint256) (runs: 256, μ: 33087, ~: 33058) +ERC1155Test:testSafeBatchTransfer() (gas: 8345896) +ERC1155Test:testSafeBatchTransferFromToEOA(uint256) (runs: 256, μ: 202195, ~: 189077) +ERC1155Test:testSafeBatchTransferFromToERC1155Recipient(uint256) (runs: 256, μ: 876158, ~: 888344) +ERC1155Test:testSafeBatchTransferFromToNonERC1155RecipientReverts(uint256) (runs: 256, μ: 255380, ~: 268350) +ERC1155Test:testSafeBatchTransferFromToRevertingERC1155RecipientReverts(uint256) (runs: 256, μ: 436486, ~: 446765) +ERC1155Test:testSafeBatchTransferFromToWrongReturnDataERC1155RecipientReverts(uint256) (runs: 256, μ: 337735, ~: 329892) +ERC1155Test:testSafeBatchTransferFromToZeroReverts(uint256) (runs: 256, μ: 137121, ~: 124639) +ERC1155Test:testSafeBatchTransferFromWithArrayLengthMismatchReverts(uint256) (runs: 256, μ: 51554, ~: 66637) +ERC1155Test:testSafeBatchTransferInsufficientBalanceReverts(uint256) (runs: 256, μ: 169221, ~: 173708) +ERC1155Test:testSafeTransferFromInsufficientBalanceReverts(uint256) (runs: 256, μ: 99092, ~: 99806) +ERC1155Test:testSafeTransferFromSelf(uint256) (runs: 256, μ: 106107, ~: 105783) +ERC1155Test:testSafeTransferFromSelfInsufficientBalanceReverts(uint256) (runs: 256, μ: 71237, ~: 72092) +ERC1155Test:testSafeTransferFromToEOA(uint256) (runs: 256, μ: 117646, ~: 111012) +ERC1155Test:testSafeTransferFromToERC1155Recipient(uint256) (runs: 256, μ: 761748, ~: 782707) +ERC1155Test:testSafeTransferFromToNonERC155RecipientReverts(uint256) (runs: 256, μ: 140379, ~: 139781) +ERC1155Test:testSafeTransferFromToRevertingERC1155RecipientReverts(uint256) (runs: 256, μ: 316822, ~: 318183) +ERC1155Test:testSafeTransferFromToWrongReturnDataERC1155RecipientReverts(uint256) (runs: 256, μ: 273065, ~: 272604) +ERC1155Test:testSafeTransferFromToZeroReverts(uint256) (runs: 256, μ: 70822, ~: 70225) +ERC1155Test:test__codesize() (gas: 43547) ERC1967FactoryTest:testChangeAdmin() (gas: 266757) ERC1967FactoryTest:testChangeAdminUnauthorized() (gas: 257684) ERC1967FactoryTest:testDeploy() (gas: 257661) diff --git a/src/tokens/ERC1155.sol b/src/tokens/ERC1155.sol index e94dac0fe..d46576a97 100644 --- a/src/tokens/ERC1155.sol +++ b/src/tokens/ERC1155.sol @@ -375,6 +375,7 @@ abstract contract ERC1155 { assembly { // Do the {onERC1155BatchReceived} check if `to` is a smart contract. if extcodesize(to) { + mstore(0x00, to) // Cache `to` to prevent stack too deep. let m := mload(0x40) // Prepare the calldata. // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`. @@ -399,7 +400,7 @@ abstract contract ERC1155 { calldatacopy(o, sub(data.offset, 0x20), n) n := sub(add(o, n), add(m, 0x1c)) // Revert if the call reverts. - if iszero(call(gas(), to, 0, add(m, 0x1c), n, m, 0x20)) { + if iszero(call(gas(), mload(0x00), 0, add(m, 0x1c), n, m, 0x20)) { if returndatasize() { // Bubble up the revert if the call reverts. returndatacopy(0x00, 0x00, returndatasize())