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
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14762159 | 887 days ago | IN | 0 ETH | 0.3210585 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
aMATICb_R4
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_R4 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 == owner() || msg.sender == _crossChainBridge, "Minter: not allowed"); _; } modifier onlyBondMinter() { require(msg.sender == owner() || 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
608060405234801561001057600080fd5b50612885806100206000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c8063686b149c11610182578063c4d66de8116100e9578063dd62ed3e116100a2578063e5683ad91161007c578063e5683ad914610603578063ee03137314610616578063f2fde38b14610629578063f5eb42dc1461063c57600080fd5b8063dd62ed3e146105ca578063e1061bdb146105dd578063e3ec72be146105f057600080fd5b8063c4d66de81461056e578063c814cf8914610581578063ca5c7b9114610594578063d50619cc1461059c578063d8ddf18f146105a4578063dc647e29146105b757600080fd5b806395d89b411161013b57806395d89b41146105075780639dc29fac1461050f578063a457c2d714610522578063a7105e3114610535578063a85374e114610548578063a9059cbb1461055b57600080fd5b8063686b149c146104ad57806370a08231146104c05780637110e76c146104d3578063715018a6146104e657806371ca337d146104ee5780638da5cb5b146104f657600080fd5b80633950935111610226578063583585f4116101df578063583585f41461043c5780635a446215146104655780635dfba1151461047857806362b9739d1461047f5780636406dd5c146104925780636482a22f1461049a57600080fd5b806339509351146103ca57806340c10f19146103dd578063417719bc146103f05780635300afab1461040357806353396d2f1461041657806353735f371461042957600080fd5b80630ed62270116102785780630ed622701461036757806318160ddd1461037a5780631d62f87c1461038257806323b872dd146103955780632a52cd0c146103a8578063313ce567146103bb57600080fd5b806301a46dac146102c057806306394c9b146102dc57806306fdde03146102f157806307ef2a12146103065780630872e9ff14610319578063095ea7b314610344575b600080fd5b6102c960a35481565b6040519081526020015b60405180910390f35b6102ef6102ea3660046123d3565b61064f565b005b6102f96106a4565b6040516102d3919061253f565b6102ef61031436600461245d565b610757565b60a15461032c906001600160a01b031681565b6040516001600160a01b0390911681526020016102d3565b61035761035236600461245d565b6107e6565b60405190151581526020016102d3565b6102ef61037536600461245d565b610850565b6102c9610976565b6102ef6103903660046124eb565b610992565b6103576103a3366004612421565b6109c1565b6102c96103b63660046124eb565b610a25565b604051601281526020016102d3565b6103576103d836600461245d565b610a42565b6102ef6103eb36600461245d565b610a5a565b6102c96103fe3660046124eb565b610aec565b6102ef61041136600461245d565b610b18565b6102ef6104243660046123d3565b610b67565b6102c96104373660046124eb565b610bb3565b6102c961044a3660046123d3565b6001600160a01b03166000908152609c602052604090205490565b6102ef610473366004612487565b610bbe565b6001610357565b6102ef61048d3660046124eb565b610c29565b609e546102c9565b6102ef6104a83660046124eb565b610cf2565b6102ef6104bb36600461245d565b610d01565b6102c96104ce3660046123d3565b610d59565b6102ef6104e13660046123d3565b610d90565b6102ef610e1c565b609a546102c9565b6033546001600160a01b031661032c565b6102f9610e52565b6102ef61051d36600461245d565b610e7d565b61035761053036600461245d565b610f1e565b60a25461032c906001600160a01b031681565b6102ef61055636600461245d565b610f36565b61035761056936600461245d565b610fb0565b6102ef61057c3660046123d3565b610fec565b6102ef61058f36600461251d565b6110e5565b609b546102c9565b6102c9611214565b6102c96105b23660046124eb565b61121f565b6102ef6105c53660046124eb565b61122a565b6102c96105d83660046123ee565b6112c6565b6102ef6105eb3660046123d3565b6112f7565b6102ef6105fe3660046123d3565b61137b565b6102ef6106113660046124eb565b6113c7565b6102ef6106243660046124eb565b6113f1565b6102ef6106373660046123d3565b6113fd565b6102c961064a3660046123d3565b611495565b6033546001600160a01b031633146106825760405162461bcd60e51b81526004016106799061263e565b60405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b6060609f80546106b39061279e565b15905061074a57609f80546106c79061279e565b80601f01602080910402602001604051908101604052809291908181526020018280546106f39061279e565b80156107405780601f1061071557610100808354040283529160200191610740565b820191906000526020600020905b81548152906001019060200180831161072357829003601f168201915b5050505050905090565b6107526114b3565b905090565b6033546001600160a01b031633148061077a57506099546001600160a01b031633145b6107965760405162461bcd60e51b815260040161067990612594565b6001600160a01b0382166000908152609c60205260409020546107b990826114c2565b6001600160a01b0383166000908152609c6020526040902055609d546107df90826114c2565b609d555050565b6000806107f2836114ce565b90506107fe84826114e5565b506001600160a01b038416337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561083582886112c6565b60405190815260200160405180910390a35060019392505050565b6033546001600160a01b031633148061087357506099546001600160a01b031633145b61088f5760405162461bcd60e51b815260040161067990612594565b6001600160a01b0382166000908152609c6020526040902054818110156108f15760405162461bcd60e51b81526020600482015260166024820152752a37b7903134b39030b6b7bab73a103a3790313ab93760511b6044820152606401610679565b60006108fc836114ce565b905061090882846114fb565b6001600160a01b0385166000908152609c6020526040902055609d5461092e90846114fb565b609d5561093b8482611507565b60006001600160a01b03851660008051602061283083398151915261095f8461157a565b60405190815260200160405180910390a350505050565b600080610981611214565b905061098c8161157a565b91505090565b6033546001600160a01b031633146109bc5760405162461bcd60e51b81526004016106799061263e565b609e55565b6000806109cd836114ce565b90506109da858583611591565b50836001600160a01b0316856001600160a01b0316600080516020612830833981519152610a078461157a565b60405190815260200160405180910390a360019150505b9392505050565b6000610a3c8260a354670de0b6b3a764000061163b565b92915050565b600080610a4e836114ce565b90506107fe84826116cc565b6033546001600160a01b0316331480610a7d57506098546001600160a01b031633145b610a995760405162461bcd60e51b815260040161067990612594565b609b54610aa69082611708565b609b55610ab38282611714565b6001600160a01b0382166000600080516020612830833981519152610ad78461157a565b60405190815260200160405180910390a35050565b600080610af88361121f565b90506000610b0582610a25565b9050610b1081610bb3565b949350505050565b6033546001600160a01b0316331480610b3b57506099546001600160a01b031633145b610b575760405162461bcd60e51b815260040161067990612594565b610b6382826000611755565b5050565b6033546001600160a01b03163314610b915760405162461bcd60e51b81526004016106799061263e565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a3c8261157a565b6033546001600160a01b0316331480610be157506097546001600160a01b031633145b610bfd5760405162461bcd60e51b8152600401610679906125c1565b8151610c1090609f906020850190612291565b508051610c249060a0906020840190612291565b505050565b6033546001600160a01b03163314610c535760405162461bcd60e51b81526004016106799061263e565b662386f26fc10000811115610cb65760405162461bcd60e51b815260206004820152602360248201527f73776170466565206d757374206265206e6f742067726561746572207468617460448201526220312560e81b6064820152608401610679565b60a38190556040518181527ffd42e9c199a15716921eeaedb024b26ab2b3d12a8a85482e02551dfca60038cb906020015b60405180910390a150565b610cfe33826001611755565b50565b6033546001600160a01b0316331480610d2457506099546001600160a01b031633145b610d405760405162461bcd60e51b815260040161067990612594565b6000610d4b8261121f565b9050610c24838260006118d7565b6001600160a01b038116600090815260656020908152604080832054609c909252822054610a1e90610d8a8361157a565b906114fb565b6033546001600160a01b03163314610dba5760405162461bcd60e51b81526004016106799061263e565b60a180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fe06ab7e4de2e7a372c12a4101ea3106a9f4ea8d28d25bdec8f89b41b5841f8a091015b60405180910390a15050565b6033546001600160a01b03163314610e465760405162461bcd60e51b81526004016106799061263e565b610e5060006119f3565b565b606060a08054610e619061279e565b159050610e755760a080546106c79061279e565b610752611a45565b6033546001600160a01b0316331480610ea057506098546001600160a01b031633145b610ebc5760405162461bcd60e51b815260040161067990612594565b6000610ec7826114ce565b609b54909150610ed79082611a54565b609b55610ee48382611507565b60006001600160a01b038416600080516020612830833981519152610f088461157a565b60405190815260200160405180910390a3505050565b600080610f2a836114ce565b90506107fe8482611a60565b6033546001600160a01b0316331480610f5957506099546001600160a01b031633145b610f755760405162461bcd60e51b815260040161067990612594565b6000610f80826114ce565b9050610f8c8382611714565b6001600160a01b0383166000600080516020612830833981519152610f088461157a565b600080610fbc836114ce565b9050610fc88482611af9565b506001600160a01b038416336000805160206128308339815191526108358461157a565b600054610100900460ff1680611005575060005460ff16155b6110215760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff16158015611043576000805461ffff19166101011790555b61104b611b06565b6110a96040518060400160405280601e81526020017f416e6b72204d4154494320526577617264204561726e696e6720426f6e6400008152506040518060400160405280600781526020016630a6a0aa24a1b160c91b815250611b81565b609780546001600160a01b0319166001600160a01b038416179055670de0b6b3a7640000609a558015610b63576000805461ff00191690555050565b6033546001600160a01b031633148061110857506097546001600160a01b031633145b6111245760405162461bcd60e51b8152600401610679906125c1565b609a54600090611136906101f4611c00565b609a5490915061114690826114c2565b83108061115e5750609a5461115b90826114fb565b83115b6111aa5760405162461bcd60e51b815260206004820152601d60248201527f4e657720726174696f2073686f756c6420626520696e206c696d6974730000006044820152606401610679565b670de0b6b3a76400008311156111d25760405162461bcd60e51b815260040161067990612673565b609a839055609e8290556040518381527fb779c97cee7508e970bdead8c3ef0bd16f8c63dbba28fe88f7c7a56722fc564d9060200160405180910390a1505050565b600061075260675490565b6000610a3c826114ce565b6033546001600160a01b031633148061124d57506097546001600160a01b031633145b6112695760405162461bcd60e51b8152600401610679906125c1565b670de0b6b3a76400008111156112915760405162461bcd60e51b815260040161067990612673565b609a8190556040518181527fb779c97cee7508e970bdead8c3ef0bd16f8c63dbba28fe88f7c7a56722fc564d90602001610ce7565b6001600160a01b038083166000908152606660209081526040808320938516835292905290812054610a1e9061157a565b6033546001600160a01b031633146113215760405162461bcd60e51b81526004016106799061263e565b60a280546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f64ce71e3ee2d701fb3eddb42d9f04090717d2df15227b715a1068803a85a85be9101610e10565b6033546001600160a01b031633146113a55760405162461bcd60e51b81526004016106799061263e565b609880546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146112915760405162461bcd60e51b81526004016106799061263e565b610cfe338260016118d7565b6033546001600160a01b031633146114275760405162461bcd60e51b81526004016106799061263e565b6001600160a01b03811661148c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610679565b610cfe816119f3565b6001600160a01b038116600090815260656020526040812054610a3c565b6060606880546106c79061279e565b6000610a1e82846126fd565b6000610a3c82609a54670de0b6b3a764000061163b565b60006114f2338484611c0c565b50600192915050565b6000610a1e8284612787565b6115118282611cfb565b60a154604051632770a7eb60e21b8152306004820152602481018390526001600160a01b0390911690639dc29fac906044015b600060405180830381600087803b15801561155e57600080fd5b505af1158015611572573d6000803e3d6000fd5b505050505050565b6000610a3c82670de0b6b3a7640000609a54611e0e565b600061159e848484611e5e565b6001600160a01b0384166000908152606660209081526040808320338452909152902054828110156116235760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610679565b6116308533858403611c0c565b506001949350505050565b6000806116488584611fde565b905060006116568685611c00565b905060006116648287611fea565b925090508061167a576000199350505050610a1e565b6116ac6116a58661169f61168f8260016114fb565b611699888c612032565b906114c2565b90611c00565b839061203e565b92509050806116c2576000199350505050610a1e565b5095945050505050565b3360008181526066602090815260408083206001600160a01b038716845290915281205490916114f29185906117039086906126fd565b611c0c565b6000610a1e8284612748565b61171e8282612059565b60a1546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f1990604401611544565b60a1546040516370a0823160e01b81526001600160a01b038581166004830152849216906370a082319060240160206040518083038186803b15801561179a57600080fd5b505afa1580156117ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d29190612504565b10156118205760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420614d41544943632062616c616e6365000000006044820152606401610679565b600081156118345761183183610a25565b90505b60a154604051634bc3f6e960e01b81526001600160a01b0386811660048301526024820186905290911690634bc3f6e990604401600060405180830381600087803b15801561188257600080fd5b505af1158015611896573d6000803e3d6000fd5b505050506118b0308583866118ab9190612787565b6120f9565b5080156118d15760a2546118cf9030906001600160a01b0316836120f9565b505b50505050565b816118e184611495565b101561192f5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420614d41544943622062616c616e6365000000006044820152606401610679565b600081156119435761194083610a25565b90505b61195284306118ab8487612787565b5080156119735760a2546119719085906001600160a01b0316836120f9565b505b60a1546001600160a01b0316636e6e273e8561198f8487612787565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156119d557600080fd5b505af11580156119e9573d6000803e3d6000fd5b5050505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060606980546106c79061279e565b6000610a1e82846126bc565b3360009081526066602090815260408083206001600160a01b038616845290915281205482811015611ae25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610679565b611aef3385858403611c0c565b5060019392505050565b60006114f2338484611e5e565b600054610100900460ff1680611b1f575060005460ff16155b611b3b5760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff16158015611b5d576000805461ffff19166101011790555b611b65612132565b611b6d61219c565b8015610cfe576000805461ff001916905550565b600054610100900460ff1680611b9a575060005460ff16155b611bb65760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff16158015611bd8576000805461ffff19166101011790555b611be0612132565b611bea83836121fc565b8015610c24576000805461ff0019169055505050565b6000610a1e8284612715565b6001600160a01b038316611c6e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610679565b6001600160a01b038216611ccf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610679565b6001600160a01b0392831660009081526066602090815260408083209490951682529290925291902055565b6001600160a01b038216611d5b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610679565b6001600160a01b03821660009081526065602052604090205481811015611dcf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610679565b6001600160a01b0383166000908152606560205260408120838303905560678054849290611dfe908490612787565b90915550610c2490508360008483565b600080611e1b8584611fde565b90506000611e298685611c00565b90506000611e378287611fea565b9250905080611e4d576000199350505050610a1e565b6116ac6116a58661169f868a612032565b6001600160a01b038316611ec25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610679565b6001600160a01b038216611f245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610679565b6001600160a01b03831660009081526065602052604090205481811015611f9c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610679565b6001600160a01b03808516600090815260656020526040808220858503905591851681529081208054849290611fd39084906126fd565b909155506118d19050565b6000610a1e82846127d9565b60008083611ffe575060019050600061202b565b8383028385828161201157612011612803565b041461202457600080925092505061202b565b6001925090505b9250929050565b6000610a1e8284612729565b6000808383018481101561202457600080925092505061202b565b6001600160a01b0382166120af5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610679565b80606760008282546120c191906126fd565b90915550506001600160a01b038216600090815260656020526040812080548392906120ee9084906126fd565b90915550610b639050565b6000612106848484611e5e565b826001600160a01b0316846001600160a01b03166000805160206128308339815191526108358561157a565b600054610100900460ff168061214b575060005460ff16155b6121675760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff16158015611b6d576000805461ffff19166101011790558015610cfe576000805461ff001916905550565b600054610100900460ff16806121b5575060005460ff16155b6121d15760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff161580156121f3576000805461ffff19166101011790555b611b6d336119f3565b600054610100900460ff1680612215575060005460ff16155b6122315760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff16158015612253576000805461ffff19166101011790555b8251612266906068906020860190612291565b50815161227a906069906020850190612291565b508015610c24576000805461ff0019169055505050565b82805461229d9061279e565b90600052602060002090601f0160209004810192826122bf5760008555612305565b82601f106122d857805160ff1916838001178555612305565b82800160010185558215612305579182015b828111156123055782518255916020019190600101906122ea565b50612311929150612315565b5090565b5b808211156123115760008155600101612316565b80356001600160a01b038116811461234157600080fd5b919050565b600082601f83011261235757600080fd5b813567ffffffffffffffff8082111561237257612372612819565b604051601f8301601f19908116603f0116810190828211818310171561239a5761239a612819565b816040528381528660208588010111156123b357600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156123e557600080fd5b610a1e8261232a565b6000806040838503121561240157600080fd5b61240a8361232a565b91506124186020840161232a565b90509250929050565b60008060006060848603121561243657600080fd5b61243f8461232a565b925061244d6020850161232a565b9150604084013590509250925092565b6000806040838503121561247057600080fd5b6124798361232a565b946020939093013593505050565b6000806040838503121561249a57600080fd5b823567ffffffffffffffff808211156124b257600080fd5b6124be86838701612346565b935060208501359150808211156124d457600080fd5b506124e185828601612346565b9150509250929050565b6000602082840312156124fd57600080fd5b5035919050565b60006020828403121561251657600080fd5b5051919050565b6000806040838503121561253057600080fd5b50508035926020909101359150565b600060208083528351808285015260005b8181101561256c57858101830151858201604001528201612550565b8181111561257e576000604083870101525b50601f01601f1916929092016040019392505050565b602080825260139082015272135a5b9d195c8e881b9bdd08185b1b1bddd959606a1b604082015260600190565b60208082526015908201527413dc195c985d1bdc8e881b9bdd08185b1b1bddd959605a1b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f6e657720726174696f2073686f756c64206265206c657373206f7220657175616040820152680d840e8de4062ca62760bb1b606082015260800190565b600080821280156001600160ff1b03849003851316156126de576126de6127ed565b600160ff1b83900384128116156126f7576126f76127ed565b50500190565b60008219821115612710576127106127ed565b500190565b60008261272457612724612803565b500490565b6000816000190483118215151615612743576127436127ed565b500290565b60008083128015600160ff1b850184121615612766576127666127ed565b6001600160ff1b0384018313811615612781576127816127ed565b50500390565b600082821015612799576127996127ed565b500390565b600181811c908216806127b257607f821691505b602082108114156127d357634e487b7160e01b600052602260045260246000fd5b50919050565b6000826127e8576127e8612803565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a3657e7e5d49b4966b66ee410798bc92726fcfe797a0f234d434d7d505e5f82464736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c8063686b149c11610182578063c4d66de8116100e9578063dd62ed3e116100a2578063e5683ad91161007c578063e5683ad914610603578063ee03137314610616578063f2fde38b14610629578063f5eb42dc1461063c57600080fd5b8063dd62ed3e146105ca578063e1061bdb146105dd578063e3ec72be146105f057600080fd5b8063c4d66de81461056e578063c814cf8914610581578063ca5c7b9114610594578063d50619cc1461059c578063d8ddf18f146105a4578063dc647e29146105b757600080fd5b806395d89b411161013b57806395d89b41146105075780639dc29fac1461050f578063a457c2d714610522578063a7105e3114610535578063a85374e114610548578063a9059cbb1461055b57600080fd5b8063686b149c146104ad57806370a08231146104c05780637110e76c146104d3578063715018a6146104e657806371ca337d146104ee5780638da5cb5b146104f657600080fd5b80633950935111610226578063583585f4116101df578063583585f41461043c5780635a446215146104655780635dfba1151461047857806362b9739d1461047f5780636406dd5c146104925780636482a22f1461049a57600080fd5b806339509351146103ca57806340c10f19146103dd578063417719bc146103f05780635300afab1461040357806353396d2f1461041657806353735f371461042957600080fd5b80630ed62270116102785780630ed622701461036757806318160ddd1461037a5780631d62f87c1461038257806323b872dd146103955780632a52cd0c146103a8578063313ce567146103bb57600080fd5b806301a46dac146102c057806306394c9b146102dc57806306fdde03146102f157806307ef2a12146103065780630872e9ff14610319578063095ea7b314610344575b600080fd5b6102c960a35481565b6040519081526020015b60405180910390f35b6102ef6102ea3660046123d3565b61064f565b005b6102f96106a4565b6040516102d3919061253f565b6102ef61031436600461245d565b610757565b60a15461032c906001600160a01b031681565b6040516001600160a01b0390911681526020016102d3565b61035761035236600461245d565b6107e6565b60405190151581526020016102d3565b6102ef61037536600461245d565b610850565b6102c9610976565b6102ef6103903660046124eb565b610992565b6103576103a3366004612421565b6109c1565b6102c96103b63660046124eb565b610a25565b604051601281526020016102d3565b6103576103d836600461245d565b610a42565b6102ef6103eb36600461245d565b610a5a565b6102c96103fe3660046124eb565b610aec565b6102ef61041136600461245d565b610b18565b6102ef6104243660046123d3565b610b67565b6102c96104373660046124eb565b610bb3565b6102c961044a3660046123d3565b6001600160a01b03166000908152609c602052604090205490565b6102ef610473366004612487565b610bbe565b6001610357565b6102ef61048d3660046124eb565b610c29565b609e546102c9565b6102ef6104a83660046124eb565b610cf2565b6102ef6104bb36600461245d565b610d01565b6102c96104ce3660046123d3565b610d59565b6102ef6104e13660046123d3565b610d90565b6102ef610e1c565b609a546102c9565b6033546001600160a01b031661032c565b6102f9610e52565b6102ef61051d36600461245d565b610e7d565b61035761053036600461245d565b610f1e565b60a25461032c906001600160a01b031681565b6102ef61055636600461245d565b610f36565b61035761056936600461245d565b610fb0565b6102ef61057c3660046123d3565b610fec565b6102ef61058f36600461251d565b6110e5565b609b546102c9565b6102c9611214565b6102c96105b23660046124eb565b61121f565b6102ef6105c53660046124eb565b61122a565b6102c96105d83660046123ee565b6112c6565b6102ef6105eb3660046123d3565b6112f7565b6102ef6105fe3660046123d3565b61137b565b6102ef6106113660046124eb565b6113c7565b6102ef6106243660046124eb565b6113f1565b6102ef6106373660046123d3565b6113fd565b6102c961064a3660046123d3565b611495565b6033546001600160a01b031633146106825760405162461bcd60e51b81526004016106799061263e565b60405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b6060609f80546106b39061279e565b15905061074a57609f80546106c79061279e565b80601f01602080910402602001604051908101604052809291908181526020018280546106f39061279e565b80156107405780601f1061071557610100808354040283529160200191610740565b820191906000526020600020905b81548152906001019060200180831161072357829003601f168201915b5050505050905090565b6107526114b3565b905090565b6033546001600160a01b031633148061077a57506099546001600160a01b031633145b6107965760405162461bcd60e51b815260040161067990612594565b6001600160a01b0382166000908152609c60205260409020546107b990826114c2565b6001600160a01b0383166000908152609c6020526040902055609d546107df90826114c2565b609d555050565b6000806107f2836114ce565b90506107fe84826114e5565b506001600160a01b038416337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561083582886112c6565b60405190815260200160405180910390a35060019392505050565b6033546001600160a01b031633148061087357506099546001600160a01b031633145b61088f5760405162461bcd60e51b815260040161067990612594565b6001600160a01b0382166000908152609c6020526040902054818110156108f15760405162461bcd60e51b81526020600482015260166024820152752a37b7903134b39030b6b7bab73a103a3790313ab93760511b6044820152606401610679565b60006108fc836114ce565b905061090882846114fb565b6001600160a01b0385166000908152609c6020526040902055609d5461092e90846114fb565b609d5561093b8482611507565b60006001600160a01b03851660008051602061283083398151915261095f8461157a565b60405190815260200160405180910390a350505050565b600080610981611214565b905061098c8161157a565b91505090565b6033546001600160a01b031633146109bc5760405162461bcd60e51b81526004016106799061263e565b609e55565b6000806109cd836114ce565b90506109da858583611591565b50836001600160a01b0316856001600160a01b0316600080516020612830833981519152610a078461157a565b60405190815260200160405180910390a360019150505b9392505050565b6000610a3c8260a354670de0b6b3a764000061163b565b92915050565b600080610a4e836114ce565b90506107fe84826116cc565b6033546001600160a01b0316331480610a7d57506098546001600160a01b031633145b610a995760405162461bcd60e51b815260040161067990612594565b609b54610aa69082611708565b609b55610ab38282611714565b6001600160a01b0382166000600080516020612830833981519152610ad78461157a565b60405190815260200160405180910390a35050565b600080610af88361121f565b90506000610b0582610a25565b9050610b1081610bb3565b949350505050565b6033546001600160a01b0316331480610b3b57506099546001600160a01b031633145b610b575760405162461bcd60e51b815260040161067990612594565b610b6382826000611755565b5050565b6033546001600160a01b03163314610b915760405162461bcd60e51b81526004016106799061263e565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a3c8261157a565b6033546001600160a01b0316331480610be157506097546001600160a01b031633145b610bfd5760405162461bcd60e51b8152600401610679906125c1565b8151610c1090609f906020850190612291565b508051610c249060a0906020840190612291565b505050565b6033546001600160a01b03163314610c535760405162461bcd60e51b81526004016106799061263e565b662386f26fc10000811115610cb65760405162461bcd60e51b815260206004820152602360248201527f73776170466565206d757374206265206e6f742067726561746572207468617460448201526220312560e81b6064820152608401610679565b60a38190556040518181527ffd42e9c199a15716921eeaedb024b26ab2b3d12a8a85482e02551dfca60038cb906020015b60405180910390a150565b610cfe33826001611755565b50565b6033546001600160a01b0316331480610d2457506099546001600160a01b031633145b610d405760405162461bcd60e51b815260040161067990612594565b6000610d4b8261121f565b9050610c24838260006118d7565b6001600160a01b038116600090815260656020908152604080832054609c909252822054610a1e90610d8a8361157a565b906114fb565b6033546001600160a01b03163314610dba5760405162461bcd60e51b81526004016106799061263e565b60a180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fe06ab7e4de2e7a372c12a4101ea3106a9f4ea8d28d25bdec8f89b41b5841f8a091015b60405180910390a15050565b6033546001600160a01b03163314610e465760405162461bcd60e51b81526004016106799061263e565b610e5060006119f3565b565b606060a08054610e619061279e565b159050610e755760a080546106c79061279e565b610752611a45565b6033546001600160a01b0316331480610ea057506098546001600160a01b031633145b610ebc5760405162461bcd60e51b815260040161067990612594565b6000610ec7826114ce565b609b54909150610ed79082611a54565b609b55610ee48382611507565b60006001600160a01b038416600080516020612830833981519152610f088461157a565b60405190815260200160405180910390a3505050565b600080610f2a836114ce565b90506107fe8482611a60565b6033546001600160a01b0316331480610f5957506099546001600160a01b031633145b610f755760405162461bcd60e51b815260040161067990612594565b6000610f80826114ce565b9050610f8c8382611714565b6001600160a01b0383166000600080516020612830833981519152610f088461157a565b600080610fbc836114ce565b9050610fc88482611af9565b506001600160a01b038416336000805160206128308339815191526108358461157a565b600054610100900460ff1680611005575060005460ff16155b6110215760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff16158015611043576000805461ffff19166101011790555b61104b611b06565b6110a96040518060400160405280601e81526020017f416e6b72204d4154494320526577617264204561726e696e6720426f6e6400008152506040518060400160405280600781526020016630a6a0aa24a1b160c91b815250611b81565b609780546001600160a01b0319166001600160a01b038416179055670de0b6b3a7640000609a558015610b63576000805461ff00191690555050565b6033546001600160a01b031633148061110857506097546001600160a01b031633145b6111245760405162461bcd60e51b8152600401610679906125c1565b609a54600090611136906101f4611c00565b609a5490915061114690826114c2565b83108061115e5750609a5461115b90826114fb565b83115b6111aa5760405162461bcd60e51b815260206004820152601d60248201527f4e657720726174696f2073686f756c6420626520696e206c696d6974730000006044820152606401610679565b670de0b6b3a76400008311156111d25760405162461bcd60e51b815260040161067990612673565b609a839055609e8290556040518381527fb779c97cee7508e970bdead8c3ef0bd16f8c63dbba28fe88f7c7a56722fc564d9060200160405180910390a1505050565b600061075260675490565b6000610a3c826114ce565b6033546001600160a01b031633148061124d57506097546001600160a01b031633145b6112695760405162461bcd60e51b8152600401610679906125c1565b670de0b6b3a76400008111156112915760405162461bcd60e51b815260040161067990612673565b609a8190556040518181527fb779c97cee7508e970bdead8c3ef0bd16f8c63dbba28fe88f7c7a56722fc564d90602001610ce7565b6001600160a01b038083166000908152606660209081526040808320938516835292905290812054610a1e9061157a565b6033546001600160a01b031633146113215760405162461bcd60e51b81526004016106799061263e565b60a280546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f64ce71e3ee2d701fb3eddb42d9f04090717d2df15227b715a1068803a85a85be9101610e10565b6033546001600160a01b031633146113a55760405162461bcd60e51b81526004016106799061263e565b609880546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146112915760405162461bcd60e51b81526004016106799061263e565b610cfe338260016118d7565b6033546001600160a01b031633146114275760405162461bcd60e51b81526004016106799061263e565b6001600160a01b03811661148c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610679565b610cfe816119f3565b6001600160a01b038116600090815260656020526040812054610a3c565b6060606880546106c79061279e565b6000610a1e82846126fd565b6000610a3c82609a54670de0b6b3a764000061163b565b60006114f2338484611c0c565b50600192915050565b6000610a1e8284612787565b6115118282611cfb565b60a154604051632770a7eb60e21b8152306004820152602481018390526001600160a01b0390911690639dc29fac906044015b600060405180830381600087803b15801561155e57600080fd5b505af1158015611572573d6000803e3d6000fd5b505050505050565b6000610a3c82670de0b6b3a7640000609a54611e0e565b600061159e848484611e5e565b6001600160a01b0384166000908152606660209081526040808320338452909152902054828110156116235760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610679565b6116308533858403611c0c565b506001949350505050565b6000806116488584611fde565b905060006116568685611c00565b905060006116648287611fea565b925090508061167a576000199350505050610a1e565b6116ac6116a58661169f61168f8260016114fb565b611699888c612032565b906114c2565b90611c00565b839061203e565b92509050806116c2576000199350505050610a1e565b5095945050505050565b3360008181526066602090815260408083206001600160a01b038716845290915281205490916114f29185906117039086906126fd565b611c0c565b6000610a1e8284612748565b61171e8282612059565b60a1546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f1990604401611544565b60a1546040516370a0823160e01b81526001600160a01b038581166004830152849216906370a082319060240160206040518083038186803b15801561179a57600080fd5b505afa1580156117ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d29190612504565b10156118205760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420614d41544943632062616c616e6365000000006044820152606401610679565b600081156118345761183183610a25565b90505b60a154604051634bc3f6e960e01b81526001600160a01b0386811660048301526024820186905290911690634bc3f6e990604401600060405180830381600087803b15801561188257600080fd5b505af1158015611896573d6000803e3d6000fd5b505050506118b0308583866118ab9190612787565b6120f9565b5080156118d15760a2546118cf9030906001600160a01b0316836120f9565b505b50505050565b816118e184611495565b101561192f5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420614d41544943622062616c616e6365000000006044820152606401610679565b600081156119435761194083610a25565b90505b61195284306118ab8487612787565b5080156119735760a2546119719085906001600160a01b0316836120f9565b505b60a1546001600160a01b0316636e6e273e8561198f8487612787565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156119d557600080fd5b505af11580156119e9573d6000803e3d6000fd5b5050505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060606980546106c79061279e565b6000610a1e82846126bc565b3360009081526066602090815260408083206001600160a01b038616845290915281205482811015611ae25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610679565b611aef3385858403611c0c565b5060019392505050565b60006114f2338484611e5e565b600054610100900460ff1680611b1f575060005460ff16155b611b3b5760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff16158015611b5d576000805461ffff19166101011790555b611b65612132565b611b6d61219c565b8015610cfe576000805461ff001916905550565b600054610100900460ff1680611b9a575060005460ff16155b611bb65760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff16158015611bd8576000805461ffff19166101011790555b611be0612132565b611bea83836121fc565b8015610c24576000805461ff0019169055505050565b6000610a1e8284612715565b6001600160a01b038316611c6e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610679565b6001600160a01b038216611ccf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610679565b6001600160a01b0392831660009081526066602090815260408083209490951682529290925291902055565b6001600160a01b038216611d5b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610679565b6001600160a01b03821660009081526065602052604090205481811015611dcf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610679565b6001600160a01b0383166000908152606560205260408120838303905560678054849290611dfe908490612787565b90915550610c2490508360008483565b600080611e1b8584611fde565b90506000611e298685611c00565b90506000611e378287611fea565b9250905080611e4d576000199350505050610a1e565b6116ac6116a58661169f868a612032565b6001600160a01b038316611ec25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610679565b6001600160a01b038216611f245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610679565b6001600160a01b03831660009081526065602052604090205481811015611f9c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610679565b6001600160a01b03808516600090815260656020526040808220858503905591851681529081208054849290611fd39084906126fd565b909155506118d19050565b6000610a1e82846127d9565b60008083611ffe575060019050600061202b565b8383028385828161201157612011612803565b041461202457600080925092505061202b565b6001925090505b9250929050565b6000610a1e8284612729565b6000808383018481101561202457600080925092505061202b565b6001600160a01b0382166120af5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610679565b80606760008282546120c191906126fd565b90915550506001600160a01b038216600090815260656020526040812080548392906120ee9084906126fd565b90915550610b639050565b6000612106848484611e5e565b826001600160a01b0316846001600160a01b03166000805160206128308339815191526108358561157a565b600054610100900460ff168061214b575060005460ff16155b6121675760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff16158015611b6d576000805461ffff19166101011790558015610cfe576000805461ff001916905550565b600054610100900460ff16806121b5575060005460ff16155b6121d15760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff161580156121f3576000805461ffff19166101011790555b611b6d336119f3565b600054610100900460ff1680612215575060005460ff16155b6122315760405162461bcd60e51b8152600401610679906125f0565b600054610100900460ff16158015612253576000805461ffff19166101011790555b8251612266906068906020860190612291565b50815161227a906069906020850190612291565b508015610c24576000805461ff0019169055505050565b82805461229d9061279e565b90600052602060002090601f0160209004810192826122bf5760008555612305565b82601f106122d857805160ff1916838001178555612305565b82800160010185558215612305579182015b828111156123055782518255916020019190600101906122ea565b50612311929150612315565b5090565b5b808211156123115760008155600101612316565b80356001600160a01b038116811461234157600080fd5b919050565b600082601f83011261235757600080fd5b813567ffffffffffffffff8082111561237257612372612819565b604051601f8301601f19908116603f0116810190828211818310171561239a5761239a612819565b816040528381528660208588010111156123b357600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156123e557600080fd5b610a1e8261232a565b6000806040838503121561240157600080fd5b61240a8361232a565b91506124186020840161232a565b90509250929050565b60008060006060848603121561243657600080fd5b61243f8461232a565b925061244d6020850161232a565b9150604084013590509250925092565b6000806040838503121561247057600080fd5b6124798361232a565b946020939093013593505050565b6000806040838503121561249a57600080fd5b823567ffffffffffffffff808211156124b257600080fd5b6124be86838701612346565b935060208501359150808211156124d457600080fd5b506124e185828601612346565b9150509250929050565b6000602082840312156124fd57600080fd5b5035919050565b60006020828403121561251657600080fd5b5051919050565b6000806040838503121561253057600080fd5b50508035926020909101359150565b600060208083528351808285015260005b8181101561256c57858101830151858201604001528201612550565b8181111561257e576000604083870101525b50601f01601f1916929092016040019392505050565b602080825260139082015272135a5b9d195c8e881b9bdd08185b1b1bddd959606a1b604082015260600190565b60208082526015908201527413dc195c985d1bdc8e881b9bdd08185b1b1bddd959605a1b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f6e657720726174696f2073686f756c64206265206c657373206f7220657175616040820152680d840e8de4062ca62760bb1b606082015260800190565b600080821280156001600160ff1b03849003851316156126de576126de6127ed565b600160ff1b83900384128116156126f7576126f76127ed565b50500190565b60008219821115612710576127106127ed565b500190565b60008261272457612724612803565b500490565b6000816000190483118215151615612743576127436127ed565b500290565b60008083128015600160ff1b850184121615612766576127666127ed565b6001600160ff1b0384018313811615612781576127816127ed565b50500390565b600082821015612799576127996127ed565b500390565b600181811c908216806127b257607f821691505b602082108114156127d357634e487b7160e01b600052602260045260246000fd5b50919050565b6000826127e8576127e8612803565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a3657e7e5d49b4966b66ee410798bc92726fcfe797a0f234d434d7d505e5f82464736f6c63430008060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.