Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Salvation
Compiler Version
v0.8.33+commit.64118f21
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.33; // ← Updated to latest safe version (as of Jan 2026)
// This resolves the "LostStorageArrayWriteOnSlotOverflow" compiler warning on explorers
// OpenZeppelin imports - still using v4.9.0 (compatible and battle-tested)
// You could upgrade to v5.x later if desired, but this works perfectly on Monad
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/token/ERC20/ERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/security/ReentrancyGuard.sol";
/// @title Salvation - A stakable ERC20 token with transfer fees and vesting rewards
/// @notice Implements staking with lockup periods, burns transfer fees, and distributes vested rewards
/// @dev Fully immutable and decentralized - EVM compatible (Ethereum + L2s like Base)
contract Salvation is ERC20, ReentrancyGuard {
// --- Tokenomics Constants ---
uint256 public constant MAX_SUPPLY = 100_000_000 * 10**18; // 100M SALV
uint256 public constant STAKING_REWARD_POOL = 95_000_000 * 10**18; // 95M for rewards
uint256 public constant DEPLOYER_ALLOCATION = 5_000_000 * 10**18; // 5M to deployer
uint256 public constant BASE_STAKING_REWARD_RATE = 7 * 10**16; // 7% annual base
uint256 public constant VESTING_PERIOD = 60 days;
uint256 public constant LOCKUP_3_MONTHS = 90 days;
uint256 public constant LOCKUP_6_MONTHS = 180 days;
uint256 public constant LOCKUP_1_YEAR = 365 days;
uint256 public constant LOCKUP_2_YEARS = 730 days;
uint256 public constant LOCKUP_4_YEARS = 1460 days;
uint256 public constant MULTIPLIER_3_MONTHS = 11 * 10**17; // 1.1×
uint256 public constant MULTIPLIER_6_MONTHS = 125 * 10**16; // 1.25×
uint256 public constant MULTIPLIER_1_YEAR = 15 * 10**17; // 1.5×
uint256 public constant MULTIPLIER_2_YEARS = 2 * 10**18; // 2×
uint256 public constant MULTIPLIER_4_YEARS = 3 * 10**18; // 3×
uint256 public constant TRANSFER_FEE = 10**15; // 0.1%
uint256 public constant EARLY_UNSTAKE_PENALTY = 10**17; // 10%
// --- Staking State ---
struct Stake {
uint256 amount;
uint256 lockupPeriod;
uint256 startTime;
uint256 accumulatedRewards;
}
mapping(address => Stake[]) public stakes;
mapping(address => uint256) public vestingBalance;
mapping(address => uint256) public vestingStartTime;
mapping(address => uint256) public userTotalStaked;
uint256 public totalStaked;
uint256 public remainingRewardPool;
// --- Events ---
event Staked(address indexed user, uint256 amount, uint256 lockupPeriod);
event Unstaked(address indexed user, uint256 amount, uint256 stakeIndex, uint256 penalty);
event RewardsClaimed(address indexed user, uint256 amount);
event RewardsVested(address indexed user, uint256 amount);
event VestingWithdrawn(address indexed user, uint256 amount);
event Burned(address indexed user, uint256 amount);
event FeeBurned(address indexed user, uint256 amount);
constructor() ERC20("Salvation", "SALV") {
_mint(address(this), STAKING_REWARD_POOL);
_mint(msg.sender, DEPLOYER_ALLOCATION);
remainingRewardPool = STAKING_REWARD_POOL;
}
function transfer(address recipient, uint256 amount)
public
override
nonReentrant
returns (bool)
{
uint256 fee = (amount * TRANSFER_FEE) / 10**18;
uint256 netAmount = amount - fee;
_burn(msg.sender, fee);
_transfer(msg.sender, recipient, netAmount);
emit FeeBurned(msg.sender, fee);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount)
public
override
nonReentrant
returns (bool)
{
uint256 fee = (amount * TRANSFER_FEE) / 10**18;
uint256 netAmount = amount - fee;
_approve(sender, msg.sender, allowance(sender, msg.sender) - amount);
_burn(sender, fee);
_transfer(sender, recipient, netAmount);
emit FeeBurned(sender, fee);
return true;
}
function stake(uint256 amount, uint256 lockupPeriod) external nonReentrant {
require(amount > 0, "Amount must be greater than 0");
require(balanceOf(msg.sender) >= amount, "Insufficient balance");
require(allowance(msg.sender, address(this)) >= amount, "Insufficient allowance");
require(
lockupPeriod == 0 ||
lockupPeriod == LOCKUP_3_MONTHS ||
lockupPeriod == LOCKUP_6_MONTHS ||
lockupPeriod == LOCKUP_1_YEAR ||
lockupPeriod == LOCKUP_2_YEARS ||
lockupPeriod == LOCKUP_4_YEARS,
"Invalid lockup period"
);
_transfer(msg.sender, address(this), amount);
stakes[msg.sender].push(Stake({
amount: amount,
lockupPeriod: lockupPeriod,
startTime: block.timestamp,
accumulatedRewards: 0
}));
totalStaked += amount;
userTotalStaked[msg.sender] += amount;
emit Staked(msg.sender, amount, lockupPeriod);
}
function unstake(uint256 stakeIndex) external nonReentrant {
require(stakeIndex < stakes[msg.sender].length, "Invalid stake index");
Stake storage userStake = stakes[msg.sender][stakeIndex];
require(userStake.amount > 0, "No staked amount");
uint256 amount = userStake.amount;
uint256 penalty = 0;
if (userStake.lockupPeriod > 0 && block.timestamp < userStake.startTime + userStake.lockupPeriod) {
penalty = (amount * EARLY_UNSTAKE_PENALTY) / 10**18;
amount -= penalty;
_burn(address(this), penalty);
}
_updateRewards(msg.sender, stakeIndex);
totalStaked -= userStake.amount;
userTotalStaked[msg.sender] -= userStake.amount;
userStake.amount = 0;
_transfer(address(this), msg.sender, amount);
emit Unstaked(msg.sender, amount, stakeIndex, penalty);
}
function claimRewards(uint256 stakeIndex) external nonReentrant {
require(stakeIndex < stakes[msg.sender].length, "Invalid stake index");
_updateRewards(msg.sender, stakeIndex);
uint256 reward = stakes[msg.sender][stakeIndex].accumulatedRewards;
require(reward > 0, "No rewards available");
require(reward <= remainingRewardPool, "Insufficient reward pool");
remainingRewardPool -= reward;
stakes[msg.sender][stakeIndex].accumulatedRewards = 0;
vestingBalance[msg.sender] += reward;
vestingStartTime[msg.sender] = block.timestamp;
emit RewardsClaimed(msg.sender, reward);
emit RewardsVested(msg.sender, reward);
}
function withdrawVested() external nonReentrant {
uint256 available = calculateVestedAmount(msg.sender);
require(available > 0, "No vested amount available");
vestingBalance[msg.sender] -= available;
_transfer(address(this), msg.sender, available);
emit VestingWithdrawn(msg.sender, available);
}
function burn(uint256 amount) external {
require(amount > 0, "Amount must be greater than 0");
require(balanceOf(msg.sender) >= amount, "Insufficient balance");
_burn(msg.sender, amount);
emit Burned(msg.sender, amount);
}
function getStakedBalance(address user) external view returns (uint256) {
return userTotalStaked[user];
}
function calculateRewards(address user, uint256 stakeIndex) public view returns (uint256) {
if (stakeIndex >= stakes[user].length) return 0;
Stake storage userStake = stakes[user][stakeIndex];
if (userStake.amount == 0) return userStake.accumulatedRewards;
uint256 timeElapsed = block.timestamp - userStake.startTime;
uint256 multiplier = _getMultiplier(userStake.lockupPeriod);
uint256 baseReward = (userStake.amount * BASE_STAKING_REWARD_RATE * timeElapsed) /
(365 days * 10**18);
return userStake.accumulatedRewards + (baseReward * multiplier) / 10**18;
}
function calculateVestedAmount(address user) public view returns (uint256) {
if (vestingBalance[user] == 0 || block.timestamp < vestingStartTime[user]) return 0;
uint256 timeElapsed = block.timestamp - vestingStartTime[user];
if (timeElapsed >= VESTING_PERIOD) return vestingBalance[user];
return (vestingBalance[user] * timeElapsed) / VESTING_PERIOD;
}
function _updateRewards(address user, uint256 stakeIndex) internal {
if (stakeIndex < stakes[user].length) {
stakes[user][stakeIndex].accumulatedRewards = calculateRewards(user, stakeIndex);
stakes[user][stakeIndex].startTime = block.timestamp;
}
}
function _getMultiplier(uint256 lockupPeriod) internal pure returns (uint256) {
if (lockupPeriod == LOCKUP_3_MONTHS) return MULTIPLIER_3_MONTHS;
if (lockupPeriod == LOCKUP_6_MONTHS) return MULTIPLIER_6_MONTHS;
if (lockupPeriod == LOCKUP_1_YEAR) return MULTIPLIER_1_YEAR;
if (lockupPeriod == LOCKUP_2_YEARS) return MULTIPLIER_2_YEARS;
if (lockupPeriod == LOCKUP_4_YEARS) return MULTIPLIER_4_YEARS;
return 10**18; // 1× for no lockup
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @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 ReentrancyGuard {
// 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;
constructor() {
_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() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* 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 ERC20 is Context, IERC20, IERC20Metadata {
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}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_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 default value returned by this function, unless
* it's 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:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, 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}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, 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}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, 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) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, 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) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* 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:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(address from, address to, uint256 amount) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, 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;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_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;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_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 Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - 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 {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}{
"optimizer": {
"runs": 200,
"enabled": true
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsVested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockupPeriod","type":"uint256"}],"name":"Staked","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VestingWithdrawn","type":"event"},{"inputs":[],"name":"BASE_STAKING_REWARD_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPLOYER_ALLOCATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EARLY_UNSTAKE_PENALTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCKUP_1_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCKUP_2_YEARS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCKUP_3_MONTHS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCKUP_4_YEARS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCKUP_6_MONTHS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTIPLIER_1_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTIPLIER_2_YEARS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTIPLIER_3_MONTHS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTIPLIER_4_YEARS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTIPLIER_6_MONTHS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_REWARD_POOL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VESTING_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"stakeIndex","type":"uint256"}],"name":"calculateRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calculateVestedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"}],"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":[{"internalType":"address","name":"user","type":"address"}],"name":"getStakedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingRewardPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockupPeriod","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockupPeriod","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"accumulatedRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"stakeIndex","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTotalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vestingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vestingStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawVested","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f5ffd5b506040518060400160405280600981526020016829b0b63b30ba34b7b760b91b8152506040518060400160405280600481526020016329a0a62b60e11b815250816003908161005e9190610219565b50600461006b8282610219565b5050600160055550610088306a4e950851be0c2ebf0000006100b1565b61009d336a0422ca8b0a00a4250000006100b1565b6a4e950851be0c2ebf000000600b556102fc565b6001600160a01b03821661010b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060025f82825461011c91906102d7565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061019f57607f821691505b6020821081036101bd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610172578282111561017257805f5260205f20601f840160051c60208510156101ee57505f5b90810190601f840160051c035f5b81811015610211575f838201556001016101fc565b505050505050565b81516001600160401b0381111561023257610232610177565b61024681610240845461018b565b846101c3565b6020601f821160018114610278575f83156102615750848201515b5f19600385901b1c1916600184901b1784556102d0565b5f84815260208120601f198516915b828110156102a75787850151825560209485019460019092019101610287565b50848210156102c457868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b808201808211156102f657634e487b7160e01b5f52601160045260245ffd5b92915050565b611a59806103095f395ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806370a0823111610140578063beb8314c116100bf578063dd62ed3e11610084578063dd62ed3e1461050c578063e7a0fb9b1461051f578063ea63fb2614610528578063ec2130be14610547578063f32df79114610559578063ffa06b2a14610568575f5ffd5b8063beb8314c146104cb578063bf4f1066146104de578063c6d2b9cf146104e8578063c7ba5c4b146104f6578063d58051a014610501575f5ffd5b8063817b1cd211610105578063817b1cd21461048557806395d89b411461048e578063a457c2d714610496578063a9059cbb146104a9578063b28bc23a146104bc575f5ffd5b806370a0823114610412578063719de1ef1461043a5780637b0472f0146104595780637b25edf11461046c5780637f0c57db14610476575f5ffd5b80632e17de78116101d75780633a02a42d1161019c5780633a02a42d146103785780633bbb15c7146103a057806342966c68146103b257806350990803146103c5578063584b62a1146103d457806367f63bab14610407575f5ffd5b80632e17de7814610323578063313ce5671461033657806332cb6b0c1461034557806336265192146103575780633950935114610365575f5ffd5b806318160ddd1161021d57806318160ddd146102cb578063192399d1146102d35780631b5a9e60146102f25780631f4531f51461030157806323b872dd14610310575f5ffd5b80630197d9721461025957806306fdde0314610276578063095ea7b31461028b5780630962ef79146102ae5780630ea0783c146102c3575b5f5ffd5b610263624f1a0081565b6040519081526020015b60405180910390f35b61027e61057b565b60405161026d9190611834565b61029e610299366004611884565b61060b565b604051901515815260200161026d565b6102c16102bc3660046118ac565b610624565b005b6102c1610856565b600254610263565b6102636102e13660046118c3565b60076020525f908152604090205481565b610263671bc16d674ec8000081565b61026367016345785d8a000081565b61029e61031e3660046118dc565b61092a565b6102c16103313660046118ac565b6109f5565b6040516012815260200161026d565b6102636a52b7d2dcc80cd2e400000081565b61026366038d7ea4c6800081565b61029e610373366004611884565b610bd3565b6102636103863660046118c3565b6001600160a01b03165f9081526009602052604090205490565b6102636a4e950851be0c2ebf00000081565b6102c16103c03660046118ac565b610bef565b610263670f43fc2c04ee000081565b6103e76103e2366004611884565b610cd5565b60408051948552602085019390935291830152606082015260800161026d565b6102636301e1338081565b6102636104203660046118c3565b6001600160a01b03165f9081526020819052604090205490565b6102636104483660046118c3565b60096020525f908152604090205481565b6102c1610467366004611916565b610d17565b6102636276a70081565b610263671158e460913d000081565b610263600a5481565b61027e610f8f565b61029e6104a4366004611884565b610f9e565b61029e6104b7366004611884565b611023565b6102636714d1120d7b16000081565b6102636104d9366004611884565b6110ba565b61026362ed4e0081565b61026366f8b0a10e47000081565b6102636303c2670081565b610263630784ce0081565b61026361051a366004611936565b6111bf565b610263600b5481565b6102636105363660046118c3565b60086020525f908152604090205481565b6102636a0422ca8b0a00a42500000081565b6102636729a2241af62c000081565b6102636105763660046118c3565b6111e9565b60606003805461058a90611967565b80601f01602080910402602001604051908101604052809291908181526020018280546105b690611967565b80156106015780601f106105d857610100808354040283529160200191610601565b820191905f5260205f20905b8154815290600101906020018083116105e457829003601f168201915b5050505050905090565b5f336106188185856112ab565b60019150505b92915050565b61062c6113cf565b335f9081526006602052604090205481106106845760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e6e8c2d6ca40d2dcc8caf606b1b60448201526064015b60405180910390fd5b61068e3382611428565b335f9081526006602052604081208054839081106106ae576106ae61199f565b905f5260205f2090600402016003015490505f81116107065760405162461bcd60e51b81526020600482015260146024820152734e6f207265776172647320617661696c61626c6560601b604482015260640161067b565b600b548111156107585760405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e742072657761726420706f6f6c0000000000000000604482015260640161067b565b80600b5f82825461076991906119c7565b9091555050335f90815260066020526040812080548490811061078e5761078e61199f565b5f91825260208083206003600490930201919091019290925533815260079091526040812080548392906107c39084906119da565b9091555050335f8181526008602052604090819020429055517ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe9061080b9084815260200190565b60405180910390a260405181815233907facea123f8434fb380d75d36c9908548ac7b1804b1f1ce4b2396a3e167e64e6a09060200160405180910390a2506108536001600555565b50565b61085e6113cf565b5f610868336111e9565b90505f81116108b95760405162461bcd60e51b815260206004820152601a60248201527f4e6f2076657374656420616d6f756e7420617661696c61626c65000000000000604482015260640161067b565b335f90815260076020526040812080548392906108d79084906119c7565b909155506108e890503033836114d9565b60405181815233907f1ac2c07e3ea525a04232f1be6ad5b5441ef9cf47beb764c8a3d7b8d71b6376189060200160405180910390a2506109286001600555565b565b5f6109336113cf565b5f670de0b6b3a764000061094e66038d7ea4c68000856119ed565b6109589190611a04565b90505f61096582856119c7565b90506109868633866109778a336111bf565b61098191906119c7565b6112ab565b610990868361167c565b61099b8686836114d9565b856001600160a01b03167f1a0bca5ab55a89c60d1dc6fd10b10a05c2f16d3a06f4031e59a39083fbe56a6a836040516109d691815260200190565b60405180910390a26001925050506109ee6001600555565b9392505050565b6109fd6113cf565b335f908152600660205260409020548110610a505760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e6e8c2d6ca40d2dcc8caf606b1b604482015260640161067b565b335f908152600660205260408120805483908110610a7057610a7061199f565b905f5260205f20906004020190505f815f015411610ac35760405162461bcd60e51b815260206004820152601060248201526f139bc81cdd185ad95908185b5bdd5b9d60821b604482015260640161067b565b805460018201545f9015801590610aec575082600101548360020154610ae991906119da565b42105b15610b2e57670de0b6b3a7640000610b0c67016345785d8a0000846119ed565b610b169190611a04565b9050610b2281836119c7565b9150610b2e308261167c565b610b383385611428565b8254600a80545f90610b4b9084906119c7565b90915550508254335f9081526009602052604081208054909190610b709084906119c7565b90915550505f8355610b833033846114d9565b604080518381526020810186905290810182905233907f204fccf0d92ed8d48f204adb39b2e81e92bad0dedb93f5716ca9478cfb57de009060600160405180910390a25050506108536001600555565b5f33610618818585610be583836111bf565b61098191906119da565b5f8111610c3e5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161067b565b335f90815260208190526040902054811115610c935760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161067b565b610c9d338261167c565b60405181815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a250565b6006602052815f5260405f208181548110610cee575f80fd5b5f9182526020909120600490910201805460018201546002830154600390930154919450925084565b610d1f6113cf565b5f8211610d6e5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161067b565b335f90815260208190526040902054821115610dc35760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161067b565b81610dce33306111bf565b1015610e155760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015260640161067b565b801580610e2457506276a70081145b80610e31575062ed4e0081145b80610e3f57506301e1338081145b80610e4d57506303c2670081145b80610e5b5750630784ce0081145b610e9f5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b1bd8dadd5c081c195c9a5bd9605a1b604482015260640161067b565b610eaa3330846114d9565b335f908152600660209081526040808320815160808101835286815280840186815242938201938452606082018681528354600181810186559488529587209251600490960290920194855551918401919091559051600283015551600390910155600a8054849290610f1e9084906119da565b9091555050335f9081526009602052604081208054849290610f419084906119da565b9091555050604080518381526020810183905233917f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee90910160405180910390a2610f8b6001600555565b5050565b60606004805461058a90611967565b5f3381610fab82866111bf565b90508381101561100b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161067b565b61101882868684036112ab565b506001949350505050565b5f61102c6113cf565b5f670de0b6b3a764000061104766038d7ea4c68000856119ed565b6110519190611a04565b90505f61105e82856119c7565b905061106a338361167c565b6110753386836114d9565b60405182815233907f1a0bca5ab55a89c60d1dc6fd10b10a05c2f16d3a06f4031e59a39083fbe56a6a9060200160405180910390a260019250505061061e6001600555565b6001600160a01b0382165f9081526006602052604081205482106110df57505f61061e565b6001600160a01b0383165f9081526006602052604081208054849081106111085761110861199f565b905f5260205f2090600402019050805f01545f0361112b5760030154905061061e565b5f81600201544261113c91906119c7565b90505f61114c83600101546117a4565b90505f6a1a1601fc4ea7109e0000008366f8b0a10e470000865f015461117291906119ed565b61117c91906119ed565b6111869190611a04565b9050670de0b6b3a764000061119b83836119ed565b6111a59190611a04565b84600301546111b491906119da565b979650505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b0381165f90815260076020526040812054158061122357506001600160a01b0382165f9081526008602052604090205442105b1561122f57505f919050565b6001600160a01b0382165f9081526008602052604081205461125190426119c7565b9050624f1a0081106112795750506001600160a01b03165f9081526007602052604090205490565b6001600160a01b0383165f90815260076020526040902054624f1a00906112a19083906119ed565b6109ee9190611a04565b6001600160a01b03831661130d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161067b565b6001600160a01b03821661136e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161067b565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6002600554036114215760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067b565b6002600555565b6001600160a01b0382165f90815260066020526040902054811015610f8b5761145182826110ba565b6001600160a01b0383165f90815260066020526040902080548390811061147a5761147a61199f565b905f5260205f209060040201600301819055504260065f846001600160a01b03166001600160a01b031681526020019081526020015f2082815481106114c2576114c261199f565b905f5260205f209060040201600201819055505050565b6001600160a01b03831661153d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161067b565b6001600160a01b03821661159f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161067b565b6001600160a01b0383165f90815260208190526040902054818110156116165760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161067b565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b6001600160a01b0382166116dc5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161067b565b6001600160a01b0382165f908152602081905260409020548181101561174f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161067b565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016113c2565b5f6276a70082036117be5750670f43fc2c04ee0000919050565b62ed4e0082036117d75750671158e460913d0000919050565b6301e1338082036117f157506714d1120d7b160000919050565b6303c26700820361180b5750671bc16d674ec80000919050565b630784ce00820361182557506729a2241af62c0000919050565b50670de0b6b3a7640000919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461187f575f5ffd5b919050565b5f5f60408385031215611895575f5ffd5b61189e83611869565b946020939093013593505050565b5f602082840312156118bc575f5ffd5b5035919050565b5f602082840312156118d3575f5ffd5b6109ee82611869565b5f5f5f606084860312156118ee575f5ffd5b6118f784611869565b925061190560208501611869565b929592945050506040919091013590565b5f5f60408385031215611927575f5ffd5b50508035926020909101359150565b5f5f60408385031215611947575f5ffd5b61195083611869565b915061195e60208401611869565b90509250929050565b600181811c9082168061197b57607f821691505b60208210810361199957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561061e5761061e6119b3565b8082018082111561061e5761061e6119b3565b808202811582820484141761061e5761061e6119b3565b5f82611a1e57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212203b67a4c5d3791781609f0962132791a31335783fa3781ad993b4c3e660f335ce64736f6c63430008210033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806370a0823111610140578063beb8314c116100bf578063dd62ed3e11610084578063dd62ed3e1461050c578063e7a0fb9b1461051f578063ea63fb2614610528578063ec2130be14610547578063f32df79114610559578063ffa06b2a14610568575f5ffd5b8063beb8314c146104cb578063bf4f1066146104de578063c6d2b9cf146104e8578063c7ba5c4b146104f6578063d58051a014610501575f5ffd5b8063817b1cd211610105578063817b1cd21461048557806395d89b411461048e578063a457c2d714610496578063a9059cbb146104a9578063b28bc23a146104bc575f5ffd5b806370a0823114610412578063719de1ef1461043a5780637b0472f0146104595780637b25edf11461046c5780637f0c57db14610476575f5ffd5b80632e17de78116101d75780633a02a42d1161019c5780633a02a42d146103785780633bbb15c7146103a057806342966c68146103b257806350990803146103c5578063584b62a1146103d457806367f63bab14610407575f5ffd5b80632e17de7814610323578063313ce5671461033657806332cb6b0c1461034557806336265192146103575780633950935114610365575f5ffd5b806318160ddd1161021d57806318160ddd146102cb578063192399d1146102d35780631b5a9e60146102f25780631f4531f51461030157806323b872dd14610310575f5ffd5b80630197d9721461025957806306fdde0314610276578063095ea7b31461028b5780630962ef79146102ae5780630ea0783c146102c3575b5f5ffd5b610263624f1a0081565b6040519081526020015b60405180910390f35b61027e61057b565b60405161026d9190611834565b61029e610299366004611884565b61060b565b604051901515815260200161026d565b6102c16102bc3660046118ac565b610624565b005b6102c1610856565b600254610263565b6102636102e13660046118c3565b60076020525f908152604090205481565b610263671bc16d674ec8000081565b61026367016345785d8a000081565b61029e61031e3660046118dc565b61092a565b6102c16103313660046118ac565b6109f5565b6040516012815260200161026d565b6102636a52b7d2dcc80cd2e400000081565b61026366038d7ea4c6800081565b61029e610373366004611884565b610bd3565b6102636103863660046118c3565b6001600160a01b03165f9081526009602052604090205490565b6102636a4e950851be0c2ebf00000081565b6102c16103c03660046118ac565b610bef565b610263670f43fc2c04ee000081565b6103e76103e2366004611884565b610cd5565b60408051948552602085019390935291830152606082015260800161026d565b6102636301e1338081565b6102636104203660046118c3565b6001600160a01b03165f9081526020819052604090205490565b6102636104483660046118c3565b60096020525f908152604090205481565b6102c1610467366004611916565b610d17565b6102636276a70081565b610263671158e460913d000081565b610263600a5481565b61027e610f8f565b61029e6104a4366004611884565b610f9e565b61029e6104b7366004611884565b611023565b6102636714d1120d7b16000081565b6102636104d9366004611884565b6110ba565b61026362ed4e0081565b61026366f8b0a10e47000081565b6102636303c2670081565b610263630784ce0081565b61026361051a366004611936565b6111bf565b610263600b5481565b6102636105363660046118c3565b60086020525f908152604090205481565b6102636a0422ca8b0a00a42500000081565b6102636729a2241af62c000081565b6102636105763660046118c3565b6111e9565b60606003805461058a90611967565b80601f01602080910402602001604051908101604052809291908181526020018280546105b690611967565b80156106015780601f106105d857610100808354040283529160200191610601565b820191905f5260205f20905b8154815290600101906020018083116105e457829003601f168201915b5050505050905090565b5f336106188185856112ab565b60019150505b92915050565b61062c6113cf565b335f9081526006602052604090205481106106845760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e6e8c2d6ca40d2dcc8caf606b1b60448201526064015b60405180910390fd5b61068e3382611428565b335f9081526006602052604081208054839081106106ae576106ae61199f565b905f5260205f2090600402016003015490505f81116107065760405162461bcd60e51b81526020600482015260146024820152734e6f207265776172647320617661696c61626c6560601b604482015260640161067b565b600b548111156107585760405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e742072657761726420706f6f6c0000000000000000604482015260640161067b565b80600b5f82825461076991906119c7565b9091555050335f90815260066020526040812080548490811061078e5761078e61199f565b5f91825260208083206003600490930201919091019290925533815260079091526040812080548392906107c39084906119da565b9091555050335f8181526008602052604090819020429055517ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe9061080b9084815260200190565b60405180910390a260405181815233907facea123f8434fb380d75d36c9908548ac7b1804b1f1ce4b2396a3e167e64e6a09060200160405180910390a2506108536001600555565b50565b61085e6113cf565b5f610868336111e9565b90505f81116108b95760405162461bcd60e51b815260206004820152601a60248201527f4e6f2076657374656420616d6f756e7420617661696c61626c65000000000000604482015260640161067b565b335f90815260076020526040812080548392906108d79084906119c7565b909155506108e890503033836114d9565b60405181815233907f1ac2c07e3ea525a04232f1be6ad5b5441ef9cf47beb764c8a3d7b8d71b6376189060200160405180910390a2506109286001600555565b565b5f6109336113cf565b5f670de0b6b3a764000061094e66038d7ea4c68000856119ed565b6109589190611a04565b90505f61096582856119c7565b90506109868633866109778a336111bf565b61098191906119c7565b6112ab565b610990868361167c565b61099b8686836114d9565b856001600160a01b03167f1a0bca5ab55a89c60d1dc6fd10b10a05c2f16d3a06f4031e59a39083fbe56a6a836040516109d691815260200190565b60405180910390a26001925050506109ee6001600555565b9392505050565b6109fd6113cf565b335f908152600660205260409020548110610a505760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e6e8c2d6ca40d2dcc8caf606b1b604482015260640161067b565b335f908152600660205260408120805483908110610a7057610a7061199f565b905f5260205f20906004020190505f815f015411610ac35760405162461bcd60e51b815260206004820152601060248201526f139bc81cdd185ad95908185b5bdd5b9d60821b604482015260640161067b565b805460018201545f9015801590610aec575082600101548360020154610ae991906119da565b42105b15610b2e57670de0b6b3a7640000610b0c67016345785d8a0000846119ed565b610b169190611a04565b9050610b2281836119c7565b9150610b2e308261167c565b610b383385611428565b8254600a80545f90610b4b9084906119c7565b90915550508254335f9081526009602052604081208054909190610b709084906119c7565b90915550505f8355610b833033846114d9565b604080518381526020810186905290810182905233907f204fccf0d92ed8d48f204adb39b2e81e92bad0dedb93f5716ca9478cfb57de009060600160405180910390a25050506108536001600555565b5f33610618818585610be583836111bf565b61098191906119da565b5f8111610c3e5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161067b565b335f90815260208190526040902054811115610c935760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161067b565b610c9d338261167c565b60405181815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a250565b6006602052815f5260405f208181548110610cee575f80fd5b5f9182526020909120600490910201805460018201546002830154600390930154919450925084565b610d1f6113cf565b5f8211610d6e5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161067b565b335f90815260208190526040902054821115610dc35760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161067b565b81610dce33306111bf565b1015610e155760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015260640161067b565b801580610e2457506276a70081145b80610e31575062ed4e0081145b80610e3f57506301e1338081145b80610e4d57506303c2670081145b80610e5b5750630784ce0081145b610e9f5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b1bd8dadd5c081c195c9a5bd9605a1b604482015260640161067b565b610eaa3330846114d9565b335f908152600660209081526040808320815160808101835286815280840186815242938201938452606082018681528354600181810186559488529587209251600490960290920194855551918401919091559051600283015551600390910155600a8054849290610f1e9084906119da565b9091555050335f9081526009602052604081208054849290610f419084906119da565b9091555050604080518381526020810183905233917f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee90910160405180910390a2610f8b6001600555565b5050565b60606004805461058a90611967565b5f3381610fab82866111bf565b90508381101561100b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161067b565b61101882868684036112ab565b506001949350505050565b5f61102c6113cf565b5f670de0b6b3a764000061104766038d7ea4c68000856119ed565b6110519190611a04565b90505f61105e82856119c7565b905061106a338361167c565b6110753386836114d9565b60405182815233907f1a0bca5ab55a89c60d1dc6fd10b10a05c2f16d3a06f4031e59a39083fbe56a6a9060200160405180910390a260019250505061061e6001600555565b6001600160a01b0382165f9081526006602052604081205482106110df57505f61061e565b6001600160a01b0383165f9081526006602052604081208054849081106111085761110861199f565b905f5260205f2090600402019050805f01545f0361112b5760030154905061061e565b5f81600201544261113c91906119c7565b90505f61114c83600101546117a4565b90505f6a1a1601fc4ea7109e0000008366f8b0a10e470000865f015461117291906119ed565b61117c91906119ed565b6111869190611a04565b9050670de0b6b3a764000061119b83836119ed565b6111a59190611a04565b84600301546111b491906119da565b979650505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b0381165f90815260076020526040812054158061122357506001600160a01b0382165f9081526008602052604090205442105b1561122f57505f919050565b6001600160a01b0382165f9081526008602052604081205461125190426119c7565b9050624f1a0081106112795750506001600160a01b03165f9081526007602052604090205490565b6001600160a01b0383165f90815260076020526040902054624f1a00906112a19083906119ed565b6109ee9190611a04565b6001600160a01b03831661130d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161067b565b6001600160a01b03821661136e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161067b565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6002600554036114215760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067b565b6002600555565b6001600160a01b0382165f90815260066020526040902054811015610f8b5761145182826110ba565b6001600160a01b0383165f90815260066020526040902080548390811061147a5761147a61199f565b905f5260205f209060040201600301819055504260065f846001600160a01b03166001600160a01b031681526020019081526020015f2082815481106114c2576114c261199f565b905f5260205f209060040201600201819055505050565b6001600160a01b03831661153d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161067b565b6001600160a01b03821661159f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161067b565b6001600160a01b0383165f90815260208190526040902054818110156116165760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161067b565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b6001600160a01b0382166116dc5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161067b565b6001600160a01b0382165f908152602081905260409020548181101561174f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161067b565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016113c2565b5f6276a70082036117be5750670f43fc2c04ee0000919050565b62ed4e0082036117d75750671158e460913d0000919050565b6301e1338082036117f157506714d1120d7b160000919050565b6303c26700820361180b5750671bc16d674ec80000919050565b630784ce00820361182557506729a2241af62c0000919050565b50670de0b6b3a7640000919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461187f575f5ffd5b919050565b5f5f60408385031215611895575f5ffd5b61189e83611869565b946020939093013593505050565b5f602082840312156118bc575f5ffd5b5035919050565b5f602082840312156118d3575f5ffd5b6109ee82611869565b5f5f5f606084860312156118ee575f5ffd5b6118f784611869565b925061190560208501611869565b929592945050506040919091013590565b5f5f60408385031215611927575f5ffd5b50508035926020909101359150565b5f5f60408385031215611947575f5ffd5b61195083611869565b915061195e60208401611869565b90509250929050565b600181811c9082168061197b57607f821691505b60208210810361199957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561061e5761061e6119b3565b8082018082111561061e5761061e6119b3565b808202811582820484141761061e5761061e6119b3565b5f82611a1e57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212203b67a4c5d3791781609f0962132791a31335783fa3781ad993b4c3e660f335ce64736f6c63430008210033
Deployed Bytecode Sourcemap
874:8791:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1329:48;;1370:7;1329:48;;;;;160:25:6;;;148:2;133:18;1329:48:0;;;;;;;;2158:98:2;;;:::i;:::-;;;;;;;:::i;4444:197::-;;;;;;:::i;:::-;;:::i;:::-;;;1267:14:6;;1260:22;1242:41;;1230:2;1215:18;4444:197:2;1102:187:6;6300:723:0;;;;;;:::i;:::-;;:::i;:::-;;7031:350;;;:::i;3255:106:2:-;3342:12;;3255:106;;2424:49:0;;;;;;:::i;:::-;;;;;;;;;;;;;;1899:56;;1945:10;1899:56;;2121:54;;2169:6;2121:54;;3810:495;;;;;;:::i;:::-;;:::i;5369:923::-;;;;;;:::i;:::-;;:::i;3104:91:2:-;;;3186:2;2237:36:6;;2225:2;2210:18;3104:91:2;2095:184:6;963:57:0;;1000:20;963:57;;2047:45;;2086:6;2047:45;;5854:234:2;;;;;;:::i;:::-;;:::i;7662:119:0:-;;;;;;:::i;:::-;-1:-1:-1;;;;;7752:21:0;7725:7;7752:21;;;:15;:21;;;;;;;7662:119;1050:65;;1096:19;1050:65;;7389:265;;;;;;:::i;:::-;;:::i;1673:57::-;;1719:11;1673:57;;2376:41;;;;;;:::i;:::-;;:::i;:::-;;;;2515:25:6;;;2571:2;2556:18;;2549:34;;;;2599:18;;;2592:34;2657:2;2642:18;;2635:34;2502:3;2487:19;2376:41:0;2284:391:6;1499:50:0;;1541:8;1499:50;;3419:125:2;;;;;;:::i;:::-;-1:-1:-1;;;;;3519:18:2;3493:7;3519:18;;;;;;;;;;;;3419:125;2538:50:0;;;;;;:::i;:::-;;;;;;;;;;;;;;4313:1048;;;;;;:::i;:::-;;:::i;1386:49::-;;1428:7;1386:49;;1748:58;;1794:12;1748:58;;2597:26;;;;;;2369:102:2;;;:::i;6575:427::-;;;;;;:::i;:::-;;:::i;3396:406:0:-;;;;;;:::i;:::-;;:::i;1824:57::-;;1870:11;1824:57;;7789:657;;;;;;:::i;:::-;;:::i;1442:50::-;;1484:8;1442:50;;1237:61;;1288:10;1237:61;;1556:50;;1598:8;1556:50;;1613:51;;1655:9;1613:51;;3987:149:2;;;;;;:::i;:::-;;:::i;2630:34:0:-;;;;;;2480:51;;;;;;:::i;:::-;;;;;;;;;;;;;;1143:64;;1189:18;1143:64;;1972:56;;2018:10;1972:56;;8454:398;;;;;;:::i;:::-;;:::i;2158:98:2:-;2212:13;2244:5;2237:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2158:98;:::o;4444:197::-;4527:4;719:10:5;4581:32:2;719:10:5;4597:7:2;4606:6;4581:8;:32::i;:::-;4630:4;4623:11;;;4444:197;;;;;:::o;6300:723:0:-;2261:21:1;:19;:21::i;:::-;6403:10:0::1;6396:18;::::0;;;:6:::1;:18;::::0;;;;:25;6383:38;::::1;6375:70;;;::::0;-1:-1:-1;;;6375:70:0;;3883:2:6;6375:70:0::1;::::0;::::1;3865:21:6::0;3922:2;3902:18;;;3895:30;-1:-1:-1;;;3941:18:6;;;3934:49;4000:18;;6375:70:0::1;;;;;;;;;6456:38;6471:10;6483;6456:14;:38::i;:::-;6531:10;6507:14;6524:18:::0;;;:6:::1;:18;::::0;;;;:30;;6543:10;;6524:30;::::1;;;;;:::i;:::-;;;;;;;;;;;:49;;;6507:66;;6601:1;6592:6;:10;6584:43;;;::::0;-1:-1:-1;;;6584:43:0;;4363:2:6;6584:43:0::1;::::0;::::1;4345:21:6::0;4402:2;4382:18;;;4375:30;-1:-1:-1;;;4421:18:6;;;4414:50;4481:18;;6584:43:0::1;4161:344:6::0;6584:43:0::1;6656:19;;6646:6;:29;;6638:66;;;::::0;-1:-1:-1;;;6638:66:0;;4712:2:6;6638:66:0::1;::::0;::::1;4694:21:6::0;4751:2;4731:18;;;4724:30;4790:26;4770:18;;;4763:54;4834:18;;6638:66:0::1;4510:348:6::0;6638:66:0::1;6740:6;6717:19;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;6764:10:0::1;6809:1;6757:18:::0;;;:6:::1;:18;::::0;;;;:30;;6776:10;;6757:30;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:49:::1;:30;::::0;;::::1;;:49:::0;;;::::1;:53:::0;;;;6836:10:::1;6821:26:::0;;:14:::1;:26:::0;;;;;;:36;;6851:6;;6757:30;6821:36:::1;::::0;6851:6;;6821:36:::1;:::i;:::-;::::0;;;-1:-1:-1;;6885:10:0::1;6868:28;::::0;;;:16:::1;:28;::::0;;;;;;6899:15:::1;6868:46:::0;;6932:34;::::1;::::0;::::1;::::0;6959:6;160:25:6;;148:2;133:18;;14:177;6932:34:0::1;;;;;;;;6982:33;::::0;160:25:6;;;6996:10:0::1;::::0;6982:33:::1;::::0;148:2:6;133:18;6982:33:0::1;;;;;;;6364:659;2303:20:1::0;1716:1;2809:7;:22;2629:209;2303:20;6300:723:0;:::o;7031:350::-;2261:21:1;:19;:21::i;:::-;7090:17:0::1;7110:33;7132:10;7110:21;:33::i;:::-;7090:53;;7174:1;7162:9;:13;7154:52;;;::::0;-1:-1:-1;;;7154:52:0;;5460:2:6;7154:52:0::1;::::0;::::1;5442:21:6::0;5499:2;5479:18;;;5472:30;5538:28;5518:18;;;5511:56;5584:18;;7154:52:0::1;5258:350:6::0;7154:52:0::1;7234:10;7219:26;::::0;;;:14:::1;:26;::::0;;;;:39;;7249:9;;7219:26;:39:::1;::::0;7249:9;;7219:39:::1;:::i;:::-;::::0;;;-1:-1:-1;7269:47:0::1;::::0;-1:-1:-1;7287:4:0::1;7294:10;7306:9:::0;7269::::1;:47::i;:::-;7334:39;::::0;160:25:6;;;7351:10:0::1;::::0;7334:39:::1;::::0;148:2:6;133:18;7334:39:0::1;;;;;;;7079:302;2303:20:1::0;1716:1;2809:7;:22;2629:209;2303:20;7031:350:0:o;3810:495::-;3961:4;2261:21:1;:19;:21::i;:::-;3984:11:0::1;4024:6;3999:21;2086:6;3999::::0;:21:::1;:::i;:::-;3998:32;;;;:::i;:::-;3984:46:::0;-1:-1:-1;4041:17:0::1;4061:12;3984:46:::0;4061:6;:12:::1;:::i;:::-;4041:32;;4086:68;4095:6;4103:10;4147:6;4115:29;4125:6;4133:10;4115:9;:29::i;:::-;:38;;;;:::i;:::-;4086:8;:68::i;:::-;4167:18;4173:6;4181:3;4167:5;:18::i;:::-;4196:39;4206:6;4214:9;4225;4196;:39::i;:::-;4263:6;-1:-1:-1::0;;;;;4253:22:0::1;;4271:3;4253:22;;;;160:25:6::0;;148:2;133:18;;14:177;4253:22:0::1;;;;;;;;4293:4;4286:11;;;;2303:20:1::0;1716:1;2809:7;:22;2629:209;2303:20;3810:495:0;;;;;:::o;5369:923::-;2261:21:1;:19;:21::i;:::-;5467:10:0::1;5460:18;::::0;;;:6:::1;:18;::::0;;;;:25;5447:38;::::1;5439:70;;;::::0;-1:-1:-1;;;5439:70:0;;3883:2:6;5439:70:0::1;::::0;::::1;3865:21:6::0;3922:2;3902:18;;;3895:30;-1:-1:-1;;;3941:18:6;;;3934:49;4000:18;;5439:70:0::1;3681:343:6::0;5439:70:0::1;5553:10;5520:23;5546:18:::0;;;:6:::1;:18;::::0;;;;:30;;5565:10;;5546:30;::::1;;;;;:::i;:::-;;;;;;;;;;;5520:56;;5614:1;5595:9;:16;;;:20;5587:49;;;::::0;-1:-1:-1;;;5587:49:0;;6210:2:6;5587:49:0::1;::::0;::::1;6192:21:6::0;6249:2;6229:18;;;6222:30;-1:-1:-1;;;6268:18:6;;;6261:46;6324:18;;5587:49:0::1;6008:340:6::0;5587:49:0::1;5666:16:::0;;5729:22:::1;::::0;::::1;::::0;5649:14:::1;::::0;5729:26;;;;:92:::1;;;5799:9;:22;;;5777:9;:19;;;:44;;;;:::i;:::-;5759:15;:62;5729:92;5725:252;;;5883:6;5849:30;2169:6;5849::::0;:30:::1;:::i;:::-;5848:41;;;;:::i;:::-;5838:51:::0;-1:-1:-1;5904:17:0::1;5838:51:::0;5904:17;::::1;:::i;:::-;;;5936:29;5950:4;5957:7;5936:5;:29::i;:::-;5989:38;6004:10;6016;5989:14;:38::i;:::-;6055:16:::0;;6040:11:::1;:31:::0;;6055:16:::1;::::0;6040:31:::1;::::0;6055:16;;6040:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;6113:16:0;;6098:10:::1;6113:16;6082:27:::0;;;:15:::1;:27;::::0;;;;:47;;:27;;6113:16;6082:47:::1;::::0;6113:16;;6082:47:::1;:::i;:::-;::::0;;;-1:-1:-1;;6161:1:0::1;6142:20:::0;;6173:44:::1;6191:4;6198:10;6210:6:::0;6173:9:::1;:44::i;:::-;6235:49;::::0;;6555:25:6;;;6611:2;6596:18;;6589:34;;;6639:18;;;6632:34;;;6244:10:0::1;::::0;6235:49:::1;::::0;6543:2:6;6528:18;6235:49:0::1;;;;;;;5428:864;;;2303:20:1::0;1716:1;2809:7;:22;2629:209;5854:234:2;5942:4;719:10:5;5996:64:2;719:10:5;6012:7:2;6049:10;6021:25;719:10:5;6012:7:2;6021:9;:25::i;:::-;:38;;;;:::i;7389:265:0:-;7456:1;7447:6;:10;7439:52;;;;-1:-1:-1;;;7439:52:0;;6879:2:6;7439:52:0;;;6861:21:6;6918:2;6898:18;;;6891:30;6957:31;6937:18;;;6930:59;7006:18;;7439:52:0;6677:353:6;7439:52:0;7520:10;3493:7:2;3519:18;;;;;;;;;;;7535:6:0;-1:-1:-1;7510:31:0;7502:64;;;;-1:-1:-1;;;7502:64:0;;7237:2:6;7502:64:0;;;7219:21:6;7276:2;7256:18;;;7249:30;-1:-1:-1;;;7295:18:6;;;7288:50;7355:18;;7502:64:0;7035:344:6;7502:64:0;7579:25;7585:10;7597:6;7579:5;:25::i;:::-;7620:26;;160:25:6;;;7627:10:0;;7620:26;;148:2:6;133:18;7620:26:0;;;;;;;7389:265;:::o;2376:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2376:41:0;-1:-1:-1;2376:41:0;:::o;4313:1048::-;2261:21:1;:19;:21::i;:::-;4416:1:0::1;4407:6;:10;4399:52;;;::::0;-1:-1:-1;;;4399:52:0;;6879:2:6;4399:52:0::1;::::0;::::1;6861:21:6::0;6918:2;6898:18;;;6891:30;6957:31;6937:18;;;6930:59;7006:18;;4399:52:0::1;6677:353:6::0;4399:52:0::1;4480:10;3493:7:2::0;3519:18;;;;;;;;;;;4495:6:0;-1:-1:-1;4470:31:0::1;4462:64;;;::::0;-1:-1:-1;;;4462:64:0;;7237:2:6;4462:64:0::1;::::0;::::1;7219:21:6::0;7276:2;7256:18;;;7249:30;-1:-1:-1;;;7295:18:6;;;7288:50;7355:18;;4462:64:0::1;7035:344:6::0;4462:64:0::1;4585:6;4545:36;4555:10;4575:4;4545:9;:36::i;:::-;:46;;4537:81;;;::::0;-1:-1:-1;;;4537:81:0;;7586:2:6;4537:81:0::1;::::0;::::1;7568:21:6::0;7625:2;7605:18;;;7598:30;-1:-1:-1;;;7644:18:6;;;7637:52;7706:18;;4537:81:0::1;7384:346:6::0;4537:81:0::1;4651:17:::0;;;:65:::1;;;1428:7;4685:12;:31;4651:65;:113;;;;1484:8;4733:12;:31;4651:113;:159;;;;1541:8;4781:12;:29;4651:159;:206;;;;1598:8;4827:12;:30;4651:206;:253;;;;1655:9;4874:12;:30;4651:253;4629:324;;;::::0;-1:-1:-1;;;4629:324:0;;7937:2:6;4629:324:0::1;::::0;::::1;7919:21:6::0;7976:2;7956:18;;;7949:30;-1:-1:-1;;;7995:18:6;;;7988:51;8056:18;;4629:324:0::1;7735:345:6::0;4629:324:0::1;4966:44;4976:10;4996:4;5003:6;4966:9;:44::i;:::-;5030:10;5023:18;::::0;;;:6:::1;:18;::::0;;;;;;;5047:165;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;5149:15:::1;5047:165:::0;;;;;;;;;;;;5023:190;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;5226:11:::1;:21:::0;;5076:6;;5023:18;5226:21:::1;::::0;5076:6;;5226:21:::1;:::i;:::-;::::0;;;-1:-1:-1;;5274:10:0::1;5258:27;::::0;;;:15:::1;:27;::::0;;;;:37;;5289:6;;5258:27;:37:::1;::::0;5289:6;;5258:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;5313:40:0::1;::::0;;8259:25:6;;;8315:2;8300:18;;8293:34;;;5320:10:0::1;::::0;5313:40:::1;::::0;8232:18:6;5313:40:0::1;;;;;;;2303:20:1::0;1716:1;2809:7;:22;2629:209;2303:20;4313:1048:0;;:::o;2369:102:2:-;2425:13;2457:7;2450:14;;;;;:::i;6575:427::-;6668:4;719:10:5;6668:4:2;6749:25;719:10:5;6766:7:2;6749:9;:25::i;:::-;6722:52;;6812:15;6792:16;:35;;6784:85;;;;-1:-1:-1;;;6784:85:2;;8540:2:6;6784:85:2;;;8522:21:6;8579:2;8559:18;;;8552:30;8618:34;8598:18;;;8591:62;-1:-1:-1;;;8669:18:6;;;8662:35;8714:19;;6784:85:2;8338:401:6;6784:85:2;6903:60;6912:5;6919:7;6947:15;6928:16;:34;6903:8;:60::i;:::-;-1:-1:-1;6991:4:2;;6575:427;-1:-1:-1;;;;6575:427:2:o;3396:406:0:-;3527:4;2261:21:1;:19;:21::i;:::-;3550:11:0::1;3590:6;3565:21;2086:6;3565::::0;:21:::1;:::i;:::-;3564:32;;;;:::i;:::-;3550:46:::0;-1:-1:-1;3607:17:0::1;3627:12;3550:46:::0;3627:6;:12:::1;:::i;:::-;3607:32;;3652:22;3658:10;3670:3;3652:5;:22::i;:::-;3685:43;3695:10;3707:9;3718;3685;:43::i;:::-;3746:26;::::0;160:25:6;;;3756:10:0::1;::::0;3746:26:::1;::::0;148:2:6;133:18;3746:26:0::1;;;;;;;3790:4;3783:11;;;;2303:20:1::0;1716:1;2809:7;:22;2629:209;7789:657:0;-1:-1:-1;;;;;7908:12:0;;7870:7;7908:12;;;:6;:12;;;;;:19;7894:33;;7890:47;;-1:-1:-1;7936:1:0;7929:8;;7890:47;-1:-1:-1;;;;;7974:12:0;;7948:23;7974:12;;;:6;:12;;;;;:24;;7987:10;;7974:24;;;;;;:::i;:::-;;;;;;;;;;;7948:50;;8013:9;:16;;;8033:1;8013:21;8009:62;;8043:28;;;;-1:-1:-1;8036:35:0;;8009:62;8084:19;8124:9;:19;;;8106:15;:37;;;;:::i;:::-;8084:59;;8154:18;8175:38;8190:9;:22;;;8175:14;:38::i;:::-;8154:59;;8224:18;8337:17;8292:11;1288:10;8246:9;:16;;;:43;;;;:::i;:::-;:57;;;;:::i;:::-;8245:110;;;;:::i;:::-;8224:131;-1:-1:-1;8432:6:0;8405:23;8418:10;8224:131;8405:23;:::i;:::-;8404:34;;;;:::i;:::-;8373:9;:28;;;:65;;;;:::i;:::-;8366:72;7789:657;-1:-1:-1;;;;;;;7789:657:0:o;3987:149:2:-;-1:-1:-1;;;;;4102:18:2;;;4076:7;4102:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3987:149::o;8454:398:0:-;-1:-1:-1;;;;;8544:20:0;;8520:7;8544:20;;;:14;:20;;;;;;:25;;:69;;-1:-1:-1;;;;;;8591:22:0;;;;;;:16;:22;;;;;;8573:15;:40;8544:69;8540:83;;;-1:-1:-1;8622:1:0;;8454:398;-1:-1:-1;8454:398:0:o;8540:83::-;-1:-1:-1;;;;;8676:22:0;;8636:19;8676:22;;;:16;:22;;;;;;8658:40;;:15;:40;:::i;:::-;8636:62;;1370:7;8713:11;:29;8709:62;;-1:-1:-1;;;;;;;8751:20:0;;;;;:14;:20;;;;;;;8454:398::o;8709:62::-;-1:-1:-1;;;;;8792:20:0;;;;;;:14;:20;;;;;;1370:7;;8792:34;;8815:11;;8792:34;:::i;:::-;8791:53;;;;:::i;10457:340:2:-;-1:-1:-1;;;;;10558:19:2;;10550:68;;;;-1:-1:-1;;;10550:68:2;;8946:2:6;10550:68:2;;;8928:21:6;8985:2;8965:18;;;8958:30;9024:34;9004:18;;;8997:62;-1:-1:-1;;;9075:18:6;;;9068:34;9119:19;;10550:68:2;8744:400:6;10550:68:2;-1:-1:-1;;;;;10636:21:2;;10628:68;;;;-1:-1:-1;;;10628:68:2;;9351:2:6;10628:68:2;;;9333:21:6;9390:2;9370:18;;;9363:30;9429:34;9409:18;;;9402:62;-1:-1:-1;;;9480:18:6;;;9473:32;9522:19;;10628:68:2;9149:398:6;10628:68:2;-1:-1:-1;;;;;10707:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10758:32;;160:25:6;;;10758:32:2;;133:18:6;10758:32:2;;;;;;;;10457:340;;;:::o;2336:287:1:-;1759:1;2468:7;;:19;2460:63;;;;-1:-1:-1;;;2460:63:1;;9754:2:6;2460:63:1;;;9736:21:6;9793:2;9773:18;;;9766:30;9832:33;9812:18;;;9805:61;9883:18;;2460:63:1;9552:355:6;2460:63:1;1759:1;2598:7;:18;2336:287::o;8860:297:0:-;-1:-1:-1;;;;;8955:12:0;;;;;;:6;:12;;;;;:19;8942:32;;8938:212;;;9037:34;9054:4;9060:10;9037:16;:34::i;:::-;-1:-1:-1;;;;;8991:12:0;;;;;;:6;:12;;;;;:24;;9004:10;;8991:24;;;;;;:::i;:::-;;;;;;;;;;;:43;;:80;;;;9123:15;9086:6;:12;9093:4;-1:-1:-1;;;;;9086:12:0;-1:-1:-1;;;;;9086:12:0;;;;;;;;;;;;9099:10;9086:24;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;:52;;;;8860:297;;:::o;7456:788:2:-;-1:-1:-1;;;;;7552:18:2;;7544:68;;;;-1:-1:-1;;;7544:68:2;;10114:2:6;7544:68:2;;;10096:21:6;10153:2;10133:18;;;10126:30;10192:34;10172:18;;;10165:62;-1:-1:-1;;;10243:18:6;;;10236:35;10288:19;;7544:68:2;9912:401:6;7544:68:2;-1:-1:-1;;;;;7630:16:2;;7622:64;;;;-1:-1:-1;;;7622:64:2;;10520:2:6;7622:64:2;;;10502:21:6;10559:2;10539:18;;;10532:30;10598:34;10578:18;;;10571:62;-1:-1:-1;;;10649:18:6;;;10642:33;10692:19;;7622:64:2;10318:399:6;7622:64:2;-1:-1:-1;;;;;7768:15:2;;7746:19;7768:15;;;;;;;;;;;7801:21;;;;7793:72;;;;-1:-1:-1;;;7793:72:2;;10924:2:6;7793:72:2;;;10906:21:6;10963:2;10943:18;;;10936:30;11002:34;10982:18;;;10975:62;-1:-1:-1;;;11053:18:6;;;11046:36;11099:19;;7793:72:2;10722:402:6;7793:72:2;-1:-1:-1;;;;;7899:15:2;;;:9;:15;;;;;;;;;;;7917:20;;;7899:38;;8114:13;;;;;;;;;;:23;;;;;;8163:26;;160:25:6;;;8114:13:2;;8163:26;;133:18:6;8163:26:2;;;;;;;7534:710;7456:788;;;:::o;9375:659::-;-1:-1:-1;;;;;9458:21:2;;9450:67;;;;-1:-1:-1;;;9450:67:2;;11331:2:6;9450:67:2;;;11313:21:6;11370:2;11350:18;;;11343:30;11409:34;11389:18;;;11382:62;-1:-1:-1;;;11460:18:6;;;11453:31;11501:19;;9450:67:2;11129:397:6;9450:67:2;-1:-1:-1;;;;;9613:18:2;;9588:22;9613:18;;;;;;;;;;;9649:24;;;;9641:71;;;;-1:-1:-1;;;9641:71:2;;11733:2:6;9641:71:2;;;11715:21:6;11772:2;11752:18;;;11745:30;11811:34;11791:18;;;11784:62;-1:-1:-1;;;11862:18:6;;;11855:32;11904:19;;9641:71:2;11531:398:6;9641:71:2;-1:-1:-1;;;;;9746:18:2;;:9;:18;;;;;;;;;;;9767:23;;;9746:44;;9883:12;:22;;;;;;;9931:37;160:25:6;;;9746:9:2;;:18;9931:37;;133:18:6;9931:37:2;14:177:6;9165:497:0;9234:7;1428;9258:12;:31;9254:63;;-1:-1:-1;1719:11:0;;9165:497;-1:-1:-1;9165:497:0:o;9254:63::-;1484:8;9332:12;:31;9328:63;;-1:-1:-1;1794:12:0;;9165:497;-1:-1:-1;9165:497:0:o;9328:63::-;1541:8;9406:12;:29;9402:61;;-1:-1:-1;1870:11:0;;9165:497;-1:-1:-1;9165:497:0:o;9402:61::-;1598:8;9478:12;:30;9474:62;;-1:-1:-1;1945:10:0;;9165:497;-1:-1:-1;9165:497:0:o;9474:62::-;1655:9;9551:12;:30;9547:62;;-1:-1:-1;2018:10:0;;9165:497;-1:-1:-1;9165:497:0:o;9547:62::-;-1:-1:-1;9627:6:0;;9165:497;-1:-1:-1;9165:497:0:o;196:418:6:-;345:2;334:9;327:21;308:4;377:6;371:13;420:6;415:2;404:9;400:18;393:34;479:6;474:2;466:6;462:15;457:2;446:9;442:18;436:50;535:1;530:2;521:6;510:9;506:22;502:31;495:42;605:2;598;594:7;589:2;581:6;577:15;573:29;562:9;558:45;554:54;546:62;;;196:418;;;;:::o;619:173::-;687:20;;-1:-1:-1;;;;;736:31:6;;726:42;;716:70;;782:1;779;772:12;716:70;619:173;;;:::o;797:300::-;865:6;873;926:2;914:9;905:7;901:23;897:32;894:52;;;942:1;939;932:12;894:52;965:29;984:9;965:29;:::i;:::-;955:39;1063:2;1048:18;;;;1035:32;;-1:-1:-1;;;797:300:6:o;1294:226::-;1353:6;1406:2;1394:9;1385:7;1381:23;1377:32;1374:52;;;1422:1;1419;1412:12;1374:52;-1:-1:-1;1467:23:6;;1294:226;-1:-1:-1;1294:226:6:o;1525:186::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;1676:29;1695:9;1676:29;:::i;1716:374::-;1793:6;1801;1809;1862:2;1850:9;1841:7;1837:23;1833:32;1830:52;;;1878:1;1875;1868:12;1830:52;1901:29;1920:9;1901:29;:::i;:::-;1891:39;;1949:38;1983:2;1972:9;1968:18;1949:38;:::i;:::-;1716:374;;1939:48;;-1:-1:-1;;;2056:2:6;2041:18;;;;2028:32;;1716:374::o;2680:346::-;2748:6;2756;2809:2;2797:9;2788:7;2784:23;2780:32;2777:52;;;2825:1;2822;2815:12;2777:52;-1:-1:-1;;2870:23:6;;;2990:2;2975:18;;;2962:32;;-1:-1:-1;2680:346:6:o;3031:260::-;3099:6;3107;3160:2;3148:9;3139:7;3135:23;3131:32;3128:52;;;3176:1;3173;3166:12;3128:52;3199:29;3218:9;3199:29;:::i;:::-;3189:39;;3247:38;3281:2;3270:9;3266:18;3247:38;:::i;:::-;3237:48;;3031:260;;;;;:::o;3296:380::-;3375:1;3371:12;;;;3418;;;3439:61;;3493:4;3485:6;3481:17;3471:27;;3439:61;3546:2;3538:6;3535:14;3515:18;3512:38;3509:161;;3592:10;3587:3;3583:20;3580:1;3573:31;3627:4;3624:1;3617:15;3655:4;3652:1;3645:15;3509:161;;3296:380;;;:::o;4029:127::-;4090:10;4085:3;4081:20;4078:1;4071:31;4121:4;4118:1;4111:15;4145:4;4142:1;4135:15;4863:127;4924:10;4919:3;4915:20;4912:1;4905:31;4955:4;4952:1;4945:15;4979:4;4976:1;4969:15;4995:128;5062:9;;;5083:11;;;5080:37;;;5097:18;;:::i;5128:125::-;5193:9;;;5214:10;;;5211:36;;;5227:18;;:::i;5613:168::-;5686:9;;;5717;;5734:15;;;5728:22;;5714:37;5704:71;;5755:18;;:::i;5786:217::-;5826:1;5852;5842:132;;5896:10;5891:3;5887:20;5884:1;5877:31;5931:4;5928:1;5921:15;5959:4;5956:1;5949:15;5842:132;-1:-1:-1;5988:9:6;;5786:217::o
Swarm Source
ipfs://3b67a4c5d3791781609f0962132791a31335783fa3781ad993b4c3e660f335ce
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MON
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.