Source Code
Showing the last 1 transaction (View Advanced Filter)
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| 0x60c06040 | 23231097 | 88 days ago | IN | 0 ETH | 0.00083547 |
Showing the last 25 internal transactions (View Advanced Filter)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Deposit | 23864895 | 2 mins ago | 0.00654494 ETH | ||||
| Transfer | 23864895 | 2 mins ago | 0.00654494 ETH | ||||
| Deposit | 23864871 | 7 mins ago | 0.08464322 ETH | ||||
| Transfer | 23864871 | 7 mins ago | 0.08464322 ETH | ||||
| Transfer | 23864863 | 9 mins ago | 0.00625866 ETH | ||||
| Transfer | 23864863 | 9 mins ago | 0.00625866 ETH | ||||
| Transfer | 23864863 | 9 mins ago | 0.00070722 ETH | ||||
| Transfer | 23864863 | 9 mins ago | 0.00070722 ETH | ||||
| Deposit | 23864863 | 9 mins ago | 0.00070722 ETH | ||||
| Transfer | 23864863 | 9 mins ago | 0.00070722 ETH | ||||
| Transfer | 23864832 | 15 mins ago | 0.162 ETH | ||||
| Transfer | 23864832 | 15 mins ago | 0.162 ETH | ||||
| Transfer | 23864813 | 19 mins ago | 0.1242 ETH | ||||
| Transfer | 23864813 | 19 mins ago | 0.1242 ETH | ||||
| Transfer | 23864804 | 21 mins ago | 0.27758001 ETH | ||||
| Transfer | 23864804 | 21 mins ago | 0.27758001 ETH | ||||
| Transfer | 23864758 | 30 mins ago | 1.03411341 ETH | ||||
| Transfer | 23864758 | 30 mins ago | 1.03411341 ETH | ||||
| Deposit | 23864758 | 30 mins ago | 0.29609562 ETH | ||||
| Transfer | 23864758 | 30 mins ago | 0.29609562 ETH | ||||
| Transfer | 23864746 | 32 mins ago | 0.40800236 ETH | ||||
| Transfer | 23864746 | 32 mins ago | 0.40800236 ETH | ||||
| Deposit | 23864641 | 54 mins ago | 0.26906014 ETH | ||||
| Transfer | 23864641 | 54 mins ago | 0.26906014 ETH | ||||
| Transfer | 23864638 | 54 mins ago | 0.5 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
EkuboAdapter
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;
import "../interfaces/IAdapter.sol";
import "../interfaces/IEkubo.sol";
import "../interfaces/IERC20.sol";
import "../libraries/SafeERC20.sol";
import "../interfaces/IWETH.sol";
using PoolKeyLibrary for PoolKey;
contract EkuboAdapter is IAdapter {
address public immutable WETH;
address public immutable EKUBO_CORE;
address internal constant ETH = address(0);
uint96 constant MIN_SQRT_RATIO_RAW = 4611797791050542631 + 1;
uint96 constant MAX_SQRT_RATIO_RAW = 79227682466138141934206691491 - 1;
uint256 internal constant ORIGIN_PAYER =
0x3ca20afc2ccc0000000000000000000000000000000000000000000000000000;
uint256 constant ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff;
struct SwapParams {
address to;
PoolKey poolKey;
int128 amount;
bool isToken1;
uint96 sqrtRatioLimit;
uint256 skipAhead;
uint128 _token0Debts;
uint128 _token1Debts;
}
SwapParams private _swapParams;
constructor(address payable weth, address ekuboCore) {
WETH = weth;
EKUBO_CORE = ekuboCore;
}
function _ekuboSwap(
address to,
address,
bytes memory moreInfo,
uint256 payerOrigin
) private {
(PoolKey memory poolKey, bool isToken1) = abi.decode(
moreInfo,
(PoolKey, bool)
);
address fromToken = isToken1 ? poolKey.token1 : poolKey.token0;
uint256 inputBalance;
if (fromToken == ETH) {
inputBalance = IERC20(WETH).balanceOf(address(this));
} else {
inputBalance = IERC20(fromToken).balanceOf(address(this));
}
require(inputBalance > 0, "No tokens to swap");
int128 swapAmount = int128(uint128(inputBalance));
uint96 sqrtRatioLimit = isPriceIncreasing(swapAmount, isToken1)
? MAX_SQRT_RATIO_RAW
: MIN_SQRT_RATIO_RAW;
_swapParams = SwapParams({
to: to,
poolKey: poolKey,
amount: swapAmount,
isToken1: isToken1,
sqrtRatioLimit: sqrtRatioLimit,
skipAhead: 0,
_token0Debts: 0,
_token1Debts: 0
});
// lock() -> locked() callback
IEkuboCore(EKUBO_CORE).lock();
delete _swapParams;
// Return back excess fromTokens
address _payerOrigin;
if ((payerOrigin & ORIGIN_PAYER) == ORIGIN_PAYER) {
_payerOrigin = address(uint160(uint256(payerOrigin) & ADDRESS_MASK));
}
if (_payerOrigin != address(0)) {
if (fromToken == ETH && address(this).balance > 0) {
(bool success, ) = _payerOrigin.call{
value: address(this).balance
}("");
require(success, "Transfer to payerOrigin failed");
} else if (fromToken != ETH) {
uint256 leftBalance = IERC20(fromToken).balanceOf(
address(this)
);
if (leftBalance > 0) {
SafeERC20.safeTransfer(IERC20(fromToken), _payerOrigin, leftBalance);
}
}
}
}
function locked(uint256 id) external returns (bytes memory) {
require(msg.sender == EKUBO_CORE, "Only Ekubo Core can call");
SwapParams memory params = _swapParams;
(int128 delta0, int128 delta1) = IEkuboCore(EKUBO_CORE).swap_611415377(
params.poolKey,
params.amount,
params.isToken1,
params.sqrtRatioLimit,
params.skipAhead
);
address fromToken = params.isToken1
? params.poolKey.token1
: params.poolKey.token0;
// Handle debt
// if either token is ETH, it must be token0, as tokens are sorted when pool initializing
if (delta0 > 0) {
if (fromToken == ETH) {
// Withdraw all WETH to ETH, but only transfer the exact debt amount
uint256 wethBalance = IERC20(WETH).balanceOf(address(this));
IWETH(WETH).withdraw(wethBalance);
// Only send the exact debt amount, not the full balance
uint256 debtAmount = uint128(delta0);
(bool success, ) = EKUBO_CORE.call{value: debtAmount}("");
require(success, "Transfer ETH debt to Ekubo Core failed");
// Remaining ETH will be refunded to user in the refund logic
} else {
// Only record debt for ERC20 tokens that will trigger payCallback
_swapParams._token0Debts = uint128(delta0);
IEkuboCore(EKUBO_CORE).pay(params.poolKey.token0);
}
}
if (delta1 > 0) {
_swapParams._token1Debts = uint128(delta1);
IEkuboCore(EKUBO_CORE).pay(params.poolKey.token1);
}
// Withdraw to tokens
address outputToken = params.isToken1
? params.poolKey.token0
: params.poolKey.token1;
uint128 outputAmount = uint128(params.isToken1 ? -delta0 : -delta1);
if (outputAmount > 0) {
if (outputToken == ETH) {
IEkuboCore(EKUBO_CORE).withdraw(
outputToken,
address(this),
outputAmount
);
IWETH(WETH).deposit{value: outputAmount}();
SafeERC20.safeTransfer(IERC20(WETH), params.to, outputAmount);
} else {
IEkuboCore(EKUBO_CORE).withdraw(
outputToken,
params.to,
outputAmount
);
}
}
return "";
}
/// @notice Pay callback - Triggered by Core pay()
function payCallback(uint256 /* id */, address token) external {
require(msg.sender == EKUBO_CORE, "Only Ekubo Core can call");
// Determine which debt to pay based on token address
uint256 debtAmount;
if (token == _swapParams.poolKey.token0) {
debtAmount = _swapParams._token0Debts;
_swapParams._token0Debts = 0; // Clear the debt
} else if (token == _swapParams.poolKey.token1) {
debtAmount = _swapParams._token1Debts;
_swapParams._token1Debts = 0; // Clear the debt
} else {
revert("Unknown token for debt payment");
}
require(debtAmount > 0, "No debt recorded for this token");
uint256 balance = IERC20(token).balanceOf(address(this));
require(balance >= debtAmount, "Insufficient balance to pay debt");
// Transfer only the exact debt amount
SafeERC20.safeTransfer(IERC20(token), EKUBO_CORE, debtAmount);
}
function sellBase(
address to,
address pool,
bytes memory moreInfo
) external override {
uint256 payerOrigin;
assembly {
let size := calldatasize()
payerOrigin := calldataload(sub(size, 32))
}
_ekuboSwap(to, pool, moreInfo, payerOrigin);
}
function sellQuote(
address to,
address pool,
bytes memory moreInfo
) external override {
uint256 payerOrigin;
assembly {
let size := calldatasize()
payerOrigin := calldataload(sub(size, 32))
}
_ekuboSwap(to, pool, moreInfo, payerOrigin);
}
function isPriceIncreasing(
int128 amount,
bool isToken1
) private pure returns (bool increasing) {
assembly ("memory-safe") {
increasing := xor(isToken1, slt(amount, 0))
}
}
receive() external payable {}
}/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;
interface IAdapter {
function sellBase(
address to,
address pool,
bytes memory data
) external;
function sellQuote(
address to,
address pool,
bytes memory data
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// Ekubo Config type - address (20 bytes) | fee (8 bytes) | tickSpacing (4 bytes)
type Config is bytes32;
// Ekubo PoolKey structure
struct PoolKey {
address token0;
address token1;
Config config;
}
// PoolKey helper functions
library PoolKeyLibrary {
function tickSpacing(PoolKey memory pk) internal pure returns (uint32 r) {
assembly ("memory-safe") {
r := and(mload(add(64, pk)), 0xffffffff)
}
}
function fee(PoolKey memory pk) internal pure returns (uint64 r) {
assembly ("memory-safe") {
r := and(mload(add(60, pk)), 0xffffffffffffffff)
}
}
function extension(PoolKey memory pk) internal pure returns (address r) {
assembly ("memory-safe") {
r := and(mload(add(52, pk)), 0xffffffffffffffffffffffffffffffffffffffff)
}
}
// Construct Config
function toConfig(uint64 _fee, uint32 _tickSpacing, address _extension) internal pure returns (Config c) {
assembly ("memory-safe") {
c := add(add(shl(96, _extension), shl(32, _fee)), _tickSpacing)
}
}
// Calculate poolId
function toPoolId(PoolKey memory key) internal pure returns (bytes32 result) {
assembly ("memory-safe") {
// Perform keccak256 hash on the entire PoolKey structure
result := keccak256(key, 96) // 20 + 20 + 32 = 72 bytes, but official code uses 96
}
}
}
// Ekubo Core interface
interface IEkuboCore {
function lock() external;
function swap_611415377(
PoolKey memory poolKey,
int128 amount,
bool isToken1,
uint96 sqrtRatioLimit,
uint256 skipAhead
) external payable returns (int128 delta0, int128 delta1);
function clear(address token) external returns (uint256 paid);
function withdraw(address token, address to, uint128 amount) external;
function pay(address token) external returns (uint128 payment);
// Get pool state
function poolState(bytes32 poolId) external view returns (
uint160 sqrtRatio,
int24 tick,
uint128 liquidity
);
}
// Ekubo Locker callback interface
interface IEkuboLocker {
function locked(uint256 id) external returns (bytes memory);
function payCallback(uint256 id, address token) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC20 {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
}/// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./SafeMath.sol"; import "./Address.sol"; import "./RevertReasonForwarder.sol"; import "../interfaces/IERC20.sol"; import "../interfaces/IERC20Permit.sol"; import "../interfaces/IDaiLikePermit.sol"; // File @1inch/solidity-utils/contracts/libraries/[email protected] library SafeERC20 { error SafeTransferFailed(); error SafeTransferFromFailed(); error ForceApproveFailed(); error SafeIncreaseAllowanceFailed(); error SafeDecreaseAllowanceFailed(); error SafePermitBadLength(); // Ensures method do not revert or return boolean `true`, admits call to non-smart-contract function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal { bytes4 selector = token.transferFrom.selector; bool success; /// @solidity memory-safe-assembly assembly { // solhint-disable-line no-inline-assembly let data := mload(0x40) mstore(data, selector) mstore(add(data, 0x04), from) mstore(add(data, 0x24), to) mstore(add(data, 0x44), amount) success := call(gas(), token, 0, data, 100, 0x0, 0x20) if success { switch returndatasize() case 0 { success := gt(extcodesize(token), 0) } default { success := and(gt(returndatasize(), 31), eq(mload(0), 1)) } } } if (!success) revert SafeTransferFromFailed(); } // Ensures method do not revert or return boolean `true`, admits call to non-smart-contract function safeTransfer(IERC20 token, address to, uint256 value) internal { if (!_makeCall(token, token.transfer.selector, to, value)) { revert SafeTransferFailed(); } } function safeApprove(IERC20 token, address spender, uint256 value) internal { forceApprove(token, spender, value); } // If `approve(from, to, amount)` fails, try to `approve(from, to, 0)` before retry function forceApprove(IERC20 token, address spender, uint256 value) internal { if (!_makeCall(token, token.approve.selector, spender, value)) { if (!_makeCall(token, token.approve.selector, spender, 0) || !_makeCall(token, token.approve.selector, spender, value)) { revert ForceApproveFailed(); } } } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 allowance = token.allowance(address(this), spender); if (value > type(uint256).max - allowance) revert SafeIncreaseAllowanceFailed(); forceApprove(token, spender, allowance + value); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 allowance = token.allowance(address(this), spender); if (value > allowance) revert SafeDecreaseAllowanceFailed(); forceApprove(token, spender, allowance - value); } function safePermit(IERC20 token, bytes calldata permit) internal { bool success; if (permit.length == 32 * 7) { success = _makeCalldataCall(token, IERC20Permit.permit.selector, permit); } else if (permit.length == 32 * 8) { success = _makeCalldataCall(token, IDaiLikePermit.permit.selector, permit); } else { revert SafePermitBadLength(); } if (!success) RevertReasonForwarder.reRevert(); } function _makeCall(IERC20 token, bytes4 selector, address to, uint256 amount) private returns(bool success) { /// @solidity memory-safe-assembly assembly { // solhint-disable-line no-inline-assembly let data := mload(0x40) mstore(data, selector) mstore(add(data, 0x04), to) mstore(add(data, 0x24), amount) success := call(gas(), token, 0, data, 0x44, 0x0, 0x20) if success { switch returndatasize() case 0 { success := gt(extcodesize(token), 0) } default { success := and(gt(returndatasize(), 31), eq(mload(0), 1)) } } } } function _makeCalldataCall(IERC20 token, bytes4 selector, bytes calldata args) private returns(bool success) { /// @solidity memory-safe-assembly assembly { // solhint-disable-line no-inline-assembly let len := add(4, args.length) let data := mload(0x40) mstore(data, selector) calldatacopy(add(data, 0x04), args.offset, args.length) success := call(gas(), token, 0, data, len, 0x0, 0x20) if success { switch returndatasize() case 0 { success := gt(extcodesize(token), 0) } default { success := and(gt(returndatasize(), 31), eq(mload(0), 1)) } } } } }
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;
interface IWETH {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, 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 src,
address dst,
uint256 wad
) external returns (bool);
function deposit() external payable;
function withdraw(uint256 wad) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library SafeMath {
uint256 constant WAD = 10**18;
uint256 constant RAY = 10**27;
function wad() public pure returns (uint256) {
return WAD;
}
function ray() public pure returns (uint256) {
return RAY;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a <= b ? a : b;
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
function sqrt(uint256 a) internal pure returns (uint256 b) {
if (a > 3) {
b = a;
uint256 x = a / 2 + 1;
while (x < b) {
b = x;
x = (a / x + x) / 2;
}
} else if (a != 0) {
b = 1;
}
}
function wmul(uint256 a, uint256 b) internal pure returns (uint256) {
return mul(a, b) / WAD;
}
function wmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
return add(mul(a, b), WAD / 2) / WAD;
}
function rmul(uint256 a, uint256 b) internal pure returns (uint256) {
return mul(a, b) / RAY;
}
function rmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
return add(mul(a, b), RAY / 2) / RAY;
}
function wdiv(uint256 a, uint256 b) internal pure returns (uint256) {
return div(mul(a, WAD), b);
}
function wdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
return add(mul(a, WAD), b / 2) / b;
}
function rdiv(uint256 a, uint256 b) internal pure returns (uint256) {
return div(mul(a, RAY), b);
}
function rdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
return add(mul(a, RAY), b / 2) / b;
}
function wpow(uint256 x, uint256 n) internal pure returns (uint256) {
uint256 result = WAD;
while (n > 0) {
if (n % 2 != 0) {
result = wmul(result, x);
}
x = wmul(x, x);
n /= 2;
}
return result;
}
function rpow(uint256 x, uint256 n) internal pure returns (uint256) {
uint256 result = RAY;
while (n > 0) {
if (n % 2 != 0) {
result = rmul(result, x);
}
x = rmul(x, x);
n /= 2;
}
return result;
}
function divCeil(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 quotient = div(a, b);
uint256 remainder = a - quotient * b;
if (remainder > 0) {
return quotient + 1;
} else {
return quotient;
}
}
}/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly {
codehash := extcodehash(account)
}
return (codehash != accountHash && codehash != 0x0);
}
/**
* @dev Converts an `address` into `address payable`. Note that this is
* simply a type cast: the actual underlying value is not changed.
*
* _Available since v2.4.0._
*/
function toPayable(address account)
internal
pure
returns (address payable)
{
return payable(account);
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*
* _Available since v2.4.0._
*/
function sendValue(address recipient, uint256 amount) internal {
require(
address(this).balance >= amount,
"Address: insufficient balance"
);
// solhint-disable-next-line avoid-call-value
(bool success, ) = recipient.call{value: amount}("");
require(
success,
"Address: unable to send value, recipient may have reverted"
);
}
}/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library RevertReasonForwarder {
function reRevert() internal pure {
// bubble up revert reason from latest external call
/// @solidity memory-safe-assembly
assembly { // solhint-disable-line no-inline-assembly
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,
* given `owner`'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @title Interface for DAI-style permits
interface IDaiLikePermit {
function permit(
address holder,
address spender,
uint256 nonce,
uint256 expiry,
bool allowed,
uint8 v,
bytes32 r,
bytes32 s
) external;
}{
"remappings": [
"@ensdomains/=node_modules/@ensdomains/",
"@openzeppelin/=node_modules/@openzeppelin/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"eth-gas-reporter/=node_modules/eth-gas-reporter/",
"forge-std/=lib/forge-std/src/",
"hardhat/=node_modules/hardhat/",
"@dex/=contracts/8/",
"@uniswap/=node_modules/@uniswap/",
"@zetachain/=node_modules/@zetachain/"
],
"optimizer": {
"enabled": false,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs"
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "london",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address payable","name":"weth","type":"address"},{"internalType":"address","name":"ekuboCore","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"SafeTransferFailed","type":"error"},{"inputs":[],"name":"EKUBO_CORE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"locked","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"payCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"moreInfo","type":"bytes"}],"name":"sellBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"moreInfo","type":"bytes"}],"name":"sellQuote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c06040523480156200001157600080fd5b506040516200271738038062002717833981810160405281019062000037919062000156565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505050506200019d565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000d982620000ac565b9050919050565b620000eb81620000cc565b8114620000f757600080fd5b50565b6000815190506200010b81620000e0565b92915050565b60006200011e82620000ac565b9050919050565b620001308162000111565b81146200013c57600080fd5b50565b600081519050620001508162000125565b92915050565b6000806040838503121562000170576200016f620000a7565b5b60006200018085828601620000fa565b925050602062000193858286016200013f565b9150509250929050565b60805160a0516124eb6200022c6000396000818161019201528181610509015281816105790152818161084f01528181610aae01528181610bbc01528181610cab01528181610dec01528181610f540152818161100601526114c00152600081816105530152818161096e01528181610a0a01528181610e7b01528181610f11015261109301526124eb6000f3fe6080604052600436106100595760003560e01c806330e6ae3114610065578063599d07141461008e5780636f7929f2146100b7578063ad5c4648146100e0578063b45a3c0e1461010b578063bb6a797b1461014857610060565b3661006057005b600080fd5b34801561007157600080fd5b5061008c60048036038101906100879190611b1a565b610173565b005b34801561009a57600080fd5b506100b560048036038101906100b09190611bbf565b610190565b005b3480156100c357600080fd5b506100de60048036038101906100d99190611b1a565b610534565b005b3480156100ec57600080fd5b506100f5610551565b6040516101029190611c0e565b60405180910390f35b34801561011757600080fd5b50610132600480360381019061012d9190611c29565b610575565b60405161013f9190611cd5565b60405180910390f35b34801561015457600080fd5b5061015d611004565b60405161016a9190611c0e565b60405180910390f35b600036602081033591505061018a84848484611028565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021590611d54565b60405180910390fd5b60008060010160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102f157600060060160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506103ff565b600060010160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103c357600060060160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506103fe565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f590611dc0565b60405180910390fd5b5b60008111610442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043990611e2c565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161047d9190611c0e565b602060405180830381865afa15801561049a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104be9190611e61565b905081811015610503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fa90611eda565b60405180910390fd5b61052e837f0000000000000000000000000000000000000000000000000000000000000000846118af565b50505050565b600036602081033591505061054b84848484611028565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fc90611d54565b60405180910390fd5b600080604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505081526020016004820160009054906101000a9004600f0b600f0b600f0b81526020016004820160109054906101000a900460ff161515151581526020016004820160119054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600582015481526020016006820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016006820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16600084602001518560400151866060015187608001518860a001516040518663ffffffff1660e01b81526004016108bf959493929190611fe3565b60408051808303816000875af11580156108dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109019190612062565b915091506000836060015161091e57836020015160000151610928565b8360200151602001515b9050600083600f0b1315610c6157600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b7e5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109c59190611c0e565b602060405180830381865afa1580156109e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a069190611e61565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610a6191906120a2565b600060405180830381600087803b158015610a7b57600080fd5b505af1158015610a8f573d6000803e3d6000fd5b505050506000846fffffffffffffffffffffffffffffffff16905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1682604051610af0906120ee565b60006040518083038185875af1925050503d8060008114610b2d576040519150601f19603f3d011682016040523d82523d6000602084013e610b32565b606091505b5050905080610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90612175565b60405180910390fd5b505050610c60565b82600060060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c11dedd8560200151600001516040518263ffffffff1660e01b8152600401610c1b9190611c0e565b6020604051808303816000875af1158015610c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e91906121dd565b505b5b600082600f0b1315610d4f5781600060060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c11dedd8560200151602001516040518263ffffffff1660e01b8152600401610d0a9190611c0e565b6020604051808303816000875af1158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d91906121dd565b505b60008460600151610d6857846020015160200151610d72565b8460200151600001515b905060008560600151610d8e5783610d8990612239565b610d99565b84610d9890612239565b5b90506000816fffffffffffffffffffffffffffffffff161115610fe757600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f52577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166303a65ab68330846040518463ffffffff1660e01b8152600401610e4793929190612290565b600060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826fffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ef357600080fd5b505af1158015610f07573d6000803e3d6000fd5b5050505050610f4d7f00000000000000000000000000000000000000000000000000000000000000008760000151836fffffffffffffffffffffffffffffffff166118af565b610fe6565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166303a65ab6838860000151846040518463ffffffff1660e01b8152600401610fb393929190612290565b600060405180830381600087803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050505b5b604051806020016040528060008152509650505050505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000808380602001905181019061103f919061239d565b9150915060008161105457826000015161105a565b82602001515b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611132577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110ea9190611c0e565b602060405180830381865afa158015611107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112b9190611e61565b90506111af565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161116b9190611c0e565b602060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac9190611e61565b90505b600081116111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e990612429565b60405180910390fd5b6000819050600061120382866118fd565b6112155767400065a8177fae28611223565b6bffff9a5889f795069a41a8a25b90506040518061010001604052808b73ffffffffffffffffffffffffffffffffffffffff16815260200187815260200183600f0b81526020018615158152602001826bffffffffffffffffffffffff1681526020016000815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155505060408201518160040160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060608201518160040160106101000a81548160ff02191690831515021790555060808201518160040160116101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060a0820151816005015560c08201518160060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060e08201518160060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f83d08ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561152657600080fd5b505af115801561153a573d6000803e3d6000fd5b505050506000806000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905550506004820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556004820160106101000a81549060ff02191690556004820160116101000a8154906bffffffffffffffffffffffff021916905560058201600090556006820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556006820160106101000a8154906fffffffffffffffffffffffffffffffff0219169055505060007f3ca20afc2ccc0000000000000000000000000000000000000000000000000000808916036116b05773ffffffffffffffffffffffffffffffffffffffff881690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118a257600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480156117205750600047115b156117d75760008173ffffffffffffffffffffffffffffffffffffffff164760405161174b906120ee565b60006040518083038185875af1925050503d8060008114611788576040519150601f19603f3d011682016040523d82523d6000602084013e61178d565b606091505b50509050806117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890612495565b60405180910390fd5b506118a1565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146118a05760008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118469190611c0e565b602060405180830381865afa158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190611e61565b9050600081111561189e5761189d8683836118af565b5b505b5b5b5050505050505050505050565b6118c28363a9059cbb60e01b848461190c565b6118f8576040517ffb7f507900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008083128218905092915050565b60006040518481528360048201528260248201526020600060448360008a5af191508115611959573d6000811461194f57600160005114601f3d11169250611957565b6000873b1192505b505b50949350505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119a182611976565b9050919050565b6119b181611996565b81146119bc57600080fd5b50565b6000813590506119ce816119a8565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611a27826119de565b810181811067ffffffffffffffff82111715611a4657611a456119ef565b5b80604052505050565b6000611a59611962565b9050611a658282611a1e565b919050565b600067ffffffffffffffff821115611a8557611a846119ef565b5b611a8e826119de565b9050602081019050919050565b82818337600083830152505050565b6000611abd611ab884611a6a565b611a4f565b905082815260208101848484011115611ad957611ad86119d9565b5b611ae4848285611a9b565b509392505050565b600082601f830112611b0157611b006119d4565b5b8135611b11848260208601611aaa565b91505092915050565b600080600060608486031215611b3357611b3261196c565b5b6000611b41868287016119bf565b9350506020611b52868287016119bf565b925050604084013567ffffffffffffffff811115611b7357611b72611971565b5b611b7f86828701611aec565b9150509250925092565b6000819050919050565b611b9c81611b89565b8114611ba757600080fd5b50565b600081359050611bb981611b93565b92915050565b60008060408385031215611bd657611bd561196c565b5b6000611be485828601611baa565b9250506020611bf5858286016119bf565b9150509250929050565b611c0881611996565b82525050565b6000602082019050611c236000830184611bff565b92915050565b600060208284031215611c3f57611c3e61196c565b5b6000611c4d84828501611baa565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c90578082015181840152602081019050611c75565b60008484015250505050565b6000611ca782611c56565b611cb18185611c61565b9350611cc1818560208601611c72565b611cca816119de565b840191505092915050565b60006020820190508181036000830152611cef8184611c9c565b905092915050565b600082825260208201905092915050565b7f4f6e6c7920456b75626f20436f72652063616e2063616c6c0000000000000000600082015250565b6000611d3e601883611cf7565b9150611d4982611d08565b602082019050919050565b60006020820190508181036000830152611d6d81611d31565b9050919050565b7f556e6b6e6f776e20746f6b656e20666f722064656274207061796d656e740000600082015250565b6000611daa601e83611cf7565b9150611db582611d74565b602082019050919050565b60006020820190508181036000830152611dd981611d9d565b9050919050565b7f4e6f2064656274207265636f7264656420666f72207468697320746f6b656e00600082015250565b6000611e16601f83611cf7565b9150611e2182611de0565b602082019050919050565b60006020820190508181036000830152611e4581611e09565b9050919050565b600081519050611e5b81611b93565b92915050565b600060208284031215611e7757611e7661196c565b5b6000611e8584828501611e4c565b91505092915050565b7f496e73756666696369656e742062616c616e636520746f207061792064656274600082015250565b6000611ec4602083611cf7565b9150611ecf82611e8e565b602082019050919050565b60006020820190508181036000830152611ef381611eb7565b9050919050565b611f0381611996565b82525050565b6000819050919050565b6000611f1e82611f09565b9050919050565b611f2e81611f13565b82525050565b606082016000820151611f4a6000850182611efa565b506020820151611f5d6020850182611efa565b506040820151611f706040850182611f25565b50505050565b600081600f0b9050919050565b611f8c81611f76565b82525050565b60008115159050919050565b611fa781611f92565b82525050565b60006bffffffffffffffffffffffff82169050919050565b611fce81611fad565b82525050565b611fdd81611b89565b82525050565b600060e082019050611ff86000830188611f34565b6120056060830187611f83565b6120126080830186611f9e565b61201f60a0830185611fc5565b61202c60c0830184611fd4565b9695505050505050565b61203f81611f76565b811461204a57600080fd5b50565b60008151905061205c81612036565b92915050565b600080604083850312156120795761207861196c565b5b60006120878582860161204d565b92505060206120988582860161204d565b9150509250929050565b60006020820190506120b76000830184611fd4565b92915050565b600081905092915050565b50565b60006120d86000836120bd565b91506120e3826120c8565b600082019050919050565b60006120f9826120cb565b9150819050919050565b7f5472616e7366657220455448206465627420746f20456b75626f20436f72652060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b600061215f602683611cf7565b915061216a82612103565b604082019050919050565b6000602082019050818103600083015261218e81612152565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6121ba81612195565b81146121c557600080fd5b50565b6000815190506121d7816121b1565b92915050565b6000602082840312156121f3576121f261196c565b5b6000612201848285016121c8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061224482611f76565b91507fffffffffffffffffffffffffffffffff8000000000000000000000000000000082036122765761227561220a565b5b816000039050919050565b61228a81612195565b82525050565b60006060820190506122a56000830186611bff565b6122b26020830185611bff565b6122bf6040830184612281565b949350505050565b600080fd5b6000815190506122db816119a8565b92915050565b6122ea81611f09565b81146122f557600080fd5b50565b600081519050612307816122e1565b92915050565b600060608284031215612323576123226122c7565b5b61232d6060611a4f565b9050600061233d848285016122cc565b6000830152506020612351848285016122cc565b6020830152506040612365848285016122f8565b60408301525092915050565b61237a81611f92565b811461238557600080fd5b50565b60008151905061239781612371565b92915050565b600080608083850312156123b4576123b361196c565b5b60006123c28582860161230d565b92505060606123d385828601612388565b9150509250929050565b7f4e6f20746f6b656e7320746f2073776170000000000000000000000000000000600082015250565b6000612413601183611cf7565b915061241e826123dd565b602082019050919050565b6000602082019050818103600083015261244281612406565b9050919050565b7f5472616e7366657220746f2070617965724f726967696e206661696c65640000600082015250565b600061247f601e83611cf7565b915061248a82612449565b602082019050919050565b600060208201905081810360008301526124ae81612472565b905091905056fea26469706673582212202a75b5bb82f6d6a77f97e18f2c8f4d926ee4c24a0192956cca4c970a053cfaec64736f6c63430008110033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d444
Deployed Bytecode
0x6080604052600436106100595760003560e01c806330e6ae3114610065578063599d07141461008e5780636f7929f2146100b7578063ad5c4648146100e0578063b45a3c0e1461010b578063bb6a797b1461014857610060565b3661006057005b600080fd5b34801561007157600080fd5b5061008c60048036038101906100879190611b1a565b610173565b005b34801561009a57600080fd5b506100b560048036038101906100b09190611bbf565b610190565b005b3480156100c357600080fd5b506100de60048036038101906100d99190611b1a565b610534565b005b3480156100ec57600080fd5b506100f5610551565b6040516101029190611c0e565b60405180910390f35b34801561011757600080fd5b50610132600480360381019061012d9190611c29565b610575565b60405161013f9190611cd5565b60405180910390f35b34801561015457600080fd5b5061015d611004565b60405161016a9190611c0e565b60405180910390f35b600036602081033591505061018a84848484611028565b50505050565b7f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021590611d54565b60405180910390fd5b60008060010160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102f157600060060160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506103ff565b600060010160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103c357600060060160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506103fe565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f590611dc0565b60405180910390fd5b5b60008111610442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043990611e2c565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161047d9190611c0e565b602060405180830381865afa15801561049a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104be9190611e61565b905081811015610503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fa90611eda565b60405180910390fd5b61052e837f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d444846118af565b50505050565b600036602081033591505061054b84848484611028565b50505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60607f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fc90611d54565b60405180910390fd5b600080604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505081526020016004820160009054906101000a9004600f0b600f0b600f0b81526020016004820160109054906101000a900460ff161515151581526020016004820160119054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600582015481526020016006820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016006820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000807f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff16600084602001518560400151866060015187608001518860a001516040518663ffffffff1660e01b81526004016108bf959493929190611fe3565b60408051808303816000875af11580156108dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109019190612062565b915091506000836060015161091e57836020015160000151610928565b8360200151602001515b9050600083600f0b1315610c6157600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b7e5760007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109c59190611c0e565b602060405180830381865afa1580156109e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a069190611e61565b90507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610a6191906120a2565b600060405180830381600087803b158015610a7b57600080fd5b505af1158015610a8f573d6000803e3d6000fd5b505050506000846fffffffffffffffffffffffffffffffff16905060007f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff1682604051610af0906120ee565b60006040518083038185875af1925050503d8060008114610b2d576040519150601f19603f3d011682016040523d82523d6000602084013e610b32565b606091505b5050905080610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90612175565b60405180910390fd5b505050610c60565b82600060060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff16630c11dedd8560200151600001516040518263ffffffff1660e01b8152600401610c1b9190611c0e565b6020604051808303816000875af1158015610c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e91906121dd565b505b5b600082600f0b1315610d4f5781600060060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff16630c11dedd8560200151602001516040518263ffffffff1660e01b8152600401610d0a9190611c0e565b6020604051808303816000875af1158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d91906121dd565b505b60008460600151610d6857846020015160200151610d72565b8460200151600001515b905060008560600151610d8e5783610d8990612239565b610d99565b84610d9890612239565b5b90506000816fffffffffffffffffffffffffffffffff161115610fe757600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f52577f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff166303a65ab68330846040518463ffffffff1660e01b8152600401610e4793929190612290565b600060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826fffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ef357600080fd5b505af1158015610f07573d6000803e3d6000fd5b5050505050610f4d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28760000151836fffffffffffffffffffffffffffffffff166118af565b610fe6565b7f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff166303a65ab6838860000151846040518463ffffffff1660e01b8152600401610fb393929190612290565b600060405180830381600087803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050505b5b604051806020016040528060008152509650505050505050919050565b7f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44481565b6000808380602001905181019061103f919061239d565b9150915060008161105457826000015161105a565b82602001515b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611132577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110ea9190611c0e565b602060405180830381865afa158015611107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112b9190611e61565b90506111af565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161116b9190611c0e565b602060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac9190611e61565b90505b600081116111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e990612429565b60405180910390fd5b6000819050600061120382866118fd565b6112155767400065a8177fae28611223565b6bffff9a5889f795069a41a8a25b90506040518061010001604052808b73ffffffffffffffffffffffffffffffffffffffff16815260200187815260200183600f0b81526020018615158152602001826bffffffffffffffffffffffff1681526020016000815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155505060408201518160040160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060608201518160040160106101000a81548160ff02191690831515021790555060808201518160040160116101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060a0820151816005015560c08201518160060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060e08201518160060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050507f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff1663f83d08ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561152657600080fd5b505af115801561153a573d6000803e3d6000fd5b505050506000806000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905550506004820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556004820160106101000a81549060ff02191690556004820160116101000a8154906bffffffffffffffffffffffff021916905560058201600090556006820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556006820160106101000a8154906fffffffffffffffffffffffffffffffff0219169055505060007f3ca20afc2ccc0000000000000000000000000000000000000000000000000000808916036116b05773ffffffffffffffffffffffffffffffffffffffff881690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118a257600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480156117205750600047115b156117d75760008173ffffffffffffffffffffffffffffffffffffffff164760405161174b906120ee565b60006040518083038185875af1925050503d8060008114611788576040519150601f19603f3d011682016040523d82523d6000602084013e61178d565b606091505b50509050806117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890612495565b60405180910390fd5b506118a1565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146118a05760008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118469190611c0e565b602060405180830381865afa158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190611e61565b9050600081111561189e5761189d8683836118af565b5b505b5b5b5050505050505050505050565b6118c28363a9059cbb60e01b848461190c565b6118f8576040517ffb7f507900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008083128218905092915050565b60006040518481528360048201528260248201526020600060448360008a5af191508115611959573d6000811461194f57600160005114601f3d11169250611957565b6000873b1192505b505b50949350505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119a182611976565b9050919050565b6119b181611996565b81146119bc57600080fd5b50565b6000813590506119ce816119a8565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611a27826119de565b810181811067ffffffffffffffff82111715611a4657611a456119ef565b5b80604052505050565b6000611a59611962565b9050611a658282611a1e565b919050565b600067ffffffffffffffff821115611a8557611a846119ef565b5b611a8e826119de565b9050602081019050919050565b82818337600083830152505050565b6000611abd611ab884611a6a565b611a4f565b905082815260208101848484011115611ad957611ad86119d9565b5b611ae4848285611a9b565b509392505050565b600082601f830112611b0157611b006119d4565b5b8135611b11848260208601611aaa565b91505092915050565b600080600060608486031215611b3357611b3261196c565b5b6000611b41868287016119bf565b9350506020611b52868287016119bf565b925050604084013567ffffffffffffffff811115611b7357611b72611971565b5b611b7f86828701611aec565b9150509250925092565b6000819050919050565b611b9c81611b89565b8114611ba757600080fd5b50565b600081359050611bb981611b93565b92915050565b60008060408385031215611bd657611bd561196c565b5b6000611be485828601611baa565b9250506020611bf5858286016119bf565b9150509250929050565b611c0881611996565b82525050565b6000602082019050611c236000830184611bff565b92915050565b600060208284031215611c3f57611c3e61196c565b5b6000611c4d84828501611baa565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c90578082015181840152602081019050611c75565b60008484015250505050565b6000611ca782611c56565b611cb18185611c61565b9350611cc1818560208601611c72565b611cca816119de565b840191505092915050565b60006020820190508181036000830152611cef8184611c9c565b905092915050565b600082825260208201905092915050565b7f4f6e6c7920456b75626f20436f72652063616e2063616c6c0000000000000000600082015250565b6000611d3e601883611cf7565b9150611d4982611d08565b602082019050919050565b60006020820190508181036000830152611d6d81611d31565b9050919050565b7f556e6b6e6f776e20746f6b656e20666f722064656274207061796d656e740000600082015250565b6000611daa601e83611cf7565b9150611db582611d74565b602082019050919050565b60006020820190508181036000830152611dd981611d9d565b9050919050565b7f4e6f2064656274207265636f7264656420666f72207468697320746f6b656e00600082015250565b6000611e16601f83611cf7565b9150611e2182611de0565b602082019050919050565b60006020820190508181036000830152611e4581611e09565b9050919050565b600081519050611e5b81611b93565b92915050565b600060208284031215611e7757611e7661196c565b5b6000611e8584828501611e4c565b91505092915050565b7f496e73756666696369656e742062616c616e636520746f207061792064656274600082015250565b6000611ec4602083611cf7565b9150611ecf82611e8e565b602082019050919050565b60006020820190508181036000830152611ef381611eb7565b9050919050565b611f0381611996565b82525050565b6000819050919050565b6000611f1e82611f09565b9050919050565b611f2e81611f13565b82525050565b606082016000820151611f4a6000850182611efa565b506020820151611f5d6020850182611efa565b506040820151611f706040850182611f25565b50505050565b600081600f0b9050919050565b611f8c81611f76565b82525050565b60008115159050919050565b611fa781611f92565b82525050565b60006bffffffffffffffffffffffff82169050919050565b611fce81611fad565b82525050565b611fdd81611b89565b82525050565b600060e082019050611ff86000830188611f34565b6120056060830187611f83565b6120126080830186611f9e565b61201f60a0830185611fc5565b61202c60c0830184611fd4565b9695505050505050565b61203f81611f76565b811461204a57600080fd5b50565b60008151905061205c81612036565b92915050565b600080604083850312156120795761207861196c565b5b60006120878582860161204d565b92505060206120988582860161204d565b9150509250929050565b60006020820190506120b76000830184611fd4565b92915050565b600081905092915050565b50565b60006120d86000836120bd565b91506120e3826120c8565b600082019050919050565b60006120f9826120cb565b9150819050919050565b7f5472616e7366657220455448206465627420746f20456b75626f20436f72652060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b600061215f602683611cf7565b915061216a82612103565b604082019050919050565b6000602082019050818103600083015261218e81612152565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6121ba81612195565b81146121c557600080fd5b50565b6000815190506121d7816121b1565b92915050565b6000602082840312156121f3576121f261196c565b5b6000612201848285016121c8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061224482611f76565b91507fffffffffffffffffffffffffffffffff8000000000000000000000000000000082036122765761227561220a565b5b816000039050919050565b61228a81612195565b82525050565b60006060820190506122a56000830186611bff565b6122b26020830185611bff565b6122bf6040830184612281565b949350505050565b600080fd5b6000815190506122db816119a8565b92915050565b6122ea81611f09565b81146122f557600080fd5b50565b600081519050612307816122e1565b92915050565b600060608284031215612323576123226122c7565b5b61232d6060611a4f565b9050600061233d848285016122cc565b6000830152506020612351848285016122cc565b6020830152506040612365848285016122f8565b60408301525092915050565b61237a81611f92565b811461238557600080fd5b50565b60008151905061239781612371565b92915050565b600080608083850312156123b4576123b361196c565b5b60006123c28582860161230d565b92505060606123d385828601612388565b9150509250929050565b7f4e6f20746f6b656e7320746f2073776170000000000000000000000000000000600082015250565b6000612413601183611cf7565b915061241e826123dd565b602082019050919050565b6000602082019050818103600083015261244281612406565b9050919050565b7f5472616e7366657220746f2070617965724f726967696e206661696c65640000600082015250565b600061247f601e83611cf7565b915061248a82612449565b602082019050919050565b600060208201905081810360008301526124ae81612472565b905091905056fea26469706673582212202a75b5bb82f6d6a77f97e18f2c8f4d926ee4c24a0192956cca4c970a053cfaec64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d444
-----Decoded View---------------
Arg [0] : weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : ekuboCore (address): 0xe0e0e08A6A4b9Dc7bD67BCB7aadE5cF48157d444
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d444
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.