Source Code
Overview
MOVR Balance
MOVR Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 14141218 | 61 days ago | 1.68012155 MOVR | ||||
| 12701517 | 173 days ago | 16.65 MOVR | ||||
| 10017597 | 372 days ago | 6 MOVR | ||||
| 8851630 | 455 days ago | 3.52963316 MOVR | ||||
| 8851435 | 455 days ago | 2.61513708 MOVR | ||||
| 8851263 | 455 days ago | 0.88422213 MOVR | ||||
| 8568030 | 475 days ago | 9 MOVR | ||||
| 7353117 | 563 days ago | 3.52984348 MOVR | ||||
| 6716595 | 631 days ago | 5.85206867 MOVR | ||||
| 6275863 | 696 days ago | 5.62369583 MOVR | ||||
| 6217336 | 705 days ago | 1 MOVR | ||||
| 6146745 | 716 days ago | 5.77211599 MOVR | ||||
| 6137948 | 717 days ago | 2.2 MOVR | ||||
| 6000248 | 739 days ago | 0.1005401 MOVR | ||||
| 5930042 | 749 days ago | 1.1 MOVR | ||||
| 5875529 | 757 days ago | 1.7 MOVR | ||||
| 5874489 | 757 days ago | 4.69612127 MOVR | ||||
| 5867409 | 758 days ago | 4.20273229 MOVR | ||||
| 5838011 | 763 days ago | 3.51464472 MOVR | ||||
| 5834560 | 763 days ago | 6.94315385 MOVR | ||||
| 5824281 | 765 days ago | 0.3 MOVR | ||||
| 5812097 | 766 days ago | 1 MOVR | ||||
| 5802374 | 768 days ago | 5 MOVR | ||||
| 5802003 | 768 days ago | 8 MOVR | ||||
| 5799673 | 768 days ago | 13.01006275 MOVR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ERC20HandlerUpgradeable
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/**
*Submitted for verification at moonriver.moonscan.io on 2022-10-07
*/
// Sources flattened with hardhat v2.9.3 https://hardhat.org
// File contracts/interfaces/IDepositExecute.sol
pragma solidity 0.8.11;
/**
@title Interface for handler contracts that support deposits and deposit executions.
@author ChainSafe Systems.
*/
interface IDepositExecute {
/**
@notice It is intended that deposit are made using the Bridge contract.
@param resourceID ResourceID used to find address of token to be used for deposit.
@param depositor Address of account making the deposit in the Bridge contract.
@param data Consists of additional data needed for a specific deposit.
*/
function deposit(
bytes32 resourceID,
address depositor,
bytes calldata data
) external payable returns (bytes memory);
/**
@notice It is intended that proposals are executed by the Bridge contract.
@param resourceID ResourceID used to find address of token to be used for deposit.
@param data Consists of additional data needed for a specific deposit execution.
*/
function executeProposal(bytes32 resourceID, bytes calldata data) external;
}
// File contracts/interfaces/IERCHandler.sol
pragma solidity 0.8.11;
/**
@title Interface to be used with handlers that support ERC20s and ERC721s.
@author ChainSafe Systems.
*/
interface IERCHandler {
/**
@notice Correlates {resourceID} with {contractAddress}.
@param resourceID ResourceID to be used when making deposits.
@param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function setResource(bytes32 resourceID, address contractAddress) external;
function removeResource(bytes32 resourceID, address contractAddress) external;
/**
@notice Marks {contractAddress} as mintable/burnable.
@param contractAddress Address of contract to be used when making or executing deposits.
*/
function setBurnable(address contractAddress) external;
/**
@notice Withdraw funds from ERC safes.
@param data ABI-encoded withdrawal params relevant to the handler.
*/
function withdraw(bytes memory data) external;
function withdrawETH(bytes memory data) external;
/**
@notice Exposing getter for {_resourceIDToTokenContractAddress}.
@param resourceID ResourceID to be used.
@return address The {tokenContractAddress} that is currently set for the resourceID.
*/
function _resourceIDToTokenContractAddress(bytes32 resourceID)
external
view
returns (address);
function setNative(address nativeAddress,bool _isNative) external;
}
// File @openzeppelin/contracts-upgradeable/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original
* initialization step. This is essential to configure modules that are added through upgrades and that require
* initialization.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized < type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
}
// File contracts/handlers/HandlerHelpersUpgradeable.sol
pragma solidity 0.8.11;
/**
@title Function used across handler contracts.
@author ChainSafe Systems.
@notice This contract is intended to be used with the Bridge contract.
*/
contract HandlerHelpersUpgradeable is IERCHandler, Initializable {
address public _bridgeAddress;
// resourceID => token contract address
mapping(bytes32 => address) public _resourceIDToTokenContractAddress;
// token contract address => resourceID
mapping(address => bytes32) public _tokenContractAddressToResourceID;
// token contract address => is whitelisted
mapping(address => bool) public _contractWhitelist;
// token contract address => is burnable
mapping(address => bool) public _burnList;
// native => bool
mapping(address => bool) public isNative;
modifier onlyBridge() {
_onlyBridge();
_;
}
/**
@param bridgeAddress Contract address of previously deployed Bridge.
*/
function __HandlerHelpers_init(address bridgeAddress) internal initializer {
_bridgeAddress = bridgeAddress;
}
function _onlyBridge() private view {
require(msg.sender == _bridgeAddress, "sender must be bridge contract");
}
/**
@notice First verifies {_resourceIDToContractAddress}[{resourceID}] and
{_contractAddressToResourceID}[{contractAddress}] are not already set,
then sets {_resourceIDToContractAddress} with {contractAddress},
{_contractAddressToResourceID} with {resourceID},
and {_contractWhitelist} to true for {contractAddress}.
@param resourceID ResourceID to be used when making deposits.
@param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function setResource(bytes32 resourceID, address contractAddress)
external
override
onlyBridge
{
_setResource(resourceID, contractAddress);
}
function removeResource(bytes32 resourceID, address contractAddress)
external
override
onlyBridge
{
_removeResource(resourceID, contractAddress);
}
/**
@notice First verifies {contractAddress} is whitelisted, then sets {_burnList}[{contractAddress}]
to true.
@param contractAddress Address of contract to be used when making or executing deposits.
*/
function setBurnable(address contractAddress) external override onlyBridge {
_setBurnable(contractAddress);
}
function withdraw(bytes memory data) external virtual override {}
function withdrawETH(bytes memory data) external virtual override {}
function _setResource(bytes32 resourceID, address contractAddress)
internal
{
_resourceIDToTokenContractAddress[resourceID] = contractAddress;
_tokenContractAddressToResourceID[contractAddress] = resourceID;
_contractWhitelist[contractAddress] = true;
}
function _removeResource(bytes32 resourceID, address contractAddress)
internal
{
delete _resourceIDToTokenContractAddress[resourceID];
delete _tokenContractAddressToResourceID[contractAddress];
delete _contractWhitelist[contractAddress];
}
function _setBurnable(address contractAddress) internal {
require(
_contractWhitelist[contractAddress],
"provided contract is not whitelisted"
);
_burnList[contractAddress] = true;
}
function setNative(address nativeAddress, bool _isNative)
external
override
onlyBridge
{
isNative[nativeAddress] = _isNative;
}
}
// File @openzeppelin/contracts/utils/math/[email protected]
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
// File @openzeppelin/contracts/token/ERC20/[email protected]
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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 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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from,
address to,
uint256 amount
) external returns (bool);
}
// File contracts/interfaces/IWETH.sol
pragma solidity >=0.6.4;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
function approve(address spender, uint256 amount) external returns (bool);
}
// File contracts/interfaces/IERCMintBurn.sol
pragma solidity 0.8.11;
interface IERCMintBurn {
/// @dev IERC20 burnFrom
function burnFrom(address, uint256) external;
/// @dev ERC20 & ERC721 burn
function burn(uint256) external;
/// @dev ERC1155 burn
function burn(
address,
uint256,
uint256
) external;
/// @dev ERC1155 burnBatch
function burnBatch(
address,
uint256[] calldata,
uint256[] calldata
) external;
/// @dev ERC20 Mint
function mint(address, uint256) external;
/// @dev ERC721 Mint
function mint(
address,
uint256,
string calldata
) external;
/// @dev ERC1155 Mint
function mint(
address,
uint256,
uint256,
bytes calldata
) external;
/// @dev ERC1155 mintBatch
function mintBatch(
address,
uint256[] calldata,
uint256[] calldata,
bytes calldata
) external;
}
// File contracts/ERC20Safe.sol
pragma solidity 0.8.11;
/**
@title Manages deposited ERC20s.
@author ChainSafe Systems.
@notice This contract is intended to be used with ERC20Handler contract.
*/
contract ERC20Safe {
using SafeMath for uint256;
uint256 public ETHReserve;
/**
@notice Used to gain custody of deposited token.
@param tokenAddress Address of ERC20 to transfer.
@param owner Address of current token owner.
@param recipient Address to transfer tokens to.
@param amount Amount of tokens to transfer.
*/
function lockERC20(
address tokenAddress,
address owner,
address recipient,
uint256 amount
) internal {
IERC20 erc20 = IERC20(tokenAddress);
_safeTransferFrom(erc20, owner, recipient, amount);
}
/**
@notice Transfers custody of token to recipient.
@param tokenAddress Address of ERC20 to transfer.
@param recipient Address to transfer tokens to.
@param amount Amount of tokens to transfer.
*/
function releaseERC20(
address tokenAddress,
address recipient,
uint256 amount
) internal {
IERC20 erc20 = IERC20(tokenAddress);
_safeTransfer(erc20, recipient, amount);
}
function depositETH(uint256 amount) internal {
require(amount == msg.value, "msg.value and data mismatched");
require(
address(this).balance >= ETHReserve + amount,
"ETHReserve mismatched"
);
ETHReserve = address(this).balance;
}
function withdrawETH(address recipient, uint256 amount) internal {
uint256 balanceBefore = address(this).balance;
_safeTransferETH(recipient, amount);
require(
address(this).balance == balanceBefore - amount,
"ERC20: withdraw fail!"
);
ETHReserve = address(this).balance;
}
/**
@notice Used to create new ERC20s.
@param tokenAddress Address of ERC20 to transfer.
@param recipient Address to mint token to.
@param amount Amount of token to mint.
*/
function mintERC20(
address tokenAddress,
address recipient,
uint256 amount
) internal {
IERCMintBurn erc20 = IERCMintBurn(tokenAddress);
erc20.mint(recipient, amount);
}
/**
@notice Used to burn ERC20s.
@param tokenAddress Address of ERC20 to burn.
@param owner Current owner of tokens.
@param amount Amount of tokens to burn.
*/
function burnERC20(
address tokenAddress,
address owner,
uint256 amount
) internal {
IERCMintBurn erc20 = IERCMintBurn(tokenAddress);
erc20.burnFrom(owner, amount);
}
/**
@notice used to transfer ERC20s safely
@param token Token instance to transfer
@param to Address to transfer token to
@param value Amount of token to transfer
*/
function _safeTransfer(
IERC20 token,
address to,
uint256 value
) private {
_safeCall(
token,
abi.encodeWithSelector(token.transfer.selector, to, value)
);
}
function _safeTransferETH(address to, uint256 value) private {
(bool success, ) = to.call{value: value}(new bytes(0));
require(
success,
"TransferHelper::safeTransferETH: ETH transfer failed"
);
}
/**
@notice used to transfer ERC20s safely
@param token Token instance to transfer
@param from Address to transfer token from
@param to Address to transfer token to
@param value Amount of token to transfer
*/
function _safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) private {
_safeCall(
token,
abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
);
}
/**
@notice used to make calls to ERC20s safely
@param token Token instance call targets
@param data encoded call data
*/
function _safeCall(IERC20 token, bytes memory data) private {
uint256 tokenSize;
assembly {
tokenSize := extcodesize(token)
}
require(tokenSize > 0, "ERC20: not a contract");
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "ERC20: call failed");
if (returndata.length > 0) {
require(
abi.decode(returndata, (bool)),
"ERC20: operation did not succeed"
);
}
}
}
// File contracts/handlers/ERC20HandlerUpgradeable.sol
pragma solidity 0.8.11;
pragma experimental ABIEncoderV2;
/**
@title Handles ERC20 deposits and deposit executions.
@author ChainSafe Systems.
@notice This contract is intended to be used with the Bridge contract.
*/
contract ERC20HandlerUpgradeable is IDepositExecute, HandlerHelpersUpgradeable, ERC20Safe {
/**
@param bridgeAddress Contract address of previously deployed Bridge.
*/
function initialize(address bridgeAddress) public initializer {
__HandlerHelpers_init(bridgeAddress);
}
error ProvidedTokenAddressIsNotWhitelisted();
receive() external payable {}
/**
@notice A deposit is initiated by making a deposit in the Bridge contract.
@param resourceID ResourceID used to find address of token to be used for deposit.
@param depositor Address of account making the deposit in the Bridge contract.
@param data Consists of {amount} padded to 32 bytes.
@notice Data passed into the function should be constructed as follows:
amount uint256 bytes 0 - 32
@dev Depending if the corresponding {tokenAddress} for the parsed {resourceID} is
marked true in {_burnList}, deposited tokens will be burned, if not, they will be locked.
@return an empty data.
*/
function deposit(
bytes32 resourceID,
address depositor,
bytes calldata data
) external payable override onlyBridge returns (bytes memory) {
uint256 amount;
(amount) = abi.decode(data, (uint256));
address tokenAddress = _resourceIDToTokenContractAddress[resourceID];
if (!_contractWhitelist[tokenAddress]) {
revert ProvidedTokenAddressIsNotWhitelisted();
}
if (_burnList[tokenAddress]) {
burnERC20(tokenAddress, depositor, amount);
} else if (isNative[tokenAddress]) {
depositETH(amount);
} else {
lockERC20(tokenAddress, depositor, address(this), amount);
}
return new bytes(0);
}
/**
@notice Proposal execution should be initiated when a proposal is finalized in the Bridge contract.
by a relayer on the deposit's destination chain.
@param data Consists of {resourceID}, {amount}, {lenDestinationRecipientAddress},
and {destinationRecipientAddress} all padded to 32 bytes.
@notice Data passed into the function should be constructed as follows:
amount uint256 bytes 0 - 32
destinationRecipientAddress length uint256 bytes 32 - 64
destinationRecipientAddress bytes bytes 64 - END
*/
function executeProposal(bytes32 resourceID, bytes calldata data)
external
override
onlyBridge
{
uint256 amount;
uint256 lenDestinationRecipientAddress;
bytes memory destinationRecipientAddress;
(amount, lenDestinationRecipientAddress) = abi.decode(
data,
(uint256, uint256)
);
destinationRecipientAddress = bytes(
data[64:64 + lenDestinationRecipientAddress]
);
bytes20 recipientAddress;
address tokenAddress = _resourceIDToTokenContractAddress[resourceID];
assembly {
recipientAddress := mload(add(destinationRecipientAddress, 0x20))
}
require(
_contractWhitelist[tokenAddress],
"provided tokenAddress is not whitelisted"
);
if (_burnList[tokenAddress]) {
mintERC20(tokenAddress, address(recipientAddress), amount);
} else if (isNative[tokenAddress]) {
withdrawETH(address(recipientAddress), amount);
} else {
releaseERC20(tokenAddress, address(recipientAddress), amount);
}
}
/**
@notice Used to manually release ERC20 tokens from ERC20Safe.
@param data Consists of {tokenAddress}, {recipient}, and {amount} all padded to 32 bytes.
@notice Data passed into the function should be constructed as follows:
tokenAddress address bytes 0 - 32
recipient address bytes 32 - 64
amount uint bytes 64 - 96
*/
function withdraw(bytes memory data) external override onlyBridge {
address tokenAddress;
address recipient;
uint256 amount;
(tokenAddress, recipient, amount) = abi.decode(
data,
(address, address, uint256)
);
releaseERC20(tokenAddress, recipient, amount);
}
/**
@notice Used to manually release ETH ERC20Safe.
@param data Consists of {recipient}, and {amount} all padded to 32 bytes.
@notice Data passed into the function should be constructed as follows:
recipient address bytes 0 - 32
amount uint bytes 32 - 64
*/
function withdrawETH(bytes memory data) external override onlyBridge {
address recipient;
uint256 amount;
(recipient, amount) = abi.decode(data, (address, uint256));
withdrawETH(recipient, amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"ProvidedTokenAddressIsNotWhitelisted","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"inputs":[],"name":"ETHReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_bridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_burnList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_contractWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"_resourceIDToTokenContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_tokenContractAddressToResourceID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"address","name":"depositor","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"deposit","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bridgeAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"removeResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setBurnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nativeAddress","type":"address"},{"internalType":"bool","name":"_isNative","type":"bool"}],"name":"setNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561001057600080fd5b5061131a806100206000396000f3fe6080604052600436106100f75760003560e01c8063ab5c7bf11161008a578063c4d66de811610059578063c4d66de8146102fe578063c8ba6c871461031e578063ddafda4614610359578063e248cff21461036f57600080fd5b8063ab5c7bf11461026e578063b07e54bb1461028e578063b2b8b5dd146102ae578063b8fa3736146102de57600080fd5b80636a70d081116100c65780636a70d081146101be578063789d7711146101fe5780637f79bea81461021e578063a98157511461024e57600080fd5b806307b7ed99146101035780630968f264146101255780630a6d55d814610145578063318c136e1461019857600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004610e9b565b61038f565b005b34801561013157600080fd5b50610123610140366004610ed5565b6103a3565b34801561015157600080fd5b5061017b610160366004610f86565b6001602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101a457600080fd5b5060005461017b906201000090046001600160a01b031681565b3480156101ca57600080fd5b506101ee6101d9366004610e9b565b60046020526000908152604090205460ff1681565b604051901515815260200161018f565b34801561020a57600080fd5b50610123610219366004610fad565b6103dc565b34801561022a57600080fd5b506101ee610239366004610e9b565b60036020526000908152604090205460ff1681565b34801561025a57600080fd5b50610123610269366004610fe6565b61040f565b34801561027a57600080fd5b50610123610289366004610ed5565b610462565b6102a161029c366004611054565b610495565b60405161018f91906110dc565b3480156102ba57600080fd5b506101ee6102c9366004610e9b565b60056020526000908152604090205460ff1681565b3480156102ea57600080fd5b506101236102f9366004610fe6565b610579565b34801561030a57600080fd5b50610123610319366004610e9b565b6105d1565b34801561032a57600080fd5b5061034b610339366004610e9b565b60026020526000908152604090205481565b60405190815260200161018f565b34801561036557600080fd5b5061034b60065481565b34801561037b57600080fd5b5061012361038a36600461110f565b6106a6565b61039761081f565b6103a081610881565b50565b6103ab61081f565b6000806000838060200190518101906103c4919061115b565b919450925090506103d6838383610919565b50505050565b6103e461081f565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b61041761081f565b600091825260016020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260028152818320839055600390529020805460ff19169055565b5050565b61046a61081f565b60008082806020019051810190610481919061119e565b90925090506104908282610925565b505050565b606061049f61081f565b60006104ad83850185610f86565b6000878152600160209081526040808320546001600160a01b03168084526003909252909120549192509060ff166104f857604051631556d7e160e11b815260040160405180910390fd5b6001600160a01b03811660009081526004602052604090205460ff161561052957610524818784610989565b61055f565b6001600160a01b03811660009081526005602052604090205460ff161561055357610524826109eb565b61055f81873085610a96565b505060408051600081526020810190915295945050505050565b61058161081f565b600082815260016020818152604080842080546001600160a01b0319166001600160a01b0387169081179091558452600282528084208690556003909152909120805460ff191690911790555050565b600054610100900460ff16158080156105f15750600054600160ff909116105b8061060b5750303b15801561060b575060005460ff166001145b6106305760405162461bcd60e51b8152600401610627906111cc565b60405180910390fd5b6000805460ff191660011790558015610653576000805461ff0019166101001790555b61065c82610aaa565b801561045e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b6106ae61081f565b60008060606106bf8486018661121a565b9093509150846040856106d28583611252565b926106df9392919061126a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508a815260016020908152604080832054828801516001600160a01b039091168085526003909352922054959650909490935060ff1691506107a590505760405162461bcd60e51b815260206004820152602860248201527f70726f766964656420746f6b656e41646472657373206973206e6f74207768696044820152671d195b1a5cdd195960c21b6064820152608401610627565b6001600160a01b03811660009081526004602052604090205460ff16156107d9576107d4818360601c87610b87565b610815565b6001600160a01b03811660009081526005602052604090205460ff1615610807576107d48260601c86610925565b610815818360601c87610919565b5050505050505050565b6000546201000090046001600160a01b0316331461087f5760405162461bcd60e51b815260206004820152601e60248201527f73656e646572206d7573742062652062726964676520636f6e747261637400006044820152606401610627565b565b6001600160a01b03811660009081526003602052604090205460ff166108f55760405162461bcd60e51b8152602060048201526024808201527f70726f766964656420636f6e7472616374206973206e6f742077686974656c696044820152631cdd195960e21b6064820152608401610627565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b826103d6818484610bbf565b476109308383610c22565b61093a8282611294565b47146109805760405162461bcd60e51b815260206004820152601560248201527445524332303a207769746864726177206661696c2160581b6044820152606401610627565b50504760065550565b60405163079cc67960e41b81526001600160a01b038381166004830152602482018390528491908216906379cc6790906044015b600060405180830381600087803b1580156109d757600080fd5b505af1158015610815573d6000803e3d6000fd5b348114610a3a5760405162461bcd60e51b815260206004820152601d60248201527f6d73672e76616c756520616e642064617461206d69736d6174636865640000006044820152606401610627565b80600654610a489190611252565b471015610a8f5760405162461bcd60e51b815260206004820152601560248201527411551214995cd95c9d99481b5a5cdb585d18da1959605a1b6044820152606401610627565b5047600655565b83610aa381858585610cfc565b5050505050565b600054610100900460ff1615808015610aca5750600054600160ff909116105b80610ae45750303b158015610ae4575060005460ff166001145b610b005760405162461bcd60e51b8152600401610627906111cc565b6000805460ff191660011790558015610b23576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b03851602179055801561045e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200161069a565b6040516340c10f1960e01b81526001600160a01b038381166004830152602482018390528491908216906340c10f19906044016109bd565b6040516001600160a01b03831660248201526044810182905261049090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610d34565b604080516000808252602082019092526001600160a01b038416908390604051610c4c91906112ab565b60006040518083038185875af1925050503d8060008114610c89576040519150601f19603f3d011682016040523d82523d6000602084013e610c8e565b606091505b50509050806104905760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b6064820152608401610627565b6040516001600160a01b03808516602483015283166044820152606481018290526103d69085906323b872dd60e01b90608401610beb565b813b80610d7b5760405162461bcd60e51b8152602060048201526015602482015274115490cc8c0e881b9bdd08184818dbdb9d1c9858dd605a1b6044820152606401610627565b600080846001600160a01b031684604051610d9691906112ab565b6000604051808303816000865af19150503d8060008114610dd3576040519150601f19603f3d011682016040523d82523d6000602084013e610dd8565b606091505b509150915081610e1f5760405162461bcd60e51b8152602060048201526012602482015271115490cc8c0e8818d85b1b0819985a5b195960721b6044820152606401610627565b805115610aa35780806020019051810190610e3a91906112c7565b610aa35760405162461bcd60e51b815260206004820181905260248201527f45524332303a206f7065726174696f6e20646964206e6f7420737563636565646044820152606401610627565b6001600160a01b03811681146103a057600080fd5b600060208284031215610ead57600080fd5b8135610eb881610e86565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610ee757600080fd5b813567ffffffffffffffff80821115610eff57600080fd5b818401915084601f830112610f1357600080fd5b813581811115610f2557610f25610ebf565b604051601f8201601f19908116603f01168101908382118183101715610f4d57610f4d610ebf565b81604052828152876020848701011115610f6657600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610f9857600080fd5b5035919050565b80151581146103a057600080fd5b60008060408385031215610fc057600080fd5b8235610fcb81610e86565b91506020830135610fdb81610f9f565b809150509250929050565b60008060408385031215610ff957600080fd5b823591506020830135610fdb81610e86565b60008083601f84011261101d57600080fd5b50813567ffffffffffffffff81111561103557600080fd5b60208301915083602082850101111561104d57600080fd5b9250929050565b6000806000806060858703121561106a57600080fd5b84359350602085013561107c81610e86565b9250604085013567ffffffffffffffff81111561109857600080fd5b6110a48782880161100b565b95989497509550505050565b60005b838110156110cb5781810151838201526020016110b3565b838111156103d65750506000910152565b60208152600082518060208401526110fb8160408501602087016110b0565b601f01601f19169190910160400192915050565b60008060006040848603121561112457600080fd5b83359250602084013567ffffffffffffffff81111561114257600080fd5b61114e8682870161100b565b9497909650939450505050565b60008060006060848603121561117057600080fd5b835161117b81610e86565b602085015190935061118c81610e86565b80925050604084015190509250925092565b600080604083850312156111b157600080fd5b82516111bc81610e86565b6020939093015192949293505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000806040838503121561122d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b600082198211156112655761126561123c565b500190565b6000808585111561127a57600080fd5b8386111561128757600080fd5b5050820193919092039150565b6000828210156112a6576112a661123c565b500390565b600082516112bd8184602087016110b0565b9190910192915050565b6000602082840312156112d957600080fd5b8151610eb881610f9f56fea2646970667358221220792be827825784fccc88fece5c8d585e3c843794f7bc37c86765d7c430f6e78a64736f6c634300080b0033
Deployed Bytecode
0x6080604052600436106100f75760003560e01c8063ab5c7bf11161008a578063c4d66de811610059578063c4d66de8146102fe578063c8ba6c871461031e578063ddafda4614610359578063e248cff21461036f57600080fd5b8063ab5c7bf11461026e578063b07e54bb1461028e578063b2b8b5dd146102ae578063b8fa3736146102de57600080fd5b80636a70d081116100c65780636a70d081146101be578063789d7711146101fe5780637f79bea81461021e578063a98157511461024e57600080fd5b806307b7ed99146101035780630968f264146101255780630a6d55d814610145578063318c136e1461019857600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004610e9b565b61038f565b005b34801561013157600080fd5b50610123610140366004610ed5565b6103a3565b34801561015157600080fd5b5061017b610160366004610f86565b6001602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101a457600080fd5b5060005461017b906201000090046001600160a01b031681565b3480156101ca57600080fd5b506101ee6101d9366004610e9b565b60046020526000908152604090205460ff1681565b604051901515815260200161018f565b34801561020a57600080fd5b50610123610219366004610fad565b6103dc565b34801561022a57600080fd5b506101ee610239366004610e9b565b60036020526000908152604090205460ff1681565b34801561025a57600080fd5b50610123610269366004610fe6565b61040f565b34801561027a57600080fd5b50610123610289366004610ed5565b610462565b6102a161029c366004611054565b610495565b60405161018f91906110dc565b3480156102ba57600080fd5b506101ee6102c9366004610e9b565b60056020526000908152604090205460ff1681565b3480156102ea57600080fd5b506101236102f9366004610fe6565b610579565b34801561030a57600080fd5b50610123610319366004610e9b565b6105d1565b34801561032a57600080fd5b5061034b610339366004610e9b565b60026020526000908152604090205481565b60405190815260200161018f565b34801561036557600080fd5b5061034b60065481565b34801561037b57600080fd5b5061012361038a36600461110f565b6106a6565b61039761081f565b6103a081610881565b50565b6103ab61081f565b6000806000838060200190518101906103c4919061115b565b919450925090506103d6838383610919565b50505050565b6103e461081f565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b61041761081f565b600091825260016020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260028152818320839055600390529020805460ff19169055565b5050565b61046a61081f565b60008082806020019051810190610481919061119e565b90925090506104908282610925565b505050565b606061049f61081f565b60006104ad83850185610f86565b6000878152600160209081526040808320546001600160a01b03168084526003909252909120549192509060ff166104f857604051631556d7e160e11b815260040160405180910390fd5b6001600160a01b03811660009081526004602052604090205460ff161561052957610524818784610989565b61055f565b6001600160a01b03811660009081526005602052604090205460ff161561055357610524826109eb565b61055f81873085610a96565b505060408051600081526020810190915295945050505050565b61058161081f565b600082815260016020818152604080842080546001600160a01b0319166001600160a01b0387169081179091558452600282528084208690556003909152909120805460ff191690911790555050565b600054610100900460ff16158080156105f15750600054600160ff909116105b8061060b5750303b15801561060b575060005460ff166001145b6106305760405162461bcd60e51b8152600401610627906111cc565b60405180910390fd5b6000805460ff191660011790558015610653576000805461ff0019166101001790555b61065c82610aaa565b801561045e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b6106ae61081f565b60008060606106bf8486018661121a565b9093509150846040856106d28583611252565b926106df9392919061126a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508a815260016020908152604080832054828801516001600160a01b039091168085526003909352922054959650909490935060ff1691506107a590505760405162461bcd60e51b815260206004820152602860248201527f70726f766964656420746f6b656e41646472657373206973206e6f74207768696044820152671d195b1a5cdd195960c21b6064820152608401610627565b6001600160a01b03811660009081526004602052604090205460ff16156107d9576107d4818360601c87610b87565b610815565b6001600160a01b03811660009081526005602052604090205460ff1615610807576107d48260601c86610925565b610815818360601c87610919565b5050505050505050565b6000546201000090046001600160a01b0316331461087f5760405162461bcd60e51b815260206004820152601e60248201527f73656e646572206d7573742062652062726964676520636f6e747261637400006044820152606401610627565b565b6001600160a01b03811660009081526003602052604090205460ff166108f55760405162461bcd60e51b8152602060048201526024808201527f70726f766964656420636f6e7472616374206973206e6f742077686974656c696044820152631cdd195960e21b6064820152608401610627565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b826103d6818484610bbf565b476109308383610c22565b61093a8282611294565b47146109805760405162461bcd60e51b815260206004820152601560248201527445524332303a207769746864726177206661696c2160581b6044820152606401610627565b50504760065550565b60405163079cc67960e41b81526001600160a01b038381166004830152602482018390528491908216906379cc6790906044015b600060405180830381600087803b1580156109d757600080fd5b505af1158015610815573d6000803e3d6000fd5b348114610a3a5760405162461bcd60e51b815260206004820152601d60248201527f6d73672e76616c756520616e642064617461206d69736d6174636865640000006044820152606401610627565b80600654610a489190611252565b471015610a8f5760405162461bcd60e51b815260206004820152601560248201527411551214995cd95c9d99481b5a5cdb585d18da1959605a1b6044820152606401610627565b5047600655565b83610aa381858585610cfc565b5050505050565b600054610100900460ff1615808015610aca5750600054600160ff909116105b80610ae45750303b158015610ae4575060005460ff166001145b610b005760405162461bcd60e51b8152600401610627906111cc565b6000805460ff191660011790558015610b23576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b03851602179055801561045e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200161069a565b6040516340c10f1960e01b81526001600160a01b038381166004830152602482018390528491908216906340c10f19906044016109bd565b6040516001600160a01b03831660248201526044810182905261049090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610d34565b604080516000808252602082019092526001600160a01b038416908390604051610c4c91906112ab565b60006040518083038185875af1925050503d8060008114610c89576040519150601f19603f3d011682016040523d82523d6000602084013e610c8e565b606091505b50509050806104905760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b6064820152608401610627565b6040516001600160a01b03808516602483015283166044820152606481018290526103d69085906323b872dd60e01b90608401610beb565b813b80610d7b5760405162461bcd60e51b8152602060048201526015602482015274115490cc8c0e881b9bdd08184818dbdb9d1c9858dd605a1b6044820152606401610627565b600080846001600160a01b031684604051610d9691906112ab565b6000604051808303816000865af19150503d8060008114610dd3576040519150601f19603f3d011682016040523d82523d6000602084013e610dd8565b606091505b509150915081610e1f5760405162461bcd60e51b8152602060048201526012602482015271115490cc8c0e8818d85b1b0819985a5b195960721b6044820152606401610627565b805115610aa35780806020019051810190610e3a91906112c7565b610aa35760405162461bcd60e51b815260206004820181905260248201527f45524332303a206f7065726174696f6e20646964206e6f7420737563636565646044820152606401610627565b6001600160a01b03811681146103a057600080fd5b600060208284031215610ead57600080fd5b8135610eb881610e86565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610ee757600080fd5b813567ffffffffffffffff80821115610eff57600080fd5b818401915084601f830112610f1357600080fd5b813581811115610f2557610f25610ebf565b604051601f8201601f19908116603f01168101908382118183101715610f4d57610f4d610ebf565b81604052828152876020848701011115610f6657600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610f9857600080fd5b5035919050565b80151581146103a057600080fd5b60008060408385031215610fc057600080fd5b8235610fcb81610e86565b91506020830135610fdb81610f9f565b809150509250929050565b60008060408385031215610ff957600080fd5b823591506020830135610fdb81610e86565b60008083601f84011261101d57600080fd5b50813567ffffffffffffffff81111561103557600080fd5b60208301915083602082850101111561104d57600080fd5b9250929050565b6000806000806060858703121561106a57600080fd5b84359350602085013561107c81610e86565b9250604085013567ffffffffffffffff81111561109857600080fd5b6110a48782880161100b565b95989497509550505050565b60005b838110156110cb5781810151838201526020016110b3565b838111156103d65750506000910152565b60208152600082518060208401526110fb8160408501602087016110b0565b601f01601f19169190910160400192915050565b60008060006040848603121561112457600080fd5b83359250602084013567ffffffffffffffff81111561114257600080fd5b61114e8682870161100b565b9497909650939450505050565b60008060006060848603121561117057600080fd5b835161117b81610e86565b602085015190935061118c81610e86565b80925050604084015190509250925092565b600080604083850312156111b157600080fd5b82516111bc81610e86565b6020939093015192949293505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000806040838503121561122d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b600082198211156112655761126561123c565b500190565b6000808585111561127a57600080fd5b8386111561128757600080fd5b5050820193919092039150565b6000828210156112a6576112a661123c565b500390565b600082516112bd8184602087016110b0565b9190910192915050565b6000602082840312156112d957600080fd5b8151610eb881610f9f56fea2646970667358221220792be827825784fccc88fece5c8d585e3c843794f7bc37c86765d7c430f6e78a64736f6c634300080b0033
Deployed Bytecode Sourcemap
36581:5220:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18752:123;;;;;;;;;;-1:-1:-1;18752:123:0;;;;;:::i;:::-;;:::i;:::-;;40817:347;;;;;;;;;;-1:-1:-1;40817:347:0;;;;;:::i;:::-;;:::i;16641:68::-;;;;;;;;;;-1:-1:-1;16641:68:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;16641:68:0;;;;;;-1:-1:-1;;;;;1809:32:1;;;1791:51;;1779:2;1764:18;16641:68:0;;;;;;;;16558:29;;;;;;;;;;-1:-1:-1;16558:29:0;;;;;;;-1:-1:-1;;;;;16558:29:0;;;16994:41;;;;;;;;;;-1:-1:-1;16994:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2018:14:1;;2011:22;1993:41;;1981:2;1966:18;16994:41:0;1853:187:1;19882:173:0;;;;;;;;;;-1:-1:-1;19882:173:0;;;;;:::i;:::-;;:::i;16889:50::-;;;;;;;;;;-1:-1:-1;16889:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;18310:193;;;;;;;;;;-1:-1:-1;18310:193:0;;;;;:::i;:::-;;:::i;41554:244::-;;;;;;;;;;-1:-1:-1;41554:244:0;;;;;:::i;:::-;;:::i;37700:764::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17065:40::-;;;;;;;;;;-1:-1:-1;17065:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;18115:187;;;;;;;;;;-1:-1:-1;18115:187:0;;;;;:::i;:::-;;:::i;36774:117::-;;;;;;;;;;-1:-1:-1;36774:117:0;;;;;:::i;:::-;;:::i;16763:68::-;;;;;;;;;;-1:-1:-1;16763:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;4639:25:1;;;4627:2;4612:18;16763:68:0;4493:177:1;31664:25:0;;;;;;;;;;;;;;;;39121:1195;;;;;;;;;;-1:-1:-1;39121:1195:0;;;;;:::i;:::-;;:::i;18752:123::-;17147:13;:11;:13::i;:::-;18838:29:::1;18851:15;18838:12;:29::i;:::-;18752:123:::0;:::o;40817:347::-;17147:13;:11;:13::i;:::-;40894:20:::1;40925:17:::0;40953:14:::1;41041:4;41016:82;;;;;;;;;;;;:::i;:::-;40980:118:::0;;-1:-1:-1;40980:118:0;-1:-1:-1;40980:118:0;-1:-1:-1;41111:45:0::1;40980:118:::0;;;41111:12:::1;:45::i;:::-;40883:281;;;40817:347:::0;:::o;19882:173::-;17147:13;:11;:13::i;:::-;-1:-1:-1;;;;;20012:23:0;;;::::1;;::::0;;;:8:::1;:23;::::0;;;;:35;;-1:-1:-1;;20012:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19882:173::o;18310:193::-;17147:13;:11;:13::i;:::-;19452:45;;;;:33;:45;;;;;;;;19445:52;;-1:-1:-1;;;;;;19445:52:0;;;-1:-1:-1;;;;;19515:50:0;;;;;;:33;:50;;;;;19508:57;;;19583:18;:35;;;;19576:42;;-1:-1:-1;;19576:42:0;;;18310:193::o;18451:44::-:1;18310:193:::0;;:::o;41554:244::-;17147:13;:11;:13::i;:::-;41634:17:::1;41662:14:::0;41722:4:::1;41711:36;;;;;;;;;;;;:::i;:::-;41689:58:::0;;-1:-1:-1;41689:58:0;-1:-1:-1;41760:30:0::1;41689:58:::0;;41760:11:::1;:30::i;:::-;41623:175;;41554:244:::0;:::o;37700:764::-;37857:12;17147:13;:11;:13::i;:::-;37882:14:::1;37918:27;::::0;;::::1;37929:4:::0;37918:27:::1;:::i;:::-;37958:20;37981:45:::0;;;:33:::1;:45;::::0;;;;;;;;-1:-1:-1;;;;;37981:45:0::1;38042:32:::0;;;:18:::1;:32:::0;;;;;;;37907:38;;-1:-1:-1;37981:45:0;38042:32:::1;;38037:111;;38098:38;;-1:-1:-1::0;;;38098:38:0::1;;;;;;;;;;;38037:111;-1:-1:-1::0;;;;;38164:23:0;::::1;;::::0;;;:9:::1;:23;::::0;;;;;::::1;;38160:267;;;38204:42;38214:12;38228:9;38239:6;38204:9;:42::i;:::-;38160:267;;;-1:-1:-1::0;;;;;38268:22:0;::::1;;::::0;;;:8:::1;:22;::::0;;;;;::::1;;38264:163;;;38307:18;38318:6;38307:10;:18::i;38264:163::-;38358:57;38368:12;38382:9;38401:4;38408:6;38358:9;:57::i;:::-;-1:-1:-1::0;;38444:12:0::1;::::0;;38454:1:::1;38444:12:::0;;::::1;::::0;::::1;::::0;;;;38437:19;-1:-1:-1;;;;;37700:764:0:o;18115:187::-;17147:13;:11;:13::i;:::-;19133:45;;;;:33;:45;;;;;;;;:63;;-1:-1:-1;;;;;;19133:63:0;-1:-1:-1;;;;;19133:63:0;;;;;;;;19207:50;;:33;:50;;;;;:63;;;19283:18;:35;;;;;;:42;;-1:-1:-1;;19283:42:0;;;;;;18310:193;;:::o;36774:117::-;13604:19;13627:13;;;;;;13626:14;;13674:34;;;;-1:-1:-1;13692:12:0;;13707:1;13692:12;;;;:16;13674:34;13673:108;;;-1:-1:-1;13753:4:0;4362:19;:23;;;13714:66;;-1:-1:-1;13763:12:0;;;;;:17;13714:66;13651:204;;;;-1:-1:-1;;;13651:204:0;;;;;;;:::i;:::-;;;;;;;;;13866:12;:16;;-1:-1:-1;;13866:16:0;13881:1;13866:16;;;13893:67;;;;13928:13;:20;;-1:-1:-1;;13928:20:0;;;;;13893:67;36847:36:::1;36869:13;36847:21;:36::i;:::-;13986:14:::0;13982:102;;;14033:5;14017:21;;-1:-1:-1;;14017:21:0;;;14058:14;;-1:-1:-1;6883:36:1;;14058:14:0;;6871:2:1;6856:18;14058:14:0;;;;;;;;13593:498;36774:117;:::o;39121:1195::-;17147:13;:11;:13::i;:::-;39259:14:::1;::::0;39333:40:::1;39429:73;::::0;;::::1;39454:4:::0;39429:73:::1;:::i;:::-;39386:116:::0;;-1:-1:-1;39386:116:0;-1:-1:-1;39563:4:0;39568:2:::1;39563:4:::0;39571:35:::1;39386:116:::0;39568:2;39571:35:::1;:::i;:::-;39563:44;;;;;;;:::i;:::-;39513:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;39689:45:0;;;:33:::1;:45;::::0;;;;;;;;39797:38;;::::1;39791:45:::0;-1:-1:-1;;;;;39689:45:0;;::::1;39881:32:::0;;;:18:::1;:32:::0;;;;;;39513:105;;-1:-1:-1;39791:45:0;;39689;;-1:-1:-1;39881:32:0::1;;::::0;-1:-1:-1;39859:122:0::1;::::0;-1:-1:-1;39859:122:0::1;;::::0;-1:-1:-1;;;39859:122:0;;7986:2:1;39859:122:0::1;::::0;::::1;7968:21:1::0;8025:2;8005:18;;;7998:30;8064:34;8044:18;;;8037:62;-1:-1:-1;;;8115:18:1;;;8108:38;8163:19;;39859:122:0::1;7784:404:1::0;39859:122:0::1;-1:-1:-1::0;;;;;39998:23:0;::::1;;::::0;;;:9:::1;:23;::::0;;;;;::::1;;39994:315;;;40038:58;40048:12;40070:16;40062:25;;40089:6;40038:9;:58::i;:::-;39994:315;;;-1:-1:-1::0;;;;;40118:22:0;::::1;;::::0;;;:8:::1;:22;::::0;;;;;::::1;;40114:195;;;40157:46;40177:16;40169:25;;40196:6;40157:11;:46::i;40114:195::-;40236:61;40249:12;40271:16;40263:25;;40290:6;40236:12;:61::i;:::-;39248:1068;;;;;39121:1195:::0;;;:::o;17416:126::-;17485:14;;;;;-1:-1:-1;;;;;17485:14:0;17471:10;:28;17463:71;;;;-1:-1:-1;;;17463:71:0;;8395:2:1;17463:71:0;;;8377:21:1;8434:2;8414:18;;;8407:30;8473:32;8453:18;;;8446:60;8523:18;;17463:71:0;8193:354:1;17463:71:0;17416:126::o;19634:240::-;-1:-1:-1;;;;;19723:35:0;;;;;;:18;:35;;;;;;;;19701:121;;;;-1:-1:-1;;;19701:121:0;;8754:2:1;19701:121:0;;;8736:21:1;8793:2;8773:18;;;8766:30;8832:34;8812:18;;;8805:62;-1:-1:-1;;;8883:18:1;;;8876:34;8927:19;;19701:121:0;8552:400:1;19701:121:0;-1:-1:-1;;;;;19833:26:0;;;;;:9;:26;;;;;:33;;-1:-1:-1;;19833:33:0;19862:4;19833:33;;;19634:240::o;32508:226::-;32663:12;32687:39;32663:12;32708:9;32719:6;32687:13;:39::i;33046:349::-;33146:21;33178:35;33195:9;33206:6;33178:16;:35::i;:::-;33271:22;33287:6;33271:13;:22;:::i;:::-;33246:21;:47;33224:118;;;;-1:-1:-1;;;33224:118:0;;9289:2:1;33224:118:0;;;9271:21:1;9328:2;9308:18;;;9301:30;-1:-1:-1;;;9347:18:1;;;9340:51;9408:18;;33224:118:0;9087:345:1;33224:118:0;-1:-1:-1;;33366:21:0;33353:10;:34;-1:-1:-1;33046:349:0:o;34064:221::-;34248:29;;-1:-1:-1;;;34248:29:0;;-1:-1:-1;;;;;9629:32:1;;;34248:29:0;;;9611:51:1;9678:18;;;9671:34;;;34224:12:0;;34248:14;;;;;;9584:18:1;;34248:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32742:296;32816:9;32806:6;:19;32798:61;;;;-1:-1:-1;;;32798:61:0;;9918:2:1;32798:61:0;;;9900:21:1;9957:2;9937:18;;;9930:30;9996:31;9976:18;;;9969:59;10045:18;;32798:61:0;9716:353:1;32798:61:0;32930:6;32917:10;;:19;;;;:::i;:::-;32892:21;:44;;32870:115;;;;-1:-1:-1;;;32870:115:0;;10276:2:1;32870:115:0;;;10258:21:1;10315:2;10295:18;;;10288:30;-1:-1:-1;;;10334:18:1;;;10327:51;10395:18;;32870:115:0;10074:345:1;32870:115:0;-1:-1:-1;33009:21:0;32996:10;:34;32742:296::o;31997:258::-;32173:12;32197:50;32173:12;32222:5;32229:9;32240:6;32197:17;:50::i;:::-;32140:115;31997:258;;;;:::o;17284:124::-;13604:19;13627:13;;;;;;13626:14;;13674:34;;;;-1:-1:-1;13692:12:0;;13707:1;13692:12;;;;:16;13674:34;13673:108;;;-1:-1:-1;13753:4:0;4362:19;:23;;;13714:66;;-1:-1:-1;13763:12:0;;;;;:17;13714:66;13651:204;;;;-1:-1:-1;;;13651:204:0;;;;;;;:::i;:::-;13866:12;:16;;-1:-1:-1;;13866:16:0;13881:1;13866:16;;;13893:67;;;;13928:13;:20;;-1:-1:-1;;13928:20:0;;;;;13893:67;17370:14:::1;:30:::0;;-1:-1:-1;;;;;;17370:30:0::1;::::0;-1:-1:-1;;;;;17370:30:0;::::1;;;::::0;;13982:102;;;;14033:5;14017:21;;-1:-1:-1;;14017:21:0;;;14058:14;;-1:-1:-1;6883:36:1;;14058:14:0;;6871:2:1;6856:18;14058:14:0;6731:194:1;33624:225:0;33812:29;;-1:-1:-1;;;33812:29:0;;-1:-1:-1;;;;;9629:32:1;;;33812:29:0;;;9611:51:1;9678:18;;;9671:34;;;33788:12:0;;33812:10;;;;;;9584:18:1;;33812:29:0;9437:274:1;34506:238:0;34667:58;;-1:-1:-1;;;;;9629:32:1;;34667:58:0;;;9611:51:1;9678:18;;;9671:34;;;34623:113:0;;34647:5;;-1:-1:-1;;;34690:23:0;9584:18:1;;34667:58:0;;;;-1:-1:-1;;34667:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;34667:58:0;-1:-1:-1;;;;;;34667:58:0;;;;;;;;;;34623:9;:113::i;34752:254::-;34865:12;;;34825;34865;;;;;;;;;-1:-1:-1;;;;;34843:7:0;;;34858:5;;34843:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34824:54;;;34911:7;34889:109;;;;-1:-1:-1;;;34889:109:0;;10905:2:1;34889:109:0;;;10887:21:1;10944:2;10924:18;;;10917:30;10983:34;10963:18;;;10956:62;-1:-1:-1;;;11034:18:1;;;11027:50;11094:19;;34889:109:0;10703:416:1;35279:275:0;35467:68;;-1:-1:-1;;;;;11382:15:1;;;35467:68:0;;;11364:34:1;11434:15;;11414:18;;;11407:43;11466:18;;;11459:34;;;35423:123:0;;35447:5;;-1:-1:-1;;;35490:27:0;11299:18:1;;35467:68:0;11124:375:1;35722:549:0;35858:18;;35905:13;35897:47;;;;-1:-1:-1;;;35897:47:0;;11706:2:1;35897:47:0;;;11688:21:1;11745:2;11725:18;;;11718:30;-1:-1:-1;;;11764:18:1;;;11757:51;11825:18;;35897:47:0;11504:345:1;35897:47:0;35958:12;35972:23;36007:5;-1:-1:-1;;;;;35999:19:0;36019:4;35999:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35957:67;;;;36043:7;36035:38;;;;-1:-1:-1;;;36035:38:0;;12056:2:1;36035:38:0;;;12038:21:1;12095:2;12075:18;;;12068:30;-1:-1:-1;;;12114:18:1;;;12107:48;12172:18;;36035:38:0;11854:342:1;36035:38:0;36090:17;;:21;36086:178;;36165:10;36154:30;;;;;;;;;;;;:::i;:::-;36128:124;;;;-1:-1:-1;;;36128:124:0;;12653:2:1;36128:124:0;;;12635:21:1;;;12672:18;;;12665:30;12731:34;12711:18;;;12704:62;12783:18;;36128:124:0;12451:356:1;14:131;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;:::-;386:5;150:247;-1:-1:-1;;;150:247:1:o;402:127::-;463:10;458:3;454:20;451:1;444:31;494:4;491:1;484:15;518:4;515:1;508:15;534:921;602:6;655:2;643:9;634:7;630:23;626:32;623:52;;;671:1;668;661:12;623:52;711:9;698:23;740:18;781:2;773:6;770:14;767:34;;;797:1;794;787:12;767:34;835:6;824:9;820:22;810:32;;880:7;873:4;869:2;865:13;861:27;851:55;;902:1;899;892:12;851:55;938:2;925:16;960:2;956;953:10;950:36;;;966:18;;:::i;:::-;1041:2;1035:9;1009:2;1095:13;;-1:-1:-1;;1091:22:1;;;1115:2;1087:31;1083:40;1071:53;;;1139:18;;;1159:22;;;1136:46;1133:72;;;1185:18;;:::i;:::-;1225:10;1221:2;1214:22;1260:2;1252:6;1245:18;1300:7;1295:2;1290;1286;1282:11;1278:20;1275:33;1272:53;;;1321:1;1318;1311:12;1272:53;1377:2;1372;1368;1364:11;1359:2;1351:6;1347:15;1334:46;1422:1;1400:15;;;1417:2;1396:24;1389:35;;;;-1:-1:-1;1404:6:1;534:921;-1:-1:-1;;;;;534:921:1:o;1460:180::-;1519:6;1572:2;1560:9;1551:7;1547:23;1543:32;1540:52;;;1588:1;1585;1578:12;1540:52;-1:-1:-1;1611:23:1;;1460:180;-1:-1:-1;1460:180:1:o;2045:118::-;2131:5;2124:13;2117:21;2110:5;2107:32;2097:60;;2153:1;2150;2143:12;2168:382;2233:6;2241;2294:2;2282:9;2273:7;2269:23;2265:32;2262:52;;;2310:1;2307;2300:12;2262:52;2349:9;2336:23;2368:31;2393:5;2368:31;:::i;:::-;2418:5;-1:-1:-1;2475:2:1;2460:18;;2447:32;2488:30;2447:32;2488:30;:::i;:::-;2537:7;2527:17;;;2168:382;;;;;:::o;2555:315::-;2623:6;2631;2684:2;2672:9;2663:7;2659:23;2655:32;2652:52;;;2700:1;2697;2690:12;2652:52;2736:9;2723:23;2713:33;;2796:2;2785:9;2781:18;2768:32;2809:31;2834:5;2809:31;:::i;2875:347::-;2926:8;2936:6;2990:3;2983:4;2975:6;2971:17;2967:27;2957:55;;3008:1;3005;2998:12;2957:55;-1:-1:-1;3031:20:1;;3074:18;3063:30;;3060:50;;;3106:1;3103;3096:12;3060:50;3143:4;3135:6;3131:17;3119:29;;3195:3;3188:4;3179:6;3171;3167:19;3163:30;3160:39;3157:59;;;3212:1;3209;3202:12;3157:59;2875:347;;;;;:::o;3227:612::-;3315:6;3323;3331;3339;3392:2;3380:9;3371:7;3367:23;3363:32;3360:52;;;3408:1;3405;3398:12;3360:52;3444:9;3431:23;3421:33;;3504:2;3493:9;3489:18;3476:32;3517:31;3542:5;3517:31;:::i;:::-;3567:5;-1:-1:-1;3623:2:1;3608:18;;3595:32;3650:18;3639:30;;3636:50;;;3682:1;3679;3672:12;3636:50;3721:58;3771:7;3762:6;3751:9;3747:22;3721:58;:::i;:::-;3227:612;;;;-1:-1:-1;3798:8:1;-1:-1:-1;;;;3227:612:1:o;3844:258::-;3916:1;3926:113;3940:6;3937:1;3934:13;3926:113;;;4016:11;;;4010:18;3997:11;;;3990:39;3962:2;3955:10;3926:113;;;4057:6;4054:1;4051:13;4048:48;;;-1:-1:-1;;4092:1:1;4074:16;;4067:27;3844:258::o;4107:381::-;4254:2;4243:9;4236:21;4217:4;4286:6;4280:13;4329:6;4324:2;4313:9;4309:18;4302:34;4345:66;4404:6;4399:2;4388:9;4384:18;4379:2;4371:6;4367:15;4345:66;:::i;:::-;4472:2;4451:15;-1:-1:-1;;4447:29:1;4432:45;;;;4479:2;4428:54;;4107:381;-1:-1:-1;;4107:381:1:o;4857:477::-;4936:6;4944;4952;5005:2;4993:9;4984:7;4980:23;4976:32;4973:52;;;5021:1;5018;5011:12;4973:52;5057:9;5044:23;5034:33;;5118:2;5107:9;5103:18;5090:32;5145:18;5137:6;5134:30;5131:50;;;5177:1;5174;5167:12;5131:50;5216:58;5266:7;5257:6;5246:9;5242:22;5216:58;:::i;:::-;4857:477;;5293:8;;-1:-1:-1;5190:84:1;;-1:-1:-1;;;;4857:477:1:o;5339:462::-;5443:6;5451;5459;5512:2;5500:9;5491:7;5487:23;5483:32;5480:52;;;5528:1;5525;5518:12;5480:52;5560:9;5554:16;5579:31;5604:5;5579:31;:::i;:::-;5679:2;5664:18;;5658:25;5629:5;;-1:-1:-1;5692:33:1;5658:25;5692:33;:::i;:::-;5744:7;5734:17;;;5791:2;5780:9;5776:18;5770:25;5760:35;;5339:462;;;;;:::o;5806:320::-;5893:6;5901;5954:2;5942:9;5933:7;5929:23;5925:32;5922:52;;;5970:1;5967;5960:12;5922:52;6002:9;5996:16;6021:31;6046:5;6021:31;:::i;:::-;6116:2;6101:18;;;;6095:25;6071:5;;6095:25;;-1:-1:-1;;;5806:320:1:o;6316:410::-;6518:2;6500:21;;;6557:2;6537:18;;;6530:30;6596:34;6591:2;6576:18;;6569:62;-1:-1:-1;;;6662:2:1;6647:18;;6640:44;6716:3;6701:19;;6316:410::o;6930:248::-;6998:6;7006;7059:2;7047:9;7038:7;7034:23;7030:32;7027:52;;;7075:1;7072;7065:12;7027:52;-1:-1:-1;;7098:23:1;;;7168:2;7153:18;;;7140:32;;-1:-1:-1;6930:248:1:o;7183:127::-;7244:10;7239:3;7235:20;7232:1;7225:31;7275:4;7272:1;7265:15;7299:4;7296:1;7289:15;7315:128;7355:3;7386:1;7382:6;7379:1;7376:13;7373:39;;;7392:18;;:::i;:::-;-1:-1:-1;7428:9:1;;7315:128::o;7448:331::-;7553:9;7564;7606:8;7594:10;7591:24;7588:44;;;7628:1;7625;7618:12;7588:44;7657:6;7647:8;7644:20;7641:40;;;7677:1;7674;7667:12;7641:40;-1:-1:-1;;7703:23:1;;;7748:25;;;;;-1:-1:-1;7448:331:1:o;8957:125::-;8997:4;9025:1;9022;9019:8;9016:34;;;9030:18;;:::i;:::-;-1:-1:-1;9067:9:1;;8957:125::o;10424:274::-;10553:3;10591:6;10585:13;10607:53;10653:6;10648:3;10641:4;10633:6;10629:17;10607:53;:::i;:::-;10676:16;;;;;10424:274;-1:-1:-1;;10424:274:1:o;12201:245::-;12268:6;12321:2;12309:9;12300:7;12296:23;12292:32;12289:52;;;12337:1;12334;12327:12;12289:52;12369:9;12363:16;12388:28;12410:5;12388:28;:::i
Swarm Source
ipfs://792be827825784fccc88fece5c8d585e3c843794f7bc37c86765d7c430f6e78a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MOVR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.