Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 15033877 | 641 days ago | IN | Create: aMATICb_R5 | 0 ETH | 0.11307615 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
aMATICb_R5
Compiler Version
v0.8.6+commit.11564f7e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/math/SignedSafeMathUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "../interfaces/ICertToken.sol"; import "../interfaces/IinternetBond_R1.sol"; import "../libraries/ERC20BondBase.sol"; contract aMATICb_R5 is OwnableUpgradeable, ERC20BondBase, IinternetBond_R1 { using SafeMathUpgradeable for uint256; using MathUpgradeable for uint256; using SignedSafeMathUpgradeable for int256; event RatioUpdate(uint256 newRatio); event LastConfirmedRatioUpdate(uint256 newRatio); address private _operator; address private _crossChainBridge; address private _polygonPool; // ratio should be base on 1 MATIC, if ratio is 0.9, this variable should be 9e17 uint256 private _ratio; int256 private _lockedShares; mapping(address => uint256) private _pendingBurn; uint256 private _pendingBurnsTotal; uint256 private _collectableFee; string private _name; string private _symbol; // Added in R3 address public certToken; // aMATICc address public swapFeeOperator; uint256 public swapFeeRatio; function initialize(address operator) public initializer { __Ownable_init(); __ERC20_init("Ankr MATIC Reward Earning Bond", "aMATICb"); _operator = operator; _ratio = 1e18; } function ratio() public override view returns (uint256) { return _ratio; } function isRebasing() public pure returns (bool) { return true; } function updateRatio(uint256 newRatio) public onlyOperator { // // 0.002 * ratio // uint256 threshold = _ratio.div(500); // require(newRatio < _ratio.add(threshold) || newRatio > _ratio.sub(threshold), "New ratio should be in limits"); require(newRatio <= 1e18, "new ratio should be less or equal to 1e18"); _ratio = newRatio; emit RatioUpdate(_ratio); } function repairRatio(uint256 newRatio) public onlyOwner { _ratio = newRatio; emit RatioUpdate(_ratio); } function collectableFee() public view returns (uint256) { return _collectableFee; } function repairCollectableFee(uint256 newFee) public onlyOwner { _collectableFee = newFee; } function updateRatioAndFee(uint256 newRatio, uint256 newFee) public onlyOperator { // 0.002 * ratio uint256 threshold = _ratio.div(500); require(newRatio < _ratio.add(threshold) || newRatio > _ratio.sub(threshold), "New ratio should be in limits"); require(newRatio <= 1e18, "new ratio should be less or equal to 1e18"); _ratio = newRatio; _collectableFee = newFee; emit RatioUpdate(_ratio); } function totalSupply() public view override returns (uint256) { uint256 supply = totalSharesSupply(); return _sharesToBonds(supply); } function totalSharesSupply() public view override returns (uint256) { return super.totalSupply(); } function balanceOf(address account) public view override returns (uint256) { uint256 shares = super.balanceOf(account); return _sharesToBonds(shares).sub(_pendingBurn[account]); } function sharesOf(address account) public view override returns (uint256) { return super.balanceOf(account); } function mintBonds(address account, uint256 amount) public override onlyBondMinter { uint256 shares = _bondsToShares(amount); _mint(account, shares); emit Transfer(address(0), account, _sharesToBonds(shares)); } function mint(address account, uint256 shares) public onlyMinter { _lockedShares = _lockedShares.sub(int256(shares)); _mint(account, shares); emit Transfer(address(0), account, _sharesToBonds(shares)); } function burn(address account, uint256 amount) public override onlyMinter { uint256 shares = _bondsToShares(amount); _lockedShares = _lockedShares.add(int256(shares)); _burn(account, shares); emit Transfer(account, address(0), _sharesToBonds(shares)); } function _mint(address account, uint256 shares) internal override { super._mint(account, shares); ICertToken(certToken).mint(address(this), shares); } function _burn(address account, uint256 shares) internal override { super._burn(account, shares); ICertToken(certToken).burn(address(this), shares); } function pendingBurn(address account) external view override returns (uint256) { return _pendingBurn[account]; } function lockForDelayedBurn(address account, uint256 amount) public override onlyBondMinter { _pendingBurn[account] = _pendingBurn[account].add(amount); _pendingBurnsTotal = _pendingBurnsTotal.add(amount); } function commitDelayedBurn(address account, uint256 amount) public override onlyBondMinter { uint256 burnableAmount = _pendingBurn[account]; require(burnableAmount >= amount, "Too big amount to burn"); uint256 sharesToBurn = _bondsToShares(amount); _pendingBurn[account] = burnableAmount.sub(amount); _pendingBurnsTotal = _pendingBurnsTotal.sub(amount); _burn(account, sharesToBurn); emit Transfer(account, address(0), _sharesToBonds(sharesToBurn)); } function transfer(address recipient, uint256 amount) public override returns (bool) { uint256 shares = _bondsToShares(amount); super.transfer(recipient, shares); emit Transfer(msg.sender, recipient, _sharesToBonds(shares)); return true; } function transferShares(address sender, address recipient, uint256 shares) internal returns (bool) { super._transfer(sender, recipient, shares); emit Transfer(sender, recipient, _sharesToBonds(shares)); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _sharesToBonds(super.allowance(owner, spender)); } function approve(address spender, uint256 amount) public override returns (bool) { uint256 shares = _bondsToShares(amount); super.approve(spender, shares); emit Approval(msg.sender, spender, allowance(msg.sender, spender)); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { uint256 shares = _bondsToShares(amount); super.transferFrom(sender, recipient, shares); emit Transfer(sender, recipient, _sharesToBonds(shares)); return true; } function increaseAllowance(address spender, uint256 addedValue) public override returns (bool) { uint256 shares = _bondsToShares(addedValue); super.increaseAllowance(spender, shares); emit Approval(msg.sender, spender, allowance(msg.sender, spender)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public override returns (bool) { uint256 shares = _bondsToShares(subtractedValue); super.decreaseAllowance(spender, shares); emit Approval(msg.sender, spender, allowance(msg.sender, spender)); return true; } function _bondsToShares(uint256 amount) internal view returns (uint256) { return safeCeilMultiplyAndDivide(amount, _ratio, 1e18); } function _sharesToBonds(uint256 amount) internal view returns (uint256) { return safeFloorMultiplyAndDivide(amount, 1e18, _ratio); } modifier onlyOperator() { require(msg.sender == owner() || msg.sender == _operator, "Operator: not allowed"); _; } modifier onlyMinter() { require(msg.sender == _crossChainBridge, "Minter: not allowed"); _; } modifier onlyBondMinter() { require(msg.sender == _polygonPool, "Minter: not allowed"); _; } function changeOperator(address operator) public onlyOwner { _operator = operator; } function changePolygonPool(address polygonPool) public onlyOwner { _polygonPool = polygonPool; } function changeCrossChainBridge(address crossChainBridge) public onlyOwner { _crossChainBridge = crossChainBridge; } function lockedSupply() public view returns (int256) { return _lockedShares; } function name() public view override returns (string memory) { if (bytes(_name).length != 0) { return _name; } return super.name(); } function symbol() public view override returns (string memory) { if (bytes(_symbol).length != 0) { return _symbol; } return super.symbol(); } function setNameAndSymbol(string memory new_name, string memory new_symbol) public onlyOperator { _name = new_name; _symbol = new_symbol; } /*** Added in version R3 ***/ function sharesToBalance(uint256 amount) public override view returns (uint256) { return _sharesToBonds(amount); } function balanceToShares(uint256 amount) public override view returns (uint256) { return _bondsToShares(amount); } function getSwapFeeInBonds(uint256 bonds) public view override returns(uint256) { uint256 shares = balanceToShares(bonds); uint256 feeInShares = getSwapFeeInShares(shares); return sharesToBalance(feeInShares); } function getSwapFeeInShares(uint256 shares) public view override returns(uint256) { return safeCeilMultiplyAndDivide(shares, swapFeeRatio, 1e18); } function changeCertToken(address newCertToken) external override onlyOwner { address oldCertToken = certToken; certToken = newCertToken; emit CertTokenChanged(oldCertToken, newCertToken); } function changeSwapFeeOperator(address newSwapFeeOperator) external override onlyOwner { address oldSwapFeeOperator = swapFeeOperator; swapFeeOperator = newSwapFeeOperator; emit SwapFeeOperatorChanged(oldSwapFeeOperator, newSwapFeeOperator); } function updateSwapFeeRatio(uint256 newRatio) external override onlyOwner { require(newRatio <= 1e16, "swapFee must be not greater that 1%"); swapFeeRatio = newRatio; emit SwapFeeRatioUpdate(newRatio); } function unlockShares(uint256 shares) external override { _unlockShares(msg.sender, shares, true); } function unlockSharesFor(address account, uint256 bonds) external override onlyBondMinter { uint256 shares = balanceToShares(bonds); _unlockShares(account, shares, false); } function _unlockShares(address account, uint256 shares, bool takeFee) internal { require(sharesOf(account) >= shares, "Insufficient aMATICb balance"); uint256 fee = 0; if (takeFee) { fee = getSwapFeeInShares(shares); } // address(this) hols aFTMb that are unlocked to aFTMc. This address can be accessed only by aFTMb contract. transferShares(account, address(this), shares - fee); if (fee != 0) { transferShares(account, swapFeeOperator, fee); } ICertToken(certToken).bondTransferTo(account, shares - fee); } function lockShares(uint256 shares) external override { _lockShares(msg.sender, shares, true); } function lockSharesFor(address account, uint256 shares) external override onlyBondMinter { _lockShares(account, shares, false); } function _lockShares(address account, uint256 shares, bool takeFee) internal { require(IERC20Upgradeable(certToken).balanceOf(account) >= shares, "Insufficient aMATICc balance"); uint256 fee = 0; if (takeFee) { fee = getSwapFeeInShares(shares); } ICertToken(certToken).bondTransferFrom(account, shares); transferShares(address(this), account, shares - fee); // can not fail as _balance[address(this)] always equals to amount of aFTMc minted if (fee != 0) { transferShares(address(this), swapFeeOperator, fee); } } // utility functions // returns floor (a * b / c) function safeFloorMultiplyAndDivide(uint256 a, uint256 b, uint256 c) internal pure returns (uint256) { uint256 remainder = a.mod(c); uint256 result = a.div(c); bool safe; (safe, result) = result.tryMul(b); if (!safe) { return 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; } (safe, result) = result.tryAdd(remainder.mul(b).div(c)); if (!safe) { return 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; } return result; } // return ceil (a * b / c) function safeCeilMultiplyAndDivide(uint256 a, uint256 b, uint256 c) internal pure returns (uint256) { uint256 remainder = a.mod(c); uint256 result = a.div(c); bool safe; (safe, result) = result.tryMul(b); if (!safe) { return 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; } (safe, result) = result.tryAdd(remainder.mul(b).add(c.sub(1)).div(c)); if (!safe) { return 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; } return result; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; // This is fork of openzeppelin ERC20Upgradeable to allow for custom events in Internet bonds // No events are emitted in base contract, it's responsibility of caller to emit correct event // Storage layout and inheritance preserved so it's safe for upgrade /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20BondBase is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _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; _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; _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; _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; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} uint256[45] private __gap; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.6; interface IinternetBond_R1 { event CertTokenChanged(address oldCertToken, address newCertToken); event SwapFeeOperatorChanged(address oldSwapFeeOperator, address newSwapFeeOperator); event SwapFeeRatioUpdate(uint256 newSwapFeeRatio); function balanceToShares(uint256 bonds) external view returns (uint256); function burn(address account, uint256 amount) external; function changeCertToken(address newCertToken) external; function changeSwapFeeOperator(address newSwapFeeOperator) external; function commitDelayedBurn(address account, uint256 amount) external; function getSwapFeeInBonds(uint256 bonds) external view returns(uint256); function getSwapFeeInShares(uint256 shares) external view returns(uint256); function lockForDelayedBurn(address account, uint256 amount) external; function lockShares(uint256 shares) external; function lockSharesFor(address account, uint256 shares) external; function mintBonds(address account, uint256 amount) external; function pendingBurn(address account) external view returns (uint256); function ratio() external view returns (uint256); function sharesOf(address account) external view returns (uint256); function sharesToBalance(uint256 shares) external view returns (uint256); function totalSharesSupply() external view returns (uint256); function unlockShares(uint256 shares) external; function unlockSharesFor(address account, uint256 bonds) external; function updateSwapFeeRatio(uint256 newSwapFeeRatio) external; }
pragma solidity ^0.8.0; interface ICertToken { event PoolContractChanged(address oldPool, address newPool); event BondTokenChanged(address oldBondToken, address newBondToken); function changePoolContract(address newPoolContract) external; function changeBondToken(address newBondToken) external; function burn(address account, uint256 amount) external; function mint(address account, uint256 amount) external; function bondTransferTo(address account, uint256 shares) external; function bondTransferFrom(address account, uint256 shares) external; function balanceWithRewardsOf(address account) external returns (uint256); function isRebasing() external returns (bool); function ratio() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SignedSafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SignedSafeMathUpgradeable { /** * @dev Returns the multiplication of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { return a * b; } /** * @dev Returns the integer division of two signed integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(int256 a, int256 b) internal pure returns (int256) { return a / b; } /** * @dev Returns the subtraction of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { return a - b; } /** * @dev Returns the addition of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { return a + b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20Upgradeable.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "berlin", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldCertToken","type":"address"},{"indexed":false,"internalType":"address","name":"newCertToken","type":"address"}],"name":"CertTokenChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRatio","type":"uint256"}],"name":"LastConfirmedRatioUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRatio","type":"uint256"}],"name":"RatioUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldSwapFeeOperator","type":"address"},{"indexed":false,"internalType":"address","name":"newSwapFeeOperator","type":"address"}],"name":"SwapFeeOperatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSwapFeeRatio","type":"uint256"}],"name":"SwapFeeRatioUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"balanceToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"certToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newCertToken","type":"address"}],"name":"changeCertToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"crossChainBridge","type":"address"}],"name":"changeCrossChainBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"changeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"polygonPool","type":"address"}],"name":"changePolygonPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSwapFeeOperator","type":"address"}],"name":"changeSwapFeeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectableFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"commitDelayedBurn","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":"uint256","name":"bonds","type":"uint256"}],"name":"getSwapFeeInBonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"getSwapFeeInShares","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":[{"internalType":"address","name":"operator","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isRebasing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockForDelayedBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"lockShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"lockSharesFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"pendingBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"repairCollectableFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRatio","type":"uint256"}],"name":"repairRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"new_name","type":"string"},{"internalType":"string","name":"new_symbol","type":"string"}],"name":"setNameAndSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"sharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sharesToBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFeeOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFeeRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSharesSupply","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"unlockShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"bonds","type":"uint256"}],"name":"unlockSharesFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRatio","type":"uint256"}],"name":"updateRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRatio","type":"uint256"},{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"updateRatioAndFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRatio","type":"uint256"}],"name":"updateSwapFeeRatio","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506127f2806100206000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c8063686b149c11610182578063c4d66de8116100e9578063dd62ed3e116100a2578063e5683ad91161007c578063e5683ad914610603578063ee03137314610616578063f2fde38b14610629578063f5eb42dc1461063c57600080fd5b8063dd62ed3e146105ca578063e1061bdb146105dd578063e3ec72be146105f057600080fd5b8063c4d66de81461056e578063c814cf8914610581578063ca5c7b9114610594578063d50619cc1461059c578063d8ddf18f146105a4578063dc647e29146105b757600080fd5b806395d89b411161013b57806395d89b41146105075780639dc29fac1461050f578063a457c2d714610522578063a7105e3114610535578063a85374e114610548578063a9059cbb1461055b57600080fd5b8063686b149c146104ad57806370a08231146104c05780637110e76c146104d3578063715018a6146104e657806371ca337d146104ee5780638da5cb5b146104f657600080fd5b80633950935111610226578063583585f4116101df578063583585f41461043c5780635a446215146104655780635dfba1151461047857806362b9739d1461047f5780636406dd5c146104925780636482a22f1461049a57600080fd5b806339509351146103ca57806340c10f19146103dd578063417719bc146103f05780635300afab1461040357806353396d2f1461041657806353735f371461042957600080fd5b80630ed62270116102785780630ed622701461036757806318160ddd1461037a5780631d62f87c1461038257806323b872dd146103955780632a52cd0c146103a8578063313ce567146103bb57600080fd5b806301a46dac146102c057806306394c9b146102dc57806306fdde03146102f157806307ef2a12146103065780630872e9ff14610319578063095ea7b314610344575b600080fd5b6102c960a35481565b6040519081526020015b60405180910390f35b6102ef6102ea366004612340565b61064f565b005b6102f96106a4565b6040516102d391906124ac565b6102ef6103143660046123ca565b610757565b60a15461032c906001600160a01b031681565b6040516001600160a01b0390911681526020016102d3565b6103576103523660046123ca565b6107d1565b60405190151581526020016102d3565b6102ef6103753660046123ca565b61083b565b6102c961094c565b6102ef610390366004612458565b610968565b6103576103a336600461238e565b610997565b6102c96103b6366004612458565b6109fb565b604051601281526020016102d3565b6103576103d83660046123ca565b610a18565b6102ef6103eb3660046123ca565b610a30565b6102c96103fe366004612458565b610aad565b6102ef6104113660046123ca565b610ad9565b6102ef610424366004612340565b610b13565b6102c9610437366004612458565b610b5f565b6102c961044a366004612340565b6001600160a01b03166000908152609c602052604090205490565b6102ef6104733660046123f4565b610b6a565b6001610357565b6102ef61048d366004612458565b610bd5565b609e546102c9565b6102ef6104a8366004612458565b610c9e565b6102ef6104bb3660046123ca565b610cad565b6102c96104ce366004612340565b610cf0565b6102ef6104e1366004612340565b610d27565b6102ef610db3565b609a546102c9565b6033546001600160a01b031661032c565b6102f9610de9565b6102ef61051d3660046123ca565b610e14565b6103576105303660046123ca565b610ea0565b60a25461032c906001600160a01b031681565b6102ef6105563660046123ca565b610eb8565b6103576105693660046123ca565b610f1d565b6102ef61057c366004612340565b610f59565b6102ef61058f36600461248a565b611052565b609b546102c9565b6102c9611181565b6102c96105b2366004612458565b61118c565b6102ef6105c5366004612458565b611197565b6102c96105d836600461235b565b611233565b6102ef6105eb366004612340565b611264565b6102ef6105fe366004612340565b6112e8565b6102ef610611366004612458565b611334565b6102ef610624366004612458565b61135e565b6102ef610637366004612340565b61136a565b6102c961064a366004612340565b611402565b6033546001600160a01b031633146106825760405162461bcd60e51b8152600401610679906125ab565b60405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b6060609f80546106b39061270b565b15905061074a57609f80546106c79061270b565b80601f01602080910402602001604051908101604052809291908181526020018280546106f39061270b565b80156107405780601f1061071557610100808354040283529160200191610740565b820191906000526020600020905b81548152906001019060200180831161072357829003601f168201915b5050505050905090565b610752611420565b905090565b6099546001600160a01b031633146107815760405162461bcd60e51b815260040161067990612501565b6001600160a01b0382166000908152609c60205260409020546107a4908261142f565b6001600160a01b0383166000908152609c6020526040902055609d546107ca908261142f565b609d555050565b6000806107dd8361143b565b90506107e98482611452565b506001600160a01b038416337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256108208288611233565b60405190815260200160405180910390a35060019392505050565b6099546001600160a01b031633146108655760405162461bcd60e51b815260040161067990612501565b6001600160a01b0382166000908152609c6020526040902054818110156108c75760405162461bcd60e51b81526020600482015260166024820152752a37b7903134b39030b6b7bab73a103a3790313ab93760511b6044820152606401610679565b60006108d28361143b565b90506108de8284611468565b6001600160a01b0385166000908152609c6020526040902055609d546109049084611468565b609d556109118482611474565b60006001600160a01b03851660008051602061279d833981519152610935846114e7565b60405190815260200160405180910390a350505050565b600080610957611181565b9050610962816114e7565b91505090565b6033546001600160a01b031633146109925760405162461bcd60e51b8152600401610679906125ab565b609e55565b6000806109a38361143b565b90506109b08585836114fe565b50836001600160a01b0316856001600160a01b031660008051602061279d8339815191526109dd846114e7565b60405190815260200160405180910390a360019150505b9392505050565b6000610a128260a354670de0b6b3a76400006115a8565b92915050565b600080610a248361143b565b90506107e98482611639565b6098546001600160a01b03163314610a5a5760405162461bcd60e51b815260040161067990612501565b609b54610a679082611675565b609b55610a748282611681565b6001600160a01b038216600060008051602061279d833981519152610a98846114e7565b60405190815260200160405180910390a35050565b600080610ab98361118c565b90506000610ac6826109fb565b9050610ad181610b5f565b949350505050565b6099546001600160a01b03163314610b035760405162461bcd60e51b815260040161067990612501565b610b0f828260006116c2565b5050565b6033546001600160a01b03163314610b3d5760405162461bcd60e51b8152600401610679906125ab565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a12826114e7565b6033546001600160a01b0316331480610b8d57506097546001600160a01b031633145b610ba95760405162461bcd60e51b81526004016106799061252e565b8151610bbc90609f9060208501906121fe565b508051610bd09060a09060208401906121fe565b505050565b6033546001600160a01b03163314610bff5760405162461bcd60e51b8152600401610679906125ab565b662386f26fc10000811115610c625760405162461bcd60e51b815260206004820152602360248201527f73776170466565206d757374206265206e6f742067726561746572207468617460448201526220312560e81b6064820152608401610679565b60a38190556040518181527ffd42e9c199a15716921eeaedb024b26ab2b3d12a8a85482e02551dfca60038cb906020015b60405180910390a150565b610caa338260016116c2565b50565b6099546001600160a01b03163314610cd75760405162461bcd60e51b815260040161067990612501565b6000610ce28261118c565b9050610bd083826000611844565b6001600160a01b038116600090815260656020908152604080832054609c9092528220546109f490610d21836114e7565b90611468565b6033546001600160a01b03163314610d515760405162461bcd60e51b8152600401610679906125ab565b60a180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fe06ab7e4de2e7a372c12a4101ea3106a9f4ea8d28d25bdec8f89b41b5841f8a091015b60405180910390a15050565b6033546001600160a01b03163314610ddd5760405162461bcd60e51b8152600401610679906125ab565b610de76000611960565b565b606060a08054610df89061270b565b159050610e0c5760a080546106c79061270b565b6107526119b2565b6098546001600160a01b03163314610e3e5760405162461bcd60e51b815260040161067990612501565b6000610e498261143b565b609b54909150610e5990826119c1565b609b55610e668382611474565b60006001600160a01b03841660008051602061279d833981519152610e8a846114e7565b60405190815260200160405180910390a3505050565b600080610eac8361143b565b90506107e984826119cd565b6099546001600160a01b03163314610ee25760405162461bcd60e51b815260040161067990612501565b6000610eed8261143b565b9050610ef98382611681565b6001600160a01b038316600060008051602061279d833981519152610e8a846114e7565b600080610f298361143b565b9050610f358482611a66565b506001600160a01b0384163360008051602061279d833981519152610820846114e7565b600054610100900460ff1680610f72575060005460ff16155b610f8e5760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff16158015610fb0576000805461ffff19166101011790555b610fb8611a73565b6110166040518060400160405280601e81526020017f416e6b72204d4154494320526577617264204561726e696e6720426f6e6400008152506040518060400160405280600781526020016630a6a0aa24a1b160c91b815250611aee565b609780546001600160a01b0319166001600160a01b038416179055670de0b6b3a7640000609a558015610b0f576000805461ff00191690555050565b6033546001600160a01b031633148061107557506097546001600160a01b031633145b6110915760405162461bcd60e51b81526004016106799061252e565b609a546000906110a3906101f4611b6d565b609a549091506110b3908261142f565b8310806110cb5750609a546110c89082611468565b83115b6111175760405162461bcd60e51b815260206004820152601d60248201527f4e657720726174696f2073686f756c6420626520696e206c696d6974730000006044820152606401610679565b670de0b6b3a764000083111561113f5760405162461bcd60e51b8152600401610679906125e0565b609a839055609e8290556040518381527fb779c97cee7508e970bdead8c3ef0bd16f8c63dbba28fe88f7c7a56722fc564d9060200160405180910390a1505050565b600061075260675490565b6000610a128261143b565b6033546001600160a01b03163314806111ba57506097546001600160a01b031633145b6111d65760405162461bcd60e51b81526004016106799061252e565b670de0b6b3a76400008111156111fe5760405162461bcd60e51b8152600401610679906125e0565b609a8190556040518181527fb779c97cee7508e970bdead8c3ef0bd16f8c63dbba28fe88f7c7a56722fc564d90602001610c93565b6001600160a01b0380831660009081526066602090815260408083209385168352929052908120546109f4906114e7565b6033546001600160a01b0316331461128e5760405162461bcd60e51b8152600401610679906125ab565b60a280546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f64ce71e3ee2d701fb3eddb42d9f04090717d2df15227b715a1068803a85a85be9101610da7565b6033546001600160a01b031633146113125760405162461bcd60e51b8152600401610679906125ab565b609880546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146111fe5760405162461bcd60e51b8152600401610679906125ab565b610caa33826001611844565b6033546001600160a01b031633146113945760405162461bcd60e51b8152600401610679906125ab565b6001600160a01b0381166113f95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610679565b610caa81611960565b6001600160a01b038116600090815260656020526040812054610a12565b6060606880546106c79061270b565b60006109f4828461266a565b6000610a1282609a54670de0b6b3a76400006115a8565b600061145f338484611b79565b50600192915050565b60006109f482846126f4565b61147e8282611c68565b60a154604051632770a7eb60e21b8152306004820152602481018390526001600160a01b0390911690639dc29fac906044015b600060405180830381600087803b1580156114cb57600080fd5b505af11580156114df573d6000803e3d6000fd5b505050505050565b6000610a1282670de0b6b3a7640000609a54611d7b565b600061150b848484611dcb565b6001600160a01b0384166000908152606660209081526040808320338452909152902054828110156115905760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610679565b61159d8533858403611b79565b506001949350505050565b6000806115b58584611f4b565b905060006115c38685611b6d565b905060006115d18287611f57565b92509050806115e75760001993505050506109f4565b6116196116128661160c6115fc826001611468565b611606888c611f9f565b9061142f565b90611b6d565b8390611fab565b925090508061162f5760001993505050506109f4565b5095945050505050565b3360008181526066602090815260408083206001600160a01b0387168452909152812054909161145f91859061167090869061266a565b611b79565b60006109f482846126b5565b61168b8282611fc6565b60a1546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f19906044016114b1565b60a1546040516370a0823160e01b81526001600160a01b038581166004830152849216906370a082319060240160206040518083038186803b15801561170757600080fd5b505afa15801561171b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173f9190612471565b101561178d5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420614d41544943632062616c616e6365000000006044820152606401610679565b600081156117a15761179e836109fb565b90505b60a154604051634bc3f6e960e01b81526001600160a01b0386811660048301526024820186905290911690634bc3f6e990604401600060405180830381600087803b1580156117ef57600080fd5b505af1158015611803573d6000803e3d6000fd5b5050505061181d3085838661181891906126f4565b612066565b50801561183e5760a25461183c9030906001600160a01b031683612066565b505b50505050565b8161184e84611402565b101561189c5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420614d41544943622062616c616e6365000000006044820152606401610679565b600081156118b0576118ad836109fb565b90505b6118bf843061181884876126f4565b5080156118e05760a2546118de9085906001600160a01b031683612066565b505b60a1546001600160a01b0316636e6e273e856118fc84876126f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561194257600080fd5b505af1158015611956573d6000803e3d6000fd5b5050505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060606980546106c79061270b565b60006109f48284612629565b3360009081526066602090815260408083206001600160a01b038616845290915281205482811015611a4f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610679565b611a5c3385858403611b79565b5060019392505050565b600061145f338484611dcb565b600054610100900460ff1680611a8c575060005460ff16155b611aa85760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff16158015611aca576000805461ffff19166101011790555b611ad261209f565b611ada612109565b8015610caa576000805461ff001916905550565b600054610100900460ff1680611b07575060005460ff16155b611b235760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff16158015611b45576000805461ffff19166101011790555b611b4d61209f565b611b578383612169565b8015610bd0576000805461ff0019169055505050565b60006109f48284612682565b6001600160a01b038316611bdb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610679565b6001600160a01b038216611c3c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610679565b6001600160a01b0392831660009081526066602090815260408083209490951682529290925291902055565b6001600160a01b038216611cc85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610679565b6001600160a01b03821660009081526065602052604090205481811015611d3c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610679565b6001600160a01b0383166000908152606560205260408120838303905560678054849290611d6b9084906126f4565b90915550610bd090508360008483565b600080611d888584611f4b565b90506000611d968685611b6d565b90506000611da48287611f57565b9250905080611dba5760001993505050506109f4565b6116196116128661160c868a611f9f565b6001600160a01b038316611e2f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610679565b6001600160a01b038216611e915760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610679565b6001600160a01b03831660009081526065602052604090205481811015611f095760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610679565b6001600160a01b03808516600090815260656020526040808220858503905591851681529081208054849290611f4090849061266a565b9091555061183e9050565b60006109f48284612746565b60008083611f6b5750600190506000611f98565b83830283858281611f7e57611f7e612770565b0414611f91576000809250925050611f98565b6001925090505b9250929050565b60006109f48284612696565b60008083830184811015611f91576000809250925050611f98565b6001600160a01b03821661201c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610679565b806067600082825461202e919061266a565b90915550506001600160a01b0382166000908152606560205260408120805483929061205b90849061266a565b90915550610b0f9050565b6000612073848484611dcb565b826001600160a01b0316846001600160a01b031660008051602061279d833981519152610820856114e7565b600054610100900460ff16806120b8575060005460ff16155b6120d45760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff16158015611ada576000805461ffff19166101011790558015610caa576000805461ff001916905550565b600054610100900460ff1680612122575060005460ff16155b61213e5760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff16158015612160576000805461ffff19166101011790555b611ada33611960565b600054610100900460ff1680612182575060005460ff16155b61219e5760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff161580156121c0576000805461ffff19166101011790555b82516121d39060689060208601906121fe565b5081516121e79060699060208501906121fe565b508015610bd0576000805461ff0019169055505050565b82805461220a9061270b565b90600052602060002090601f01602090048101928261222c5760008555612272565b82601f1061224557805160ff1916838001178555612272565b82800160010185558215612272579182015b82811115612272578251825591602001919060010190612257565b5061227e929150612282565b5090565b5b8082111561227e5760008155600101612283565b80356001600160a01b03811681146122ae57600080fd5b919050565b600082601f8301126122c457600080fd5b813567ffffffffffffffff808211156122df576122df612786565b604051601f8301601f19908116603f0116810190828211818310171561230757612307612786565b8160405283815286602085880101111561232057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561235257600080fd5b6109f482612297565b6000806040838503121561236e57600080fd5b61237783612297565b915061238560208401612297565b90509250929050565b6000806000606084860312156123a357600080fd5b6123ac84612297565b92506123ba60208501612297565b9150604084013590509250925092565b600080604083850312156123dd57600080fd5b6123e683612297565b946020939093013593505050565b6000806040838503121561240757600080fd5b823567ffffffffffffffff8082111561241f57600080fd5b61242b868387016122b3565b9350602085013591508082111561244157600080fd5b5061244e858286016122b3565b9150509250929050565b60006020828403121561246a57600080fd5b5035919050565b60006020828403121561248357600080fd5b5051919050565b6000806040838503121561249d57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b818110156124d9578581018301518582016040015282016124bd565b818111156124eb576000604083870101525b50601f01601f1916929092016040019392505050565b602080825260139082015272135a5b9d195c8e881b9bdd08185b1b1bddd959606a1b604082015260600190565b60208082526015908201527413dc195c985d1bdc8e881b9bdd08185b1b1bddd959605a1b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f6e657720726174696f2073686f756c64206265206c657373206f7220657175616040820152680d840e8de4062ca62760bb1b606082015260800190565b600080821280156001600160ff1b038490038513161561264b5761264b61275a565b600160ff1b83900384128116156126645761266461275a565b50500190565b6000821982111561267d5761267d61275a565b500190565b60008261269157612691612770565b500490565b60008160001904831182151516156126b0576126b061275a565b500290565b60008083128015600160ff1b8501841216156126d3576126d361275a565b6001600160ff1b03840183138116156126ee576126ee61275a565b50500390565b6000828210156127065761270661275a565b500390565b600181811c9082168061271f57607f821691505b6020821081141561274057634e487b7160e01b600052602260045260246000fd5b50919050565b60008261275557612755612770565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220cc3b75ef023faf67f3cae979f3e97e3123e70dbae51d32ae37ca17c53f89e90064736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c8063686b149c11610182578063c4d66de8116100e9578063dd62ed3e116100a2578063e5683ad91161007c578063e5683ad914610603578063ee03137314610616578063f2fde38b14610629578063f5eb42dc1461063c57600080fd5b8063dd62ed3e146105ca578063e1061bdb146105dd578063e3ec72be146105f057600080fd5b8063c4d66de81461056e578063c814cf8914610581578063ca5c7b9114610594578063d50619cc1461059c578063d8ddf18f146105a4578063dc647e29146105b757600080fd5b806395d89b411161013b57806395d89b41146105075780639dc29fac1461050f578063a457c2d714610522578063a7105e3114610535578063a85374e114610548578063a9059cbb1461055b57600080fd5b8063686b149c146104ad57806370a08231146104c05780637110e76c146104d3578063715018a6146104e657806371ca337d146104ee5780638da5cb5b146104f657600080fd5b80633950935111610226578063583585f4116101df578063583585f41461043c5780635a446215146104655780635dfba1151461047857806362b9739d1461047f5780636406dd5c146104925780636482a22f1461049a57600080fd5b806339509351146103ca57806340c10f19146103dd578063417719bc146103f05780635300afab1461040357806353396d2f1461041657806353735f371461042957600080fd5b80630ed62270116102785780630ed622701461036757806318160ddd1461037a5780631d62f87c1461038257806323b872dd146103955780632a52cd0c146103a8578063313ce567146103bb57600080fd5b806301a46dac146102c057806306394c9b146102dc57806306fdde03146102f157806307ef2a12146103065780630872e9ff14610319578063095ea7b314610344575b600080fd5b6102c960a35481565b6040519081526020015b60405180910390f35b6102ef6102ea366004612340565b61064f565b005b6102f96106a4565b6040516102d391906124ac565b6102ef6103143660046123ca565b610757565b60a15461032c906001600160a01b031681565b6040516001600160a01b0390911681526020016102d3565b6103576103523660046123ca565b6107d1565b60405190151581526020016102d3565b6102ef6103753660046123ca565b61083b565b6102c961094c565b6102ef610390366004612458565b610968565b6103576103a336600461238e565b610997565b6102c96103b6366004612458565b6109fb565b604051601281526020016102d3565b6103576103d83660046123ca565b610a18565b6102ef6103eb3660046123ca565b610a30565b6102c96103fe366004612458565b610aad565b6102ef6104113660046123ca565b610ad9565b6102ef610424366004612340565b610b13565b6102c9610437366004612458565b610b5f565b6102c961044a366004612340565b6001600160a01b03166000908152609c602052604090205490565b6102ef6104733660046123f4565b610b6a565b6001610357565b6102ef61048d366004612458565b610bd5565b609e546102c9565b6102ef6104a8366004612458565b610c9e565b6102ef6104bb3660046123ca565b610cad565b6102c96104ce366004612340565b610cf0565b6102ef6104e1366004612340565b610d27565b6102ef610db3565b609a546102c9565b6033546001600160a01b031661032c565b6102f9610de9565b6102ef61051d3660046123ca565b610e14565b6103576105303660046123ca565b610ea0565b60a25461032c906001600160a01b031681565b6102ef6105563660046123ca565b610eb8565b6103576105693660046123ca565b610f1d565b6102ef61057c366004612340565b610f59565b6102ef61058f36600461248a565b611052565b609b546102c9565b6102c9611181565b6102c96105b2366004612458565b61118c565b6102ef6105c5366004612458565b611197565b6102c96105d836600461235b565b611233565b6102ef6105eb366004612340565b611264565b6102ef6105fe366004612340565b6112e8565b6102ef610611366004612458565b611334565b6102ef610624366004612458565b61135e565b6102ef610637366004612340565b61136a565b6102c961064a366004612340565b611402565b6033546001600160a01b031633146106825760405162461bcd60e51b8152600401610679906125ab565b60405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b6060609f80546106b39061270b565b15905061074a57609f80546106c79061270b565b80601f01602080910402602001604051908101604052809291908181526020018280546106f39061270b565b80156107405780601f1061071557610100808354040283529160200191610740565b820191906000526020600020905b81548152906001019060200180831161072357829003601f168201915b5050505050905090565b610752611420565b905090565b6099546001600160a01b031633146107815760405162461bcd60e51b815260040161067990612501565b6001600160a01b0382166000908152609c60205260409020546107a4908261142f565b6001600160a01b0383166000908152609c6020526040902055609d546107ca908261142f565b609d555050565b6000806107dd8361143b565b90506107e98482611452565b506001600160a01b038416337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256108208288611233565b60405190815260200160405180910390a35060019392505050565b6099546001600160a01b031633146108655760405162461bcd60e51b815260040161067990612501565b6001600160a01b0382166000908152609c6020526040902054818110156108c75760405162461bcd60e51b81526020600482015260166024820152752a37b7903134b39030b6b7bab73a103a3790313ab93760511b6044820152606401610679565b60006108d28361143b565b90506108de8284611468565b6001600160a01b0385166000908152609c6020526040902055609d546109049084611468565b609d556109118482611474565b60006001600160a01b03851660008051602061279d833981519152610935846114e7565b60405190815260200160405180910390a350505050565b600080610957611181565b9050610962816114e7565b91505090565b6033546001600160a01b031633146109925760405162461bcd60e51b8152600401610679906125ab565b609e55565b6000806109a38361143b565b90506109b08585836114fe565b50836001600160a01b0316856001600160a01b031660008051602061279d8339815191526109dd846114e7565b60405190815260200160405180910390a360019150505b9392505050565b6000610a128260a354670de0b6b3a76400006115a8565b92915050565b600080610a248361143b565b90506107e98482611639565b6098546001600160a01b03163314610a5a5760405162461bcd60e51b815260040161067990612501565b609b54610a679082611675565b609b55610a748282611681565b6001600160a01b038216600060008051602061279d833981519152610a98846114e7565b60405190815260200160405180910390a35050565b600080610ab98361118c565b90506000610ac6826109fb565b9050610ad181610b5f565b949350505050565b6099546001600160a01b03163314610b035760405162461bcd60e51b815260040161067990612501565b610b0f828260006116c2565b5050565b6033546001600160a01b03163314610b3d5760405162461bcd60e51b8152600401610679906125ab565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a12826114e7565b6033546001600160a01b0316331480610b8d57506097546001600160a01b031633145b610ba95760405162461bcd60e51b81526004016106799061252e565b8151610bbc90609f9060208501906121fe565b508051610bd09060a09060208401906121fe565b505050565b6033546001600160a01b03163314610bff5760405162461bcd60e51b8152600401610679906125ab565b662386f26fc10000811115610c625760405162461bcd60e51b815260206004820152602360248201527f73776170466565206d757374206265206e6f742067726561746572207468617460448201526220312560e81b6064820152608401610679565b60a38190556040518181527ffd42e9c199a15716921eeaedb024b26ab2b3d12a8a85482e02551dfca60038cb906020015b60405180910390a150565b610caa338260016116c2565b50565b6099546001600160a01b03163314610cd75760405162461bcd60e51b815260040161067990612501565b6000610ce28261118c565b9050610bd083826000611844565b6001600160a01b038116600090815260656020908152604080832054609c9092528220546109f490610d21836114e7565b90611468565b6033546001600160a01b03163314610d515760405162461bcd60e51b8152600401610679906125ab565b60a180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fe06ab7e4de2e7a372c12a4101ea3106a9f4ea8d28d25bdec8f89b41b5841f8a091015b60405180910390a15050565b6033546001600160a01b03163314610ddd5760405162461bcd60e51b8152600401610679906125ab565b610de76000611960565b565b606060a08054610df89061270b565b159050610e0c5760a080546106c79061270b565b6107526119b2565b6098546001600160a01b03163314610e3e5760405162461bcd60e51b815260040161067990612501565b6000610e498261143b565b609b54909150610e5990826119c1565b609b55610e668382611474565b60006001600160a01b03841660008051602061279d833981519152610e8a846114e7565b60405190815260200160405180910390a3505050565b600080610eac8361143b565b90506107e984826119cd565b6099546001600160a01b03163314610ee25760405162461bcd60e51b815260040161067990612501565b6000610eed8261143b565b9050610ef98382611681565b6001600160a01b038316600060008051602061279d833981519152610e8a846114e7565b600080610f298361143b565b9050610f358482611a66565b506001600160a01b0384163360008051602061279d833981519152610820846114e7565b600054610100900460ff1680610f72575060005460ff16155b610f8e5760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff16158015610fb0576000805461ffff19166101011790555b610fb8611a73565b6110166040518060400160405280601e81526020017f416e6b72204d4154494320526577617264204561726e696e6720426f6e6400008152506040518060400160405280600781526020016630a6a0aa24a1b160c91b815250611aee565b609780546001600160a01b0319166001600160a01b038416179055670de0b6b3a7640000609a558015610b0f576000805461ff00191690555050565b6033546001600160a01b031633148061107557506097546001600160a01b031633145b6110915760405162461bcd60e51b81526004016106799061252e565b609a546000906110a3906101f4611b6d565b609a549091506110b3908261142f565b8310806110cb5750609a546110c89082611468565b83115b6111175760405162461bcd60e51b815260206004820152601d60248201527f4e657720726174696f2073686f756c6420626520696e206c696d6974730000006044820152606401610679565b670de0b6b3a764000083111561113f5760405162461bcd60e51b8152600401610679906125e0565b609a839055609e8290556040518381527fb779c97cee7508e970bdead8c3ef0bd16f8c63dbba28fe88f7c7a56722fc564d9060200160405180910390a1505050565b600061075260675490565b6000610a128261143b565b6033546001600160a01b03163314806111ba57506097546001600160a01b031633145b6111d65760405162461bcd60e51b81526004016106799061252e565b670de0b6b3a76400008111156111fe5760405162461bcd60e51b8152600401610679906125e0565b609a8190556040518181527fb779c97cee7508e970bdead8c3ef0bd16f8c63dbba28fe88f7c7a56722fc564d90602001610c93565b6001600160a01b0380831660009081526066602090815260408083209385168352929052908120546109f4906114e7565b6033546001600160a01b0316331461128e5760405162461bcd60e51b8152600401610679906125ab565b60a280546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f64ce71e3ee2d701fb3eddb42d9f04090717d2df15227b715a1068803a85a85be9101610da7565b6033546001600160a01b031633146113125760405162461bcd60e51b8152600401610679906125ab565b609880546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146111fe5760405162461bcd60e51b8152600401610679906125ab565b610caa33826001611844565b6033546001600160a01b031633146113945760405162461bcd60e51b8152600401610679906125ab565b6001600160a01b0381166113f95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610679565b610caa81611960565b6001600160a01b038116600090815260656020526040812054610a12565b6060606880546106c79061270b565b60006109f4828461266a565b6000610a1282609a54670de0b6b3a76400006115a8565b600061145f338484611b79565b50600192915050565b60006109f482846126f4565b61147e8282611c68565b60a154604051632770a7eb60e21b8152306004820152602481018390526001600160a01b0390911690639dc29fac906044015b600060405180830381600087803b1580156114cb57600080fd5b505af11580156114df573d6000803e3d6000fd5b505050505050565b6000610a1282670de0b6b3a7640000609a54611d7b565b600061150b848484611dcb565b6001600160a01b0384166000908152606660209081526040808320338452909152902054828110156115905760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610679565b61159d8533858403611b79565b506001949350505050565b6000806115b58584611f4b565b905060006115c38685611b6d565b905060006115d18287611f57565b92509050806115e75760001993505050506109f4565b6116196116128661160c6115fc826001611468565b611606888c611f9f565b9061142f565b90611b6d565b8390611fab565b925090508061162f5760001993505050506109f4565b5095945050505050565b3360008181526066602090815260408083206001600160a01b0387168452909152812054909161145f91859061167090869061266a565b611b79565b60006109f482846126b5565b61168b8282611fc6565b60a1546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f19906044016114b1565b60a1546040516370a0823160e01b81526001600160a01b038581166004830152849216906370a082319060240160206040518083038186803b15801561170757600080fd5b505afa15801561171b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173f9190612471565b101561178d5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420614d41544943632062616c616e6365000000006044820152606401610679565b600081156117a15761179e836109fb565b90505b60a154604051634bc3f6e960e01b81526001600160a01b0386811660048301526024820186905290911690634bc3f6e990604401600060405180830381600087803b1580156117ef57600080fd5b505af1158015611803573d6000803e3d6000fd5b5050505061181d3085838661181891906126f4565b612066565b50801561183e5760a25461183c9030906001600160a01b031683612066565b505b50505050565b8161184e84611402565b101561189c5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420614d41544943622062616c616e6365000000006044820152606401610679565b600081156118b0576118ad836109fb565b90505b6118bf843061181884876126f4565b5080156118e05760a2546118de9085906001600160a01b031683612066565b505b60a1546001600160a01b0316636e6e273e856118fc84876126f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561194257600080fd5b505af1158015611956573d6000803e3d6000fd5b5050505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060606980546106c79061270b565b60006109f48284612629565b3360009081526066602090815260408083206001600160a01b038616845290915281205482811015611a4f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610679565b611a5c3385858403611b79565b5060019392505050565b600061145f338484611dcb565b600054610100900460ff1680611a8c575060005460ff16155b611aa85760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff16158015611aca576000805461ffff19166101011790555b611ad261209f565b611ada612109565b8015610caa576000805461ff001916905550565b600054610100900460ff1680611b07575060005460ff16155b611b235760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff16158015611b45576000805461ffff19166101011790555b611b4d61209f565b611b578383612169565b8015610bd0576000805461ff0019169055505050565b60006109f48284612682565b6001600160a01b038316611bdb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610679565b6001600160a01b038216611c3c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610679565b6001600160a01b0392831660009081526066602090815260408083209490951682529290925291902055565b6001600160a01b038216611cc85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610679565b6001600160a01b03821660009081526065602052604090205481811015611d3c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610679565b6001600160a01b0383166000908152606560205260408120838303905560678054849290611d6b9084906126f4565b90915550610bd090508360008483565b600080611d888584611f4b565b90506000611d968685611b6d565b90506000611da48287611f57565b9250905080611dba5760001993505050506109f4565b6116196116128661160c868a611f9f565b6001600160a01b038316611e2f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610679565b6001600160a01b038216611e915760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610679565b6001600160a01b03831660009081526065602052604090205481811015611f095760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610679565b6001600160a01b03808516600090815260656020526040808220858503905591851681529081208054849290611f4090849061266a565b9091555061183e9050565b60006109f48284612746565b60008083611f6b5750600190506000611f98565b83830283858281611f7e57611f7e612770565b0414611f91576000809250925050611f98565b6001925090505b9250929050565b60006109f48284612696565b60008083830184811015611f91576000809250925050611f98565b6001600160a01b03821661201c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610679565b806067600082825461202e919061266a565b90915550506001600160a01b0382166000908152606560205260408120805483929061205b90849061266a565b90915550610b0f9050565b6000612073848484611dcb565b826001600160a01b0316846001600160a01b031660008051602061279d833981519152610820856114e7565b600054610100900460ff16806120b8575060005460ff16155b6120d45760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff16158015611ada576000805461ffff19166101011790558015610caa576000805461ff001916905550565b600054610100900460ff1680612122575060005460ff16155b61213e5760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff16158015612160576000805461ffff19166101011790555b611ada33611960565b600054610100900460ff1680612182575060005460ff16155b61219e5760405162461bcd60e51b81526004016106799061255d565b600054610100900460ff161580156121c0576000805461ffff19166101011790555b82516121d39060689060208601906121fe565b5081516121e79060699060208501906121fe565b508015610bd0576000805461ff0019169055505050565b82805461220a9061270b565b90600052602060002090601f01602090048101928261222c5760008555612272565b82601f1061224557805160ff1916838001178555612272565b82800160010185558215612272579182015b82811115612272578251825591602001919060010190612257565b5061227e929150612282565b5090565b5b8082111561227e5760008155600101612283565b80356001600160a01b03811681146122ae57600080fd5b919050565b600082601f8301126122c457600080fd5b813567ffffffffffffffff808211156122df576122df612786565b604051601f8301601f19908116603f0116810190828211818310171561230757612307612786565b8160405283815286602085880101111561232057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561235257600080fd5b6109f482612297565b6000806040838503121561236e57600080fd5b61237783612297565b915061238560208401612297565b90509250929050565b6000806000606084860312156123a357600080fd5b6123ac84612297565b92506123ba60208501612297565b9150604084013590509250925092565b600080604083850312156123dd57600080fd5b6123e683612297565b946020939093013593505050565b6000806040838503121561240757600080fd5b823567ffffffffffffffff8082111561241f57600080fd5b61242b868387016122b3565b9350602085013591508082111561244157600080fd5b5061244e858286016122b3565b9150509250929050565b60006020828403121561246a57600080fd5b5035919050565b60006020828403121561248357600080fd5b5051919050565b6000806040838503121561249d57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b818110156124d9578581018301518582016040015282016124bd565b818111156124eb576000604083870101525b50601f01601f1916929092016040019392505050565b602080825260139082015272135a5b9d195c8e881b9bdd08185b1b1bddd959606a1b604082015260600190565b60208082526015908201527413dc195c985d1bdc8e881b9bdd08185b1b1bddd959605a1b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f6e657720726174696f2073686f756c64206265206c657373206f7220657175616040820152680d840e8de4062ca62760bb1b606082015260800190565b600080821280156001600160ff1b038490038513161561264b5761264b61275a565b600160ff1b83900384128116156126645761266461275a565b50500190565b6000821982111561267d5761267d61275a565b500190565b60008261269157612691612770565b500490565b60008160001904831182151516156126b0576126b061275a565b500290565b60008083128015600160ff1b8501841216156126d3576126d361275a565b6001600160ff1b03840183138116156126ee576126ee61275a565b50500390565b6000828210156127065761270661275a565b500390565b600181811c9082168061271f57607f821691505b6020821081141561274057634e487b7160e01b600052602260045260246000fd5b50919050565b60008261275557612755612770565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220cc3b75ef023faf67f3cae979f3e97e3123e70dbae51d32ae37ca17c53f89e90064736f6c63430008060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.