Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
There are no matching entriesUpdate your filters to view other transactions | |||||||||
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HOneInchV3
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-10-05
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/handlers/oneinchV3/IAggregationRouterV3.sol
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
interface IAggregationRouterV3 {
struct SwapDescriptionV3 {
IERC20 srcToken;
IERC20 dstToken;
address srcReceiver;
address dstReceiver;
uint256 amount;
uint256 minReturnAmount;
uint256 flags;
bytes permit;
}
function discountedSwap(
IAggregationExecutor caller,
SwapDescriptionV3 calldata desc,
bytes calldata data
)
external
payable
returns (uint256 returnAmount, uint256 gasLeft, uint256 chiSpent);
function swap(
IAggregationExecutor caller,
SwapDescriptionV3 calldata desc,
bytes calldata data
)
external
payable
returns (uint256 returnAmount, uint256 gasLeft);
function unoswap(
IERC20 srcToken,
uint256 amount,
uint256 minReturn,
bytes32[] calldata /* pools */
) external payable returns (uint256 returnAmount);
}
// File: contracts/handlers/oneinchV2/IChi.sol
pragma solidity ^0.6.12;
interface IChi is IERC20 {
function mint(uint256 value) external;
function free(uint256 value) external returns (uint256 freed);
function freeFromUpTo(address from, uint256 value) external returns (uint256 freed);
}
// File: contracts/handlers/oneinchV2/IGasDiscountExtension.sol
pragma solidity ^0.6.12;
interface IGasDiscountExtension {
function calculateGas(uint256 gasUsed, uint256 flags, uint256 calldataLength) external pure returns (IChi, uint256);
}
// File: contracts/handlers/oneinchV3/IAggregationExecutor.sol
pragma solidity ^0.6.0;
interface IAggregationExecutor is IGasDiscountExtension {
function callBytes(bytes calldata data) external payable; // 0xd9c45357
}
// File: contracts/lib/LibStack.sol
pragma solidity ^0.6.0;
library LibStack {
function setAddress(bytes32[] storage _stack, address _input) internal {
_stack.push(bytes32(uint256(uint160(_input))));
}
function set(bytes32[] storage _stack, bytes32 _input) internal {
_stack.push(_input);
}
function setHandlerType(bytes32[] storage _stack, Config.HandlerType _input)
internal
{
_stack.push(bytes12(uint96(_input)));
}
function getAddress(bytes32[] storage _stack)
internal
returns (address ret)
{
ret = address(uint160(uint256(peek(_stack))));
_stack.pop();
}
function getSig(bytes32[] storage _stack) internal returns (bytes4 ret) {
ret = bytes4(peek(_stack));
_stack.pop();
}
function get(bytes32[] storage _stack) internal returns (bytes32 ret) {
ret = peek(_stack);
_stack.pop();
}
function peek(bytes32[] storage _stack)
internal
view
returns (bytes32 ret)
{
require(_stack.length > 0, "stack empty");
ret = _stack[_stack.length - 1];
}
}
// File: contracts/lib/LibCache.sol
pragma solidity ^0.6.0;
library LibCache {
function set(
mapping(bytes32 => bytes32) storage _cache,
bytes32 _key,
bytes32 _value
) internal {
_cache[_key] = _value;
}
function setAddress(
mapping(bytes32 => bytes32) storage _cache,
bytes32 _key,
address _value
) internal {
_cache[_key] = bytes32(uint256(uint160(_value)));
}
function setUint256(
mapping(bytes32 => bytes32) storage _cache,
bytes32 _key,
uint256 _value
) internal {
_cache[_key] = bytes32(_value);
}
function getAddress(
mapping(bytes32 => bytes32) storage _cache,
bytes32 _key
) internal view returns (address ret) {
ret = address(uint160(uint256(_cache[_key])));
}
function getUint256(
mapping(bytes32 => bytes32) storage _cache,
bytes32 _key
) internal view returns (uint256 ret) {
ret = uint256(_cache[_key]);
}
function get(mapping(bytes32 => bytes32) storage _cache, bytes32 _key)
internal
view
returns (bytes32 ret)
{
ret = _cache[_key];
}
}
// File: contracts/Storage.sol
pragma solidity ^0.6.0;
/// @notice A cache structure composed by a bytes32 array
contract Storage {
using LibCache for mapping(bytes32 => bytes32);
using LibStack for bytes32[];
bytes32[] public stack;
mapping(bytes32 => bytes32) public cache;
// keccak256 hash of "msg.sender"
// prettier-ignore
bytes32 public constant MSG_SENDER_KEY = 0xb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a;
// keccak256 hash of "cube.counter"
// prettier-ignore
bytes32 public constant CUBE_COUNTER_KEY = 0xf9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be;
modifier isStackEmpty() {
require(stack.length == 0, "Stack not empty");
_;
}
modifier isCubeCounterZero() {
require(_getCubeCounter() == 0, "Cube counter not zero");
_;
}
modifier isInitialized() {
require(_getSender() != address(0), "Sender is not initialized");
_;
}
modifier isNotInitialized() {
require(_getSender() == address(0), "Sender is initialized");
_;
}
function _setSender() internal isNotInitialized {
cache.setAddress(MSG_SENDER_KEY, msg.sender);
}
function _resetSender() internal {
cache.setAddress(MSG_SENDER_KEY, address(0));
}
function _getSender() internal view returns (address) {
return cache.getAddress(MSG_SENDER_KEY);
}
function _addCubeCounter() internal {
cache.setUint256(CUBE_COUNTER_KEY, _getCubeCounter() + 1);
}
function _resetCubeCounter() internal {
cache.setUint256(CUBE_COUNTER_KEY, 0);
}
function _getCubeCounter() internal view returns (uint256) {
return cache.getUint256(CUBE_COUNTER_KEY);
}
}
// File: contracts/Config.sol
pragma solidity ^0.6.0;
contract Config {
// function signature of "postProcess()"
bytes4 public constant POSTPROCESS_SIG = 0xc2722916;
// The base amount of percentage function
uint256 public constant PERCENTAGE_BASE = 1 ether;
// Handler post-process type. Others should not happen now.
enum HandlerType {Token, Custom, Others}
}
// File: contracts/interface/IERC20Usdt.sol
pragma solidity ^0.6.0;
interface IERC20Usdt {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external;
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external;
function transferFrom(address sender, address recipient, uint256 amount) external;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity >=0.6.2 <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) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @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].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: contracts/handlers/HandlerBase.sol
pragma solidity ^0.6.0;
abstract contract HandlerBase is Storage, Config {
using SafeERC20 for IERC20;
function postProcess() external payable virtual {
revert("Invalid post process");
/* Implementation template
bytes4 sig = stack.getSig();
if (sig == bytes4(keccak256(bytes("handlerFunction_1()")))) {
// Do something
} else if (sig == bytes4(keccak256(bytes("handlerFunction_2()")))) {
bytes32 temp = stack.get();
// Do something
} else revert("Invalid post process");
*/
}
function _updateToken(address token) internal {
stack.setAddress(token);
// Ignore token type to fit old handlers
// stack.setHandlerType(uint256(HandlerType.Token));
}
function _updatePostProcess(bytes32[] memory params) internal {
for (uint256 i = params.length; i > 0; i--) {
stack.set(params[i - 1]);
}
stack.set(msg.sig);
stack.setHandlerType(HandlerType.Custom);
}
function getContractName() public pure virtual returns (string memory);
function _revertMsg(string memory functionName, string memory reason)
internal
view
{
revert(
string(
abi.encodePacked(
_uint2String(_getCubeCounter()),
"_",
getContractName(),
"_",
functionName,
": ",
reason
)
)
);
}
function _revertMsg(string memory functionName) internal view {
_revertMsg(functionName, "Unspecified");
}
function _uint2String(uint256 n) internal pure returns (string memory) {
if (n == 0) {
return "0";
} else {
uint256 len = 0;
for (uint256 temp = n; temp > 0; temp /= 10) {
len++;
}
bytes memory str = new bytes(len);
for (uint256 i = len; i > 0; i--) {
str[i - 1] = bytes1(uint8(48 + (n % 10)));
n /= 10;
}
return string(str);
}
}
function _getBalance(address token, uint256 amount)
internal
view
returns (uint256)
{
if (amount != uint256(-1)) {
return amount;
}
// ETH case
if (
token == address(0) ||
token == address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
) {
return address(this).balance;
}
// ERC20 token case
return IERC20(token).balanceOf(address(this));
}
function _tokenApprove(
address token,
address spender,
uint256 amount
) internal {
try IERC20Usdt(token).approve(spender, amount) {} catch {
IERC20(token).safeApprove(spender, 0);
IERC20(token).safeApprove(spender, amount);
}
}
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
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;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
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;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: contracts/handlers/oneinchV3/HOneInchV3.sol
pragma solidity ^0.6.0;
contract HOneInchV3 is HandlerBase {
using SafeMath for uint256;
// prettier-ignore
address private constant _ONEINCH_SPENDER = 0x11111112542D85B3EF69AE05771c2dCCff4fAa26;
// prettier-ignore
address private constant _ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
function getContractName() public pure override returns (string memory) {
return "HOneInchV3";
}
function swap(
IAggregationExecutor caller,
IAggregationRouterV3.SwapDescriptionV3 calldata desc,
bytes calldata data
) external payable returns (uint256 returnAmount) {
if (_isNotNativeToken(address(desc.srcToken))) {
_tokenApprove(
address(desc.srcToken),
_ONEINCH_SPENDER,
desc.amount
);
try
IAggregationRouterV3(_ONEINCH_SPENDER).swap(caller, desc, data)
returns (uint256 ret, uint256) {
returnAmount = ret;
} catch Error(string memory message) {
_revertMsg("swap", message);
} catch {
_revertMsg("swap");
}
} else {
try
IAggregationRouterV3(_ONEINCH_SPENDER).swap{value: desc.amount}(
caller,
desc,
data
)
returns (uint256 ret, uint256) {
returnAmount = ret;
} catch Error(string memory message) {
_revertMsg("swap", message);
} catch {
_revertMsg("swap");
}
}
// Update involved token
if (_isNotNativeToken(address(desc.dstToken)))
_updateToken(address(desc.dstToken));
}
function unoswap(
IERC20 srcToken,
uint256 amount,
IERC20 dstToken,
bytes calldata data
) external payable returns (uint256 returnAmount) {
// Get dstToken balance before executing unoswap
uint256 dstTokenBalanceBefore =
_getBalance(address(dstToken), type(uint256).max);
// Interact with 1inch
if (_isNotNativeToken(address(srcToken))) {
// ERC20 token need to approve before unoswap
_tokenApprove(address(srcToken), _ONEINCH_SPENDER, amount);
returnAmount = _unoswapCall(0, data);
} else {
returnAmount = _unoswapCall(amount, data);
}
// Check, dstToken balance should be increased
uint256 dstTokenBalanceAfter =
_getBalance(address(dstToken), type(uint256).max);
if (dstTokenBalanceAfter.sub(dstTokenBalanceBefore) != returnAmount) {
_revertMsg("unoswap", "Invalid output token amount");
}
// Update involved token
if (_isNotNativeToken(address(dstToken))) {
_updateToken(address(dstToken));
}
}
function _unoswapCall(uint256 value, bytes calldata data)
internal
returns (uint256 returnAmount)
{
// Interact with 1inch through contract call with data
(bool success, bytes memory returnData) =
_ONEINCH_SPENDER.call{value: value}(data);
// Verify return status and data
if (success) {
returnAmount = abi.decode(returnData, (uint256));
} else {
if (returnData.length < 68) {
// If the returnData length is less than 68, then the transaction failed silently.
_revertMsg("unoswap");
} else {
// Look for revert reason and bubble it up if present
assembly {
returnData := add(returnData, 0x04)
}
_revertMsg("unoswap", abi.decode(returnData, (string)));
}
}
}
function _isNotNativeToken(address token) internal pure returns (bool) {
return (token != address(0) && token != _ETH_ADDRESS);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"CUBE_COUNTER_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MSG_SENDER_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POSTPROCESS_SIG","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cache","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"postProcess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stack","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAggregationExecutor","name":"caller","type":"address"},{"components":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct IAggregationRouterV3.SwapDescriptionV3","name":"desc","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unoswap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50611491806100206000396000f3fe6080604052600436106100915760003560e01c806399eb59b91161005957806399eb59b914610111578063c272291614610131578063dc9031c41461013b578063f5f5ba721461015b578063fa2901a51461017d57610091565b80630f532d18146100965780631413dc7d146100c15780637c025200146100d657806387c13943146100e95780638afa623c146100fe575b600080fd5b3480156100a257600080fd5b506100ab61019f565b6040516100b891906110ea565b60405180910390f35b3480156100cd57600080fd5b506100ab6101c3565b6100ab6100e4366004610de1565b6101e7565b3480156100f557600080fd5b506100ab61045c565b6100ab61010c366004610e7b565b610468565b34801561011d57600080fd5b506100ab61012c366004610dc9565b610567565b610139610579565b005b34801561014757600080fd5b506100ab610156366004610dc9565b61059a565b34801561016757600080fd5b506101706105b8565b6040516100b891906111e1565b34801561018957600080fd5b506101926105dd565b6040516100b891906110f3565b7fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a81565b7ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be81565b60006101fe6101f96020860186610e5f565b6105e8565b1561032d576102326102136020860186610e5f565b7311111112542d85b3ef69ae05771c2dccff4faa268660800135610627565b604051623e012960e91b81527311111112542d85b3ef69ae05771c2dccff4faa2690637c0252009061026e908890889088908890600401611108565b6040805180830381600087803b15801561028757600080fd5b505af19250505080156102b7575060408051601f3d908101601f191682019092526102b491810190610f9f565b60015b610324576102c36113a1565b806102ce57506102fa565b6102f4604051806040016040528060048152602001630737761760e41b815250826106b2565b5061031f565b61031f604051806040016040528060048152602001630737761760e41b815250610705565b610328565b5090505b610424565b604051623e012960e91b81527311111112542d85b3ef69ae05771c2dccff4faa2690637c0252009060808701359061036f908990899089908990600401611108565b60408051808303818588803b15801561038757600080fd5b505af1935050505080156103b8575060408051601f3d908101601f191682019092526103b591810190610f9f565b60015b610420576103c46113a1565b806103cf57506103fb565b6103f5604051806040016040528060048152602001630737761760e41b815250826106b2565b50610328565b610328604051806040016040528060048152602001630737761760e41b815250610705565b5090505b6104376101f96040860160208701610e5f565b156104545761045461044f6040860160208701610e5f565b610735565b949350505050565b670de0b6b3a764000081565b60008061047785600019610740565b9050610482876105e8565b156104b9576104a6877311111112542d85b3ef69ae05771c2dccff4faa2688610627565b6104b260008585610815565b91506104c7565b6104c4868585610815565b91505b60006104d586600019610740565b9050826104e28284610933565b1461054557610545604051806040016040528060078152602001660756e6f737761760cc1b8152506040518060400160405280601b81526020017f496e76616c6964206f757470757420746f6b656e20616d6f756e7400000000008152506106b2565b61054e866105e8565b1561055c5761055c86610735565b505095945050505050565b60016020526000908152604090205481565b60405162461bcd60e51b815260040161059190611214565b60405180910390fd5b600081815481106105a757fe5b600091825260209091200154905081565b60408051808201909152600a815269484f6e65496e6368563360b01b60208201525b90565b636139148b60e11b81565b60006001600160a01b0382161580159061061f57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b90505b919050565b60405163095ea7b360e01b81526001600160a01b0384169063095ea7b39061065590859085906004016110d1565b600060405180830381600087803b15801561066f57600080fd5b505af1925050508015610680575060015b6106ad576106996001600160a01b038416836000610975565b6106ad6001600160a01b0384168383610975565b505050565b6106c26106bd610a6f565b610aa1565b6106ca6105b8565b83836040516020016106df9493929190611025565b60408051601f198184030181529082905262461bcd60e51b8252610591916004016111e1565b610732816040518060400160405280600b81526020016a155b9cdc1958da599a595960aa1b8152506106b2565b50565b610732600082610b79565b6000600019821461075257508061080f565b6001600160a01b038316158061078457506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561079057504761080f565b6040516370a0823160e01b81526001600160a01b038416906370a08231906107bc9030906004016110a3565b60206040518083038186803b1580156107d457600080fd5b505afa1580156107e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080c9190610f87565b90505b92915050565b60008060607311111112542d85b3ef69ae05771c2dccff4faa266001600160a01b0316868686604051610849929190610ff9565b60006040518083038185875af1925050503d8060008114610886576040519150601f19603f3d011682016040523d82523d6000602084013e61088b565b606091505b509150915081156108b157808060200190518101906108aa9190610f87565b925061092a565b6044815110156108e8576108e3604051806040016040528060078152602001660756e6f737761760cc1b815250610705565b61092a565b60048101905061092a604051806040016040528060078152602001660756e6f737761760cc1b815250828060200190518101906109259190610eec565b6106b2565b50509392505050565b600061080c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610b9b565b8015806109fd5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906109ab90309086906004016110b7565b60206040518083038186803b1580156109c357600080fd5b505afa1580156109d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fb9190610f87565b155b610a195760405162461bcd60e51b8152600401610591906112c3565b6106ad8363095ea7b360e01b8484604051602401610a389291906110d1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610bcc565b6000610a9c60017ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be610c5b565b905090565b606081610ac657506040805180820190915260018152600360fc1b6020820152610622565b6000825b8015610ae05760019190910190600a9004610aca565b5060608167ffffffffffffffff81118015610afa57600080fd5b506040519080825280601f01601f191660200182016040528015610b25576020820181803683370190505b509050815b8015610b6f57600a850660300160f81b826001830381518110610b4957fe5b60200101906001600160f81b031916908160001a905350600a8504945060001901610b2a565b5091506106229050565b8154600181018355600092835260209092206001600160a01b03909116910155565b60008184841115610bbf5760405162461bcd60e51b815260040161059191906111e1565b50508183035b9392505050565b6060610c21826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610c6e9092919063ffffffff16565b8051909150156106ad5780806020019051810190610c3f9190610da9565b6106ad5760405162461bcd60e51b815260040161059190611279565b6000908152602091909152604090205490565b6060610454848460008585610c8285610d18565b610c9e5760405162461bcd60e51b815260040161059190611242565b60006060866001600160a01b03168587604051610cbb9190611009565b60006040518083038185875af1925050503d8060008114610cf8576040519150601f19603f3d011682016040523d82523d6000602084013e610cfd565b606091505b5091509150610d0d828286610d1e565b979650505050505050565b3b151590565b60608315610d2d575081610bc5565b825115610d3d5782518084602001fd5b8160405162461bcd60e51b815260040161059191906111e1565b60008083601f840112610d68578182fd5b50813567ffffffffffffffff811115610d7f578182fd5b602083019150836020828501011115610d9757600080fd5b9250929050565b803561080f81611446565b600060208284031215610dba578081fd5b81518015158114610bc5578182fd5b600060208284031215610dda578081fd5b5035919050565b60008060008060608587031215610df6578283fd5b8435610e0181611446565b9350602085013567ffffffffffffffff80821115610e1d578485fd5b908601906101008289031215610e31578485fd5b90935060408601359080821115610e46578384fd5b50610e5387828801610d57565b95989497509550505050565b600060208284031215610e70578081fd5b8135610bc581611446565b600080600080600060808688031215610e92578081fd5b8535610e9d81611446565b9450602086013593506040860135610eb481611446565b9250606086013567ffffffffffffffff811115610ecf578182fd5b610edb88828901610d57565b969995985093965092949392505050565b600060208284031215610efd578081fd5b815167ffffffffffffffff80821115610f14578283fd5b818401915084601f830112610f27578283fd5b815181811115610f35578384fd5b604051601f8201601f191681016020018381118282101715610f55578586fd5b604052818152838201602001871015610f6c578485fd5b610f7d82602083016020870161136b565b9695505050505050565b600060208284031215610f98578081fd5b5051919050565b60008060408385031215610fb1578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000828483379101908152919050565b6000825161101b81846020870161136b565b9190910192915050565b60008551611037818460208a0161136b565b8083019050605f60f81b8082528651611057816001850160208b0161136b565b6001920191820152845161107281600284016020890161136b565b6101d160f51b60029290910191820152835161109581600484016020880161136b565b016004019695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b6001600160e01b031991909116815260200190565b600060018060a01b03861682526060602083015260208501611136606084016111318389610d9e565b610fc2565b6111408187611319565b905061114f6080840182610fc2565b5061115d6040860186611319565b61116a60a0840182610fc2565b506111786060860186611319565b61118560c0840182610fc2565b50608085013560e083015261010060a08601358184015260c08601356101208401526111b460e0870187611326565b826101408601526111ca61016086018284610fcf565b925050508281036040840152610d0d818587610fcf565b600060208252825180602084015261120081604085016020870161136b565b601f01601f19169190910160400192915050565b602080825260149082015273496e76616c696420706f73742070726f6365737360601b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60008235610bc581611446565b6000808335601e1984360301811261133c578283fd5b830160208101925035905067ffffffffffffffff81111561135c57600080fd5b803603831315610d9757600080fd5b60005b8381101561138657818101518382015260200161136e565b83811115611395576000848401525b50505050565b60e01c90565b600060443d10156113b1576105da565b600481823e6308c379a06113c5825161139b565b146113cf576105da565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156113ff57505050506105da565b8284019250825191508082111561141957505050506105da565b503d83016020828401011115611431575050506105da565b601f01601f1916810160200160405291505090565b6001600160a01b038116811461073257600080fdfea2646970667358221220dba90d8dbbf52b177ee1abc999f5d21901cb9df8e8a643ef55c67c859f5165f864736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106100915760003560e01c806399eb59b91161005957806399eb59b914610111578063c272291614610131578063dc9031c41461013b578063f5f5ba721461015b578063fa2901a51461017d57610091565b80630f532d18146100965780631413dc7d146100c15780637c025200146100d657806387c13943146100e95780638afa623c146100fe575b600080fd5b3480156100a257600080fd5b506100ab61019f565b6040516100b891906110ea565b60405180910390f35b3480156100cd57600080fd5b506100ab6101c3565b6100ab6100e4366004610de1565b6101e7565b3480156100f557600080fd5b506100ab61045c565b6100ab61010c366004610e7b565b610468565b34801561011d57600080fd5b506100ab61012c366004610dc9565b610567565b610139610579565b005b34801561014757600080fd5b506100ab610156366004610dc9565b61059a565b34801561016757600080fd5b506101706105b8565b6040516100b891906111e1565b34801561018957600080fd5b506101926105dd565b6040516100b891906110f3565b7fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a81565b7ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be81565b60006101fe6101f96020860186610e5f565b6105e8565b1561032d576102326102136020860186610e5f565b7311111112542d85b3ef69ae05771c2dccff4faa268660800135610627565b604051623e012960e91b81527311111112542d85b3ef69ae05771c2dccff4faa2690637c0252009061026e908890889088908890600401611108565b6040805180830381600087803b15801561028757600080fd5b505af19250505080156102b7575060408051601f3d908101601f191682019092526102b491810190610f9f565b60015b610324576102c36113a1565b806102ce57506102fa565b6102f4604051806040016040528060048152602001630737761760e41b815250826106b2565b5061031f565b61031f604051806040016040528060048152602001630737761760e41b815250610705565b610328565b5090505b610424565b604051623e012960e91b81527311111112542d85b3ef69ae05771c2dccff4faa2690637c0252009060808701359061036f908990899089908990600401611108565b60408051808303818588803b15801561038757600080fd5b505af1935050505080156103b8575060408051601f3d908101601f191682019092526103b591810190610f9f565b60015b610420576103c46113a1565b806103cf57506103fb565b6103f5604051806040016040528060048152602001630737761760e41b815250826106b2565b50610328565b610328604051806040016040528060048152602001630737761760e41b815250610705565b5090505b6104376101f96040860160208701610e5f565b156104545761045461044f6040860160208701610e5f565b610735565b949350505050565b670de0b6b3a764000081565b60008061047785600019610740565b9050610482876105e8565b156104b9576104a6877311111112542d85b3ef69ae05771c2dccff4faa2688610627565b6104b260008585610815565b91506104c7565b6104c4868585610815565b91505b60006104d586600019610740565b9050826104e28284610933565b1461054557610545604051806040016040528060078152602001660756e6f737761760cc1b8152506040518060400160405280601b81526020017f496e76616c6964206f757470757420746f6b656e20616d6f756e7400000000008152506106b2565b61054e866105e8565b1561055c5761055c86610735565b505095945050505050565b60016020526000908152604090205481565b60405162461bcd60e51b815260040161059190611214565b60405180910390fd5b600081815481106105a757fe5b600091825260209091200154905081565b60408051808201909152600a815269484f6e65496e6368563360b01b60208201525b90565b636139148b60e11b81565b60006001600160a01b0382161580159061061f57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b90505b919050565b60405163095ea7b360e01b81526001600160a01b0384169063095ea7b39061065590859085906004016110d1565b600060405180830381600087803b15801561066f57600080fd5b505af1925050508015610680575060015b6106ad576106996001600160a01b038416836000610975565b6106ad6001600160a01b0384168383610975565b505050565b6106c26106bd610a6f565b610aa1565b6106ca6105b8565b83836040516020016106df9493929190611025565b60408051601f198184030181529082905262461bcd60e51b8252610591916004016111e1565b610732816040518060400160405280600b81526020016a155b9cdc1958da599a595960aa1b8152506106b2565b50565b610732600082610b79565b6000600019821461075257508061080f565b6001600160a01b038316158061078457506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561079057504761080f565b6040516370a0823160e01b81526001600160a01b038416906370a08231906107bc9030906004016110a3565b60206040518083038186803b1580156107d457600080fd5b505afa1580156107e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080c9190610f87565b90505b92915050565b60008060607311111112542d85b3ef69ae05771c2dccff4faa266001600160a01b0316868686604051610849929190610ff9565b60006040518083038185875af1925050503d8060008114610886576040519150601f19603f3d011682016040523d82523d6000602084013e61088b565b606091505b509150915081156108b157808060200190518101906108aa9190610f87565b925061092a565b6044815110156108e8576108e3604051806040016040528060078152602001660756e6f737761760cc1b815250610705565b61092a565b60048101905061092a604051806040016040528060078152602001660756e6f737761760cc1b815250828060200190518101906109259190610eec565b6106b2565b50509392505050565b600061080c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610b9b565b8015806109fd5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906109ab90309086906004016110b7565b60206040518083038186803b1580156109c357600080fd5b505afa1580156109d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fb9190610f87565b155b610a195760405162461bcd60e51b8152600401610591906112c3565b6106ad8363095ea7b360e01b8484604051602401610a389291906110d1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610bcc565b6000610a9c60017ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be610c5b565b905090565b606081610ac657506040805180820190915260018152600360fc1b6020820152610622565b6000825b8015610ae05760019190910190600a9004610aca565b5060608167ffffffffffffffff81118015610afa57600080fd5b506040519080825280601f01601f191660200182016040528015610b25576020820181803683370190505b509050815b8015610b6f57600a850660300160f81b826001830381518110610b4957fe5b60200101906001600160f81b031916908160001a905350600a8504945060001901610b2a565b5091506106229050565b8154600181018355600092835260209092206001600160a01b03909116910155565b60008184841115610bbf5760405162461bcd60e51b815260040161059191906111e1565b50508183035b9392505050565b6060610c21826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610c6e9092919063ffffffff16565b8051909150156106ad5780806020019051810190610c3f9190610da9565b6106ad5760405162461bcd60e51b815260040161059190611279565b6000908152602091909152604090205490565b6060610454848460008585610c8285610d18565b610c9e5760405162461bcd60e51b815260040161059190611242565b60006060866001600160a01b03168587604051610cbb9190611009565b60006040518083038185875af1925050503d8060008114610cf8576040519150601f19603f3d011682016040523d82523d6000602084013e610cfd565b606091505b5091509150610d0d828286610d1e565b979650505050505050565b3b151590565b60608315610d2d575081610bc5565b825115610d3d5782518084602001fd5b8160405162461bcd60e51b815260040161059191906111e1565b60008083601f840112610d68578182fd5b50813567ffffffffffffffff811115610d7f578182fd5b602083019150836020828501011115610d9757600080fd5b9250929050565b803561080f81611446565b600060208284031215610dba578081fd5b81518015158114610bc5578182fd5b600060208284031215610dda578081fd5b5035919050565b60008060008060608587031215610df6578283fd5b8435610e0181611446565b9350602085013567ffffffffffffffff80821115610e1d578485fd5b908601906101008289031215610e31578485fd5b90935060408601359080821115610e46578384fd5b50610e5387828801610d57565b95989497509550505050565b600060208284031215610e70578081fd5b8135610bc581611446565b600080600080600060808688031215610e92578081fd5b8535610e9d81611446565b9450602086013593506040860135610eb481611446565b9250606086013567ffffffffffffffff811115610ecf578182fd5b610edb88828901610d57565b969995985093965092949392505050565b600060208284031215610efd578081fd5b815167ffffffffffffffff80821115610f14578283fd5b818401915084601f830112610f27578283fd5b815181811115610f35578384fd5b604051601f8201601f191681016020018381118282101715610f55578586fd5b604052818152838201602001871015610f6c578485fd5b610f7d82602083016020870161136b565b9695505050505050565b600060208284031215610f98578081fd5b5051919050565b60008060408385031215610fb1578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000828483379101908152919050565b6000825161101b81846020870161136b565b9190910192915050565b60008551611037818460208a0161136b565b8083019050605f60f81b8082528651611057816001850160208b0161136b565b6001920191820152845161107281600284016020890161136b565b6101d160f51b60029290910191820152835161109581600484016020880161136b565b016004019695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b6001600160e01b031991909116815260200190565b600060018060a01b03861682526060602083015260208501611136606084016111318389610d9e565b610fc2565b6111408187611319565b905061114f6080840182610fc2565b5061115d6040860186611319565b61116a60a0840182610fc2565b506111786060860186611319565b61118560c0840182610fc2565b50608085013560e083015261010060a08601358184015260c08601356101208401526111b460e0870187611326565b826101408601526111ca61016086018284610fcf565b925050508281036040840152610d0d818587610fcf565b600060208252825180602084015261120081604085016020870161136b565b601f01601f19169190910160400192915050565b602080825260149082015273496e76616c696420706f73742070726f6365737360601b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60008235610bc581611446565b6000808335601e1984360301811261133c578283fd5b830160208101925035905067ffffffffffffffff81111561135c57600080fd5b803603831315610d9757600080fd5b60005b8381101561138657818101518382015260200161136e565b83811115611395576000848401525b50505050565b60e01c90565b600060443d10156113b1576105da565b600481823e6308c379a06113c5825161139b565b146113cf576105da565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156113ff57505050506105da565b8284019250825191508082111561141957505050506105da565b503d83016020828401011115611431575050506105da565b601f01601f1916810160200160405291505090565b6001600160a01b038116811461073257600080fdfea2646970667358221220dba90d8dbbf52b177ee1abc999f5d21901cb9df8e8a643ef55c67c859f5165f864736f6c634300060c0033
Deployed Bytecode Sourcemap
29635:4094:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11357:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11538:109;;;;;;;;;;;;;:::i;30062:1397::-;;;;;;:::i;:::-;;:::i;13070:49::-;;;;;;;;;;;;;:::i;31467:1171::-;;;;;;:::i;:::-;;:::i;11245:40::-;;;;;;;;;;-1:-1:-1;11245:40:0;;;;;:::i;:::-;;:::i;21168:479::-;;;:::i;:::-;;11216:22;;;;;;;;;;-1:-1:-1;11216:22:0;;;;;:::i;:::-;;:::i;29944:110::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12963:51::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11357:107::-;11398:66;11357:107;:::o;11538:109::-;11581:66;11538:109;:::o;30062:1397::-;30240:20;30277:41;30303:13;;;;:4;:13;:::i;:::-;30277:17;:41::i;:::-;30273:1036;;;30335:134;30375:13;;;;:4;:13;:::i;:::-;29780:42;30443:4;:11;;;30335:13;:134::i;:::-;30505:63;;-1:-1:-1;;;30505:63:0;;29780:42;;30505:43;;:63;;30549:6;;30557:4;;30563;;;;30505:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30505:63:0;;;;;;;;-1:-1:-1;;30505:63:0;;;;;;;;;;;;:::i;:::-;;;30484:340;;;;:::i;:::-;;;;;;;;30721:27;;;;;;;;;;;;;;-1:-1:-1;;;30721:27:0;;;30740:7;30721:10;:27::i;:::-;30667:97;30484:340;;;30790:18;;;;;;;;;;;;;;-1:-1:-1;;;30790:18:0;;;:10;:18::i;:::-;30484:340;;;-1:-1:-1;30647:3:0;-1:-1:-1;30484:340:0;30273:1036;;;30877:165;;-1:-1:-1;;;30877:165:0;;29780:42;;30877:43;;30928:11;;;;;30877:165;;30963:6;;30928:4;;31019;;;;30877:165;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30877:165:0;;;;;;;;-1:-1:-1;;30877:165:0;;;;;;;;;;;;:::i;:::-;;;30856:442;;;;:::i;:::-;;;;;;;;31195:27;;;;;;;;;;;;;;-1:-1:-1;;;31195:27:0;;;31214:7;31195:10;:27::i;:::-;31141:97;30856:442;;;31264:18;;;;;;;;;;;;;;-1:-1:-1;;;31264:18:0;;;:10;:18::i;30856:442::-;-1:-1:-1;31121:3:0;-1:-1:-1;30856:442:0;31359:41;31385:13;;;;;;;;:::i;31359:41::-;31355:96;;;31415:36;31436:13;;;;;;;;:::i;:::-;31415:12;:36::i;:::-;30062:1397;;;;;;:::o;13070:49::-;13112:7;13070:49;:::o;31467:1171::-;31624:20;31715:29;31760:49;31780:8;-1:-1:-1;;31760:11:0;:49::i;:::-;31715:94;;31858:36;31884:8;31858:17;:36::i;:::-;31854:311;;;31970:58;31992:8;29780:42;32021:6;31970:13;:58::i;:::-;32058:21;32071:1;32074:4;;32058:12;:21::i;:::-;32043:36;;31854:311;;;32127:26;32140:6;32148:4;;32127:12;:26::i;:::-;32112:41;;31854:311;32233:28;32277:49;32297:8;-1:-1:-1;;32277:11:0;:49::i;:::-;32233:93;-1:-1:-1;32392:12:0;32341:47;32233:93;32366:21;32341:24;:47::i;:::-;:63;32337:148;;32421:52;;;;;;;;;;;;;;-1:-1:-1;;;32421:52:0;;;;;;;;;;;;;;;;;;;;:10;:52::i;:::-;32535:36;32561:8;32535:17;:36::i;:::-;32531:100;;;32588:31;32609:8;32588:12;:31::i;:::-;31467:1171;;;;;;;;;:::o;11245:40::-;;;;;;;;;;;;;:::o;21168:479::-;21227:30;;-1:-1:-1;;;21227:30:0;;;;;;;:::i;:::-;;;;;;;;11216:22;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11216:22:0;:::o;29944:110::-;30027:19;;;;;;;;;;;;-1:-1:-1;;;30027:19:0;;;;29944:110;;:::o;12963:51::-;-1:-1:-1;;;12963:51:0;:::o;33583:143::-;33648:4;-1:-1:-1;;;;;33673:19:0;;;;;;:44;;-1:-1:-1;;;;;;33696:21:0;;29893:42;33696:21;;33673:44;33665:53;;33583:143;;;;:::o;23843:309::-;23972:42;;-1:-1:-1;;;23972:42:0;;-1:-1:-1;;;;;23972:25:0;;;;;:42;;23998:7;;24007:6;;23972:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23968:177;;24039:37;-1:-1:-1;;;;;24039:25:0;;24065:7;24074:1;24039:25;:37::i;:::-;24091:42;-1:-1:-1;;;;;24091:25:0;;24117:7;24126:6;24091:25;:42::i;:::-;23843:309;;;:::o;22205:470::-;22408:31;22421:17;:15;:17::i;:::-;22408:12;:31::i;:::-;22488:17;:15;:17::i;:::-;22554:12;22616:6;22369:272;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22369:272:0;;;;;;;;;;-1:-1:-1;;;22323:344:0;;;;;;;:::i;22683:120::-;22756:39;22767:12;22756:39;;;;;;;;;;;;;-1:-1:-1;;;22756:39:0;;;:10;:39::i;:::-;22683:120;:::o;21655:200::-;21712:23;:5;21729;21712:16;:23::i;23335:500::-;23437:7;-1:-1:-1;;23466:6:0;:21;23462:67;;-1:-1:-1;23511:6:0;23504:13;;23462:67;-1:-1:-1;;;;;23580:19:0;;;;:96;;-1:-1:-1;;;;;;23616:60:0;;23633:42;23616:60;23580:96;23562:181;;;-1:-1:-1;23710:21:0;23703:28;;23562:181;23789:38;;-1:-1:-1;;;23789:38:0;;-1:-1:-1;;;;;23789:23:0;;;;;:38;;23821:4;;23789:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23782:45;;23335:500;;;;;:::o;32646:929::-;32740:20;32843:12;32857:23;29780:42;-1:-1:-1;;;;;32897:21:0;32926:5;32933:4;;32897:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32842:96;;;;32997:7;32993:575;;;33047:10;33036:33;;;;;;;;;;;;:::i;:::-;33021:48;;32993:575;;;33126:2;33106:10;:17;:22;33102:455;;;33249:21;;;;;;;;;;;;;;-1:-1:-1;;;33249:21:0;;;:10;:21::i;:::-;33102:455;;;33444:4;33432:10;33428:21;33414:35;;33486:55;;;;;;;;;;;;;;-1:-1:-1;;;33486:55:0;;;33519:10;33508:32;;;;;;;;;;;;:::i;:::-;33486:10;:55::i;:::-;32646:929;;;;;;;:::o;25556:136::-;25614:7;25641:43;25645:1;25648;25641:43;;;;;;;;;;;;;;;;;:3;:43::i;4171:622::-;4541:10;;;4540:62;;-1:-1:-1;4557:39:0;;-1:-1:-1;;;4557:39:0;;-1:-1:-1;;;;;4557:15:0;;;;;:39;;4581:4;;4588:7;;4557:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;4540:62;4532:152;;;;-1:-1:-1;;;4532:152:0;;;;;;;:::i;:::-;4695:90;4715:5;4745:22;;;4769:7;4778:5;4722:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4722:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;4722:62:0;-1:-1:-1;;;;;;4722:62:0;;;;;;;;;;4695:19;:90::i;12708:119::-;12758:7;12785:34;:5;11581:66;12785:16;:34::i;:::-;12778:41;;12708:119;:::o;22811:516::-;22867:13;22897:6;22893:427;;-1:-1:-1;22920:10:0;;;;;;;;;;;;-1:-1:-1;;;22920:10:0;;;;;;22893:427;22963:11;23013:1;22993:85;23016:8;;22993:85;;23057:5;;;;;;23034:2;23026:10;;22993:85;;;;23092:16;23121:3;23111:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23111:14:0;-1:-1:-1;23092:33:0;-1:-1:-1;23157:3:0;23140:136;23162:5;;23140:136;;23229:2;23225:1;:6;23219:2;:13;23206:28;;23193:3;23201:1;23197;:5;23193:10;;;;;;;;;;;:41;-1:-1:-1;;;;;23193:41:0;;;;;;;;-1:-1:-1;23258:2:0;23253:7;;;-1:-1:-1;;;23169:3:0;23140:136;;;-1:-1:-1;23304:3:0;-1:-1:-1;23290:18:0;;-1:-1:-1;23290:18:0;8602:136;8684:46;;;;;;;8696:33;8684:46;;;;;;;-1:-1:-1;;;;;8704:24:0;;;8684:46;;;8602:136::o;25995:192::-;26081:7;26117:12;26109:6;;;;26101:29;;;;-1:-1:-1;;;26101:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;26153:5:0;;;25995:192;;;;;;:::o;5817:761::-;6241:23;6267:69;6295:4;6267:69;;;;;;;;;;;;;;;;;6275:5;-1:-1:-1;;;;;6267:27:0;;;:69;;;;;:::i;:::-;6351:17;;6241:95;;-1:-1:-1;6351:21:0;6347:224;;6493:10;6482:30;;;;;;;;;;;;:::i;:::-;6474:85;;;;-1:-1:-1;;;6474:85:0;;;;;;;:::i;10602:185::-;10728:11;10766:12;;;;;;;;;;;;;10602:185::o;17656:195::-;17759:12;17791:52;17813:6;17821:4;17827:1;17830:12;17759;18960:18;18971:6;18960:10;:18::i;:::-;18952:60;;;;-1:-1:-1;;;18952:60:0;;;;;;;:::i;:::-;19086:12;19100:23;19127:6;-1:-1:-1;;;;;19127:11:0;19147:5;19155:4;19127:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19085:75;;;;19178:52;19196:7;19205:10;19217:12;19178:17;:52::i;:::-;19171:59;18708:530;-1:-1:-1;;;;;;;18708:530:0:o;14738:422::-;15105:20;15144:8;;;14738:422::o;20244:742::-;20359:12;20388:7;20384:595;;;-1:-1:-1;20419:10:0;20412:17;;20384:595;20533:17;;:21;20529:439;;20796:10;20790:17;20857:15;20844:10;20840:2;20836:19;20829:44;20744:148;20939:12;20932:20;;-1:-1:-1;;;20932:20:0;;;;;;;;:::i;428:336:-1:-;;;542:3;535:4;527:6;523:17;519:27;509:2;;-1:-1;;550:12;509:2;-1:-1;580:20;;620:18;609:30;;606:2;;;-1:-1;;642:12;606:2;686:4;678:6;674:17;662:29;;737:3;686:4;717:17;678:6;703:32;;700:41;697:2;;;754:1;;744:12;697:2;502:262;;;;;:::o;965:156::-;1045:20;;1070:46;1045:20;1070:46;:::i;2088:257::-;;2200:2;2188:9;2179:7;2175:23;2171:32;2168:2;;;-1:-1;;2206:12;2168:2;223:6;217:13;26016:5;23106:13;23099:21;25994:5;25991:32;25981:2;;-1:-1;;26027:12;2352:241;;2456:2;2444:9;2435:7;2431:23;2427:32;2424:2;;;-1:-1;;2462:12;2424:2;-1:-1;344:20;;2418:175;-1:-1;2418:175::o;2600:829::-;;;;;2821:2;2809:9;2800:7;2796:23;2792:32;2789:2;;;-1:-1;;2827:12;2789:2;880:6;867:20;892:61;947:5;892:61;:::i;:::-;2879:91;-1:-1;3035:2;3020:18;;3007:32;3059:18;3048:30;;;3045:2;;;-1:-1;;3081:12;3045:2;3168:22;;;;1755:3;1737:16;;;1733:26;1730:2;;;-1:-1;;1762:12;1730:2;3101:99;;-1:-1;3265:2;3250:18;;3237:32;;3278:30;;;3275:2;;;-1:-1;;3311:12;3275:2;;3349:64;3405:7;3396:6;3385:9;3381:22;3349:64;:::i;:::-;2783:646;;;;-1:-1;3331:82;-1:-1;;;;2783:646::o;3436:267::-;;3553:2;3541:9;3532:7;3528:23;3524:32;3521:2;;;-1:-1;;3559:12;3521:2;1058:6;1045:20;1070:46;1110:5;1070:46;:::i;3710:793::-;;;;;;3910:3;3898:9;3889:7;3885:23;3881:33;3878:2;;;-1:-1;;3917:12;3878:2;1058:6;1045:20;1070:46;1110:5;1070:46;:::i;:::-;3969:76;-1:-1;4082:2;4121:22;;1877:20;;-1:-1;4190:2;4242:22;;1045:20;1070:46;1045:20;1070:46;:::i;:::-;4198:76;-1:-1;4339:2;4324:18;;4311:32;4363:18;4352:30;;4349:2;;;-1:-1;;4385:12;4349:2;4423:64;4479:7;4470:6;4459:9;4455:22;4423:64;:::i;:::-;3872:631;;;;-1:-1;3872:631;;-1:-1;4405:82;;;3872:631;-1:-1;;;3872:631::o;4510:362::-;;4635:2;4623:9;4614:7;4610:23;4606:32;4603:2;;;-1:-1;;4641:12;4603:2;4692:17;4686:24;4730:18;;4722:6;4719:30;4716:2;;;-1:-1;;4752:12;4716:2;4839:6;4828:9;4824:22;;;1242:3;1235:4;1227:6;1223:17;1219:27;1209:2;;-1:-1;;1250:12;1209:2;1290:6;1284:13;4730:18;20761:6;20758:30;20755:2;;;-1:-1;;20791:12;20755:2;20424;20418:9;20864;20845:17;;-1:-1;;20841:33;20450:17;;4635:2;20450:17;20510:34;;;20546:22;;;20507:62;20504:2;;;-1:-1;;20572:12;20504:2;20424;20591:22;1383:21;;;1483:16;;;4635:2;1483:16;1480:25;-1:-1;1477:2;;;-1:-1;;1508:12;1477:2;1528:39;1560:6;4635:2;1459:5;1455:16;4635:2;1425:6;1421:17;1528:39;:::i;:::-;4772:84;4597:275;-1:-1;;;;;;4597:275::o;5127:263::-;;5242:2;5230:9;5221:7;5217:23;5213:32;5210:2;;;-1:-1;;5248:12;5210:2;-1:-1;2025:13;;5204:186;-1:-1;5204:186::o;5397:399::-;;;5529:2;5517:9;5508:7;5504:23;5500:32;5497:2;;;-1:-1;;5535:12;5497:2;-1:-1;;2025:13;;5698:2;5748:22;;;2025:13;;;;;-1:-1;5491:305::o;5803:103::-;-1:-1;;;;;23661:54;5864:37;;5858:48::o;6293:277::-;;21316:6;21311:3;21304:19;24497:6;24492:3;21353:4;21348:3;21344:14;24474:30;-1:-1;21353:4;24544:6;21348:3;24535:16;;24528:27;21353:4;20864:9;;24934:2;6556:6;24914:14;24910:28;21348:3;6525:39;;6518:46;;6383:187;;;;;:::o;13397:291::-;;24497:6;24492:3;24487;24474:30;24535:16;;24528:27;;;24535:16;13541:147;-1:-1;13541:147::o;13695:271::-;;7407:5;21041:12;7518:52;7563:6;7558:3;7551:4;7544:5;7540:16;7518:52;:::i;:::-;7582:16;;;;;13829:137;-1:-1;;13829:137::o;13973:1559::-;;7407:5;21041:12;7518:52;7563:6;7558:3;7551:4;7544:5;7540:16;7518:52;:::i;:::-;7591:6;7586:3;7582:16;7575:23;;-1:-1;;;10016:3;10003:11;9996:24;7407:5;21041:12;7518:52;7563:6;9981:1;10043:3;10039:11;7551:4;7544:5;7540:16;7518:52;:::i;:::-;9981:1;7582:16;;;;;9996:24;21041:12;;7518:52;21041:12;10039:11;;;7551:4;7540:16;;7518:52;:::i;:::-;-1:-1;;;10039:11;7582:16;;;;;;;10728:25;21041:12;;7518:52;21041:12;10772:11;;;7551:4;7540:16;;7518:52;:::i;:::-;7582:16;10772:11;7582:16;;14556:976;-1:-1;;;;;;14556:976::o;15539:222::-;-1:-1;;;;;23661:54;;;;5864:37;;15666:2;15651:18;;15637:124::o;15768:333::-;-1:-1;;;;;23661:54;;;5864:37;;23661:54;;16087:2;16072:18;;5864:37;15923:2;15908:18;;15894:207::o;16108:333::-;-1:-1;;;;;23661:54;;;;5864:37;;16427:2;16412:18;;6104:37;16263:2;16248:18;;16234:207::o;16448:222::-;6104:37;;;16575:2;16560:18;;16546:124::o;16677:218::-;-1:-1;;;;;;23272:78;;;;6222:36;;16802:2;16787:18;;16773:122::o;16902:792::-;;620:18;;23672:42;;;7780:5;23661:54;7716:3;7709:78;17211:2;17357;17346:9;17342:18;17335:48;17357:2;11587:16;22787:12;11610:76;17211:2;17200:9;17196:18;22748:52;22787:12;11587:16;22748:52;:::i;:::-;11610:76;:::i;:::-;11752:63;11798:16;11791:5;11752:63;:::i;:::-;11732:83;;11821:76;11882:14;17200:9;11882:14;11868:12;11821:76;:::i;:::-;;11966:50;12010:4;12003:5;11999:16;11992:5;11966:50;:::i;:::-;12022:63;12070:14;17200:9;12070:14;12056:12;12022:63;:::i;:::-;;12154:50;17211:2;12191:5;12187:16;12180:5;12154:50;:::i;:::-;12210:63;12258:14;17200:9;12258:14;12244:12;12210:63;:::i;:::-;;11882:14;12374:5;12370:16;1877:20;12441:14;17200:9;12441:14;6104:37;11469:6;12070:14;12566:5;12562:16;1877:20;11469:6;17200:9;12633:14;6104:37;12258:14;12748:5;12744:16;1877:20;12815:14;17200:9;12815:14;6104:37;12908:61;12441:14;12956:5;12952:16;12945:5;12908:61;:::i;:::-;11469:6;12989:14;17200:9;12989:14;12982:38;13035:87;11460:16;17200:9;11460:16;13103:12;13089;13035:87;:::i;:::-;13144:11;;;;17573:9;17567:4;17563:20;12010:4;17547:9;17543:18;17536:48;17598:86;17679:4;17670:6;17662;17598:86;:::i;17701:310::-;;17848:2;17869:17;17862:47;8093:5;21041:12;21316:6;17848:2;17837:9;17833:18;21304:19;8187:52;8232:6;21344:14;17837:9;21344:14;17848:2;8213:5;8209:16;8187:52;:::i;:::-;20864:9;24914:14;-1:-1;;24910:28;8251:39;;;;21344:14;8251:39;;17819:192;-1:-1;;17819:192::o;18441:416::-;18641:2;18655:47;;;9278:2;18626:18;;;21304:19;-1:-1;;;21344:14;;;9294:43;9356:12;;;18612:245::o;18864:416::-;19064:2;19078:47;;;9607:2;19049:18;;;21304:19;9643:31;21344:14;;;9623:52;9694:12;;;19035:245::o;19287:416::-;19487:2;19501:47;;;10289:2;19472:18;;;21304:19;10325:34;21344:14;;;10305:55;-1:-1;;;10380:12;;;10373:34;10426:12;;;19458:245::o;19710:416::-;19910:2;19924:47;;;11022:2;19895:18;;;21304:19;11058:34;21344:14;;;11038:55;-1:-1;;;11113:12;;;11106:46;11171:12;;;19881:245::o;22023:119::-;;85:6;72:20;97:33;124:5;97:33;:::i;22151:501::-;;;22275:3;22262:17;22319:48;;22343:8;22327:14;22323:29;22319:48;22299:18;22295:73;22285:2;;-1:-1;;22372:12;22285:2;22401:33;;22358:4;22490:16;;;-1:-1;22456:19;;-1:-1;22526:18;22515:30;;22512:2;;;22558:1;;22548:12;22512:2;22605:17;22327:14;22585:38;22575:8;22571:53;22568:2;;;22637:1;;22627:12;24570:268;24635:1;24642:101;24656:6;24653:1;24650:13;24642:101;;;24723:11;;;24717:18;24704:11;;;24697:39;24678:2;24671:10;24642:101;;;24758:6;24755:1;24752:13;24749:2;;;24635:1;24814:6;24809:3;24805:16;24798:27;24749:2;;24619:219;;;:::o;24951:106::-;25036:3;25032:15;;25004:53::o;25065:739::-;;25138:4;25120:16;25117:26;25114:2;;;25146:5;;25114:2;25180:1;-1:-1;;25159:23;25255:10;25198:34;-1:-1;25223:8;25198:34;:::i;:::-;25247:19;25237:2;;25270:5;;25237:2;25301;25295:9;25337:16;-1:-1;;25333:24;25180:1;25295:9;25309:49;25384:4;25378:11;25465:16;25417:18;25465:16;25458:4;25450:6;25446:17;25443:39;25417:18;25409:6;25406:30;25397:91;25394:2;;;25496:5;;;;;;25394:2;25534:6;25528:4;25524:17;25513:28;;25566:3;25560:10;25546:24;;25417:18;25581:6;25578:30;25575:2;;;25611:5;;;;;;25575:2;;25688:16;25682:4;25678:27;25648:4;25655:6;25643:3;25635:27;;25670:36;25667:2;;;25709:5;;;;;25667:2;20864:9;24914:14;-1:-1;;24910:28;25733:50;;25648:4;25733:50;25301:2;25722:62;25741:3;-1:-1;;25108:696;:::o;25811:117::-;-1:-1;;;;;23661:54;;25870:35;;25860:2;;25919:1;;25909:12
Swarm Source
ipfs://dba90d8dbbf52b177ee1abc999f5d21901cb9df8e8a643ef55c67c859f5165f8
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.