Source Code
Latest 25 from a total of 660 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Outbound Transfe... | 22173291 | 259 days ago | IN | 0.00059 ETH | 0.00050665 | ||||
| Disable Route | 21670304 | 330 days ago | IN | 0 ETH | 0.00031012 | ||||
| Outbound Transfe... | 21662084 | 331 days ago | IN | 0.15333451 ETH | 0.00812163 | ||||
| Outbound Transfe... | 21652455 | 332 days ago | IN | 0.00149551 ETH | 0.00646579 | ||||
| Outbound Transfe... | 21409334 | 366 days ago | IN | 0.00062006 ETH | 0.00265352 | ||||
| Outbound Transfe... | 21409284 | 366 days ago | IN | 0.00063986 ETH | 0.00265672 | ||||
| Outbound Transfe... | 21407193 | 366 days ago | IN | 0.00035887 ETH | 0.00432129 | ||||
| Outbound Transfe... | 21394348 | 368 days ago | IN | 0.02876065 ETH | 0.00151745 | ||||
| Outbound Transfe... | 21357823 | 373 days ago | IN | 0.0306152 ETH | 0.00336262 | ||||
| Outbound Transfe... | 21357817 | 373 days ago | IN | 0.07035626 ETH | 0.00558377 | ||||
| Outbound Transfe... | 21357812 | 373 days ago | IN | 0.05007407 ETH | 0.00299875 | ||||
| Add Routes | 21234954 | 390 days ago | IN | 0 ETH | 0.00055184 | ||||
| Outbound Transfe... | 21225039 | 392 days ago | IN | 0.04136866 ETH | 0.00379933 | ||||
| Outbound Transfe... | 21219239 | 393 days ago | IN | 0.11936987 ETH | 0.00429196 | ||||
| Outbound Transfe... | 21119865 | 407 days ago | IN | 0.00508722 ETH | 0.00151805 | ||||
| Outbound Transfe... | 21109184 | 408 days ago | IN | 0.20008145 ETH | 0.00380804 | ||||
| Outbound Transfe... | 21091937 | 410 days ago | IN | 0.04009158 ETH | 0.00416287 | ||||
| Outbound Transfe... | 21082342 | 412 days ago | IN | 0.00056852 ETH | 0.00931204 | ||||
| Outbound Transfe... | 21053038 | 416 days ago | IN | 0.00034244 ETH | 0.00147655 | ||||
| Outbound Transfe... | 21040332 | 418 days ago | IN | 0.00010125 ETH | 0.00092457 | ||||
| Outbound Transfe... | 21028331 | 419 days ago | IN | 0.02898264 ETH | 0.00381438 | ||||
| Outbound Transfe... | 21027764 | 419 days ago | IN | 0.00008366 ETH | 0.00572917 | ||||
| Outbound Transfe... | 21012872 | 421 days ago | IN | 0.00510378 ETH | 0.0088144 | ||||
| Outbound Transfe... | 20948264 | 430 days ago | IN | 0 ETH | 0.00113736 | ||||
| Outbound Transfe... | 20948264 | 430 days ago | IN | 0.00010644 ETH | 0.001015 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Outbound Transfe... | 22173291 | 259 days ago | 0.0005862 ETH | ||||
| Perform Action | 22173291 | 259 days ago | 0.00754358 ETH | ||||
| Outbound Transfe... | 21662084 | 331 days ago | 0.15333451 ETH | ||||
| Outbound Transfe... | 21652455 | 332 days ago | 0.00149551 ETH | ||||
| Outbound Transfe... | 21409334 | 366 days ago | 0.00062006 ETH | ||||
| Outbound Transfe... | 21409284 | 366 days ago | 0.00063986 ETH | ||||
| Outbound Transfe... | 21407193 | 366 days ago | 0.00035887 ETH | ||||
| Outbound Transfe... | 21394348 | 368 days ago | 0.02876065 ETH | ||||
| Outbound Transfe... | 21357823 | 373 days ago | 0.0306152 ETH | ||||
| Outbound Transfe... | 21357817 | 373 days ago | 0.07035626 ETH | ||||
| Outbound Transfe... | 21357812 | 373 days ago | 0.05007407 ETH | ||||
| Outbound Transfe... | 21225039 | 392 days ago | 0.04136866 ETH | ||||
| Outbound Transfe... | 21219239 | 393 days ago | 0.11936987 ETH | ||||
| Outbound Transfe... | 21119865 | 407 days ago | 0.00508722 ETH | ||||
| Outbound Transfe... | 21109184 | 408 days ago | 0.20008145 ETH | ||||
| Outbound Transfe... | 21091937 | 410 days ago | 0.04009158 ETH | ||||
| Transfer | 21082342 | 412 days ago | 0.00018927 ETH | ||||
| Outbound Transfe... | 21082342 | 412 days ago | 0.00056852 ETH | ||||
| Outbound Transfe... | 21053038 | 416 days ago | 0.00034244 ETH | ||||
| Outbound Transfe... | 21040332 | 418 days ago | 0.00010125 ETH | ||||
| Outbound Transfe... | 21028331 | 419 days ago | 0.02898264 ETH | ||||
| Outbound Transfe... | 21027764 | 419 days ago | 0.00008366 ETH | ||||
| Outbound Transfe... | 21012872 | 421 days ago | 0.00510378 ETH | ||||
| Outbound Transfe... | 20973854 | 427 days ago | 1.53 ETH | ||||
| Outbound Transfe... | 20973854 | 427 days ago | 1.53 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Registry
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-06-21
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/**
* @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;
}
}
/**
* @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 Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing 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);
}
}
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(
address owner,
address spender
) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(
address(this).balance >= amount,
"Address: insufficient balance"
);
(bool success, ) = recipient.call{value: amount}("");
require(
success,
"Address: unable to send value, recipient may have reverted"
);
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
"Address: low-level call with value failed"
);
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(
address(this).balance >= value,
"Address: insufficient balance for call"
);
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(
data
);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data
) internal view returns (bytes memory) {
return
functionStaticCall(
target,
data,
"Address: low-level static call failed"
);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return
functionDelegateCall(
target,
data,
"Address: low-level delegate call failed"
);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transfer.selector, to, value)
);
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
);
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(
token,
abi.encodeWithSelector(token.approve.selector, spender, value)
);
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(
token,
abi.encodeWithSelector(
token.approve.selector,
spender,
newAllowance
)
);
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(
oldAllowance >= value,
"SafeERC20: decreased allowance below zero"
);
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(
token,
abi.encodeWithSelector(
token.approve.selector,
spender,
newAllowance
)
);
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(
data,
"SafeERC20: low-level call failed"
);
if (returndata.length > 0) {
// Return data is optional
require(
abi.decode(returndata, (bool)),
"SafeERC20: ERC20 operation did not succeed"
);
}
}
}
library MovrErrors {
string internal constant ADDRESS_0_PROVIDED = "ADDRESS_0_PROVIDED";
string internal constant EMPTY_INPUT = "EMPTY_INPUT";
string internal constant LENGTH_MISMATCH = "LENGTH_MISMATCH";
string internal constant INVALID_VALUE = "INVALID_VALUE";
string internal constant INVALID_AMT = "INVALID_AMT";
string internal constant IMPL_NOT_FOUND = "IMPL_NOT_FOUND";
string internal constant ROUTE_NOT_FOUND = "ROUTE_NOT_FOUND";
string internal constant IMPL_NOT_ALLOWED = "IMPL_NOT_ALLOWED";
string internal constant ROUTE_NOT_ALLOWED = "ROUTE_NOT_ALLOWED";
string internal constant INVALID_CHAIN_DATA = "INVALID_CHAIN_DATA";
string internal constant CHAIN_NOT_SUPPORTED = "CHAIN_NOT_SUPPORTED";
string internal constant TOKEN_NOT_SUPPORTED = "TOKEN_NOT_SUPPORTED";
string internal constant NOT_IMPLEMENTED = "NOT_IMPLEMENTED";
string internal constant INVALID_SENDER = "INVALID_SENDER";
string internal constant INVALID_BRIDGE_ID = "INVALID_BRIDGE_ID";
string internal constant MIDDLEWARE_ACTION_FAILED =
"MIDDLEWARE_ACTION_FAILED";
string internal constant VALUE_SHOULD_BE_ZERO = "VALUE_SHOULD_BE_ZERO";
string internal constant VALUE_SHOULD_NOT_BE_ZERO =
"VALUE_SHOULD_NOT_BE_ZERO";
string internal constant VALUE_NOT_ENOUGH = "VALUE_NOT_ENOUGH";
string internal constant VALUE_NOT_EQUAL_TO_AMOUNT =
"VALUE_NOT_EQUAL_TO_AMOUNT";
}
// import "./helpers/errors.sol";
/**
@title Abstract Implementation Contract.
@notice All Bridge Implementation will follow this interface.
*/
abstract contract ImplBase is Ownable {
using SafeERC20 for IERC20;
address public registry;
address public constant NATIVE_TOKEN_ADDRESS =
address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
event UpdateRegistryAddress(address indexed registryAddress);
constructor(address _registry) Ownable() {
registry = _registry;
}
modifier onlyRegistry() {
require(msg.sender == registry, MovrErrors.INVALID_SENDER);
_;
}
function updateRegistryAddress(address newRegistry) external onlyOwner {
registry = newRegistry;
emit UpdateRegistryAddress(newRegistry);
}
function rescueFunds(
address token,
address userAddress,
uint256 amount
) external onlyOwner {
IERC20(token).safeTransfer(userAddress, amount);
}
function outboundTransferTo(
uint256 _amount,
address _from,
address _receiverAddress,
address _token,
uint256 _toChainId,
bytes memory _extraData
) external payable virtual;
}
/**
// @title Abstract Contract for middleware services.
// @notice All middleware services will follow this interface.
*/
abstract contract MiddlewareImplBase is Ownable {
using SafeERC20 for IERC20;
address public immutable registry;
/// @notice only registry address is required.
constructor(address _registry) Ownable() {
registry = _registry;
}
modifier onlyRegistry() {
require(msg.sender == registry, MovrErrors.INVALID_SENDER);
_;
}
function performAction(
address from,
address fromToken,
uint256 amount,
address receiverAddress,
bytes memory data
) external payable virtual returns (uint256);
function rescueFunds(
address token,
address userAddress,
uint256 amount
) external onlyOwner {
IERC20(token).safeTransfer(userAddress, amount);
}
}
/**
// @title Movr Regisrtry Contract.
// @notice This is the main contract that is called using fund movr.
// This contains all the bridge and middleware ids.
// RouteIds signify which bridge to be used.
// Middleware Id signifies which aggregator will be used for swapping if required.
*/
contract Registry is Ownable {
using SafeERC20 for IERC20;
address private constant NATIVE_TOKEN_ADDRESS =
address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
///@notice RouteData stores information for a route
struct RouteData {
address route;
bool isEnabled;
bool isMiddleware;
}
RouteData[] public routes;
modifier onlyExistingRoute(uint256 _routeId) {
require(
routes[_routeId].route != address(0),
MovrErrors.ROUTE_NOT_FOUND
);
_;
}
constructor(address _owner) Ownable() {
// first route is for direct bridging
routes.push(RouteData(NATIVE_TOKEN_ADDRESS, true, true));
transferOwnership(_owner);
}
// Function to receive Ether. msg.data must be empty
receive() external payable {}
//
// Events
//
event NewRouteAdded(
uint256 routeID,
address route,
bool isEnabled,
bool isMiddleware
);
event RouteDisabled(uint256 routeID);
event ExecutionCompleted(
uint256 middlewareID,
uint256 bridgeID,
uint256 inputAmount
);
/**
// @param id route id of middleware to be used
// @param optionalNativeAmount is the amount of native asset that the route requires
// @param inputToken token address which will be swapped to
// BridgeRequest inputToken
// @param data to be used by middleware
*/
struct MiddlewareRequest {
uint256 id;
uint256 optionalNativeAmount;
address inputToken;
bytes data;
}
/**
// @param id route id of bridge to be used
// @param optionalNativeAmount optinal native amount, to be used
// when bridge needs native token along with ERC20
// @param inputToken token addresss which will be bridged
// @param data bridgeData to be used by bridge
*/
struct BridgeRequest {
uint256 id;
uint256 optionalNativeAmount;
address inputToken;
bytes data;
}
/**
// @param receiverAddress Recipient address to recieve funds on destination chain
// @param toChainId Destination ChainId
// @param amount amount to be swapped if middlewareId is 0 it will be
// the amount to be bridged
// @param middlewareRequest middleware Requestdata
// @param bridgeRequest bridge request data
*/
struct UserRequest {
address receiverAddress;
uint256 toChainId;
uint256 amount;
MiddlewareRequest middlewareRequest;
BridgeRequest bridgeRequest;
}
/**
// @notice function responsible for calling the respective implementation
// depending on the bridge to be used
// If the middlewareId is 0 then no swap is required,
// we can directly bridge the source token to wherever required,
// else, we first call the Swap Impl Base for swapping to the required
// token and then start the bridging
// @dev It is required for isMiddleWare to be true for route 0 as it is a special case
// @param _userRequest calldata follows the input data struct
*/
function outboundTransferTo(
UserRequest calldata _userRequest
) external payable {
require(_userRequest.amount != 0, MovrErrors.INVALID_AMT);
// make sure bridge ID is not 0
require(
_userRequest.bridgeRequest.id != 0,
MovrErrors.INVALID_BRIDGE_ID
);
// make sure bridge input is provided
require(
_userRequest.bridgeRequest.inputToken != address(0),
MovrErrors.ADDRESS_0_PROVIDED
);
// load middleware info and validate
RouteData memory middlewareInfo = routes[
_userRequest.middlewareRequest.id
];
require(
middlewareInfo.route != address(0) &&
middlewareInfo.isEnabled &&
middlewareInfo.isMiddleware,
MovrErrors.ROUTE_NOT_ALLOWED
);
// load bridge info and validate
RouteData memory bridgeInfo = routes[_userRequest.bridgeRequest.id];
require(
bridgeInfo.route != address(0) &&
bridgeInfo.isEnabled &&
!bridgeInfo.isMiddleware,
MovrErrors.ROUTE_NOT_ALLOWED
);
emit ExecutionCompleted(
_userRequest.middlewareRequest.id,
_userRequest.bridgeRequest.id,
_userRequest.amount
);
// if middlewareID is 0 it means we dont want to perform a action before bridging
// and directly want to move for bridging
if (_userRequest.middlewareRequest.id == 0) {
// perform the bridging
ImplBase(bridgeInfo.route).outboundTransferTo{value: msg.value}(
_userRequest.amount,
msg.sender,
_userRequest.receiverAddress,
_userRequest.bridgeRequest.inputToken,
_userRequest.toChainId,
_userRequest.bridgeRequest.data
);
return;
}
// we first perform an action using the middleware
// we determine if the input asset is a native asset, if yes we pass
// the amount as value, else we pass the optionalNativeAmount
uint256 _amountOut = MiddlewareImplBase(middlewareInfo.route)
.performAction{
value: _userRequest.middlewareRequest.inputToken ==
NATIVE_TOKEN_ADDRESS
? _userRequest.amount +
_userRequest.middlewareRequest.optionalNativeAmount
: _userRequest.middlewareRequest.optionalNativeAmount
}(
msg.sender,
_userRequest.middlewareRequest.inputToken,
_userRequest.amount,
address(this),
_userRequest.middlewareRequest.data
);
// we mutate this variable if the input asset to bridge Impl is NATIVE
uint256 nativeInput = _userRequest.bridgeRequest.optionalNativeAmount;
// if the input asset is ERC20, we need to grant the bridge implementation approval
if (_userRequest.bridgeRequest.inputToken != NATIVE_TOKEN_ADDRESS) {
IERC20(_userRequest.bridgeRequest.inputToken).safeIncreaseAllowance(
bridgeInfo.route,
_amountOut
);
} else {
// if the input asset is native we need to set it as value
nativeInput =
_amountOut +
_userRequest.bridgeRequest.optionalNativeAmount;
}
// send off to bridge
ImplBase(bridgeInfo.route).outboundTransferTo{value: nativeInput}(
_amountOut,
address(this),
_userRequest.receiverAddress,
_userRequest.bridgeRequest.inputToken,
_userRequest.toChainId,
_userRequest.bridgeRequest.data
);
}
//
// Route management functions
//
/// @notice add routes to the registry.
function addRoutes(
RouteData[] calldata _routes
) external onlyOwner returns (uint256[] memory) {
require(_routes.length != 0, MovrErrors.EMPTY_INPUT);
uint256[] memory _routeIds = new uint256[](_routes.length);
for (uint256 i = 0; i < _routes.length; i++) {
require(
_routes[i].route != address(0),
MovrErrors.ADDRESS_0_PROVIDED
);
routes.push(_routes[i]);
_routeIds[i] = routes.length - 1;
emit NewRouteAdded(
i,
_routes[i].route,
_routes[i].isEnabled,
_routes[i].isMiddleware
);
}
return _routeIds;
}
///@notice disables the route if required.
function disableRoute(
uint256 _routeId
) external onlyOwner onlyExistingRoute(_routeId) {
routes[_routeId].isEnabled = false;
emit RouteDisabled(_routeId);
}
function rescueFunds(
address _token,
address _receiverAddress,
uint256 _amount
) external onlyOwner {
IERC20(_token).safeTransfer(_receiverAddress, _amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"middlewareID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bridgeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"inputAmount","type":"uint256"}],"name":"ExecutionCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"routeID","type":"uint256"},{"indexed":false,"internalType":"address","name":"route","type":"address"},{"indexed":false,"internalType":"bool","name":"isEnabled","type":"bool"},{"indexed":false,"internalType":"bool","name":"isMiddleware","type":"bool"}],"name":"NewRouteAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"routeID","type":"uint256"}],"name":"RouteDisabled","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"route","type":"address"},{"internalType":"bool","name":"isEnabled","type":"bool"},{"internalType":"bool","name":"isMiddleware","type":"bool"}],"internalType":"struct Registry.RouteData[]","name":"_routes","type":"tuple[]"}],"name":"addRoutes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_routeId","type":"uint256"}],"name":"disableRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"receiverAddress","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"optionalNativeAmount","type":"uint256"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Registry.MiddlewareRequest","name":"middlewareRequest","type":"tuple"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"optionalNativeAmount","type":"uint256"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Registry.BridgeRequest","name":"bridgeRequest","type":"tuple"}],"internalType":"struct Registry.UserRequest","name":"_userRequest","type":"tuple"}],"name":"outboundTransferTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiverAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"routes","outputs":[{"internalType":"address","name":"route","type":"address"},{"internalType":"bool","name":"isEnabled","type":"bool"},{"internalType":"bool","name":"isMiddleware","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162002d7338038062002d7383398181016040528101906200003791906200038c565b620000576200004b6200016a60201b60201c565b6200017260201b60201c565b6001604051806060016040528073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168152602001600115158152602001600115158152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160000160156101000a81548160ff021916908315150217905550505062000163816200023660201b60201c565b5062000521565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002466200016a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200026c6200034c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002c5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002bc9062000428565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000338576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200032f9062000406565b60405180910390fd5b62000349816200017260201b60201c565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050620003868162000507565b92915050565b6000602082840312156200039f57600080fd5b6000620003af8482850162000375565b91505092915050565b6000620003c76026836200044a565b9150620003d4826200048f565b604082019050919050565b6000620003ee6020836200044a565b9150620003fb82620004de565b602082019050919050565b600060208201905081810360008301526200042181620003b8565b9050919050565b600060208201905081810360008301526200044381620003df565b9050919050565b600082825260208201905092915050565b600062000468826200046f565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000512816200045b565b81146200051e57600080fd5b50565b61284280620005316000396000f3fe60806040526004361061007f5760003560e01c80638da5cb5b1161004e5780638da5cb5b14610147578063a44bbb1514610172578063f2fde38b1461018e578063ffcdf4ed146101b757610086565b806302a9c0511461008b5780636ccae054146100c8578063715018a6146100f1578063726f16d81461010857610086565b3661008657005b600080fd5b34801561009757600080fd5b506100b260048036038101906100ad9190611b80565b6101e0565b6040516100bf9190611fb9565b60405180910390f35b3480156100d457600080fd5b506100ef60048036038101906100ea9190611b31565b610670565b005b3480156100fd57600080fd5b5061010661071c565b005b34801561011457600080fd5b5061012f600480360381019061012a9190611c58565b6107a4565b60405161013e93929190611f59565b60405180910390f35b34801561015357600080fd5b5061015c610814565b6040516101699190611eb9565b60405180910390f35b61018c60048036038101906101879190611c17565b61083d565b005b34801561019a57600080fd5b506101b560048036038101906101b09190611b08565b61123a565b005b3480156101c357600080fd5b506101de60048036038101906101d99190611c58565b611332565b005b60606101ea61155a565b73ffffffffffffffffffffffffffffffffffffffff16610208610814565b73ffffffffffffffffffffffffffffffffffffffff161461025e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102559061203d565b60405180910390fd5b60008383905014156040518060400160405280600b81526020017f454d5054595f494e505554000000000000000000000000000000000000000000815250906102dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d49190611fdb565b60405180910390fd5b5060008383905067ffffffffffffffff811115610323577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156103515781602001602082028036833780820191505090505b50905060005b8484905081101561066557600073ffffffffffffffffffffffffffffffffffffffff168585838181106103b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506060020160000160208101906103cb9190611b08565b73ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280601281526020017f414444524553535f305f50524f564944454400000000000000000000000000008152509061045a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104519190611fdb565b60405180910390fd5b506001858583818110610496577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050606002019080600181540180825580915050600190039060005260206000200160009091909190915081816104cd9190612773565b5050600180805490506104e0919061230f565b828281518110610519577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250507fd7b1a492030c0a30b288b91bf46f20c49c7715b0dd6d42244c61c540111256b581868684818110610580577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506060020160000160208101906105989190611b08565b8787858181106105d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506060020160200160208101906105e99190611bc5565b888886818110610622577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060600201604001602081019061063a9190611bc5565b60405161064a9493929190612122565b60405180910390a1808061065d9061247c565b915050610357565b508091505092915050565b61067861155a565b73ffffffffffffffffffffffffffffffffffffffff16610696610814565b73ffffffffffffffffffffffffffffffffffffffff16146106ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e39061203d565b60405180910390fd5b61071782828573ffffffffffffffffffffffffffffffffffffffff166115629092919063ffffffff16565b505050565b61072461155a565b73ffffffffffffffffffffffffffffffffffffffff16610742610814565b73ffffffffffffffffffffffffffffffffffffffff1614610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078f9061203d565b60405180910390fd5b6107a260006115e8565b565b600181815481106107b457600080fd5b906000526020600020016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900460ff16905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000816040013514156040518060400160405280600b81526020017f494e56414c49445f414d54000000000000000000000000000000000000000000815250906108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b49190611fdb565b60405180910390fd5b5060008180608001906108d091906121f5565b6000013514156040518060400160405280601181526020017f494e56414c49445f4252494447455f49440000000000000000000000000000008152509061094d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109449190611fdb565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff1681806080019061097691906121f5565b60400160208101906109889190611b08565b73ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280601281526020017f414444524553535f305f50524f5649444544000000000000000000000000000081525090610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e9190611fdb565b60405180910390fd5b5060006001828060600190610a2c9190612219565b6000013581548110610a67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff161515151581526020016000820160159054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614158015610b4c575080602001515b8015610b59575080604001515b6040518060400160405280601181526020017f524f5554455f4e4f545f414c4c4f57454400000000000000000000000000000081525090610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc79190611fdb565b60405180910390fd5b5060006001838060800190610be591906121f5565b6000013581548110610c20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff161515151581526020016000820160159054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614158015610d05575080602001515b8015610d1357508060400151155b6040518060400160405280601181526020017f524f5554455f4e4f545f414c4c4f57454400000000000000000000000000000081525090610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d819190611fdb565b60405180910390fd5b507f28fd8a5dda29b4035905e0657f97244a0e0bef97951e248ed0f2c6878d6590c2838060600190610dbc9190612219565b60000135848060800190610dd091906121f5565b600001358560400135604051610de893929190612167565b60405180910390a16000838060600190610e029190612219565b600001351415610ee757806000015173ffffffffffffffffffffffffffffffffffffffff1663022490c834856040013533876000016020810190610e469190611b08565b888060800190610e5691906121f5565b6040016020810190610e689190611b08565b89602001358a8060800190610e7d91906121f5565b8060600190610e8c919061219e565b6040518963ffffffff1660e01b8152600401610eae97969594939291906120b8565b6000604051808303818588803b158015610ec757600080fd5b505af1158015610edb573d6000803e3d6000fd5b50505050505050611237565b6000826000015173ffffffffffffffffffffffffffffffffffffffff1663545ebbb073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff16868060600190610f449190612219565b6040016020810190610f569190611b08565b73ffffffffffffffffffffffffffffffffffffffff1614610f8a57858060600190610f819190612219565b60200135610fae565b858060600190610f9a9190612219565b602001358660400135610fad91906122b9565b5b33878060600190610fbf9190612219565b6040016020810190610fd19190611b08565b8860400135308a8060600190610fe79190612219565b8060600190610ff6919061219e565b6040518863ffffffff1660e01b815260040161101796959493929190611efd565b6020604051808303818588803b15801561103057600080fd5b505af1158015611044573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110699190611c81565b9050600084806080019061107d91906121f5565b60200135905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168580608001906110be91906121f5565b60400160208101906110d09190611b08565b73ffffffffffffffffffffffffffffffffffffffff16146111405761113b83600001518387806080019061110491906121f5565b60400160208101906111169190611b08565b73ffffffffffffffffffffffffffffffffffffffff166116ac9092919063ffffffff16565b611162565b84806080019061115091906121f5565b602001358261115f91906122b9565b90505b826000015173ffffffffffffffffffffffffffffffffffffffff1663022490c88284308960000160208101906111989190611b08565b8a80608001906111a891906121f5565b60400160208101906111ba9190611b08565b8b602001358c80608001906111cf91906121f5565b80606001906111de919061219e565b6040518963ffffffff1660e01b815260040161120097969594939291906120b8565b6000604051808303818588803b15801561121957600080fd5b505af115801561122d573d6000803e3d6000fd5b5050505050505050505b50565b61124261155a565b73ffffffffffffffffffffffffffffffffffffffff16611260610814565b73ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad9061203d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90611ffd565b60405180910390fd5b61132f816115e8565b50565b61133a61155a565b73ffffffffffffffffffffffffffffffffffffffff16611358610814565b73ffffffffffffffffffffffffffffffffffffffff16146113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a59061203d565b60405180910390fd5b80600073ffffffffffffffffffffffffffffffffffffffff1660018281548110611401577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600f81526020017f524f5554455f4e4f545f464f554e440000000000000000000000000000000000815250906114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b59190611fdb565b60405180910390fd5b506000600183815481106114fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160146101000a81548160ff0219169083151502179055507f91a0168fe2af7d03fc4465ab611da7d997fe924f69c20e9d16a23e6fc7af88d48260405161154e919061209d565b60405180910390a15050565b600033905090565b6115e38363a9059cbb60e01b8484604051602401611581929190611f90565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117cd565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30866040518363ffffffff1660e01b81526004016116ea929190611ed4565b60206040518083038186803b15801561170257600080fd5b505afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190611c81565b61174491906122b9565b90506117c78463095ea7b360e01b8584604051602401611765929190611f90565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117cd565b50505050565b600061182f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166118949092919063ffffffff16565b905060008151111561188f578080602001905181019061184f9190611bee565b61188e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118859061207d565b60405180910390fd5b5b505050565b60606118a384846000856118ac565b90509392505050565b6060824710156118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e89061201d565b60405180910390fd5b6118fa856119c0565b611939576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119309061205d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516119629190611ea2565b60006040518083038185875af1925050503d806000811461199f576040519150601f19603f3d011682016040523d82523d6000602084013e6119a4565b606091505b50915091506119b48282866119d3565b92505050949350505050565b600080823b905060008111915050919050565b606083156119e357829050611a33565b6000835111156119f65782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a9190611fdb565b60405180910390fd5b9392505050565b600081359050611a49816127c7565b92915050565b60008083601f840112611a6157600080fd5b8235905067ffffffffffffffff811115611a7a57600080fd5b602083019150836060820283011115611a9257600080fd5b9250929050565b600081359050611aa8816127de565b92915050565b600081519050611abd816127de565b92915050565b600060a08284031215611ad557600080fd5b81905092915050565b600081359050611aed816127f5565b92915050565b600081519050611b02816127f5565b92915050565b600060208284031215611b1a57600080fd5b6000611b2884828501611a3a565b91505092915050565b600080600060608486031215611b4657600080fd5b6000611b5486828701611a3a565b9350506020611b6586828701611a3a565b9250506040611b7686828701611ade565b9150509250925092565b60008060208385031215611b9357600080fd5b600083013567ffffffffffffffff811115611bad57600080fd5b611bb985828601611a4f565b92509250509250929050565b600060208284031215611bd757600080fd5b6000611be584828501611a99565b91505092915050565b600060208284031215611c0057600080fd5b6000611c0e84828501611aae565b91505092915050565b600060208284031215611c2957600080fd5b600082013567ffffffffffffffff811115611c4357600080fd5b611c4f84828501611ac3565b91505092915050565b600060208284031215611c6a57600080fd5b6000611c7884828501611ade565b91505092915050565b600060208284031215611c9357600080fd5b6000611ca184828501611af3565b91505092915050565b6000611cb68383611e84565b60208301905092915050565b611ccb81612343565b82525050565b6000611cdc8261224d565b611ce6818561227b565b9350611cf18361223d565b8060005b83811015611d22578151611d098882611caa565b9750611d148361226e565b925050600181019050611cf5565b5085935050505092915050565b611d3881612355565b82525050565b6000611d4a838561228c565b9350611d578385846123d3565b611d6083612534565b840190509392505050565b6000611d7682612258565b611d80818561229d565b9350611d908185602086016123e2565b80840191505092915050565b6000611da782612263565b611db181856122a8565b9350611dc18185602086016123e2565b611dca81612534565b840191505092915050565b6000611de26026836122a8565b9150611ded8261256c565b604082019050919050565b6000611e056026836122a8565b9150611e10826125bb565b604082019050919050565b6000611e286020836122a8565b9150611e338261260a565b602082019050919050565b6000611e4b601d836122a8565b9150611e5682612633565b602082019050919050565b6000611e6e602a836122a8565b9150611e798261265c565b604082019050919050565b611e8d81612381565b82525050565b611e9c81612381565b82525050565b6000611eae8284611d6b565b915081905092915050565b6000602082019050611ece6000830184611cc2565b92915050565b6000604082019050611ee96000830185611cc2565b611ef66020830184611cc2565b9392505050565b600060a082019050611f126000830189611cc2565b611f1f6020830188611cc2565b611f2c6040830187611e93565b611f396060830186611cc2565b8181036080830152611f4c818486611d3e565b9050979650505050505050565b6000606082019050611f6e6000830186611cc2565b611f7b6020830185611d2f565b611f886040830184611d2f565b949350505050565b6000604082019050611fa56000830185611cc2565b611fb26020830184611e93565b9392505050565b60006020820190508181036000830152611fd38184611cd1565b905092915050565b60006020820190508181036000830152611ff58184611d9c565b905092915050565b6000602082019050818103600083015261201681611dd5565b9050919050565b6000602082019050818103600083015261203681611df8565b9050919050565b6000602082019050818103600083015261205681611e1b565b9050919050565b6000602082019050818103600083015261207681611e3e565b9050919050565b6000602082019050818103600083015261209681611e61565b9050919050565b60006020820190506120b26000830184611e93565b92915050565b600060c0820190506120cd600083018a611e93565b6120da6020830189611cc2565b6120e76040830188611cc2565b6120f46060830187611cc2565b6121016080830186611e93565b81810360a0830152612114818486611d3e565b905098975050505050505050565b60006080820190506121376000830187611e93565b6121446020830186611cc2565b6121516040830185611d2f565b61215e6060830184611d2f565b95945050505050565b600060608201905061217c6000830186611e93565b6121896020830185611e93565b6121966040830184611e93565b949350505050565b600080833560016020038436030381126121b757600080fd5b80840192508235915067ffffffffffffffff8211156121d557600080fd5b6020830192506001820236038313156121ed57600080fd5b509250929050565b60008235600160800383360303811261220d57600080fd5b80830191505092915050565b60008235600160800383360303811261223157600080fd5b80830191505092915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006122c482612381565b91506122cf83612381565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612304576123036124c5565b5b828201905092915050565b600061231a82612381565b915061232583612381565b925082821015612338576123376124c5565b5b828203905092915050565b600061234e82612361565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612396826123af565b9050919050565b60006123a882612355565b9050919050565b60006123ba826123c1565b9050919050565b60006123cc82612361565b9050919050565b82818337600083830152505050565b60005b838110156124005780820151818401526020810190506123e5565b8381111561240f576000848401525b50505050565b60008101600083018061242781612508565b90506124338184612750565b5050506000810160208301806124488161251e565b90506124548184612781565b5050506000810160408301806124698161251e565b905061247581846127a4565b5050505050565b600061248782612381565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156124ba576124b96124c5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000819050919050565b60008135612515816127c7565b80915050919050565b6000813561252b816127de565b80915050919050565b6000601f19601f8301169050919050565b60008160001b9050919050565b60008160a01b9050919050565b60008160a81b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600074ff00000000000000000000000000000000000000006126cc84612552565b9350801983169250808416831791505092915050565b600075ff0000000000000000000000000000000000000000006127048461255f565b9350801983169250808416831791505092915050565b600073ffffffffffffffffffffffffffffffffffffffff61273a84612545565b9350801983169250808416831791505092915050565b6127598261238b565b61276c612765826124f4565b835461271a565b8255505050565b61277d8282612415565b5050565b61278a8261239d565b61279d612796826124fe565b83546126ab565b8255505050565b6127ad8261239d565b6127c06127b9826124fe565b83546126e2565b8255505050565b6127d081612343565b81146127db57600080fd5b50565b6127e781612355565b81146127f257600080fd5b50565b6127fe81612381565b811461280957600080fd5b5056fea264697066735822122055132b0eac132f0198f3faee092cff0f5a8216f1532f7a38897e892a826f9efd64736f6c63430008040033000000000000000000000000f26ddf26623e8ae83f78012a48d24704ad175431
Deployed Bytecode
0x60806040526004361061007f5760003560e01c80638da5cb5b1161004e5780638da5cb5b14610147578063a44bbb1514610172578063f2fde38b1461018e578063ffcdf4ed146101b757610086565b806302a9c0511461008b5780636ccae054146100c8578063715018a6146100f1578063726f16d81461010857610086565b3661008657005b600080fd5b34801561009757600080fd5b506100b260048036038101906100ad9190611b80565b6101e0565b6040516100bf9190611fb9565b60405180910390f35b3480156100d457600080fd5b506100ef60048036038101906100ea9190611b31565b610670565b005b3480156100fd57600080fd5b5061010661071c565b005b34801561011457600080fd5b5061012f600480360381019061012a9190611c58565b6107a4565b60405161013e93929190611f59565b60405180910390f35b34801561015357600080fd5b5061015c610814565b6040516101699190611eb9565b60405180910390f35b61018c60048036038101906101879190611c17565b61083d565b005b34801561019a57600080fd5b506101b560048036038101906101b09190611b08565b61123a565b005b3480156101c357600080fd5b506101de60048036038101906101d99190611c58565b611332565b005b60606101ea61155a565b73ffffffffffffffffffffffffffffffffffffffff16610208610814565b73ffffffffffffffffffffffffffffffffffffffff161461025e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102559061203d565b60405180910390fd5b60008383905014156040518060400160405280600b81526020017f454d5054595f494e505554000000000000000000000000000000000000000000815250906102dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d49190611fdb565b60405180910390fd5b5060008383905067ffffffffffffffff811115610323577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156103515781602001602082028036833780820191505090505b50905060005b8484905081101561066557600073ffffffffffffffffffffffffffffffffffffffff168585838181106103b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506060020160000160208101906103cb9190611b08565b73ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280601281526020017f414444524553535f305f50524f564944454400000000000000000000000000008152509061045a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104519190611fdb565b60405180910390fd5b506001858583818110610496577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050606002019080600181540180825580915050600190039060005260206000200160009091909190915081816104cd9190612773565b5050600180805490506104e0919061230f565b828281518110610519577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250507fd7b1a492030c0a30b288b91bf46f20c49c7715b0dd6d42244c61c540111256b581868684818110610580577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506060020160000160208101906105989190611b08565b8787858181106105d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506060020160200160208101906105e99190611bc5565b888886818110610622577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060600201604001602081019061063a9190611bc5565b60405161064a9493929190612122565b60405180910390a1808061065d9061247c565b915050610357565b508091505092915050565b61067861155a565b73ffffffffffffffffffffffffffffffffffffffff16610696610814565b73ffffffffffffffffffffffffffffffffffffffff16146106ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e39061203d565b60405180910390fd5b61071782828573ffffffffffffffffffffffffffffffffffffffff166115629092919063ffffffff16565b505050565b61072461155a565b73ffffffffffffffffffffffffffffffffffffffff16610742610814565b73ffffffffffffffffffffffffffffffffffffffff1614610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078f9061203d565b60405180910390fd5b6107a260006115e8565b565b600181815481106107b457600080fd5b906000526020600020016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900460ff16905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000816040013514156040518060400160405280600b81526020017f494e56414c49445f414d54000000000000000000000000000000000000000000815250906108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b49190611fdb565b60405180910390fd5b5060008180608001906108d091906121f5565b6000013514156040518060400160405280601181526020017f494e56414c49445f4252494447455f49440000000000000000000000000000008152509061094d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109449190611fdb565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff1681806080019061097691906121f5565b60400160208101906109889190611b08565b73ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280601281526020017f414444524553535f305f50524f5649444544000000000000000000000000000081525090610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e9190611fdb565b60405180910390fd5b5060006001828060600190610a2c9190612219565b6000013581548110610a67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff161515151581526020016000820160159054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614158015610b4c575080602001515b8015610b59575080604001515b6040518060400160405280601181526020017f524f5554455f4e4f545f414c4c4f57454400000000000000000000000000000081525090610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc79190611fdb565b60405180910390fd5b5060006001838060800190610be591906121f5565b6000013581548110610c20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff161515151581526020016000820160159054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614158015610d05575080602001515b8015610d1357508060400151155b6040518060400160405280601181526020017f524f5554455f4e4f545f414c4c4f57454400000000000000000000000000000081525090610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d819190611fdb565b60405180910390fd5b507f28fd8a5dda29b4035905e0657f97244a0e0bef97951e248ed0f2c6878d6590c2838060600190610dbc9190612219565b60000135848060800190610dd091906121f5565b600001358560400135604051610de893929190612167565b60405180910390a16000838060600190610e029190612219565b600001351415610ee757806000015173ffffffffffffffffffffffffffffffffffffffff1663022490c834856040013533876000016020810190610e469190611b08565b888060800190610e5691906121f5565b6040016020810190610e689190611b08565b89602001358a8060800190610e7d91906121f5565b8060600190610e8c919061219e565b6040518963ffffffff1660e01b8152600401610eae97969594939291906120b8565b6000604051808303818588803b158015610ec757600080fd5b505af1158015610edb573d6000803e3d6000fd5b50505050505050611237565b6000826000015173ffffffffffffffffffffffffffffffffffffffff1663545ebbb073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff16868060600190610f449190612219565b6040016020810190610f569190611b08565b73ffffffffffffffffffffffffffffffffffffffff1614610f8a57858060600190610f819190612219565b60200135610fae565b858060600190610f9a9190612219565b602001358660400135610fad91906122b9565b5b33878060600190610fbf9190612219565b6040016020810190610fd19190611b08565b8860400135308a8060600190610fe79190612219565b8060600190610ff6919061219e565b6040518863ffffffff1660e01b815260040161101796959493929190611efd565b6020604051808303818588803b15801561103057600080fd5b505af1158015611044573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110699190611c81565b9050600084806080019061107d91906121f5565b60200135905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168580608001906110be91906121f5565b60400160208101906110d09190611b08565b73ffffffffffffffffffffffffffffffffffffffff16146111405761113b83600001518387806080019061110491906121f5565b60400160208101906111169190611b08565b73ffffffffffffffffffffffffffffffffffffffff166116ac9092919063ffffffff16565b611162565b84806080019061115091906121f5565b602001358261115f91906122b9565b90505b826000015173ffffffffffffffffffffffffffffffffffffffff1663022490c88284308960000160208101906111989190611b08565b8a80608001906111a891906121f5565b60400160208101906111ba9190611b08565b8b602001358c80608001906111cf91906121f5565b80606001906111de919061219e565b6040518963ffffffff1660e01b815260040161120097969594939291906120b8565b6000604051808303818588803b15801561121957600080fd5b505af115801561122d573d6000803e3d6000fd5b5050505050505050505b50565b61124261155a565b73ffffffffffffffffffffffffffffffffffffffff16611260610814565b73ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad9061203d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90611ffd565b60405180910390fd5b61132f816115e8565b50565b61133a61155a565b73ffffffffffffffffffffffffffffffffffffffff16611358610814565b73ffffffffffffffffffffffffffffffffffffffff16146113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a59061203d565b60405180910390fd5b80600073ffffffffffffffffffffffffffffffffffffffff1660018281548110611401577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600f81526020017f524f5554455f4e4f545f464f554e440000000000000000000000000000000000815250906114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b59190611fdb565b60405180910390fd5b506000600183815481106114fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160146101000a81548160ff0219169083151502179055507f91a0168fe2af7d03fc4465ab611da7d997fe924f69c20e9d16a23e6fc7af88d48260405161154e919061209d565b60405180910390a15050565b600033905090565b6115e38363a9059cbb60e01b8484604051602401611581929190611f90565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117cd565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30866040518363ffffffff1660e01b81526004016116ea929190611ed4565b60206040518083038186803b15801561170257600080fd5b505afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190611c81565b61174491906122b9565b90506117c78463095ea7b360e01b8584604051602401611765929190611f90565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117cd565b50505050565b600061182f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166118949092919063ffffffff16565b905060008151111561188f578080602001905181019061184f9190611bee565b61188e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118859061207d565b60405180910390fd5b5b505050565b60606118a384846000856118ac565b90509392505050565b6060824710156118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e89061201d565b60405180910390fd5b6118fa856119c0565b611939576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119309061205d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516119629190611ea2565b60006040518083038185875af1925050503d806000811461199f576040519150601f19603f3d011682016040523d82523d6000602084013e6119a4565b606091505b50915091506119b48282866119d3565b92505050949350505050565b600080823b905060008111915050919050565b606083156119e357829050611a33565b6000835111156119f65782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a9190611fdb565b60405180910390fd5b9392505050565b600081359050611a49816127c7565b92915050565b60008083601f840112611a6157600080fd5b8235905067ffffffffffffffff811115611a7a57600080fd5b602083019150836060820283011115611a9257600080fd5b9250929050565b600081359050611aa8816127de565b92915050565b600081519050611abd816127de565b92915050565b600060a08284031215611ad557600080fd5b81905092915050565b600081359050611aed816127f5565b92915050565b600081519050611b02816127f5565b92915050565b600060208284031215611b1a57600080fd5b6000611b2884828501611a3a565b91505092915050565b600080600060608486031215611b4657600080fd5b6000611b5486828701611a3a565b9350506020611b6586828701611a3a565b9250506040611b7686828701611ade565b9150509250925092565b60008060208385031215611b9357600080fd5b600083013567ffffffffffffffff811115611bad57600080fd5b611bb985828601611a4f565b92509250509250929050565b600060208284031215611bd757600080fd5b6000611be584828501611a99565b91505092915050565b600060208284031215611c0057600080fd5b6000611c0e84828501611aae565b91505092915050565b600060208284031215611c2957600080fd5b600082013567ffffffffffffffff811115611c4357600080fd5b611c4f84828501611ac3565b91505092915050565b600060208284031215611c6a57600080fd5b6000611c7884828501611ade565b91505092915050565b600060208284031215611c9357600080fd5b6000611ca184828501611af3565b91505092915050565b6000611cb68383611e84565b60208301905092915050565b611ccb81612343565b82525050565b6000611cdc8261224d565b611ce6818561227b565b9350611cf18361223d565b8060005b83811015611d22578151611d098882611caa565b9750611d148361226e565b925050600181019050611cf5565b5085935050505092915050565b611d3881612355565b82525050565b6000611d4a838561228c565b9350611d578385846123d3565b611d6083612534565b840190509392505050565b6000611d7682612258565b611d80818561229d565b9350611d908185602086016123e2565b80840191505092915050565b6000611da782612263565b611db181856122a8565b9350611dc18185602086016123e2565b611dca81612534565b840191505092915050565b6000611de26026836122a8565b9150611ded8261256c565b604082019050919050565b6000611e056026836122a8565b9150611e10826125bb565b604082019050919050565b6000611e286020836122a8565b9150611e338261260a565b602082019050919050565b6000611e4b601d836122a8565b9150611e5682612633565b602082019050919050565b6000611e6e602a836122a8565b9150611e798261265c565b604082019050919050565b611e8d81612381565b82525050565b611e9c81612381565b82525050565b6000611eae8284611d6b565b915081905092915050565b6000602082019050611ece6000830184611cc2565b92915050565b6000604082019050611ee96000830185611cc2565b611ef66020830184611cc2565b9392505050565b600060a082019050611f126000830189611cc2565b611f1f6020830188611cc2565b611f2c6040830187611e93565b611f396060830186611cc2565b8181036080830152611f4c818486611d3e565b9050979650505050505050565b6000606082019050611f6e6000830186611cc2565b611f7b6020830185611d2f565b611f886040830184611d2f565b949350505050565b6000604082019050611fa56000830185611cc2565b611fb26020830184611e93565b9392505050565b60006020820190508181036000830152611fd38184611cd1565b905092915050565b60006020820190508181036000830152611ff58184611d9c565b905092915050565b6000602082019050818103600083015261201681611dd5565b9050919050565b6000602082019050818103600083015261203681611df8565b9050919050565b6000602082019050818103600083015261205681611e1b565b9050919050565b6000602082019050818103600083015261207681611e3e565b9050919050565b6000602082019050818103600083015261209681611e61565b9050919050565b60006020820190506120b26000830184611e93565b92915050565b600060c0820190506120cd600083018a611e93565b6120da6020830189611cc2565b6120e76040830188611cc2565b6120f46060830187611cc2565b6121016080830186611e93565b81810360a0830152612114818486611d3e565b905098975050505050505050565b60006080820190506121376000830187611e93565b6121446020830186611cc2565b6121516040830185611d2f565b61215e6060830184611d2f565b95945050505050565b600060608201905061217c6000830186611e93565b6121896020830185611e93565b6121966040830184611e93565b949350505050565b600080833560016020038436030381126121b757600080fd5b80840192508235915067ffffffffffffffff8211156121d557600080fd5b6020830192506001820236038313156121ed57600080fd5b509250929050565b60008235600160800383360303811261220d57600080fd5b80830191505092915050565b60008235600160800383360303811261223157600080fd5b80830191505092915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006122c482612381565b91506122cf83612381565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612304576123036124c5565b5b828201905092915050565b600061231a82612381565b915061232583612381565b925082821015612338576123376124c5565b5b828203905092915050565b600061234e82612361565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612396826123af565b9050919050565b60006123a882612355565b9050919050565b60006123ba826123c1565b9050919050565b60006123cc82612361565b9050919050565b82818337600083830152505050565b60005b838110156124005780820151818401526020810190506123e5565b8381111561240f576000848401525b50505050565b60008101600083018061242781612508565b90506124338184612750565b5050506000810160208301806124488161251e565b90506124548184612781565b5050506000810160408301806124698161251e565b905061247581846127a4565b5050505050565b600061248782612381565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156124ba576124b96124c5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000819050919050565b60008135612515816127c7565b80915050919050565b6000813561252b816127de565b80915050919050565b6000601f19601f8301169050919050565b60008160001b9050919050565b60008160a01b9050919050565b60008160a81b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600074ff00000000000000000000000000000000000000006126cc84612552565b9350801983169250808416831791505092915050565b600075ff0000000000000000000000000000000000000000006127048461255f565b9350801983169250808416831791505092915050565b600073ffffffffffffffffffffffffffffffffffffffff61273a84612545565b9350801983169250808416831791505092915050565b6127598261238b565b61276c612765826124f4565b835461271a565b8255505050565b61277d8282612415565b5050565b61278a8261239d565b61279d612796826124fe565b83546126ab565b8255505050565b6127ad8261239d565b6127c06127b9826124fe565b83546126e2565b8255505050565b6127d081612343565b81146127db57600080fd5b50565b6127e781612355565b81146127f257600080fd5b50565b6127fe81612381565b811461280957600080fd5b5056fea264697066735822122055132b0eac132f0198f3faee092cff0f5a8216f1532f7a38897e892a826f9efd64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f26ddf26623e8ae83f78012a48d24704ad175431
-----Decoded View---------------
Arg [0] : _owner (address): 0xF26DdF26623e8Ae83f78012a48d24704AD175431
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f26ddf26623e8ae83f78012a48d24704ad175431
Deployed Bytecode Sourcemap
22737:8461:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29979:750;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30989:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2409:103;;;;;;;;;;;;;:::i;:::-;;23088:25;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;1758:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25971:3902;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2667:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30786:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29979:750;30072:16;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30127:1:::1;30109:7;;:14;;:19;;30130:22;;;;;;;;;;;;;;;;::::0;30101:52:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30164:26;30207:7;;:14;;30193:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30164:58;;30238:9;30233:460;30257:7;;:14;;30253:1;:18;30233:460;;;30347:1;30319:30;;:7;;30327:1;30319:10;;;;;;;;;;;;;;;;;;;;:16;;;;;;;;;;:::i;:::-;:30;;;;30368:29;;;;;;;;;;;;;;;;::::0;30293:119:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30427:6;30439:7;;30447:1;30439:10;;;;;;;;;;;;;;;;;;;;30427:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30496:1;30480:6:::0;:13:::1;;;;:17;;;;:::i;:::-;30465:9;30475:1;30465:12;;;;;;;;;;;;;;;;;;;;;:32;;;::::0;::::1;30517:164;30549:1;30569:7;;30577:1;30569:10;;;;;;;;;;;;;;;;;;;;:16;;;;;;;;;;:::i;:::-;30604:7;;30612:1;30604:10;;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;:::i;:::-;30643:7;;30651:1;30643:10;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;:::i;:::-;30517:164;;;;;;;;;:::i;:::-;;;;;;;;30273:3;;;;;:::i;:::-;;;;30233:460;;;;30712:9;30705:16;;;29979:750:::0;;;;:::o;30989:206::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31133:54:::1;31161:16;31179:7;31140:6;31133:27;;;;:54;;;;;:::i;:::-;30989:206:::0;;;:::o;2409:103::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2474:30:::1;2501:1;2474:18;:30::i;:::-;2409:103::o:0;23088:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1758:87::-;1804:7;1831:6;;;;;;;;;;;1824:13;;1758:87;:::o;25971:3902::-;26109:1;26086:12;:19;;;:24;;26112:22;;;;;;;;;;;;;;;;;26078:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26244:1;26211:12;:26;;;;;;;;:::i;:::-;:29;;;:34;;26260:28;;;;;;;;;;;;;;;;;26189:110;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26430:1;26381:51;;:12;:26;;;;;;;;:::i;:::-;:37;;;;;;;;;;:::i;:::-;:51;;;;26447:29;;;;;;;;;;;;;;;;;26359:128;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26546:31;26580:6;26601:12;:30;;;;;;;;:::i;:::-;:33;;;26580:65;;;;;;;;;;;;;;;;;;;;;;;26546:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26710:1;26678:34;;:14;:20;;;:34;;;;:79;;;;;26733:14;:24;;;26678:79;:127;;;;;26778:14;:27;;;26678:127;26820:28;;;;;;;;;;;;;;;;;26656:203;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26914:27;26944:6;26951:12;:26;;;;;;;;:::i;:::-;:29;;;26944:37;;;;;;;;;;;;;;;;;;;;;;;26914:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27042:1;27014:30;;:10;:16;;;:30;;;;:71;;;;;27065:10;:20;;;27014:71;:116;;;;;27107:10;:23;;;27106:24;27014:116;27145:28;;;;;;;;;;;;;;;;;26992:192;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27202:155;27235:12;:30;;;;;;;;:::i;:::-;:33;;;27283:12;:26;;;;;;;;:::i;:::-;:29;;;27327:12;:19;;;27202:155;;;;;;;;:::i;:::-;;;;;;;;27553:1;27516:12;:30;;;;;;;;:::i;:::-;:33;;;:38;27512:468;;;27617:10;:16;;;27608:45;;;27661:9;27690:12;:19;;;27728:10;27757:12;:28;;;;;;;;;;:::i;:::-;27804:12;:26;;;;;;;;:::i;:::-;:37;;;;;;;;;;:::i;:::-;27860:12;:22;;;27901:12;:26;;;;;;;;:::i;:::-;:31;;;;;;;;:::i;:::-;27608:339;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27962:7;;;;27512:468;28201:18;28241:14;:20;;;28222:68;;;22871:42;28312:82;;:12;:30;;;;;;;;:::i;:::-;:41;;;;;;;;;;:::i;:::-;:82;;;:267;;28528:12;:30;;;;;;;;:::i;:::-;:51;;;28312:267;;;28457:12;:30;;;;;;;;:::i;:::-;:51;;;28414:12;:19;;;:94;;;;:::i;:::-;28312:267;28605:10;28630:12;:30;;;;;;;;:::i;:::-;:41;;;;;;;;;;:::i;:::-;28686:12;:19;;;28728:4;28748:12;:30;;;;;;;;:::i;:::-;:35;;;;;;;;:::i;:::-;28222:572;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28201:593;;28887:19;28909:12;:26;;;;;;;;:::i;:::-;:47;;;28887:69;;22871:42;29066:61;;:12;:26;;;;;;;;:::i;:::-;:37;;;;;;;;;;:::i;:::-;:61;;;29062:453;;29144:146;29230:10;:16;;;29265:10;29151:12;:26;;;;;;;;:::i;:::-;:37;;;;;;;;;;:::i;:::-;29144:67;;;;:146;;;;;:::i;:::-;29062:453;;;29456:12;:26;;;;;;;;:::i;:::-;:47;;;29426:10;:77;;;;:::i;:::-;29395:108;;29062:453;29567:10;:16;;;29558:45;;;29611:11;29638:10;29671:4;29691:12;:28;;;;;;;;;;:::i;:::-;29734:12;:26;;;;;;;;:::i;:::-;:37;;;;;;;;;;:::i;:::-;29786:12;:22;;;29823:12;:26;;;;;;;;:::i;:::-;:31;;;;;;;;:::i;:::-;29558:307;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25971:3902;;;;;;:::o;2667:238::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2790:1:::1;2770:22;;:8;:22;;;;2748:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2869:28;2888:8;2869:18;:28::i;:::-;2667:238:::0;:::o;30786:195::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30879:8:::1;23232:1;23198:36;;:6;23205:8;23198:16;;;;;;;;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;:36;;;;23249:26;;;;;;;;;;;;;;;;::::0;23176:110:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30929:5:::2;30900:6;30907:8;30900:16;;;;;;;;;;;;;;;;;;;;;;;:26;;;:34;;;;;;;;;;;;;;;;;;30950:23;30964:8;30950:23;;;;;;:::i;:::-;;;;;;;;2049:1:::1;30786:195:::0;:::o;600:98::-;653:7;680:10;673:17;;600:98;:::o;15022:214::-;15105:123;15139:5;15182:23;;;15207:2;15211:5;15159:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15105:19;:123::i;:::-;15022:214;;;:::o;3065:191::-;3139:16;3158:6;;;;;;;;;;;3139:25;;3184:8;3175:6;;:17;;;;;;;;;;;;;;;;;;3239:8;3208:40;;3229:8;3208:40;;;;;;;;;;;;3065:191;;:::o;16459:420::-;16590:20;16655:5;16613;:15;;;16637:4;16644:7;16613:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;16590:70;;16671:200;16705:5;16766:22;;;16807:7;16833:12;16725:135;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16671:19;:200::i;:::-;16459:420;;;;:::o;17955:802::-;18379:23;18405:106;18447:4;18405:106;;;;;;;;;;;;;;;;;18413:5;18405:27;;;;:106;;;;;:::i;:::-;18379:132;;18546:1;18526:10;:17;:21;18522:228;;;18641:10;18630:30;;;;;;;;;;;;:::i;:::-;18604:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;18522:228;17955:802;;;:::o;9606:229::-;9743:12;9775:52;9797:6;9805:4;9811:1;9814:12;9775:21;:52::i;:::-;9768:59;;9606:229;;;;;:::o;10822:571::-;10992:12;11064:5;11039:21;:30;;11017:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;11154:18;11165:6;11154:10;:18::i;:::-;11146:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;11220:12;11234:23;11261:6;:11;;11280:5;11301:4;11261:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11219:97;;;;11334:51;11351:7;11360:10;11372:12;11334:16;:51::i;:::-;11327:58;;;;10822:571;;;;;;:::o;6701:387::-;6761:4;6969:12;7036:7;7024:20;7016:28;;7079:1;7072:4;:8;7065:15;;;6701:387;;;:::o;13777:712::-;13927:12;13956:7;13952:530;;;13987:10;13980:17;;;;13952:530;14121:1;14101:10;:17;:21;14097:374;;;14299:10;14293:17;14360:15;14347:10;14343:2;14339:19;14332:44;14247:148;14442:12;14435:20;;;;;;;;;;;:::i;:::-;;;;;;;;13777:712;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;187:395::-;288:8;298:6;348:3;341:4;333:6;329:17;325:27;315:2;;366:1;363;356:12;315:2;402:6;389:20;379:30;;432:18;424:6;421:30;418:2;;;464:1;461;454:12;418:2;501:4;493:6;489:17;477:29;;555:3;547:4;539:6;535:17;525:8;521:32;518:41;515:2;;;572:1;569;562:12;515:2;305:277;;;;;:::o;588:133::-;631:5;669:6;656:20;647:29;;685:30;709:5;685:30;:::i;:::-;637:84;;;;:::o;727:137::-;781:5;812:6;806:13;797:22;;828:30;852:5;828:30;:::i;:::-;787:77;;;;:::o;905:169::-;982:5;1023:3;1014:6;1009:3;1005:16;1001:26;998:2;;;1040:1;1037;1030:12;998:2;1062:6;1053:15;;988:86;;;;:::o;1080:139::-;1126:5;1164:6;1151:20;1142:29;;1180:33;1207:5;1180:33;:::i;:::-;1132:87;;;;:::o;1225:143::-;1282:5;1313:6;1307:13;1298:22;;1329:33;1356:5;1329:33;:::i;:::-;1288:80;;;;:::o;1374:262::-;1433:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:2;;;1498:1;1495;1488:12;1450:2;1541:1;1566:53;1611:7;1602:6;1591:9;1587:22;1566:53;:::i;:::-;1556:63;;1512:117;1440:196;;;;:::o;1642:552::-;1719:6;1727;1735;1784:2;1772:9;1763:7;1759:23;1755:32;1752:2;;;1800:1;1797;1790:12;1752:2;1843:1;1868:53;1913:7;1904:6;1893:9;1889:22;1868:53;:::i;:::-;1858:63;;1814:117;1970:2;1996:53;2041:7;2032:6;2021:9;2017:22;1996:53;:::i;:::-;1986:63;;1941:118;2098:2;2124:53;2169:7;2160:6;2149:9;2145:22;2124:53;:::i;:::-;2114:63;;2069:118;1742:452;;;;;:::o;2200:481::-;2314:6;2322;2371:2;2359:9;2350:7;2346:23;2342:32;2339:2;;;2387:1;2384;2377:12;2339:2;2458:1;2447:9;2443:17;2430:31;2488:18;2480:6;2477:30;2474:2;;;2520:1;2517;2510:12;2474:2;2556:108;2656:7;2647:6;2636:9;2632:22;2556:108;:::i;:::-;2538:126;;;;2401:273;2329:352;;;;;:::o;2687:256::-;2743:6;2792:2;2780:9;2771:7;2767:23;2763:32;2760:2;;;2808:1;2805;2798:12;2760:2;2851:1;2876:50;2918:7;2909:6;2898:9;2894:22;2876:50;:::i;:::-;2866:60;;2822:114;2750:193;;;;:::o;2949:278::-;3016:6;3065:2;3053:9;3044:7;3040:23;3036:32;3033:2;;;3081:1;3078;3071:12;3033:2;3124:1;3149:61;3202:7;3193:6;3182:9;3178:22;3149:61;:::i;:::-;3139:71;;3095:125;3023:204;;;;:::o;3233:417::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:2;;;3388:1;3385;3378:12;3340:2;3459:1;3448:9;3444:17;3431:31;3489:18;3481:6;3478:30;3475:2;;;3521:1;3518;3511:12;3475:2;3549:84;3625:7;3616:6;3605:9;3601:22;3549:84;:::i;:::-;3539:94;;3402:241;3330:320;;;;:::o;3656:262::-;3715:6;3764:2;3752:9;3743:7;3739:23;3735:32;3732:2;;;3780:1;3777;3770:12;3732:2;3823:1;3848:53;3893:7;3884:6;3873:9;3869:22;3848:53;:::i;:::-;3838:63;;3794:117;3722:196;;;;:::o;3924:284::-;3994:6;4043:2;4031:9;4022:7;4018:23;4014:32;4011:2;;;4059:1;4056;4049:12;4011:2;4102:1;4127:64;4183:7;4174:6;4163:9;4159:22;4127:64;:::i;:::-;4117:74;;4073:128;4001:207;;;;:::o;4214:179::-;4283:10;4304:46;4346:3;4338:6;4304:46;:::i;:::-;4382:4;4377:3;4373:14;4359:28;;4294:99;;;;:::o;4399:118::-;4486:24;4504:5;4486:24;:::i;:::-;4481:3;4474:37;4464:53;;:::o;4553:732::-;4672:3;4701:54;4749:5;4701:54;:::i;:::-;4771:86;4850:6;4845:3;4771:86;:::i;:::-;4764:93;;4881:56;4931:5;4881:56;:::i;:::-;4960:7;4991:1;4976:284;5001:6;4998:1;4995:13;4976:284;;;5077:6;5071:13;5104:63;5163:3;5148:13;5104:63;:::i;:::-;5097:70;;5190:60;5243:6;5190:60;:::i;:::-;5180:70;;5036:224;5023:1;5020;5016:9;5011:14;;4976:284;;;4980:14;5276:3;5269:10;;4677:608;;;;;;;:::o;5291:109::-;5372:21;5387:5;5372:21;:::i;:::-;5367:3;5360:34;5350:50;;:::o;5428:301::-;5524:3;5545:70;5608:6;5603:3;5545:70;:::i;:::-;5538:77;;5625:43;5661:6;5656:3;5649:5;5625:43;:::i;:::-;5693:29;5715:6;5693:29;:::i;:::-;5688:3;5684:39;5677:46;;5528:201;;;;;:::o;5735:373::-;5839:3;5867:38;5899:5;5867:38;:::i;:::-;5921:88;6002:6;5997:3;5921:88;:::i;:::-;5914:95;;6018:52;6063:6;6058:3;6051:4;6044:5;6040:16;6018:52;:::i;:::-;6095:6;6090:3;6086:16;6079:23;;5843:265;;;;;:::o;6114:364::-;6202:3;6230:39;6263:5;6230:39;:::i;:::-;6285:71;6349:6;6344:3;6285:71;:::i;:::-;6278:78;;6365:52;6410:6;6405:3;6398:4;6391:5;6387:16;6365:52;:::i;:::-;6442:29;6464:6;6442:29;:::i;:::-;6437:3;6433:39;6426:46;;6206:272;;;;;:::o;6484:366::-;6626:3;6647:67;6711:2;6706:3;6647:67;:::i;:::-;6640:74;;6723:93;6812:3;6723:93;:::i;:::-;6841:2;6836:3;6832:12;6825:19;;6630:220;;;:::o;6856:366::-;6998:3;7019:67;7083:2;7078:3;7019:67;:::i;:::-;7012:74;;7095:93;7184:3;7095:93;:::i;:::-;7213:2;7208:3;7204:12;7197:19;;7002:220;;;:::o;7228:366::-;7370:3;7391:67;7455:2;7450:3;7391:67;:::i;:::-;7384:74;;7467:93;7556:3;7467:93;:::i;:::-;7585:2;7580:3;7576:12;7569:19;;7374:220;;;:::o;7600:366::-;7742:3;7763:67;7827:2;7822:3;7763:67;:::i;:::-;7756:74;;7839:93;7928:3;7839:93;:::i;:::-;7957:2;7952:3;7948:12;7941:19;;7746:220;;;:::o;7972:366::-;8114:3;8135:67;8199:2;8194:3;8135:67;:::i;:::-;8128:74;;8211:93;8300:3;8211:93;:::i;:::-;8329:2;8324:3;8320:12;8313:19;;8118:220;;;:::o;8344:108::-;8421:24;8439:5;8421:24;:::i;:::-;8416:3;8409:37;8399:53;;:::o;8458:118::-;8545:24;8563:5;8545:24;:::i;:::-;8540:3;8533:37;8523:53;;:::o;8582:271::-;8712:3;8734:93;8823:3;8814:6;8734:93;:::i;:::-;8727:100;;8844:3;8837:10;;8716:137;;;;:::o;8859:222::-;8952:4;8990:2;8979:9;8975:18;8967:26;;9003:71;9071:1;9060:9;9056:17;9047:6;9003:71;:::i;:::-;8957:124;;;;:::o;9087:332::-;9208:4;9246:2;9235:9;9231:18;9223:26;;9259:71;9327:1;9316:9;9312:17;9303:6;9259:71;:::i;:::-;9340:72;9408:2;9397:9;9393:18;9384:6;9340:72;:::i;:::-;9213:206;;;;;:::o;9425:771::-;9658:4;9696:3;9685:9;9681:19;9673:27;;9710:71;9778:1;9767:9;9763:17;9754:6;9710:71;:::i;:::-;9791:72;9859:2;9848:9;9844:18;9835:6;9791:72;:::i;:::-;9873;9941:2;9930:9;9926:18;9917:6;9873:72;:::i;:::-;9955;10023:2;10012:9;10008:18;9999:6;9955:72;:::i;:::-;10075:9;10069:4;10065:20;10059:3;10048:9;10044:19;10037:49;10103:86;10184:4;10175:6;10167;10103:86;:::i;:::-;10095:94;;9663:533;;;;;;;;;:::o;10202:418::-;10339:4;10377:2;10366:9;10362:18;10354:26;;10390:71;10458:1;10447:9;10443:17;10434:6;10390:71;:::i;:::-;10471:66;10533:2;10522:9;10518:18;10509:6;10471:66;:::i;:::-;10547;10609:2;10598:9;10594:18;10585:6;10547:66;:::i;:::-;10344:276;;;;;;:::o;10626:332::-;10747:4;10785:2;10774:9;10770:18;10762:26;;10798:71;10866:1;10855:9;10851:17;10842:6;10798:71;:::i;:::-;10879:72;10947:2;10936:9;10932:18;10923:6;10879:72;:::i;:::-;10752:206;;;;;:::o;10964:373::-;11107:4;11145:2;11134:9;11130:18;11122:26;;11194:9;11188:4;11184:20;11180:1;11169:9;11165:17;11158:47;11222:108;11325:4;11316:6;11222:108;:::i;:::-;11214:116;;11112:225;;;;:::o;11343:313::-;11456:4;11494:2;11483:9;11479:18;11471:26;;11543:9;11537:4;11533:20;11529:1;11518:9;11514:17;11507:47;11571:78;11644:4;11635:6;11571:78;:::i;:::-;11563:86;;11461:195;;;;:::o;11662:419::-;11828:4;11866:2;11855:9;11851:18;11843:26;;11915:9;11909:4;11905:20;11901:1;11890:9;11886:17;11879:47;11943:131;12069:4;11943:131;:::i;:::-;11935:139;;11833:248;;;:::o;12087:419::-;12253:4;12291:2;12280:9;12276:18;12268:26;;12340:9;12334:4;12330:20;12326:1;12315:9;12311:17;12304:47;12368:131;12494:4;12368:131;:::i;:::-;12360:139;;12258:248;;;:::o;12512:419::-;12678:4;12716:2;12705:9;12701:18;12693:26;;12765:9;12759:4;12755:20;12751:1;12740:9;12736:17;12729:47;12793:131;12919:4;12793:131;:::i;:::-;12785:139;;12683:248;;;:::o;12937:419::-;13103:4;13141:2;13130:9;13126:18;13118:26;;13190:9;13184:4;13180:20;13176:1;13165:9;13161:17;13154:47;13218:131;13344:4;13218:131;:::i;:::-;13210:139;;13108:248;;;:::o;13362:419::-;13528:4;13566:2;13555:9;13551:18;13543:26;;13615:9;13609:4;13605:20;13601:1;13590:9;13586:17;13579:47;13643:131;13769:4;13643:131;:::i;:::-;13635:139;;13533:248;;;:::o;13787:222::-;13880:4;13918:2;13907:9;13903:18;13895:26;;13931:71;13999:1;13988:9;13984:17;13975:6;13931:71;:::i;:::-;13885:124;;;;:::o;14015:882::-;14276:4;14314:3;14303:9;14299:19;14291:27;;14328:71;14396:1;14385:9;14381:17;14372:6;14328:71;:::i;:::-;14409:72;14477:2;14466:9;14462:18;14453:6;14409:72;:::i;:::-;14491;14559:2;14548:9;14544:18;14535:6;14491:72;:::i;:::-;14573;14641:2;14630:9;14626:18;14617:6;14573:72;:::i;:::-;14655:73;14723:3;14712:9;14708:19;14699:6;14655:73;:::i;:::-;14776:9;14770:4;14766:20;14760:3;14749:9;14745:19;14738:49;14804:86;14885:4;14876:6;14868;14804:86;:::i;:::-;14796:94;;14281:616;;;;;;;;;;:::o;14903:529::-;15068:4;15106:3;15095:9;15091:19;15083:27;;15120:71;15188:1;15177:9;15173:17;15164:6;15120:71;:::i;:::-;15201:72;15269:2;15258:9;15254:18;15245:6;15201:72;:::i;:::-;15283:66;15345:2;15334:9;15330:18;15321:6;15283:66;:::i;:::-;15359;15421:2;15410:9;15406:18;15397:6;15359:66;:::i;:::-;15073:359;;;;;;;:::o;15438:442::-;15587:4;15625:2;15614:9;15610:18;15602:26;;15638:71;15706:1;15695:9;15691:17;15682:6;15638:71;:::i;:::-;15719:72;15787:2;15776:9;15772:18;15763:6;15719:72;:::i;:::-;15801;15869:2;15858:9;15854:18;15845:6;15801:72;:::i;:::-;15592:288;;;;;;:::o;15886:523::-;15963:4;15969:6;16025:11;16012:25;16125:1;16119:4;16115:12;16104:8;16088:14;16084:29;16080:48;16060:18;16056:73;16046:2;;16143:1;16140;16133:12;16046:2;16178:18;16168:8;16164:33;16156:41;;16230:4;16217:18;16207:28;;16258:18;16250:6;16247:30;16244:2;;;16290:1;16287;16280:12;16244:2;16321;16315:4;16311:13;16303:21;;16378:4;16370:6;16366:17;16350:14;16346:38;16340:4;16336:49;16333:2;;;16398:1;16395;16388:12;16333:2;15976:433;;;;;;:::o;16415:332::-;16514:4;16568:11;16555:25;16668:1;16662:4;16658:12;16647:8;16631:14;16627:29;16623:48;16603:18;16599:73;16589:2;;16686:1;16683;16676:12;16589:2;16721:18;16711:8;16707:33;16699:41;;16519:228;;;;;:::o;16753:336::-;16856:4;16910:11;16897:25;17010:1;17004:4;17000:12;16989:8;16973:14;16969:29;16965:48;16945:18;16941:73;16931:2;;17028:1;17025;17018:12;16931:2;17063:18;17053:8;17049:33;17041:41;;16861:228;;;;;:::o;17095:132::-;17162:4;17185:3;17177:11;;17215:4;17210:3;17206:14;17198:22;;17167:60;;;:::o;17233:114::-;17300:6;17334:5;17328:12;17318:22;;17307:40;;;:::o;17353:98::-;17404:6;17438:5;17432:12;17422:22;;17411:40;;;:::o;17457:99::-;17509:6;17543:5;17537:12;17527:22;;17516:40;;;:::o;17562:113::-;17632:4;17664;17659:3;17655:14;17647:22;;17637:38;;;:::o;17681:184::-;17780:11;17814:6;17809:3;17802:19;17854:4;17849:3;17845:14;17830:29;;17792:73;;;;:::o;17871:168::-;17954:11;17988:6;17983:3;17976:19;18028:4;18023:3;18019:14;18004:29;;17966:73;;;;:::o;18045:147::-;18146:11;18183:3;18168:18;;18158:34;;;;:::o;18198:169::-;18282:11;18316:6;18311:3;18304:19;18356:4;18351:3;18347:14;18332:29;;18294:73;;;;:::o;18373:305::-;18413:3;18432:20;18450:1;18432:20;:::i;:::-;18427:25;;18466:20;18484:1;18466:20;:::i;:::-;18461:25;;18620:1;18552:66;18548:74;18545:1;18542:81;18539:2;;;18626:18;;:::i;:::-;18539:2;18670:1;18667;18663:9;18656:16;;18417:261;;;;:::o;18684:191::-;18724:4;18744:20;18762:1;18744:20;:::i;:::-;18739:25;;18778:20;18796:1;18778:20;:::i;:::-;18773:25;;18817:1;18814;18811:8;18808:2;;;18822:18;;:::i;:::-;18808:2;18867:1;18864;18860:9;18852:17;;18729:146;;;;:::o;18881:96::-;18918:7;18947:24;18965:5;18947:24;:::i;:::-;18936:35;;18926:51;;;:::o;18983:90::-;19017:7;19060:5;19053:13;19046:21;19035:32;;19025:48;;;:::o;19079:126::-;19116:7;19156:42;19149:5;19145:54;19134:65;;19124:81;;;:::o;19211:77::-;19248:7;19277:5;19266:16;;19256:32;;;:::o;19294:126::-;19344:9;19377:37;19408:5;19377:37;:::i;:::-;19364:50;;19354:66;;;:::o;19426:104::-;19470:9;19503:21;19518:5;19503:21;:::i;:::-;19490:34;;19480:50;;;:::o;19536:126::-;19586:9;19619:37;19650:5;19619:37;:::i;:::-;19606:50;;19596:66;;;:::o;19668:113::-;19718:9;19751:24;19769:5;19751:24;:::i;:::-;19738:37;;19728:53;;;:::o;19787:154::-;19871:6;19866:3;19861;19848:30;19933:1;19924:6;19919:3;19915:16;19908:27;19838:103;;;:::o;19947:307::-;20015:1;20025:113;20039:6;20036:1;20033:13;20025:113;;;20124:1;20119:3;20115:11;20109:18;20105:1;20100:3;20096:11;20089:39;20061:2;20058:1;20054:10;20049:15;;20025:113;;;20156:6;20153:1;20150:13;20147:2;;;20236:1;20227:6;20222:3;20218:16;20211:27;20147:2;19996:258;;;;:::o;20260:1129::-;20438:1;20432:4;20428:12;20484:1;20477:5;20473:13;20534:12;20577:42;20605:13;20577:42;:::i;:::-;20560:59;;20633:78;20697:13;20685:10;20633:78;:::i;:::-;20395:327;;;20775:1;20769:4;20765:12;20821:2;20814:5;20810:14;20872:12;20915:39;20940:13;20915:39;:::i;:::-;20898:56;;20968:73;21027:13;21015:10;20968:73;:::i;:::-;20732:320;;;21105:1;21099:4;21095:12;21151:2;21144:5;21140:14;21202:12;21245:39;21270:13;21245:39;:::i;:::-;21228:56;;21298:73;21357:13;21345:10;21298:73;:::i;:::-;21062:320;;;20384:1005;;:::o;21395:233::-;21434:3;21457:24;21475:5;21457:24;:::i;:::-;21448:33;;21503:66;21496:5;21493:77;21490:2;;;21573:18;;:::i;:::-;21490:2;21620:1;21613:5;21609:13;21602:20;;21438:190;;;:::o;21820:180::-;21868:77;21865:1;21858:88;21965:4;21962:1;21955:15;21989:4;21986:1;21979:15;22006:75;22049:3;22070:5;22063:12;;22053:28;;;:::o;22087:72::-;22127:3;22148:5;22141:12;;22131:28;;;:::o;22165:186::-;22210:11;22259:3;22246:17;22272:33;22299:5;22272:33;:::i;:::-;22339:5;22315:29;;22222:129;;;;:::o;22357:180::-;22399:11;22448:3;22435:17;22461:30;22485:5;22461:30;:::i;:::-;22525:5;22501:29;;22411:126;;;;:::o;22543:102::-;22584:6;22635:2;22631:7;22626:2;22619:5;22615:14;22611:28;22601:38;;22591:54;;;:::o;22651:92::-;22683:8;22730:5;22727:1;22723:13;22702:34;;22692:51;;;:::o;22749:96::-;22783:8;22832:5;22827:3;22823:15;22802:36;;22792:53;;;:::o;22851:96::-;22885:8;22934:5;22929:3;22925:15;22904:36;;22894:53;;;:::o;22953:225::-;23093:34;23089:1;23081:6;23077:14;23070:58;23162:8;23157:2;23149:6;23145:15;23138:33;23059:119;:::o;23184:225::-;23324:34;23320:1;23312:6;23308:14;23301:58;23393:8;23388:2;23380:6;23376:15;23369:33;23290:119;:::o;23415:182::-;23555:34;23551:1;23543:6;23539:14;23532:58;23521:76;:::o;23603:179::-;23743:31;23739:1;23731:6;23727:14;23720:55;23709:73;:::o;23788:229::-;23928:34;23924:1;23916:6;23912:14;23905:58;23997:12;23992:2;23984:6;23980:15;23973:37;23894:123;:::o;24023:270::-;24081:6;24110:44;24175:24;24190:8;24175:24;:::i;:::-;24163:36;;24232:4;24228:9;24221:5;24217:21;24208:30;;24281:4;24271:8;24267:19;24260:5;24257:30;24247:40;;24088:205;;;;;:::o;24299:272::-;24357:6;24386:46;24453:24;24468:8;24453:24;:::i;:::-;24441:36;;24510:4;24506:9;24499:5;24495:21;24486:30;;24559:4;24549:8;24545:19;24538:5;24535:30;24525:40;;24364:207;;;;;:::o;24577:266::-;24635:6;24664:42;24727:22;24740:8;24727:22;:::i;:::-;24715:34;;24782:4;24778:9;24771:5;24767:21;24758:30;;24831:4;24821:8;24817:19;24810:5;24807:30;24797:40;;24642:201;;;;;:::o;24849:262::-;24959:39;24990:7;24959:39;:::i;:::-;25020:84;25062:41;25086:16;25062:41;:::i;:::-;25055:4;25049:11;25020:84;:::i;:::-;25014:4;25007:98;24925:186;;;:::o;25117:260::-;25255:116;25363:7;25357:4;25255:116;:::i;:::-;25244:133;;:::o;25383:248::-;25488:33;25513:7;25488:33;:::i;:::-;25543:81;25585:38;25606:16;25585:38;:::i;:::-;25578:4;25572:11;25543:81;:::i;:::-;25537:4;25530:95;25454:177;;;:::o;25637:248::-;25742:33;25767:7;25742:33;:::i;:::-;25797:81;25839:38;25860:16;25839:38;:::i;:::-;25832:4;25826:11;25797:81;:::i;:::-;25791:4;25784:95;25708:177;;;:::o;25891:122::-;25964:24;25982:5;25964:24;:::i;:::-;25957:5;25954:35;25944:2;;26003:1;26000;25993:12;25944:2;25934:79;:::o;26019:116::-;26089:21;26104:5;26089:21;:::i;:::-;26082:5;26079:32;26069:2;;26125:1;26122;26115:12;26069:2;26059:76;:::o;26141:122::-;26214:24;26232:5;26214:24;:::i;:::-;26207:5;26204:35;26194:2;;26253:1;26250;26243:12;26194:2;26184:79;:::o
Swarm Source
ipfs://55132b0eac132f0198f3faee092cff0f5a8216f1532f7a38897e892a826f9efd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.