编译器
0.8.19+commit.7dd6d404
文件 1 的 18: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 的 18:ArbitraryExecutionPermit2Adapter.sol
pragma solidity >=0.8.0;
import { Permit2Transfers, IPermit2 } from "../libraries/Permit2Transfers.sol";
import { Token, IERC20 } from "../libraries/Token.sol";
import { IArbitraryExecutionPermit2Adapter } from "../interfaces/IArbitraryExecutionPermit2Adapter.sol";
import { BasePermit2Adapter } from "./BasePermit2Adapter.sol";
abstract contract ArbitraryExecutionPermit2Adapter is BasePermit2Adapter, IArbitraryExecutionPermit2Adapter {
using Permit2Transfers for IPermit2;
using Token for address;
using Token for IERC20;
function executeWithPermit(
SinglePermit calldata _permit,
AllowanceTarget[] calldata _allowanceTargets,
ContractCall[] calldata _contractCalls,
TransferOut[] calldata _transferOut,
uint256 _deadline
)
external
payable
checkDeadline(_deadline)
returns (bytes[] memory _executionResults, uint256[] memory _tokenBalances)
{
PERMIT2.takeFromCaller(_permit.token, _permit.amount, _permit.nonce, _deadline, _permit.signature);
return _approveExecuteAndTransfer(_allowanceTargets, _contractCalls, _transferOut);
}
function executeWithBatchPermit(
BatchPermit calldata _batchPermit,
AllowanceTarget[] calldata _allowanceTargets,
ContractCall[] calldata _contractCalls,
TransferOut[] calldata _transferOut,
uint256 _deadline
)
external
payable
checkDeadline(_deadline)
returns (bytes[] memory _executionResults, uint256[] memory _tokenBalances)
{
PERMIT2.batchTakeFromCaller(_batchPermit.tokens, _batchPermit.nonce, _deadline, _batchPermit.signature);
return _approveExecuteAndTransfer(_allowanceTargets, _contractCalls, _transferOut);
}
function _approveExecuteAndTransfer(
AllowanceTarget[] calldata _allowanceTargets,
ContractCall[] calldata _contractCalls,
TransferOut[] calldata _transferOut
)
internal
returns (bytes[] memory _executionResults, uint256[] memory _tokenBalances)
{
for (uint256 i; i < _allowanceTargets.length;) {
IERC20(_allowanceTargets[i].token).maxApprove(_allowanceTargets[i].allowanceTarget);
unchecked {
++i;
}
}
_executionResults = new bytes[](_contractCalls.length);
for (uint256 i; i < _contractCalls.length;) {
_executionResults[i] = _callContract(_contractCalls[i].target, _contractCalls[i].data, _contractCalls[i].value);
unchecked {
++i;
}
}
for (uint256 i; i < _allowanceTargets.length;) {
IERC20(_allowanceTargets[i].token).setAllowance(_allowanceTargets[i].allowanceTarget, 1);
unchecked {
++i;
}
}
_tokenBalances = new uint256[](_transferOut.length);
for (uint256 i; i < _transferOut.length;) {
_tokenBalances[i] = _transferOut[i].token.distributeTo(_transferOut[i].distribution);
unchecked {
++i;
}
}
}
}
文件 3 的 18:BasePermit2Adapter.sol
pragma solidity >=0.8.0;
import { Address } from "@openzeppelin/contracts/utils/Address.sol";
import { IERC1271 } from "@openzeppelin/contracts/interfaces/IERC1271.sol";
import { IBasePermit2Adapter, IPermit2 } from "../interfaces/IBasePermit2Adapter.sol";
import { Token } from "../libraries/Token.sol";
abstract contract BasePermit2Adapter is IBasePermit2Adapter, IERC1271 {
using Address for address;
address public constant NATIVE_TOKEN = Token.NATIVE_TOKEN;
IPermit2 public immutable PERMIT2;
bytes4 private constant MAGIC_WORD = IERC1271.isValidSignature.selector;
constructor(IPermit2 _permit2) {
PERMIT2 = _permit2;
}
receive() external payable { }
function isValidSignature(bytes32, bytes memory) external view returns (bytes4 magicValue) {
return msg.sender == address(PERMIT2) ? MAGIC_WORD : bytes4(0);
}
modifier checkDeadline(uint256 _deadline) {
if (block.timestamp > _deadline) revert TransactionDeadlinePassed(block.timestamp, _deadline);
_;
}
function _callContract(address _target, bytes calldata _data, uint256 _value) internal returns (bytes memory _result) {
if (_target == address(PERMIT2)) revert InvalidContractCall();
return _target.functionCallWithValue(_data, _value);
}
}
文件 4 的 18:IArbitraryExecutionPermit2Adapter.sol
pragma solidity >=0.8.0;
import { Token } from "../libraries/Token.sol";
import { IBasePermit2Adapter, IPermit2 } from "./IBasePermit2Adapter.sol";
interface IArbitraryExecutionPermit2Adapter is IBasePermit2Adapter {
struct SinglePermit {
address token;
uint256 amount;
uint256 nonce;
bytes signature;
}
struct BatchPermit {
IPermit2.TokenPermissions[] tokens;
uint256 nonce;
bytes signature;
}
struct AllowanceTarget {
address token;
address allowanceTarget;
}
struct ContractCall {
address target;
bytes data;
uint256 value;
}
struct TransferOut {
address token;
Token.DistributionTarget[] distribution;
}
function executeWithPermit(
SinglePermit calldata permit,
AllowanceTarget[] calldata allowanceTargets,
ContractCall[] calldata contractCalls,
TransferOut[] calldata transferOut,
uint256 deadline
)
external
payable
returns (bytes[] memory executionResults, uint256[] memory tokenBalances);
function executeWithBatchPermit(
BatchPermit calldata batchPermit,
AllowanceTarget[] calldata allowanceTargets,
ContractCall[] calldata contractCalls,
TransferOut[] calldata transferOut,
uint256 deadline
)
external
payable
returns (bytes[] memory executionResults, uint256[] memory tokenBalances);
}
文件 5 的 18:IBasePermit2Adapter.sol
pragma solidity >=0.8.0;
import { IPermit2 } from "./external/IPermit2.sol";
interface IBasePermit2Adapter {
error InvalidContractCall();
error TransactionDeadlinePassed(uint256 current, uint256 deadline);
function NATIVE_TOKEN() external view returns (address);
function PERMIT2() external view returns (IPermit2);
}
文件 6 的 18:IERC1271.sol
pragma solidity ^0.8.0;
interface IERC1271 {
function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);
}
文件 7 的 18:IERC165.sol
pragma solidity >=0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 8 的 18: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);
}
文件 9 的 18: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);
}
文件 10 的 18:IPermit2.sol
pragma solidity >=0.8.0;
interface IPermit2 {
struct TokenPermissions {
address token;
uint256 amount;
}
struct PermitTransferFrom {
TokenPermissions permitted;
uint256 nonce;
uint256 deadline;
}
struct PermitBatchTransferFrom {
TokenPermissions[] permitted;
uint256 nonce;
uint256 deadline;
}
struct SignatureTransferDetails {
address to;
uint256 requestedAmount;
}
function DOMAIN_SEPARATOR() external view returns (bytes32);
function permitTransferFrom(
PermitTransferFrom calldata permit,
SignatureTransferDetails calldata transferDetails,
address owner,
bytes calldata signature
)
external;
function permitTransferFrom(
PermitBatchTransferFrom memory permit,
SignatureTransferDetails[] calldata transferDetails,
address owner,
bytes calldata signature
)
external;
}
文件 11 的 18:ISimulationAdapter.sol
pragma solidity >=0.8.0;
interface ISimulationAdapter {
struct SimulationResult {
bool success;
bytes result;
uint256 gasSpent;
}
function simulate(bytes[] calldata calls) external payable returns (SimulationResult[] memory results);
}
文件 12 的 18:ISwapPermit2Adapter.sol
pragma solidity >=0.8.0;
import { Token } from "../libraries/Token.sol";
import { IBasePermit2Adapter } from "./IBasePermit2Adapter.sol";
interface ISwapPermit2Adapter is IBasePermit2Adapter {
error ReceivedTooLittleTokenOut(uint256 received, uint256 expected);
event Swapped(
address caller,
SwapType swapType,
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 amountOut,
address swapper,
bytes misc
);
struct SellOrderSwapParams {
uint256 deadline;
address tokenIn;
uint256 amountIn;
uint256 nonce;
bytes signature;
address allowanceTarget;
address swapper;
bytes swapData;
address tokenOut;
uint256 minAmountOut;
Token.DistributionTarget[] transferOut;
bytes misc;
}
struct BuyOrderSwapParams {
uint256 deadline;
address tokenIn;
uint256 maxAmountIn;
uint256 nonce;
bytes signature;
address allowanceTarget;
address swapper;
bytes swapData;
address tokenOut;
uint256 amountOut;
Token.DistributionTarget[] transferOut;
address unspentTokenInRecipient;
bytes misc;
}
enum SwapType {
Buy,
Sell
}
function sellOrderSwap(SellOrderSwapParams calldata params)
external
payable
returns (uint256 amountIn, uint256 amountOut);
function buyOrderSwap(BuyOrderSwapParams calldata params)
external
payable
returns (uint256 amountIn, uint256 amountOut);
}
文件 13 的 18:Permit2Transfers.sol
pragma solidity >=0.8.0;
import { IPermit2 } from "../interfaces/external/IPermit2.sol";
import { Token } from "./Token.sol";
library Permit2Transfers {
function takeFromCaller(
IPermit2 _permit2,
address _token,
uint256 _amount,
uint256 _nonce,
uint256 _deadline,
bytes calldata _signature
)
internal
{
if (_signature.length > 0) {
_permit2.permitTransferFrom(
IPermit2.PermitTransferFrom({
permitted: IPermit2.TokenPermissions({ token: _token, amount: _amount }),
nonce: _nonce,
deadline: _deadline
}),
IPermit2.SignatureTransferDetails({ to: address(this), requestedAmount: _amount }),
msg.sender,
_signature
);
}
}
function batchTakeFromCaller(
IPermit2 _permit2,
IPermit2.TokenPermissions[] calldata _tokens,
uint256 _nonce,
uint256 _deadline,
bytes calldata _signature
)
internal
{
if (_tokens.length > 0) {
_permit2.permitTransferFrom(
IPermit2.PermitBatchTransferFrom({ permitted: _tokens, nonce: _nonce, deadline: _deadline }),
_buildTransferDetails(_tokens),
msg.sender,
_signature
);
}
}
function _buildTransferDetails(IPermit2.TokenPermissions[] calldata _tokens)
private
view
returns (IPermit2.SignatureTransferDetails[] memory _details)
{
_details = new IPermit2.SignatureTransferDetails[](_tokens.length);
for (uint256 i; i < _details.length;) {
_details[i] = IPermit2.SignatureTransferDetails({ to: address(this), requestedAmount: _tokens[i].amount });
unchecked {
++i;
}
}
}
}
文件 14 的 18: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));
}
}
文件 15 的 18:SimulationAdapter.sol
pragma solidity >=0.8.0;
import { IERC165 } from "./interfaces/external/IERC165.sol";
import { ISimulationAdapter } from "./interfaces/ISimulationAdapter.sol";
abstract contract SimulationAdapter is IERC165, ISimulationAdapter {
error SimulatedCall(SimulationResult result);
function supportsInterface(bytes4 _interfaceId) public view virtual override returns (bool) {
return _interfaceId == type(ISimulationAdapter).interfaceId || _interfaceId == type(IERC165).interfaceId;
}
function simulate(bytes[] calldata _calls) external payable returns (SimulationResult[] memory _results) {
_results = new SimulationResult[](_calls.length);
for (uint256 i = 0; i < _calls.length; i++) {
_results[i] = _simulate(_calls[i]);
}
return _results;
}
function _simulate(bytes calldata _call) internal returns (SimulationResult memory _simulationResult) {
(bool _success, bytes memory _result) =
address(this).delegatecall(abi.encodeWithSelector(this.simulateAndRevert.selector, _call));
require(!_success, "WTF? Should have failed!");
assembly {
_result := add(_result, 0x04)
}
(_simulationResult) = abi.decode(_result, (SimulationResult));
}
function simulateAndRevert(bytes calldata _call) external payable {
uint256 _gasAtStart = gasleft();
(bool _success, bytes memory _result) = address(this).delegatecall(_call);
uint256 _gasSpent = _gasAtStart - gasleft();
revert SimulatedCall(SimulationResult({ success: _success, result: _result, gasSpent: _gasSpent }));
}
}
文件 16 的 18:SwapPermit2Adapter.sol
pragma solidity >=0.8.0;
import { Permit2Transfers, IPermit2 } from "../libraries/Permit2Transfers.sol";
import { Token } from "../libraries/Token.sol";
import { ISwapPermit2Adapter } from "../interfaces/ISwapPermit2Adapter.sol";
import { BasePermit2Adapter } from "./BasePermit2Adapter.sol";
abstract contract SwapPermit2Adapter is BasePermit2Adapter, ISwapPermit2Adapter {
using Permit2Transfers for IPermit2;
using Token for address;
function sellOrderSwap(SellOrderSwapParams calldata _params)
public
payable
checkDeadline(_params.deadline)
returns (uint256 _amountIn, uint256 _amountOut)
{
PERMIT2.takeFromCaller(_params.tokenIn, _params.amountIn, _params.nonce, _params.deadline, _params.signature);
_params.tokenIn.maxApproveIfNecessary(_params.allowanceTarget);
uint256 _value = _params.tokenIn == Token.NATIVE_TOKEN ? _params.amountIn : 0;
_callContract(_params.swapper, _params.swapData, _value);
_amountOut = _params.tokenOut.distributeTo(_params.transferOut);
if (_amountOut < _params.minAmountOut) revert ReceivedTooLittleTokenOut(_amountOut, _params.minAmountOut);
_params.tokenIn.setAllowanceIfNecessary(_params.allowanceTarget, 1);
_amountIn = _params.amountIn;
emit Swapped({
caller: msg.sender,
swapType: SwapType.Sell,
tokenIn: _params.tokenIn,
tokenOut: _params.tokenOut,
amountIn: _params.amountIn,
amountOut: _amountOut,
swapper: _params.swapper,
misc: _params.misc
});
}
function buyOrderSwap(BuyOrderSwapParams calldata _params)
public
payable
checkDeadline(_params.deadline)
returns (uint256 _amountIn, uint256 _amountOut)
{
PERMIT2.takeFromCaller(_params.tokenIn, _params.maxAmountIn, _params.nonce, _params.deadline, _params.signature);
_params.tokenIn.maxApproveIfNecessary(_params.allowanceTarget);
uint256 _value = _params.tokenIn == Token.NATIVE_TOKEN ? _params.maxAmountIn : 0;
_callContract(_params.swapper, _params.swapData, _value);
uint256 _unspentTokenIn = _params.tokenIn.balanceOnContract();
_amountOut = _params.tokenOut.distributeTo(_params.transferOut);
if (_amountOut < _params.amountOut) revert ReceivedTooLittleTokenOut(_amountOut, _params.amountOut);
_params.tokenIn.sendAmountTo(_unspentTokenIn, _params.unspentTokenInRecipient);
_params.tokenIn.setAllowanceIfNecessary(_params.allowanceTarget, 1);
_amountIn = _params.maxAmountIn - _unspentTokenIn;
emit Swapped({
caller: msg.sender,
swapType: SwapType.Buy,
tokenIn: _params.tokenIn,
tokenOut: _params.tokenOut,
amountIn: _amountIn,
amountOut: _amountOut,
swapper: _params.swapper,
misc: _params.misc
});
}
}
文件 17 的 18:Token.sol
pragma solidity >=0.8.0;
import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { Address } from "@openzeppelin/contracts/utils/Address.sol";
library Token {
using SafeERC20 for IERC20;
using Address for address payable;
using Address for address;
struct DistributionTarget {
address recipient;
uint256 shareBps;
}
address public constant NATIVE_TOKEN = address(0);
function balanceOnContract(address _token) internal view returns (uint256 _balance) {
return _token == NATIVE_TOKEN ? address(this).balance : IERC20(_token).balanceOf(address(this));
}
function maxApprove(IERC20 _token, address _allowanceTarget) internal {
setAllowance(_token, _allowanceTarget, type(uint256).max);
}
function setAllowance(IERC20 _token, address _allowanceTarget, uint256 _amount) internal {
_token.forceApprove(_allowanceTarget, _amount);
}
function maxApproveIfNecessary(address _token, address _allowanceTarget) internal {
setAllowanceIfNecessary(_token, _allowanceTarget, type(uint256).max);
}
function setAllowanceIfNecessary(address _token, address _allowanceTarget, uint256 _amount) internal {
if (_token != NATIVE_TOKEN && _allowanceTarget != address(0)) {
setAllowance(IERC20(_token), _allowanceTarget, _amount);
}
}
function distributeTo(
address _token,
DistributionTarget[] calldata _distribution
)
internal
returns (uint256 _available)
{
_available = balanceOnContract(_token);
uint256 _amountLeft = _available;
for (uint256 i; i < _distribution.length - 1;) {
uint256 _toSend = _available * _distribution[i].shareBps / 10_000;
sendAmountTo(_token, _toSend, _distribution[i].recipient);
_amountLeft -= _toSend;
unchecked {
++i;
}
}
sendAmountTo(_token, _amountLeft, _distribution[_distribution.length - 1].recipient);
}
function sendBalanceOnContractTo(address _token, address _recipient) internal returns (uint256 _balance) {
_balance = balanceOnContract(_token);
sendAmountTo(_token, _balance, _recipient);
}
function sendAmountTo(address _token, uint256 _amount, address _recipient) internal {
if (_amount > 0) {
if (_recipient == address(0)) _recipient = msg.sender;
if (_token == NATIVE_TOKEN) {
payable(_recipient).sendValue(_amount);
} else {
IERC20(_token).safeTransfer(_recipient, _amount);
}
}
}
}
文件 18 的 18:UniversalPermit2Adapter.sol
pragma solidity >=0.8.0;
import { SimulationAdapter } from "@call-simulation/SimulationAdapter.sol";
import { BasePermit2Adapter, IPermit2, Token } from "./base/BasePermit2Adapter.sol";
import {
IArbitraryExecutionPermit2Adapter,
ArbitraryExecutionPermit2Adapter
} from "./base/ArbitraryExecutionPermit2Adapter.sol";
import { ISwapPermit2Adapter, SwapPermit2Adapter } from "./base/SwapPermit2Adapter.sol";
contract UniversalPermit2Adapter is SimulationAdapter, SwapPermit2Adapter, ArbitraryExecutionPermit2Adapter {
constructor(IPermit2 _permit2) BasePermit2Adapter(_permit2) { }
}
{
"compilationTarget": {
"node_modules/@mean-finance/permit2-adapter/src/UniversalPermit2Adapter.sol": "UniversalPermit2Adapter"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"appendCBOR": false,
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"remappings": [
":@api3/=node_modules/@api3/",
":@call-simulation/=node_modules/@mean-finance/call-simulation/src/",
":@chainlink/=node_modules/@chainlink/",
":@mean-finance/call-simulation/contracts/=node_modules/@mean-finance/call-simulation/src/",
":@mean-finance/dca-v2-core/=node_modules/@mean-finance/dca-v2-core/",
":@mean-finance/nft-descriptors/=node_modules/@mean-finance/nft-descriptors/",
":@mean-finance/oracles/=node_modules/@mean-finance/oracles/",
":@mean-finance/permit2-adapter/=node_modules/@mean-finance/permit2-adapter/src/",
":@mean-finance/swappers/=node_modules/@mean-finance/swappers/",
":@mean-finance/transformers/=node_modules/@mean-finance/transformers/",
":@mean-finance/uniswap-v3-oracle/=node_modules/@mean-finance/uniswap-v3-oracle/",
":@openzeppelin/=node_modules/@openzeppelin/",
":@rari-capital/solmate/=lib/solmate/",
":@sphinx-labs/contracts/=lib/sphinx/packages/contracts/contracts/foundry/",
":@uniswap/=node_modules/@uniswap/",
":base64-sol/=node_modules/base64-sol/",
":ds-test/=lib/solmate/lib/ds-test/src/",
":forge-std/=lib/forge-std/src/",
":keep3r-v2/=node_modules/keep3r-v2/",
":solmate/=lib/solmate/src/",
":sphinx/=lib/sphinx/packages/contracts/contracts/forge-std/src/"
]
}
[{"inputs":[{"internalType":"contract IPermit2","name":"_permit2","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidContractCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"received","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"ReceivedTooLittleTokenOut","type":"error"},{"inputs":[{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"},{"internalType":"uint256","name":"gasSpent","type":"uint256"}],"internalType":"struct ISimulationAdapter.SimulationResult","name":"result","type":"tuple"}],"name":"SimulatedCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"TransactionDeadlinePassed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"enum ISwapPermit2Adapter.SwapType","name":"swapType","type":"uint8"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"swapper","type":"address"},{"indexed":false,"internalType":"bytes","name":"misc","type":"bytes"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"NATIVE_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT2","outputs":[{"internalType":"contract IPermit2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"address","name":"swapper","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"shareBps","type":"uint256"}],"internalType":"struct Token.DistributionTarget[]","name":"transferOut","type":"tuple[]"},{"internalType":"address","name":"unspentTokenInRecipient","type":"address"},{"internalType":"bytes","name":"misc","type":"bytes"}],"internalType":"struct ISwapPermit2Adapter.BuyOrderSwapParams","name":"_params","type":"tuple"}],"name":"buyOrderSwap","outputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPermit2.TokenPermissions[]","name":"tokens","type":"tuple[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IArbitraryExecutionPermit2Adapter.BatchPermit","name":"_batchPermit","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"}],"internalType":"struct IArbitraryExecutionPermit2Adapter.AllowanceTarget[]","name":"_allowanceTargets","type":"tuple[]"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct IArbitraryExecutionPermit2Adapter.ContractCall[]","name":"_contractCalls","type":"tuple[]"},{"components":[{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"shareBps","type":"uint256"}],"internalType":"struct Token.DistributionTarget[]","name":"distribution","type":"tuple[]"}],"internalType":"struct IArbitraryExecutionPermit2Adapter.TransferOut[]","name":"_transferOut","type":"tuple[]"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"executeWithBatchPermit","outputs":[{"internalType":"bytes[]","name":"_executionResults","type":"bytes[]"},{"internalType":"uint256[]","name":"_tokenBalances","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IArbitraryExecutionPermit2Adapter.SinglePermit","name":"_permit","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"}],"internalType":"struct IArbitraryExecutionPermit2Adapter.AllowanceTarget[]","name":"_allowanceTargets","type":"tuple[]"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct IArbitraryExecutionPermit2Adapter.ContractCall[]","name":"_contractCalls","type":"tuple[]"},{"components":[{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"shareBps","type":"uint256"}],"internalType":"struct Token.DistributionTarget[]","name":"distribution","type":"tuple[]"}],"internalType":"struct IArbitraryExecutionPermit2Adapter.TransferOut[]","name":"_transferOut","type":"tuple[]"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"executeWithPermit","outputs":[{"internalType":"bytes[]","name":"_executionResults","type":"bytes[]"},{"internalType":"uint256[]","name":"_tokenBalances","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"magicValue","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"address","name":"swapper","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"shareBps","type":"uint256"}],"internalType":"struct Token.DistributionTarget[]","name":"transferOut","type":"tuple[]"},{"internalType":"bytes","name":"misc","type":"bytes"}],"internalType":"struct ISwapPermit2Adapter.SellOrderSwapParams","name":"_params","type":"tuple"}],"name":"sellOrderSwap","outputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_calls","type":"bytes[]"}],"name":"simulate","outputs":[{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"},{"internalType":"uint256","name":"gasSpent","type":"uint256"}],"internalType":"struct ISimulationAdapter.SimulationResult[]","name":"_results","type":"tuple[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_call","type":"bytes"}],"name":"simulateAndRevert","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]