feat: Refactor callback for pancakeV3 and Ekubo to use transient storage
--- don't change below this line --- ENG-4411 Took 1 hour 5 minutes Took 1 minute
This commit is contained in:
@@ -502,25 +502,6 @@ contract TychoRouter is AccessControl, Dispatcher, Pausable, ReentrancyGuard {
|
|||||||
require(msg.sender.code.length != 0);
|
require(msg.sender.code.length != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @dev Called by PancakeV3 pool when swapping on it.
|
|
||||||
*/
|
|
||||||
function pancakeV3SwapCallback(
|
|
||||||
int256, /* amount0Delta */
|
|
||||||
int256, /* amount1Delta */
|
|
||||||
bytes calldata data
|
|
||||||
) external {
|
|
||||||
if (data.length < 24) revert TychoRouter__InvalidDataLength();
|
|
||||||
// We are taking advantage of the fact that the data we need is already encoded in the correct format inside msg.data
|
|
||||||
// This way we preserve the bytes calldata (and don't need to convert it to bytes memory)
|
|
||||||
uint256 dataOffset = 4 + 32 + 32 + 32; // Skip selector + 2 ints + data_offset
|
|
||||||
uint256 dataLength =
|
|
||||||
uint256(bytes32(msg.data[dataOffset:dataOffset + 32]));
|
|
||||||
|
|
||||||
bytes calldata fullData = msg.data[4:dataOffset + 32 + dataLength];
|
|
||||||
_handleCallback(fullData);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dev Called by UniswapV4 pool manager after achieving unlock state.
|
* @dev Called by UniswapV4 pool manager after achieving unlock state.
|
||||||
*/
|
*/
|
||||||
@@ -532,44 +513,4 @@ contract TychoRouter is AccessControl, Dispatcher, Pausable, ReentrancyGuard {
|
|||||||
_handleCallback(data);
|
_handleCallback(data);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
function locked(uint256) external {
|
|
||||||
address executor = address(0x4f88f6630a33dB05BEa1FeF7Dc7ff7508D1c531D);
|
|
||||||
|
|
||||||
// slither-disable-next-line controlled-delegatecall,low-level-calls
|
|
||||||
(bool success, bytes memory result) = executor.delegatecall(msg.data);
|
|
||||||
|
|
||||||
if (!success) {
|
|
||||||
revert(
|
|
||||||
string(
|
|
||||||
result.length > 0
|
|
||||||
? result
|
|
||||||
: abi.encodePacked("Callback failed")
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// slither-disable-next-line assembly
|
|
||||||
assembly ("memory-safe") {
|
|
||||||
// Propagate the swappedAmount
|
|
||||||
return(add(result, 32), 16)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function payCallback(uint256, address /*token*/ ) external {
|
|
||||||
address executor = address(0x4f88f6630a33dB05BEa1FeF7Dc7ff7508D1c531D);
|
|
||||||
|
|
||||||
// slither-disable-next-line controlled-delegatecall,low-level-calls
|
|
||||||
(bool success, bytes memory result) = executor.delegatecall(msg.data);
|
|
||||||
|
|
||||||
if (!success) {
|
|
||||||
revert(
|
|
||||||
string(
|
|
||||||
result.length > 0
|
|
||||||
? result
|
|
||||||
: abi.encodePacked("Callback failed")
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1029,8 +1029,8 @@ contract TychoRouterTest is TychoRouterTestSetup {
|
|||||||
|
|
||||||
vm.startPrank(ALICE);
|
vm.startPrank(ALICE);
|
||||||
// Encoded solution generated using `test_split_encoding_strategy_ekubo`
|
// Encoded solution generated using `test_split_encoding_strategy_ekubo`
|
||||||
(bool success,) = address(tychoRouter).call{value: 1 ether}(
|
(bool success,) = tychoRouterAddr.call{value: 1 ether}(
|
||||||
hex"0a83cb080000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000077007500010000003d7ebc40af7092e3f1c81f2e996cba5cae2090d7a4ad4f68d0b91cfd19687c881e50f3a00242828c0000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000000000000000000000"
|
hex"0a83cb080000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000007700750001000000c7183455a4c133ae270771860664b6b7ec320bb13ede3eca2a72b3aecc820e955b36f38437d013950000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000000000000000000000"
|
||||||
);
|
);
|
||||||
|
|
||||||
uint256 balanceAfter = IERC20(USDC_ADDR).balanceOf(ALICE);
|
uint256 balanceAfter = IERC20(USDC_ADDR).balanceOf(ALICE);
|
||||||
|
|||||||
Reference in New Issue
Block a user