Source Code
Overview
ETH Balance
ETH Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 8075381 | 535 days ago | 0 ETH | ||||
| 7946841 | 538 days ago | 0 ETH | ||||
| 7939692 | 538 days ago | 0 ETH | ||||
| 7938278 | 538 days ago | 0 ETH | ||||
| 7903513 | 539 days ago | 0 ETH | ||||
| 7901055 | 539 days ago | 0 ETH | ||||
| 7821634 | 541 days ago | 0 ETH | ||||
| 7621970 | 545 days ago | 0 ETH | ||||
| 7374341 | 551 days ago | 0 ETH | ||||
| 7263444 | 554 days ago | 0 ETH | ||||
| 7236185 | 554 days ago | 0 ETH | ||||
| 7223332 | 554 days ago | 0 ETH | ||||
| 7014373 | 559 days ago | 0 ETH | ||||
| 6949369 | 561 days ago | 0 ETH | ||||
| 6857172 | 563 days ago | 0 ETH | ||||
| 6815010 | 564 days ago | 0 ETH | ||||
| 6736051 | 566 days ago | 0 ETH | ||||
| 6690949 | 567 days ago | 0 ETH | ||||
| 6660203 | 568 days ago | 0 ETH | ||||
| 6606174 | 569 days ago | 0 ETH | ||||
| 6603411 | 569 days ago | 0 ETH | ||||
| 6523173 | 571 days ago | 0 ETH | ||||
| 6519198 | 571 days ago | 0 ETH | ||||
| 6511530 | 571 days ago | 0 ETH | ||||
| 6501732 | 571 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DCBWalletStore
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
import { IERC20Upgradeable } from "openzeppelin-contracts-upgradeable/contracts/token/ERC20/IERC20Upgradeable.sol";
import {
OwnableUpgradeable,
Initializable
} from "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol";
import { EnumerableSetUpgradeable } from
"openzeppelin-contracts-upgradeable/contracts/utils/structs/EnumerableSetUpgradeable.sol";
import { IDCBTiers } from "src/interfaces/IDCBTiers.sol";
contract DCBWalletStore is Initializable, OwnableUpgradeable {
using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet;
struct Reward {
string name;
uint256 amount;
}
struct User {
uint256 lastAccessTime;
address[] referrals;
address referrer;
uint256 totalClaimed;
uint256 totalClaimable;
}
uint256 public waitTime;
EnumerableSetUpgradeable.AddressSet private verifiedUsers;
IERC20Upgradeable public token;
IDCBTiers public tiers;
mapping(address => User) public users;
Reward[] public rewards;
uint256 public minTierForReferrer;
uint256 public minTierForReferree;
event ReferralRegistered(address indexed referrer, address indexed referree, uint256 reward);
event UserAdded(address indexed user);
event UserReplaced(address indexed oldAddress, address indexed newAddress);
modifier hasWaited(address _address) {
require(block.timestamp >= users[_address].lastAccessTime + waitTime, "Wallet changed recently");
_;
}
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function batchAddUser(address[] calldata _users) external onlyOwner returns (bool) {
uint256 len = _users.length;
for (uint256 i = 0; i < len; i++) {
addUser(_users[i]);
}
return true;
}
function replaceUser(address oldAddress, address newAddress) external hasWaited(oldAddress) returns (bool) {
require(msg.sender == oldAddress || msg.sender == owner(), "user doesn't have permission");
require(!verifiedUsers.contains(newAddress), "new address already verified");
verifiedUsers.remove(oldAddress);
verifiedUsers.add(newAddress);
users[newAddress] = users[oldAddress];
delete users[oldAddress];
return true;
}
// referrer - Person who invites
// referree - Person who was invited
function refer(address _referrer, address _referree) external onlyOwner returns (bool) {
require(users[_referree].referrer == address(0), "Already referred");
require(_referrer != _referree, "Self referring prohibited");
require(verifiedUsers.contains(_referrer) && verifiedUsers.contains(_referree), "Not verified");
(, uint256 tier,) = tiers.getTierOfUser(_referree);
require(tier >= minTierForReferree, "Not eligible for rewards");
users[_referrer].referrals.push(_referree);
users[_referree].referrer = _referrer;
uint256 reward = getRewardForUser(_referree);
users[_referrer].totalClaimable += reward;
users[_referree].totalClaimed += reward;
bool success = token.transfer(_referree, reward);
emit ReferralRegistered(_referrer, _referree, reward);
return success;
}
function claimReward() external {
require(verifiedUsers.contains(msg.sender), "Not verified");
(, uint256 tier,) = tiers.getTierOfUser(msg.sender);
require(tier >= minTierForReferrer, "Not eligible for rewards");
require(users[msg.sender].totalClaimable > 0, "Nothing to claim");
uint256 reward = users[msg.sender].totalClaimable;
users[msg.sender].totalClaimable = 0;
users[msg.sender].totalClaimed += reward;
bool success = token.transfer(msg.sender, reward);
require(success, "Transfer failed");
}
function setReferralReward(uint256 _tier, Reward calldata _newRewards) external onlyOwner returns (bool) {
rewards[_tier] = _newRewards;
return true;
}
function setContracts(address _newToken, address _newTier) external onlyOwner returns (bool) {
token = IERC20Upgradeable(_newToken);
tiers = IDCBTiers(_newTier);
return true;
}
function setMinTiers(uint256 _newMinForReferrer, uint256 _newMinForReferree) external onlyOwner returns (bool) {
minTierForReferrer = _newMinForReferrer;
minTierForReferree = _newMinForReferree;
return true;
}
function transferToken(address _addr, uint256 _amount) external onlyOwner returns (bool) {
IERC20Upgradeable _token = IERC20Upgradeable(_addr);
bool success = _token.transfer(address(owner()), _amount);
return success;
}
function getVerifiedUsers() external view returns (address[] memory) {
return verifiedUsers.values();
}
function getReferrals(address _user) external view returns (address[] memory) {
return (users[_user].referrals);
}
function getRewardForUser(address _user) public view returns (uint256 amount) {
(bool flag, uint256 tier, uint256 multi) = tiers.getTierOfUser(_user);
amount = flag ? rewards[tier].amount * multi : 0;
}
function isVerified(address _user) external view returns (bool) {
return verifiedUsers.contains(_user);
}
function initialize(uint256 _waitTime, address _token, address _tiers) public initializer {
__Ownable_init();
waitTime = _waitTime;
token = IERC20Upgradeable(_token);
tiers = IDCBTiers(_tiers);
rewards.push(Reward("Base", 60 * 10e18));
rewards.push(Reward("Bronze", 150 * 10e18));
rewards.push(Reward("Silver", 300 * 10e18));
rewards.push(Reward("Gold", 600 * 10e18));
rewards.push(Reward("Platinum", 1200 * 10e18));
rewards.push(Reward("Diamond", 2400 * 10e18));
minTierForReferrer = 3;
}
function addUser(address _address) public onlyOwner returns (bool) {
bool status = verifiedUsers.add(_address);
emit UserAdded(_address);
return status;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @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.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
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.
*
* 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.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* 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.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
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.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized < type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}// SPDX-License-Identifier: MIT
// 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 IERC20Upgradeable {
/**
* @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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or 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 {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSetUpgradeable {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastValue;
// Update the index for the moved value
set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: UNLICENSED
//** DCB Crowdfunding Interface */
//** Author Aaron & Aceson : DCB 2023.2 */
pragma solidity 0.8.19;
interface IDCBTiers {
/**
*
* @dev Tier struct
*
* @param {minLimit} Minimum amount of dcb to be staked to join tier
* @param {maxLimit} Maximum amount of dcb to be staked to join tier
*
*/
struct Tier {
uint256 minLimit;
uint256 maxLimit;
uint256 refundFee;
}
function tierInfo(uint256 idx) external returns (uint256, uint256, uint256);
function getTierOfUser(address addr) external view returns (bool flag, uint256 pos, uint256 multiplier);
function getTierAndDepositOfUser(address addr)
external
view
returns (bool flag, uint256 pos, uint256 multiplier, uint256 totalDeposit);
}{
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": [
"@prb/test/=lib/prb-math/lib/prb-test/src/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"src/=src/",
"v2-periphery/=lib/v2-periphery/contracts/",
"layerzero/=lib/LayerZero/contracts/",
"LayerZero/=lib/LayerZero/contracts/",
"prb-math/=lib/prb-math/src/",
"prb-test/=lib/prb-test/src/"
],
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":true,"internalType":"address","name":"referree","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"ReferralRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"UserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"UserReplaced","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"batchAddUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getReferrals","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getRewardForUser","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVerifiedUsers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_waitTime","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_tiers","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isVerified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTierForReferree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTierForReferrer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"address","name":"_referree","type":"address"}],"name":"refer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldAddress","type":"address"},{"internalType":"address","name":"newAddress","type":"address"}],"name":"replaceUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newToken","type":"address"},{"internalType":"address","name":"_newTier","type":"address"}],"name":"setContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinForReferrer","type":"uint256"},{"internalType":"uint256","name":"_newMinForReferree","type":"uint256"}],"name":"setMinTiers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tier","type":"uint256"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct DCBWalletStore.Reward","name":"_newRewards","type":"tuple"}],"name":"setReferralReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tiers","outputs":[{"internalType":"contract IDCBTiers","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"lastAccessTime","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"internalType":"uint256","name":"totalClaimable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"waitTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b5061001961001e565b6100de565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100dc576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6124a680620000ee6000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c8063a87430ba116100e3578063ef790a821161008c578063f454425511610066578063f4544255146103e3578063f6a413cc146103f6578063fc0c546a146103fe57600080fd5b8063ef790a821461039c578063f2fde38b146103af578063f301af42146103c257600080fd5b8063b9209e33116100bd578063b9209e331461036d578063ccca123b14610380578063d8952a491461038957600080fd5b8063a87430ba146102d1578063b4988fd014610352578063b88a802f1461036557600080fd5b806341a0894d11610145578063715018a61161011f578063715018a614610296578063861cb816146102a05780638da5cb5b146102b357600080fd5b806341a0894d1461021e578063421b2d8b1461023e5780634a95d9d51461025157600080fd5b80632c4a6923116101765780632c4a6923146101ef57806339fffeb014610202578063405bf0481461020b57600080fd5b806302c2e0b41461019d57806308a2b39c146101b95780631072cbea146101dc575b600080fd5b6101a6606d5481565b6040519081526020015b60405180910390f35b6101cc6101c7366004611d39565b61041e565b60405190151581526020016101b0565b6101cc6101ea366004611d7f565b61043c565b6101cc6101fd366004611da9565b610523565b6101a6606c5481565b6101cc610219366004611e1e565b610581565b61023161022c366004611e51565b61080f565b6040516101b09190611e6c565b6101cc61024c366004611e51565b6108a2565b6069546102719073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b0565b61029e610905565b005b6101cc6102ae366004611ec6565b610919565b60335473ffffffffffffffffffffffffffffffffffffffff16610271565b61031d6102df366004611e51565b606a602052600090815260409020805460028201546003830154600490930154919273ffffffffffffffffffffffffffffffffffffffff9091169184565b6040805194855273ffffffffffffffffffffffffffffffffffffffff90931660208501529183015260608201526080016101b0565b61029e610360366004611f14565b610951565b61029e610ed3565b6101cc61037b366004611e51565b611196565b6101a660655481565b6101cc610397366004611e1e565b6111a3565b6101a66103aa366004611e51565b611204565b61029e6103bd366004611e51565b6112e1565b6103d56103d0366004611f50565b61137e565b6040516101b0929190611f69565b6101cc6103f1366004611e1e565b61143a565b6102316118a0565b6068546102719073ffffffffffffffffffffffffffffffffffffffff1681565b60006104286118b1565b50606c829055606d81905560015b92915050565b60006104466118b1565b82600073ffffffffffffffffffffffffffffffffffffffff821663a9059cbb61048460335473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018790526044016020604051808303816000875af11580156104f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051a9190611fec565b95945050505050565b600061052d6118b1565b8160005b818110156105765761056385858381811061054e5761054e612007565b905060200201602081019061024c9190611e51565b508061056e81612065565b915050610531565b506001949350505050565b60655473ffffffffffffffffffffffffffffffffffffffff83166000908152606a6020526040812054909184916105b8919061209d565b42101561060c5760405162461bcd60e51b815260206004820152601760248201527f57616c6c6574206368616e67656420726563656e746c7900000000000000000060448201526064015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff85161480610647575060335473ffffffffffffffffffffffffffffffffffffffff1633145b6106935760405162461bcd60e51b815260206004820152601c60248201527f7573657220646f65736e27742068617665207065726d697373696f6e000000006044820152606401610603565b61069e606684611918565b156106eb5760405162461bcd60e51b815260206004820152601c60248201527f6e6577206164647265737320616c7265616479207665726966696564000000006044820152606401610603565b6106f660668561194a565b5061070260668461196c565b5073ffffffffffffffffffffffffffffffffffffffff8085166000908152606a60205260408082209286168252902081548155600180830180546107499284019190611cba565b5060028281015490820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92831617905560038084015490830155600492830154929091019190915584166000908152606a60205260408120818155906107cb6001830182611d0a565b506002810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556000600382018190556004909101555060019392505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152606a602090815260409182902060010180548351818402810184019094528084526060939283018282801561089657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161086b575b50505050509050919050565b60006108ac6118b1565b60006108b960668461196c565b60405190915073ffffffffffffffffffffffffffffffffffffffff8416907f19ef9a4877199f89440a26acb26895ec02ed86f2df1aeaa90dc18041b892f71f90600090a290505b919050565b61090d6118b1565b610917600061198e565b565b60006109236118b1565b81606b848154811061093757610937612007565b906000526020600020906002020181816105769190612180565b600054610100900460ff16158080156109715750600054600160ff909116105b8061098b5750303b15801561098b575060005460ff166001145b6109fd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610603565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a5b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610a63611a05565b60658490556068805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560698054928516929091169190911790556040805160808101825260049181019182527f42617365000000000000000000000000000000000000000000000000000000006060820152908152682086ac3510526000006020820152606b8054600181018255600091909152815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610b4d90826122f1565b506020918201516001918201556040805160808101825260069181019182527f42726f6e7a6500000000000000000000000000000000000000000000000000006060820152908152685150ae84a8cdf0000092810192909252606b80549182018155600052815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610be890826122f1565b506020918201516001918201556040805160808101825260069181019182527f53696c7665720000000000000000000000000000000000000000000000000000606082015290815268a2a15d09519be0000092810192909252606b80549182018155600052815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610c8390826122f1565b506020918201516001918201556040805160808101825260049181019182527f476f6c6400000000000000000000000000000000000000000000000000000000606082015290815269014542ba12a337c0000092810192909252606b80549182018155600052815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610d1f90826122f1565b506020918201516001918201556040805160808101825260089181019182527f506c6174696e756d000000000000000000000000000000000000000000000000606082015290815269028a857425466f80000092810192909252606b80549182018155600052815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610dbb90826122f1565b506020918201516001918201556040805160808101825260079181019182527f4469616d6f6e640000000000000000000000000000000000000000000000000060608201529081526905150ae84a8cdf00000092810192909252606b80549182018155600052815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610e5790826122f1565b50602091909101516001909101556003606c558015610ecd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610ede606633611918565b610f2a5760405162461bcd60e51b815260206004820152600c60248201527f4e6f7420766572696669656400000000000000000000000000000000000000006044820152606401610603565b6069546040517fb477585e00000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff169063b477585e90602401606060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd919061240b565b50915050606c548110156110135760405162461bcd60e51b815260206004820152601860248201527f4e6f7420656c696769626c6520666f72207265776172647300000000000000006044820152606401610603565b336000908152606a60205260409020600401546110725760405162461bcd60e51b815260206004820152601060248201527f4e6f7468696e6720746f20636c61696d000000000000000000000000000000006044820152606401610603565b336000908152606a602052604081206004810180549083905560039091018054919283926110a190849061209d565b90915550506068546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810183905260009173ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044016020604051808303816000875af115801561111e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111429190611fec565b9050806111915760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610603565b505050565b6000610436606683611918565b60006111ad6118b1565b506068805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560698054929093169116179055600190565b6069546040517fb477585e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152600092839283928392169063b477585e90602401606060405180830381865afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f919061240b565b925092509250826112b157600061051a565b80606b83815481106112c5576112c5612007565b90600052602060002090600202016001015461051a9190612440565b6112e96118b1565b73ffffffffffffffffffffffffffffffffffffffff81166113725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610603565b61137b8161198e565b50565b606b818154811061138e57600080fd5b90600052602060002090600202016000915090508060000180546113b1906120df565b80601f01602080910402602001604051908101604052809291908181526020018280546113dd906120df565b801561142a5780601f106113ff5761010080835404028352916020019161142a565b820191906000526020600020905b81548152906001019060200180831161140d57829003601f168201915b5050505050908060010154905082565b60006114446118b1565b73ffffffffffffffffffffffffffffffffffffffff8281166000908152606a602052604090206002015416156114bc5760405162461bcd60e51b815260206004820152601060248201527f416c7265616479207265666572726564000000000000000000000000000000006044820152606401610603565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115375760405162461bcd60e51b815260206004820152601960248201527f53656c6620726566657272696e672070726f68696269746564000000000000006044820152606401610603565b611542606684611918565b80156115545750611554606683611918565b6115a05760405162461bcd60e51b815260206004820152600c60248201527f4e6f7420766572696669656400000000000000000000000000000000000000006044820152606401610603565b6069546040517fb477585e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152600092169063b477585e90602401606060405180830381865afa158015611611573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611635919061240b565b50915050606d5481101561168b5760405162461bcd60e51b815260206004820152601860248201527f4e6f7420656c696769626c6520666f72207265776172647300000000000000006044820152606401610603565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152606a60209081526040808320600190810180549182018155845291832090910180549488167fffffffffffffffffffffffff0000000000000000000000000000000000000000958616811790915582528120600201805490931690911790915561171184611204565b73ffffffffffffffffffffffffffffffffffffffff86166000908152606a602052604081206004018054929350839290919061174e90849061209d565b909155505073ffffffffffffffffffffffffffffffffffffffff84166000908152606a60205260408120600301805483929061178b90849061209d565b90915550506068546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af115801561180a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182e9190611fec565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f90eab5d1df713df401d810f26aa9718d2b9e6894af1eb4890a332d3b185dc0e58460405161188f91815260200190565b60405180910390a395945050505050565b60606118ac6066611a8a565b905090565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610603565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415155b9392505050565b60006119438373ffffffffffffffffffffffffffffffffffffffff8416611a97565b60006119438373ffffffffffffffffffffffffffffffffffffffff8416611b8a565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16611a825760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610603565b610917611bd9565b6060600061194383611c5f565b60008181526001830160205260408120548015611b80576000611abb600183612457565b8554909150600090611acf90600190612457565b9050818114611b34576000866000018281548110611aef57611aef612007565b9060005260206000200154905080876000018481548110611b1257611b12612007565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611b4557611b4561246a565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610436565b6000915050610436565b6000818152600183016020526040812054611bd157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610436565b506000610436565b600054610100900460ff16611c565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610603565b6109173361198e565b60608160000180548060200260200160405190810160405280929190818152602001828054801561089657602002820191906000526020600020905b815481526020019060010190808311611c9b5750505050509050919050565b828054828255906000526020600020908101928215611cfa5760005260206000209182015b82811115611cfa578254825591600101919060010190611cdf565b50611d06929150611d24565b5090565b508054600082559060005260206000209081019061137b91905b5b80821115611d065760008155600101611d25565b60008060408385031215611d4c57600080fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461090057600080fd5b60008060408385031215611d9257600080fd5b611d9b83611d5b565b946020939093013593505050565b60008060208385031215611dbc57600080fd5b823567ffffffffffffffff80821115611dd457600080fd5b818501915085601f830112611de857600080fd5b813581811115611df757600080fd5b8660208260051b8501011115611e0c57600080fd5b60209290920196919550909350505050565b60008060408385031215611e3157600080fd5b611e3a83611d5b565b9150611e4860208401611d5b565b90509250929050565b600060208284031215611e6357600080fd5b61194382611d5b565b6020808252825182820181905260009190848201906040850190845b81811015611eba57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611e88565b50909695505050505050565b60008060408385031215611ed957600080fd5b82359150602083013567ffffffffffffffff811115611ef757600080fd5b830160408186031215611f0957600080fd5b809150509250929050565b600080600060608486031215611f2957600080fd5b83359250611f3960208501611d5b565b9150611f4760408501611d5b565b90509250925092565b600060208284031215611f6257600080fd5b5035919050565b604081526000835180604084015260005b81811015611f975760208187018101516060868401015201611f7a565b5060006060828501015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150508260208301529392505050565b8051801515811461090057600080fd5b600060208284031215611ffe57600080fd5b61194382611fdc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361209657612096612036565b5060010190565b8082018082111561043657610436612036565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c908216806120f357607f821691505b60208210810361212c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561119157600081815260208120601f850160051c810160208610156121595750805b601f850160051c820191505b8181101561217857828155600101612165565b505050505050565b81357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18336030181126121b257600080fd5b8201803567ffffffffffffffff8111156121cb57600080fd5b602081360381840113156121de57600080fd5b6121f2826121ec86546120df565b86612132565b6000601f831160018114612246576000841561221057508482018301355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1786556122df565b6000868152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851690835b82811015612296578785018601358255938501936001909101908501612275565b50858210156122d3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88760031b161c198585890101351681555b505060018460011b0186555b50508085013560018501555050505050565b815167ffffffffffffffff81111561230b5761230b6120b0565b61231f8161231984546120df565b84612132565b602080601f831160018114612372576000841561233c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612178565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156123bf578886015182559484019460019091019084016123a0565b50858210156123fb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008060006060848603121561242057600080fd5b61242984611fdc565b925060208401519150604084015190509250925092565b808202811582820484141761043657610436612036565b8181038181111561043657610436612036565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101985760003560e01c8063a87430ba116100e3578063ef790a821161008c578063f454425511610066578063f4544255146103e3578063f6a413cc146103f6578063fc0c546a146103fe57600080fd5b8063ef790a821461039c578063f2fde38b146103af578063f301af42146103c257600080fd5b8063b9209e33116100bd578063b9209e331461036d578063ccca123b14610380578063d8952a491461038957600080fd5b8063a87430ba146102d1578063b4988fd014610352578063b88a802f1461036557600080fd5b806341a0894d11610145578063715018a61161011f578063715018a614610296578063861cb816146102a05780638da5cb5b146102b357600080fd5b806341a0894d1461021e578063421b2d8b1461023e5780634a95d9d51461025157600080fd5b80632c4a6923116101765780632c4a6923146101ef57806339fffeb014610202578063405bf0481461020b57600080fd5b806302c2e0b41461019d57806308a2b39c146101b95780631072cbea146101dc575b600080fd5b6101a6606d5481565b6040519081526020015b60405180910390f35b6101cc6101c7366004611d39565b61041e565b60405190151581526020016101b0565b6101cc6101ea366004611d7f565b61043c565b6101cc6101fd366004611da9565b610523565b6101a6606c5481565b6101cc610219366004611e1e565b610581565b61023161022c366004611e51565b61080f565b6040516101b09190611e6c565b6101cc61024c366004611e51565b6108a2565b6069546102719073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b0565b61029e610905565b005b6101cc6102ae366004611ec6565b610919565b60335473ffffffffffffffffffffffffffffffffffffffff16610271565b61031d6102df366004611e51565b606a602052600090815260409020805460028201546003830154600490930154919273ffffffffffffffffffffffffffffffffffffffff9091169184565b6040805194855273ffffffffffffffffffffffffffffffffffffffff90931660208501529183015260608201526080016101b0565b61029e610360366004611f14565b610951565b61029e610ed3565b6101cc61037b366004611e51565b611196565b6101a660655481565b6101cc610397366004611e1e565b6111a3565b6101a66103aa366004611e51565b611204565b61029e6103bd366004611e51565b6112e1565b6103d56103d0366004611f50565b61137e565b6040516101b0929190611f69565b6101cc6103f1366004611e1e565b61143a565b6102316118a0565b6068546102719073ffffffffffffffffffffffffffffffffffffffff1681565b60006104286118b1565b50606c829055606d81905560015b92915050565b60006104466118b1565b82600073ffffffffffffffffffffffffffffffffffffffff821663a9059cbb61048460335473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018790526044016020604051808303816000875af11580156104f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051a9190611fec565b95945050505050565b600061052d6118b1565b8160005b818110156105765761056385858381811061054e5761054e612007565b905060200201602081019061024c9190611e51565b508061056e81612065565b915050610531565b506001949350505050565b60655473ffffffffffffffffffffffffffffffffffffffff83166000908152606a6020526040812054909184916105b8919061209d565b42101561060c5760405162461bcd60e51b815260206004820152601760248201527f57616c6c6574206368616e67656420726563656e746c7900000000000000000060448201526064015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff85161480610647575060335473ffffffffffffffffffffffffffffffffffffffff1633145b6106935760405162461bcd60e51b815260206004820152601c60248201527f7573657220646f65736e27742068617665207065726d697373696f6e000000006044820152606401610603565b61069e606684611918565b156106eb5760405162461bcd60e51b815260206004820152601c60248201527f6e6577206164647265737320616c7265616479207665726966696564000000006044820152606401610603565b6106f660668561194a565b5061070260668461196c565b5073ffffffffffffffffffffffffffffffffffffffff8085166000908152606a60205260408082209286168252902081548155600180830180546107499284019190611cba565b5060028281015490820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92831617905560038084015490830155600492830154929091019190915584166000908152606a60205260408120818155906107cb6001830182611d0a565b506002810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556000600382018190556004909101555060019392505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152606a602090815260409182902060010180548351818402810184019094528084526060939283018282801561089657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161086b575b50505050509050919050565b60006108ac6118b1565b60006108b960668461196c565b60405190915073ffffffffffffffffffffffffffffffffffffffff8416907f19ef9a4877199f89440a26acb26895ec02ed86f2df1aeaa90dc18041b892f71f90600090a290505b919050565b61090d6118b1565b610917600061198e565b565b60006109236118b1565b81606b848154811061093757610937612007565b906000526020600020906002020181816105769190612180565b600054610100900460ff16158080156109715750600054600160ff909116105b8061098b5750303b15801561098b575060005460ff166001145b6109fd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610603565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a5b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610a63611a05565b60658490556068805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560698054928516929091169190911790556040805160808101825260049181019182527f42617365000000000000000000000000000000000000000000000000000000006060820152908152682086ac3510526000006020820152606b8054600181018255600091909152815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610b4d90826122f1565b506020918201516001918201556040805160808101825260069181019182527f42726f6e7a6500000000000000000000000000000000000000000000000000006060820152908152685150ae84a8cdf0000092810192909252606b80549182018155600052815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610be890826122f1565b506020918201516001918201556040805160808101825260069181019182527f53696c7665720000000000000000000000000000000000000000000000000000606082015290815268a2a15d09519be0000092810192909252606b80549182018155600052815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610c8390826122f1565b506020918201516001918201556040805160808101825260049181019182527f476f6c6400000000000000000000000000000000000000000000000000000000606082015290815269014542ba12a337c0000092810192909252606b80549182018155600052815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610d1f90826122f1565b506020918201516001918201556040805160808101825260089181019182527f506c6174696e756d000000000000000000000000000000000000000000000000606082015290815269028a857425466f80000092810192909252606b80549182018155600052815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610dbb90826122f1565b506020918201516001918201556040805160808101825260079181019182527f4469616d6f6e640000000000000000000000000000000000000000000000000060608201529081526905150ae84a8cdf00000092810192909252606b80549182018155600052815160029091027fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b401908190610e5790826122f1565b50602091909101516001909101556003606c558015610ecd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610ede606633611918565b610f2a5760405162461bcd60e51b815260206004820152600c60248201527f4e6f7420766572696669656400000000000000000000000000000000000000006044820152606401610603565b6069546040517fb477585e00000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff169063b477585e90602401606060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd919061240b565b50915050606c548110156110135760405162461bcd60e51b815260206004820152601860248201527f4e6f7420656c696769626c6520666f72207265776172647300000000000000006044820152606401610603565b336000908152606a60205260409020600401546110725760405162461bcd60e51b815260206004820152601060248201527f4e6f7468696e6720746f20636c61696d000000000000000000000000000000006044820152606401610603565b336000908152606a602052604081206004810180549083905560039091018054919283926110a190849061209d565b90915550506068546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810183905260009173ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044016020604051808303816000875af115801561111e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111429190611fec565b9050806111915760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610603565b505050565b6000610436606683611918565b60006111ad6118b1565b506068805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560698054929093169116179055600190565b6069546040517fb477585e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152600092839283928392169063b477585e90602401606060405180830381865afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f919061240b565b925092509250826112b157600061051a565b80606b83815481106112c5576112c5612007565b90600052602060002090600202016001015461051a9190612440565b6112e96118b1565b73ffffffffffffffffffffffffffffffffffffffff81166113725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610603565b61137b8161198e565b50565b606b818154811061138e57600080fd5b90600052602060002090600202016000915090508060000180546113b1906120df565b80601f01602080910402602001604051908101604052809291908181526020018280546113dd906120df565b801561142a5780601f106113ff5761010080835404028352916020019161142a565b820191906000526020600020905b81548152906001019060200180831161140d57829003601f168201915b5050505050908060010154905082565b60006114446118b1565b73ffffffffffffffffffffffffffffffffffffffff8281166000908152606a602052604090206002015416156114bc5760405162461bcd60e51b815260206004820152601060248201527f416c7265616479207265666572726564000000000000000000000000000000006044820152606401610603565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115375760405162461bcd60e51b815260206004820152601960248201527f53656c6620726566657272696e672070726f68696269746564000000000000006044820152606401610603565b611542606684611918565b80156115545750611554606683611918565b6115a05760405162461bcd60e51b815260206004820152600c60248201527f4e6f7420766572696669656400000000000000000000000000000000000000006044820152606401610603565b6069546040517fb477585e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152600092169063b477585e90602401606060405180830381865afa158015611611573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611635919061240b565b50915050606d5481101561168b5760405162461bcd60e51b815260206004820152601860248201527f4e6f7420656c696769626c6520666f72207265776172647300000000000000006044820152606401610603565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152606a60209081526040808320600190810180549182018155845291832090910180549488167fffffffffffffffffffffffff0000000000000000000000000000000000000000958616811790915582528120600201805490931690911790915561171184611204565b73ffffffffffffffffffffffffffffffffffffffff86166000908152606a602052604081206004018054929350839290919061174e90849061209d565b909155505073ffffffffffffffffffffffffffffffffffffffff84166000908152606a60205260408120600301805483929061178b90849061209d565b90915550506068546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af115801561180a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182e9190611fec565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f90eab5d1df713df401d810f26aa9718d2b9e6894af1eb4890a332d3b185dc0e58460405161188f91815260200190565b60405180910390a395945050505050565b60606118ac6066611a8a565b905090565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610603565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415155b9392505050565b60006119438373ffffffffffffffffffffffffffffffffffffffff8416611a97565b60006119438373ffffffffffffffffffffffffffffffffffffffff8416611b8a565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16611a825760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610603565b610917611bd9565b6060600061194383611c5f565b60008181526001830160205260408120548015611b80576000611abb600183612457565b8554909150600090611acf90600190612457565b9050818114611b34576000866000018281548110611aef57611aef612007565b9060005260206000200154905080876000018481548110611b1257611b12612007565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611b4557611b4561246a565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610436565b6000915050610436565b6000818152600183016020526040812054611bd157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610436565b506000610436565b600054610100900460ff16611c565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610603565b6109173361198e565b60608160000180548060200260200160405190810160405280929190818152602001828054801561089657602002820191906000526020600020905b815481526020019060010190808311611c9b5750505050509050919050565b828054828255906000526020600020908101928215611cfa5760005260206000209182015b82811115611cfa578254825591600101919060010190611cdf565b50611d06929150611d24565b5090565b508054600082559060005260206000209081019061137b91905b5b80821115611d065760008155600101611d25565b60008060408385031215611d4c57600080fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461090057600080fd5b60008060408385031215611d9257600080fd5b611d9b83611d5b565b946020939093013593505050565b60008060208385031215611dbc57600080fd5b823567ffffffffffffffff80821115611dd457600080fd5b818501915085601f830112611de857600080fd5b813581811115611df757600080fd5b8660208260051b8501011115611e0c57600080fd5b60209290920196919550909350505050565b60008060408385031215611e3157600080fd5b611e3a83611d5b565b9150611e4860208401611d5b565b90509250929050565b600060208284031215611e6357600080fd5b61194382611d5b565b6020808252825182820181905260009190848201906040850190845b81811015611eba57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611e88565b50909695505050505050565b60008060408385031215611ed957600080fd5b82359150602083013567ffffffffffffffff811115611ef757600080fd5b830160408186031215611f0957600080fd5b809150509250929050565b600080600060608486031215611f2957600080fd5b83359250611f3960208501611d5b565b9150611f4760408501611d5b565b90509250925092565b600060208284031215611f6257600080fd5b5035919050565b604081526000835180604084015260005b81811015611f975760208187018101516060868401015201611f7a565b5060006060828501015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150508260208301529392505050565b8051801515811461090057600080fd5b600060208284031215611ffe57600080fd5b61194382611fdc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361209657612096612036565b5060010190565b8082018082111561043657610436612036565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c908216806120f357607f821691505b60208210810361212c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561119157600081815260208120601f850160051c810160208610156121595750805b601f850160051c820191505b8181101561217857828155600101612165565b505050505050565b81357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18336030181126121b257600080fd5b8201803567ffffffffffffffff8111156121cb57600080fd5b602081360381840113156121de57600080fd5b6121f2826121ec86546120df565b86612132565b6000601f831160018114612246576000841561221057508482018301355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1786556122df565b6000868152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851690835b82811015612296578785018601358255938501936001909101908501612275565b50858210156122d3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88760031b161c198585890101351681555b505060018460011b0186555b50508085013560018501555050505050565b815167ffffffffffffffff81111561230b5761230b6120b0565b61231f8161231984546120df565b84612132565b602080601f831160018114612372576000841561233c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612178565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156123bf578886015182559484019460019091019084016123a0565b50858210156123fb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008060006060848603121561242057600080fd5b61242984611fdc565b925060208401519150604084015190509250925092565b808202811582820484141761043657610436612036565b8181038181111561043657610436612036565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
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.