Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 146 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Process Withdraw | 16979027 | 1021 days ago | IN | 0 ETH | 0.00620571 | ||||
| Process Withdraw | 16685594 | 1062 days ago | IN | 0 ETH | 0.00794298 | ||||
| Process Withdraw | 16447047 | 1095 days ago | IN | 0 ETH | 0.00302492 | ||||
| Process Withdraw | 16229484 | 1126 days ago | IN | 0 ETH | 0.002212 | ||||
| Process Withdraw | 15458864 | 1235 days ago | IN | 0 ETH | 0.0016501 | ||||
| Process Withdraw | 15442832 | 1238 days ago | IN | 0 ETH | 0.00291646 | ||||
| Process Withdraw | 15436251 | 1239 days ago | IN | 0 ETH | 0.00614752 | ||||
| Process Withdraw | 15433893 | 1239 days ago | IN | 0 ETH | 0.00165724 | ||||
| Process Withdraw | 15433863 | 1239 days ago | IN | 0 ETH | 0.00135085 | ||||
| Process Withdraw | 15433448 | 1239 days ago | IN | 0 ETH | 0.00565838 | ||||
| Process Withdraw | 15401813 | 1244 days ago | IN | 0 ETH | 0.00216834 | ||||
| Process Withdraw | 15169656 | 1281 days ago | IN | 0 ETH | 0.00320601 | ||||
| Process Withdraw | 15165519 | 1281 days ago | IN | 0 ETH | 0.00298857 | ||||
| Process Withdraw | 15041537 | 1301 days ago | IN | 0 ETH | 0.01066298 | ||||
| Process Withdraw | 15028438 | 1303 days ago | IN | 0 ETH | 0.00453851 | ||||
| Process Withdraw | 15017458 | 1305 days ago | IN | 0 ETH | 0.00820349 | ||||
| Process Withdraw | 15002719 | 1308 days ago | IN | 0 ETH | 0.01294858 | ||||
| Process Withdraw | 14682393 | 1361 days ago | IN | 0 ETH | 0.00833827 | ||||
| Process Withdraw | 14668186 | 1363 days ago | IN | 0 ETH | 0.01753274 | ||||
| Process Withdraw | 14610207 | 1372 days ago | IN | 0 ETH | 0.00938727 | ||||
| Process Withdraw | 14413918 | 1403 days ago | IN | 0 ETH | 0.00584253 | ||||
| Process Withdraw | 14405607 | 1404 days ago | IN | 0 ETH | 0.01128877 | ||||
| Process Withdraw | 14405242 | 1404 days ago | IN | 0 ETH | 0.01369384 | ||||
| Process Withdraw | 14401437 | 1405 days ago | IN | 0 ETH | 0.00698701 | ||||
| Process Withdraw | 14401054 | 1405 days ago | IN | 0 ETH | 0.00742758 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Operator
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-05-17
*/
// SPDX-License-Identifier: GPL-3.0-only
// File: @openzeppelin/contracts/GSN/Context.sol
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN 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 payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @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 () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view 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 {
emit OwnershipTransferred(_owner, address(0));
_owner = 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");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: @openzeppelin/contracts/cryptography/ECDSA.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
// Check the signature length
if (signature.length != 65) {
revert("ECDSA: invalid signature length");
}
// Divide the signature in r, s and v variables
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
// solhint-disable-next-line no-inline-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
require(signer != address(0), "ECDSA: invalid signature");
return signer;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* replicates the behavior of the
* https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
* JSON-RPC method.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
}
// File: contracts/SignatureValidator.sol
pragma solidity ^0.6.0;
contract SignatureValidator
{
function calcSignatureHash(uint256 _transferId, bytes32 _txId) public pure returns (bytes32 _hash)
{
return keccak256(abi.encodePacked(_transferId, _txId));
}
function validateSignature(address _agent, uint256 _transferId, bytes32 _txId, bytes memory _signature) public pure returns (bool _valid)
{
bytes32 _hash = calcSignatureHash(_transferId, _txId);
return ECDSA.recover(ECDSA.toEthSignedMessageHash(_hash), _signature) == _agent;
}
function _requireValidSignature(address _agent, uint256 _transferId, bytes32 _txId, bytes memory _signature) internal
{
require(validateSignature(_agent, _transferId, _txId, _signature), "invalid signature");
emit ValidSignature(_agent, _transferId, _txId, _signature);
}
event ValidSignature(address indexed _agent, uint256 indexed _transferId, bytes32 indexed _txId, bytes _signature);
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/modules/Transfers.sol
pragma solidity ^0.6.0;
library Transfers
{
using SafeERC20 for IERC20;
function _getBalance(address _token) internal view returns (uint256 _balance)
{
return IERC20(_token).balanceOf(address(this));
}
function _approveFunds(address _token, address _to, uint256 _amount) internal
{
uint256 _allowance = IERC20(_token).allowance(address(this), _to);
if (_allowance > _amount) {
IERC20(_token).safeDecreaseAllowance(_to, _allowance - _amount);
}
else
if (_allowance < _amount) {
IERC20(_token).safeIncreaseAllowance(_to, _amount - _allowance);
}
}
function _pullFunds(address _token, address _from, uint256 _amount) internal
{
if (_amount == 0) return;
IERC20(_token).safeTransferFrom(_from, address(this), _amount);
}
function _pushFunds(address _token, address _to, uint256 _amount) internal
{
if (_amount == 0) return;
IERC20(_token).safeTransfer(_to, _amount);
}
}
// File: contracts/TrustedBridge.sol
pragma solidity ^0.6.0;
contract TrustedBridge is Ownable
{
uint256 constant BLOCK_TIME_TOLERANCE = 15 minutes;
uint256 constant WITHDRAW_GRACE_PERIOD = 30 minutes;
uint256 public chainId;
address public operator;
address public token;
mapping (uint256 => Transfer) public transfers;
struct Transfer {
uint256 timestamp;
}
modifier onlyEOA()
{
require(tx.origin == msg.sender, "not an externally owned account");
_;
}
function construct(uint256 _chainId, address _operator, address _token) external
{
assert(chainId == 0);
chainId = _chainId;
operator = _operator;
token = _token;
}
function calcTransferId(address _sourceBridge, address _targetBridge, uint256 _sourceChainId, uint256 _targetChainId, address _client, address _server, uint256 _sourceAmount, uint256 _targetAmount, uint256 _timestamp) public pure returns (uint256 _transferId)
{
return uint256(keccak256(abi.encode(_sourceBridge, _targetBridge, _sourceChainId, _targetChainId, _client, _server, _sourceAmount, _targetAmount, _timestamp)));
}
function deposit(address _targetBridge, uint256 _targetChainId, address _server, uint256 _sourceAmount, uint256 _targetAmount, uint256 _timestamp, uint256 _transferId) external onlyEOA
{
address _sourceBridge = address(this);
uint256 _sourceChainId = chainId;
address _client = msg.sender;
require(_server != address(0), "invalid server");
require(_targetBridge != address(0), "invalid bridge");
require(_sourceChainId != _targetChainId, "invalid chain");
require(transfers[_transferId].timestamp == 0, "access denied");
require(_sourceAmount >= _targetAmount, "invalid amount");
require(now - BLOCK_TIME_TOLERANCE <= _timestamp && _timestamp <= now + BLOCK_TIME_TOLERANCE, "not available");
require(_transferId == calcTransferId(_sourceBridge, _targetBridge, _sourceChainId, _targetChainId, _client, _server, _sourceAmount, _targetAmount, _timestamp), "invalid transfer id");
Transfers._pullFunds(token, _client, _sourceAmount);
Transfers._pushFunds(token, operator, _sourceAmount);
transfers[_transferId].timestamp = now;
emit Deposit(_targetBridge, _targetChainId, _client, _server, _sourceAmount, _targetAmount, _timestamp, _transferId);
}
function withdraw(address _sourceBridge, uint256 _sourceChainId, address _client, uint256 _sourceAmount, uint256 _targetAmount, uint256 _timestamp, uint256 _transferId) external
{
address _targetBridge = address(this);
uint256 _targetChainId = chainId;
address _server = msg.sender;
require(_client != address(0), "invalid client");
require(_sourceBridge != address(0), "invalid bridge");
require(_sourceChainId != _targetChainId, "invalid chain");
require(transfers[_transferId].timestamp == 0, "access denied");
require(_sourceAmount >= _targetAmount, "invalid amount");
require(now >= _timestamp + WITHDRAW_GRACE_PERIOD, "not available");
require(_transferId == calcTransferId(_sourceBridge, _targetBridge, _sourceChainId, _targetChainId, _client, _server, _sourceAmount, _targetAmount, _timestamp), "invalid transfer id");
Transfers._pullFunds(token, _server, _targetAmount);
Transfers._pushFunds(token, _client, _targetAmount);
transfers[_transferId].timestamp = now;
emit Withdraw(_sourceBridge, _sourceChainId, _client, _server, _sourceAmount, _targetAmount, _timestamp, _transferId);
}
function setOperator(address _newOperator) external onlyOwner
{
require(_newOperator != address(0), "invalid bridge");
address _oldOperator = operator;
operator = _newOperator;
emit OperatorChange(_oldOperator, _newOperator);
}
event Deposit(address _targetBridge, uint256 _targetChainId, address indexed _client, address indexed _server, uint256 _sourceAmount, uint256 _targetAmount, uint256 _timestamp, uint256 indexed _transferId);
event Withdraw(address _sourceBridge, uint256 _sourceChainId, address indexed _client, address indexed _server, uint256 _sourceAmount, uint256 _targetAmount, uint256 _timestamp, uint256 indexed _transferId);
event OperatorChange(address _oldOperator, address _newOperator);
}
// File: contracts/Operator.sol
pragma solidity ^0.6.0;
contract Operator is Ownable, SignatureValidator
{
uint256 public chainId;
address public bridge;
address public vault;
address public token;
mapping (uint256 => bytes32) public transactions;
address[] public agents;
function construct(uint256 _chainId, address _bridge, address _vault, address _token) external
{
assert(chainId == 0);
chainId = _chainId;
bridge = _bridge;
vault = _vault;
token = _token;
}
function processWithdraw(address _sourceBridge, uint256 _sourceChainId, address _client, uint256 _sourceAmount, uint256 _targetAmount, uint256 _timestamp, uint256 _transferId, bytes32 _txId, bytes memory _signatures) external
{
require(agents.length >= 2, "invalid agents");
require(_sourceAmount >= _targetAmount, "invalid amount");
require(_signatures.length == 65 * agents.length, "invalid length");
for (uint256 _i = 0; _i < agents.length; _i++) {
address _agent = agents[_i];
bytes memory _signature = new bytes(65);
for (uint256 _j = 0; _j < 65; _j++) {
_signature[_j] = _signatures[65 * _i + _j];
}
_requireValidSignature(_agent, _transferId, _txId, _signature);
}
Transfers._approveFunds(token, bridge, _targetAmount);
TrustedBridge(bridge).withdraw(_sourceBridge, _sourceChainId, _client, _sourceAmount, _targetAmount, _timestamp, _transferId);
assert(transactions[_transferId] == bytes32(0));
transactions[_transferId] = _txId;
}
function transferToVault(uint256 _amount) external onlyOwner
{
Transfers._pushFunds(token, vault, _amount);
}
function setBridge(address _newBridge) external onlyOwner
{
require(_newBridge != address(0), "invalid bridge");
address _oldBridge = bridge;
bridge = _newBridge;
emit BridgeChange(_oldBridge, _newBridge);
}
function addAgent(address _agent) external onlyOwner
{
require(_agent != address(0), "invalid agent");
agents.push(_agent);
emit AddAgent(_agent);
}
function removeAgent(uint256 _index) external onlyOwner
{
require(_index < agents.length, "invalid index");
address _agent = agents[_index];
agents[_index] = agents[agents.length - 1];
agents.pop();
emit RemoveAgent(_agent);
}
event ValidSignature(address indexed _agent, uint256 indexed _transferId, bytes32 indexed _txId, bytes _signature);
event BridgeChange(address _oldBridge, address _newBridge);
event AddAgent(address _agent);
event RemoveAgent(address _agent);
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_agent","type":"address"}],"name":"AddAgent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldBridge","type":"address"},{"indexed":false,"internalType":"address","name":"_newBridge","type":"address"}],"name":"BridgeChange","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":"address","name":"_agent","type":"address"}],"name":"RemoveAgent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_agent","type":"address"},{"indexed":true,"internalType":"uint256","name":"_transferId","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"_txId","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"ValidSignature","type":"event"},{"inputs":[{"internalType":"address","name":"_agent","type":"address"}],"name":"addAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"agents","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferId","type":"uint256"},{"internalType":"bytes32","name":"_txId","type":"bytes32"}],"name":"calcSignatureHash","outputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_chainId","type":"uint256"},{"internalType":"address","name":"_bridge","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"construct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sourceBridge","type":"address"},{"internalType":"uint256","name":"_sourceChainId","type":"uint256"},{"internalType":"address","name":"_client","type":"address"},{"internalType":"uint256","name":"_sourceAmount","type":"uint256"},{"internalType":"uint256","name":"_targetAmount","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_transferId","type":"uint256"},{"internalType":"bytes32","name":"_txId","type":"bytes32"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"processWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"removeAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newBridge","type":"address"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferToVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_agent","type":"address"},{"internalType":"uint256","name":"_transferId","type":"uint256"},{"internalType":"bytes32","name":"_txId","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"validateSignature","outputs":[{"internalType":"bool","name":"_valid","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b5060006100216100c460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506100cc565b600033905090565b61284c806100db6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80639ace38c2116100a2578063e78cea9211610071578063e78cea9214610573578063eef01b66146105a7578063f2fde38b14610635578063fbfa77cf14610679578063fc0c546a146106ad5761010b565b80639ace38c2146102c6578063a4eb4b3c14610308578063e01d9b7914610336578063e6ac60831461043b5761010b565b806384e79842116100de57806384e79842146101ec5780638da5cb5b146102305780638dd14802146102645780639a8a0592146102a85761010b565b806313ed6165146101105780633abdb63d1461015c578063513856c81461018a578063715018a6146101e2575b600080fd5b6101466004803603604081101561012657600080fd5b8101908080359060200190929190803590602001909291905050506106e1565b6040518082815260200191505060405180910390f35b6101886004803603602081101561017257600080fd5b810190808035906020019092919050505061071a565b005b6101b6600480360360208110156101a057600080fd5b81019080803590602001909291905050506109be565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101ea6109fa565b005b61022e6004803603602081101561020257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b80565b005b610238610d9e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102a66004803603602081101561027a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dc7565b005b6102b0611009565b6040518082815260200191505060405180910390f35b6102f2600480360360208110156102dc57600080fd5b810190808035906020019092919050505061100f565b6040518082815260200191505060405180910390f35b6103346004803603602081101561031e57600080fd5b8101908080359060200190929190505050611027565b005b6104236004803603608081101561034c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561039d57600080fd5b8201836020820111156103af57600080fd5b803590602001918460018302840111640100000000831117156103d157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611141565b60405180821515815260200191505060405180910390f35b610571600480360361012081101561045257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001906401000000008111156104eb57600080fd5b8201836020820111156104fd57600080fd5b8035906020019184600183028401116401000000008311171561051f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061119b565b005b61057b6115ae565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610633600480360360808110156105bd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115d4565b005b6106776004803603602081101561064b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116b0565b005b6106816118bb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106b56118e1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008282604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120905092915050565b610722611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600680549050811061085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c696420696e6465780000000000000000000000000000000000000081525060200191505060405180910390fd5b60006006828154811061086b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506006600160068054905003815481106108ad57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600683815481106108e557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600680548061093857fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590557f7d9ce70f39c0d594d373d4b779781839de1debeda94cbb04501bc0773a1199eb81604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b600681815481106109cb57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a02611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ac2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610b88611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ceb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c6964206167656e740000000000000000000000000000000000000081525060200191505060405180910390fd5b6006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f13380ad6c58c6a2855a70fd3970b4fe598e8b60a683408ec8a5896b680188acd81604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610dcf611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c69642062726964676500000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9f06c577a12d8beda856a3cceddf7befcb12da366ce49400e869c0104ee10d6a8183604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b60015481565b60056020528060005260406000206000915090505481565b61102f611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61113e600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361190f565b50565b60008061114e85856106e1565b90508573ffffffffffffffffffffffffffffffffffffffff166111796111738361194e565b856119a6565b73ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b60026006805490501015611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c6964206167656e747300000000000000000000000000000000000081525060200191505060405180910390fd5b8486101561128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c696420616d6f756e7400000000000000000000000000000000000081525060200191505060405180910390fd5b60068054905060410281511461130b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c6964206c656e67746800000000000000000000000000000000000081525060200191505060405180910390fd5b60005b6006805490508110156114335760006006828154811061132a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506060604167ffffffffffffffff8111801561137157600080fd5b506040519080825280601f01601f1916602001820160405280156113a45781602001600182028036833780820191505090505b50905060005b60418110156114175784818560410201815181106113c457fe5b602001015160f81c60f81b8282815181106113db57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506113aa565b5061142482878784611c3a565b5050808060010191505061130e565b50611483600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687611d73565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639962ab028a8a8a8a8a8a8a6040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001838152602001828152602001975050505050505050600060405180830381600087803b15801561155457600080fd5b505af1158015611568573d6000803e3d6000fd5b505050506000801b60056000858152602001908152602001600020541461158b57fe5b816005600085815260200190815260200160002081905550505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600154146115e057fe5b8360018190555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6116b8611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611778576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806127346026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600081141561191d57611949565b61194882828573ffffffffffffffffffffffffffffffffffffffff16611eae9092919063ffffffff16565b5b505050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b60006041825114611a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45434453413a20696e76616c6964207369676e6174757265206c656e6774680081525060200191505060405180910390fd5b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611ab8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127836022913960400191505060405180910390fd5b601b8160ff161480611acd5750601c8160ff16145b611b22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127cb6022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611b7e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f45434453413a20696e76616c6964207369676e6174757265000000000000000081525060200191505060405180910390fd5b8094505050505092915050565b611c4684848484611141565b611cb8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f696e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b81838573ffffffffffffffffffffffffffffffffffffffff167f4340c96ce644c32751742ec87ed5ec4100a14c63818baf04ed49d6c3b0bf852f846040518080602001828103825283818151815260200191508051906020019080838360005b83811015611d33578082015181840152602081019050611d18565b50505050905090810190601f168015611d605780820380516001836020036101000a031916815260200191505b509250505060405180910390a450505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611dfa57600080fd5b505afa158015611e0e573d6000803e3d6000fd5b505050506040513d6020811015611e2457600080fd5b8101908080519060200190929190505050905081811115611e7157611e6c838383038673ffffffffffffffffffffffffffffffffffffffff16611f509092919063ffffffff16565b611ea8565b81811015611ea757611ea6838284038673ffffffffffffffffffffffffffffffffffffffff166120e39092919063ffffffff16565b5b5b50505050565b611f4b8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061225c565b505050565b600061203e8260405180606001604052806029815260200161275a602991398673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611ff457600080fd5b505afa158015612008573d6000803e3d6000fd5b505050506040513d602081101561201e57600080fd5b810190808051906020019092919050505061234b9092919063ffffffff16565b90506120dd8463095ea7b360e01b8584604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061225c565b50505050565b60006121b7828573ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561216e57600080fd5b505afa158015612182573d6000803e3d6000fd5b505050506040513d602081101561219857600080fd5b810190808051906020019092919050505061240b90919063ffffffff16565b90506122568463095ea7b360e01b8584604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061225c565b50505050565b60606122be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124939092919063ffffffff16565b9050600081511115612346578080602001905160208110156122df57600080fd5b8101908080519060200190929190505050612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806127ed602a913960400191505060405180910390fd5b5b505050565b60008383111582906123f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156123bd5780820151818401526020810190506123a2565b50505050905090810190601f1680156123ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60606124a284846000856124ab565b90509392505050565b606082471015612506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806127a56026913960400191505060405180910390fd5b61250f85612654565b612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106125d157805182526020820191506020810190506020830392506125ae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612633576040519150601f19603f3d011682016040523d82523d6000602084013e612638565b606091505b5091509150612648828286612667565b92505050949350505050565b600080823b905060008111915050919050565b606083156126775782905061272c565b60008351111561268a5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126f15780820151818401526020810190506126d6565b50505050905090810190601f16801561271e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735361666545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f45434453413a20696e76616c6964207369676e6174757265202773272076616c7565416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c45434453413a20696e76616c6964207369676e6174757265202776272076616c75655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122033dc0e5b2a8019df999779d3ef664337ab7725b172d61bd0641a6fa495d2e2a664736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80639ace38c2116100a2578063e78cea9211610071578063e78cea9214610573578063eef01b66146105a7578063f2fde38b14610635578063fbfa77cf14610679578063fc0c546a146106ad5761010b565b80639ace38c2146102c6578063a4eb4b3c14610308578063e01d9b7914610336578063e6ac60831461043b5761010b565b806384e79842116100de57806384e79842146101ec5780638da5cb5b146102305780638dd14802146102645780639a8a0592146102a85761010b565b806313ed6165146101105780633abdb63d1461015c578063513856c81461018a578063715018a6146101e2575b600080fd5b6101466004803603604081101561012657600080fd5b8101908080359060200190929190803590602001909291905050506106e1565b6040518082815260200191505060405180910390f35b6101886004803603602081101561017257600080fd5b810190808035906020019092919050505061071a565b005b6101b6600480360360208110156101a057600080fd5b81019080803590602001909291905050506109be565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101ea6109fa565b005b61022e6004803603602081101561020257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b80565b005b610238610d9e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102a66004803603602081101561027a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dc7565b005b6102b0611009565b6040518082815260200191505060405180910390f35b6102f2600480360360208110156102dc57600080fd5b810190808035906020019092919050505061100f565b6040518082815260200191505060405180910390f35b6103346004803603602081101561031e57600080fd5b8101908080359060200190929190505050611027565b005b6104236004803603608081101561034c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561039d57600080fd5b8201836020820111156103af57600080fd5b803590602001918460018302840111640100000000831117156103d157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611141565b60405180821515815260200191505060405180910390f35b610571600480360361012081101561045257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001906401000000008111156104eb57600080fd5b8201836020820111156104fd57600080fd5b8035906020019184600183028401116401000000008311171561051f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061119b565b005b61057b6115ae565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610633600480360360808110156105bd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115d4565b005b6106776004803603602081101561064b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116b0565b005b6106816118bb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106b56118e1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008282604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120905092915050565b610722611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600680549050811061085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c696420696e6465780000000000000000000000000000000000000081525060200191505060405180910390fd5b60006006828154811061086b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506006600160068054905003815481106108ad57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600683815481106108e557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600680548061093857fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590557f7d9ce70f39c0d594d373d4b779781839de1debeda94cbb04501bc0773a1199eb81604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b600681815481106109cb57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a02611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ac2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610b88611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ceb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c6964206167656e740000000000000000000000000000000000000081525060200191505060405180910390fd5b6006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f13380ad6c58c6a2855a70fd3970b4fe598e8b60a683408ec8a5896b680188acd81604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610dcf611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c69642062726964676500000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9f06c577a12d8beda856a3cceddf7befcb12da366ce49400e869c0104ee10d6a8183604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b60015481565b60056020528060005260406000206000915090505481565b61102f611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61113e600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361190f565b50565b60008061114e85856106e1565b90508573ffffffffffffffffffffffffffffffffffffffff166111796111738361194e565b856119a6565b73ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b60026006805490501015611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c6964206167656e747300000000000000000000000000000000000081525060200191505060405180910390fd5b8486101561128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c696420616d6f756e7400000000000000000000000000000000000081525060200191505060405180910390fd5b60068054905060410281511461130b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c6964206c656e67746800000000000000000000000000000000000081525060200191505060405180910390fd5b60005b6006805490508110156114335760006006828154811061132a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506060604167ffffffffffffffff8111801561137157600080fd5b506040519080825280601f01601f1916602001820160405280156113a45781602001600182028036833780820191505090505b50905060005b60418110156114175784818560410201815181106113c457fe5b602001015160f81c60f81b8282815181106113db57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506113aa565b5061142482878784611c3a565b5050808060010191505061130e565b50611483600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687611d73565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639962ab028a8a8a8a8a8a8a6040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001838152602001828152602001975050505050505050600060405180830381600087803b15801561155457600080fd5b505af1158015611568573d6000803e3d6000fd5b505050506000801b60056000858152602001908152602001600020541461158b57fe5b816005600085815260200190815260200160002081905550505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600154146115e057fe5b8360018190555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6116b8611907565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611778576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806127346026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600081141561191d57611949565b61194882828573ffffffffffffffffffffffffffffffffffffffff16611eae9092919063ffffffff16565b5b505050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b60006041825114611a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45434453413a20696e76616c6964207369676e6174757265206c656e6774680081525060200191505060405180910390fd5b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611ab8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127836022913960400191505060405180910390fd5b601b8160ff161480611acd5750601c8160ff16145b611b22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127cb6022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611b7e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f45434453413a20696e76616c6964207369676e6174757265000000000000000081525060200191505060405180910390fd5b8094505050505092915050565b611c4684848484611141565b611cb8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f696e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b81838573ffffffffffffffffffffffffffffffffffffffff167f4340c96ce644c32751742ec87ed5ec4100a14c63818baf04ed49d6c3b0bf852f846040518080602001828103825283818151815260200191508051906020019080838360005b83811015611d33578082015181840152602081019050611d18565b50505050905090810190601f168015611d605780820380516001836020036101000a031916815260200191505b509250505060405180910390a450505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611dfa57600080fd5b505afa158015611e0e573d6000803e3d6000fd5b505050506040513d6020811015611e2457600080fd5b8101908080519060200190929190505050905081811115611e7157611e6c838383038673ffffffffffffffffffffffffffffffffffffffff16611f509092919063ffffffff16565b611ea8565b81811015611ea757611ea6838284038673ffffffffffffffffffffffffffffffffffffffff166120e39092919063ffffffff16565b5b5b50505050565b611f4b8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061225c565b505050565b600061203e8260405180606001604052806029815260200161275a602991398673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611ff457600080fd5b505afa158015612008573d6000803e3d6000fd5b505050506040513d602081101561201e57600080fd5b810190808051906020019092919050505061234b9092919063ffffffff16565b90506120dd8463095ea7b360e01b8584604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061225c565b50505050565b60006121b7828573ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561216e57600080fd5b505afa158015612182573d6000803e3d6000fd5b505050506040513d602081101561219857600080fd5b810190808051906020019092919050505061240b90919063ffffffff16565b90506122568463095ea7b360e01b8584604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061225c565b50505050565b60606122be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124939092919063ffffffff16565b9050600081511115612346578080602001905160208110156122df57600080fd5b8101908080519060200190929190505050612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806127ed602a913960400191505060405180910390fd5b5b505050565b60008383111582906123f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156123bd5780820151818401526020810190506123a2565b50505050905090810190601f1680156123ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60606124a284846000856124ab565b90509392505050565b606082471015612506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806127a56026913960400191505060405180910390fd5b61250f85612654565b612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106125d157805182526020820191506020810190506020830392506125ae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612633576040519150601f19603f3d011682016040523d82523d6000602084013e612638565b606091505b5091509150612648828286612667565b92505050949350505050565b600080823b905060008111915050919050565b606083156126775782905061272c565b60008351111561268a5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126f15780820151818401526020810190506126d6565b50505050905090810190601f16801561271e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735361666545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f45434453413a20696e76616c6964207369676e6174757265202773272076616c7565416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c45434453413a20696e76616c6964207369676e6174757265202776272076616c75655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122033dc0e5b2a8019df999779d3ef664337ab7725b172d61bd0641a6fa495d2e2a664736f6c634300060c0033
Deployed Bytecode Sourcemap
32277:2468:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7166:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34244:245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32486:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2781:148;;;:::i;:::-;;34078:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2139:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33850:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32331:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32432:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33729:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7336:287;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32729:995;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32357:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32515:209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3084:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32382:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32406;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;7166:165;7250:13;7306:11;7319:5;7289:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7279:47;;;;;;7272:54;;7166:165;;;;:::o;34244:245::-;2361:12;:10;:12::i;:::-;2351:22;;:6;;;;;;;;;;:22;;;2343:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34324:6:::1;:13;;;;34315:6;:22;34307:48;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;34360:14;34377:6;34384;34377:14;;;;;;;;;;;;;;;;;;;;;;;;;34360:31;;34413:6;34436:1;34420:6;:13;;;;:17;34413:25;;;;;;;;;;;;;;;;;;;;;;;;;34396:6;34403;34396:14;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;34443:6;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34465:19;34477:6;34465:19;;;;;;;;;;;;;;;;;;;;2421:1;34244:245:::0;:::o;32486:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2781:148::-;2361:12;:10;:12::i;:::-;2351:22;;:6;;;;;;;;;;:22;;;2343:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2888:1:::1;2851:40;;2872:6;::::0;::::1;;;;;;;;2851:40;;;;;;;;;;;;2919:1;2902:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2781:148::o:0;34078:161::-;2361:12;:10;:12::i;:::-;2351:22;;:6;;;;;;;;;;:22;;;2343:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34164:1:::1;34146:20;;:6;:20;;;;34138:46;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;34189:6;34201;34189:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34218:16;34227:6;34218:16;;;;;;;;;;;;;;;;;;;;34078:161:::0;:::o;2139:79::-;2177:7;2204:6;;;;;;;;;;;2197:13;;2139:79;:::o;33850:223::-;2361:12;:10;:12::i;:::-;2351:22;;:6;;;;;;;;;;:22;;;2343:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33945:1:::1;33923:24;;:10;:24;;;;33915:51;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33971:18;33992:6;;;;;;;;;;;33971:27;;34012:10;34003:6;;:19;;;;;;;;;;;;;;;;;;34032:36;34045:10;34057;34032:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;2421:1;33850:223:::0;:::o;32331:22::-;;;;:::o;32432:48::-;;;;;;;;;;;;;;;;;:::o;33729:116::-;2361:12;:10;:12::i;:::-;2351:22;;:6;;;;;;;;;;:22;;;2343:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33797:43:::1;33818:5;;;;;;;;;;;33825;;;;;;;;;;;33832:7;33797:20;:43::i;:::-;33729:116:::0;:::o;7336:287::-;7461:11;7481:13;7497:37;7515:11;7528:5;7497:17;:37::i;:::-;7481:53;;7612:6;7546:72;;:62;7560:35;7589:5;7560:28;:35::i;:::-;7597:10;7546:13;:62::i;:::-;:72;;;7539:79;;;7336:287;;;;;;:::o;32729:995::-;32987:1;32970:6;:13;;;;:18;;32962:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33037:13;33020;:30;;33012:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33109:6;:13;;;;33104:2;:18;33082:11;:18;:40;33074:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33151:10;33146:296;33172:6;:13;;;;33167:2;:18;33146:296;;;33199:14;33216:6;33223:2;33216:10;;;;;;;;;;;;;;;;;;;;;;;;;33199:27;;33232:23;33268:2;33258:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33232:39;;33282:10;33277:92;33303:2;33298;:7;33277:92;;;33337:11;33359:2;33354;33349;:7;:12;33337:25;;;;;;;;;;;;;;;;33320:10;33331:2;33320:14;;;;;;;;;;;:42;;;;;;;;;;;33307:4;;;;;;;33277:92;;;;33374:62;33397:6;33405:11;33418:5;33425:10;33374:22;:62::i;:::-;33146:296;;33187:4;;;;;;;33146:296;;;;33446:53;33470:5;;;;;;;;;;;33477:6;;;;;;;;;;;33485:13;33446:23;:53::i;:::-;33518:6;;;;;;;;;;;33504:30;;;33535:13;33550:14;33566:7;33575:13;33590;33605:10;33617:11;33504:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33678:1;33670:10;;33641:12;:25;33654:11;33641:25;;;;;;;;;;;;:39;33634:47;;;;33714:5;33686:12;:25;33699:11;33686:25;;;;;;;;;;;:33;;;;32729:995;;;;;;;;;:::o;32357:21::-;;;;;;;;;;;;;:::o;32515:209::-;32635:1;32624:7;;:12;32617:20;;;;32652:8;32642:7;:18;;;;32674:7;32665:6;;:16;;;;;;;;;;;;;;;;;;32694:6;32686:5;;:14;;;;;;;;;;;;;;;;;;32713:6;32705:5;;:14;;;;;;;;;;;;;;;;;;32515:209;;;;:::o;3084:244::-;2361:12;:10;:12::i;:::-;2351:22;;:6;;;;;;;;;;:22;;;2343:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3193:1:::1;3173:22;;:8;:22;;;;3165:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3283:8;3254:38;;3275:6;::::0;::::1;;;;;;;;3254:38;;;;;;;;;;;;3312:8;3303:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;3084:244:::0;:::o;32382:20::-;;;;;;;;;;;;;:::o;32406:::-;;;;;;;;;;;;;:::o;676:106::-;729:15;764:10;757:17;;676:106;:::o;27834:157::-;27931:1;27920:7;:12;27916:25;;;27934:7;;27916:25;27945:41;27973:3;27978:7;27952:6;27945:27;;;;:41;;;;;:::i;:::-;27834:157;;;;:::o;6783:269::-;6852:7;7038:4;6985:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6975:69;;;;;;6968:76;;6783:269;;;:::o;4458:2051::-;4536:7;4619:2;4599:9;:16;:22;4595:96;;4638:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4595:96;4760:9;4780;4800:7;5052:4;5041:9;5037:20;5031:27;5026:32;;5098:4;5087:9;5083:20;5077:27;5072:32;;5152:4;5141:9;5137:20;5131:27;5128:1;5123:36;5118:41;;6087:66;6081:1;6073:10;;:80;;6065:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6216:2;6211:1;:7;;;:18;;;;6227:2;6222:1;:7;;;6211:18;6203:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6366:14;6383:24;6393:4;6399:1;6402;6405;6383:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6366:41;;6444:1;6426:20;;:6;:20;;;;6418:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6495:6;6488:13;;;;;;4458:2051;;;;:::o;7628:281::-;7761:57;7779:6;7787:11;7800:5;7807:10;7761:17;:57::i;:::-;7753:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7886:5;7873:11;7865:6;7850:54;;;7893:10;7850:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7628:281;;;;:::o;27271:373::-;27356:18;27384:6;27377:24;;;27410:4;27417:3;27377:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27356:65;;27443:7;27430:10;:20;27426:214;;;27458:63;27495:3;27513:7;27500:10;:20;27465:6;27458:36;;;;:63;;;;;:::i;:::-;27426:214;;;27556:7;27543:10;:20;27539:101;;;27571:63;27608:3;27623:10;27613:7;:20;27578:6;27571:36;;;;:63;;;;;:::i;:::-;27539:101;27426:214;27271:373;;;;:::o;23927:177::-;24010:86;24030:5;24060:23;;;24085:2;24089:5;24037:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24010:19;:86::i;:::-;23927:177;;;:::o;25510:331::-;25607:20;25630:95;25674:5;25630:95;;;;;;;;;;;;;;;;;:5;:15;;;25654:4;25661:7;25630:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:43;;:95;;;;;:::i;:::-;25607:118;;25736:97;25756:5;25786:22;;;25810:7;25819:12;25763:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25736:19;:97::i;:::-;25510:331;;;;:::o;25216:286::-;25313:20;25336:50;25380:5;25336;:15;;;25360:4;25367:7;25336:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:43;;:50;;;;:::i;:::-;25313:73;;25397:97;25417:5;25447:22;;;25471:7;25480:12;25424:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25397:19;:97::i;:::-;25216:286;;;;:::o;26232:761::-;26656:23;26682:69;26710:4;26682:69;;;;;;;;;;;;;;;;;26690:5;26682:27;;;;:69;;;;;:::i;:::-;26656:95;;26786:1;26766:10;:17;:21;26762:224;;;26908:10;26897:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26889:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26762:224;26232:761;;;:::o;12679:192::-;12765:7;12798:1;12793;:6;;12801:12;12785:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12825:9;12841:1;12837;:5;12825:17;;12862:1;12855:8;;;12679:192;;;;;:::o;11776:181::-;11834:7;11854:9;11870:1;11866;:5;11854:17;;11895:1;11890;:6;;11882:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11948:1;11941:8;;;11776:181;;;;:::o;19926:195::-;20029:12;20061:52;20083:6;20091:4;20097:1;20100:12;20061:21;:52::i;:::-;20054:59;;19926:195;;;;;:::o;20978:530::-;21105:12;21163:5;21138:21;:30;;21130:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21230:18;21241:6;21230:10;:18::i;:::-;21222:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21356:12;21370:23;21397:6;:11;;21417:5;21425:4;21397:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21355:75;;;;21448:52;21466:7;21475:10;21487:12;21448:17;:52::i;:::-;21441:59;;;;20978:530;;;;;;:::o;17008:422::-;17068:4;17276:12;17387:7;17375:20;17367:28;;17421:1;17414:4;:8;17407:15;;;17008:422;;;:::o;22514:742::-;22629:12;22658:7;22654:595;;;22689:10;22682:17;;;;22654:595;22823:1;22803:10;:17;:21;22799:439;;;23066:10;23060:17;23127:15;23114:10;23110:2;23106:19;23099:44;23014:148;23209:12;23202:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22514:742;;;;;;:::o
Swarm Source
ipfs://33dc0e5b2a8019df999779d3ef664337ab7725b172d61bd0641a6fa495d2e2a6
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
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.