Polygon Sponsored slots available. Book your slot here!
Source Code
Overview
POL Balance
POL Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 55131236 | 601 days ago | Contract Creation | 0 POL |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
NitroAdapter
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {RouterIntentEoaAdapterWithoutDataProvider, EoaExecutorWithoutDataProvider} from "@routerprotocol/intents-core/contracts/RouterIntentEoaAdapter.sol";
import {Errors} from "../../Errors.sol";
import {IERC20, SafeERC20} from "../../utils/SafeERC20.sol";
import {IAssetForwarder} from "../../interfaces/IAssetForwarder.sol";
import {IDexSpan} from "../../interfaces/IDexSpan.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
contract NitroDataStore is Ownable {
address public assetForwarder;
address public dexspan;
constructor(address _assetForwarder, address _dexspan) {
assetForwarder = _assetForwarder;
dexspan = _dexspan;
}
function setDexSpan(address _dexspan) external onlyOwner {
dexspan = _dexspan;
}
function setAssetForwarder(address _assetForwarder) external onlyOwner {
assetForwarder = _assetForwarder;
}
}
/**
* @title NitroAdapter
* @author Shivam Agrawal
* @notice Adapter for bridging funds and instructions to another chain.
*/
contract NitroAdapter is RouterIntentEoaAdapterWithoutDataProvider {
using SafeERC20 for IERC20;
address public immutable usdc;
NitroDataStore public immutable nitroDataStore;
uint256 public constant PARTNER_ID = 1;
struct SwapAndDepositData {
uint256 partnerId;
bytes32 destChainIdBytes;
bytes recipient;
address refundRecipient;
uint256 feeAmount;
IDexSpan.SwapParams swapData;
bytes message;
}
struct UsdcCCTPData {
uint256 partnerId;
uint256 amount;
bytes32 destChainIdBytes;
bytes32 recipient;
}
constructor(
address __native,
address __wnative,
address __assetForwarder,
address __dexspan
)
RouterIntentEoaAdapterWithoutDataProvider(__native, __wnative)
// solhint-disable-next-line no-empty-blocks
{
nitroDataStore = new NitroDataStore(__assetForwarder, __dexspan);
usdc = IAssetForwarder(__assetForwarder).usdc();
}
function name() public pure override returns (string memory) {
return "NitroAdapter";
}
/**
* @inheritdoc EoaExecutorWithoutDataProvider
*/
function execute(
bytes calldata data
) external payable override returns (address[] memory tokens) {
// txType = 0 -> assetForwarder iDeposit
// txType = 1 -> dexspan swapAndDeposit
// txType = 2 -> usdcRequest
// txType = 3 -> swapAndDeposit USDC
uint8 txType = abi.decode(data, (uint8));
if (txType > 3) revert(Errors.INVALID_BRDIGE_TX_TYPE);
address[] memory _tokens = new address[](1);
if (txType == 0) {
(
,
IAssetForwarder.DepositData memory depositData,
bytes memory destToken,
bytes memory recipient,
bytes memory message
) = abi.decode(
data,
(uint8, IAssetForwarder.DepositData, bytes, bytes, bytes)
);
address assetForwarder = nitroDataStore.assetForwarder();
if (address(depositData.srcToken) == native()) {
if (address(this) == self())
require(
msg.value == depositData.amount,
Errors.INSUFFICIENT_NATIVE_FUNDS_PASSED
);
else if (depositData.amount == type(uint256).max)
depositData.amount = address(this).balance;
_tokens[0] = native();
if (message.length == 0) {
IAssetForwarder(assetForwarder).iDeposit{
value: depositData.amount
}(depositData, destToken, recipient);
} else
IAssetForwarder(assetForwarder).iDepositMessage{
value: depositData.amount
}(depositData, destToken, recipient, message);
} else {
if (address(this) == self())
IERC20(depositData.srcToken).safeTransferFrom(
msg.sender,
address(this),
depositData.amount
);
else if (depositData.amount == type(uint256).max)
depositData.amount = IERC20(depositData.srcToken).balanceOf(
address(this)
);
IERC20(depositData.srcToken).safeIncreaseAllowance(
assetForwarder,
depositData.amount
);
_tokens[0] = depositData.srcToken;
if (message.length == 0)
IAssetForwarder(assetForwarder).iDeposit(
depositData,
destToken,
recipient
);
else
IAssetForwarder(assetForwarder).iDepositMessage(
depositData,
destToken,
recipient,
message
);
}
} else if (txType == 1) {
(
,
SwapAndDepositData memory dexspanData,
bytes memory message
) = abi.decode(data, (uint8, SwapAndDepositData, bytes));
address dexspan = nitroDataStore.dexspan();
address srcToken = address(dexspanData.swapData.tokens[0]);
uint256 amount = dexspanData.swapData.amount;
if (address(this) == self()) {
if (srcToken == native()) {
if (msg.value != amount)
revert(Errors.INSUFFICIENT_NATIVE_FUNDS_PASSED);
} else {
IERC20(srcToken).safeTransferFrom(
msg.sender,
self(),
amount
);
}
} else if (amount == type(uint256).max) {
if (srcToken == native()) {
amount = address(this).balance;
} else {
amount = IERC20(srcToken).balanceOf(address(this));
}
}
withdrawTokens(srcToken, dexspan, amount);
dexspanData.swapData.amount = amount;
dexspanData.swapData.isWrapper = true;
_tokens[0] = srcToken;
if (message.length == 0)
IDexSpan(dexspan).swapAndDeposit(
dexspanData.partnerId,
dexspanData.destChainIdBytes,
dexspanData.recipient,
0,
dexspanData.feeAmount,
hex"",
dexspanData.swapData,
dexspanData.refundRecipient
);
else
IDexSpan(dexspan).swapAndDeposit(
dexspanData.partnerId,
dexspanData.destChainIdBytes,
dexspanData.recipient,
1,
dexspanData.feeAmount,
message,
dexspanData.swapData,
dexspanData.refundRecipient
);
} else if (txType == 2) {
(, UsdcCCTPData memory usdcData) = abi.decode(
data,
(uint8, UsdcCCTPData)
);
address assetForwarder = nitroDataStore.assetForwarder();
if (address(this) == self())
IERC20(usdc).safeTransferFrom(
msg.sender,
self(),
usdcData.amount
);
else if (usdcData.amount == type(uint256).max)
usdcData.amount = IERC20(usdc).balanceOf(address(this));
IERC20(usdc).safeIncreaseAllowance(assetForwarder, usdcData.amount);
_tokens[0] = usdc;
IAssetForwarder(assetForwarder).iDepositUSDC(
usdcData.partnerId,
usdcData.destChainIdBytes,
usdcData.recipient,
usdcData.amount
);
} else {
address assetForwarder = nitroDataStore.assetForwarder();
address dexspan = nitroDataStore.dexspan();
(, SwapAndDepositData memory dexspanData) = abi.decode(
data,
(uint8, SwapAndDepositData)
);
IAssetForwarder.DestDetails memory destDetails = IAssetForwarder(
assetForwarder
).destDetails(dexspanData.destChainIdBytes);
if (!destDetails.isSet) revert(Errors.INVALID_REQUEST);
address srcToken = address(dexspanData.swapData.tokens[0]);
uint256 amount = dexspanData.swapData.amount;
if (address(this) == self()) {
if (srcToken == native()) {
if (msg.value != amount + destDetails.fee)
revert(Errors.INSUFFICIENT_NATIVE_FUNDS_PASSED);
} else {
IERC20(srcToken).safeTransferFrom(
msg.sender,
self(),
amount
);
}
} else if (amount == type(uint256).max) {
if (srcToken == native()) {
amount = address(this).balance - destDetails.fee;
} else {
amount = IERC20(srcToken).balanceOf(address(this));
}
}
withdrawTokens(srcToken, dexspan, amount);
dexspanData.swapData.amount = amount;
dexspanData.swapData.isWrapper = true;
_tokens[0] = srcToken;
IDexSpan(dexspan).swapAndDeposit{value: destDetails.fee}(
dexspanData.partnerId,
dexspanData.destChainIdBytes,
dexspanData.recipient,
2,
dexspanData.feeAmount,
hex"",
dexspanData.swapData,
dexspanData.refundRecipient
);
}
emit ExecutionEvent(name(), data);
return _tokens;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {IAdapterDataProvider} from "./interfaces/IAdapterDataProvider.sol";
/**
* @title AdapterDataProvider
* @author Router Protocol
* @notice This contract serves as the data provider for an intent adapter based on Router
* Cross-Chain Intent Framework.
*/
contract AdapterDataProvider is IAdapterDataProvider {
address private _owner;
mapping(address => bool) private _headRegistry;
mapping(address => bool) private _tailRegistry;
mapping(address => bool) private _inboundAssetRegistry;
mapping(address => bool) private _outboundAssetRegistry;
constructor(address __owner) {
_owner = __owner;
}
/**
* @inheritdoc IAdapterDataProvider
*/
function owner() external view returns (address) {
return _owner;
}
/**
* @inheritdoc IAdapterDataProvider
*/
function setOwner(address __owner) external onlyOwner {
_owner = __owner;
}
/**
* @inheritdoc IAdapterDataProvider
*/
function isAuthorizedPrecedingContract(
address precedingContract
) external view returns (bool) {
if (precedingContract == address(0)) return true;
return _headRegistry[precedingContract];
}
/**
* @inheritdoc IAdapterDataProvider
*/
function isAuthorizedSucceedingContract(
address succeedingContract
) external view returns (bool) {
if (succeedingContract == address(0)) return true;
return _tailRegistry[succeedingContract];
}
/**
* @inheritdoc IAdapterDataProvider
*/
function isValidInboundAsset(address asset) external view returns (bool) {
return _inboundAssetRegistry[asset];
}
/**
* @inheritdoc IAdapterDataProvider
*/
function isValidOutboundAsset(address asset) external view returns (bool) {
return _outboundAssetRegistry[asset];
}
/**
* @inheritdoc IAdapterDataProvider
*/
function setPrecedingContract(
address precedingContract,
bool isValid
) external onlyOwner {
_headRegistry[precedingContract] = isValid;
}
/**
* @inheritdoc IAdapterDataProvider
*/
function setSucceedingContract(
address succeedingContract,
bool isValid
) external onlyOwner {
_tailRegistry[succeedingContract] = isValid;
}
/**
* @inheritdoc IAdapterDataProvider
*/
function setInboundAsset(address asset, bool isValid) external onlyOwner {
_inboundAssetRegistry[asset] = isValid;
}
/**
* @inheritdoc IAdapterDataProvider
*/
function setOutboundAsset(address asset, bool isValid) external onlyOwner {
_outboundAssetRegistry[asset] = isValid;
}
/**
* @notice modifier to ensure that only owner can call this function
*/
modifier onlyOwner() {
_onlyOwner();
_;
}
function _onlyOwner() private view {
require(msg.sender == _owner, "Only owner");
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {Basic} from "./common/Basic.sol";
import {Errors} from "./utils/Errors.sol";
import {ReentrancyGuard} from "./utils/ReentrancyGuard.sol";
import {AdapterDataProvider} from "./AdapterDataProvider.sol";
/**
* @title BaseAdapter
* @author Router Protocol
* @notice This contract is the base implementation of an intent adapter based on Router
* Cross-Chain Intent Framework.
*/
abstract contract BaseAdapter is Basic, ReentrancyGuard {
address private immutable _self;
address private immutable _native;
address private immutable _wnative;
AdapterDataProvider private immutable _adapterDataProvider;
event ExecutionEvent(string indexed adapterName, bytes data);
event OperationFailedRefundEvent(
address token,
address recipient,
uint256 amount
);
event UnsupportedOperation(
address token,
address refundAddress,
uint256 amount
);
constructor(
address __native,
address __wnative,
bool __deployDataProvider,
address __owner
) {
_self = address(this);
_native = __native;
_wnative = __wnative;
AdapterDataProvider dataProvider;
if (__deployDataProvider)
dataProvider = new AdapterDataProvider(__owner);
else dataProvider = AdapterDataProvider(address(0));
_adapterDataProvider = dataProvider;
}
/**
* @dev function to get the address of weth
*/
function wnative() public view override returns (address) {
return _wnative;
}
/**
* @dev function to get the address of native token
*/
function native() public view override returns (address) {
return _native;
}
/**
* @dev function to get the AdapterDataProvider instance for this contract
*/
function adapterDataProvider() public view returns (AdapterDataProvider) {
return _adapterDataProvider;
}
/**
* @dev Function to check whether the contract is a valid preceding contract registered in
* the head registry.
* @dev This registry governs the initiation of the adapter, exclusively listing authorized
* preceding adapters.
* @notice Only the adapters documented in this registry can invoke the current adapter,
* thereby guaranteeing regulated and secure execution sequences.
* @param precedingContract Address of preceding contract.
* @return true if valid, false if invalid.
*/
function isAuthorizedPrecedingContract(
address precedingContract
) public view returns (bool) {
return
_adapterDataProvider.isAuthorizedPrecedingContract(
precedingContract
);
}
/**
* @dev Function to check whether the contract is a valid succeeding contract registered in
* the tail registry.
* @dev This registry dictates the potential succeeding actions by listing adapters that
* may be invoked following the current one.
* @notice Only the adapters documented in this registry can be invoked by the current adapter,
* thereby guaranteeing regulated and secure execution sequences.
* @param succeedingContract Address of succeeding contract.
* @return true if valid, false if invalid.
*/
function isAuthorizedSucceedingContract(
address succeedingContract
) public view returns (bool) {
return
_adapterDataProvider.isAuthorizedSucceedingContract(
succeedingContract
);
}
/**
* @dev Function to check whether the asset is a valid inbound asset registered in the inbound
* asset registry.
* @dev This registry keeps track of all the acceptable incoming assets, ensuring that the
* adapter only processes predefined asset types.
* @param asset Address of the asset.
* @return true if valid, false if invalid.
*/
function isValidInboundAsset(address asset) public view returns (bool) {
return _adapterDataProvider.isValidInboundAsset(asset);
}
/**
* @dev Function to check whether the asset is a valid outbound asset registered in the outbound
* asset registry.
* @dev It manages the types of assets that the adapter is allowed to output, thus controlling
* the flow’s output and maintaining consistency.
* @param asset Address of the asset.
* @return true if valid, false if invalid.
*/
function isValidOutboundAsset(address asset) public view returns (bool) {
return _adapterDataProvider.isValidOutboundAsset(asset);
}
/**
* @dev function to get the name of the adapter
*/
function name() public view virtual returns (string memory);
/**
* @dev function to get the address of the contract
*/
function self() public view returns (address) {
return _self;
}
}//SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {TokenInterface} from "./Interfaces.sol";
import {TokenUtilsBase} from "./TokenUtilsBase.sol";
abstract contract Basic is TokenUtilsBase {
function getTokenBal(address token) internal view returns (uint _amt) {
_amt = address(token) == native()
? address(this).balance
: TokenInterface(token).balanceOf(address(this));
}
function approve(address token, address spender, uint256 amount) internal {
// solhint-disable-next-line no-empty-blocks
try TokenInterface(token).approve(spender, amount) {} catch {
TokenInterface(token).approve(spender, 0);
TokenInterface(token).approve(spender, amount);
}
}
function convertNativeToWnative(uint amount) internal {
TokenInterface(wnative()).deposit{value: amount}();
}
function convertWnativeToNative(uint amount) internal {
TokenInterface(wnative()).withdraw(amount);
}
}//SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
interface TokenInterface {
function approve(address, uint256) external;
function transfer(address, uint) external;
function transferFrom(address, address, uint) external;
function deposit() external payable;
function withdraw(uint) external;
function balanceOf(address) external view returns (uint);
function decimals() external view returns (uint);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {IWETH} from "../interfaces/IWETH.sol";
import {SafeERC20, IERC20} from "../utils/SafeERC20.sol";
abstract contract TokenUtilsBase {
using SafeERC20 for IERC20;
function wnative() public view virtual returns (address);
function native() public view virtual returns (address);
function approveToken(
address _tokenAddr,
address _to,
uint256 _amount
) internal {
if (_tokenAddr == native()) return;
if (IERC20(_tokenAddr).allowance(address(this), _to) < _amount) {
IERC20(_tokenAddr).safeApprove(_to, _amount);
}
}
function pullTokensIfNeeded(
address _token,
address _from,
uint256 _amount
) internal returns (uint256) {
// handle max uint amount
if (_amount == type(uint256).max) {
_amount = getBalance(_token, _from);
}
if (
_from != address(0) &&
_from != address(this) &&
_token != native() &&
_amount != 0
) {
IERC20(_token).safeTransferFrom(_from, address(this), _amount);
}
return _amount;
}
function withdrawTokens(
address _token,
address _to,
uint256 _amount
) internal returns (uint256) {
if (_amount == type(uint256).max) {
_amount = getBalance(_token, address(this));
}
if (_to != address(0) && _to != address(this) && _amount != 0) {
if (_token != native()) {
IERC20(_token).safeTransfer(_to, _amount);
} else {
(bool success, ) = _to.call{value: _amount}("");
require(success, "native send fail");
}
}
return _amount;
}
function depositWnative(uint256 _amount) internal {
IWETH(wnative()).deposit{value: _amount}();
}
function withdrawWnative(uint256 _amount) internal {
IWETH(wnative()).withdraw(_amount);
}
function getBalance(
address _tokenAddr,
address _acc
) internal view returns (uint256) {
if (_tokenAddr == native()) {
return _acc.balance;
} else {
return IERC20(_tokenAddr).balanceOf(_acc);
}
}
function getTokenDecimals(address _token) internal view returns (uint256) {
if (_token == native()) return 18;
return IERC20(_token).decimals();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
/**
* @title Interface for Adapter Data Provider contract for intent adapter.
* @author Router Protocol.
*/
interface IAdapterDataProvider {
/**
* @dev Function to get the address of owner.
*/
function owner() external view returns (address);
/**
* @dev Function to set the address of owner.
* @dev This function can only be called by the owner of this contract.
* @param __owner Address of the new owner
*/
function setOwner(address __owner) external;
/**
* @dev Function to check whether the contract is a valid preceding contract registered in
* the head registry.
* @dev This registry governs the initiation of the adapter, exclusively listing authorized
* preceding adapters.
* @notice Only the adapters documented in this registry can invoke the current adapter,
* thereby guaranteeing regulated and secure execution sequences.
* @param precedingContract Address of preceding contract.
* @return true if valid, false if invalid.
*/
function isAuthorizedPrecedingContract(
address precedingContract
) external view returns (bool);
/**
* @dev Function to check whether the contract is a valid succeeding contract registered in
* the tail registry.
* @dev This registry dictates the potential succeeding actions by listing adapters that
* may be invoked following the current one.
* @notice Only the adapters documented in this registry can be invoked by the current adapter,
* thereby guaranteeing regulated and secure execution sequences.
* @param succeedingContract Address of succeeding contract.
* @return true if valid, false if invalid.
*/
function isAuthorizedSucceedingContract(
address succeedingContract
) external view returns (bool);
/**
* @dev Function to check whether the asset is a valid inbound asset registered in the inbound
* asset registry.
* @dev This registry keeps track of all the acceptable incoming assets, ensuring that the
* adapter only processes predefined asset types.
* @param asset Address of the asset.
* @return true if valid, false if invalid.
*/
function isValidInboundAsset(address asset) external view returns (bool);
/**
* @dev Function to check whether the asset is a valid outbound asset registered in the outbound
* asset registry.
* @dev It manages the types of assets that the adapter is allowed to output, thus controlling
* the flow’s output and maintaining consistency.
* @param asset Address of the asset.
* @return true if valid, false if invalid.
*/
function isValidOutboundAsset(address asset) external view returns (bool);
/**
* @dev Function to set preceding contract (head registry) for the adapter.
* @dev This registry governs the initiation of the adapter, exclusively listing authorized
* preceding adapters.
* @notice Only the adapters documented in this registry can invoke the current adapter,
* thereby guaranteeing regulated and secure execution sequences.
* @param precedingContract Address of preceding contract.
* @param isValid Boolean value suggesting if this is a valid preceding contract.
*/
function setPrecedingContract(
address precedingContract,
bool isValid
) external;
/**
* @dev Function to set succeeding contract (tail registry) for the adapter.
* @dev This registry dictates the potential succeeding actions by listing adapters that
* may be invoked following the current one.
* @notice Only the adapters documented in this registry can be invoked by the current adapter,
* thereby guaranteeing regulated and secure execution sequences.
* @param succeedingContract Address of succeeding contract.
* @param isValid Boolean value suggesting if this is a valid succeeding contract.
*/
function setSucceedingContract(
address succeedingContract,
bool isValid
) external;
/**
* @dev Function to set inbound asset registry for the adapter.
* @dev This registry keeps track of all the acceptable incoming assets, ensuring that the
* adapter only processes predefined asset types.
* @param asset Address of the asset.
* @param isValid Boolean value suggesting if this is a valid inbound asset.
*/
function setInboundAsset(address asset, bool isValid) external;
/**
* @dev Function to set outbound asset registry for the adapter.
* @dev It manages the types of assets that the adapter is allowed to output, thus controlling
* the flow’s output and maintaining consistency.
* @param asset Address of the asset.
* @param isValid Boolean value suggesting if this is a valid inbound asset.
*/
function setOutboundAsset(address asset, bool isValid) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
interface IERC20 {
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 supply);
function balanceOf(address _owner) external view returns (uint256 balance);
function transfer(
address _to,
uint256 _value
) external returns (bool success);
function transferFrom(
address _from,
address _to,
uint256 _value
) external returns (bool success);
function approve(
address _spender,
uint256 _value
) external returns (bool success);
function allowance(
address _owner,
address _spender
) external view returns (uint256 remaining);
event Approval(
address indexed _owner,
address indexed _spender,
uint256 _value
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {IERC20} from "../utils/SafeERC20.sol";
abstract contract IWETH {
function allowance(address, address) public view virtual returns (uint256);
function balanceOf(address) public view virtual returns (uint256);
function approve(address, uint256) public virtual;
function transfer(address, uint256) public virtual returns (bool);
function transferFrom(
address,
address,
uint256
) public virtual returns (bool);
function deposit() public payable virtual;
function withdraw(uint256) public virtual;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {BaseAdapter} from "./BaseAdapter.sol";
import {EoaExecutorWithDataProvider, EoaExecutorWithoutDataProvider} from "./utils/EoaExecutor.sol";
abstract contract RouterIntentEoaAdapterWithDataProvider is
BaseAdapter,
EoaExecutorWithDataProvider
{
constructor(
address __native,
address __wnative,
address __owner
)
BaseAdapter(__native, __wnative, true, __owner)
// solhint-disable-next-line no-empty-blocks
{
}
}
abstract contract RouterIntentEoaAdapterWithoutDataProvider is
BaseAdapter,
EoaExecutorWithoutDataProvider
{
constructor(
address __native,
address __wnative
)
BaseAdapter(__native, __wnative, false, address(0))
// solhint-disable-next-line no-empty-blocks
{
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
library Address {
//insufficient balance
error InsufficientBalance(uint256 available, uint256 required);
//unable to send value, recipient may have reverted
error SendingValueFail();
//insufficient balance for call
error InsufficientBalanceForCall(uint256 available, uint256 required);
//call to non-contract
error NonContractCall();
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);
}
function sendValue(address payable recipient, uint256 amount) internal {
uint256 balance = address(this).balance;
if (balance < amount) {
revert InsufficientBalance(balance, amount);
}
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{value: amount}("");
if (!(success)) {
revert SendingValueFail();
}
}
function functionCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
"Address: low-level call with value failed"
);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
uint256 balance = address(this).balance;
if (balance < value) {
revert InsufficientBalanceForCall(balance, value);
}
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 weiValue,
string memory errorMessage
) private returns (bytes memory) {
if (!(isContract(target))) {
revert NonContractCall();
}
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{value: weiValue}(
data
);
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);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
abstract contract EoaExecutorWithDataProvider {
/**
* @dev function to execute an action on an adapter used in an EOA.
* @param precedingAdapter Address of the preceding adapter.
* @param succeedingAdapter Address of the succeeding adapter.
* @param data inputs data.
* @return tokens to be refunded to user at the end of tx.
*/
function execute(
address precedingAdapter,
address succeedingAdapter,
bytes calldata data
) external payable virtual returns (address[] memory tokens);
}
abstract contract EoaExecutorWithoutDataProvider {
/**
* @dev function to execute an action on an adapter used in an EOA.
* @param data inputs data.
* @return tokens to be refunded to user at the end of tx.
*/
function execute(
bytes calldata data
) external payable virtual returns (address[] memory tokens);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.18;
/**
* @title Errors library
* @author Router Intents Error
* @notice Defines the error messages emitted by the contracts on Router Intents
*/
library Errors {
string public constant ARRAY_LENGTH_MISMATCH = "1"; // 'Array lengths mismatch'
string public constant INSUFFICIENT_NATIVE_FUNDS_PASSED = "2"; // 'Insufficient native tokens passed'
string public constant WRONG_BATCH_PROVIDED = "3"; // 'The targetLength, valueLength, callTypeLength, funcLength do not match in executeBatch transaction functions in batch transaction contract'
string public constant INVALID_CALL_TYPE = "4"; // 'The callType value can only be 1 (call)' and 2(delegatecall)'
string public constant ONLY_NITRO = "5"; // 'Only nitro can call this function'
string public constant ONLY_SELF = "6"; // 'Only the current contract can call this function'
string public constant ADAPTER_NOT_WHITELISTED = "7"; // 'Adapter not whitelisted'
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
error ReentrantCall();
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
if (_status == _ENTERED) {
revert ReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {IERC20} from "../interfaces/IERC20.sol";
import {Address} from "./Address.sol";
import {SafeMath} from "./SafeMath.sol";
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 Edited so it always first approves 0 and then the value, because of non standard tokens
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.approve.selector, spender, 0)
);
_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
)
);
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
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: operation failed"
);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
library SafeMath {
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: mul 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) {
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;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.18;
/**
* @title Errors library
* @author Router Intents Error
* @notice Defines the error messages emitted by the contracts on Router Intents
*/
library Errors {
string public constant ARRAY_LENGTH_MISMATCH = "1"; // 'Array lengths mismatch'
string public constant INSUFFICIENT_NATIVE_FUNDS_PASSED = "2"; // 'Insufficient native tokens passed'
string public constant WRONG_BATCH_PROVIDED = "3"; // 'The targetLength, valueLength, callTypeLength, funcLength do not match in executeBatch transaction functions in batch transaction contract'
string public constant INVALID_CALL_TYPE = "4"; // 'The callType value can only be 1 (call)' and 2(delegatecall)'
string public constant ONLY_NITRO = "5"; // 'Only nitro can call this function'
string public constant ONLY_SELF = "6"; // 'Only the current contract can call this function'
string public constant ADAPTER_NOT_WHITELISTED = "7"; // 'Adapter not whitelisted'
string public constant INVALID_BRIDGE_ADDRESS = "8"; // 'Bridge address neither asset forwarder nor dexspan'
string public constant BRIDGE_CALL_FAILED = "9"; // 'Bridge call failed'
string public constant INVALID_BRDIGE_TX_TYPE = "10"; // 'Bridge tx type cannot be greater than 3'
string public constant INVALID_AMOUNT = "11"; // 'Amount is invalid'
string public constant INVALID_BRIDGE_CHAIN_ID = "12"; // 'Bridging chainId is invalid'
string public constant ZERO_AMOUNT_RECEIVED = "13"; // 'Zero amount received'
string public constant INVALID_TX_TYPE = "14"; // 'Invalid txType value'
string public constant INVALID_REQUEST = "15"; // 'Invalid Request'
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
/// @title Interface for handler contracts that support deposits and deposit executions.
/// @author Router Protocol.
interface IAssetForwarder {
event FundsDeposited(
uint256 partnerId,
uint256 amount,
bytes32 destChainIdBytes,
uint256 destAmount,
uint256 depositId,
address srcToken,
address depositor,
bytes recipient,
bytes destToken
);
event iUSDCDeposited(
uint256 partnerId,
uint256 amount,
bytes32 destChainIdBytes,
uint256 usdcNonce,
address srcToken,
bytes32 recipient,
address depositor
);
event FundsDepositedWithMessage(
uint256 partnerId,
uint256 amount,
bytes32 destChainIdBytes,
uint256 destAmount,
uint256 depositId,
address srcToken,
bytes recipient,
address depositor,
bytes destToken,
bytes message
);
event FundsPaid(bytes32 messageHash, address forwarder, uint256 nonce);
event DepositInfoUpdate(
address srcToken,
uint256 feeAmount,
uint256 depositId,
uint256 eventNonce,
bool initiatewithdrawal,
address depositor
);
event FundsPaidWithMessage(
bytes32 messageHash,
address forwarder,
uint256 nonce,
bool execFlag,
bytes execData
);
struct DestDetails {
uint32 domainId;
uint256 fee;
bool isSet;
}
struct RelayData {
uint256 amount;
bytes32 srcChainId;
uint256 depositId;
address destToken;
address recipient;
}
struct RelayDataMessage {
uint256 amount;
bytes32 srcChainId;
uint256 depositId;
address destToken;
address recipient;
bytes message;
}
struct DepositData {
uint256 partnerId;
uint256 amount;
uint256 destAmount;
address srcToken;
address refundRecipient;
bytes32 destChainIdBytes;
}
function iDepositUSDC(
uint256 partnerId,
bytes32 destChainIdBytes,
bytes32 recipient,
uint256 amount
) external payable;
function iDeposit(
DepositData memory depositData,
bytes memory destToken,
bytes memory recipient
) external payable;
function iDepositInfoUpdate(
address srcToken,
uint256 feeAmount,
uint256 depositId,
bool initiatewithdrawal
) external payable;
function iDepositMessage(
DepositData memory depositData,
bytes memory destToken,
bytes memory recipient,
bytes memory message
) external payable;
function iRelay(RelayData memory relayData) external payable;
function iRelayMessage(RelayDataMessage memory relayData) external payable;
function usdc() external view returns (address);
function destDetails(
bytes32 destChainIdBytes
) external view returns (DestDetails memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {IERC20} from "../utils/SafeERC20.sol";
interface IDexSpan {
struct SameChainSwapParams {
IERC20[] tokens;
uint256 amount;
uint256 minReturn;
uint256[] flags;
bytes[] dataTx;
address recipient;
}
struct SwapParams {
IERC20[] tokens;
uint256 amount;
uint256 minReturn;
uint256[] flags;
bytes[] dataTx;
bool isWrapper;
address recipient;
bytes destToken;
}
function swapInSameChain(
IERC20[] memory tokens,
uint256 amount,
uint256 minReturn,
uint256[] memory flags,
bytes[] memory dataTx,
bool isWrapper,
address recipient,
uint256 widgetID
) external payable returns (uint256 returnAmount);
function swapAndDeposit(
uint256 partnerId,
bytes32 destChainIdBytes,
bytes calldata recipient,
uint8 depositType,
uint256 feeAmount,
bytes memory message,
SwapParams memory swapData,
address refundRecipient
) external payable;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
interface IERC20 {
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 supply);
function balanceOf(address _owner) external view returns (uint256 balance);
function transfer(
address _to,
uint256 _value
) external returns (bool success);
function transferFrom(
address _from,
address _to,
uint256 _value
) external returns (bool success);
function approve(
address _spender,
uint256 _value
) external returns (bool success);
function allowance(
address _owner,
address _spender
) external view returns (uint256 remaining);
event Approval(
address indexed _owner,
address indexed _spender,
uint256 _value
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
library Address {
//insufficient balance
error InsufficientBalance(uint256 available, uint256 required);
//unable to send value, recipient may have reverted
error SendingValueFail();
//insufficient balance for call
error InsufficientBalanceForCall(uint256 available, uint256 required);
//call to non-contract
error NonContractCall();
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);
}
function sendValue(address payable recipient, uint256 amount) internal {
uint256 balance = address(this).balance;
if (balance < amount) {
revert InsufficientBalance(balance, amount);
}
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{value: amount}("");
if (!(success)) {
revert SendingValueFail();
}
}
function functionCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
"Address: low-level call with value failed"
);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
uint256 balance = address(this).balance;
if (balance < value) {
revert InsufficientBalanceForCall(balance, value);
}
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 weiValue,
string memory errorMessage
) private returns (bytes memory) {
if (!(isContract(target))) {
revert NonContractCall();
}
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{value: weiValue}(
data
);
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);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {IERC20} from "../interfaces/IERC20.sol";
import {Address} from "./Address.sol";
import {SafeMath} from "./SafeMath.sol";
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 Edited so it always first approves 0 and then the value, because of non standard tokens
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.approve.selector, spender, 0)
);
_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
)
);
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
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: operation failed"
);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
library SafeMath {
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: mul 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) {
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;
}
}{
"optimizer": {
"enabled": true,
"runs": 1000000
},
"viaIR": true,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"__native","type":"address"},{"internalType":"address","name":"__wnative","type":"address"},{"internalType":"address","name":"__assetForwarder","type":"address"},{"internalType":"address","name":"__dexspan","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NonContractCall","type":"error"},{"inputs":[],"name":"NonContractCall","type":"error"},{"inputs":[],"name":"ReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"adapterName","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ExecutionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OperationFailedRefundEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnsupportedOperation","type":"event"},{"inputs":[],"name":"PARTNER_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adapterDataProvider","outputs":[{"internalType":"contract AdapterDataProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"precedingContract","type":"address"}],"name":"isAuthorizedPrecedingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"succeedingContract","type":"address"}],"name":"isAuthorizedSucceedingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"isValidInboundAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"isValidOutboundAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"native","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nitroDataStore","outputs":[{"internalType":"contract NitroDataStore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"self","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wnative","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
61014060409080825234620002525760808162003482803803809162000026828562000257565b83398101031262000252576200003c8162000291565b916020926200004d84840162000291565b926200006960606200006185840162000291565b920162000291565b93600092600184553060805260a05260c0528160e0528251906105ec908183019183831060018060401b038411176200023e57918391869362002e9684396001600160a01b0390811680835297168882015203019082f092831562000232579084600492610120958652845193848092631f209df760e11b82525afa94851562000226578195620001e0575b5050506101009283525190612bef9283620002a7843960805183818161037f01528181610593015281816108aa01528181610c0a01528181610f430152611438015260a05183818161034a015281816108d701528181610aba01528181610f70015281816110a70152818161127c015281816126260152612715015260c051836112eb015260e0518381816113c90152818161150f015281816116460152818161171401526117e2015251828181610c3d01528181610c6801528181610d7c015261135a0152518181816102fa0152818161085b01528181610bd601528181610e0901526118730152f35b909180939550813d83116200021e575b620001fc818362000257565b810103126200021b5750620002119062000291565b91388080620000f5565b80fd5b503d620001f0565b508251903d90823e3d90fd5b509051903d90823e3d90fd5b634e487b7160e01b85526041600452602485fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200027b57604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620002525756fe6080604052600436101561001257600080fd5b60003560e01c806306fdde03146100e757806309c5eabe146100e257806311b0b42d146100dd5780632cebdeb2146100d85780633e413bee146100d35780636af563e9146100ce5780637104ddb2146100c95780637e954a71146100c457806388767079146100bf57806397555947146100ba578063abe66719146100b5578063e34305b1146100b05763e702aa5c146100ab57600080fd5b611828565b61175a565b61168c565b6115be565b611584565b611487565b6113ed565b61137e565b61130f565b6112a0565b611231565b610219565b610176565b60009103126100f757565b600080fd5b60005b83811061010f5750506000910152565b81810151838201526020016100ff565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361015b815180928187528780880191016100fc565b0116010190565b90602061017392818152019061011f565b90565b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f7576101c46101b06119fe565b60405191829160208352602083019061011f565b0390f35b6020908160408183019282815285518094520193019160005b8281106101ef575050505090565b835173ffffffffffffffffffffffffffffffffffffffff16855293810193928101926001016101e1565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757600490813567ffffffffffffffff8082116100f757366023830112156100f757818401359081116100f757602481818401930101923684116100f75760ff61028c8585611a45565b1693600385116111f45761029e611aaa565b94806107fc57506102af90846122ec565b94929193509760409485517f7fe6891700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9185828581867f0000000000000000000000000000000000000000000000000000000000000000165afa9182156104af576000926107cd575b5060608501805173ffffffffffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000009190851682861681036105875750506103e390847f000000000000000000000000000000000000000000000000000000000000000016301460001461054c576103bf8888015134146103b9611f38565b906124e4565b6103c88d611e9f565b9073ffffffffffffffffffffffffffffffffffffffff169052565b80516104b45750169282015190833b156100f75761042f600096519a8b96879586947ff452ed4d0000000000000000000000000000000000000000000000000000000086528501612468565b03925af19081156104af576101c4947f747c4bdbdc67811d44a02055ff9315a921247b8ba675158870da5dd871caf32992610496575b505b6104776104726119fe565b61252a565b926104876040519283928361254a565b0390a2604051918291826101c8565b806104a36104a9926118c6565b806100ec565b38610465565b611977565b969291169383015191843b156100f7576000966104fd91519b8c97889687957f0421caf000000000000000000000000000000000000000000000000000000000875286016123da565b03925af19081156104af576101c4947f747c4bdbdc67811d44a02055ff9315a921247b8ba675158870da5dd871caf32992610539575b50610467565b806104a3610546926118c6565b38610533565b8787017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81511461057e575b506103bf565b47905238610578565b9092939480969a9892507f00000000000000000000000000000000000000000000000000000000000000001630146000146106f457508161063f610659926106136106056105ec610662975173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b828b015190309033906129bf565b866106356105ec855173ffffffffffffffffffffffffffffffffffffffff1690565b918a015191612a3b565b5173ffffffffffffffffffffffffffffffffffffffff1690565b6103c88c611e9f565b80516106ac57501691823b156100f7576000946104fd8692519a8b96879586947ff452ed4d0000000000000000000000000000000000000000000000000000000086528501612468565b939591169290833b156100f7576104fd600096928793519b8c97889687957f0421caf000000000000000000000000000000000000000000000000000000000875286016123da565b89828801917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835114610735575b5050506106629161063f61065992610613565b89517f70a08231000000000000000000000000000000000000000000000000000000008152309281019283529394929391859183918290819060200103915afa9384156104af57610662946106599461063f9360009261079e575b5052928294508b9150610722565b6107bf919250833d85116107c6575b6107b78183611917565b810190611edb565b9038610790565b503d6107ad565b6107ee919250863d88116107f5575b6107e68183611917565b810190611ac4565b903861032b565b503d6107dc565b91959160018103610b80575061081290846121cd565b9092915060409687517f6cec044b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9082818681857f0000000000000000000000000000000000000000000000000000000000000000165afa9081156104af57600091610b63575b5060a08601936108a36105ec61063f875151611e9f565b85518501517f00000000000000000000000000000000000000000000000000000000000000003086821603610a80578286167f000000000000000000000000000000000000000000000000000000000000000087168103610a69575050803403610a29579061092c915b6109188186846125c0565b50868851015261065960a088510160019052565b80516109ab5750169184519185015193898601519961096960606080890151945198015173ffffffffffffffffffffffffffffffffffffffff1690565b853b156100f75760009788946104fd93519d8e998a9889977f06135b7c0000000000000000000000000000000000000000000000000000000089528801612285565b959994939116928951928a015194808b01519a6109e660606080830151955192015173ffffffffffffffffffffffffffffffffffffffff1690565b90863b156100f75760009889956104fd94519e8f9a8b998a987f06135b7c000000000000000000000000000000000000000000000000000000008a52890161221b565b8c88610a65610a36611f38565b92519283927f08c379a00000000000000000000000000000000000000000000000000000000084528301610162565b0390fd5b8261092c949392610a7b9233906129bf565b61090d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ab3575b9061092c9161090d565b50808416907f000000000000000000000000000000000000000000000000000000000000000085168203610af05761092c9150475b909150610aa9565b8c517f70a0823100000000000000000000000000000000000000000000000000000000815230898201908152909287918491908290819060200103915afa80156104af5761092c92600091610b46575b50610ae8565b610b5d9150873d89116107c6576107b78183611917565b38610b40565b610b7a9150833d85116107f5576107e68183611917565b3861088c565b600203610df157610b919084612146565b90506040517f7fe6891700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9087818581857f0000000000000000000000000000000000000000000000000000000000000000165afa9081156104af57600091610dd4575b507f00000000000000000000000000000000000000000000000000000000000000003083821603610d0b5783890151610c6391337f000000000000000000000000000000000000000000000000000000000000000086166129bf565b610ca27f000000000000000000000000000000000000000000000000000000000000000098840198610c998a5184868416612a3b565b6103c889611e9f565b168151606060408401519301519751823b156100f7576000946104fd86926040519b8c97889687957f3e28c7d200000000000000000000000000000000000000000000000000000000875286019094939260609260808301968352602083015260408201520152565b508783017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815114610d3e575b50610c63565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152308682019081529091908a90839081906020010381877f0000000000000000000000000000000000000000000000000000000000000000165afa9182156104af57600092610db5575b505238610d38565b610dcd9192508a3d8c116107c6576107b78183611917565b9038610dad565b610deb9150883d8a116107f5576107e68183611917565b38610c07565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016916040928351917f7fe6891700000000000000000000000000000000000000000000000000000000835289838781855afa9283156104af5786928b916000956111d5575b508651978880927f6cec044b0000000000000000000000000000000000000000000000000000000082525afa9586156104af576000966111b2575b50610eb39088611dd6565b999050836060610efa838d0195865189519889809481937f981a8a020000000000000000000000000000000000000000000000000000000083528a83019190602083019252565b0392165afa9485156104af57600095611182575b50610f22610f1e87870151151590565b1590565b6111755760a08b0196610f3c6105ec61063f8a5151611e9f565b88518401517f0000000000000000000000000000000000000000000000000000000000000000308582160361106d578285167f000000000000000000000000000000000000000000000000000000000000000086168103611056575050610fa68589015182611f2b565b34036110495790610fd1915b610fbd8185846125c0565b50858b5101526103bf60a08b510160019052565b16930151908951925194808b01519a61100860606080830151995192015173ffffffffffffffffffffffffffffffffffffffff1690565b90863b156100f7576000986104fd93519d8e998a9889977f06135b7c00000000000000000000000000000000000000000000000000000000895288016120d8565b8886610a65610a36611f38565b82610fd19493926110689233906129bf565b610fb2565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110a0575b90610fd191610fb2565b50808316907f0000000000000000000000000000000000000000000000000000000000000000841682036110e957610fd191506110e147868a015190611f19565b909150611096565b84895180937f70a08231000000000000000000000000000000000000000000000000000000008252818061113c308c830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03915afa80156104af57610fd192600091611158575b506110e1565b61116f9150863d88116107c6576107b78183611917565b38611152565b8583610a65610a36611e66565b6111a491955060603d81116111ab575b61119c8183611917565b810190611e0b565b9338610f0e565b503d611192565b610eb39196506111ce908b3d8d116107f5576107e68183611917565b9590610ea8565b6111ed919550823d84116107f5576107e68183611917565b9338610e6d565b856111fd611a59565b90610a656040519283927f08c379a00000000000000000000000000000000000000000000000000000000084528301610162565b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff8116036100f757565b35906114858261145c565b565b346100f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602460206004356114c68161145c565b604051928380927f7e954a7100000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff80911660048301527f0000000000000000000000000000000000000000000000000000000000000000165afa80156104af576101c491600091611556575b5060405190151581529081906020820190565b611577915060203d811161157d575b61156f8183611917565b810190611962565b38611543565b503d611565565b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405160018152f35b346100f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602460206004356115fd8161145c565b604051928380927f9755594700000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff80911660048301527f0000000000000000000000000000000000000000000000000000000000000000165afa80156104af576101c491600091611556575060405190151581529081906020820190565b346100f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602460206004356116cb8161145c565b604051928380927fabe6671900000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff80911660048301527f0000000000000000000000000000000000000000000000000000000000000000165afa80156104af576101c491600091611556575060405190151581529081906020820190565b346100f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602460206004356117998161145c565b604051928380927fe34305b100000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff80911660048301527f0000000000000000000000000000000000000000000000000000000000000000165afa80156104af576101c491600091611556575060405190151581529081906020820190565b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116118da57604052565b611897565b60c0810190811067ffffffffffffffff8211176118da57604052565b6040810190811067ffffffffffffffff8211176118da57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176118da57604052565b801515036100f757565b908160209103126100f7575161017381611958565b6040513d6000823e3d90fd5b60405190610100820182811067ffffffffffffffff8211176118da57604052565b6040519060e0820182811067ffffffffffffffff8211176118da57604052565b67ffffffffffffffff81116118da57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60405190611a0b826118fb565b600c82527f4e6974726f4164617074657200000000000000000000000000000000000000006020830152565b359060ff821682036100f757565b908160209103126100f75761017390611a37565b60405190611a66826118fb565b600282527f31300000000000000000000000000000000000000000000000000000000000006020830152565b67ffffffffffffffff81116118da5760051b60200190565b60405190611ab7826118fb565b6001825260203681840137565b908160209103126100f757516101738161145c565b81601f820112156100f757803590611af0826119c4565b92611afe6040519485611917565b828452602083830101116100f757816000926020809301838601378301015290565b81601f820112156100f757803591611b3783611a92565b92611b456040519485611917565b808452602092838086019260051b8201019283116100f7578301905b828210611b6f575050505090565b8380918335611b7d8161145c565b815201910190611b61565b81601f820112156100f757803591611b9f83611a92565b92611bad6040519485611917565b808452602092838086019260051b8201019283116100f7578301905b828210611bd7575050505090565b81358152908301908301611bc9565b9080601f830112156100f757813590611bfe82611a92565b92611c0c6040519485611917565b828452602092838086019160051b830101928084116100f757848301915b848310611c3a5750505050505090565b823567ffffffffffffffff81116100f7578691611c5c84848094890101611ad9565b815201920191611c2a565b359061148582611958565b919091610100818403126100f757611c88611983565b9267ffffffffffffffff82358181116100f75782611ca7918501611b20565b8552602083013560208601526040830135604086015260608301358181116100f75782611cd5918501611b88565b606086015260808301358181116100f75782611cf2918501611be6565b6080860152611d0360a08401611c67565b60a0860152611d1460c0840161147a565b60c086015260e08301359081116100f757611d2f9201611ad9565b60e0830152565b91909160e0818403126100f757611d4b6119a4565b928135845260208201356020850152604082013567ffffffffffffffff908181116100f75782611d7c918501611ad9565b6040860152611d8d6060840161147a565b60608601526080830135608086015260a08301358181116100f75782611db4918501611c72565b60a086015260c08301359081116100f757611dcf9201611ad9565b60c0830152565b9190916040818403126100f757611dec81611a37565b92602082013567ffffffffffffffff81116100f7576101739201611d36565b908160609103126100f757604051906060820182811067ffffffffffffffff8211176118da5760405280519063ffffffff821682036100f7576040918352602081015160208401520151611e5e81611958565b604082015290565b60405190611e73826118fb565b600282527f31350000000000000000000000000000000000000000000000000000000000006020830152565b805115611eac5760200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b908160209103126100f7575190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211611f2657565b611eea565b91908201809211611f2657565b60405190611f45826118fb565b600182527f32000000000000000000000000000000000000000000000000000000000000006020830152565b90815180825260208080930193019160005b828110611f91575050505090565b835173ffffffffffffffffffffffffffffffffffffffff1685529381019392810192600101611f83565b90815180825260208080930193019160005b828110611fdb575050505090565b835185529381019392810192600101611fcd565b90815180825260208092019182818360051b85019501936000915b84831061201a5750505050505090565b909192939495848061203483856001950387528a5161011f565b980193019301919493929061200a565b6101739160e061209b6120896120638551610100808752860190611f71565b602086015160208601526040860151604086015260608601518582036060870152611fbb565b60808501518482036080860152611fef565b60a0808501511515908401529260c08181015173ffffffffffffffffffffffffffffffffffffffff169084015201519060e081840391015261011f565b949060e09461211773ffffffffffffffffffffffffffffffffffffffff9561213f956020949b9a9b8a52848a01526101008060408b015289019061011f565b90600260608901526080880152818782038060a08a0152600083520160c08801520190612044565b9416910152565b809291039160a083126100f75760807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061217f83611a37565b9401126100f75760405190608082019082821067ffffffffffffffff8311176118da576080916040526020810135835260408101356020840152606081013560408401520135606082015290565b916060838303126100f7576121e183611a37565b9267ffffffffffffffff9260208201358481116100f75781612204918401611d36565b9360408301359081116100f7576101739201611ad9565b95919360e09561225d61213f9573ffffffffffffffffffffffffffffffffffffffff97612277959c9b9c8b5260208b01526101008060408c01528a019061011f565b91600160608a0152608089015287820360a089015261011f565b9085820360c0870152612044565b949060e0946122c473ffffffffffffffffffffffffffffffffffffffff9561213f956020949b9a9b8a52848a01526101008060408b015289019061011f565b90600060608901526080880152818782038060a08a0152600083520160c08801520190612044565b91908281039261014084126100f75760c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061232783611a37565b9501126100f75760405161233a816118df565b60208201358152604082013560208201526060820135604082015260808201356123638161145c565b606082015260a08201356123768161145c565b608082015260c082013560a08201529267ffffffffffffffff9160e08101358381116100f757846123a8918301611ad9565b936101008201358481116100f757816123c2918401611ad9565b936101208301359081116100f7576101739201611ad9565b9261244b610173959361243a866124599560a0809180518452602081015160208501526040810151604085015273ffffffffffffffffffffffffffffffffffffffff80606083015116606086015260808201511660808501520151910152565b6101208060c088015286019061011f565b9084820360e086015261011f565b9161010081840391015261011f565b916124d6906124c584610173969460a0809180518452602081015160208501526040810151604085015273ffffffffffffffffffffffffffffffffffffffff80606083015116606086015260808201511660808501520151910152565b6101008060c086015284019061011f565b9160e081840391015261011f565b156124ec5750565b610a65906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260206004840152602483019061011f565b612542906020604051928284809451938492016100fc565b810103902090565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b3d156125bb573d906125a1826119c4565b916125af6040519384611917565b82523d6000602084013e565b606090565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146126e8575b829073ffffffffffffffffffffffffffffffffffffffff9283821680151590816126dd575b50806126d4575b612621575b5050505090565b8316927f000000000000000000000000000000000000000000000000000000000000000016831461265e57612655926127a5565b3881818061261a565b6000809350809281925af1612671612590565b506126555760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6e61746976652073656e64206661696c000000000000000000000000000000006044820152fd5b50821515612615565b90503014153861260e565b91506126f430826126fa565b916125e9565b73ffffffffffffffffffffffffffffffffffffffff908116907f0000000000000000000000000000000000000000000000000000000000000000811682036127425750503190565b60246020929360405194859384927f70a082310000000000000000000000000000000000000000000000000000000084521660048301525afa9081156104af5760009161278d575090565b610173915060203d81116107c6576107b78183611917565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff92909216602483015260448083019390935291815261282c9190612808606482611917565b73ffffffffffffffffffffffffffffffffffffffff612825612851565b92166128ef565b805180612837575050565b8160208061284c936114859501019101611962565b61288a565b6040519061285e826118fb565b602082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020830152565b1561289157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5361666545524332303a206f7065726174696f6e206661696c656400000000006044820152fd5b803f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081141590816129b5575b501561298b5781600092918360208194519301915af19061293b612590565b9115612945575090565b8151156129555750805190602001fd5b610a65906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301610162565b60046040517f304619b5000000000000000000000000000000000000000000000000000000008152fd5b905015153861291c565b9290604051927f23b872dd00000000000000000000000000000000000000000000000000000000602085015273ffffffffffffffffffffffffffffffffffffffff809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176118da5761148592604052612b98565b919091604051917fdd62ed3e00000000000000000000000000000000000000000000000000000000835230600484015260208360448173ffffffffffffffffffffffffffffffffffffffff808916602483015286165afa9283156104af57600093612b78575b50820191828111611f26578210612b1a576040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9390931660248401526044808401929092529082526114859190612b15606483611917565b612b98565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152fd5b612b9191935060203d81116107c6576107b78183611917565b9138612aa1565b61282c9173ffffffffffffffffffffffffffffffffffffffff61282561285156fea26469706673582212202fb73f7fc22c1f9cae5dd5586cbe41a88e292b360981f0b8d0605b7a5c1032b164736f6c634300081200336080346100c357601f6105ec38819003918201601f19168301916001600160401b038311848410176100c85780849260409485528339810103126100c357610052602061004b836100de565b92016100de565b60008054336001600160a01b0319808316821784556040519590946001600160a01b03949093859391908416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a316836001541617600155169060025416176002556104f990816100f38239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100c35756fe6080604052600436101561001257600080fd5b6000803560e01c806318137a41146103bf5780636cec044b1461036d578063715018a6146102d15780637fe689171461027f5780638da5cb5b1461022e578063cb6cc107146101a55763f2fde38b1461006a57600080fd5b346101a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a25760043573ffffffffffffffffffffffffffffffffffffffff80821680920361019e576100c3610444565b811561011a578254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b8280fd5b80fd5b50346101a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a25760043573ffffffffffffffffffffffffffffffffffffffff811680910361022a576101fe610444565b7fffffffffffffffffffffffff0000000000000000000000000000000000000000600254161760025580f35b5080fd5b50346101a257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a25773ffffffffffffffffffffffffffffffffffffffff6020915416604051908152f35b50346101a257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a257602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346101a257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a257610308610444565b8073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50346101a257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b50346101a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a25760043573ffffffffffffffffffffffffffffffffffffffff811680910361022a57610418610444565b7fffffffffffffffffffffffff0000000000000000000000000000000000000000600154161760015580f35b73ffffffffffffffffffffffffffffffffffffffff60005416330361046557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fdfea2646970667358221220cdb7845429b2deb5fec504df36cc9710b5bed87c7520f734068d772debc3980864736f6c63430008120033000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000001396f41d89b96eaf29a7ef9ee01ad36e452235ae000000000000000000000000bd7d11d1b1136f4edbe9023864c2425715387095
Deployed Bytecode
0x6080604052600436101561001257600080fd5b60003560e01c806306fdde03146100e757806309c5eabe146100e257806311b0b42d146100dd5780632cebdeb2146100d85780633e413bee146100d35780636af563e9146100ce5780637104ddb2146100c95780637e954a71146100c457806388767079146100bf57806397555947146100ba578063abe66719146100b5578063e34305b1146100b05763e702aa5c146100ab57600080fd5b611828565b61175a565b61168c565b6115be565b611584565b611487565b6113ed565b61137e565b61130f565b6112a0565b611231565b610219565b610176565b60009103126100f757565b600080fd5b60005b83811061010f5750506000910152565b81810151838201526020016100ff565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361015b815180928187528780880191016100fc565b0116010190565b90602061017392818152019061011f565b90565b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f7576101c46101b06119fe565b60405191829160208352602083019061011f565b0390f35b6020908160408183019282815285518094520193019160005b8281106101ef575050505090565b835173ffffffffffffffffffffffffffffffffffffffff16855293810193928101926001016101e1565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757600490813567ffffffffffffffff8082116100f757366023830112156100f757818401359081116100f757602481818401930101923684116100f75760ff61028c8585611a45565b1693600385116111f45761029e611aaa565b94806107fc57506102af90846122ec565b94929193509760409485517f7fe6891700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9185828581867f000000000000000000000000b1a1cfe35320fa23eb90ec23363aa38be34239d2165afa9182156104af576000926107cd575b5060608501805173ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9190851682861681036105875750506103e390847f00000000000000000000000052a93231522928a6ef93cbc84768e1c9c94a83e916301460001461054c576103bf8888015134146103b9611f38565b906124e4565b6103c88d611e9f565b9073ffffffffffffffffffffffffffffffffffffffff169052565b80516104b45750169282015190833b156100f75761042f600096519a8b96879586947ff452ed4d0000000000000000000000000000000000000000000000000000000086528501612468565b03925af19081156104af576101c4947f747c4bdbdc67811d44a02055ff9315a921247b8ba675158870da5dd871caf32992610496575b505b6104776104726119fe565b61252a565b926104876040519283928361254a565b0390a2604051918291826101c8565b806104a36104a9926118c6565b806100ec565b38610465565b611977565b969291169383015191843b156100f7576000966104fd91519b8c97889687957f0421caf000000000000000000000000000000000000000000000000000000000875286016123da565b03925af19081156104af576101c4947f747c4bdbdc67811d44a02055ff9315a921247b8ba675158870da5dd871caf32992610539575b50610467565b806104a3610546926118c6565b38610533565b8787017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81511461057e575b506103bf565b47905238610578565b9092939480969a9892507f00000000000000000000000052a93231522928a6ef93cbc84768e1c9c94a83e91630146000146106f457508161063f610659926106136106056105ec610662975173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b828b015190309033906129bf565b866106356105ec855173ffffffffffffffffffffffffffffffffffffffff1690565b918a015191612a3b565b5173ffffffffffffffffffffffffffffffffffffffff1690565b6103c88c611e9f565b80516106ac57501691823b156100f7576000946104fd8692519a8b96879586947ff452ed4d0000000000000000000000000000000000000000000000000000000086528501612468565b939591169290833b156100f7576104fd600096928793519b8c97889687957f0421caf000000000000000000000000000000000000000000000000000000000875286016123da565b89828801917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835114610735575b5050506106629161063f61065992610613565b89517f70a08231000000000000000000000000000000000000000000000000000000008152309281019283529394929391859183918290819060200103915afa9384156104af57610662946106599461063f9360009261079e575b5052928294508b9150610722565b6107bf919250833d85116107c6575b6107b78183611917565b810190611edb565b9038610790565b503d6107ad565b6107ee919250863d88116107f5575b6107e68183611917565b810190611ac4565b903861032b565b503d6107dc565b91959160018103610b80575061081290846121cd565b9092915060409687517f6cec044b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9082818681857f000000000000000000000000b1a1cfe35320fa23eb90ec23363aa38be34239d2165afa9081156104af57600091610b63575b5060a08601936108a36105ec61063f875151611e9f565b85518501517f00000000000000000000000052a93231522928a6ef93cbc84768e1c9c94a83e93086821603610a80578286167f000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee87168103610a69575050803403610a29579061092c915b6109188186846125c0565b50868851015261065960a088510160019052565b80516109ab5750169184519185015193898601519961096960606080890151945198015173ffffffffffffffffffffffffffffffffffffffff1690565b853b156100f75760009788946104fd93519d8e998a9889977f06135b7c0000000000000000000000000000000000000000000000000000000089528801612285565b959994939116928951928a015194808b01519a6109e660606080830151955192015173ffffffffffffffffffffffffffffffffffffffff1690565b90863b156100f75760009889956104fd94519e8f9a8b998a987f06135b7c000000000000000000000000000000000000000000000000000000008a52890161221b565b8c88610a65610a36611f38565b92519283927f08c379a00000000000000000000000000000000000000000000000000000000084528301610162565b0390fd5b8261092c949392610a7b9233906129bf565b61090d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ab3575b9061092c9161090d565b50808416907f000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee85168203610af05761092c9150475b909150610aa9565b8c517f70a0823100000000000000000000000000000000000000000000000000000000815230898201908152909287918491908290819060200103915afa80156104af5761092c92600091610b46575b50610ae8565b610b5d9150873d89116107c6576107b78183611917565b38610b40565b610b7a9150833d85116107f5576107e68183611917565b3861088c565b600203610df157610b919084612146565b90506040517f7fe6891700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9087818581857f000000000000000000000000b1a1cfe35320fa23eb90ec23363aa38be34239d2165afa9081156104af57600091610dd4575b507f00000000000000000000000052a93231522928a6ef93cbc84768e1c9c94a83e93083821603610d0b5783890151610c6391337f0000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c335986166129bf565b610ca27f0000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c335998840198610c998a5184868416612a3b565b6103c889611e9f565b168151606060408401519301519751823b156100f7576000946104fd86926040519b8c97889687957f3e28c7d200000000000000000000000000000000000000000000000000000000875286019094939260609260808301968352602083015260408201520152565b508783017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815114610d3e575b50610c63565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152308682019081529091908a90839081906020010381877f0000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c3359165afa9182156104af57600092610db5575b505238610d38565b610dcd9192508a3d8c116107c6576107b78183611917565b9038610dad565b610deb9150883d8a116107f5576107e68183611917565b38610c07565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000b1a1cfe35320fa23eb90ec23363aa38be34239d216916040928351917f7fe6891700000000000000000000000000000000000000000000000000000000835289838781855afa9283156104af5786928b916000956111d5575b508651978880927f6cec044b0000000000000000000000000000000000000000000000000000000082525afa9586156104af576000966111b2575b50610eb39088611dd6565b999050836060610efa838d0195865189519889809481937f981a8a020000000000000000000000000000000000000000000000000000000083528a83019190602083019252565b0392165afa9485156104af57600095611182575b50610f22610f1e87870151151590565b1590565b6111755760a08b0196610f3c6105ec61063f8a5151611e9f565b88518401517f00000000000000000000000052a93231522928a6ef93cbc84768e1c9c94a83e9308582160361106d578285167f000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee86168103611056575050610fa68589015182611f2b565b34036110495790610fd1915b610fbd8185846125c0565b50858b5101526103bf60a08b510160019052565b16930151908951925194808b01519a61100860606080830151995192015173ffffffffffffffffffffffffffffffffffffffff1690565b90863b156100f7576000986104fd93519d8e998a9889977f06135b7c00000000000000000000000000000000000000000000000000000000895288016120d8565b8886610a65610a36611f38565b82610fd19493926110689233906129bf565b610fb2565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110a0575b90610fd191610fb2565b50808316907f000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee841682036110e957610fd191506110e147868a015190611f19565b909150611096565b84895180937f70a08231000000000000000000000000000000000000000000000000000000008252818061113c308c830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03915afa80156104af57610fd192600091611158575b506110e1565b61116f9150863d88116107c6576107b78183611917565b38611152565b8583610a65610a36611e66565b6111a491955060603d81116111ab575b61119c8183611917565b810190611e0b565b9338610f0e565b503d611192565b610eb39196506111ce908b3d8d116107f5576107e68183611917565b9590610ea8565b6111ed919550823d84116107f5576107e68183611917565b9338610e6d565b856111fd611a59565b90610a656040519283927f08c379a00000000000000000000000000000000000000000000000000000000084528301610162565b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee168152f35b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270168152f35b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c3359168152f35b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000052a93231522928a6ef93cbc84768e1c9c94a83e9168152f35b73ffffffffffffffffffffffffffffffffffffffff8116036100f757565b35906114858261145c565b565b346100f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602460206004356114c68161145c565b604051928380927f7e954a7100000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff80911660048301527f0000000000000000000000000000000000000000000000000000000000000000165afa80156104af576101c491600091611556575b5060405190151581529081906020820190565b611577915060203d811161157d575b61156f8183611917565b810190611962565b38611543565b503d611565565b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405160018152f35b346100f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602460206004356115fd8161145c565b604051928380927f9755594700000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff80911660048301527f0000000000000000000000000000000000000000000000000000000000000000165afa80156104af576101c491600091611556575060405190151581529081906020820190565b346100f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602460206004356116cb8161145c565b604051928380927fabe6671900000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff80911660048301527f0000000000000000000000000000000000000000000000000000000000000000165afa80156104af576101c491600091611556575060405190151581529081906020820190565b346100f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602460206004356117998161145c565b604051928380927fe34305b100000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff80911660048301527f0000000000000000000000000000000000000000000000000000000000000000165afa80156104af576101c491600091611556575060405190151581529081906020820190565b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b1a1cfe35320fa23eb90ec23363aa38be34239d2168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116118da57604052565b611897565b60c0810190811067ffffffffffffffff8211176118da57604052565b6040810190811067ffffffffffffffff8211176118da57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176118da57604052565b801515036100f757565b908160209103126100f7575161017381611958565b6040513d6000823e3d90fd5b60405190610100820182811067ffffffffffffffff8211176118da57604052565b6040519060e0820182811067ffffffffffffffff8211176118da57604052565b67ffffffffffffffff81116118da57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60405190611a0b826118fb565b600c82527f4e6974726f4164617074657200000000000000000000000000000000000000006020830152565b359060ff821682036100f757565b908160209103126100f75761017390611a37565b60405190611a66826118fb565b600282527f31300000000000000000000000000000000000000000000000000000000000006020830152565b67ffffffffffffffff81116118da5760051b60200190565b60405190611ab7826118fb565b6001825260203681840137565b908160209103126100f757516101738161145c565b81601f820112156100f757803590611af0826119c4565b92611afe6040519485611917565b828452602083830101116100f757816000926020809301838601378301015290565b81601f820112156100f757803591611b3783611a92565b92611b456040519485611917565b808452602092838086019260051b8201019283116100f7578301905b828210611b6f575050505090565b8380918335611b7d8161145c565b815201910190611b61565b81601f820112156100f757803591611b9f83611a92565b92611bad6040519485611917565b808452602092838086019260051b8201019283116100f7578301905b828210611bd7575050505090565b81358152908301908301611bc9565b9080601f830112156100f757813590611bfe82611a92565b92611c0c6040519485611917565b828452602092838086019160051b830101928084116100f757848301915b848310611c3a5750505050505090565b823567ffffffffffffffff81116100f7578691611c5c84848094890101611ad9565b815201920191611c2a565b359061148582611958565b919091610100818403126100f757611c88611983565b9267ffffffffffffffff82358181116100f75782611ca7918501611b20565b8552602083013560208601526040830135604086015260608301358181116100f75782611cd5918501611b88565b606086015260808301358181116100f75782611cf2918501611be6565b6080860152611d0360a08401611c67565b60a0860152611d1460c0840161147a565b60c086015260e08301359081116100f757611d2f9201611ad9565b60e0830152565b91909160e0818403126100f757611d4b6119a4565b928135845260208201356020850152604082013567ffffffffffffffff908181116100f75782611d7c918501611ad9565b6040860152611d8d6060840161147a565b60608601526080830135608086015260a08301358181116100f75782611db4918501611c72565b60a086015260c08301359081116100f757611dcf9201611ad9565b60c0830152565b9190916040818403126100f757611dec81611a37565b92602082013567ffffffffffffffff81116100f7576101739201611d36565b908160609103126100f757604051906060820182811067ffffffffffffffff8211176118da5760405280519063ffffffff821682036100f7576040918352602081015160208401520151611e5e81611958565b604082015290565b60405190611e73826118fb565b600282527f31350000000000000000000000000000000000000000000000000000000000006020830152565b805115611eac5760200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b908160209103126100f7575190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211611f2657565b611eea565b91908201809211611f2657565b60405190611f45826118fb565b600182527f32000000000000000000000000000000000000000000000000000000000000006020830152565b90815180825260208080930193019160005b828110611f91575050505090565b835173ffffffffffffffffffffffffffffffffffffffff1685529381019392810192600101611f83565b90815180825260208080930193019160005b828110611fdb575050505090565b835185529381019392810192600101611fcd565b90815180825260208092019182818360051b85019501936000915b84831061201a5750505050505090565b909192939495848061203483856001950387528a5161011f565b980193019301919493929061200a565b6101739160e061209b6120896120638551610100808752860190611f71565b602086015160208601526040860151604086015260608601518582036060870152611fbb565b60808501518482036080860152611fef565b60a0808501511515908401529260c08181015173ffffffffffffffffffffffffffffffffffffffff169084015201519060e081840391015261011f565b949060e09461211773ffffffffffffffffffffffffffffffffffffffff9561213f956020949b9a9b8a52848a01526101008060408b015289019061011f565b90600260608901526080880152818782038060a08a0152600083520160c08801520190612044565b9416910152565b809291039160a083126100f75760807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061217f83611a37565b9401126100f75760405190608082019082821067ffffffffffffffff8311176118da576080916040526020810135835260408101356020840152606081013560408401520135606082015290565b916060838303126100f7576121e183611a37565b9267ffffffffffffffff9260208201358481116100f75781612204918401611d36565b9360408301359081116100f7576101739201611ad9565b95919360e09561225d61213f9573ffffffffffffffffffffffffffffffffffffffff97612277959c9b9c8b5260208b01526101008060408c01528a019061011f565b91600160608a0152608089015287820360a089015261011f565b9085820360c0870152612044565b949060e0946122c473ffffffffffffffffffffffffffffffffffffffff9561213f956020949b9a9b8a52848a01526101008060408b015289019061011f565b90600060608901526080880152818782038060a08a0152600083520160c08801520190612044565b91908281039261014084126100f75760c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061232783611a37565b9501126100f75760405161233a816118df565b60208201358152604082013560208201526060820135604082015260808201356123638161145c565b606082015260a08201356123768161145c565b608082015260c082013560a08201529267ffffffffffffffff9160e08101358381116100f757846123a8918301611ad9565b936101008201358481116100f757816123c2918401611ad9565b936101208301359081116100f7576101739201611ad9565b9261244b610173959361243a866124599560a0809180518452602081015160208501526040810151604085015273ffffffffffffffffffffffffffffffffffffffff80606083015116606086015260808201511660808501520151910152565b6101208060c088015286019061011f565b9084820360e086015261011f565b9161010081840391015261011f565b916124d6906124c584610173969460a0809180518452602081015160208501526040810151604085015273ffffffffffffffffffffffffffffffffffffffff80606083015116606086015260808201511660808501520151910152565b6101008060c086015284019061011f565b9160e081840391015261011f565b156124ec5750565b610a65906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260206004840152602483019061011f565b612542906020604051928284809451938492016100fc565b810103902090565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b3d156125bb573d906125a1826119c4565b916125af6040519384611917565b82523d6000602084013e565b606090565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146126e8575b829073ffffffffffffffffffffffffffffffffffffffff9283821680151590816126dd575b50806126d4575b612621575b5050505090565b8316927f000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16831461265e57612655926127a5565b3881818061261a565b6000809350809281925af1612671612590565b506126555760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6e61746976652073656e64206661696c000000000000000000000000000000006044820152fd5b50821515612615565b90503014153861260e565b91506126f430826126fa565b916125e9565b73ffffffffffffffffffffffffffffffffffffffff908116907f000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee811682036127425750503190565b60246020929360405194859384927f70a082310000000000000000000000000000000000000000000000000000000084521660048301525afa9081156104af5760009161278d575090565b610173915060203d81116107c6576107b78183611917565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff92909216602483015260448083019390935291815261282c9190612808606482611917565b73ffffffffffffffffffffffffffffffffffffffff612825612851565b92166128ef565b805180612837575050565b8160208061284c936114859501019101611962565b61288a565b6040519061285e826118fb565b602082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020830152565b1561289157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5361666545524332303a206f7065726174696f6e206661696c656400000000006044820152fd5b803f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081141590816129b5575b501561298b5781600092918360208194519301915af19061293b612590565b9115612945575090565b8151156129555750805190602001fd5b610a65906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301610162565b60046040517f304619b5000000000000000000000000000000000000000000000000000000008152fd5b905015153861291c565b9290604051927f23b872dd00000000000000000000000000000000000000000000000000000000602085015273ffffffffffffffffffffffffffffffffffffffff809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176118da5761148592604052612b98565b919091604051917fdd62ed3e00000000000000000000000000000000000000000000000000000000835230600484015260208360448173ffffffffffffffffffffffffffffffffffffffff808916602483015286165afa9283156104af57600093612b78575b50820191828111611f26578210612b1a576040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9390931660248401526044808401929092529082526114859190612b15606483611917565b612b98565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152fd5b612b9191935060203d81116107c6576107b78183611917565b9138612aa1565b61282c9173ffffffffffffffffffffffffffffffffffffffff61282561285156fea26469706673582212202fb73f7fc22c1f9cae5dd5586cbe41a88e292b360981f0b8d0605b7a5c1032b164736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000001396f41d89b96eaf29a7ef9ee01ad36e452235ae000000000000000000000000bd7d11d1b1136f4edbe9023864c2425715387095
-----Decoded View---------------
Arg [0] : __native (address): 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
Arg [1] : __wnative (address): 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270
Arg [2] : __assetForwarder (address): 0x1396F41d89b96Eaf29A7Ef9EE01ad36E452235aE
Arg [3] : __dexspan (address): 0xbd7d11D1b1136f4EdBE9023864C2425715387095
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Arg [1] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [2] : 0000000000000000000000001396f41d89b96eaf29a7ef9ee01ad36e452235ae
Arg [3] : 000000000000000000000000bd7d11d1b1136f4edbe9023864c2425715387095
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.