Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
HedgeVaultForStaking
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-13 */ // Sources flattened with hardhat v2.5.0 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/libs/TransferHelper.sol // GPL-3.0-or-later pragma solidity ^0.8.6; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // File contracts/interfaces/IHedgeVaultForStaking.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev Stake xtoken, earn dcu interface IHedgeVaultForStaking { /// @dev Initialize ore drawing weight /// @param xtokens xtoken array /// @param cycles cycle array /// @param weights weight array function batchSetPoolWeight( address[] calldata xtokens, uint64[] calldata cycles, uint160[] calldata weights ) external; /// @dev Get stake channel information /// @param xtoken xtoken address /// @param cycle cycle /// @return totalStaked Total lock volume of target xtoken /// @return totalRewards 通道总出矿量 /// @return unlockBlock 解锁区块号 function getChannelInfo( address xtoken, uint64 cycle ) external view returns ( uint totalStaked, uint totalRewards, uint unlockBlock ); /// @dev Get staked amount of target address /// @param xtoken xtoken address /// @param addr Target address /// @return Staked amount of target address function balanceOf(address xtoken, uint64 cycle, address addr) external view returns (uint); /// @dev Get the number of dcu to be collected by the target address on the designated transaction pair lock /// @param xtoken xtoken address /// @param addr Target address /// @return The number of dcu to be collected by the target address on the designated transaction lock function earned(address xtoken, uint64 cycle, address addr) external view returns (uint); /// @dev Stake xtoken to earn dcu /// @param xtoken xtoken address /// @param amount Stake amount function stake(address xtoken, uint64 cycle, uint160 amount) external; /// @dev Withdraw xtoken, and claim earned dcu /// @param xtoken xtoken address function withdraw(address xtoken, uint64 cycle) external; /// @dev Claim dcu /// @param xtoken xtoken address function getReward(address xtoken, uint64 cycle) external; } // File contracts/interfaces/IHedgeMapping.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev The interface defines methods for Hedge builtin contract address mapping interface IHedgeMapping { /// @dev Set the built-in contract address of the system /// @param dcuToken Address of dcu token contract /// @param hedgeDAO IHedgeDAO implementation contract address /// @param hedgeOptions IHedgeOptions implementation contract address /// @param hedgeFutures IHedgeFutures implementation contract address /// @param hedgeVaultForStaking IHedgeVaultForStaking implementation contract address /// @param nestPriceFacade INestPriceFacade implementation contract address function setBuiltinAddress( address dcuToken, address hedgeDAO, address hedgeOptions, address hedgeFutures, address hedgeVaultForStaking, address nestPriceFacade ) external; /// @dev Get the built-in contract address of the system /// @return dcuToken Address of dcu token contract /// @return hedgeDAO IHedgeDAO implementation contract address /// @return hedgeOptions IHedgeOptions implementation contract address /// @return hedgeFutures IHedgeFutures implementation contract address /// @return hedgeVaultForStaking IHedgeVaultForStaking implementation contract address /// @return nestPriceFacade INestPriceFacade implementation contract address function getBuiltinAddress() external view returns ( address dcuToken, address hedgeDAO, address hedgeOptions, address hedgeFutures, address hedgeVaultForStaking, address nestPriceFacade ); /// @dev Get address of dcu token contract /// @return Address of dcu token contract function getDCUTokenAddress() external view returns (address); /// @dev Get IHedgeDAO implementation contract address /// @return IHedgeDAO implementation contract address function getHedgeDAOAddress() external view returns (address); /// @dev Get IHedgeOptions implementation contract address /// @return IHedgeOptions implementation contract address function getHedgeOptionsAddress() external view returns (address); /// @dev Get IHedgeFutures implementation contract address /// @return IHedgeFutures implementation contract address function getHedgeFuturesAddress() external view returns (address); /// @dev Get IHedgeVaultForStaking implementation contract address /// @return IHedgeVaultForStaking implementation contract address function getHedgeVaultForStakingAddress() external view returns (address); /// @dev Get INestPriceFacade implementation contract address /// @return INestPriceFacade implementation contract address function getNestPriceFacade() external view returns (address); /// @dev Registered address. The address registered here is the address accepted by Hedge system /// @param key The key /// @param addr Destination address. 0 means to delete the registration information function registerAddress(string calldata key, address addr) external; /// @dev Get registered address /// @param key The key /// @return Destination address. 0 means empty function checkAddress(string calldata key) external view returns (address); } // File contracts/interfaces/IHedgeGovernance.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This interface defines the governance methods interface IHedgeGovernance is IHedgeMapping { /// @dev Set governance authority /// @param addr Destination address /// @param flag Weight. 0 means to delete the governance permission of the target address. Weight is not /// implemented in the current system, only the difference between authorized and unauthorized. /// Here, a uint96 is used to represent the weight, which is only reserved for expansion function setGovernance(address addr, uint flag) external; /// @dev Get governance rights /// @param addr Destination address /// @return Weight. 0 means to delete the governance permission of the target address. Weight is not /// implemented in the current system, only the difference between authorized and unauthorized. /// Here, a uint96 is used to represent the weight, which is only reserved for expansion function getGovernance(address addr) external view returns (uint); /// @dev Check whether the target address has governance rights for the given target /// @param addr Destination address /// @param flag Permission weight. The permission of the target address must be greater than this weight /// to pass the check /// @return True indicates permission function checkGovernance(address addr, uint flag) external view returns (bool); } // File contracts/interfaces/IHedgeDAO.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This interface defines the DAO methods interface IHedgeDAO { /// @dev Application Flag Changed event /// @param addr DAO application contract address /// @param flag Authorization flag, 1 means authorization, 0 means cancel authorization event ApplicationChanged(address addr, uint flag); /// @dev Set DAO application /// @param addr DAO application contract address /// @param flag Authorization flag, 1 means authorization, 0 means cancel authorization function setApplication(address addr, uint flag) external; /// @dev Check DAO application flag /// @param addr DAO application contract address /// @return Authorization flag, 1 means authorization, 0 means cancel authorization function checkApplication(address addr) external view returns (uint); /// @dev Add reward /// @param pool Destination pool function addETHReward(address pool) external payable; /// @dev The function returns eth rewards of specified pool /// @param pool Destination pool function totalETHRewards(address pool) external view returns (uint); /// @dev Settlement /// @param pool Destination pool. Indicates which pool to pay with /// @param tokenAddress Token address of receiving funds (0 means ETH) /// @param to Address to receive /// @param value Amount to receive function settle(address pool, address tokenAddress, address to, uint value) external payable; } // File contracts/HedgeBase.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev Base contract of Hedge contract HedgeBase { /// @dev IHedgeGovernance implementation contract address address public _governance; /// @dev To support open-zeppelin/upgrades /// @param governance IHedgeGovernance implementation contract address function initialize(address governance) public virtual { require(_governance == address(0), "Hedge:!initialize"); _governance = governance; } /// @dev Rewritten in the implementation contract, for load other contract addresses. Call /// super.update(newGovernance) when overriding, and override method without onlyGovernance /// @param newGovernance IHedgeGovernance implementation contract address function update(address newGovernance) public virtual { address governance = _governance; require(governance == msg.sender || IHedgeGovernance(governance).checkGovernance(msg.sender, 0), "Hedge:!gov"); _governance = newGovernance; } /// @dev Migrate funds from current contract to HedgeDAO /// @param tokenAddress Destination token address.(0 means eth) /// @param value Migrate amount function migrate(address tokenAddress, uint value) external onlyGovernance { address to = IHedgeGovernance(_governance).getHedgeDAOAddress(); if (tokenAddress == address(0)) { IHedgeDAO(to).addETHReward { value: value } (address(0)); } else { TransferHelper.safeTransfer(tokenAddress, to, value); } } //---------modifier------------ modifier onlyGovernance() { require(IHedgeGovernance(_governance).checkGovernance(msg.sender, 0), "Hedge:!gov"); _; } modifier noContract() { require(msg.sender == tx.origin, "Hedge:!contract"); _; } } // File contracts/HedgeFrequentlyUsed.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev Base contract of Hedge contract HedgeFrequentlyUsed is HedgeBase { // Address of DCU contract address constant DCU_TOKEN_ADDRESS = 0xf56c6eCE0C0d6Fbb9A53282C0DF71dBFaFA933eF; // Address of NestPriceFacade contract address constant NEST_PRICE_FACADE_ADDRESS = 0xB5D2890c061c321A5B6A4a4254bb1522425BAF0A; // USDT代币地址 address constant USDT_TOKEN_ADDRESS = 0xdAC17F958D2ee523a2206206994597C13D831ec7; // USDT代币的基数 uint constant USDT_BASE = 1000000; } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // MIT pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/utils/[email protected] // MIT 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; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // MIT pragma solidity ^0.8.0; /** * @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 guidelines: functions revert instead * of 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}. * * 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. */ 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 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 {} } // File contracts/DCU.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev DCU代币 contract DCU is HedgeBase, ERC20("Decentralized Currency Unit", "DCU") { // 保存挖矿权限地址 mapping(address=>uint) _minters; constructor() { } modifier onlyMinter { require(_minters[msg.sender] == 1, "DCU:not minter"); _; } /// @dev 设置挖矿权限 /// @param account 目标账号 /// @param flag 挖矿权限标记,只有1表示可以挖矿 function setMinter(address account, uint flag) external onlyGovernance { _minters[account] = flag; } /// @dev 检查挖矿权限 /// @param account 目标账号 /// @return flag 挖矿权限标记,只有1表示可以挖矿 function checkMinter(address account) external view returns (uint) { return _minters[account]; } /// @dev 铸币 /// @param to 接受地址 /// @param value 铸币数量 function mint(address to, uint value) external onlyMinter { _mint(to, value); } /// @dev 销毁 /// @param from 目标地址 /// @param value 销毁数量 function burn(address from, uint value) external onlyMinter { _burn(from, value); } } // File contracts/HedgeVaultForStaking.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev Stake xtoken, earn dcu contract HedgeVaultForStaking is HedgeFrequentlyUsed, IHedgeVaultForStaking { /* ******************************************************************* 定义三个操作:锁仓,领取dcu,取回 ----------------[1]-----[2]---------------[3]-------------------> a. 一共三个时间节点:1, 2, 3。 对于所有质押通道:1和2时间节点都是一样的,不同的质押通道3是不一样的。 质押周期表示2~3之间的时间 时间折算成区块估算 b. 1节点之前啥都不能操作 c. 1节点到2节点期间可以质押 d. 2节点以后可以执行领取操作 e. 3节点以后可以执行取回操作 ******************************************************************* */ /// @dev Account information struct Account { // Staked of current account uint160 balance; // Token dividend value mark of the unit that the account has received uint96 rewardCursor; } /// @dev Stake channel information struct StakeChannel{ // Total staked amount uint192 totalStaked; // 解锁区块号 uint64 unlockBlock; // Mining amount weight uint160 weight; // The dividend mark that the settled company token can receive uint96 rewardPerToken; // Accounts // address=>balance mapping(address=>Account) accounts; } uint constant UI128 = 0x100000000000000000000000000000000; // dcu出矿单位 uint128 _dcuUnit; // staking开始区块号 uint64 _startBlock; // staking截止区块号 uint64 _stopBlock; // staking通道信息xtoken=>StakeChannel mapping(uint=>StakeChannel) _channels; /// @dev Create HedgeVaultForStaking constructor () { } /// @dev Modify configuration /// @param dcuUnit dcu出矿单位 /// @param startBlock staking开始区块号 /// @param stopBlock staking截止区块号 function setConfig(uint128 dcuUnit, uint64 startBlock, uint64 stopBlock) external onlyGovernance { _dcuUnit = dcuUnit; _startBlock = startBlock; _stopBlock = stopBlock; } /// @dev Get configuration /// @return dcuUnit dcu出矿单位 /// @return startBlock staking开始区块号 /// @return stopBlock staking截止区块号 function getConfig() external view returns (uint dcuUnit, uint startBlock, uint stopBlock) { return (uint(_dcuUnit), uint(_startBlock), uint(_stopBlock)); } /// @dev Initialize ore drawing weight /// @param xtokens xtoken array /// @param cycles cycle array /// @param weights weight array function batchSetPoolWeight( address[] calldata xtokens, uint64[] calldata cycles, uint160[] calldata weights ) external override onlyGovernance { uint64 stopBlock = _stopBlock; uint cnt = xtokens.length; require(cnt == weights.length && cnt == cycles.length, "FVFS:mismatch len"); for (uint i = 0; i < cnt; ++i) { address xtoken = xtokens[i]; //require(xtoken != address(0), "FVFS:invalid xtoken"); StakeChannel storage channel = _channels[_getKey(xtoken, cycles[i])]; _updateReward(channel); channel.weight = weights[i]; channel.unlockBlock = stopBlock + cycles[i]; } } /// @dev Get stake channel information /// @param xtoken xtoken address /// @param cycle cycle /// @return totalStaked Total lock volume of target xtoken /// @return totalRewards 通道总出矿量 /// @return unlockBlock 解锁区块号 function getChannelInfo( address xtoken, uint64 cycle ) external view override returns ( uint totalStaked, uint totalRewards, uint unlockBlock ) { StakeChannel storage channel = _channels[_getKey(xtoken, cycle)]; return ( uint(channel.totalStaked), uint(channel.weight) * uint(_dcuUnit), uint(channel.unlockBlock) ); } /// @dev Get staked amount of target address /// @param xtoken xtoken address /// @param cycle cycle /// @param addr Target address /// @return Staked amount of target address function balanceOf(address xtoken, uint64 cycle, address addr) external view override returns (uint) { return uint(_channels[_getKey(xtoken, cycle)].accounts[addr].balance); } /// @dev Get the number of DCU to be collected by the target address on the designated transaction pair lock /// @param xtoken xtoken address (or CNode address) /// @param cycle cycle /// @param addr Target address /// @return The number of DCU to be collected by the target address on the designated transaction lock function earned(address xtoken, uint64 cycle, address addr) external view override returns (uint) { // Load staking channel StakeChannel storage channel = _channels[_getKey(xtoken, cycle)]; // Call _calcReward() to calculate new reward uint newReward = _calcReward(channel); // Load account Account memory account = channel.accounts[addr]; uint balance = uint(account.balance); // Load total amount of staked uint totalStaked = uint(channel.totalStaked); // Unit token dividend uint rewardPerToken = _decodeFloat(channel.rewardPerToken); if (totalStaked > 0) { rewardPerToken += newReward * UI128 / totalStaked; } return (rewardPerToken - _decodeFloat(account.rewardCursor)) * balance / UI128; } /// @dev Stake xtoken to earn DCU /// @param xtoken xtoken address (or CNode address) /// @param cycle cycle /// @param amount Stake amount function stake(address xtoken, uint64 cycle, uint160 amount) external override { require(block.number >= uint(_startBlock) && block.number <= uint(_stopBlock), "FVFS:!block"); // Load stake channel StakeChannel storage channel = _channels[_getKey(xtoken, cycle)]; require(uint(channel.weight) > 0, "FVFS:no reward"); // Transfer xtoken from msg.sender to this TransferHelper.safeTransferFrom(xtoken, msg.sender, address(this), uint(amount)); // Settle reward for account Account memory account = _getReward(channel, msg.sender); // Update totalStaked channel.totalStaked += uint192(amount); // Update stake balance of account account.balance += amount; channel.accounts[msg.sender] = account; } /// @dev Withdraw xtoken, and claim earned DCU /// @param xtoken xtoken address (or CNode address) /// @param cycle cycle function withdraw(address xtoken, uint64 cycle) external override { // Load stake channel StakeChannel storage channel = _channels[_getKey(xtoken, cycle)]; require(block.number >= uint(channel.unlockBlock), "FVFS:!block"); // Settle reward for account Account memory account = _getReward(channel, msg.sender); uint amount = uint(account.balance); // Update totalStaked channel.totalStaked -= uint192(amount); // Update stake balance of account account.balance = uint160(0); channel.accounts[msg.sender] = account; // Transfer xtoken to msg.sender TransferHelper.safeTransfer(xtoken, msg.sender, amount); } /// @dev Claim DCU /// @param xtoken xtoken address (or CNode address) /// @param cycle cycle function getReward(address xtoken, uint64 cycle) external override { StakeChannel storage channel = _channels[_getKey(xtoken, cycle)]; channel.accounts[msg.sender] = _getReward(channel, msg.sender); } // Calculate reward, and settle the target account function _getReward( StakeChannel storage channel, address to ) private returns (Account memory account) { // Load account account = channel.accounts[to]; // Update the global dividend information and get the new unit token dividend amount uint rewardPerToken = _updateReward(channel); // Calculate reward for account uint balance = uint(account.balance); uint reward = (rewardPerToken - _decodeFloat(account.rewardCursor)) * balance / UI128; // Update sign of account account.rewardCursor = _encodeFloat(rewardPerToken); //channel.accounts[to] = account; // Transfer DCU to account if (reward > 0) { DCU(DCU_TOKEN_ADDRESS).mint(to, reward); } } // Update the global dividend information and return the new unit token dividend amount function _updateReward(StakeChannel storage channel) private returns (uint rewardPerToken) { // Call _calcReward() to calculate new reward uint newReward = _calcReward(channel); // Load total amount of staked uint totalStaked = uint(channel.totalStaked); rewardPerToken = _decodeFloat(channel.rewardPerToken); if (totalStaked > 0) { rewardPerToken += newReward * UI128 / totalStaked; } // Update the dividend value of unit share channel.rewardPerToken = _encodeFloat(rewardPerToken); if (newReward > 0) { channel.weight = uint160(0); } } // Calculate new reward function _calcReward(StakeChannel storage channel) private view returns (uint newReward) { if (block.number > uint(_stopBlock)) { newReward = uint(channel.weight) * uint(_dcuUnit); } else { newReward = 0; } } /// @dev Encode the uint value as a floating-point representation in the form of fraction * 16 ^ exponent /// @param value Destination uint value /// @return float format function _encodeFloat(uint value) private pure returns (uint96) { uint exponent = 0; while (value > 0x3FFFFFFFFFFFFFFFFFFFFFF) { value >>= 4; ++exponent; } return uint96((value << 6) | exponent); } /// @dev Decode the floating-point representation of fraction * 16 ^ exponent to uint /// @param floatValue fraction value /// @return decode format function _decodeFloat(uint96 floatValue) private pure returns (uint) { return (uint(floatValue) >> 6) << ((uint(floatValue) & 0x3F) << 2); } function _getKey(address xtoken, uint64 cycle) private pure returns (uint){ return (uint(uint160(xtoken)) << 96) | uint(cycle); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"_governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"xtoken","type":"address"},{"internalType":"uint64","name":"cycle","type":"uint64"},{"internalType":"address","name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"xtokens","type":"address[]"},{"internalType":"uint64[]","name":"cycles","type":"uint64[]"},{"internalType":"uint160[]","name":"weights","type":"uint160[]"}],"name":"batchSetPoolWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"xtoken","type":"address"},{"internalType":"uint64","name":"cycle","type":"uint64"},{"internalType":"address","name":"addr","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"xtoken","type":"address"},{"internalType":"uint64","name":"cycle","type":"uint64"}],"name":"getChannelInfo","outputs":[{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"},{"internalType":"uint256","name":"unlockBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConfig","outputs":[{"internalType":"uint256","name":"dcuUnit","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"stopBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"xtoken","type":"address"},{"internalType":"uint64","name":"cycle","type":"uint64"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governance","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"dcuUnit","type":"uint128"},{"internalType":"uint64","name":"startBlock","type":"uint64"},{"internalType":"uint64","name":"stopBlock","type":"uint64"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"xtoken","type":"address"},{"internalType":"uint64","name":"cycle","type":"uint64"},{"internalType":"uint160","name":"amount","type":"uint160"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernance","type":"address"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"xtoken","type":"address"},{"internalType":"uint64","name":"cycle","type":"uint64"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612006806100206000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c8063acfbd20e1161008c578063c4d66de811610066578063c4d66de8146102a3578063c65a4eed146102b6578063d6dad060146102c9578063e591890a146102dc57600080fd5b8063acfbd20e146101b8578063ad68ebf714610236578063c3f909d41461024957600080fd5b806360d26e79116100bd57806360d26e7914610171578063a54d038514610184578063ac0bffc0146101a557600080fd5b80631c1b8772146100e45780631c2f3e3d146100f95780633cbd708614610143575b600080fd5b6100f76100f2366004611b10565b6102ef565b005b6000546101199073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610156610151366004611b4c565b610468565b6040805193845260208401929092529082015260600161013a565b6100f761017f366004611b81565b61053d565b610197610192366004611bdb565b6106ea565b60405190815260200161013a565b6100f76101b3366004611bdb565b610884565b6101976101c6366004611bdb565b67ffffffffffffffff9190911660609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909117600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff958616855290920190529020541690565b6100f7610244366004611c24565b610b3b565b6101566001546fffffffffffffffffffffffffffffffff81169167ffffffffffffffff7001000000000000000000000000000000008304811692780100000000000000000000000000000000000000000000000090041690565b6100f76102b1366004611b10565b610d9e565b6100f76102c4366004611b4c565b610e65565b6100f76102d7366004611b4c565b610f11565b6100f76102ea366004611c9c565b6110dd565b60005473ffffffffffffffffffffffffffffffffffffffff16338114806103b557506040517f91e1472b0000000000000000000000000000000000000000000000000000000081523360048201526000602482015273ffffffffffffffffffffffffffffffffffffffff8216906391e1472b9060440160206040518083038186803b15801561037d57600080fd5b505afa158015610391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b59190611d36565b610420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f48656467653a21676f760000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b50600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b67ffffffffffffffff8116606083901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000161760009081526002602052604081208054600180549083015484938493909277ffffffffffffffffffffffffffffffffffffffffffffffff90911691610508916fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff16611d87565b915490979196507801000000000000000000000000000000000000000000000000900467ffffffffffffffff16945092505050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b9060440160206040518083038186803b1580156105ad57600080fd5b505afa1580156105c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e59190611d36565b61064b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f48656467653a21676f76000000000000000000000000000000000000000000006044820152606401610417565b600180546fffffffffffffffffffffffffffffffff949094167fffffffffffffffff0000000000000000000000000000000000000000000000009094169390931770010000000000000000000000000000000067ffffffffffffffff938416021777ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000009190921602179055565b67ffffffffffffffff8216606084901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000161760009081526002602052604081208161073582611444565b73ffffffffffffffffffffffffffffffffffffffff858116600090815260028581016020908152604080842081518083019092525494851680825274010000000000000000000000000000000000000000958690046bffffffffffffffffffffffff1692820192909252875460018901549697509095919477ffffffffffffffffffffffffffffffffffffffffffffffff90911693929104600681901c6b03ffffffffffffffffffffff16911b60fc161b90508115610821578161080a70010000000000000000000000000000000087611d87565b6108149190611dc4565b61081e9082611dff565b90505b6020840151700100000000000000000000000000000000908490600681901c6b03ffffffffffffffffffffff1660029190911b60fc161b6108629084611e17565b61086c9190611d87565b6108769190611dc4565b9a9950505050505050505050565b600154700100000000000000000000000000000000900467ffffffffffffffff1643108015906108dc57506001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff164311155b610942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f465646533a21626c6f636b0000000000000000000000000000000000000000006044820152606401610417565b67ffffffffffffffff8216606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016176000908152600260205260409020600181015473ffffffffffffffffffffffffffffffffffffffff16610a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f465646533a6e6f207265776172640000000000000000000000000000000000006044820152606401610417565b610a268433308573ffffffffffffffffffffffffffffffffffffffff166114c0565b6000610a32823361165e565b825490915073ffffffffffffffffffffffffffffffffffffffff8416908390600090610a7990849077ffffffffffffffffffffffffffffffffffffffffffffffff16611e2e565b92506101000a81548177ffffffffffffffffffffffffffffffffffffffffffffffff021916908377ffffffffffffffffffffffffffffffffffffffffffffffff1602179055508281600001818151610ad19190611e6a565b73ffffffffffffffffffffffffffffffffffffffff908116909152336000908152600290940160209081526040909420835194909301516bffffffffffffffffffffffff167401000000000000000000000000000000000000000002931692909217905550505050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b9060440160206040518083038186803b158015610bab57600080fd5b505afa158015610bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be39190611d36565b610c49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f48656467653a21676f76000000000000000000000000000000000000000000006044820152606401610417565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b3246a956040518163ffffffff1660e01b815260040160206040518083038186803b158015610cb257600080fd5b505afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190611e99565b905073ffffffffffffffffffffffffffffffffffffffff8316610d8e576040517fdaa78c0f0000000000000000000000000000000000000000000000000000000081526000600482015273ffffffffffffffffffffffffffffffffffffffff82169063daa78c0f9084906024016000604051808303818588803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b5050505050505050565b610d99838284611817565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1615610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f48656467653a21696e697469616c697a650000000000000000000000000000006044820152606401610417565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b67ffffffffffffffff8116606083901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016176000908152600260205260409020610eb0813361165e565b336000908152600290920160209081526040909220815191909201516bffffffffffffffffffffffff16740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff919091161790555050565b67ffffffffffffffff818116606084901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001617600090815260026020526040902080549091780100000000000000000000000000000000000000000000000090910416431015610fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f465646533a21626c6f636b0000000000000000000000000000000000000000006044820152606401610417565b6000610fea823361165e565b8051835491925073ffffffffffffffffffffffffffffffffffffffff16908190849060009061103490849077ffffffffffffffffffffffffffffffffffffffffffffffff16611eb6565b825477ffffffffffffffffffffffffffffffffffffffffffffffff9182166101009390930a92830291909202199091161790555060008083523380825260028501602090815260409092208451928501516bffffffffffffffffffffffff16740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff93909316929092179091556110d690869083611817565b5050505050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b9060440160206040518083038186803b15801561114d57600080fd5b505afa158015611161573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111859190611d36565b6111eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f48656467653a21676f76000000000000000000000000000000000000000000006044820152606401610417565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1685828114801561122357508085145b611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f465646533a6d69736d61746368206c656e0000000000000000000000000000006044820152606401610417565b60005b818110156114395760008989838181106112a8576112a8611eef565b90506020020160208101906112bd9190611b10565b9050600060026000611326848c8c888181106112db576112db611eef565b90506020020160208101906112f09190611f1e565b67ffffffffffffffff1660609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000161790565b8152602001908152602001600020905061133f81611980565b5086868481811061135257611352611eef565b90506020020160208101906113679190611b10565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790558888848181106113c0576113c0611eef565b90506020020160208101906113d59190611f1e565b6113df9086611f39565b815467ffffffffffffffff9190911678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff9091161790555061143281611f5c565b905061128c565b505050505050505050565b6001546000907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164311156114b75760018054908301546114b1916fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff16611d87565b92915050565b5060005b919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161155f9190611f95565b6000604051808303816000865af19150503d806000811461159c576040519150601f19603f3d011682016040523d82523d6000602084013e6115a1565b606091505b50915091508180156115cb5750805115806115cb5750808060200190518101906115cb9190611d36565b611656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c4544000000000000000000000000000000000000000000000000000000006064820152608401610417565b505050505050565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff848116825260028601835283822084518086019095525490811684527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16918301919091526116db84611980565b8251602084015191925073ffffffffffffffffffffffffffffffffffffffff1690600090700100000000000000000000000000000000908390600681901c6b03ffffffffffffffffffffff1660029190911b60fc161b61173b9086611e17565b6117459190611d87565b61174f9190611dc4565b905061175a83611aae565b6bffffffffffffffffffffffff166020850152801561180e576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024810182905273f56c6ece0c0d6fbb9a53282c0df71dbfafa933ef906340c10f1990604401600060405180830381600087803b1580156117f557600080fd5b505af1158015611809573d6000803e3d6000fd5b505050505b50505092915050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916118ae9190611f95565b6000604051808303816000865af19150503d80600081146118eb576040519150601f19603f3d011682016040523d82523d6000602084013e6118f0565b606091505b509150915081801561191a57508051158061191a57508080602001905181019061191a9190611d36565b6110d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610417565b60008061198c83611444565b8354600185015491925077ffffffffffffffffffffffffffffffffffffffffffffffff1690740100000000000000000000000000000000000000009004600681901c6b03ffffffffffffffffffffff1660029190911b60fc161b92508015611a215780611a0a70010000000000000000000000000000000084611d87565b611a149190611dc4565b611a1e9084611dff565b92505b611a2a83611aae565b6001850180546bffffffffffffffffffffffff92909216740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff9092169190911790558115611aa7576001840180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b5050919050565b6000805b6b03ffffffffffffffffffffff831115611add5760049290921c91611ad681611f5c565b9050611ab2565b60069290921b909117919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b0d57600080fd5b50565b600060208284031215611b2257600080fd5b8135611b2d81611aeb565b9392505050565b803567ffffffffffffffff811681146114bb57600080fd5b60008060408385031215611b5f57600080fd5b8235611b6a81611aeb565b9150611b7860208401611b34565b90509250929050565b600080600060608486031215611b9657600080fd5b83356fffffffffffffffffffffffffffffffff81168114611bb657600080fd5b9250611bc460208501611b34565b9150611bd260408501611b34565b90509250925092565b600080600060608486031215611bf057600080fd5b8335611bfb81611aeb565b9250611c0960208501611b34565b91506040840135611c1981611aeb565b809150509250925092565b60008060408385031215611c3757600080fd5b8235611c4281611aeb565b946020939093013593505050565b60008083601f840112611c6257600080fd5b50813567ffffffffffffffff811115611c7a57600080fd5b6020830191508360208260051b8501011115611c9557600080fd5b9250929050565b60008060008060008060608789031215611cb557600080fd5b863567ffffffffffffffff80821115611ccd57600080fd5b611cd98a838b01611c50565b90985096506020890135915080821115611cf257600080fd5b611cfe8a838b01611c50565b90965094506040890135915080821115611d1757600080fd5b50611d2489828a01611c50565b979a9699509497509295939492505050565b600060208284031215611d4857600080fd5b81518015158114611b2d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611dbf57611dbf611d58565b500290565b600082611dfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115611e1257611e12611d58565b500190565b600082821015611e2957611e29611d58565b500390565b600077ffffffffffffffffffffffffffffffffffffffffffffffff808316818516808303821115611e6157611e61611d58565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115611e6157611e61611d58565b600060208284031215611eab57600080fd5b8151611b2d81611aeb565b600077ffffffffffffffffffffffffffffffffffffffffffffffff83811690831681811015611ee757611ee7611d58565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611f3057600080fd5b611b2d82611b34565b600067ffffffffffffffff808316818516808303821115611e6157611e61611d58565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611f8e57611f8e611d58565b5060010190565b6000825160005b81811015611fb65760208186018101518583015201611f9c565b81811115611fc5576000828501525b50919091019291505056fea2646970667358221220487b16dad42ec5eec622244632fd08e25c65424244ad44ce0d9039f47a24333f64736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100df5760003560e01c8063acfbd20e1161008c578063c4d66de811610066578063c4d66de8146102a3578063c65a4eed146102b6578063d6dad060146102c9578063e591890a146102dc57600080fd5b8063acfbd20e146101b8578063ad68ebf714610236578063c3f909d41461024957600080fd5b806360d26e79116100bd57806360d26e7914610171578063a54d038514610184578063ac0bffc0146101a557600080fd5b80631c1b8772146100e45780631c2f3e3d146100f95780633cbd708614610143575b600080fd5b6100f76100f2366004611b10565b6102ef565b005b6000546101199073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610156610151366004611b4c565b610468565b6040805193845260208401929092529082015260600161013a565b6100f761017f366004611b81565b61053d565b610197610192366004611bdb565b6106ea565b60405190815260200161013a565b6100f76101b3366004611bdb565b610884565b6101976101c6366004611bdb565b67ffffffffffffffff9190911660609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909117600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff958616855290920190529020541690565b6100f7610244366004611c24565b610b3b565b6101566001546fffffffffffffffffffffffffffffffff81169167ffffffffffffffff7001000000000000000000000000000000008304811692780100000000000000000000000000000000000000000000000090041690565b6100f76102b1366004611b10565b610d9e565b6100f76102c4366004611b4c565b610e65565b6100f76102d7366004611b4c565b610f11565b6100f76102ea366004611c9c565b6110dd565b60005473ffffffffffffffffffffffffffffffffffffffff16338114806103b557506040517f91e1472b0000000000000000000000000000000000000000000000000000000081523360048201526000602482015273ffffffffffffffffffffffffffffffffffffffff8216906391e1472b9060440160206040518083038186803b15801561037d57600080fd5b505afa158015610391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b59190611d36565b610420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f48656467653a21676f760000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b50600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b67ffffffffffffffff8116606083901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000161760009081526002602052604081208054600180549083015484938493909277ffffffffffffffffffffffffffffffffffffffffffffffff90911691610508916fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff16611d87565b915490979196507801000000000000000000000000000000000000000000000000900467ffffffffffffffff16945092505050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b9060440160206040518083038186803b1580156105ad57600080fd5b505afa1580156105c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e59190611d36565b61064b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f48656467653a21676f76000000000000000000000000000000000000000000006044820152606401610417565b600180546fffffffffffffffffffffffffffffffff949094167fffffffffffffffff0000000000000000000000000000000000000000000000009094169390931770010000000000000000000000000000000067ffffffffffffffff938416021777ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000009190921602179055565b67ffffffffffffffff8216606084901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000161760009081526002602052604081208161073582611444565b73ffffffffffffffffffffffffffffffffffffffff858116600090815260028581016020908152604080842081518083019092525494851680825274010000000000000000000000000000000000000000958690046bffffffffffffffffffffffff1692820192909252875460018901549697509095919477ffffffffffffffffffffffffffffffffffffffffffffffff90911693929104600681901c6b03ffffffffffffffffffffff16911b60fc161b90508115610821578161080a70010000000000000000000000000000000087611d87565b6108149190611dc4565b61081e9082611dff565b90505b6020840151700100000000000000000000000000000000908490600681901c6b03ffffffffffffffffffffff1660029190911b60fc161b6108629084611e17565b61086c9190611d87565b6108769190611dc4565b9a9950505050505050505050565b600154700100000000000000000000000000000000900467ffffffffffffffff1643108015906108dc57506001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff164311155b610942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f465646533a21626c6f636b0000000000000000000000000000000000000000006044820152606401610417565b67ffffffffffffffff8216606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016176000908152600260205260409020600181015473ffffffffffffffffffffffffffffffffffffffff16610a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f465646533a6e6f207265776172640000000000000000000000000000000000006044820152606401610417565b610a268433308573ffffffffffffffffffffffffffffffffffffffff166114c0565b6000610a32823361165e565b825490915073ffffffffffffffffffffffffffffffffffffffff8416908390600090610a7990849077ffffffffffffffffffffffffffffffffffffffffffffffff16611e2e565b92506101000a81548177ffffffffffffffffffffffffffffffffffffffffffffffff021916908377ffffffffffffffffffffffffffffffffffffffffffffffff1602179055508281600001818151610ad19190611e6a565b73ffffffffffffffffffffffffffffffffffffffff908116909152336000908152600290940160209081526040909420835194909301516bffffffffffffffffffffffff167401000000000000000000000000000000000000000002931692909217905550505050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b9060440160206040518083038186803b158015610bab57600080fd5b505afa158015610bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be39190611d36565b610c49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f48656467653a21676f76000000000000000000000000000000000000000000006044820152606401610417565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b3246a956040518163ffffffff1660e01b815260040160206040518083038186803b158015610cb257600080fd5b505afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190611e99565b905073ffffffffffffffffffffffffffffffffffffffff8316610d8e576040517fdaa78c0f0000000000000000000000000000000000000000000000000000000081526000600482015273ffffffffffffffffffffffffffffffffffffffff82169063daa78c0f9084906024016000604051808303818588803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b5050505050505050565b610d99838284611817565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1615610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f48656467653a21696e697469616c697a650000000000000000000000000000006044820152606401610417565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b67ffffffffffffffff8116606083901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016176000908152600260205260409020610eb0813361165e565b336000908152600290920160209081526040909220815191909201516bffffffffffffffffffffffff16740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff919091161790555050565b67ffffffffffffffff818116606084901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001617600090815260026020526040902080549091780100000000000000000000000000000000000000000000000090910416431015610fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f465646533a21626c6f636b0000000000000000000000000000000000000000006044820152606401610417565b6000610fea823361165e565b8051835491925073ffffffffffffffffffffffffffffffffffffffff16908190849060009061103490849077ffffffffffffffffffffffffffffffffffffffffffffffff16611eb6565b825477ffffffffffffffffffffffffffffffffffffffffffffffff9182166101009390930a92830291909202199091161790555060008083523380825260028501602090815260409092208451928501516bffffffffffffffffffffffff16740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff93909316929092179091556110d690869083611817565b5050505050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b9060440160206040518083038186803b15801561114d57600080fd5b505afa158015611161573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111859190611d36565b6111eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f48656467653a21676f76000000000000000000000000000000000000000000006044820152606401610417565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1685828114801561122357508085145b611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f465646533a6d69736d61746368206c656e0000000000000000000000000000006044820152606401610417565b60005b818110156114395760008989838181106112a8576112a8611eef565b90506020020160208101906112bd9190611b10565b9050600060026000611326848c8c888181106112db576112db611eef565b90506020020160208101906112f09190611f1e565b67ffffffffffffffff1660609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000161790565b8152602001908152602001600020905061133f81611980565b5086868481811061135257611352611eef565b90506020020160208101906113679190611b10565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790558888848181106113c0576113c0611eef565b90506020020160208101906113d59190611f1e565b6113df9086611f39565b815467ffffffffffffffff9190911678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff9091161790555061143281611f5c565b905061128c565b505050505050505050565b6001546000907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164311156114b75760018054908301546114b1916fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff16611d87565b92915050565b5060005b919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161155f9190611f95565b6000604051808303816000865af19150503d806000811461159c576040519150601f19603f3d011682016040523d82523d6000602084013e6115a1565b606091505b50915091508180156115cb5750805115806115cb5750808060200190518101906115cb9190611d36565b611656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c4544000000000000000000000000000000000000000000000000000000006064820152608401610417565b505050505050565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff848116825260028601835283822084518086019095525490811684527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16918301919091526116db84611980565b8251602084015191925073ffffffffffffffffffffffffffffffffffffffff1690600090700100000000000000000000000000000000908390600681901c6b03ffffffffffffffffffffff1660029190911b60fc161b61173b9086611e17565b6117459190611d87565b61174f9190611dc4565b905061175a83611aae565b6bffffffffffffffffffffffff166020850152801561180e576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024810182905273f56c6ece0c0d6fbb9a53282c0df71dbfafa933ef906340c10f1990604401600060405180830381600087803b1580156117f557600080fd5b505af1158015611809573d6000803e3d6000fd5b505050505b50505092915050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916118ae9190611f95565b6000604051808303816000865af19150503d80600081146118eb576040519150601f19603f3d011682016040523d82523d6000602084013e6118f0565b606091505b509150915081801561191a57508051158061191a57508080602001905181019061191a9190611d36565b6110d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610417565b60008061198c83611444565b8354600185015491925077ffffffffffffffffffffffffffffffffffffffffffffffff1690740100000000000000000000000000000000000000009004600681901c6b03ffffffffffffffffffffff1660029190911b60fc161b92508015611a215780611a0a70010000000000000000000000000000000084611d87565b611a149190611dc4565b611a1e9084611dff565b92505b611a2a83611aae565b6001850180546bffffffffffffffffffffffff92909216740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff9092169190911790558115611aa7576001840180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b5050919050565b6000805b6b03ffffffffffffffffffffff831115611add5760049290921c91611ad681611f5c565b9050611ab2565b60069290921b909117919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b0d57600080fd5b50565b600060208284031215611b2257600080fd5b8135611b2d81611aeb565b9392505050565b803567ffffffffffffffff811681146114bb57600080fd5b60008060408385031215611b5f57600080fd5b8235611b6a81611aeb565b9150611b7860208401611b34565b90509250929050565b600080600060608486031215611b9657600080fd5b83356fffffffffffffffffffffffffffffffff81168114611bb657600080fd5b9250611bc460208501611b34565b9150611bd260408501611b34565b90509250925092565b600080600060608486031215611bf057600080fd5b8335611bfb81611aeb565b9250611c0960208501611b34565b91506040840135611c1981611aeb565b809150509250925092565b60008060408385031215611c3757600080fd5b8235611c4281611aeb565b946020939093013593505050565b60008083601f840112611c6257600080fd5b50813567ffffffffffffffff811115611c7a57600080fd5b6020830191508360208260051b8501011115611c9557600080fd5b9250929050565b60008060008060008060608789031215611cb557600080fd5b863567ffffffffffffffff80821115611ccd57600080fd5b611cd98a838b01611c50565b90985096506020890135915080821115611cf257600080fd5b611cfe8a838b01611c50565b90965094506040890135915080821115611d1757600080fd5b50611d2489828a01611c50565b979a9699509497509295939492505050565b600060208284031215611d4857600080fd5b81518015158114611b2d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611dbf57611dbf611d58565b500290565b600082611dfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115611e1257611e12611d58565b500190565b600082821015611e2957611e29611d58565b500390565b600077ffffffffffffffffffffffffffffffffffffffffffffffff808316818516808303821115611e6157611e61611d58565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115611e6157611e61611d58565b600060208284031215611eab57600080fd5b8151611b2d81611aeb565b600077ffffffffffffffffffffffffffffffffffffffffffffffff83811690831681811015611ee757611ee7611d58565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611f3057600080fd5b611b2d82611b34565b600067ffffffffffffffff808316818516808303821115611e6157611e61611d58565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611f8e57611f8e611d58565b5060010190565b6000825160005b81811015611fb65760208186018101518583015201611f9c565b81811115611fc5576000828501525b50919091019291505056fea2646970667358221220487b16dad42ec5eec622244632fd08e25c65424244ad44ce0d9039f47a24333f64736f6c63430008090033
Deployed Bytecode Sourcemap
30709:11045:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13988:266;;;;;;:::i;:::-;;:::i;:::-;;13379:26;;;;;;;;;;;;601:42:1;589:55;;;571:74;;559:2;544:18;13379:26:0;;;;;;;;34549:449;;;;;;:::i;:::-;;:::i;:::-;;;;1358:25:1;;;1414:2;1399:18;;1392:34;;;;1442:18;;;1435:34;1346:2;1331:18;34549:449:0;1156:319:1;32821:202:0;;;;;;:::i;:::-;;:::i;35747:861::-;;;;;;:::i;:::-;;:::i;:::-;;;2541:25:1;;;2529:2;2514:18;35747:861:0;2395:177:1;36776:842:0;;;;;;:::i;:::-;;:::i;35207:189::-;;;;;;:::i;:::-;41732:11;;;;;41726:2;41701:27;;;;;;41700:43;;;;35302:4;35331:33;;;:9;:33;;;;;;;;:48;;;;;;:42;;;:48;;;;:56;;;35207:189;14430:369;;;;;;:::i;:::-;;:::i;33205:170::-;;33320:8;;;;;;33336:11;;;;;;;33355:10;;;;;33205:170;13538:164;;;;;;:::i;:::-;;:::i;38613:223::-;;;;;;:::i;:::-;;:::i;37763:733::-;;;;;;:::i;:::-;;:::i;33536:737::-;;;;;;:::i;:::-;;:::i;13988:266::-;14055:18;14076:11;;;14120:10;14106:24;;;:87;;-1:-1:-1;14134:59:0;;;;;14179:10;14134:59;;;5008:74:1;14191:1:0;5098:18:1;;;5091:34;14134:44:0;;;;;;4981:18:1;;14134:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14098:110;;;;;;;5620:2:1;14098:110:0;;;5602:21:1;5659:2;5639:18;;;5632:30;5698:12;5678:18;;;5671:40;5728:18;;14098:110:0;;;;;;;;;-1:-1:-1;14219:11:0;:27;;;;;;;;;;;;;;;13988:266::o;34549:449::-;41732:11;;;41726:2;41701:27;;;;;41700:43;34671:16;34793:33;;;:9;:33;;;;;34864:19;;;34928:8;;34905:14;;;;34671:16;;;;34793:33;;34864:19;;;;;34900:37;;34928:8;;;34905:14;;34900:37;:::i;:::-;34958:19;;34837:153;;34958:19;;-1:-1:-1;34958:19:0;;;;;;-1:-1:-1;34549:449:0;-1:-1:-1;;;34549:449:0:o;32821:202::-;14908:11;;;14891:60;;;;;14937:10;14891:60;;;5008:74:1;5098:18;;;5091:34;;;;14908:11:0;;;14891:45;;4981:18:1;;14891:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14883:83;;;;;;;5620:2:1;14883:83:0;;;5602:21:1;5659:2;5639:18;;;5632:30;5698:12;5678:18;;;5671:40;5728:18;;14883:83:0;5418:334:1;14883:83:0;32929:8:::1;:18:::0;;::::1;::::0;;;::::1;32958:24:::0;;;;;;;;;::::1;::::0;;::::1;;;32993:22:::0;::::1;::::0;;;;::::1;;;::::0;;32821:202::o;35747:861::-;41732:11;;;41726:2;41701:27;;;;;41700:43;35839:4;35920:33;;;:9;:33;;;;;35839:4;36036:20;35920:33;36036:11;:20::i;:::-;36127:22;;;;36102;36127;;;:16;;;;:22;;;;;;;;36102:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36271:19;;36102:47;36371:22;;;36019:37;;-1:-1:-1;36102:47:0;;;;36271:19;;;;;36102:22;36371;;41554:1;41534:21;;;;;41561:30;;;;41533:59;36336:58;-1:-1:-1;36409:15:0;;36405:97;;36479:11;36459:17;32272:35;36459:9;:17;:::i;:::-;:31;;;;:::i;:::-;36441:49;;;;:::i;:::-;;;36405:97;36560:20;;;;32272:35;;36585:7;;41554:1;41534:21;;;;;41590:1;41561:30;;;;;;41533:59;36530:51;;:14;:51;:::i;:::-;36529:63;;;;:::i;:::-;:71;;;;:::i;:::-;36522:78;35747:861;-1:-1:-1;;;;;;;;;;35747:861:0:o;36776:842::-;36897:11;;;;;;;36876:12;:33;;;;:69;;-1:-1:-1;36934:10:0;;;;;;;36913:12;:32;;36876:69;36868:93;;;;;;;6923:2:1;36868:93:0;;;6905:21:1;6962:2;6942:18;;;6935:30;7001:13;6981:18;;;6974:41;7032:18;;36868:93:0;6721:335:1;36868:93:0;41732:11;;;41726:2;41701:27;;;;;41700:43;37003:28;37034:33;;;:9;:33;;;;;37091:14;;;;;;37078:51;;;;;;;7263:2:1;37078:51:0;;;7245:21:1;7302:2;7282:18;;;7275:30;7341:16;7321:18;;;7314:44;7375:18;;37078:51:0;7061:338:1;37078:51:0;37202:80;37234:6;37242:10;37262:4;37274:6;37269:12;;37202:31;:80::i;:::-;37341:22;37366:31;37377:7;37386:10;37366;:31::i;:::-;37441:38;;37341:56;;-1:-1:-1;37464:15:0;;;;37441:7;;:19;;:38;;37464:15;;37441:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37555:6;37536:7;:15;;:25;;;;;;;:::i;:::-;;;;;;;;37589:10;37572:28;;;;:16;;;;:28;;;;;;;;:38;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;36776:842:0:o;14430:369::-;14908:11;;;14891:60;;;;;14937:10;14891:60;;;5008:74:1;5098:18;;;5091:34;;;;14908:11:0;;;14891:45;;4981:18:1;;14891:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14883:83;;;;;;;5620:2:1;14883:83:0;;;5602:21:1;5659:2;5639:18;;;5632:30;5698:12;5678:18;;;5671:40;5728:18;;14883:83:0;5418:334:1;14883:83:0;14518:10:::1;14548:11:::0;::::1;;;;;;;;;;14531:48;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14518:63:::0;-1:-1:-1;14596:26:0::1;::::0;::::1;14592:200;;14639:56;::::0;;;;14692:1:::1;14639:56;::::0;::::1;571:74:1::0;14639:26:0::1;::::0;::::1;::::0;::::1;::::0;14675:5;;544:18:1;;14639:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;14505:294;14430:369:::0;;:::o;14592:200::-:1;14728:52;14756:12;14770:2;14774:5;14728:27;:52::i;:::-;14505:294;14430:369:::0;;:::o;13538:164::-;13635:1;13612:11;:25;:11;:25;13604:55;;;;;;;8402:2:1;13604:55:0;;;8384:21:1;8441:2;8421:18;;;8414:30;8480:19;8460:18;;;8453:47;8517:18;;13604:55:0;8200:341:1;13604:55:0;13670:11;:24;;;;;;;;;;;;;;;13538:164::o;38613:223::-;41732:11;;;41726:2;41701:27;;;;;41700:43;38691:28;38722:33;;;:9;:33;;;;;38797:31;38722:33;38817:10;38797;:31::i;:::-;38783:10;38766:28;;;;:16;;;;:28;;;;;;;;:62;;;;;;;;;;;:28;:62;;;;;;;-1:-1:-1;;38613:223:0:o;37763:733::-;41732:11;;;;41726:2;41701:27;;;;;41700:43;37871:28;37902:33;;;:9;:33;;;;;37975:19;;37902:33;;37975:19;;;;;37954:12;:41;;37946:65;;;;;;;6923:2:1;37946:65:0;;;6905:21:1;6962:2;6942:18;;;6935:30;7001:13;6981:18;;;6974:41;7032:18;;37946:65:0;6721:335:1;37946:65:0;38062:22;38087:31;38098:7;38107:10;38087;:31::i;:::-;38148:15;;38208:38;;38062:56;;-1:-1:-1;38143:21:0;;;;;38208:7;;38129:11;;38208:38;;38143:21;;38208:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38301:28:0;;;38357:10;38340:28;;;:16;;;:28;;;;;;;;:38;;;;;;;;;;38301:28;38340:38;;;;;;;;;;;38433:55;;38461:6;;38481;38433:27;:55::i;:::-;37829:667;;;37763:733;;:::o;33536:737::-;14908:11;;;14891:60;;;;;14937:10;14891:60;;;5008:74:1;5098:18;;;5091:34;;;;14908:11:0;;;14891:45;;4981:18:1;;14891:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14883:83;;;;;;;5620:2:1;14883:83:0;;;5602:21:1;5659:2;5639:18;;;5632:30;5698:12;5678:18;;;5671:40;5728:18;;14883:83:0;5418:334:1;14883:83:0;33745:10:::1;::::0;;;::::1;;;33777:7:::0;33810:21;;::::1;:45:::0;::::1;;;-1:-1:-1::0;33835:20:0;;::::1;33810:45;33802:75;;;::::0;::::1;::::0;;9015:2:1;33802:75:0::1;::::0;::::1;8997:21:1::0;9054:2;9034:18;;;9027:30;9093:19;9073:18;;;9066:47;9130:18;;33802:75:0::1;8813:341:1::0;33802:75:0::1;33895:6;33890:376;33911:3;33907:1;:7;33890:376;;;33936:14;33953:7;;33961:1;33953:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;33936:27;;34047:28;34078:9;:37;34088:26;34096:6;34104;;34111:1;34104:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41732:11:::0;;41726:2;41701:27;;;;;;41700:43;;41608:143;34088:26:::1;34078:37;;;;;;;;;;;34047:68;;34130:22;34144:7;34130:13;:22::i;:::-;;34186:7;;34194:1;34186:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;34169:14;::::0;::::1;:27:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;34245:6;;34252:1;34245:9;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;34233:21;::::0;:9;:21:::1;:::i;:::-;34211:43:::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;33916:3:0::1;::::0;::::1;:::i;:::-;;;33890:376;;;;33715:558;;33536:737:::0;;;;;;:::o;40545:268::-;40671:10;;40618:14;;40671:10;;;;;40651:12;:31;40647:159;;;40739:8;;;40716:14;;;;40711:37;;40739:8;;;40716:14;;40711:37;:::i;:::-;40699:49;40545:268;-1:-1:-1;;40545:268:0:o;40647:159::-;-1:-1:-1;40793:1:0;40647:159;40545:268;;;:::o;3906:399::-;4128:51;;;4117:10;10511:15:1;;;4128:51:0;;;10493:34:1;10563:15;;;10543:18;;;10536:43;10595:18;;;;10588:34;;;4128:51:0;;;;;;;;;;10405:18:1;;;;4128:51:0;;;;;;;;;;;;;4117:63;;-1:-1:-1;;;;4117:10:0;;;;:63;;4128:51;4117:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4081:99;;;;4199:7;:57;;;;-1:-1:-1;4211:11:0;;:16;;:44;;;4242:4;4231:24;;;;;;;;;;;;:::i;:::-;4191:106;;;;;;;11266:2:1;4191:106:0;;;11248:21:1;11305:2;11285:18;;;11278:30;11344:34;11324:18;;;11317:62;11415:6;11395:18;;;11388:34;11439:19;;4191:106:0;11064:400:1;4191:106:0;3994:311;;3906:399;;;;:::o;38900:826::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;39075:20:0;;;;;;:16;;;:20;;;;;39065:30;;;;;;;;;;;;;;;;;;;;;;;;;;39222:22;39075:16;39222:13;:22::i;:::-;39326:15;;39398:20;;;;39200:44;;-1:-1:-1;39321:21:0;;;39306:12;;32272:35;;39321:21;;41554:1;41534:21;;;;;41590:1;41561:30;;;;;;41533:59;39368:51;;:14;:51;:::i;:::-;39367:63;;;;:::i;:::-;:71;;;;:::i;:::-;39353:85;;39517:28;39530:14;39517:12;:28::i;:::-;39494:51;;:20;;;:51;39641:10;;39637:82;;39668:39;;;;;5038:42:1;5026:55;;39668:39:0;;;5008:74:1;5098:18;;;5091:34;;;15353:42:0;;39668:27;;4981:18:1;;39668:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39637:82;39029:697;;;38900:826;;;;:::o;3540:358::-;3732:45;;;3721:10;5026:55:1;;;3732:45:0;;;5008:74:1;5098:18;;;;5091:34;;;3732:45:0;;;;;;;;;;4981:18:1;;;;3732:45:0;;;;;;;;;;;;;3721:57;;-1:-1:-1;;;;3721:10:0;;;;:57;;3732:45;3721:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3685:93;;;;3797:7;:57;;;;-1:-1:-1;3809:11:0;;:16;;:44;;;3840:4;3829:24;;;;;;;;;;;;:::i;:::-;3789:101;;;;;;;11973:2:1;3789:101:0;;;11955:21:1;12012:2;11992:18;;;11985:30;12051:33;12031:18;;;12024:61;12102:18;;3789:101:0;11771:355:1;39827:681:0;39897:19;39984:14;40001:20;40013:7;40001:11;:20::i;:::-;40098:19;;;40169:22;;;39984:37;;-1:-1:-1;40098:19:0;;;40169:22;;;41554:1;41534:21;;;;;41590:1;41561:30;;;;;;41533:59;40139:53;-1:-1:-1;40207:15:0;;40203:97;;40277:11;40257:17;32272:35;40257:9;:17;:::i;:::-;:31;;;;:::i;:::-;40239:49;;;;:::i;:::-;;;40203:97;40389:28;40402:14;40389:12;:28::i;:::-;40364:22;;;:53;;;;;;;;;;;;;;;;;;;40432:13;;40428:73;;40462:14;;;:27;;;;;;40428:73;39918:590;;39827:681;;;:::o;41007:267::-;41063:6;;41113:105;41128:25;41120:5;:33;41113:105;;;41180:1;41170:11;;;;;41196:10;;;:::i;:::-;;;41113:105;;;41252:1;41243:10;;;;41242:23;;;;41007:267;-1:-1:-1;41007:267:0:o;14:154:1:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;69:93;14:154;:::o;173:247::-;232:6;285:2;273:9;264:7;260:23;256:32;253:52;;;301:1;298;291:12;253:52;340:9;327:23;359:31;384:5;359:31;:::i;:::-;409:5;173:247;-1:-1:-1;;;173:247:1:o;656:171::-;723:20;;783:18;772:30;;762:41;;752:69;;817:1;814;807:12;832:319;899:6;907;960:2;948:9;939:7;935:23;931:32;928:52;;;976:1;973;966:12;928:52;1015:9;1002:23;1034:31;1059:5;1034:31;:::i;:::-;1084:5;-1:-1:-1;1108:37:1;1141:2;1126:18;;1108:37;:::i;:::-;1098:47;;832:319;;;;;:::o;1480:445::-;1555:6;1563;1571;1624:2;1612:9;1603:7;1599:23;1595:32;1592:52;;;1640:1;1637;1630:12;1592:52;1679:9;1666:23;1729:34;1722:5;1718:46;1711:5;1708:57;1698:85;;1779:1;1776;1769:12;1698:85;1802:5;-1:-1:-1;1826:37:1;1859:2;1844:18;;1826:37;:::i;:::-;1816:47;;1882:37;1915:2;1904:9;1900:18;1882:37;:::i;:::-;1872:47;;1480:445;;;;;:::o;1930:460::-;2006:6;2014;2022;2075:2;2063:9;2054:7;2050:23;2046:32;2043:52;;;2091:1;2088;2081:12;2043:52;2130:9;2117:23;2149:31;2174:5;2149:31;:::i;:::-;2199:5;-1:-1:-1;2223:37:1;2256:2;2241:18;;2223:37;:::i;:::-;2213:47;;2312:2;2301:9;2297:18;2284:32;2325:33;2350:7;2325:33;:::i;:::-;2377:7;2367:17;;;1930:460;;;;;:::o;3042:315::-;3110:6;3118;3171:2;3159:9;3150:7;3146:23;3142:32;3139:52;;;3187:1;3184;3177:12;3139:52;3226:9;3213:23;3245:31;3270:5;3245:31;:::i;:::-;3295:5;3347:2;3332:18;;;;3319:32;;-1:-1:-1;;;3042:315:1:o;3362:367::-;3425:8;3435:6;3489:3;3482:4;3474:6;3470:17;3466:27;3456:55;;3507:1;3504;3497:12;3456:55;-1:-1:-1;3530:20:1;;3573:18;3562:30;;3559:50;;;3605:1;3602;3595:12;3559:50;3642:4;3634:6;3630:17;3618:29;;3702:3;3695:4;3685:6;3682:1;3678:14;3670:6;3666:27;3662:38;3659:47;3656:67;;;3719:1;3716;3709:12;3656:67;3362:367;;;;;:::o;3734:1087::-;3891:6;3899;3907;3915;3923;3931;3984:2;3972:9;3963:7;3959:23;3955:32;3952:52;;;4000:1;3997;3990:12;3952:52;4040:9;4027:23;4069:18;4110:2;4102:6;4099:14;4096:34;;;4126:1;4123;4116:12;4096:34;4165:70;4227:7;4218:6;4207:9;4203:22;4165:70;:::i;:::-;4254:8;;-1:-1:-1;4139:96:1;-1:-1:-1;4342:2:1;4327:18;;4314:32;;-1:-1:-1;4358:16:1;;;4355:36;;;4387:1;4384;4377:12;4355:36;4426:72;4490:7;4479:8;4468:9;4464:24;4426:72;:::i;:::-;4517:8;;-1:-1:-1;4400:98:1;-1:-1:-1;4605:2:1;4590:18;;4577:32;;-1:-1:-1;4621:16:1;;;4618:36;;;4650:1;4647;4640:12;4618:36;;4689:72;4753:7;4742:8;4731:9;4727:24;4689:72;:::i;:::-;3734:1087;;;;-1:-1:-1;3734:1087:1;;-1:-1:-1;3734:1087:1;;4780:8;;3734:1087;-1:-1:-1;;;3734:1087:1:o;5136:277::-;5203:6;5256:2;5244:9;5235:7;5231:23;5227:32;5224:52;;;5272:1;5269;5262:12;5224:52;5304:9;5298:16;5357:5;5350:13;5343:21;5336:5;5333:32;5323:60;;5379:1;5376;5369:12;5757:184;5809:77;5806:1;5799:88;5906:4;5903:1;5896:15;5930:4;5927:1;5920:15;5946:228;5986:7;6112:1;6044:66;6040:74;6037:1;6034:81;6029:1;6022:9;6015:17;6011:105;6008:131;;;6119:18;;:::i;:::-;-1:-1:-1;6159:9:1;;5946:228::o;6179:274::-;6219:1;6245;6235:189;;6280:77;6277:1;6270:88;6381:4;6378:1;6371:15;6409:4;6406:1;6399:15;6235:189;-1:-1:-1;6438:9:1;;6179:274::o;6458:128::-;6498:3;6529:1;6525:6;6522:1;6519:13;6516:39;;;6535:18;;:::i;:::-;-1:-1:-1;6571:9:1;;6458:128::o;6591:125::-;6631:4;6659:1;6656;6653:8;6650:34;;;6664:18;;:::i;:::-;-1:-1:-1;6701:9:1;;6591:125::o;7404:269::-;7444:3;7472:50;7549:2;7546:1;7542:10;7579:2;7576:1;7572:10;7610:3;7606:2;7602:12;7597:3;7594:21;7591:47;;;7618:18;;:::i;:::-;7654:13;;7404:269;-1:-1:-1;;;;7404:269:1:o;7678:261::-;7718:3;7746:42;7815:2;7812:1;7808:10;7845:2;7842:1;7838:10;7876:3;7872:2;7868:12;7863:3;7860:21;7857:47;;;7884:18;;:::i;7944:251::-;8014:6;8067:2;8055:9;8046:7;8042:23;8038:32;8035:52;;;8083:1;8080;8073:12;8035:52;8115:9;8109:16;8134:31;8159:5;8134:31;:::i;8546:262::-;8586:4;8615:50;8715:10;;;;8685;;8737:12;;;8734:38;;;8752:18;;:::i;:::-;8789:13;;8546:262;-1:-1:-1;;;8546:262:1:o;9159:184::-;9211:77;9208:1;9201:88;9308:4;9305:1;9298:15;9332:4;9329:1;9322:15;9348:184;9406:6;9459:2;9447:9;9438:7;9434:23;9430:32;9427:52;;;9475:1;9472;9465:12;9427:52;9498:28;9516:9;9498:28;:::i;9789:236::-;9828:3;9856:18;9901:2;9898:1;9894:10;9931:2;9928:1;9924:10;9962:3;9958:2;9954:12;9949:3;9946:21;9943:47;;;9970:18;;:::i;10030:195::-;10069:3;10100:66;10093:5;10090:77;10087:103;;;10170:18;;:::i;:::-;-1:-1:-1;10217:1:1;10206:13;;10030:195::o;10633:426::-;10762:3;10800:6;10794:13;10825:1;10835:129;10849:6;10846:1;10843:13;10835:129;;;10947:4;10931:14;;;10927:25;;10921:32;10908:11;;;10901:53;10864:12;10835:129;;;10982:6;10979:1;10976:13;10973:48;;;11017:1;11008:6;11003:3;10999:16;10992:27;10973:48;-1:-1:-1;11037:16:1;;;;;10633:426;-1:-1:-1;;10633:426:1:o
Swarm Source
ipfs://487b16dad42ec5eec622244632fd08e25c65424244ad44ce0d9039f47a24333f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.