编译器
0.8.24+commit.e11b9ed9
文件 1 的 27:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 27:BytesHelper.sol
pragma solidity ^0.8.0;
library BytesHelper {
function write16Bytes(bytes memory original, uint256 index, bytes16 value) internal pure returns (bytes memory) {
assembly {
let offset := add(original, add(index, 32))
let val := mload(offset)
val := and(val, not(0xffffffffffffffffffffffffffffffff00000000000000000000000000000000))
val := or(val, value)
mstore(offset, val)
}
return original;
}
function write16Bytes(bytes memory original, uint256 index, uint128 value) internal pure returns (bytes memory) {
return write16Bytes(original, index, bytes16(value));
}
function write16Bytes(
bytes memory original,
uint256 index,
uint256 value,
string memory errorMsg
) internal pure returns (bytes memory) {
require(value <= type(uint128).max, string(abi.encodePacked(errorMsg, "/Exceed compressed type range")));
return write16Bytes(original, index, uint128(value));
}
}
文件 3 的 27:CalldataReader.sol
pragma solidity ^0.8.0;
library CalldataReader {
function _calldataVal(
bytes memory data,
uint256 startByte,
uint256 length
) internal pure returns (bytes memory retVal, uint256) {
require(length + startByte <= data.length, "calldataVal trying to read beyond data size");
uint256 loops = (length + 31) / 32;
assembly {
let m := mload(0x40)
mstore(m, length)
for {
let i := 0
} lt(i, loops) {
i := add(1, i)
} {
mstore(add(m, mul(32, add(1, i))), mload(add(data, add(mul(32, add(1, i)), startByte))))
}
mstore(0x40, add(m, add(32, length)))
retVal := m
}
return (retVal, length + startByte);
}
function _readBool(bytes memory data, uint256 startByte) internal pure returns (bool, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 1);
return (bytes1(ret) > 0, startByte);
}
function _readUint8(bytes memory data, uint256 startByte) internal pure returns (uint8, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 1);
return (uint8(bytes1(ret)), startByte);
}
function _readUint24(bytes memory data, uint256 startByte) internal pure returns (uint24, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 3);
return (uint24(bytes3(ret)), startByte);
}
function _readUint32(bytes memory data, uint256 startByte) internal pure returns (uint32, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 4);
return (uint32(bytes4(ret)), startByte);
}
function _readUint128(bytes memory data, uint256 startByte) internal pure returns (uint128, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 16);
return (uint128(bytes16(ret)), startByte);
}
function _readUint160(bytes memory data, uint256 startByte) internal pure returns (uint160, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 20);
return (uint160(bytes20(ret)), startByte);
}
function _readUint128AsUint256(bytes memory data, uint256 startByte) internal pure returns (uint256, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 16);
return (uint256(uint128(bytes16(ret))), startByte);
}
function _readAddress(bytes memory data, uint256 startByte) internal pure returns (address, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 20);
return (address(bytes20(ret)), startByte);
}
function _readBytes1(bytes memory data, uint256 startByte) internal pure returns (bytes1, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 1);
return (bytes1(ret), startByte);
}
function _readBytes4(bytes memory data, uint256 startByte) internal pure returns (bytes4, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 4);
return (bytes4(ret), startByte);
}
function _readBytes32(bytes memory data, uint256 startByte) internal pure returns (bytes32, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 32);
return (bytes32(ret), startByte);
}
function _readBytes(bytes memory data, uint256 startByte) internal pure returns (bytes memory b, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 4);
uint256 length = uint256(uint32(bytes4(ret)));
(b, startByte) = _calldataVal(data, startByte, length);
return (b, startByte);
}
function _readBytesArray(
bytes memory data,
uint256 startByte
) internal pure returns (bytes[] memory bytesArray, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 1);
uint256 length = uint256(uint8(bytes1(ret)));
bytesArray = new bytes[](length);
for (uint8 i = 0; i < length; ++i) {
(bytesArray[i], startByte) = _readBytes(data, startByte);
}
return (bytesArray, startByte);
}
function _readAddressArray(
bytes memory data,
uint256 startByte
) internal pure returns (address[] memory addrs, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 1);
uint256 length = uint256(uint8(bytes1(ret)));
addrs = new address[](length);
for (uint8 i = 0; i < length; ++i) {
(addrs[i], startByte) = _readAddress(data, startByte);
}
return (addrs, startByte);
}
function _readUint128ArrayAsUint256Array(
bytes memory data,
uint256 startByte
) internal pure returns (uint256[] memory, uint256) {
bytes memory ret;
(ret, startByte) = _calldataVal(data, startByte, 1);
uint256 length = uint256(uint8(bytes1(ret)));
uint256[] memory us = new uint256[](length);
for (uint8 i = 0; i < length; ++i) {
(us[i], startByte) = _readUint128AsUint256(data, startByte);
}
return (us, startByte);
}
}
文件 4 的 27:CalldataWriter.sol
pragma solidity ^0.8.0;
import {IMetaAggregationRouterV2} from "../interfaces/IMetaAggregationRouterV2.sol";
import {IAggregationExecutorOptimistic as IExecutorHelperL2} from "../interfaces/IAggregationExecutorOptimistic.sol";
import {IExecutorHelper as IExecutorHelperL1} from "../interfaces/IExecutorHelper.sol";
library CalldataWriter {
function writeSimpleSwapData(
IMetaAggregationRouterV2.SimpleSwapData memory simpleSwapData
) internal pure returns (bytes memory shortData) {
shortData = bytes.concat(shortData, _writeAddressArray(simpleSwapData.firstPools));
shortData = bytes.concat(shortData, _writeUint256ArrayAsUint128Array(simpleSwapData.firstSwapAmounts));
shortData = bytes.concat(shortData, _writeBytesArray(simpleSwapData.swapDatas));
shortData = bytes.concat(shortData, bytes16(uint128(simpleSwapData.deadline)));
shortData = bytes.concat(shortData, _writeBytes(simpleSwapData.positiveSlippageData));
}
function writeSwapExecutorDescription(
IExecutorHelperL2.SwapExecutorDescription memory desc
) internal pure returns (bytes memory shortData) {
uint8 lX = uint8(desc.swapSequences.length);
shortData = bytes.concat(shortData, bytes1(lX));
for (uint8 i = 0; i < lX; ++i) {
uint8 lY = uint8(desc.swapSequences[i].length);
shortData = bytes.concat(shortData, bytes1(lY));
for (uint8 j = 0; j < lY; ++j) {
shortData = bytes.concat(shortData, _writeSwap(desc.swapSequences[i][j]));
}
}
shortData = bytes.concat(shortData, bytes20(desc.tokenIn));
shortData = bytes.concat(shortData, bytes20(desc.tokenOut));
shortData = bytes.concat(shortData, bytes20(desc.to));
shortData = bytes.concat(shortData, bytes16(uint128(desc.deadline)));
shortData = bytes.concat(shortData, _writeBytes(desc.positiveSlippageData));
}
function writeSimpleModeSwapDatas(
bytes[] memory swapDatas,
address tokenIn
) internal pure returns (bytes[] memory shortData) {
uint8 len = uint8(swapDatas.length);
for (uint8 i = 0; i < len; ++i) {
swapDatas[i] = _writeSwapSingleSequence(swapDatas[i], tokenIn);
}
return (swapDatas);
}
function _writeSwapSingleSequence(
bytes memory data,
address tokenIn
) internal pure returns (bytes memory shortData) {
IExecutorHelperL2.Swap[] memory swaps = abi.decode(data, (IExecutorHelperL2.Swap[]));
uint8 len = uint8(swaps.length);
shortData = bytes.concat(shortData, bytes1(len));
for (uint8 i = 0; i < len; ++i) {
shortData = bytes.concat(shortData, _writeSwap(swaps[i]));
}
shortData = bytes.concat(shortData, bytes20(tokenIn));
}
function _writeAddressArray(address[] memory addrs) internal pure returns (bytes memory data) {
uint8 length = uint8(addrs.length);
data = bytes.concat(data, bytes1(length));
for (uint8 i = 0; i < length; ++i) {
data = bytes.concat(data, bytes20(addrs[i]));
}
return data;
}
function _writeUint256ArrayAsUint128Array(uint256[] memory us) internal pure returns (bytes memory data) {
uint8 length = uint8(us.length);
data = bytes.concat(data, bytes1(length));
for (uint8 i = 0; i < length; ++i) {
data = bytes.concat(data, bytes16(uint128(us[i])));
}
return data;
}
function _writeBytes(bytes memory b) internal pure returns (bytes memory data) {
uint32 length = uint32(b.length);
data = bytes.concat(data, bytes4(length));
data = bytes.concat(data, b);
return data;
}
function _writeBytesArray(bytes[] memory bytesArray) internal pure returns (bytes memory data) {
uint8 x = uint8(bytesArray.length);
data = bytes.concat(data, bytes1(x));
for (uint8 i; i < x; ++i) {
uint32 length = uint32(bytesArray[i].length);
data = bytes.concat(data, bytes4(length));
data = bytes.concat(data, bytesArray[i]);
}
return data;
}
function _writeBytes32Array(bytes32[] memory bytesArray) internal pure returns (bytes memory data) {
uint8 x = uint8(bytesArray.length);
data = bytes.concat(data, bytes1(x));
for (uint8 i; i < x; ++i) {
data = bytes.concat(data, bytesArray[i]);
}
return data;
}
function _writeSwap(IExecutorHelperL2.Swap memory swap) internal pure returns (bytes memory shortData) {
shortData = bytes.concat(shortData, _writeBytes(swap.data));
shortData = bytes.concat(shortData, bytes1(uint8(uint32(swap.functionSelector))));
}
}
文件 5 的 27:Common.sol
pragma solidity ^0.8.0;
import "./CalldataReader.sol";
library Common {
using CalldataReader for bytes;
function _readPool(bytes memory data, uint256 startByte) internal pure returns (address, uint256) {
uint24 poolId;
address poolAddress;
(poolId, startByte) = data._readUint24(startByte);
if (poolId == 0) {
(poolAddress, startByte) = data._readAddress(startByte);
}
return (poolAddress, startByte);
}
function _readRecipient(bytes memory data, uint256 startByte) internal pure returns (address, uint256) {
uint8 recipientFlag;
address recipient;
(recipientFlag, startByte) = data._readUint8(startByte);
if (recipientFlag != 2 && recipientFlag != 1) {
(recipient, startByte) = data._readAddress(startByte);
}
return (recipient, startByte);
}
function _readBytes32Array(
bytes memory data,
uint256 startByte
) internal pure returns (bytes32[] memory bytesArray, uint256) {
bytes memory ret;
(ret, startByte) = data._calldataVal(startByte, 1);
uint256 length = uint256(uint8(bytes1(ret)));
bytesArray = new bytes32[](length);
for (uint8 i = 0; i < length; ++i) {
(bytesArray[i], startByte) = data._readBytes32(startByte);
}
return (bytesArray, startByte);
}
}
文件 6 的 27:DexScaler.sol
pragma solidity ^0.8.0;
import "./CalldataReader.sol";
import "../interfaces/IExecutorHelperL2.sol";
import {BytesHelper} from "./BytesHelper.sol";
import {Common} from "./Common.sol";
library DexScaler {
using BytesHelper for bytes;
using CalldataReader for bytes;
using Common for bytes;
function scaleUniSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readRecipient(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleUniSwap");
}
function scaleStableSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readUint8(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return
data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleStableSwap");
}
function scaleCurveSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
bool canGetIndex;
(canGetIndex, startByte) = data._readBool(0);
(, startByte) = data._readPool(startByte);
if (!canGetIndex) {
(, startByte) = data._readAddress(startByte);
(, startByte) = data._readUint8(startByte);
}
(, startByte) = data._readUint8(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return
data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleCurveSwap");
}
function scaleUniswapV3KSElastic(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readRecipient(startByte);
(, startByte) = data._readPool(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return
data.write16Bytes(
startByte,
oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount,
"scaleUniswapV3KSElastic"
);
}
function scaleBalancerV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readBytes32(startByte);
(, startByte) = data._readUint8(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return
data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleBalancerV2");
}
function scaleDODO(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readRecipient(startByte);
(, startByte) = data._readPool(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleDODO");
}
function scaleGMX(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleGMX");
}
function scaleSynthetix(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(, startByte) = data._readBytes32(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return
data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleSynthetix");
}
function scaleWrappedstETH(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return
data.write16Bytes(
startByte,
oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount,
"scaleWrappedstETH"
);
}
function scaleStETH(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
(uint256 swapAmount, ) = data._readUint128AsUint256(0);
return data.write16Bytes(0, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleStETH");
}
function scalePlatypus(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(, startByte) = data._readRecipient(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scalePlatypus");
}
function scalePSM(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scalePSM");
}
function scaleMaverick(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(, startByte) = data._readRecipient(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleMaverick");
}
function scaleSyncSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readBytes(startByte);
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleSyncSwap");
}
function scaleAlgebraV1(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readRecipient(startByte);
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return
data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleAlgebraV1");
}
function scaleBalancerBatch(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readBytes32Array(startByte);
(, startByte) = data._readAddressArray(startByte);
(, startByte) = data._readBytesArray(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return
data.write16Bytes(
startByte,
oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount,
"scaleBalancerBatch"
);
}
function scaleMantis(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleMantis");
}
function scaleIziSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(, startByte) = data._readRecipient(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleIziSwap");
}
function scaleTraderJoeV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readRecipient(startByte);
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(, startByte) = data._readBool(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return
data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleTraderJoeV2");
}
function scaleLevelFiV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return
data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleLevelFiV2");
}
function scaleGMXGLP(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddress(startByte);
uint8 directionFlag;
(directionFlag, startByte) = data._readUint8(startByte);
if (directionFlag == 1) (, startByte) = data._readAddress(startByte);
(uint256 swapAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (swapAmount * newAmount) / oldAmount, "scaleGMXGLP");
}
function scaleVooi(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readUint8(startByte);
(uint256 fromAmount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (fromAmount * newAmount) / oldAmount, "scaleVooi");
}
function scaleVelocoreV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(uint256 amount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (amount * newAmount) / oldAmount, "scaleVelocoreV2");
}
function scaleKokonut(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(uint256 amount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (amount * newAmount) / oldAmount, "scaleKokonut");
}
function scaleBalancerV1(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(uint256 amount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (amount * newAmount) / oldAmount, "scaleBalancerV1");
}
function scaleArbswapStable(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(uint256 dx, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (dx * newAmount) / oldAmount, "scaleArbswapStable");
}
function scaleBancorV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(, startByte) = data._readAddressArray(startByte);
(uint256 amount, ) = data._readUint128AsUint256(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (amount * newAmount) / oldAmount, "scaleBancorV2");
}
function scaleAmbient(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(uint128 qty, ) = data._readUint128(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (qty * newAmount) / oldAmount, "scaleAmbient");
}
function scaleLighterV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 startByte;
(, startByte) = data._readPool(startByte);
(uint128 amount, ) = data._readUint128(startByte);
return data.write16Bytes(startByte, oldAmount == 0 ? 0 : (amount * newAmount) / oldAmount, "scaleLighterV2");
}
}
文件 7 的 27:Errors.sol
pragma solidity ^0.8.0;
library Errors {
error BulkInsufficientSyForTrade(uint256 currentAmount, uint256 requiredAmount);
error BulkInsufficientTokenForTrade(uint256 currentAmount, uint256 requiredAmount);
error BulkInSufficientSyOut(uint256 actualSyOut, uint256 requiredSyOut);
error BulkInSufficientTokenOut(uint256 actualTokenOut, uint256 requiredTokenOut);
error BulkInsufficientSyReceived(uint256 actualBalance, uint256 requiredBalance);
error BulkNotMaintainer();
error BulkNotAdmin();
error BulkSellerAlreadyExisted(address token, address SY, address bulk);
error BulkSellerInvalidToken(address token, address SY);
error BulkBadRateTokenToSy(uint256 actualRate, uint256 currentRate, uint256 eps);
error BulkBadRateSyToToken(uint256 actualRate, uint256 currentRate, uint256 eps);
error ApproxFail();
error ApproxParamsInvalid(uint256 guessMin, uint256 guessMax, uint256 eps);
error ApproxBinarySearchInputInvalid(
uint256 approxGuessMin,
uint256 approxGuessMax,
uint256 minGuessMin,
uint256 maxGuessMax
);
error MarketExpired();
error MarketZeroAmountsInput();
error MarketZeroAmountsOutput();
error MarketZeroLnImpliedRate();
error MarketInsufficientPtForTrade(int256 currentAmount, int256 requiredAmount);
error MarketInsufficientPtReceived(uint256 actualBalance, uint256 requiredBalance);
error MarketInsufficientSyReceived(uint256 actualBalance, uint256 requiredBalance);
error MarketZeroTotalPtOrTotalAsset(int256 totalPt, int256 totalAsset);
error MarketExchangeRateBelowOne(int256 exchangeRate);
error MarketProportionMustNotEqualOne();
error MarketRateScalarBelowZero(int256 rateScalar);
error MarketScalarRootBelowZero(int256 scalarRoot);
error MarketProportionTooHigh(int256 proportion, int256 maxProportion);
error OracleUninitialized();
error OracleTargetTooOld(uint32 target, uint32 oldest);
error OracleZeroCardinality();
error MarketFactoryExpiredPt();
error MarketFactoryInvalidPt();
error MarketFactoryMarketExists();
error MarketFactoryLnFeeRateRootTooHigh(uint80 lnFeeRateRoot, uint256 maxLnFeeRateRoot);
error MarketFactoryOverriddenFeeTooHigh(uint80 overriddenFee, uint256 marketLnFeeRateRoot);
error MarketFactoryReserveFeePercentTooHigh(uint8 reserveFeePercent, uint8 maxReserveFeePercent);
error MarketFactoryZeroTreasury();
error MarketFactoryInitialAnchorTooLow(int256 initialAnchor, int256 minInitialAnchor);
error MFNotPendleMarket(address addr);
error RouterInsufficientLpOut(uint256 actualLpOut, uint256 requiredLpOut);
error RouterInsufficientSyOut(uint256 actualSyOut, uint256 requiredSyOut);
error RouterInsufficientPtOut(uint256 actualPtOut, uint256 requiredPtOut);
error RouterInsufficientYtOut(uint256 actualYtOut, uint256 requiredYtOut);
error RouterInsufficientPYOut(uint256 actualPYOut, uint256 requiredPYOut);
error RouterInsufficientTokenOut(uint256 actualTokenOut, uint256 requiredTokenOut);
error RouterInsufficientSyRepay(uint256 actualSyRepay, uint256 requiredSyRepay);
error RouterInsufficientPtRepay(uint256 actualPtRepay, uint256 requiredPtRepay);
error RouterNotAllSyUsed(uint256 netSyDesired, uint256 netSyUsed);
error RouterTimeRangeZero();
error RouterCallbackNotPendleMarket(address caller);
error RouterInvalidAction(bytes4 selector);
error RouterInvalidFacet(address facet);
error RouterKyberSwapDataZero();
error SimulationResults(bool success, bytes res);
error YCExpired();
error YCNotExpired();
error YieldContractInsufficientSy(uint256 actualSy, uint256 requiredSy);
error YCNothingToRedeem();
error YCPostExpiryDataNotSet();
error YCNoFloatingSy();
error YCFactoryInvalidExpiry();
error YCFactoryYieldContractExisted();
error YCFactoryZeroExpiryDivisor();
error YCFactoryZeroTreasury();
error YCFactoryInterestFeeRateTooHigh(uint256 interestFeeRate, uint256 maxInterestFeeRate);
error YCFactoryRewardFeeRateTooHigh(uint256 newRewardFeeRate, uint256 maxRewardFeeRate);
error SYInvalidTokenIn(address token);
error SYInvalidTokenOut(address token);
error SYZeroDeposit();
error SYZeroRedeem();
error SYInsufficientSharesOut(uint256 actualSharesOut, uint256 requiredSharesOut);
error SYInsufficientTokenOut(uint256 actualTokenOut, uint256 requiredTokenOut);
error SYQiTokenMintFailed(uint256 errCode);
error SYQiTokenRedeemFailed(uint256 errCode);
error SYQiTokenRedeemRewardsFailed(uint256 rewardAccruedType0, uint256 rewardAccruedType1);
error SYQiTokenBorrowRateTooHigh(uint256 borrowRate, uint256 borrowRateMax);
error SYCurveInvalidPid();
error SYCurve3crvPoolNotFound();
error SYApeDepositAmountTooSmall(uint256 amountDeposited);
error SYBalancerInvalidPid();
error SYInvalidRewardToken(address token);
error SYStargateRedeemCapExceeded(uint256 amountLpDesired, uint256 amountLpRedeemable);
error SYBalancerReentrancy();
error NotFromTrustedRemote(uint16 srcChainId, bytes path);
error ApxETHNotEnoughBuffer();
error VCInactivePool(address pool);
error VCPoolAlreadyActive(address pool);
error VCZeroVePendle(address user);
error VCExceededMaxWeight(uint256 totalWeight, uint256 maxWeight);
error VCEpochNotFinalized(uint256 wTime);
error VCPoolAlreadyAddAndRemoved(address pool);
error VEInvalidNewExpiry(uint256 newExpiry);
error VEExceededMaxLockTime();
error VEInsufficientLockTime();
error VENotAllowedReduceExpiry();
error VEZeroAmountLocked();
error VEPositionNotExpired();
error VEZeroPosition();
error VEZeroSlope(uint128 bias, uint128 slope);
error VEReceiveOldSupply(uint256 msgTime);
error GCNotPendleMarket(address caller);
error GCNotVotingController(address caller);
error InvalidWTime(uint256 wTime);
error ExpiryInThePast(uint256 expiry);
error ChainNotSupported(uint256 chainId);
error FDTotalAmountFundedNotMatch(uint256 actualTotalAmount, uint256 expectedTotalAmount);
error FDEpochLengthMismatch();
error FDInvalidPool(address pool);
error FDPoolAlreadyExists(address pool);
error FDInvalidNewFinishedEpoch(uint256 oldFinishedEpoch, uint256 newFinishedEpoch);
error FDInvalidStartEpoch(uint256 startEpoch);
error FDInvalidWTimeFund(uint256 lastFunded, uint256 wTime);
error FDFutureFunding(uint256 lastFunded, uint256 currentWTime);
error BDInvalidEpoch(uint256 epoch, uint256 startTime);
error MsgNotFromSendEndpoint(uint16 srcChainId, bytes path);
error MsgNotFromReceiveEndpoint(address sender);
error InsufficientFeeToSendMsg(uint256 currentFee, uint256 requiredFee);
error ApproxDstExecutionGasNotSet();
error InvalidRetryData();
error ArrayLengthMismatch();
error ArrayEmpty();
error ArrayOutOfBounds();
error ZeroAddress();
error FailedToSendEther();
error InvalidMerkleProof();
error OnlyLayerZeroEndpoint();
error OnlyYT();
error OnlyYCFactory();
error OnlyWhitelisted();
error SAInsufficientTokenIn(address tokenIn, uint256 amountExpected, uint256 amountActual);
error UnsupportedSelector(uint256 aggregatorType, bytes4 selector);
}
文件 8 的 27:ExecutorReader.sol
pragma solidity ^0.8.0;
import "./CalldataReader.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../interfaces/IAggregationExecutorOptimistic.sol";
library ExecutorReader {
function readSwapExecutorDescription(bytes memory data) internal pure returns (bytes memory) {
uint256 startByte = 0;
IAggregationExecutorOptimistic.SwapExecutorDescription memory desc;
bytes memory ret;
(ret, startByte) = CalldataReader._calldataVal(data, startByte, 1);
uint256 lX = uint256(uint8(bytes1(ret)));
desc.swapSequences = new IAggregationExecutorOptimistic.Swap[][](lX);
for (uint8 i = 0; i < lX; ++i) {
(ret, startByte) = CalldataReader._calldataVal(data, startByte, 1);
uint256 lY = uint256(uint8(bytes1(ret)));
desc.swapSequences[i] = new IAggregationExecutorOptimistic.Swap[](lY);
for (uint8 j = 0; j < lY; ++j) {
(desc.swapSequences[i][j], startByte) = _readSwap(data, startByte);
}
}
(desc.tokenIn, startByte) = CalldataReader._readAddress(data, startByte);
(desc.tokenOut, startByte) = CalldataReader._readAddress(data, startByte);
(desc.to, startByte) = CalldataReader._readAddress(data, startByte);
(desc.deadline, startByte) = CalldataReader._readUint128AsUint256(data, startByte);
(desc.positiveSlippageData, startByte) = CalldataReader._readBytes(data, startByte);
return abi.encode(desc);
}
function readSwapSingleSequence(
bytes memory data
) internal pure returns (IAggregationExecutorOptimistic.Swap[] memory swaps, address tokenIn) {
uint256 startByte = 0;
bytes memory ret;
(ret, startByte) = CalldataReader._calldataVal(data, startByte, 1);
uint256 len = uint256(uint8(bytes1(ret)));
swaps = new IAggregationExecutorOptimistic.Swap[](len);
for (uint8 i = 0; i < len; ++i) {
(swaps[i], startByte) = _readSwap(data, startByte);
}
(tokenIn, startByte) = CalldataReader._readAddress(data, startByte);
}
function _readSwap(
bytes memory data,
uint256 startByte
) internal pure returns (IAggregationExecutorOptimistic.Swap memory swap, uint256) {
(swap.data, startByte) = CalldataReader._readBytes(data, startByte);
bytes1 t;
(t, startByte) = CalldataReader._readBytes1(data, startByte);
swap.functionSelector = bytes4(uint32(uint8(t)));
return (swap, startByte);
}
}
文件 9 的 27:I1inchAggregationRouterV5.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
interface I1inchAggregationRouterV5 {
struct SwapDescription {
IERC20 srcToken;
IERC20 dstToken;
address payable srcReceiver;
address payable dstReceiver;
uint256 amount;
uint256 minReturnAmount;
uint256 flags;
}
function uniswapV3SwapTo(
address payable recipient,
uint256 amount,
uint256 minReturn,
uint256[] calldata pools
) external payable returns (uint256 returnAmount);
function swap(
address executor,
SwapDescription calldata desc,
bytes calldata permit,
bytes calldata data
) external payable returns (uint256 returnAmount, uint256 spentAmount);
function unoswapTo(
address payable recipient,
address srcToken,
uint256 amount,
uint256 minReturn,
uint256[] calldata pools
) external payable returns (uint256 returnAmount);
}
文件 10 的 27:IAggregationExecutor.sol
pragma solidity >=0.6.12;
interface IAggregationExecutor {
function callBytes(bytes calldata data) external payable;
function swapSingleSequence(bytes calldata data) external;
function finalTransactionProcessing(
address tokenIn,
address tokenOut,
address to,
bytes calldata destTokenFeeData
) external;
}
文件 11 的 27:IAggregationExecutorOptimistic.sol
pragma solidity >=0.6.12;
interface IAggregationExecutorOptimistic {
event Exchange(address pair, uint256 amountOut, address output);
struct Swap {
bytes data;
bytes4 functionSelector;
}
struct SwapCallbackData {
bytes path;
address payer;
}
struct SwapCallbackDataPath {
address pool;
address tokenIn;
address tokenOut;
}
struct PositiveSlippageFeeData {
uint256 partnerPSInfor;
uint256 expectedReturnAmount;
}
struct SwapExecutorDescription {
Swap[][] swapSequences;
address tokenIn;
address tokenOut;
address to;
uint256 deadline;
bytes positiveSlippageData;
}
function rescueFunds(address token, uint256 amount) external;
function callBytes(bytes calldata data) external payable;
function swapSingleSequence(bytes calldata data) external;
function multihopBatchSwapExactIn(
Swap[][] memory swapSequences,
address tokenIn,
address tokenOut,
address to,
uint256 deadline,
bytes memory positiveSlippageData
) external payable;
function finalTransactionProcessing(
address tokenIn,
address tokenOut,
address to,
bytes calldata destTokenFeeData
) external;
function updateExecutor(bytes4 functionSelector, address executor) external;
function updateBatchExecutors(bytes4[] memory functionSelectors, address[] memory executors) external;
}
文件 12 的 27:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 13 的 27:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 14 的 27:IERC20Permit.sol
pragma solidity ^0.8.0;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
文件 15 的 27:IExecutorHelper.sol
pragma solidity >=0.6.12;
interface IExecutorHelper {
struct Swap {
bytes data;
bytes32 selectorAndFlags;
}
struct SwapExecutorDescription {
Swap[][] swapSequences;
address tokenIn;
address tokenOut;
uint256 minTotalAmountOut;
address to;
uint256 deadline;
bytes positiveSlippageData;
}
struct UniSwap {
address pool;
address tokenIn;
address tokenOut;
address recipient;
uint256 collectAmount;
uint32 swapFee;
uint32 feePrecision;
uint32 tokenWeightInput;
}
struct StableSwap {
address pool;
address tokenFrom;
address tokenTo;
uint8 tokenIndexFrom;
uint8 tokenIndexTo;
uint256 dx;
uint256 poolLength;
address poolLp;
bool isSaddle;
}
struct CurveSwap {
address pool;
address tokenFrom;
address tokenTo;
int128 tokenIndexFrom;
int128 tokenIndexTo;
uint256 dx;
bool usePoolUnderlying;
bool useTriCrypto;
}
struct UniswapV3KSElastic {
address recipient;
address pool;
address tokenIn;
address tokenOut;
uint256 swapAmount;
uint160 sqrtPriceLimitX96;
bool isUniV3;
}
struct BalancerV2 {
address vault;
bytes32 poolId;
address assetIn;
address assetOut;
uint256 amount;
}
struct DODO {
address recipient;
address pool;
address tokenFrom;
address tokenTo;
uint256 amount;
address sellHelper;
bool isSellBase;
bool isVersion2;
}
struct GMX {
address vault;
address tokenIn;
address tokenOut;
uint256 amount;
address receiver;
}
struct Synthetix {
address synthetixProxy;
address tokenIn;
address tokenOut;
bytes32 sourceCurrencyKey;
uint256 sourceAmount;
bytes32 destinationCurrencyKey;
bool useAtomicExchange;
}
struct Platypus {
address pool;
address tokenIn;
address tokenOut;
address recipient;
uint256 collectAmount;
}
struct PSM {
address router;
address tokenIn;
address tokenOut;
uint256 amountIn;
address recipient;
}
struct WSTETH {
address pool;
uint256 amount;
bool isWrapping;
}
struct Maverick {
address pool;
address tokenIn;
address tokenOut;
address recipient;
uint256 swapAmount;
uint256 sqrtPriceLimitD18;
}
struct SyncSwap {
bytes _data;
address vault;
address tokenIn;
address pool;
uint256 collectAmount;
}
struct AlgebraV1 {
address recipient;
address pool;
address tokenIn;
address tokenOut;
uint256 swapAmount;
uint160 sqrtPriceLimitX96;
uint256 senderFeeOnTransfer;
}
struct BalancerBatch {
address vault;
bytes32[] poolIds;
address[] path;
bytes[] userDatas;
uint256 amountIn;
}
struct Mantis {
address pool;
address tokenIn;
address tokenOut;
uint256 amount;
address recipient;
}
struct IziSwap {
address pool;
address tokenIn;
address tokenOut;
address recipient;
uint256 swapAmount;
int24 limitPoint;
}
struct TraderJoeV2 {
address recipient;
address pool;
address tokenIn;
address tokenOut;
uint256 collectAmount;
}
struct LevelFiV2 {
address pool;
address fromToken;
address toToken;
uint256 amountIn;
uint256 minAmountOut;
address recipient;
}
struct GMXGLP {
address rewardRouter;
address stakedGLP;
address glpManager;
address yearnVault;
address tokenIn;
address tokenOut;
uint256 swapAmount;
address recipient;
}
struct Vooi {
address pool;
address fromToken;
address toToken;
uint256 fromID;
uint256 toID;
uint256 fromAmount;
address to;
}
struct VelocoreV2 {
address vault;
uint256 amount;
address tokenIn;
address tokenOut;
address stablePool;
address wrapToken;
bool isConvertFirst;
}
struct MaticMigrate {
address pool;
address tokenAddress;
uint256 amount;
address recipient;
}
struct Kokonut {
address pool;
uint256 dx;
uint256 tokenIndexFrom;
address fromToken;
address toToken;
}
struct BalancerV1 {
address pool;
address tokenIn;
address tokenOut;
uint256 amount;
}
struct SwaapV2 {
address router;
uint256 amount;
bytes data;
address tokenIn;
address tokenOut;
address recipient;
}
struct ArbswapStable {
address pool;
uint256 dx;
uint256 tokenIndexFrom;
address tokenIn;
address tokenOut;
}
struct BancorV2 {
address pool;
address[] swapPath;
uint256 amount;
address recipient;
}
struct Ambient {
address pool;
uint128 qty;
address base;
address quote;
uint256 poolIdx;
uint8 settleFlags;
}
struct UniV1 {
address pool;
uint256 amount;
address tokenIn;
address tokenOut;
address recipient;
}
struct LighterV2 {
address orderBook;
uint256 amount;
bool isAsk;
address tokenIn;
address tokenOut;
address recipient;
}
struct EtherFiWeETH {
uint256 amount;
bool isWrapping;
}
struct Kelp {
uint256 amount;
address tokenIn;
}
struct EthenaSusde {
uint256 amount;
address recipient;
}
struct RocketPool {
address pool;
uint256 isDepositAndAmount;
}
struct MakersDAI {
uint256 isRedeemAndAmount;
address recipient;
}
struct Renzo {
address pool;
uint256 amount;
address tokenIn;
address tokenOut;
}
struct FrxETH {
address pool;
uint256 amount;
address tokenOut;
}
struct SfrxETH {
address pool;
uint256 amount;
address tokenOut;
address recipient;
}
struct SfrxETHConvertor {
address pool;
uint256 isDepositAndAmount;
address tokenIn;
address tokenOut;
address recipient;
}
struct OriginETH {
address pool;
uint256 amount;
}
function executeUniswap(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeStableSwap(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeCurve(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeKSClassic(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeUniV3KSElastic(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeRfq(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeBalV2(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeDODO(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeVelodrome(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeGMX(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executePlatypus(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeWrappedstETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeStEth(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeSynthetix(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeHashflow(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executePSM(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeFrax(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeCamelot(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeKyberLimitOrder(
bytes memory data,
uint256 flagsAndPrevAmountOut
) external payable returns (uint256);
function executeMaverick(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeSyncSwap(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeAlgebraV1(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeBalancerBatch(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeWombat(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeMantis(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeIziSwap(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeWooFiV2(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeTraderJoeV2(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executePancakeStableSwap(
bytes memory data,
uint256 flagsAndPrevAmountOut
) external payable returns (uint256);
function executeLevelFiV2(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeGMXGLP(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeVooi(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeVelocoreV2(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeMaticMigrate(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeSmardex(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeSolidlyV2(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeKokonut(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeBalancerV1(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeSwaapV2(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeNomiswapStable(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeArbswapStable(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeBancorV2(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeBancorV3(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeAmbient(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeUniV1(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeNative(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeBebop(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeLighterV2(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeEtherFieETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeEtherFiWeETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeKelp(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeRocketPool(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeEthenaSusde(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeMakersDAI(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeRenzo(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeWBETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeMantleETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeFrxETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeSfrxETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeSfrxETHConvertor(
bytes memory data,
uint256 flagsAndPrevAmountOut
) external payable returns (uint256);
function executeSwellETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeRswETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeStaderETHx(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeOriginETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executePrimeETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeMantleUsd(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeBedrockUniETH(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
function executeMaiPSM(bytes memory data, uint256 flagsAndPrevAmountOut) external payable returns (uint256);
}
文件 16 的 27:IExecutorHelperL2.sol
pragma solidity >=0.6.12;
interface IExecutorHelperL2 {
struct Swap {
bytes data;
bytes4 functionSelector;
}
struct SwapExecutorDescription {
Swap[][] swapSequences;
address tokenIn;
address tokenOut;
uint256 minTotalAmountOut;
address to;
uint256 deadline;
bytes positiveSlippageData;
}
struct UniSwap {
address pool;
address tokenIn;
address tokenOut;
address recipient;
uint256 collectAmount;
uint32 swapFee;
uint32 feePrecision;
uint32 tokenWeightInput;
}
struct StableSwap {
address pool;
address tokenFrom;
address tokenTo;
uint8 tokenIndexFrom;
uint8 tokenIndexTo;
uint256 dx;
uint256 poolLength;
address poolLp;
bool isSaddle;
}
struct CurveSwap {
address pool;
address tokenFrom;
address tokenTo;
int128 tokenIndexFrom;
int128 tokenIndexTo;
uint256 dx;
bool usePoolUnderlying;
bool useTriCrypto;
}
struct UniswapV3KSElastic {
address recipient;
address pool;
address tokenIn;
address tokenOut;
uint256 swapAmount;
uint160 sqrtPriceLimitX96;
bool isUniV3;
}
struct SwapCallbackData {
bytes path;
address payer;
}
struct SwapCallbackDataPath {
address pool;
address tokenIn;
address tokenOut;
}
struct BalancerV2 {
address vault;
bytes32 poolId;
address assetIn;
address assetOut;
uint256 amount;
}
struct DODO {
address recipient;
address pool;
address tokenFrom;
address tokenTo;
uint256 amount;
address sellHelper;
bool isSellBase;
bool isVersion2;
}
struct GMX {
address vault;
address tokenIn;
address tokenOut;
uint256 amount;
address receiver;
}
struct Synthetix {
address synthetixProxy;
address tokenIn;
address tokenOut;
bytes32 sourceCurrencyKey;
uint256 sourceAmount;
bytes32 destinationCurrencyKey;
bool useAtomicExchange;
}
struct WSTETH {
address pool;
uint256 amount;
bool isWrapping;
}
struct Platypus {
address pool;
address tokenIn;
address tokenOut;
address recipient;
uint256 collectAmount;
}
struct PSM {
address router;
address tokenIn;
address tokenOut;
uint256 amountIn;
address recipient;
}
struct Maverick {
address pool;
address tokenIn;
address tokenOut;
address recipient;
uint256 swapAmount;
uint256 sqrtPriceLimitD18;
}
struct SyncSwap {
bytes _data;
address vault;
address tokenIn;
address pool;
uint256 collectAmount;
}
struct AlgebraV1 {
address recipient;
address pool;
address tokenIn;
address tokenOut;
uint256 swapAmount;
uint160 sqrtPriceLimitX96;
uint256 senderFeeOnTransfer;
}
struct BalancerBatch {
address vault;
bytes32[] poolIds;
address[] path;
bytes[] userDatas;
uint256 amountIn;
}
struct Mantis {
address pool;
address tokenIn;
address tokenOut;
uint256 amount;
address recipient;
}
struct IziSwap {
address pool;
address tokenIn;
address tokenOut;
address recipient;
uint256 swapAmount;
int24 limitPoint;
}
struct TraderJoeV2 {
address recipient;
address pool;
address tokenIn;
address tokenOut;
uint256 collectAmount;
}
struct LevelFiV2 {
address pool;
address fromToken;
address toToken;
uint256 amountIn;
uint256 minAmountOut;
address recipient;
}
struct GMXGLP {
address rewardRouter;
address stakedGLP;
address glpManager;
address yearnVault;
address tokenIn;
address tokenOut;
uint256 swapAmount;
address recipient;
}
struct Vooi {
address pool;
address fromToken;
address toToken;
uint256 fromID;
uint256 toID;
uint256 fromAmount;
address to;
}
struct VelocoreV2 {
address vault;
uint256 amount;
address tokenIn;
address tokenOut;
address stablePool;
address wrapToken;
bool isConvertFirst;
}
struct MaticMigrate {
address pool;
address tokenAddress;
uint256 amount;
address recipient;
}
struct Kokonut {
address pool;
uint256 dx;
uint256 tokenIndexFrom;
address fromToken;
address toToken;
}
struct BalancerV1 {
address pool;
uint256 amount;
address tokenIn;
address tokenOut;
}
struct SwaapV2 {
address router;
uint256 amount;
bytes data;
address tokenIn;
address tokenOut;
address recipient;
}
struct ArbswapStable {
address pool;
uint256 dx;
uint256 tokenIndexFrom;
address tokenIn;
address tokenOut;
}
struct BancorV2 {
address pool;
address[] swapPath;
uint256 amount;
address recipient;
}
struct Ambient {
address pool;
uint128 qty;
address base;
address quote;
uint256 poolIdx;
uint8 settleFlags;
}
struct LighterV2 {
address orderBook;
uint256 amount;
bool isAsk;
address tokenIn;
address tokenOut;
address recipient;
}
struct FrxETH {
address pool;
uint256 amount;
address tokenOut;
}
function executeUniswap(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeKSClassic(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeVelodrome(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeFrax(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeCamelot(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeKyberLimitOrder(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeRfq(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeHashflow(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeStableSwap(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeCurve(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeUniV3KSElastic(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeBalV2(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeDODO(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeGMX(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeSynthetix(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeWrappedstETH(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeStEth(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executePlatypus(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executePSM(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeMaverick(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeSyncSwap(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeAlgebraV1(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeBalancerBatch(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeWombat(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeMantis(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeIziSwap(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeTraderJoeV2(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeLevelFiV2(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeGMXGLP(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeVooi(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeVelocoreV2(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeSmardex(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeSolidlyV2(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeKokonut(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeBalancerV1(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeSwaapV2(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeNomiswapStable(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeArbswapStable(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeBancorV2(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeBancorV3(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeAmbient(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeNative(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeLighterV2(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
function executeMaiPSM(
uint256 index,
bytes memory data,
uint256 previousAmountOut,
address tokenIn,
bool getPoolOnly,
address nextPool
) external payable returns (address tokenOut, uint256 tokenAmountOut, address pool);
}
文件 17 的 27:IMetaAggregationRouterV2.sol
pragma solidity >=0.6.12;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IAggregationExecutor} from "./IAggregationExecutor.sol";
interface IMetaAggregationRouterV2 {
struct SwapDescriptionV2 {
IERC20 srcToken;
IERC20 dstToken;
address[] srcReceivers;
uint256[] srcAmounts;
address[] feeReceivers;
uint256[] feeAmounts;
address dstReceiver;
uint256 amount;
uint256 minReturnAmount;
uint256 flags;
bytes permit;
}
struct SwapExecutionParams {
address callTarget;
address approveTarget;
bytes targetData;
SwapDescriptionV2 desc;
bytes clientData;
}
struct SimpleSwapData {
address[] firstPools;
uint256[] firstSwapAmounts;
bytes[] swapDatas;
uint256 deadline;
bytes positiveSlippageData;
}
function swap(SwapExecutionParams calldata execution) external payable returns (uint256, uint256);
function swapSimpleMode(
IAggregationExecutor caller,
SwapDescriptionV2 memory desc,
bytes calldata executorData,
bytes calldata clientData
) external returns (uint256, uint256);
}
文件 18 的 27:IPSwapAggregator.sol
pragma solidity ^0.8.0;
struct SwapData {
SwapType swapType;
address extRouter;
bytes extCalldata;
bool needScale;
}
enum SwapType {
NONE,
KYBERSWAP,
ONE_INCH,
ETH_WETH
}
interface IPSwapAggregator {
function swap(address tokenIn, uint256 amountIn, SwapData calldata swapData) external payable;
}
文件 19 的 27:IWETH.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IWETH is IERC20 {
event Deposit(address indexed dst, uint256 wad);
event Withdrawal(address indexed src, uint256 wad);
function deposit() external payable;
function withdraw(uint256 wad) external;
}
文件 20 的 27:InputScalingHelper.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IExecutorHelper} from "../interfaces/IExecutorHelper.sol";
import {IMetaAggregationRouterV2} from "../interfaces/IMetaAggregationRouterV2.sol";
import {ScalingDataLib} from "./ScalingDataLib.sol";
library InputScalingHelper {
uint256 private constant _PARTIAL_FILL = 0x01;
uint256 private constant _REQUIRES_EXTRA_ETH = 0x02;
uint256 private constant _SHOULD_CLAIM = 0x04;
uint256 private constant _BURN_FROM_MSG_SENDER = 0x08;
uint256 private constant _BURN_FROM_TX_ORIGIN = 0x10;
uint256 private constant _SIMPLE_SWAP = 0x20;
struct PositiveSlippageFeeData {
uint256 partnerPSInfor;
uint256 expectedReturnAmount;
}
struct Swap {
bytes data;
bytes32 selectorAndFlags;
}
struct SimpleSwapData {
address[] firstPools;
uint256[] firstSwapAmounts;
bytes[] swapDatas;
uint256 deadline;
bytes positiveSlippageData;
}
struct SwapExecutorDescription {
Swap[][] swapSequences;
address tokenIn;
address tokenOut;
address to;
uint256 deadline;
bytes positiveSlippageData;
}
function _getScaledInputData(bytes calldata inputData, uint256 newAmount) internal pure returns (bytes memory) {
bytes4 selector = bytes4(inputData[:4]);
bytes calldata dataToDecode = inputData[4:];
if (selector == IMetaAggregationRouterV2.swap.selector) {
IMetaAggregationRouterV2.SwapExecutionParams memory params = abi.decode(
dataToDecode,
(IMetaAggregationRouterV2.SwapExecutionParams)
);
(params.desc, params.targetData) = _getScaledInputDataV2(
params.desc,
params.targetData,
newAmount,
_flagsChecked(params.desc.flags, _SIMPLE_SWAP)
);
return abi.encodeWithSelector(selector, params);
} else if (selector == IMetaAggregationRouterV2.swapSimpleMode.selector) {
(
address callTarget,
IMetaAggregationRouterV2.SwapDescriptionV2 memory desc,
bytes memory targetData,
bytes memory clientData
) = abi.decode(dataToDecode, (address, IMetaAggregationRouterV2.SwapDescriptionV2, bytes, bytes));
(desc, targetData) = _getScaledInputDataV2(desc, targetData, newAmount, true);
return abi.encodeWithSelector(selector, callTarget, desc, targetData, clientData);
} else {
revert("InputScalingHelper: Invalid selector");
}
}
function _getScaledInputDataV2(
IMetaAggregationRouterV2.SwapDescriptionV2 memory desc,
bytes memory executorData,
uint256 newAmount,
bool isSimpleMode
) internal pure returns (IMetaAggregationRouterV2.SwapDescriptionV2 memory, bytes memory) {
uint256 oldAmount = desc.amount;
if (oldAmount == newAmount) {
return (desc, executorData);
}
if (isSimpleMode) {
return (
_scaledSwapDescriptionV2(desc, oldAmount, newAmount),
_scaledSimpleSwapData(executorData, oldAmount, newAmount)
);
}
return (
_scaledSwapDescriptionV2(desc, oldAmount, newAmount),
_scaledExecutorCallBytesData(executorData, oldAmount, newAmount)
);
}
function _scaledSwapDescriptionV2(
IMetaAggregationRouterV2.SwapDescriptionV2 memory desc,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (IMetaAggregationRouterV2.SwapDescriptionV2 memory) {
desc.minReturnAmount = (desc.minReturnAmount * newAmount) / oldAmount;
if (desc.minReturnAmount == 0) desc.minReturnAmount = 1;
desc.amount = newAmount;
uint256 nReceivers = desc.srcReceivers.length;
for (uint256 i = 0; i < nReceivers; ) {
desc.srcAmounts[i] = (desc.srcAmounts[i] * newAmount) / oldAmount;
unchecked {
++i;
}
}
return desc;
}
function _scaledSimpleSwapData(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
SimpleSwapData memory swapData = abi.decode(data, (SimpleSwapData));
uint256 nPools = swapData.firstPools.length;
for (uint256 i = 0; i < nPools; ) {
swapData.firstSwapAmounts[i] = (swapData.firstSwapAmounts[i] * newAmount) / oldAmount;
unchecked {
++i;
}
}
swapData.positiveSlippageData = _scaledPositiveSlippageFeeData(
swapData.positiveSlippageData,
oldAmount,
newAmount
);
return abi.encode(swapData);
}
function _scaledExecutorCallBytesData(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
SwapExecutorDescription memory executorDesc = abi.decode(data, (SwapExecutorDescription));
executorDesc.positiveSlippageData = _scaledPositiveSlippageFeeData(
executorDesc.positiveSlippageData,
oldAmount,
newAmount
);
uint256 nSequences = executorDesc.swapSequences.length;
for (uint256 i = 0; i < nSequences; ) {
Swap memory swap = executorDesc.swapSequences[i][0];
bytes4 functionSelector = bytes4(swap.selectorAndFlags);
if (functionSelector == IExecutorHelper.executeUniswap.selector) {
swap.data = ScalingDataLib.newUniSwap(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeStableSwap.selector) {
swap.data = ScalingDataLib.newStableSwap(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeCurve.selector) {
swap.data = ScalingDataLib.newCurveSwap(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeKSClassic.selector) {
swap.data = ScalingDataLib.newKyberDMM(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeUniV3KSElastic.selector) {
swap.data = ScalingDataLib.newUniV3ProMM(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeRfq.selector) {
revert("InputScalingHelper: Can not scale RFQ swap");
} else if (functionSelector == IExecutorHelper.executeBalV2.selector) {
swap.data = ScalingDataLib.newBalancerV2(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeWrappedstETH.selector) {
swap.data = ScalingDataLib.newWrappedstETHSwap(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeStEth.selector) {
swap.data = ScalingDataLib.newStETHSwap(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeDODO.selector) {
swap.data = ScalingDataLib.newDODO(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeVelodrome.selector) {
swap.data = ScalingDataLib.newVelodrome(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeGMX.selector) {
swap.data = ScalingDataLib.newGMX(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeSynthetix.selector) {
swap.data = ScalingDataLib.newSynthetix(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeHashflow.selector) {
revert("InputScalingHelper: Can not scale Hasflow swap");
} else if (functionSelector == IExecutorHelper.executeCamelot.selector) {
swap.data = ScalingDataLib.newCamelot(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeKyberLimitOrder.selector) {
revert("InputScalingHelper: Can not scale KyberLO swap");
} else if (functionSelector == IExecutorHelper.executePSM.selector) {
swap.data = ScalingDataLib.newPSM(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeFrax.selector) {
swap.data = ScalingDataLib.newFrax(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executePlatypus.selector) {
swap.data = ScalingDataLib.newPlatypus(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeMaverick.selector) {
swap.data = ScalingDataLib.newMaverick(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeSyncSwap.selector) {
swap.data = ScalingDataLib.newSyncSwap(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeAlgebraV1.selector) {
swap.data = ScalingDataLib.newAlgebraV1(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeBalancerBatch.selector) {
swap.data = ScalingDataLib.newBalancerBatch(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeWombat.selector) {
swap.data = ScalingDataLib.newMantis(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeMantis.selector) {
swap.data = ScalingDataLib.newMantis(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeIziSwap.selector) {
swap.data = ScalingDataLib.newIziSwap(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeWooFiV2.selector) {
swap.data = ScalingDataLib.newMantis(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeTraderJoeV2.selector) {
swap.data = ScalingDataLib.newTraderJoeV2(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executePancakeStableSwap.selector) {
swap.data = ScalingDataLib.newCurveSwap(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeLevelFiV2.selector) {
swap.data = ScalingDataLib.newLevelFiV2(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeGMXGLP.selector) {
swap.data = ScalingDataLib.newGMXGLP(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeVooi.selector) {
swap.data = ScalingDataLib.newVooi(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeVelocoreV2.selector) {
swap.data = ScalingDataLib.newVelocoreV2(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeMaticMigrate.selector) {
swap.data = ScalingDataLib.newMaticMigrate(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeSmardex.selector) {
swap.data = ScalingDataLib.newMantis(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeSolidlyV2.selector) {
swap.data = ScalingDataLib.newMantis(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeKokonut.selector) {
swap.data = ScalingDataLib.newKokonut(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeBalancerV1.selector) {
swap.data = ScalingDataLib.newBalancerV1(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeSwaapV2.selector) {
revert("InputScalingHelper: Can not scale SwaapV2 swap");
} else if (functionSelector == IExecutorHelper.executeNomiswapStable.selector) {
swap.data = ScalingDataLib.newMantis(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeArbswapStable.selector) {
swap.data = ScalingDataLib.newArbswapStable(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeBancorV2.selector) {
swap.data = ScalingDataLib.newBancorV2(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeBancorV3.selector) {
swap.data = ScalingDataLib.newMantis(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeAmbient.selector) {
swap.data = ScalingDataLib.newAmbient(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeNative.selector) {
revert("InputScalingHelper: Can not scale Native swap");
} else if (functionSelector == IExecutorHelper.executeLighterV2.selector) {
swap.data = ScalingDataLib.newLighterV2(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeBebop.selector) {
revert("InputScalingHelper: Can not scale Bebop swap");
} else if (functionSelector == IExecutorHelper.executeUniV1.selector) {
swap.data = ScalingDataLib.newUniV1(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeEtherFieETH.selector) {
swap.data = ScalingDataLib.newEtherFieETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeEtherFiWeETH.selector) {
swap.data = ScalingDataLib.newEtherFiWeETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeKelp.selector) {
swap.data = ScalingDataLib.newKelp(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeEthenaSusde.selector) {
swap.data = ScalingDataLib.newEthenaSusde(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeRocketPool.selector) {
swap.data = ScalingDataLib.newRocketPool(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeMakersDAI.selector) {
swap.data = ScalingDataLib.newMakersDAI(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeRenzo.selector) {
swap.data = ScalingDataLib.newRenzo(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeWBETH.selector) {
swap.data = ScalingDataLib.newEtherFieETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeMantleETH.selector) {
swap.data = ScalingDataLib.newEtherFieETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeFrxETH.selector) {
swap.data = ScalingDataLib.newFrxETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeSfrxETH.selector) {
swap.data = ScalingDataLib.newSfrxETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeSfrxETHConvertor.selector) {
swap.data = ScalingDataLib.newSfrxETHConvertor(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeSwellETH.selector) {
swap.data = ScalingDataLib.newEtherFieETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeRswETH.selector) {
swap.data = ScalingDataLib.newEtherFieETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeStaderETHx.selector) {
swap.data = ScalingDataLib.newEthenaSusde(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeOriginETH.selector) {
swap.data = ScalingDataLib.newOriginETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executePrimeETH.selector) {
swap.data = ScalingDataLib.newOriginETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeMantleUsd.selector) {
swap.data = ScalingDataLib.newMantleUsd(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeBedrockUniETH.selector) {
swap.data = ScalingDataLib.newEtherFieETH(swap.data, oldAmount, newAmount);
} else if (functionSelector == IExecutorHelper.executeMaiPSM.selector) {
swap.data = ScalingDataLib.newFrxETH(swap.data, oldAmount, newAmount);
} else {
revert("AggregationExecutor: Dex type not supported");
}
unchecked {
++i;
}
}
return abi.encode(executorDesc);
}
function _scaledPositiveSlippageFeeData(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory newData) {
if (data.length > 32) {
PositiveSlippageFeeData memory psData = abi.decode(data, (PositiveSlippageFeeData));
uint256 left = uint256(psData.expectedReturnAmount >> 128);
uint256 right = (uint256(uint128(psData.expectedReturnAmount)) * newAmount) / oldAmount;
require(right <= type(uint128).max, "Exceeded type range");
psData.expectedReturnAmount = right | (left << 128);
data = abi.encode(psData);
} else if (data.length == 32) {
uint256 expectedReturnAmount = abi.decode(data, (uint256));
uint256 left = uint256(expectedReturnAmount >> 128);
uint256 right = (uint256(uint128(expectedReturnAmount)) * newAmount) / oldAmount;
require(right <= type(uint128).max, "Exceeded type range");
expectedReturnAmount = right | (left << 128);
data = abi.encode(expectedReturnAmount);
}
return data;
}
function _flagsChecked(uint256 number, uint256 flag) internal pure returns (bool) {
return number & flag != 0;
}
}
文件 21 的 27:InputScalingHelperL2.sol
pragma solidity ^0.8.0;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IAggregationExecutorOptimistic as IExecutorHelperL2} from "../interfaces/IAggregationExecutorOptimistic.sol";
import {IExecutorHelper as IExecutorHelperL1} from "../interfaces/IExecutorHelper.sol";
import {IMetaAggregationRouterV2} from "../interfaces/IMetaAggregationRouterV2.sol";
import {ScalingDataL2Lib} from "./ScalingDataL2Lib.sol";
import {ExecutorReader} from "./ExecutorReader.sol";
import {CalldataWriter} from "./CalldataWriter.sol";
library InputScalingHelperL2 {
using ExecutorReader for bytes;
using ScalingDataL2Lib for bytes;
uint256 private constant _PARTIAL_FILL = 0x01;
uint256 private constant _REQUIRES_EXTRA_ETH = 0x02;
uint256 private constant _SHOULD_CLAIM = 0x04;
uint256 private constant _BURN_FROM_MSG_SENDER = 0x08;
uint256 private constant _BURN_FROM_TX_ORIGIN = 0x10;
uint256 private constant _SIMPLE_SWAP = 0x20;
struct PositiveSlippageFeeData {
uint256 partnerPSInfor;
uint256 expectedReturnAmount;
}
enum DexIndex {
UNI,
KyberDMM,
Velodrome,
Fraxswap,
Camelot,
KyberLO,
RFQ,
Hashflow,
StableSwap,
Curve,
UniswapV3KSElastic,
BalancerV2,
DODO,
GMX,
Synthetix,
wstETH,
stETH,
Platypus,
PSM,
Maverick,
SyncSwap,
AlgebraV1,
BalancerBatch,
Mantis,
Wombat,
WooFiV2,
iZiSwap,
TraderJoeV2,
KyberDSLO,
LevelFiV2,
GMXGLP,
PancakeStableSwap,
Vooi,
VelocoreV2,
Smardex,
SolidlyV2,
Kokonut,
BalancerV1,
SwaapV2,
NomiswapStable,
ArbswapStable,
BancorV3,
BancorV2,
Ambient,
Native,
LighterV2,
Bebop
}
function _getScaledInputData(bytes calldata inputData, uint256 newAmount) internal pure returns (bytes memory) {
bytes4 selector = bytes4(inputData[:4]);
bytes calldata dataToDecode = inputData[4:];
if (selector == IMetaAggregationRouterV2.swap.selector) {
IMetaAggregationRouterV2.SwapExecutionParams memory params = abi.decode(
dataToDecode,
(IMetaAggregationRouterV2.SwapExecutionParams)
);
(params.desc, params.targetData) = _getScaledInputDataV2(
params.desc,
params.targetData,
newAmount,
_flagsChecked(params.desc.flags, _SIMPLE_SWAP)
);
return abi.encodeWithSelector(selector, params);
} else if (selector == IMetaAggregationRouterV2.swapSimpleMode.selector) {
(
address callTarget,
IMetaAggregationRouterV2.SwapDescriptionV2 memory desc,
bytes memory targetData,
bytes memory clientData
) = abi.decode(dataToDecode, (address, IMetaAggregationRouterV2.SwapDescriptionV2, bytes, bytes));
(desc, targetData) = _getScaledInputDataV2(desc, targetData, newAmount, true);
return abi.encodeWithSelector(selector, callTarget, desc, targetData, clientData);
} else {
revert("InputScalingHelper: Invalid selector");
}
}
function _getScaledInputDataV2(
IMetaAggregationRouterV2.SwapDescriptionV2 memory desc,
bytes memory executorData,
uint256 newAmount,
bool isSimpleMode
) internal pure returns (IMetaAggregationRouterV2.SwapDescriptionV2 memory, bytes memory) {
uint256 oldAmount = desc.amount;
if (oldAmount == newAmount) {
return (desc, executorData);
}
if (isSimpleMode) {
return (
_scaledSwapDescriptionV2(desc, oldAmount, newAmount),
_scaledSimpleSwapData(executorData, oldAmount, newAmount)
);
}
return (
_scaledSwapDescriptionV2(desc, oldAmount, newAmount),
_scaledExecutorCallBytesData(executorData, oldAmount, newAmount)
);
}
function _scaledSwapDescriptionV2(
IMetaAggregationRouterV2.SwapDescriptionV2 memory desc,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (IMetaAggregationRouterV2.SwapDescriptionV2 memory) {
desc.minReturnAmount = (desc.minReturnAmount * newAmount) / oldAmount;
if (desc.minReturnAmount == 0) desc.minReturnAmount = 1;
desc.amount = (desc.amount * newAmount) / oldAmount;
uint256 nReceivers = desc.srcReceivers.length;
for (uint256 i = 0; i < nReceivers; ) {
desc.srcAmounts[i] = (desc.srcAmounts[i] * newAmount) / oldAmount;
unchecked {
++i;
}
}
return desc;
}
function _scaledSimpleSwapData(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IMetaAggregationRouterV2.SimpleSwapData memory simpleSwapData = abi.decode(
data,
(IMetaAggregationRouterV2.SimpleSwapData)
);
uint256 nPools = simpleSwapData.firstPools.length;
address tokenIn;
for (uint256 i = 0; i < nPools; ) {
simpleSwapData.firstSwapAmounts[i] = (simpleSwapData.firstSwapAmounts[i] * newAmount) / oldAmount;
IExecutorHelperL2.Swap[] memory dexData;
(dexData, tokenIn) = simpleSwapData.swapDatas[i].readSwapSingleSequence();
if (dexData.length > 0) {
dexData[0] = _scaleDexData(dexData[0], oldAmount, newAmount);
}
simpleSwapData.swapDatas[i] = CalldataWriter._writeSwapSingleSequence(abi.encode(dexData), tokenIn);
unchecked {
++i;
}
}
simpleSwapData.positiveSlippageData = _scaledPositiveSlippageFeeData(
simpleSwapData.positiveSlippageData,
oldAmount,
newAmount
);
return abi.encode(simpleSwapData);
}
function _scaledExecutorCallBytesData(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelperL2.SwapExecutorDescription memory executorDesc = abi.decode(
data.readSwapExecutorDescription(),
(IExecutorHelperL2.SwapExecutorDescription)
);
executorDesc.positiveSlippageData = _scaledPositiveSlippageFeeData(
executorDesc.positiveSlippageData,
oldAmount,
newAmount
);
uint256 nSequences = executorDesc.swapSequences.length;
for (uint256 i = 0; i < nSequences; ) {
IExecutorHelperL2.Swap memory swap = executorDesc.swapSequences[i][0];
executorDesc.swapSequences[i][0] = _scaleDexData(swap, oldAmount, newAmount);
unchecked {
++i;
}
}
return CalldataWriter.writeSwapExecutorDescription(executorDesc);
}
function _scaledPositiveSlippageFeeData(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory newData) {
if (data.length > 32) {
PositiveSlippageFeeData memory psData = abi.decode(data, (PositiveSlippageFeeData));
uint256 left = uint256(psData.expectedReturnAmount >> 128);
uint256 right = (uint256(uint128(psData.expectedReturnAmount)) * newAmount) / oldAmount;
require(right <= type(uint128).max, "_scaledPositiveSlippageFeeData/Exceeded type range");
psData.expectedReturnAmount = right | (left << 128);
data = abi.encode(psData);
} else if (data.length == 32) {
uint256 expectedReturnAmount = abi.decode(data, (uint256));
uint256 left = uint256(expectedReturnAmount >> 128);
uint256 right = (uint256(uint128(expectedReturnAmount)) * newAmount) / oldAmount;
require(right <= type(uint128).max, "_scaledPositiveSlippageFeeData/Exceeded type range");
expectedReturnAmount = right | (left << 128);
data = abi.encode(expectedReturnAmount);
}
return data;
}
function _scaleDexData(
IExecutorHelperL2.Swap memory swap,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (IExecutorHelperL2.Swap memory) {
uint8 functionSelectorIndex = uint8(uint32(swap.functionSelector));
if (DexIndex(functionSelectorIndex) == DexIndex.UNI) {
swap.data = swap.data.newUniSwap(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.StableSwap) {
swap.data = swap.data.newStableSwap(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Curve) {
swap.data = swap.data.newCurveSwap(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.KyberDMM) {
swap.data = swap.data.newKyberDMM(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.UniswapV3KSElastic) {
swap.data = swap.data.newUniswapV3KSElastic(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.RFQ) {
revert("InputScalingHelper: Can not scale RFQ swap");
} else if (DexIndex(functionSelectorIndex) == DexIndex.BalancerV2) {
swap.data = swap.data.newBalancerV2(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.wstETH) {
swap.data = swap.data.newWrappedstETHSwap(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.stETH) {
swap.data = swap.data.newStETHSwap(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.DODO) {
swap.data = swap.data.newDODO(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Velodrome) {
swap.data = swap.data.newVelodrome(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.GMX) {
swap.data = swap.data.newGMX(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Synthetix) {
swap.data = swap.data.newSynthetix(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Hashflow) {
revert("InputScalingHelper: Can not scale Hashflow swap");
} else if (DexIndex(functionSelectorIndex) == DexIndex.Camelot) {
swap.data = swap.data.newCamelot(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.KyberLO) {
revert("InputScalingHelper: Can not scale KyberLO swap");
} else if (DexIndex(functionSelectorIndex) == DexIndex.PSM) {
swap.data = swap.data.newPSM(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Fraxswap) {
swap.data = swap.data.newFrax(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Platypus) {
swap.data = swap.data.newPlatypus(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Maverick) {
swap.data = swap.data.newMaverick(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.SyncSwap) {
swap.data = swap.data.newSyncSwap(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.AlgebraV1) {
swap.data = swap.data.newAlgebraV1(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.BalancerBatch) {
swap.data = swap.data.newBalancerBatch(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Mantis) {
swap.data = swap.data.newMantis(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Wombat) {
swap.data = swap.data.newMantis(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.iZiSwap) {
swap.data = swap.data.newIziSwap(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.TraderJoeV2) {
swap.data = swap.data.newTraderJoeV2(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.WooFiV2) {
swap.data = swap.data.newMantis(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.KyberDSLO) {
revert("InputScalingHelper: Can not scale KyberDSLO swap");
} else if (DexIndex(functionSelectorIndex) == DexIndex.LevelFiV2) {
swap.data = swap.data.newLevelFiV2(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.PancakeStableSwap) {
swap.data = swap.data.newCurveSwap(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.GMXGLP) {
swap.data = swap.data.newGMXGLP(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Vooi) {
swap.data = swap.data.newVooi(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.VelocoreV2) {
swap.data = swap.data.newVelocoreV2(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Smardex) {
swap.data = swap.data.newMantis(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.SolidlyV2) {
swap.data = swap.data.newMantis(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Kokonut) {
swap.data = swap.data.newKokonut(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.BalancerV1) {
swap.data = swap.data.newBalancerV1(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.SwaapV2) {
revert("InputScalingHelper: Can not scale SwaapV2 swap");
} else if (DexIndex(functionSelectorIndex) == DexIndex.NomiswapStable) {
swap.data = swap.data.newMantis(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.ArbswapStable) {
swap.data = swap.data.newArbswapStable(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.BancorV2) {
swap.data = swap.data.newBancorV2(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.BancorV3) {
swap.data = swap.data.newMantis(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Ambient) {
swap.data = swap.data.newAmbient(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Native) {
revert("InputScalingHelper: Can not scale Native swap");
} else if (DexIndex(functionSelectorIndex) == DexIndex.LighterV2) {
swap.data = swap.data.newLighterV2(oldAmount, newAmount);
} else if (DexIndex(functionSelectorIndex) == DexIndex.Bebop) {
revert("InputScalingHelper: Can not scale Bebop swap");
} else {
revert("InputScaleHelper: Dex type not supported");
}
return swap;
}
function _flagsChecked(uint256 number, uint256 flag) internal pure returns (bool) {
return number & flag != 0;
}
}
文件 22 的 27:OneInchAggregationRouterHelper.sol
pragma solidity ^0.8.0;
import "./I1inchAggregationRouterV5.sol";
import "../../../core/libraries/Errors.sol";
abstract contract OneInchAggregationRouterHelper {
function _rescaleMinAmount(
uint256 minAmount,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (uint256) {
return (minAmount * newAmount) / oldAmount;
}
function _get1inchScaledInputData(
bytes calldata rawCallData,
uint256 newAmount
) internal pure returns (bytes memory) {
bytes4 selector = bytes4(rawCallData[:4]);
bytes memory args = rawCallData[4:];
if (selector == I1inchAggregationRouterV5.uniswapV3SwapTo.selector) {
(address payable recipient, uint256 amount, uint256 minReturn, uint256[] memory pools) = abi.decode(
args,
(address, uint256, uint256, uint256[])
);
amount = newAmount;
return abi.encodeWithSelector(selector, recipient, amount, minReturn, pools);
}
if (selector == I1inchAggregationRouterV5.swap.selector) {
(
address executor,
I1inchAggregationRouterV5.SwapDescription memory desc,
bytes memory permit,
bytes memory data
) = abi.decode(args, (address, I1inchAggregationRouterV5.SwapDescription, bytes, bytes));
desc.amount = newAmount;
return abi.encodeWithSelector(selector, executor, desc, permit, data);
}
if (selector == I1inchAggregationRouterV5.unoswapTo.selector) {
(
address payable recipient,
address srcToken,
uint256 amount,
uint256 minReturn,
uint256[] memory pools
) = abi.decode(args, (address, address, uint256, uint256, uint256[]));
amount = newAmount;
return abi.encodeWithSelector(selector, recipient, srcToken, amount, minReturn, pools);
}
revert Errors.UnsupportedSelector(2, selector);
}
}
文件 23 的 27:PendleSwap.sol
pragma solidity ^0.8.17;
import "../../core/libraries/TokenHelper.sol";
import "./IPSwapAggregator.sol";
import "./kyberswap/l1-contracts/InputScalingHelper.sol";
import "./kyberswap/l2-contracts/InputScalingHelperL2.sol";
import "./oneinch/OneInchAggregationRouterHelper.sol";
abstract contract PendleSwapBase is IPSwapAggregator, TokenHelper, OneInchAggregationRouterHelper {
using Address for address;
function swap(address tokenIn, uint256 amountIn, SwapData calldata data) external payable {
_safeApproveInf(tokenIn, data.extRouter);
data.extRouter.functionCallWithValue(
data.needScale ? _getScaledInputData(data.swapType, data.extCalldata, amountIn) : data.extCalldata,
tokenIn == NATIVE ? amountIn : 0
);
}
function _getScaledInputData(
SwapType swapType,
bytes calldata rawCallData,
uint256 amountIn
) internal pure returns (bytes memory scaledCallData) {
if (swapType == SwapType.KYBERSWAP) {
scaledCallData = _getKyberScaledInputData(rawCallData, amountIn);
} else if (swapType == SwapType.ONE_INCH) {
scaledCallData = _get1inchScaledInputData(rawCallData, amountIn);
} else {
assert(false);
}
}
function _getKyberScaledInputData(
bytes calldata rawCallData,
uint256 amountIn
) internal pure virtual returns (bytes memory scaledCallData);
receive() external payable {}
}
contract PendleSwapL1 is PendleSwapBase {
function _getKyberScaledInputData(
bytes calldata rawCallData,
uint256 amountIn
) internal pure override returns (bytes memory) {
return InputScalingHelper._getScaledInputData(rawCallData, amountIn);
}
}
contract PendleSwapL2 is PendleSwapBase {
function _getKyberScaledInputData(
bytes calldata rawCallData,
uint256 amountIn
) internal pure override returns (bytes memory) {
return InputScalingHelperL2._getScaledInputData(rawCallData, amountIn);
}
}
文件 24 的 27:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}
文件 25 的 27:ScalingDataL2Lib.sol
pragma solidity ^0.8.0;
import {IExecutorHelper} from "../interfaces/IExecutorHelper.sol";
import {DexScaler} from "./DexScaler.sol";
library ScalingDataL2Lib {
using DexScaler for bytes;
function newUniSwap(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleUniSwap(oldAmount, newAmount);
}
function newStableSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleStableSwap(oldAmount, newAmount);
}
function newCurveSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleCurveSwap(oldAmount, newAmount);
}
function newKyberDMM(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleUniSwap(oldAmount, newAmount);
}
function newUniswapV3KSElastic(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleUniswapV3KSElastic(oldAmount, newAmount);
}
function newBalancerV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleBalancerV2(oldAmount, newAmount);
}
function newDODO(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleDODO(oldAmount, newAmount);
}
function newVelodrome(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleUniSwap(oldAmount, newAmount);
}
function newGMX(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleGMX(oldAmount, newAmount);
}
function newSynthetix(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleSynthetix(oldAmount, newAmount);
}
function newCamelot(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleUniSwap(oldAmount, newAmount);
}
function newPlatypus(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scalePlatypus(oldAmount, newAmount);
}
function newWrappedstETHSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleWrappedstETH(oldAmount, newAmount);
}
function newPSM(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scalePSM(oldAmount, newAmount);
}
function newFrax(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleUniSwap(oldAmount, newAmount);
}
function newStETHSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleStETH(oldAmount, newAmount);
}
function newMaverick(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleMaverick(oldAmount, newAmount);
}
function newSyncSwap(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleSyncSwap(oldAmount, newAmount);
}
function newAlgebraV1(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleAlgebraV1(oldAmount, newAmount);
}
function newBalancerBatch(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleBalancerBatch(oldAmount, newAmount);
}
function newMantis(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleMantis(oldAmount, newAmount);
}
function newIziSwap(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleIziSwap(oldAmount, newAmount);
}
function newTraderJoeV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleTraderJoeV2(oldAmount, newAmount);
}
function newLevelFiV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleLevelFiV2(oldAmount, newAmount);
}
function newGMXGLP(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleGMXGLP(oldAmount, newAmount);
}
function newVooi(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleVooi(oldAmount, newAmount);
}
function newVelocoreV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleVelocoreV2(oldAmount, newAmount);
}
function newKokonut(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleKokonut(oldAmount, newAmount);
}
function newBalancerV1(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleBalancerV1(oldAmount, newAmount);
}
function newArbswapStable(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleArbswapStable(oldAmount, newAmount);
}
function newBancorV2(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleBancorV2(oldAmount, newAmount);
}
function newAmbient(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
return data.scaleAmbient(oldAmount, newAmount);
}
function newLighterV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
return data.scaleLighterV2(oldAmount, newAmount);
}
}
文件 26 的 27:ScalingDataLib.sol
pragma solidity ^0.8.0;
import {IExecutorHelper} from "../interfaces/IExecutorHelper.sol";
library ScalingDataLib {
function newUniSwap(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.UniSwap memory uniSwap = abi.decode(data, (IExecutorHelper.UniSwap));
uniSwap.collectAmount = (uniSwap.collectAmount * newAmount) / oldAmount;
return abi.encode(uniSwap);
}
function newStableSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.StableSwap memory stableSwap = abi.decode(data, (IExecutorHelper.StableSwap));
stableSwap.dx = (stableSwap.dx * newAmount) / oldAmount;
return abi.encode(stableSwap);
}
function newCurveSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.CurveSwap memory curveSwap = abi.decode(data, (IExecutorHelper.CurveSwap));
curveSwap.dx = (curveSwap.dx * newAmount) / oldAmount;
return abi.encode(curveSwap);
}
function newKyberDMM(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.UniSwap memory kyberDMMSwap = abi.decode(data, (IExecutorHelper.UniSwap));
kyberDMMSwap.collectAmount = (kyberDMMSwap.collectAmount * newAmount) / oldAmount;
return abi.encode(kyberDMMSwap);
}
function newUniV3ProMM(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.UniswapV3KSElastic memory uniSwapV3ProMM = abi.decode(
data,
(IExecutorHelper.UniswapV3KSElastic)
);
uniSwapV3ProMM.swapAmount = (uniSwapV3ProMM.swapAmount * newAmount) / oldAmount;
return abi.encode(uniSwapV3ProMM);
}
function newBalancerV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.BalancerV2 memory balancerV2 = abi.decode(data, (IExecutorHelper.BalancerV2));
balancerV2.amount = (balancerV2.amount * newAmount) / oldAmount;
return abi.encode(balancerV2);
}
function newDODO(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.DODO memory dodo = abi.decode(data, (IExecutorHelper.DODO));
dodo.amount = (dodo.amount * newAmount) / oldAmount;
return abi.encode(dodo);
}
function newVelodrome(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.UniSwap memory velodrome = abi.decode(data, (IExecutorHelper.UniSwap));
velodrome.collectAmount = (velodrome.collectAmount * newAmount) / oldAmount;
return abi.encode(velodrome);
}
function newGMX(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.GMX memory gmx = abi.decode(data, (IExecutorHelper.GMX));
gmx.amount = (gmx.amount * newAmount) / oldAmount;
return abi.encode(gmx);
}
function newSynthetix(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.Synthetix memory synthetix = abi.decode(data, (IExecutorHelper.Synthetix));
synthetix.sourceAmount = (synthetix.sourceAmount * newAmount) / oldAmount;
return abi.encode(synthetix);
}
function newCamelot(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.UniSwap memory camelot = abi.decode(data, (IExecutorHelper.UniSwap));
camelot.collectAmount = (camelot.collectAmount * newAmount) / oldAmount;
return abi.encode(camelot);
}
function newPlatypus(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.Platypus memory platypus = abi.decode(data, (IExecutorHelper.Platypus));
platypus.collectAmount = (platypus.collectAmount * newAmount) / oldAmount;
return abi.encode(platypus);
}
function newWrappedstETHSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.WSTETH memory wstEthData = abi.decode(data, (IExecutorHelper.WSTETH));
wstEthData.amount = (wstEthData.amount * newAmount) / oldAmount;
return abi.encode(wstEthData);
}
function newPSM(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.PSM memory psm = abi.decode(data, (IExecutorHelper.PSM));
psm.amountIn = (psm.amountIn * newAmount) / oldAmount;
return abi.encode(psm);
}
function newFrax(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.UniSwap memory frax = abi.decode(data, (IExecutorHelper.UniSwap));
frax.collectAmount = (frax.collectAmount * newAmount) / oldAmount;
return abi.encode(frax);
}
function newStETHSwap(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 amount = abi.decode(data, (uint256));
amount = (amount * newAmount) / oldAmount;
return abi.encode(amount);
}
function newMaverick(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.Maverick memory maverick = abi.decode(data, (IExecutorHelper.Maverick));
maverick.swapAmount = (maverick.swapAmount * newAmount) / oldAmount;
return abi.encode(maverick);
}
function newSyncSwap(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.SyncSwap memory syncSwap = abi.decode(data, (IExecutorHelper.SyncSwap));
syncSwap.collectAmount = (syncSwap.collectAmount * newAmount) / oldAmount;
return abi.encode(syncSwap);
}
function newAlgebraV1(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.AlgebraV1 memory algebraV1Swap = abi.decode(data, (IExecutorHelper.AlgebraV1));
algebraV1Swap.swapAmount = (algebraV1Swap.swapAmount * newAmount) / oldAmount;
return abi.encode(algebraV1Swap);
}
function newBalancerBatch(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.BalancerBatch memory balancerBatch = abi.decode(data, (IExecutorHelper.BalancerBatch));
balancerBatch.amountIn = (balancerBatch.amountIn * newAmount) / oldAmount;
return abi.encode(balancerBatch);
}
function newMantis(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.Mantis memory mantis = abi.decode(data, (IExecutorHelper.Mantis));
mantis.amount = (mantis.amount * newAmount) / oldAmount;
return abi.encode(mantis);
}
function newIziSwap(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.IziSwap memory iZi = abi.decode(data, (IExecutorHelper.IziSwap));
iZi.swapAmount = (iZi.swapAmount * newAmount) / oldAmount;
return abi.encode(iZi);
}
function newTraderJoeV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.TraderJoeV2 memory traderJoe = abi.decode(data, (IExecutorHelper.TraderJoeV2));
traderJoe.collectAmount =
(traderJoe.collectAmount & (1 << 255)) |
((uint256((traderJoe.collectAmount << 1) >> 1) * newAmount) / oldAmount);
return abi.encode(traderJoe);
}
function newLevelFiV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.LevelFiV2 memory levelFiV2 = abi.decode(data, (IExecutorHelper.LevelFiV2));
levelFiV2.amountIn = (levelFiV2.amountIn * newAmount) / oldAmount;
return abi.encode(levelFiV2);
}
function newGMXGLP(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.GMXGLP memory swapData = abi.decode(data, (IExecutorHelper.GMXGLP));
swapData.swapAmount = (swapData.swapAmount * newAmount) / oldAmount;
return abi.encode(swapData);
}
function newVooi(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.Vooi memory vooi = abi.decode(data, (IExecutorHelper.Vooi));
vooi.fromAmount = (vooi.fromAmount * newAmount) / oldAmount;
return abi.encode(vooi);
}
function newVelocoreV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.VelocoreV2 memory velocorev2 = abi.decode(data, (IExecutorHelper.VelocoreV2));
velocorev2.amount = (velocorev2.amount * newAmount) / oldAmount;
return abi.encode(velocorev2);
}
function newMaticMigrate(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.MaticMigrate memory maticMigrate = abi.decode(data, (IExecutorHelper.MaticMigrate));
maticMigrate.amount = (maticMigrate.amount * newAmount) / oldAmount;
return abi.encode(maticMigrate);
}
function newKokonut(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.Kokonut memory kokonut = abi.decode(data, (IExecutorHelper.Kokonut));
kokonut.dx = (kokonut.dx * newAmount) / oldAmount;
return abi.encode(kokonut);
}
function newBalancerV1(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.BalancerV1 memory balancerV1 = abi.decode(data, (IExecutorHelper.BalancerV1));
balancerV1.amount = (balancerV1.amount * newAmount) / oldAmount;
return abi.encode(balancerV1);
}
function newArbswapStable(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.ArbswapStable memory arbswapStable = abi.decode(data, (IExecutorHelper.ArbswapStable));
arbswapStable.dx = (arbswapStable.dx * newAmount) / oldAmount;
return abi.encode(arbswapStable);
}
function newBancorV2(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.BancorV2 memory bancorV2 = abi.decode(data, (IExecutorHelper.BancorV2));
bancorV2.amount = (bancorV2.amount * newAmount) / oldAmount;
return abi.encode(bancorV2);
}
function newAmbient(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.Ambient memory ambient = abi.decode(data, (IExecutorHelper.Ambient));
ambient.qty = uint128((uint256(ambient.qty) * newAmount) / oldAmount);
return abi.encode(ambient);
}
function newLighterV2(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.LighterV2 memory structData = abi.decode(data, (IExecutorHelper.LighterV2));
structData.amount = uint128((uint256(structData.amount) * newAmount) / oldAmount);
return abi.encode(structData);
}
function newUniV1(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.UniV1 memory structData = abi.decode(data, (IExecutorHelper.UniV1));
structData.amount = uint128((uint256(structData.amount) * newAmount) / oldAmount);
return abi.encode(structData);
}
function newEtherFieETH(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 depositAmount = abi.decode(data, (uint256));
depositAmount = uint128((depositAmount * newAmount) / oldAmount);
return abi.encode(depositAmount);
}
function newEtherFiWeETH(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.EtherFiWeETH memory structData = abi.decode(data, (IExecutorHelper.EtherFiWeETH));
structData.amount = uint128((uint256(structData.amount) * newAmount) / oldAmount);
return abi.encode(structData);
}
function newKelp(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.Kelp memory structData = abi.decode(data, (IExecutorHelper.Kelp));
structData.amount = uint128((uint256(structData.amount) * newAmount) / oldAmount);
return abi.encode(structData);
}
function newEthenaSusde(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.EthenaSusde memory structData = abi.decode(data, (IExecutorHelper.EthenaSusde));
structData.amount = uint128((uint256(structData.amount) * newAmount) / oldAmount);
return abi.encode(structData);
}
function newRocketPool(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.RocketPool memory structData = abi.decode(data, (IExecutorHelper.RocketPool));
uint128 _amount = uint128((uint256(uint128(structData.isDepositAndAmount)) * newAmount) / oldAmount);
bool _isDeposit = (structData.isDepositAndAmount >> 255) == 1;
structData.isDepositAndAmount = 0;
structData.isDepositAndAmount |= uint256(uint128(_amount));
structData.isDepositAndAmount |= uint256(_isDeposit ? 1 : 0) << 255;
return abi.encode(structData);
}
function newMakersDAI(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.MakersDAI memory structData = abi.decode(data, (IExecutorHelper.MakersDAI));
uint128 _amount = uint128((uint256(uint128(structData.isRedeemAndAmount)) * newAmount) / oldAmount);
bool _isRedeem = (structData.isRedeemAndAmount >> 255) == 1;
structData.isRedeemAndAmount = 0;
structData.isRedeemAndAmount |= uint256(uint128(_amount));
structData.isRedeemAndAmount |= uint256(_isRedeem ? 1 : 0) << 255;
return abi.encode(structData);
}
function newRenzo(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.Renzo memory structData = abi.decode(data, (IExecutorHelper.Renzo));
structData.amount = uint128((uint256(structData.amount) * newAmount) / oldAmount);
return abi.encode(structData);
}
function newFrxETH(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.FrxETH memory structData = abi.decode(data, (IExecutorHelper.FrxETH));
structData.amount = uint128((uint256(structData.amount) * newAmount) / oldAmount);
return abi.encode(structData);
}
function newSfrxETH(bytes memory data, uint256 oldAmount, uint256 newAmount) internal pure returns (bytes memory) {
IExecutorHelper.SfrxETH memory structData = abi.decode(data, (IExecutorHelper.SfrxETH));
structData.amount = uint128((uint256(structData.amount) * newAmount) / oldAmount);
return abi.encode(structData);
}
function newSfrxETHConvertor(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.SfrxETHConvertor memory structData = abi.decode(data, (IExecutorHelper.SfrxETHConvertor));
uint128 _amount = uint128((uint256(uint128(structData.isDepositAndAmount)) * newAmount) / oldAmount);
bool _isDeposit = (structData.isDepositAndAmount >> 255) == 1;
structData.isDepositAndAmount = 0;
structData.isDepositAndAmount |= uint256(uint128(_amount));
structData.isDepositAndAmount |= uint256(_isDeposit ? 1 : 0) << 255;
return abi.encode(structData);
}
function newOriginETH(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
IExecutorHelper.OriginETH memory structData = abi.decode(data, (IExecutorHelper.OriginETH));
structData.amount = uint128((uint256(structData.amount) * newAmount) / oldAmount);
return abi.encode(structData);
}
function newMantleUsd(
bytes memory data,
uint256 oldAmount,
uint256 newAmount
) internal pure returns (bytes memory) {
uint256 isWrapAndAmount = abi.decode(data, (uint256));
uint128 _amount = uint128((uint256(uint128(isWrapAndAmount)) * newAmount) / oldAmount);
bool _isWrap = (isWrapAndAmount >> 255) == 1;
isWrapAndAmount = 0;
isWrapAndAmount |= uint256(uint128(_amount));
isWrapAndAmount |= uint256(_isWrap ? 1 : 0) << 255;
return abi.encode(isWrapAndAmount);
}
}
文件 27 的 27:TokenHelper.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../../interfaces/IWETH.sol";
abstract contract TokenHelper {
using SafeERC20 for IERC20;
address internal constant NATIVE = address(0);
uint256 internal constant LOWER_BOUND_APPROVAL = type(uint96).max / 2;
function _transferIn(address token, address from, uint256 amount) internal {
if (token == NATIVE) require(msg.value == amount, "eth mismatch");
else if (amount != 0) IERC20(token).safeTransferFrom(from, address(this), amount);
}
function _transferFrom(IERC20 token, address from, address to, uint256 amount) internal {
if (amount != 0) token.safeTransferFrom(from, to, amount);
}
function _transferOut(address token, address to, uint256 amount) internal {
if (amount == 0) return;
if (token == NATIVE) {
(bool success, ) = to.call{value: amount}("");
require(success, "eth send failed");
} else {
IERC20(token).safeTransfer(to, amount);
}
}
function _transferOut(address[] memory tokens, address to, uint256[] memory amounts) internal {
uint256 numTokens = tokens.length;
require(numTokens == amounts.length, "length mismatch");
for (uint256 i = 0; i < numTokens; ) {
_transferOut(tokens[i], to, amounts[i]);
unchecked {
i++;
}
}
}
function _selfBalance(address token) internal view returns (uint256) {
return (token == NATIVE) ? address(this).balance : IERC20(token).balanceOf(address(this));
}
function _selfBalance(IERC20 token) internal view returns (uint256) {
return token.balanceOf(address(this));
}
function _safeApprove(address token, address to, uint256 value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "Safe Approve");
}
function _safeApproveInf(address token, address to) internal {
if (token == NATIVE) return;
if (IERC20(token).allowance(address(this), to) < LOWER_BOUND_APPROVAL) {
_safeApprove(token, to, 0);
_safeApprove(token, to, type(uint256).max);
}
}
function _wrap_unwrap_ETH(address tokenIn, address tokenOut, uint256 netTokenIn) internal {
if (tokenIn == NATIVE) IWETH(tokenOut).deposit{value: netTokenIn}();
else IWETH(tokenIn).withdraw(netTokenIn);
}
}
{
"compilationTarget": {
"contracts/pendle/contracts/router/swap-aggregator/PendleSwap.sol": "PendleSwapL1"
},
"evmVersion": "shanghai",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 1000000
},
"remappings": [],
"viaIR": true
}
[{"inputs":[{"internalType":"uint256","name":"aggregatorType","type":"uint256"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"UnsupportedSelector","type":"error"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"enum SwapType","name":"swapType","type":"uint8"},{"internalType":"address","name":"extRouter","type":"address"},{"internalType":"bytes","name":"extCalldata","type":"bytes"},{"internalType":"bool","name":"needScale","type":"bool"}],"internalType":"struct SwapData","name":"data","type":"tuple"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]