Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CREDIT
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 5000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// _________ _________ _______ __________ // /__ __\| _____) / . \/ _____/ // |___| |___|\____\/___/ \___\________\ // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import "./ITRAC.sol"; import "./ITRACAssets.sol"; contract CREDIT is ERC20Upgradeable, OwnableUpgradeable, ReentrancyGuardUpgradeable { uint128 constant private DAY_SECONDS = uint128(60 * 60 * 24); uint128 constant private REWARD_PER_SECOND = 8 ether / DAY_SECONDS; uint128 constant private REWARD_BACKPACK_PER_SECOND = 10 ether / DAY_SECONDS; bool public claimPaused; uint128 public globalRewardsClaimed; struct RewardSummary { uint16[] tokens; uint128 claimableReward; uint128 dailyRewardRate; uint128 totalClaimed; uint48 lastClaimTimestamp; uint128 globalRewardsClaimed; uint256 balance; } struct OwnerRewards { uint128 totalClaimed; uint48 lastClaim; } mapping(address => OwnerRewards) public ownerRewards; ITRAC private _trac; ITRACAssets private _items; event ClaimReward(address owner, uint128 reward); function initialize(address trac, address community) public initializer { __ERC20_init_unchained("TRAC CREDIT", "CREDIT"); __Ownable_init_unchained(); __ReentrancyGuard_init_unchained(); _mint(address(this), 355555556 ether); _mint(community, 88888888 ether); _trac = ITRAC(trac); } function toggleClaims() public onlyOwner { claimPaused = !claimPaused; } struct Seconds { uint128 base; uint128 locker; uint128 backpack; uint128 all; } function summaryOf(address account) external view returns (RewardSummary memory summary) { ITRAC.TokenTime[] memory tokenTimes = _trac.tokenTimesOf(account); uint16[] memory tokens = new uint16[](tokenTimes.length); uint48 blockTimestamp = uint48(block.timestamp); uint48 lastClaim = ownerRewards[account].lastClaim; ITRACAssets.Purchases memory purchases = _items.getPurchases(account); uint48 backpack; uint48 locker; uint48 trac; Seconds memory sec; for (uint16 i; i < tokenTimes.length; i++) { if (tokenTimes[i].token != 0) { tokens[i] = tokenTimes[i].token; // Purchase times trac = lastClaim > tokenTimes[i].timestamp ? lastClaim : tokenTimes[i].timestamp; backpack = i < purchases.backpacks.length ? purchases.backpacks[i] : blockTimestamp; locker = i < purchases.lockers.length * 8 ? purchases.lockers[i / 8] : blockTimestamp; // Calculate reward seconds // (Based on purchase order) if (trac <= backpack && backpack <= locker) { // TRAC > BACKPACK > LOCKER sec.base += backpack - trac; sec.backpack += locker - backpack; sec.all += blockTimestamp - locker; } else if (trac <= locker && locker <= backpack) { // TRAC > LOCKER > BACKPACK sec.base += locker - trac; sec.locker += backpack - locker; sec.all += blockTimestamp - backpack; } else if (backpack <= trac && trac <= locker) { // BACKPACK > TRAC > LOCKER sec.backpack += locker - trac; sec.all += blockTimestamp - locker; } else if (locker <= trac && trac <= backpack) { // LOCKER > TRAC > BACKPACK sec.locker += backpack - trac; sec.all += blockTimestamp - backpack; } else { // * > TRAC sec.all += blockTimestamp - trac; } } } // Sum reward uint128 reward = (sec.base * REWARD_PER_SECOND) + (sec.locker * REWARD_PER_SECOND) + ((sec.locker * REWARD_PER_SECOND) / 2) + (sec.backpack * REWARD_BACKPACK_PER_SECOND) + (sec.all * REWARD_BACKPACK_PER_SECOND) + ((sec.all * REWARD_BACKPACK_PER_SECOND) / 2); // Store summary response summary = RewardSummary( tokens, reward, calculateDailyRewardRate(tokenTimes.length, purchases.backpacks.length, purchases.lockers.length), ownerRewards[account].totalClaimed, lastClaim, globalRewardsClaimed, balanceOf(account) ); } function claimRewards(uint16[] calldata tokens) external nonReentrant { require(tx.origin == msg.sender, "eos only"); require(!claimPaused, "claim paused"); require(tokens.length > 0, "empty tokens"); uint48 lastClaim = ownerRewards[msg.sender].lastClaim; ITRAC.OwnerTime[] memory ownerTimes = _trac.ownerTimesOf(tokens); uint48 blockTimestamp = uint48(block.timestamp); ITRACAssets.Purchases memory purchases = _items.getPurchases(msg.sender); uint48 backpack; uint48 locker; uint48 trac; Seconds memory sec; uint16 prevTokenId; for (uint16 i; i < ownerTimes.length; i++) { require(tokens[i] > prevTokenId, "out of order"); // prevent duplicates require(ownerTimes[i].owner == msg.sender, "not owner"); // Purchase times trac = lastClaim > ownerTimes[i].timestamp ? lastClaim : ownerTimes[i].timestamp; backpack = i < purchases.backpacks.length ? purchases.backpacks[i] : blockTimestamp; locker = i < purchases.lockers.length * 8 ? purchases.lockers[i / 8] : blockTimestamp; // Calculate reward seconds // (Based on purchase order) if (trac <= backpack && backpack <= locker) { // TRAC > BACKPACK > LOCKER sec.base += backpack - trac; sec.backpack += locker - backpack; sec.all += blockTimestamp - locker; } else if (trac <= locker && locker <= backpack) { // TRAC > LOCKER > BACKPACK sec.base += locker - trac; sec.locker += backpack - locker; sec.all += blockTimestamp - backpack; } else if (backpack <= trac && trac <= locker) { // BACKPACK > TRAC > LOCKER sec.backpack += locker - trac; sec.all += blockTimestamp - locker; } else if (locker <= trac && trac <= backpack) { // LOCKER > TRAC > BACKPACK sec.locker += backpack - trac; sec.all += blockTimestamp - backpack; } else { // * > TRAC sec.all += blockTimestamp - trac; } } // Sum reward uint128 reward = (sec.base * REWARD_PER_SECOND) + (sec.locker * REWARD_PER_SECOND) + ((sec.locker * REWARD_PER_SECOND) / 2) + (sec.backpack * REWARD_BACKPACK_PER_SECOND) + (sec.all * REWARD_BACKPACK_PER_SECOND) + ((sec.all * REWARD_BACKPACK_PER_SECOND) / 2); ownerRewards[msg.sender] = OwnerRewards( ownerRewards[msg.sender].totalClaimed + reward, blockTimestamp ); globalRewardsClaimed += reward; emit ClaimReward(msg.sender, reward); _transfer(address(this), msg.sender, reward); } function calculateDailyRewardRate(uint256 tracs, uint256 backpacks, uint256 lockers) public pure returns (uint128) { uint256 lockerBonus = lockers * 8; // Split TRAC counts by Backpack: uint256 tracsWithBackpacks = tracs < backpacks ? tracs : backpacks; uint256 tracsWithoutBackpacks = tracs - tracsWithBackpacks; // Split by Lockers: // - TRAC w/ Backpacks uint256 tracsWithBackpacksWithLockers = tracsWithBackpacks < lockerBonus ? tracsWithBackpacks : lockerBonus; uint256 tracsWithBackpacksWithoutLockers = tracsWithBackpacks - tracsWithBackpacksWithLockers; lockerBonus = lockerBonus > tracsWithBackpacksWithLockers ? lockerBonus - tracsWithBackpacksWithLockers : 0; // - TRAC w/o Backpacks uint256 tracsWithoutBackpacksWithLockers = tracsWithoutBackpacks < lockerBonus ? tracsWithoutBackpacks : lockerBonus; uint256 tracsWithoutBackpacksWithoutLockers = tracsWithoutBackpacks - tracsWithoutBackpacksWithLockers; // Calculate against reward rates given breakdown return uint128(( (tracsWithoutBackpacksWithoutLockers * REWARD_PER_SECOND) + (tracsWithoutBackpacksWithLockers * REWARD_PER_SECOND) + ((tracsWithoutBackpacksWithLockers * REWARD_PER_SECOND) / 2) + (tracsWithBackpacksWithoutLockers * REWARD_BACKPACK_PER_SECOND) + (tracsWithBackpacksWithLockers * REWARD_BACKPACK_PER_SECOND) + ((tracsWithBackpacksWithLockers * REWARD_BACKPACK_PER_SECOND) / 2) ) * DAY_SECONDS); } function burn(address account, uint256 amount) external nonReentrant { require(msg.sender == address(_trac) || msg.sender == address(_items), "only trac"); _burn(account, amount); } function setAssetsAddress(address assets) external onlyOwner { _items = ITRACAssets(assets); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20Upgradeable.sol"; import "./extensions/IERC20MetadataUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} uint256[45] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; interface ITRAC { struct TokenTime { uint16 token; uint48 timestamp; } struct OwnerTime { address owner; uint48 timestamp; } function tokenTimesOf(address) external view returns (TokenTime[] memory); function ownerTimesOf(uint16[] calldata) external view returns (OwnerTime[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; interface ITRACAssets { struct Purchases { uint48[] backpacks; uint48[] lockers; } function balanceOf(address, uint256) external view returns (uint256); function getPurchases(address) external view returns (Purchases memory); }
// 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 { __Context_init_unchained(); } 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; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; 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 a proxied contract can't have 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. * * 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 initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20Upgradeable.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
{ "optimizer": { "enabled": true, "runs": 5000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint128","name":"reward","type":"uint128"}],"name":"ClaimReward","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tracs","type":"uint256"},{"internalType":"uint256","name":"backpacks","type":"uint256"},{"internalType":"uint256","name":"lockers","type":"uint256"}],"name":"calculateDailyRewardRate","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"claimPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokens","type":"uint16[]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"globalRewardsClaimed","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trac","type":"address"},{"internalType":"address","name":"community","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownerRewards","outputs":[{"internalType":"uint128","name":"totalClaimed","type":"uint128"},{"internalType":"uint48","name":"lastClaim","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"assets","type":"address"}],"name":"setAssetsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"summaryOf","outputs":[{"components":[{"internalType":"uint16[]","name":"tokens","type":"uint16[]"},{"internalType":"uint128","name":"claimableReward","type":"uint128"},{"internalType":"uint128","name":"dailyRewardRate","type":"uint128"},{"internalType":"uint128","name":"totalClaimed","type":"uint128"},{"internalType":"uint48","name":"lastClaimTimestamp","type":"uint48"},{"internalType":"uint128","name":"globalRewardsClaimed","type":"uint128"},{"internalType":"uint256","name":"balance","type":"uint256"}],"internalType":"struct CREDIT.RewardSummary","name":"summary","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612f91806100206000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c806395d89b41116100e3578063ab5e124a1161008c578063dd62ed3e11610066578063dd62ed3e146103bf578063f2fde38b146103f8578063fe705dc81461040b57600080fd5b8063ab5e124a1461037f578063c04dc07c1461038c578063d50265791461039f57600080fd5b80639dc29fac116100bd5780639dc29fac14610346578063a457c2d714610359578063a9059cbb1461036c57600080fd5b806395d89b41146102a157806398366736146102a95780639bf6315b1461031657600080fd5b80633950935111610145578063715018a61161011f578063715018a6146102765780638da5cb5b1461027e578063921fb8691461029957600080fd5b80633950935114610227578063485cc9551461023a57806370a082311461024d57600080fd5b806318160ddd1161017657806318160ddd146101f357806323b872dd14610205578063313ce5671461021857600080fd5b806306fdde031461019d578063095ea7b3146101bb5780631490a174146101de575b600080fd5b6101a561041e565b6040516101b291906126c0565b60405180910390f35b6101ce6101c936600461272a565b6104b0565b60405190151581526020016101b2565b6101f16101ec366004612756565b6104c6565b005b6035545b6040519081526020016101b2565b6101ce61021336600461277a565b61055f565b604051601281526020016101b2565b6101ce61023536600461272a565b61061e565b6101f16102483660046127bb565b61065a565b6101f761025b366004612756565b6001600160a01b031660009081526033602052604090205490565b6101f1610840565b6065546040516001600160a01b0390911681526020016101b2565b6101f16108a6565b6101a5610932565b6102f06102b7366004612756565b60ca602052600090815260409020546001600160801b03811690700100000000000000000000000000000000900465ffffffffffff1682565b604080516001600160801b03909316835265ffffffffffff9091166020830152016101b2565b60c95461032e9061010090046001600160801b031681565b6040516001600160801b0390911681526020016101b2565b6101f161035436600461272a565b610941565b6101ce61036736600461272a565b610a1b565b6101ce61037a36600461272a565b610acc565b60c9546101ce9060ff1681565b61032e61039a3660046127f4565b610ad9565b6103b26103ad366004612756565b610cba565b6040516101b29190612820565b6101f76103cd3660046127bb565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6101f1610406366004612756565b61140c565b6101f16104193660046128ee565b6114ee565b60606036805461042d90612963565b80601f016020809104026020016040519081016040528092919081815260200182805461045990612963565b80156104a65780601f1061047b576101008083540402835291602001916104a6565b820191906000526020600020905b81548152906001019060200180831161048957829003601f168201915b5050505050905090565b60006104bd338484611e3b565b50600192915050565b6065546001600160a01b031633146105255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60cc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600061056c848484611f93565b6001600160a01b0384166000908152603460209081526040808320338452909152902054828110156106065760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000606482015260840161051c565b6106138533858403611e3b565b506001949350505050565b3360008181526034602090815260408083206001600160a01b038716845290915281205490916104bd9185906106559086906129e6565b611e3b565b600054610100900460ff166106755760005460ff1615610679565b303b155b6106eb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161051c565b600054610100900460ff1615801561072a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b61079e6040518060400160405280600b81526020017f54524143204352454449540000000000000000000000000000000000000000008152506040518060400160405280600681526020017f43524544495400000000000000000000000000000000000000000000000000008152506121ab565b6107a661224f565b6107ae6122d5565b6107c4306b01261bd1500eb7af75100000612359565b6107d9826a4986f44622f73835e00000612359565b60cb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038516179055801561083b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050565b6065546001600160a01b0316331461089a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051c565b6108a46000612438565b565b6065546001600160a01b031633146109005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051c565b60c980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b60606037805461042d90612963565b600260975414156109945760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051c565b600260975560cb546001600160a01b03163314806109bc575060cc546001600160a01b031633145b610a085760405162461bcd60e51b815260206004820152600960248201527f6f6e6c7920747261630000000000000000000000000000000000000000000000604482015260640161051c565b610a1282826124a2565b50506001609755565b3360009081526034602090815260408083206001600160a01b038616845290915281205482811015610ab55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161051c565b610ac23385858403611e3b565b5060019392505050565b60006104bd338484611f93565b600080610ae78360086129fe565b90506000848610610af85784610afa565b855b90506000610b088288612a3b565b90506000838310610b195783610b1b565b825b90506000610b298285612a3b565b9050818511610b39576000610b43565b610b438286612a3b565b94506000858410610b545785610b56565b835b90506000610b648286612a3b565b9050620151806002610b7e82678ac7230489e80000612a81565b610b91906001600160801b0316876129fe565b610b9b9190612aa7565b610bb062015180678ac7230489e80000612a81565b610bc3906001600160801b0316876129fe565b610bd862015180678ac7230489e80000612a81565b610beb906001600160801b0316876129fe565b6002610c0262015180676f05b59d3b200000612a81565b610c15906001600160801b0316886129fe565b610c1f9190612aa7565b610c3462015180676f05b59d3b200000612a81565b610c47906001600160801b0316886129fe565b610c5c62015180676f05b59d3b200000612a81565b610c6f906001600160801b0316886129fe565b610c7991906129e6565b610c8391906129e6565b610c8d91906129e6565b610c9791906129e6565b610ca191906129e6565b610cab91906129fe565b9b9a5050505050505050505050565b6040805160e081018252606080825260006020830181905292820183905281018290526080810182905260a0810182905260c081019190915260cb546040517f8e0fa9510000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000921690638e0fa95190602401600060405180830381865afa158015610d57573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d7f9190810190612b93565b90506000815167ffffffffffffffff811115610d9d57610d9d612abb565b604051908082528060200260200182016040528015610dc6578160200160208202803683370190505b506001600160a01b03858116600081815260ca60205260408082205460cc5491517f70cd5a8000000000000000000000000000000000000000000000000000000000815260048101949094529495504294700100000000000000000000000000000000900465ffffffffffff169391929116906370cd5a8090602401600060405180830381865afa158015610e5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e879190810190612ccc565b6040805160808101825260008082526020820181905291810182905260608101829052919250908190819060005b89518161ffff16101561124657898161ffff1681518110610ed857610ed8612d5d565b60200260200101516000015161ffff1660001461123457898161ffff1681518110610f0557610f05612d5d565b602002602001015160000151898261ffff1681518110610f2757610f27612d5d565b61ffff92831660209182029290920101528a518b918316908110610f4d57610f4d612d5d565b60200260200101516020015165ffffffffffff168765ffffffffffff1611610f9657898161ffff1681518110610f8557610f85612d5d565b602002602001015160200151610f98565b865b86515190935061ffff821610610fae5787610fcf565b8551805161ffff8316908110610fc657610fc6612d5d565b60200260200101515b94508560200151516008610fe391906129fe565b8161ffff1610610ff35787611020565b6020860151611003600883612d8c565b61ffff168151811061101757611017612d5d565b60200260200101515b93508465ffffffffffff168365ffffffffffff161115801561105257508365ffffffffffff168565ffffffffffff1611155b156110e9576110618386612da1565b65ffffffffffff168260000181815161107a9190612dc8565b6001600160801b03169052506110908585612da1565b65ffffffffffff16826040018181516110a99190612dc8565b6001600160801b03169052506110bf8489612da1565b65ffffffffffff16826060018181516110d89190612dc8565b6001600160801b0316905250611234565b8365ffffffffffff168365ffffffffffff161115801561111957508465ffffffffffff168465ffffffffffff1611155b15611186576111288385612da1565b65ffffffffffff16826000018181516111419190612dc8565b6001600160801b03169052506111578486612da1565b65ffffffffffff16826020018181516111709190612dc8565b6001600160801b03169052506110bf8589612da1565b8265ffffffffffff168565ffffffffffff16111580156111b657508365ffffffffffff168365ffffffffffff1611155b156111c5576110908385612da1565b8265ffffffffffff168465ffffffffffff16111580156111f557508465ffffffffffff168365ffffffffffff1611155b15611204576111578386612da1565b61120e8389612da1565b65ffffffffffff16826060018181516112279190612dc8565b6001600160801b03169052505b8061123e81612df3565b915050610eb5565b506000600261126062015180678ac7230489e80000612a81565b836060015161126f9190612e15565b6112799190612a81565b61128e62015180678ac7230489e80000612a81565b836060015161129d9190612e15565b6112b262015180678ac7230489e80000612a81565b84604001516112c19190612e15565b60026112d862015180676f05b59d3b200000612a81565b86602001516112e79190612e15565b6112f19190612a81565b61130662015180676f05b59d3b200000612a81565b86602001516113159190612e15565b61132a62015180676f05b59d3b200000612a81565b87516113369190612e15565b6113409190612dc8565b61134a9190612dc8565b6113549190612dc8565b61135e9190612dc8565b6113689190612dc8565b90506040518060e001604052808a8152602001826001600160801b031681526020016113a08c518960000151518a6020015151610ad9565b6001600160801b0390811682526001600160a01b038f16600081815260ca602090815260408083205485168287015265ffffffffffff8e168187015260c95461010090049094166060860152918152603390915220546080909101529c9b505050505050505050505050565b6065546001600160a01b031633146114665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051c565b6001600160a01b0381166114e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051c565b6114eb81612438565b50565b600260975414156115415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051c565b60026097553233146115955760405162461bcd60e51b815260206004820152600860248201527f656f73206f6e6c79000000000000000000000000000000000000000000000000604482015260640161051c565b60c95460ff16156115e85760405162461bcd60e51b815260206004820152600c60248201527f636c61696d207061757365640000000000000000000000000000000000000000604482015260640161051c565b806116355760405162461bcd60e51b815260206004820152600c60248201527f656d70747920746f6b656e730000000000000000000000000000000000000000604482015260640161051c565b33600090815260ca60205260408082205460cb5491517f7b5abd7500000000000000000000000000000000000000000000000000000000815270010000000000000000000000000000000090910465ffffffffffff1692916001600160a01b031690637b5abd75906116ad9087908790600401612e44565b600060405180830381865afa1580156116ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116f29190810190612e82565b60cc546040517f70cd5a8000000000000000000000000000000000000000000000000000000000815233600482015291925042916000916001600160a01b0316906370cd5a8090602401600060405180830381865afa158015611759573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117819190810190612ccc565b604080516080810182526000808252602082018190529181018290526060810182905291925090819081906000805b88518161ffff161015611bcf578161ffff168c8c8361ffff168181106117d8576117d8612d5d565b90506020020160208101906117ed9190612f3e565b61ffff161161183e5760405162461bcd60e51b815260206004820152600c60248201527f6f7574206f66206f726465720000000000000000000000000000000000000000604482015260640161051c565b336001600160a01b0316898261ffff168151811061185e5761185e612d5d565b6020026020010151600001516001600160a01b0316146118c05760405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e65720000000000000000000000000000000000000000000000604482015260640161051c565b888161ffff16815181106118d6576118d6612d5d565b60200260200101516020015165ffffffffffff168a65ffffffffffff161161191f57888161ffff168151811061190e5761190e612d5d565b602002602001015160200151611921565b895b87515190945061ffff8216106119375787611958565b8651805161ffff831690811061194f5761194f612d5d565b60200260200101515b9550866020015151600861196c91906129fe565b8161ffff161061197c57876119a9565b602087015161198c600883612d8c565b61ffff16815181106119a0576119a0612d5d565b60200260200101515b94508565ffffffffffff168465ffffffffffff16111580156119db57508465ffffffffffff168665ffffffffffff1611155b15611a72576119ea8487612da1565b65ffffffffffff1683600001818151611a039190612dc8565b6001600160801b0316905250611a198686612da1565b65ffffffffffff1683604001818151611a329190612dc8565b6001600160801b0316905250611a488589612da1565b65ffffffffffff1683606001818151611a619190612dc8565b6001600160801b0316905250611bbd565b8465ffffffffffff168465ffffffffffff1611158015611aa257508565ffffffffffff168565ffffffffffff1611155b15611b0f57611ab18486612da1565b65ffffffffffff1683600001818151611aca9190612dc8565b6001600160801b0316905250611ae08587612da1565b65ffffffffffff1683602001818151611af99190612dc8565b6001600160801b0316905250611a488689612da1565b8365ffffffffffff168665ffffffffffff1611158015611b3f57508465ffffffffffff168465ffffffffffff1611155b15611b4e57611a198486612da1565b8365ffffffffffff168565ffffffffffff1611158015611b7e57508565ffffffffffff168465ffffffffffff1611155b15611b8d57611ae08487612da1565b611b978489612da1565b65ffffffffffff1683606001818151611bb09190612dc8565b6001600160801b03169052505b80611bc781612df3565b9150506117b0565b5060006002611be962015180678ac7230489e80000612a81565b8460600151611bf89190612e15565b611c029190612a81565b611c1762015180678ac7230489e80000612a81565b8460600151611c269190612e15565b611c3b62015180678ac7230489e80000612a81565b8560400151611c4a9190612e15565b6002611c6162015180676f05b59d3b200000612a81565b8760200151611c709190612e15565b611c7a9190612a81565b611c8f62015180676f05b59d3b200000612a81565b8760200151611c9e9190612e15565b611cb362015180676f05b59d3b200000612a81565b8851611cbf9190612e15565b611cc99190612dc8565b611cd39190612dc8565b611cdd9190612dc8565b611ce79190612dc8565b611cf19190612dc8565b60408051808201825233600090815260ca6020529190912054919250908190611d249084906001600160801b0316612dc8565b6001600160801b03908116825265ffffffffffff808c1660209384015233600090815260ca845260409020845181549590940151909116700100000000000000000000000000000000027fffffffffffffffffffff000000000000000000000000000000000000000000009094169282169290921792909217905560c980548392600191611db9918591610100900416612dc8565b82546101009290920a6001600160801b038181021990931691831602179091556040805133815291841660208301527fe61b9271a962de6171d523cdbe3b69009ef75b464fef9f5fd169bb9c4442469b92500160405180910390a1611e283033836001600160801b0316611f93565b5050600160975550505050505050505050565b6001600160a01b038316611eb65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b038216611f325760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661200f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b03821661208b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b0383166000908152603360205260409020548181101561211a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b038085166000908152603360205260408082208585039055918516815290812080548492906121519084906129e6565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161219d91815260200190565b60405180910390a350505050565b600054610100900460ff166122285760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161051c565b815161223b906036906020850190612627565b50805161083b906037906020840190612627565b600054610100900460ff166122cc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161051c565b6108a433612438565b600054610100900460ff166123525760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161051c565b6001609755565b6001600160a01b0382166123af5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051c565b80603560008282546123c191906129e6565b90915550506001600160a01b038216600090815260336020526040812080548392906123ee9084906129e6565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b606580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821661251e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b038216600090815260336020526040902054818110156125ad5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b03831660009081526033602052604081208383039055603580548492906125dc908490612a3b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b82805461263390612963565b90600052602060002090601f016020900481019282612655576000855561269b565b82601f1061266e57805160ff191683800117855561269b565b8280016001018555821561269b579182015b8281111561269b578251825591602001919060010190612680565b506126a79291506126ab565b5090565b5b808211156126a757600081556001016126ac565b600060208083528351808285015260005b818110156126ed578581018301518582016040015282016126d1565b818111156126ff576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146114eb57600080fd5b6000806040838503121561273d57600080fd5b823561274881612715565b946020939093013593505050565b60006020828403121561276857600080fd5b813561277381612715565b9392505050565b60008060006060848603121561278f57600080fd5b833561279a81612715565b925060208401356127aa81612715565b929592945050506040919091013590565b600080604083850312156127ce57600080fd5b82356127d981612715565b915060208301356127e981612715565b809150509250929050565b60008060006060848603121561280957600080fd5b505081359360208301359350604090920135919050565b6020808252825160e083830152805161010084018190526000929182019083906101208601905b8083101561286b57835161ffff168252928401926001929092019190840190612847565b50928601516001600160801b03811660408701529260408701516001600160801b0381166060880152935060608701516001600160801b03811660808801529350608087015165ffffffffffff811660a0880152935060a08701516001600160801b03811660c0880152935060c087015160e08701528094505050505092915050565b6000806020838503121561290157600080fd5b823567ffffffffffffffff8082111561291957600080fd5b818501915085601f83011261292d57600080fd5b81358181111561293c57600080fd5b8660208260051b850101111561295157600080fd5b60209290920196919550909350505050565b600181811c9082168061297757607f821691505b602082108114156129b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156129f9576129f96129b7565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a3657612a366129b7565b500290565b600082821015612a4d57612a4d6129b7565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006001600160801b0380841680612a9b57612a9b612a52565b92169190910492915050565b600082612ab657612ab6612a52565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612b0d57612b0d612abb565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b3c57612b3c612abb565b604052919050565b600067ffffffffffffffff821115612b5e57612b5e612abb565b5060051b60200190565b61ffff811681146114eb57600080fd5b805165ffffffffffff81168114612b8e57600080fd5b919050565b60006020808385031215612ba657600080fd5b825167ffffffffffffffff811115612bbd57600080fd5b8301601f81018513612bce57600080fd5b8051612be1612bdc82612b44565b612b13565b81815260069190911b82018301908381019087831115612c0057600080fd5b928401925b82841015612c545760408489031215612c1e5760008081fd5b612c26612aea565b8451612c3181612b68565b8152612c3e858701612b78565b8187015282526040939093019290840190612c05565b979650505050505050565b600082601f830112612c7057600080fd5b81516020612c80612bdc83612b44565b82815260059290921b84018101918181019086841115612c9f57600080fd5b8286015b84811015612cc157612cb481612b78565b8352918301918301612ca3565b509695505050505050565b600060208284031215612cde57600080fd5b815167ffffffffffffffff80821115612cf657600080fd5b9083019060408286031215612d0a57600080fd5b612d12612aea565b825182811115612d2157600080fd5b612d2d87828601612c5f565b825250602083015182811115612d4257600080fd5b612d4e87828601612c5f565b60208301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061ffff80841680612a9b57612a9b612a52565b600065ffffffffffff83811690831681811015612dc057612dc06129b7565b039392505050565b60006001600160801b03808316818516808303821115612dea57612dea6129b7565b01949350505050565b600061ffff80831681811415612e0b57612e0b6129b7565b6001019392505050565b60006001600160801b0380831681851681830481118215151615612e3b57612e3b6129b7565b02949350505050565b60208082528181018390526000908460408401835b86811015612cc1578235612e6c81612b68565b61ffff1682529183019190830190600101612e59565b60006020808385031215612e9557600080fd5b825167ffffffffffffffff811115612eac57600080fd5b8301601f81018513612ebd57600080fd5b8051612ecb612bdc82612b44565b81815260069190911b82018301908381019087831115612eea57600080fd5b928401925b82841015612c545760408489031215612f085760008081fd5b612f10612aea565b8451612f1b81612715565b8152612f28858701612b78565b8187015282526040939093019290840190612eef565b600060208284031215612f5057600080fd5b813561277381612b6856fea2646970667358221220af9fde5b6b3341e73fb65692f8a23afd64d959d614bf868af596742e0db8a90b64736f6c634300080a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101985760003560e01c806395d89b41116100e3578063ab5e124a1161008c578063dd62ed3e11610066578063dd62ed3e146103bf578063f2fde38b146103f8578063fe705dc81461040b57600080fd5b8063ab5e124a1461037f578063c04dc07c1461038c578063d50265791461039f57600080fd5b80639dc29fac116100bd5780639dc29fac14610346578063a457c2d714610359578063a9059cbb1461036c57600080fd5b806395d89b41146102a157806398366736146102a95780639bf6315b1461031657600080fd5b80633950935111610145578063715018a61161011f578063715018a6146102765780638da5cb5b1461027e578063921fb8691461029957600080fd5b80633950935114610227578063485cc9551461023a57806370a082311461024d57600080fd5b806318160ddd1161017657806318160ddd146101f357806323b872dd14610205578063313ce5671461021857600080fd5b806306fdde031461019d578063095ea7b3146101bb5780631490a174146101de575b600080fd5b6101a561041e565b6040516101b291906126c0565b60405180910390f35b6101ce6101c936600461272a565b6104b0565b60405190151581526020016101b2565b6101f16101ec366004612756565b6104c6565b005b6035545b6040519081526020016101b2565b6101ce61021336600461277a565b61055f565b604051601281526020016101b2565b6101ce61023536600461272a565b61061e565b6101f16102483660046127bb565b61065a565b6101f761025b366004612756565b6001600160a01b031660009081526033602052604090205490565b6101f1610840565b6065546040516001600160a01b0390911681526020016101b2565b6101f16108a6565b6101a5610932565b6102f06102b7366004612756565b60ca602052600090815260409020546001600160801b03811690700100000000000000000000000000000000900465ffffffffffff1682565b604080516001600160801b03909316835265ffffffffffff9091166020830152016101b2565b60c95461032e9061010090046001600160801b031681565b6040516001600160801b0390911681526020016101b2565b6101f161035436600461272a565b610941565b6101ce61036736600461272a565b610a1b565b6101ce61037a36600461272a565b610acc565b60c9546101ce9060ff1681565b61032e61039a3660046127f4565b610ad9565b6103b26103ad366004612756565b610cba565b6040516101b29190612820565b6101f76103cd3660046127bb565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6101f1610406366004612756565b61140c565b6101f16104193660046128ee565b6114ee565b60606036805461042d90612963565b80601f016020809104026020016040519081016040528092919081815260200182805461045990612963565b80156104a65780601f1061047b576101008083540402835291602001916104a6565b820191906000526020600020905b81548152906001019060200180831161048957829003601f168201915b5050505050905090565b60006104bd338484611e3b565b50600192915050565b6065546001600160a01b031633146105255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60cc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600061056c848484611f93565b6001600160a01b0384166000908152603460209081526040808320338452909152902054828110156106065760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000606482015260840161051c565b6106138533858403611e3b565b506001949350505050565b3360008181526034602090815260408083206001600160a01b038716845290915281205490916104bd9185906106559086906129e6565b611e3b565b600054610100900460ff166106755760005460ff1615610679565b303b155b6106eb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161051c565b600054610100900460ff1615801561072a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b61079e6040518060400160405280600b81526020017f54524143204352454449540000000000000000000000000000000000000000008152506040518060400160405280600681526020017f43524544495400000000000000000000000000000000000000000000000000008152506121ab565b6107a661224f565b6107ae6122d5565b6107c4306b01261bd1500eb7af75100000612359565b6107d9826a4986f44622f73835e00000612359565b60cb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038516179055801561083b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050565b6065546001600160a01b0316331461089a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051c565b6108a46000612438565b565b6065546001600160a01b031633146109005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051c565b60c980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b60606037805461042d90612963565b600260975414156109945760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051c565b600260975560cb546001600160a01b03163314806109bc575060cc546001600160a01b031633145b610a085760405162461bcd60e51b815260206004820152600960248201527f6f6e6c7920747261630000000000000000000000000000000000000000000000604482015260640161051c565b610a1282826124a2565b50506001609755565b3360009081526034602090815260408083206001600160a01b038616845290915281205482811015610ab55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161051c565b610ac23385858403611e3b565b5060019392505050565b60006104bd338484611f93565b600080610ae78360086129fe565b90506000848610610af85784610afa565b855b90506000610b088288612a3b565b90506000838310610b195783610b1b565b825b90506000610b298285612a3b565b9050818511610b39576000610b43565b610b438286612a3b565b94506000858410610b545785610b56565b835b90506000610b648286612a3b565b9050620151806002610b7e82678ac7230489e80000612a81565b610b91906001600160801b0316876129fe565b610b9b9190612aa7565b610bb062015180678ac7230489e80000612a81565b610bc3906001600160801b0316876129fe565b610bd862015180678ac7230489e80000612a81565b610beb906001600160801b0316876129fe565b6002610c0262015180676f05b59d3b200000612a81565b610c15906001600160801b0316886129fe565b610c1f9190612aa7565b610c3462015180676f05b59d3b200000612a81565b610c47906001600160801b0316886129fe565b610c5c62015180676f05b59d3b200000612a81565b610c6f906001600160801b0316886129fe565b610c7991906129e6565b610c8391906129e6565b610c8d91906129e6565b610c9791906129e6565b610ca191906129e6565b610cab91906129fe565b9b9a5050505050505050505050565b6040805160e081018252606080825260006020830181905292820183905281018290526080810182905260a0810182905260c081019190915260cb546040517f8e0fa9510000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000921690638e0fa95190602401600060405180830381865afa158015610d57573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d7f9190810190612b93565b90506000815167ffffffffffffffff811115610d9d57610d9d612abb565b604051908082528060200260200182016040528015610dc6578160200160208202803683370190505b506001600160a01b03858116600081815260ca60205260408082205460cc5491517f70cd5a8000000000000000000000000000000000000000000000000000000000815260048101949094529495504294700100000000000000000000000000000000900465ffffffffffff169391929116906370cd5a8090602401600060405180830381865afa158015610e5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e879190810190612ccc565b6040805160808101825260008082526020820181905291810182905260608101829052919250908190819060005b89518161ffff16101561124657898161ffff1681518110610ed857610ed8612d5d565b60200260200101516000015161ffff1660001461123457898161ffff1681518110610f0557610f05612d5d565b602002602001015160000151898261ffff1681518110610f2757610f27612d5d565b61ffff92831660209182029290920101528a518b918316908110610f4d57610f4d612d5d565b60200260200101516020015165ffffffffffff168765ffffffffffff1611610f9657898161ffff1681518110610f8557610f85612d5d565b602002602001015160200151610f98565b865b86515190935061ffff821610610fae5787610fcf565b8551805161ffff8316908110610fc657610fc6612d5d565b60200260200101515b94508560200151516008610fe391906129fe565b8161ffff1610610ff35787611020565b6020860151611003600883612d8c565b61ffff168151811061101757611017612d5d565b60200260200101515b93508465ffffffffffff168365ffffffffffff161115801561105257508365ffffffffffff168565ffffffffffff1611155b156110e9576110618386612da1565b65ffffffffffff168260000181815161107a9190612dc8565b6001600160801b03169052506110908585612da1565b65ffffffffffff16826040018181516110a99190612dc8565b6001600160801b03169052506110bf8489612da1565b65ffffffffffff16826060018181516110d89190612dc8565b6001600160801b0316905250611234565b8365ffffffffffff168365ffffffffffff161115801561111957508465ffffffffffff168465ffffffffffff1611155b15611186576111288385612da1565b65ffffffffffff16826000018181516111419190612dc8565b6001600160801b03169052506111578486612da1565b65ffffffffffff16826020018181516111709190612dc8565b6001600160801b03169052506110bf8589612da1565b8265ffffffffffff168565ffffffffffff16111580156111b657508365ffffffffffff168365ffffffffffff1611155b156111c5576110908385612da1565b8265ffffffffffff168465ffffffffffff16111580156111f557508465ffffffffffff168365ffffffffffff1611155b15611204576111578386612da1565b61120e8389612da1565b65ffffffffffff16826060018181516112279190612dc8565b6001600160801b03169052505b8061123e81612df3565b915050610eb5565b506000600261126062015180678ac7230489e80000612a81565b836060015161126f9190612e15565b6112799190612a81565b61128e62015180678ac7230489e80000612a81565b836060015161129d9190612e15565b6112b262015180678ac7230489e80000612a81565b84604001516112c19190612e15565b60026112d862015180676f05b59d3b200000612a81565b86602001516112e79190612e15565b6112f19190612a81565b61130662015180676f05b59d3b200000612a81565b86602001516113159190612e15565b61132a62015180676f05b59d3b200000612a81565b87516113369190612e15565b6113409190612dc8565b61134a9190612dc8565b6113549190612dc8565b61135e9190612dc8565b6113689190612dc8565b90506040518060e001604052808a8152602001826001600160801b031681526020016113a08c518960000151518a6020015151610ad9565b6001600160801b0390811682526001600160a01b038f16600081815260ca602090815260408083205485168287015265ffffffffffff8e168187015260c95461010090049094166060860152918152603390915220546080909101529c9b505050505050505050505050565b6065546001600160a01b031633146114665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051c565b6001600160a01b0381166114e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051c565b6114eb81612438565b50565b600260975414156115415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051c565b60026097553233146115955760405162461bcd60e51b815260206004820152600860248201527f656f73206f6e6c79000000000000000000000000000000000000000000000000604482015260640161051c565b60c95460ff16156115e85760405162461bcd60e51b815260206004820152600c60248201527f636c61696d207061757365640000000000000000000000000000000000000000604482015260640161051c565b806116355760405162461bcd60e51b815260206004820152600c60248201527f656d70747920746f6b656e730000000000000000000000000000000000000000604482015260640161051c565b33600090815260ca60205260408082205460cb5491517f7b5abd7500000000000000000000000000000000000000000000000000000000815270010000000000000000000000000000000090910465ffffffffffff1692916001600160a01b031690637b5abd75906116ad9087908790600401612e44565b600060405180830381865afa1580156116ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116f29190810190612e82565b60cc546040517f70cd5a8000000000000000000000000000000000000000000000000000000000815233600482015291925042916000916001600160a01b0316906370cd5a8090602401600060405180830381865afa158015611759573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117819190810190612ccc565b604080516080810182526000808252602082018190529181018290526060810182905291925090819081906000805b88518161ffff161015611bcf578161ffff168c8c8361ffff168181106117d8576117d8612d5d565b90506020020160208101906117ed9190612f3e565b61ffff161161183e5760405162461bcd60e51b815260206004820152600c60248201527f6f7574206f66206f726465720000000000000000000000000000000000000000604482015260640161051c565b336001600160a01b0316898261ffff168151811061185e5761185e612d5d565b6020026020010151600001516001600160a01b0316146118c05760405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e65720000000000000000000000000000000000000000000000604482015260640161051c565b888161ffff16815181106118d6576118d6612d5d565b60200260200101516020015165ffffffffffff168a65ffffffffffff161161191f57888161ffff168151811061190e5761190e612d5d565b602002602001015160200151611921565b895b87515190945061ffff8216106119375787611958565b8651805161ffff831690811061194f5761194f612d5d565b60200260200101515b9550866020015151600861196c91906129fe565b8161ffff161061197c57876119a9565b602087015161198c600883612d8c565b61ffff16815181106119a0576119a0612d5d565b60200260200101515b94508565ffffffffffff168465ffffffffffff16111580156119db57508465ffffffffffff168665ffffffffffff1611155b15611a72576119ea8487612da1565b65ffffffffffff1683600001818151611a039190612dc8565b6001600160801b0316905250611a198686612da1565b65ffffffffffff1683604001818151611a329190612dc8565b6001600160801b0316905250611a488589612da1565b65ffffffffffff1683606001818151611a619190612dc8565b6001600160801b0316905250611bbd565b8465ffffffffffff168465ffffffffffff1611158015611aa257508565ffffffffffff168565ffffffffffff1611155b15611b0f57611ab18486612da1565b65ffffffffffff1683600001818151611aca9190612dc8565b6001600160801b0316905250611ae08587612da1565b65ffffffffffff1683602001818151611af99190612dc8565b6001600160801b0316905250611a488689612da1565b8365ffffffffffff168665ffffffffffff1611158015611b3f57508465ffffffffffff168465ffffffffffff1611155b15611b4e57611a198486612da1565b8365ffffffffffff168565ffffffffffff1611158015611b7e57508565ffffffffffff168465ffffffffffff1611155b15611b8d57611ae08487612da1565b611b978489612da1565b65ffffffffffff1683606001818151611bb09190612dc8565b6001600160801b03169052505b80611bc781612df3565b9150506117b0565b5060006002611be962015180678ac7230489e80000612a81565b8460600151611bf89190612e15565b611c029190612a81565b611c1762015180678ac7230489e80000612a81565b8460600151611c269190612e15565b611c3b62015180678ac7230489e80000612a81565b8560400151611c4a9190612e15565b6002611c6162015180676f05b59d3b200000612a81565b8760200151611c709190612e15565b611c7a9190612a81565b611c8f62015180676f05b59d3b200000612a81565b8760200151611c9e9190612e15565b611cb362015180676f05b59d3b200000612a81565b8851611cbf9190612e15565b611cc99190612dc8565b611cd39190612dc8565b611cdd9190612dc8565b611ce79190612dc8565b611cf19190612dc8565b60408051808201825233600090815260ca6020529190912054919250908190611d249084906001600160801b0316612dc8565b6001600160801b03908116825265ffffffffffff808c1660209384015233600090815260ca845260409020845181549590940151909116700100000000000000000000000000000000027fffffffffffffffffffff000000000000000000000000000000000000000000009094169282169290921792909217905560c980548392600191611db9918591610100900416612dc8565b82546101009290920a6001600160801b038181021990931691831602179091556040805133815291841660208301527fe61b9271a962de6171d523cdbe3b69009ef75b464fef9f5fd169bb9c4442469b92500160405180910390a1611e283033836001600160801b0316611f93565b5050600160975550505050505050505050565b6001600160a01b038316611eb65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b038216611f325760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661200f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b03821661208b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b0383166000908152603360205260409020548181101561211a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b038085166000908152603360205260408082208585039055918516815290812080548492906121519084906129e6565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161219d91815260200190565b60405180910390a350505050565b600054610100900460ff166122285760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161051c565b815161223b906036906020850190612627565b50805161083b906037906020840190612627565b600054610100900460ff166122cc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161051c565b6108a433612438565b600054610100900460ff166123525760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161051c565b6001609755565b6001600160a01b0382166123af5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051c565b80603560008282546123c191906129e6565b90915550506001600160a01b038216600090815260336020526040812080548392906123ee9084906129e6565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b606580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821661251e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b038216600090815260336020526040902054818110156125ad5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161051c565b6001600160a01b03831660009081526033602052604081208383039055603580548492906125dc908490612a3b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b82805461263390612963565b90600052602060002090601f016020900481019282612655576000855561269b565b82601f1061266e57805160ff191683800117855561269b565b8280016001018555821561269b579182015b8281111561269b578251825591602001919060010190612680565b506126a79291506126ab565b5090565b5b808211156126a757600081556001016126ac565b600060208083528351808285015260005b818110156126ed578581018301518582016040015282016126d1565b818111156126ff576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146114eb57600080fd5b6000806040838503121561273d57600080fd5b823561274881612715565b946020939093013593505050565b60006020828403121561276857600080fd5b813561277381612715565b9392505050565b60008060006060848603121561278f57600080fd5b833561279a81612715565b925060208401356127aa81612715565b929592945050506040919091013590565b600080604083850312156127ce57600080fd5b82356127d981612715565b915060208301356127e981612715565b809150509250929050565b60008060006060848603121561280957600080fd5b505081359360208301359350604090920135919050565b6020808252825160e083830152805161010084018190526000929182019083906101208601905b8083101561286b57835161ffff168252928401926001929092019190840190612847565b50928601516001600160801b03811660408701529260408701516001600160801b0381166060880152935060608701516001600160801b03811660808801529350608087015165ffffffffffff811660a0880152935060a08701516001600160801b03811660c0880152935060c087015160e08701528094505050505092915050565b6000806020838503121561290157600080fd5b823567ffffffffffffffff8082111561291957600080fd5b818501915085601f83011261292d57600080fd5b81358181111561293c57600080fd5b8660208260051b850101111561295157600080fd5b60209290920196919550909350505050565b600181811c9082168061297757607f821691505b602082108114156129b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156129f9576129f96129b7565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a3657612a366129b7565b500290565b600082821015612a4d57612a4d6129b7565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006001600160801b0380841680612a9b57612a9b612a52565b92169190910492915050565b600082612ab657612ab6612a52565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612b0d57612b0d612abb565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b3c57612b3c612abb565b604052919050565b600067ffffffffffffffff821115612b5e57612b5e612abb565b5060051b60200190565b61ffff811681146114eb57600080fd5b805165ffffffffffff81168114612b8e57600080fd5b919050565b60006020808385031215612ba657600080fd5b825167ffffffffffffffff811115612bbd57600080fd5b8301601f81018513612bce57600080fd5b8051612be1612bdc82612b44565b612b13565b81815260069190911b82018301908381019087831115612c0057600080fd5b928401925b82841015612c545760408489031215612c1e5760008081fd5b612c26612aea565b8451612c3181612b68565b8152612c3e858701612b78565b8187015282526040939093019290840190612c05565b979650505050505050565b600082601f830112612c7057600080fd5b81516020612c80612bdc83612b44565b82815260059290921b84018101918181019086841115612c9f57600080fd5b8286015b84811015612cc157612cb481612b78565b8352918301918301612ca3565b509695505050505050565b600060208284031215612cde57600080fd5b815167ffffffffffffffff80821115612cf657600080fd5b9083019060408286031215612d0a57600080fd5b612d12612aea565b825182811115612d2157600080fd5b612d2d87828601612c5f565b825250602083015182811115612d4257600080fd5b612d4e87828601612c5f565b60208301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061ffff80841680612a9b57612a9b612a52565b600065ffffffffffff83811690831681811015612dc057612dc06129b7565b039392505050565b60006001600160801b03808316818516808303821115612dea57612dea6129b7565b01949350505050565b600061ffff80831681811415612e0b57612e0b6129b7565b6001019392505050565b60006001600160801b0380831681851681830481118215151615612e3b57612e3b6129b7565b02949350505050565b60208082528181018390526000908460408401835b86811015612cc1578235612e6c81612b68565b61ffff1682529183019190830190600101612e59565b60006020808385031215612e9557600080fd5b825167ffffffffffffffff811115612eac57600080fd5b8301601f81018513612ebd57600080fd5b8051612ecb612bdc82612b44565b81815260069190911b82018301908381019087831115612eea57600080fd5b928401925b82841015612c545760408489031215612f085760008081fd5b612f10612aea565b8451612f1b81612715565b8152612f28858701612b78565b8187015282526040939093019290840190612eef565b600060208284031215612f5057600080fd5b813561277381612b6856fea2646970667358221220af9fde5b6b3341e73fb65692f8a23afd64d959d614bf868af596742e0db8a90b64736f6c634300080a0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.