编译器
0.8.20+commit.a1b79de6
文件 1 的 10:Address.sol
pragma solidity ^0.8.20;
library Address {
error AddressInsufficientBalance(address account);
error AddressEmptyCode(address target);
error FailedInnerCall();
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
function _revert(bytes memory returndata) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}
文件 2 的 10:ArrayUtils.sol
pragma solidity =0.8.20;
library ArrayUtils {
function deleteItem(address[] storage self, address item)
internal
returns (bool success)
{
uint256 length = self.length;
for (uint256 i = 0; i < length; i++) {
if (self[i] == item) {
uint256 newLength = self.length - 1;
if (i != newLength) {
self[i] = self[newLength];
}
self[newLength] = self[self.length - 1];
self.pop();
return true;
}
}
}
}
文件 3 的 10:Errors.sol
pragma solidity =0.8.20;
library Errors {
error AvailableOnlyOwner();
error DifferentLength();
error DuplicateToken();
error DurationMoreMaximum();
error FailedToSendEther();
error IncorrectAmountOut();
error NoTokenBalance();
error NotAllowedToken();
error NotAllowedZero();
error NotAllowedAddress();
error OrderAlreadyClaimed();
error OrderNotCompleted();
error OrderAlreadyCompleted();
error SameTokens();
error WrongAdditionalAmount();
error WrongAmount();
error WrongExpirationTime();
error WrongTimestamp();
error IsNotUsdToken();
}
文件 4 的 10:IERC20.sol
pragma solidity ^0.8.20;
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 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 5 的 10:IERC20Metadata.sol
pragma solidity ^0.8.20;
import {IERC20} from "../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);
}
文件 6 的 10:IERC20Permit.sol
pragma solidity ^0.8.20;
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);
}
文件 7 的 10:ISwapRouter.sol
pragma solidity >=0.7.5;
pragma abicoder v2;
import '@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol';
interface ISwapRouter is IUniswapV3SwapCallback {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
}
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
uint160 sqrtPriceLimitX96;
}
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
struct ExactOutputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
}
function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}
文件 8 的 10:IUniswapV3SwapCallback.sol
pragma solidity >=0.5.0;
interface IUniswapV3SwapCallback {
function uniswapV3SwapCallback(
int256 amount0Delta,
int256 amount1Delta,
bytes calldata data
) external;
}
文件 9 的 10:PayerV3.sol
pragma solidity =0.8.20;
pragma abicoder v2;
import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "./lib/ArrayUtils.sol";
import {Errors} from "./lib/Errors.sol";
interface IWETH9 is IERC20 {
function deposit() external payable;
function withdraw(uint256) external payable;
}
contract PayerV3 {
using SafeERC20 for IERC20;
using ArrayUtils for address[];
address public owner1;
address public owner2;
address public service;
struct Order {
address user;
address tokenIn;
uint256 amountIn;
address tokenOut;
uint256 amountOut;
uint256 price;
uint256 additionalAmount;
uint256 endTimestamp;
bool completed;
bool claimed;
}
struct ExecuteOrderParams {
uint256[] orderIds;
bool[] swap;
uint256[] additionalAmount;
}
constructor() {
owner1 = msg.sender;
payerAddress = owner1;
}
receive() external payable {}
modifier onlyOwners() {
if (msg.sender != owner1 && msg.sender != owner2) {
revert Errors.NotAllowedAddress();
}
_;
}
modifier onlyOwnerOrService() {
if (
msg.sender != owner1 &&
msg.sender != owner2 &&
msg.sender != service
) {
revert Errors.NotAllowedAddress();
}
_;
}
ISwapRouter public constant swapRouter =
ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564);
uint24 public poolFee = 3000;
uint24 public constant maxAdditionalAmountPercentage = 750;
uint256 public acceptableTokensArrayLength;
uint256 constant swapDeadline = 10 minutes;
mapping(address => mapping(address => uint256)) public balances;
mapping(address => mapping(address => uint256)) public swapsIn;
mapping(address => mapping(address => uint256)) public swapsOut;
mapping(address => uint256) public lastUserActionTime;
Order[] public orders;
mapping(address => bool) public acceptableTokens;
mapping(address => bool) public isUsdToken;
mapping(address => uint256) public minimalTokenAmounts;
address[] public acceptableTokensArray;
address public constant wethAddress =
0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address public payerAddress;
uint public constant maxDuration = 90 days;
uint public constant maxExecutionTime = 1 hours;
uint public constant fullAccessAfter = 365 days;
event Deposit(address indexed user, address indexed token, uint256 amount);
event NewOrder(
uint256 indexed orderId,
address indexed user,
address indexed token,
uint256 amount,
uint256 duration
);
event ClaimOrder(uint256 indexed orderId);
event FullWithdrawal(
address indexed user,
address indexed token,
uint256 amount
);
function depositAndOrder(
address _tokenAddressIn,
address _tokenAddressOut,
uint256 _amountDeposit,
uint256 _amountOrder,
uint256 _price,
uint256 _duration
) public {
deposit(_tokenAddressIn, _amountDeposit);
makeOrder(
_tokenAddressIn,
_tokenAddressOut,
_amountOrder,
_price,
_duration
);
}
function depositEthAndOrder(
address _tokenAddressOut,
uint256 _amount,
uint256 _price,
uint256 _duration
) public payable {
depositEth();
makeOrder(wethAddress, _tokenAddressOut, _amount, _price, _duration);
}
function makeOrder(
address _tokenAddressIn,
address _tokenAddressOut,
uint256 _amountIn,
uint256 _price,
uint256 _duration
) public {
if (!(balances[_tokenAddressIn][msg.sender] >= _amountIn)) {
revert Errors.NoTokenBalance();
}
if (!(_tokenAddressIn != _tokenAddressOut)) {
revert Errors.SameTokens();
}
if (!(_duration < maxDuration)) {
revert Errors.DurationMoreMaximum();
}
if (!(_amountIn >= minimalTokenAmounts[_tokenAddressIn])) {
revert Errors.WrongAmount();
}
balances[_tokenAddressIn][msg.sender] =
balances[_tokenAddressIn][msg.sender] -
_amountIn;
orders.push(
Order(
msg.sender,
_tokenAddressIn,
_amountIn,
_tokenAddressOut,
0,
_price,
0,
block.timestamp + _duration,
false,
false
)
);
_updateUserActionTime();
emit NewOrder(
orders.length - 1,
msg.sender,
address(_tokenAddressIn),
_amountIn,
_duration
);
}
function deposit(address _tokenAddress, uint256 _amount) public payable {
if (!acceptableTokens[_tokenAddress]) {
revert Errors.NotAllowedToken();
}
if (_amount == 0) {
revert Errors.NotAllowedZero();
}
IERC20(_tokenAddress).safeTransferFrom(
msg.sender,
address(this),
_amount
);
balances[_tokenAddress][msg.sender] =
balances[_tokenAddress][msg.sender] +
_amount;
_updateUserActionTime();
emit Deposit(msg.sender, _tokenAddress, _amount);
}
function depositEth() public payable {
if (!(msg.value > 0)) {
revert Errors.NotAllowedZero();
}
IWETH9(wethAddress).deposit{value: msg.value}();
balances[wethAddress][msg.sender] =
balances[wethAddress][msg.sender] +
msg.value;
_updateUserActionTime();
emit Deposit(msg.sender, wethAddress, msg.value);
}
function executeOrders(
ExecuteOrderParams calldata _params,
uint256[] calldata _amountOutMinimum,
bool _claimOrders,
address _usdClaimToken
) public onlyOwnerOrService {
uint256 orderIdsLength = _params.orderIds.length;
if (
!(orderIdsLength == _params.swap.length &&
_params.swap.length == _params.additionalAmount.length)
) {
revert Errors.DifferentLength();
}
for (uint256 i; i < orderIdsLength; ) {
Order storage order = orders[_params.orderIds[i]];
if (!(block.timestamp >= order.endTimestamp)) {
revert Errors.WrongExpirationTime();
}
if (order.claimed) {
revert Errors.OrderAlreadyClaimed();
}
if (order.completed) {
revert Errors.OrderAlreadyCompleted();
}
if (_params.swap[i]) {
swapsIn[order.tokenIn][order.tokenOut] += order.amountIn;
}
unchecked {
++i;
}
}
uint256 swapsCount;
for (uint256 i; i < acceptableTokensArrayLength; ) {
for (uint256 j; j < acceptableTokensArrayLength; ) {
if (
swapsIn[acceptableTokensArray[i]][
acceptableTokensArray[j]
] > 0
) {
IERC20(acceptableTokensArray[i]).forceApprove(
address(swapRouter),
swapsIn[acceptableTokensArray[i]][
acceptableTokensArray[j]
]
);
ISwapRouter.ExactInputSingleParams
memory swapParams = ISwapRouter.ExactInputSingleParams({
tokenIn: acceptableTokensArray[i],
tokenOut: acceptableTokensArray[j],
fee: poolFee,
recipient: address(this),
deadline: block.timestamp + swapDeadline,
amountIn: swapsIn[acceptableTokensArray[i]][
acceptableTokensArray[j]
],
amountOutMinimum: _amountOutMinimum[swapsCount],
sqrtPriceLimitX96: 0
});
uint256 amountOut = swapRouter.exactInputSingle(swapParams);
if (!(amountOut > _amountOutMinimum[swapsCount])) {
revert Errors.IncorrectAmountOut();
}
swapsOut[acceptableTokensArray[i]][
acceptableTokensArray[j]
] = amountOut;
swapsCount++;
}
unchecked {
++j;
}
}
unchecked {
++i;
}
}
for (uint256 i; i < orderIdsLength; ) {
_executeOrder(
_params.orderIds[i],
_params.swap[i],
_params.additionalAmount[i]
);
unchecked {
++i;
}
}
if (_claimOrders) {
for (uint256 i; i < orderIdsLength; ) {
claimOrder(_params.orderIds[i], _usdClaimToken, false);
unchecked {
++i;
}
}
}
for (uint256 i; i < acceptableTokensArrayLength; ) {
for (uint256 j; j < acceptableTokensArrayLength; ) {
swapsIn[acceptableTokensArray[i]][acceptableTokensArray[j]] = 0;
unchecked {
++j;
}
}
unchecked {
++i;
}
}
}
function _executeOrder(
uint256 orderId,
bool swap,
uint256 additionalAmount
) private {
Order storage order = orders[orderId];
order.additionalAmount = additionalAmount;
order.completed = true;
if (swap) {
uint256 accuracy = wethAddress == order.tokenOut
? 1e10
: 10 ** IERC20Metadata(order.tokenOut).decimals();
uint256 proportionIn = calculateProportion(
swapsIn[order.tokenIn][order.tokenOut],
order.amountIn,
accuracy
);
uint256 swapAmountOut = (swapsOut[order.tokenIn][order.tokenOut] *
accuracy) / proportionIn;
uint256 remainder;
if (isUsdToken[order.tokenIn]) {
remainder =
swapAmountOut -
(order.amountIn *
10 ** IERC20Metadata(order.tokenOut).decimals()) /
order.price;
if (
!(order.additionalAmount <
calculatePercentage(
order.amountIn,
maxAdditionalAmountPercentage
))
) {
revert Errors.WrongAdditionalAmount();
}
} else {
remainder =
swapAmountOut -
(order.amountIn * order.price) /
10 ** IERC20Metadata(order.tokenIn).decimals();
if (
!(order.additionalAmount <
calculatePercentage(
swapAmountOut - remainder,
maxAdditionalAmountPercentage
))
) {
revert Errors.WrongAdditionalAmount();
}
}
order.amountOut = swapAmountOut - remainder;
balances[order.tokenOut][payerAddress] =
balances[order.tokenOut][payerAddress] +
remainder;
} else {
order.tokenOut = order.tokenIn;
order.amountOut = order.amountIn;
}
}
function claimOrder(
uint256 _orderId,
address _usdToken,
bool _force
) public {
Order storage order = orders[_orderId];
if (order.claimed) {
revert Errors.OrderAlreadyClaimed();
}
if (
!(order.completed ||
block.timestamp > order.endTimestamp + maxExecutionTime)
) {
revert Errors.OrderNotCompleted();
}
if (!_force) {
if (!isUsdToken[_usdToken]) {
revert Errors.IsNotUsdToken();
}
if (
order.additionalAmount > 0 &&
balances[_usdToken][payerAddress] >= order.additionalAmount
) {
_balanceTransfer(
_usdToken,
payerAddress,
order.user,
order.additionalAmount
);
}
} else {
if (msg.sender != order.user) {
revert Errors.AvailableOnlyOwner();
}
}
if (
!order.completed &&
block.timestamp > order.endTimestamp + maxExecutionTime
) {
order.tokenOut = order.tokenIn;
order.amountOut = order.amountIn;
}
balances[order.tokenOut][order.user] =
balances[order.tokenOut][order.user] +
order.amountOut;
order.claimed = true;
if (msg.sender == order.user) {
_updateUserActionTime();
emit ClaimOrder(_orderId);
}
}
function fullWithdrawal(address _tokenAddress, uint256 _amount) public {
if (balances[_tokenAddress][msg.sender] < _amount) {
revert Errors.NoTokenBalance();
}
balances[_tokenAddress][msg.sender] =
balances[_tokenAddress][msg.sender] -
_amount;
IERC20(_tokenAddress).safeTransfer(msg.sender, _amount);
_updateUserActionTime();
emit FullWithdrawal(msg.sender, _tokenAddress, _amount);
}
function fullWithdrawalETH(uint256 _amount) public payable {
if (balances[wethAddress][msg.sender] < _amount) {
revert Errors.NoTokenBalance();
}
balances[wethAddress][msg.sender] =
balances[wethAddress][msg.sender] -
_amount;
IWETH9(wethAddress).withdraw(_amount);
(bool sent, ) = msg.sender.call{value: _amount}("");
if (!sent) {
revert Errors.FailedToSendEther();
}
_updateUserActionTime();
emit FullWithdrawal(msg.sender, wethAddress, _amount);
}
function calculatePercentage(
uint256 _quantity,
uint256 _percentage
) public pure returns (uint256) {
return (_quantity * _percentage) / 10000;
}
function calculateProportion(
uint256 _quantity,
uint256 _total,
uint256 _accuracy
) public pure returns (uint256) {
return (_quantity * _accuracy) / _total;
}
function balanceOf(
address _tokenAddress,
address _user
) public view returns (uint256) {
return balances[_tokenAddress][_user];
}
function _balanceTransfer(
address _tokenAddress,
address _sender,
address _recipient,
uint256 _amount
) internal {
balances[_tokenAddress][_sender] =
balances[_tokenAddress][_sender] -
_amount;
balances[_tokenAddress][_recipient] =
balances[_tokenAddress][_recipient] +
_amount;
}
function _updateUserActionTime() internal {
lastUserActionTime[msg.sender] = block.timestamp;
}
function editAcceptableToken(
address _token,
bool _value,
bool _isUsd,
uint256 _minimalAmount
) public onlyOwners {
isUsdToken[_token] = _isUsd;
if (_value) {
if (acceptableTokens[_token]) {
revert Errors.DuplicateToken();
}
if (_minimalAmount == 0) {
revert Errors.NotAllowedZero();
}
acceptableTokensArray.push(_token);
minimalTokenAmounts[_token] = _minimalAmount;
} else {
acceptableTokensArray.deleteItem(_token);
}
acceptableTokens[_token] = _value;
acceptableTokensArrayLength = acceptableTokensArray.length;
}
function getEthBalance() public view returns (uint256) {
return address(this).balance;
}
function getBackEth(
address payable _to,
uint256 _amount
) external payable onlyOwners {
(bool sent, ) = _to.call{value: _amount}("");
if (!sent) {
revert Errors.FailedToSendEther();
}
}
function emergencyQuit(
address _user,
address _tokenAddress,
uint256 _amount
) external onlyOwners {
if (!(block.timestamp > lastUserActionTime[_user] + fullAccessAfter)) {
revert Errors.WrongTimestamp();
}
_balanceTransfer(_tokenAddress, _user, payerAddress, _amount);
}
function getTokenBalance(IERC20 token) public view returns (uint256) {
return token.balanceOf(address(this));
}
function setServiceAddress(address _address) external onlyOwners {
service = _address;
}
function setOwner1Address(address _address) external onlyOwners {
owner1 = _address;
}
function setOwner2Address(address _address) external onlyOwners {
owner2 = _address;
}
function setPayerAddress() external onlyOwners {
payerAddress = msg.sender;
}
function setPoolFee(uint24 _poolFee) external onlyOwners {
poolFee = _poolFee;
}
}
文件 10 的 10:SafeERC20.sol
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC20Permit} from "../extensions/IERC20Permit.sol";
import {Address} from "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
error SafeERC20FailedOperation(address token);
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data);
if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
revert SafeERC20FailedOperation(address(token));
}
}
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(token).code.length > 0;
}
}
{
"compilationTarget": {
"contracts/PayerV3.sol": "PayerV3"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 50000
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"AvailableOnlyOwner","type":"error"},{"inputs":[],"name":"DifferentLength","type":"error"},{"inputs":[],"name":"DuplicateToken","type":"error"},{"inputs":[],"name":"DurationMoreMaximum","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"FailedToSendEther","type":"error"},{"inputs":[],"name":"IncorrectAmountOut","type":"error"},{"inputs":[],"name":"IsNotUsdToken","type":"error"},{"inputs":[],"name":"NoTokenBalance","type":"error"},{"inputs":[],"name":"NotAllowedAddress","type":"error"},{"inputs":[],"name":"NotAllowedToken","type":"error"},{"inputs":[],"name":"NotAllowedZero","type":"error"},{"inputs":[],"name":"OrderAlreadyClaimed","type":"error"},{"inputs":[],"name":"OrderAlreadyCompleted","type":"error"},{"inputs":[],"name":"OrderNotCompleted","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"SameTokens","type":"error"},{"inputs":[],"name":"WrongAdditionalAmount","type":"error"},{"inputs":[],"name":"WrongAmount","type":"error"},{"inputs":[],"name":"WrongExpirationTime","type":"error"},{"inputs":[],"name":"WrongTimestamp","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"ClaimOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FullWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"NewOrder","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"acceptableTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"acceptableTokensArray","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptableTokensArrayLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"calculatePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"uint256","name":"_accuracy","type":"uint256"}],"name":"calculateProportion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderId","type":"uint256"},{"internalType":"address","name":"_usdToken","type":"address"},{"internalType":"bool","name":"_force","type":"bool"}],"name":"claimOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddressIn","type":"address"},{"internalType":"address","name":"_tokenAddressOut","type":"address"},{"internalType":"uint256","name":"_amountDeposit","type":"uint256"},{"internalType":"uint256","name":"_amountOrder","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"depositAndOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddressOut","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"depositEthAndOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_value","type":"bool"},{"internalType":"bool","name":"_isUsd","type":"bool"},{"internalType":"uint256","name":"_minimalAmount","type":"uint256"}],"name":"editAcceptableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyQuit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256[]","name":"orderIds","type":"uint256[]"},{"internalType":"bool[]","name":"swap","type":"bool[]"},{"internalType":"uint256[]","name":"additionalAmount","type":"uint256[]"}],"internalType":"struct PayerV3.ExecuteOrderParams","name":"_params","type":"tuple"},{"internalType":"uint256[]","name":"_amountOutMinimum","type":"uint256[]"},{"internalType":"bool","name":"_claimOrders","type":"bool"},{"internalType":"address","name":"_usdClaimToken","type":"address"}],"name":"executeOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fullAccessAfter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fullWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fullWithdrawalETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getBackEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getEthBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"getTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUsdToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUserActionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddressIn","type":"address"},{"internalType":"address","name":"_tokenAddressOut","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"makeOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxAdditionalAmountPercentage","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxExecutionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minimalTokenAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"orders","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"additionalAmount","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"bool","name":"completed","type":"bool"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"service","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setOwner1Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setOwner2Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPayerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_poolFee","type":"uint24"}],"name":"setPoolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setServiceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"swapsIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"swapsOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]