More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 125 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Recover | 21672279 | 9 days ago | IN | 0 ETH | 0.00106865 | ||||
Transfer And Cal... | 21644479 | 13 days ago | IN | 0 ETH | 0.00090933 | ||||
Transfer And Cal... | 21521247 | 30 days ago | IN | 0 ETH | 0.00127433 | ||||
Transfer And Cal... | 21517835 | 30 days ago | IN | 0 ETH | 0.00065066 | ||||
Transfer And Cal... | 21371200 | 51 days ago | IN | 0 ETH | 0.00123927 | ||||
Transfer And Cal... | 21300715 | 61 days ago | IN | 0 ETH | 0.00095278 | ||||
Transfer And Cal... | 21285018 | 63 days ago | IN | 0 ETH | 0.00059792 | ||||
Transfer And Cal... | 21284370 | 63 days ago | IN | 0 ETH | 0.00086862 | ||||
Transfer And Cal... | 21284363 | 63 days ago | IN | 0 ETH | 0.00113015 | ||||
Transfer | 21279891 | 64 days ago | IN | 0 ETH | 0.00099056 | ||||
Transfer And Cal... | 20564209 | 164 days ago | IN | 0 ETH | 0.00035542 | ||||
Transfer And Cal... | 20482073 | 175 days ago | IN | 0 ETH | 0.00027925 | ||||
Approve | 20342708 | 194 days ago | IN | 0 ETH | 0.00045223 | ||||
Declare Lost | 20342707 | 194 days ago | IN | 0 ETH | 0.00137978 | ||||
Approve | 20342703 | 194 days ago | IN | 0 ETH | 0.00042255 | ||||
Transfer And Cal... | 20161536 | 220 days ago | IN | 0 ETH | 0.00082027 | ||||
Transfer And Cal... | 20137953 | 223 days ago | IN | 0 ETH | 0.00042468 | ||||
Transfer And Cal... | 20070607 | 232 days ago | IN | 0 ETH | 0.00117706 | ||||
Transfer And Cal... | 19982741 | 245 days ago | IN | 0 ETH | 0.00087489 | ||||
Transfer And Cal... | 19981469 | 245 days ago | IN | 0 ETH | 0.001234 | ||||
Transfer And Cal... | 19761358 | 276 days ago | IN | 0 ETH | 0.00170992 | ||||
Transfer And Cal... | 19741508 | 278 days ago | IN | 0 ETH | 0.00075359 | ||||
Transfer And Cal... | 19740338 | 279 days ago | IN | 0 ETH | 0.00147341 | ||||
Transfer | 19740309 | 279 days ago | IN | 0 ETH | 0.00077412 | ||||
Transfer And Cal... | 19737043 | 279 days ago | IN | 0 ETH | 0.00077193 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DraggableSharesWithPredecessor
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity Multiple files format)
/** * SPDX-License-Identifier: LicenseRef-Aktionariat * * MIT License with Automated License Fee Payments * * Copyright (c) 2020 Aktionariat AG (aktionariat.com) * * Permission is hereby granted to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies of the * Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * - The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - All automated license fee payments integrated into this and related Software * are preserved. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ pragma solidity >=0.8; import "./DraggableShares.sol"; import "./ERC20Draggable.sol"; /** * @title Draggable CompanyName AG Shares * @author Luzius Meisser, [email protected] * * This is an ERC-20 token representing shares of CompanyName AG that are bound to * a shareholder agreement that can be found at the URL defined in the constant 'terms'. * The shareholder agreement is partially enforced through this smart contract. The agreement * is designed to facilitate a complete acquisition of the firm even if a minority of shareholders * disagree with the acquisition, to protect the interest of the minority shareholders by requiring * the acquirer to offer the same conditions to everyone when acquiring the company, and to * facilitate an update of the shareholder agreement even if a minority of the shareholders that * are bound to this agreement disagree. The name "draggable" stems from the convention of calling * the right to drag a minority along with a sale of the company "drag-along" rights. The name is * chosen to ensure that token holders are aware that they are bound to such an agreement. * * The percentage of token holders that must agree with an update of the terms is defined by the * constant UPDATE_QUORUM. The percentage of yes-votes that is needed to successfully complete an * acquisition is defined in the constant ACQUISITION_QUORUM. Note that the update quorum is based * on the total number of tokens in circulation. In contrast, the acquisition quorum is based on the * number of votes cast during the voting period, not taking into account those who did not bother * to vote. */ contract DraggableSharesWithPredecessor is DraggableShares { address immutable newBaseToken; constructor(address newBaseToken_, string memory _terms, address predecessor, uint256 quorum, uint256 votePeriod) DraggableShares(_terms, predecessor, quorum, votePeriod) { newBaseToken = newBaseToken_; } // custom built convert function for old DSHS contract function convert() public { address oldBase = getOldBase(); fetchTokens(); swtichBase(oldBase); } function fetchTokens() internal { require(address(wrapped) != newBaseToken); IDSHS predecessor = IDSHS(address(wrapped)); uint256 supply = predecessor.totalSupply(); uint256 present = totalSupply(); uint256 missing = supply - present; //_mint(address(predecessor), supply); that's what the newer version expects _mint(address(this), missing); _approve(address(this), address(predecessor), missing); predecessor.migrate(); } function getOldBase() internal view returns (address) { return IDSHS(address(wrapped)).getWrappedContract(); } function swtichBase(address oldWrapped) internal { IERC20 oldBase = IERC20(oldWrapped); oldBase.approve(newBaseToken, oldBase.balanceOf(address(this))); IBaseToken(newBaseToken).convertOldShares(); wrapped = IERC20(newBaseToken); disableRecovery(); require(totalSupply() == wrapped.balanceOf(address(this))); } } abstract contract IBaseToken { function convertOldShares() virtual public; } abstract contract IDSHS { function migrate() virtual public; function getWrappedContract() virtual view public returns (address); function totalSupply() virtual public returns (uint256); }
/** * SPDX-License-Identifier: LicenseRef-Aktionariat * * MIT License with Automated License Fee Payments * * Copyright (c) 2020 Aktionariat AG (aktionariat.com) * * Permission is hereby granted to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies of the * Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * - The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - All automated license fee payments integrated into this and related Software * are preserved. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ pragma solidity >=0.8; import "./ERC20Recoverable.sol"; import "./ERC20Draggable.sol"; /** * @title Draggable CompanyName AG Shares * @author Luzius Meisser, [email protected] * * This is an ERC-20 token representing shares of CompanyName AG that are bound to * a shareholder agreement that can be found at the URL defined in the constant 'terms'. * The shareholder agreement is partially enforced through this smart contract. The agreement * is designed to facilitate a complete acquisition of the firm even if a minority of shareholders * disagree with the acquisition, to protect the interest of the minority shareholders by requiring * the acquirer to offer the same conditions to everyone when acquiring the company, and to * facilitate an update of the shareholder agreement even if a minority of the shareholders that * are bound to this agreement disagree. The name "draggable" stems from the convention of calling * the right to drag a minority along with a sale of the company "drag-along" rights. The name is * chosen to ensure that token holders are aware that they are bound to such an agreement. * * The percentage of token holders that must agree with an update of the terms is defined by the * constant UPDATE_QUORUM. The percentage of yes-votes that is needed to successfully complete an * acquisition is defined in the constant ACQUISITION_QUORUM. Note that the update quorum is based * on the total number of tokens in circulation. In contrast, the acquisition quorum is based on the * number of votes cast during the voting period, not taking into account those who did not bother * to vote. */ contract DraggableShares is ERC20Recoverable, ERC20Draggable { string public terms; constructor(string memory _terms, address wrappedToken, uint256 quorumBps, uint256 votePeriodSeconds) ERC20Draggable(wrappedToken, quorumBps, votePeriodSeconds) { terms = _terms; // to update the terms, migrate to a new contract. That way it is ensured that the terms can only be updated when the quorom agrees. } function transfer(address to, uint256 value) override(ERC20Recoverable, ERC20) public returns (bool) { return super.transfer(to, value); } function getClaimDeleter() public view override returns (address) { return IRecoverable(address(wrapped)).getClaimDeleter(); } function getCollateralRate(address collateralType) public view override returns (uint256) { uint256 rate = super.getCollateralRate(collateralType); if (rate > 0) { return rate; } else if (collateralType == address(wrapped)) { return unwrapConversionFactor; } else { // If the wrapped contract allows for a specific collateral, we should too. // If the wrapped contract is not IRecoverable, we will fail here, but would fail anyway. return IRecoverable(address(wrapped)).getCollateralRate(collateralType) * unwrapConversionFactor; } } } abstract contract IRecoverable { function getCollateralRate(address) public virtual view returns (uint256); function getClaimDeleter() public virtual view returns (address); }
// SPDX-License-Identifier: MIT // Copied and adjusted from OpenZeppelin // Adjustments: // - modifications to support ERC-677 // - removed require messages to save space // - removed unnecessary require statements // - removed GSN Context // - upgraded to 0.8 to drop SafeMath // - let name() and symbol() be implemented by subclass // - infinite allowance support, with 2^255 and above considered infinite pragma solidity >=0.8; import "./IERC20.sol"; import "./IERC677Receiver.sol"; /** * @dev Implementation of the `IERC20` interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using `_mint`. * For a generic mechanism see `ERC20Mintable`. * * *For a detailed writeup see our guide [How to implement supply * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an `Approval` event is emitted on calls to `transferFrom`. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard `decreaseAllowance` and `increaseAllowance` * functions have been added to mitigate the well-known issues around setting * allowances. See `IERC20.approve`. */ abstract contract ERC20 is IERC20 { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; uint8 public override decimals; constructor(uint8 _decimals) { decimals = _decimals; } /** * @dev See `IERC20.totalSupply`. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See `IERC20.balanceOf`. */ function balanceOf(address account) public view 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(msg.sender, recipient, amount); return true; } /** * @dev See `IERC20.allowance`. */ function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See `IERC20.approve`. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public override returns (bool) { _approve(msg.sender, spender, value); 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 `value`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][msg.sender]; if (currentAllowance < (1 << 255)){ // Only decrease the allowance if it was not set to 'infinite' // Documented in /doc/infiniteallowance.md _approve(sender, msg.sender, currentAllowance - amount); } return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is 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(recipient != address(0)); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] -= amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } // ERC-677 functionality, can be useful for swapping and wrapping tokens function transferAndCall(address recipient, uint amount, bytes calldata data) public returns (bool) { bool success = transfer(recipient, amount); if (success){ success = IERC677Receiver(recipient).onTokenTransfer(msg.sender, amount, data); } return success; } /** @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 * * - `to` cannot be the zero address. */ function _mint(address recipient, uint256 amount) internal virtual { require(recipient != address(0)); _beforeTokenTransfer(address(0), recipient, amount); _totalSupply += amount; _balances[recipient] += amount; emit Transfer(address(0), recipient, 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 { _beforeTokenTransfer(account, address(0), amount); _totalSupply -= amount; _balances[account] -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is 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 value) internal { _allowances[owner][spender] = value; emit Approval(owner, spender, value); } /** * @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 to 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) virtual internal; }
/** * SPDX-License-Identifier: LicenseRef-Aktionariat * * MIT License with Automated License Fee Payments * * Copyright (c) 2020 Aktionariat AG (aktionariat.com) * * Permission is hereby granted to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies of the * Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * - The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - All automated license fee payments integrated into this and related Software * are preserved. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ pragma solidity >=0.8; /** * @title CompanyName Shareholder Agreement * @author Luzius Meisser, [email protected] * @dev These tokens are based on the ERC20 standard and the open-zeppelin library. * * This is an ERC-20 token representing shares of CompanyName AG that are bound to * a shareholder agreement that can be found at the URL defined in the constant 'terms' * of the 'DraggableCompanyNameShares' contract. The agreement is partially enforced * through the Swiss legal system, and partially enforced through this smart contract. * In particular, this smart contract implements a drag-along clause which allows the * majority of token holders to force the minority sell their shares along with them in * case of an acquisition. That's why the tokens are called "Draggable CompanyName AG Shares." */ import "./ERC20.sol"; import "./IERC20.sol"; import "./IERC677Receiver.sol"; contract ERC20Draggable is ERC20, IERC677Receiver { IERC20 public wrapped; // The wrapped contract IOfferFactory public constant factory = IOfferFactory(0xf9f92751F272f0872e2EDb6a280b0990F3e2b8A3); uint256 private constant MIGRATION_QUORUM = 8000; // If the wrapped tokens got replaced in an acquisition, unwrapping might yield many currency tokens uint256 public unwrapConversionFactor = 0; // The current acquisition attempt, if any. See initiateAcquisition to see the requirements to make a public offer. IOffer public offer; uint256 public quorum; // BPS (out of 10'000) uint256 public votePeriod; // Seconds event MigrationSucceeded(address newContractAddress); constructor( address wrappedToken, uint256 quorum_, uint256 votePeriod_ ) ERC20(0) { wrapped = IERC20(wrappedToken); quorum = quorum_; votePeriod = votePeriod_; } function disableRecovery() public { IRecoveryDisabler(address(wrapped)).setRecoverable(false); } function name() public override view returns (string memory){ if (isBinding()){ return string(abi.encodePacked("Draggable ", wrapped.name())); } else { return string(abi.encodePacked("Wrapped ", wrapped.name())); } } function symbol() public override view returns (string memory){ if (isBinding()){ return string(abi.encodePacked("D", wrapped.symbol())); } else { return string(abi.encodePacked("W", wrapped.symbol())); } } function onTokenTransfer(address from, uint256 amount, bytes calldata) override public returns (bool) { require(msg.sender == address(wrapped)); _mint(from, amount); return true; } /** Increases the number of drag-along tokens. Requires minter to deposit an equal amount of share tokens */ function wrap(address shareholder, uint256 amount) public { require(wrapped.transferFrom(msg.sender, address(this), amount)); _mint(shareholder, amount); } /** * Indicates that the token holders are bound to the token terms and that: * - Conversions back to the wrapped token (unwrap) are not allowed * - The drag-along can be performed by making an according offer * - They can be migrated to a new version of this contract in accordance with the terms */ function isBinding() public view returns (bool) { return unwrapConversionFactor == 0; } /** * Deactivates the drag-along mechanism and enables the unwrap function. */ function deactivate(uint256 factor) internal { require(factor >= 1, "factor"); unwrapConversionFactor = factor; } /** Decrease the number of drag-along tokens. The user gets back their shares in return */ function unwrap(uint256 amount) public { require(!isBinding()); unwrap(msg.sender, amount, unwrapConversionFactor); } function unwrap(address owner, uint256 amount, uint256 factor) internal { _burn(owner, amount); require(wrapped.transfer(owner, amount * factor)); } /** * Burns both the token itself as well as the wrapped token! * If you want to get out of the shareholder agreement, use unwrap after it has been * deactivated by a majority vote or acquisition. * * Burning only works if wrapped token supports burning. Also, the exact meaning of this * operation might depend on the circumstances. Burning and reussing the wrapped token * does not free the sender from the legal obligations of the shareholder agreement. */ function burn(uint256 amount) public { _burn(msg.sender, amount); uint256 factor = isBinding() ? 1 : unwrapConversionFactor; IBurnable(address(wrapped)).burn(amount * factor); } function makeAcquisitionOffer(bytes32 salt, uint256 pricePerShare, address currency) public payable { require(isBinding()); address newOffer = factory.create{value: msg.value}(salt, msg.sender, pricePerShare, currency, quorum, votePeriod); if (offerExists()) { require(IOffer(newOffer).isWellFunded()); offer.contest(newOffer); } offer = IOffer(newOffer); } function drag(address buyer, address currency) public { require(msg.sender == address(offer)); unwrap(buyer, balanceOf(buyer), 1); replaceWrapped(currency, buyer); } function notifyOfferEnded() public { if (msg.sender == address(offer)){ offer = IOffer(address(0)); } } function replaceWrapped(address newWrapped, address oldWrappedDestination) internal { require(isBinding()); // Free all old wrapped tokens we have require(wrapped.transfer(oldWrappedDestination, wrapped.balanceOf(address(this)))); // Count the new wrapped tokens wrapped = IERC20(newWrapped); deactivate(wrapped.balanceOf(address(this)) / totalSupply()); } function migrate() public { address successor = msg.sender; require(!offerExists()); // if you have 80%, you can easily cancel the offer first if necessary require(balanceOf(successor) * 10000 >= totalSupply() * MIGRATION_QUORUM, "quorum"); replaceWrapped(successor, successor); emit MigrationSucceeded(successor); } function _beforeTokenTransfer(address from, address to, uint256 amount) override internal { if (offerExists()) { offer.notifyMoved(from, to, amount); } } function offerExists() internal view returns (bool) { return address(offer) != address(0); } } abstract contract IRecoveryDisabler { function setRecoverable(bool enabled) public virtual; } abstract contract IBurnable { function burn(uint256) virtual public; } abstract contract IOffer { function isWellFunded() virtual public returns (bool); function contest(address newOffer) virtual public; function notifyMoved(address from, address to, uint256 value) virtual public; } abstract contract IOfferFactory { function create(bytes32 salt, address buyer, uint256 pricePerShare, address currency, uint256 quorum, uint256 votePeriod) virtual public payable returns (address); }
/** * SPDX-License-Identifier: LicenseRef-Aktionariat * * MIT License with Automated License Fee Payments * * Copyright (c) 2020 Aktionariat AG (aktionariat.com) * * Permission is hereby granted to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies of the * Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * - The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - All automated license fee payments integrated into this and related Software * are preserved. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ pragma solidity >=0.8; import "./ERC20.sol"; import "./IERC20.sol"; /** * @title Recoverable * In case of tokens that represent real-world assets such as shares of a company, one needs a way * to handle lost private keys. With physical certificates, courts can declare share certificates as * invalid so the company can issue replacements. Here, we want a solution that does not depend on * third parties to resolve such cases. Instead, when someone has lost a private key, he can use the * declareLost function to post a deposit and claim that the shares assigned to a specific address are * lost. To prevent front running, a commit reveal scheme is used. If he actually is the owner of the shares, * he needs to wait for a certain period and can then reclaim the lost shares as well as the deposit. * If he is an attacker trying to claim shares belonging to someone else, he risks losing the deposit * as it can be claimed at anytime by the rightful owner. * Furthermore, if "getClaimDeleter" is defined in the subclass, the returned address is allowed to * delete claims, returning the collateral. This can help to prevent obvious cases of abuse of the claim * function. */ abstract contract ERC20Recoverable is ERC20 { // A struct that represents a claim made struct Claim { address claimant; // the person who created the claim uint256 collateral; // the amount of collateral deposited uint256 timestamp; // the timestamp of the block in which the claim was made address currencyUsed; // The currency (XCHF) can be updated, we record the currency used for every request } uint256 public constant claimPeriod = 180 days; mapping(address => Claim) public claims; // there can be at most one claim per address, here address is claimed address mapping(address => bool) public recoveryDisabled; // disable claimability (e.g. for long term storage) // ERC-20 token that can be used as collateral or 0x0 if disabled address public customCollateralAddress; uint256 public customCollateralRate; /** * Returns the collateral rate for the given collateral type and 0 if that type * of collateral is not accepted. By default, only the token itself is accepted at * a rate of 1:1. * * Subclasses should override this method if they want to add additional types of * collateral. */ function getCollateralRate(address collateralType) public virtual view returns (uint256) { if (collateralType == address(this)) { return 1; } else if (collateralType == customCollateralAddress) { return customCollateralRate; } else { return 0; } } /** * Allows subclasses to set a custom collateral besides the token itself. * The collateral must be an ERC-20 token that returns true on successful transfers and * throws an exception or returns false on failure. * Also, do not forget to multiply the rate in accordance with the number of decimals of the collateral. * For example, rate should be 7*10**18 for 7 units of a collateral with 18 decimals. */ function _setCustomClaimCollateral(address collateral, uint256 rate) internal { customCollateralAddress = collateral; if (customCollateralAddress == address(0)) { customCollateralRate = 0; // disabled } else { require(rate > 0, "zero"); customCollateralRate = rate; } emit CustomClaimCollateralChanged(collateral, rate); } function getClaimDeleter() virtual public view returns (address); function setRecoverable(bool enabled) public { recoveryDisabled[msg.sender] = !enabled; } /** * Some users might want to disable claims for their address completely. * For example if they use a deep cold storage solution or paper wallet. */ function isRecoveryEnabled(address target) public view returns (bool) { return !recoveryDisabled[target]; } event ClaimMade(address indexed lostAddress, address indexed claimant, uint256 balance); event ClaimCleared(address indexed lostAddress, uint256 collateral); event ClaimDeleted(address indexed lostAddress, address indexed claimant, uint256 collateral); event ClaimResolved(address indexed lostAddress, address indexed claimant, uint256 collateral); event CustomClaimCollateralChanged(address newCustomCollateralAddress, uint256 newCustomCollareralRate); /** Anyone can declare that the private key to a certain address was lost by calling declareLost * providing a deposit/collateral. There are three possibilities of what can happen with the claim: * 1) The claim period expires and the claimant can get the deposit and the shares back by calling recover * 2) The "lost" private key is used at any time to call clearClaim. In that case, the claim is deleted and * the deposit sent to the shareholder (the owner of the private key). It is recommended to call recover * whenever someone transfers funds to let claims be resolved automatically when the "lost" private key is * used again. * 3) The owner deletes the claim and assigns the deposit to the claimant. This is intended to be used to resolve * disputes. Generally, using this function implies that you have to trust the issuer of the tokens to handle * the situation well. As a rule of thumb, the contract owner should assume the owner of the lost address to be the * rightful owner of the deposit. * It is highly recommended that the owner observes the claims made and informs the owners of the claimed addresses * whenever a claim is made for their address (this of course is only possible if they are known to the owner, e.g. * through a shareholder register). */ function declareLost(address collateralType, address lostAddress) public { require(isRecoveryEnabled(lostAddress), "disabled"); uint256 collateralRate = getCollateralRate(collateralType); require(collateralRate > 0, "bad collateral"); address claimant = msg.sender; uint256 balance = balanceOf(lostAddress); uint256 collateral = balance * collateralRate; IERC20 currency = IERC20(collateralType); require(balance > 0, "empty"); require(claims[lostAddress].collateral == 0, "already claimed"); require(currency.transferFrom(claimant, address(this), collateral)); claims[lostAddress] = Claim({ claimant: claimant, collateral: collateral, timestamp: block.timestamp, currencyUsed: collateralType }); emit ClaimMade(lostAddress, claimant, balance); } function getClaimant(address lostAddress) public view returns (address) { return claims[lostAddress].claimant; } function getCollateral(address lostAddress) public view returns (uint256) { return claims[lostAddress].collateral; } function getCollateralType(address lostAddress) public view returns (address) { return claims[lostAddress].currencyUsed; } function getTimeStamp(address lostAddress) public view returns (uint256) { return claims[lostAddress].timestamp; } function transfer(address recipient, uint256 amount) override virtual public returns (bool) { require(super.transfer(recipient, amount)); clearClaim(); return true; } /** * Clears a claim after the key has been found again and assigns the collateral to the "lost" address. * This is the price an adverse claimer pays for filing a false claim and makes it risky to do so. */ function clearClaim() public { if (claims[msg.sender].collateral != 0) { uint256 collateral = claims[msg.sender].collateral; IERC20 currency = IERC20(claims[msg.sender].currencyUsed); delete claims[msg.sender]; require(currency.transfer(msg.sender, collateral)); emit ClaimCleared(msg.sender, collateral); } } /** * After the claim period has passed, the claimant can call this function to send the * tokens on the lost address as well as the collateral to himself. */ function recover(address lostAddress) public { Claim memory claim = claims[lostAddress]; uint256 collateral = claim.collateral; IERC20 currency = IERC20(claim.currencyUsed); require(collateral != 0, "not found"); require(claim.claimant == msg.sender, "not claimant"); require(claim.timestamp + claimPeriod <= block.timestamp, "too early"); address claimant = claim.claimant; delete claims[lostAddress]; require(currency.transfer(claimant, collateral)); _transfer(lostAddress, claimant, balanceOf(lostAddress)); emit ClaimResolved(lostAddress, claimant, collateral); } /** * This function is to be executed by the claim deleter only in case a dispute needs to be resolved manually. */ function deleteClaim(address lostAddress) public { require(msg.sender == getClaimDeleter(), "no access"); Claim memory claim = claims[lostAddress]; IERC20 currency = IERC20(claim.currencyUsed); require(claim.collateral != 0, "not found"); delete claims[lostAddress]; require(currency.transfer(claim.claimant, claim.collateral)); emit ClaimDeleted(lostAddress, claim.claimant, claim.collateral); } }
/** * SPDX-License-Identifier: MIT * * Copyright (c) 2016-2019 zOS Global Limited * */ pragma solidity >=0.8; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ interface IERC20 { // Optional functions function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); /** * @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. * * > 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; interface IERC677Receiver { function onTokenTransfer(address from, uint256 amount, bytes calldata data) external returns (bool); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"newBaseToken_","type":"address"},{"internalType":"string","name":"_terms","type":"string"},{"internalType":"address","name":"predecessor","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"uint256","name":"votePeriod","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"ClaimMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newCustomCollateralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newCustomCollareralRate","type":"uint256"}],"name":"CustomClaimCollateralChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newContractAddress","type":"address"}],"name":"MigrationSucceeded","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claims","outputs":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"currencyUsed","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"convert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customCollateralAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collateralType","type":"address"},{"internalType":"address","name":"lostAddress","type":"address"}],"name":"declareLost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"deleteClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableRecovery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"currency","type":"address"}],"name":"drag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IOfferFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimDeleter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getClaimant","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collateralType","type":"address"}],"name":"getCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getCollateralType","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBinding","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"isRecoveryEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256","name":"pricePerShare","type":"uint256"},{"internalType":"address","name":"currency","type":"address"}],"name":"makeAcquisitionOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notifyOfferEnded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"offer","outputs":[{"internalType":"contract IOffer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onTokenTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"recoveryDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setRecoverable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unwrapConversionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapped","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405260006009553480156200001657600080fd5b5060405162002eba38038062002eba83398101604081905262000039916200016b565b6003805460ff19169055600880546001600160a01b0319166001600160a01b038516179055600b829055600c819055835184908490849084906200008590600d906020870190620000a8565b505050505060609490941b6001600160601b03191660805250620002d092505050565b828054620000b6906200027d565b90600052602060002090601f016020900481019282620000da576000855562000125565b82601f10620000f557805160ff191683800117855562000125565b8280016001018555821562000125579182015b828111156200012557825182559160200191906001019062000108565b506200013392915062000137565b5090565b5b8082111562000133576000815560010162000138565b80516001600160a01b03811681146200016657600080fd5b919050565b600080600080600060a0868803121562000183578081fd5b6200018e866200014e565b602087810151919650906001600160401b0380821115620001ad578384fd5b818901915089601f830112620001c1578384fd5b815181811115620001d657620001d6620002ba565b604051601f8201601f19908116603f01168101908382118183101715620002015762000201620002ba565b816040528281528c8684870101111562000219578687fd5b8693505b828410156200023c57848401860151818501870152928501926200021d565b828411156200024d57868684830101525b80995050505050505062000264604087016200014e565b6060870151608090970151959894975095949392505050565b6002810460018216806200029257607f821691505b60208210811415620002b457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c612bb66200030460003960008181611eb3015281816120190152818161211101526121900152612bb66000f3fe6080604052600436106102725760003560e01c806377e071ad1161014f578063a9059cbb116100c1578063d50256251161007a578063d5025625146106d7578063dcc7d4ad146106ec578063dd62ed3e146106ff578063de0e9a3e1461071f578063eb470ebf1461073f578063fcb79a7e1461075f57610272565b8063a9059cbb1461061d578063b40e80d11461063d578063bf376c7a1461065d578063c028df061461067d578063c45a015514610692578063c6788bdd146106a757610272565b806395d89b411161011357806395d89b411461057e5780639b56d6c9146105935780639e4b5745146105b3578063a3ec1883146105c8578063a4c0ed36146105e8578063a78135871461060857610272565b806377e071ad1461050a5780637dc2cd981461052a5780638fd3ab801461053f5780638ff8831b1461055457806391bbdcc71461056957610272565b8063313ce567116101e857806342966c68116101ac57806342966c681461046b57806350e70d481461048b57806360918117146104a05780636427ed97146104b55780636b03ed5f146104d557806370a08231146104ea57610272565b8063313ce567146103d457806332a7ae95146103f657806332bc320b146104165780633bcc45ba1461042b5780634000aea01461044b57610272565b80631703a0181161023a5780631703a0181461033557806318160ddd1461034a5780631e3b9de51461035f57806323b872dd1461037f57806326773ddd1461039f5780632a0a4ed5146103bf57610272565b806306fdde03146102775780630832e470146102a2578063095ea7b3146102c45780630c6f0e5d146102f15780630cd865ec14610313575b600080fd5b34801561028357600080fd5b5061028c61077f565b60405161029991906128b7565b60405180910390f35b3480156102ae57600080fd5b506102b76108db565b6040516102999190612a4b565b3480156102d057600080fd5b506102e46102df366004612514565b6108e1565b6040516102999190612877565b3480156102fd57600080fd5b506103066108f7565b60405161029991906127b3565b34801561031f57600080fd5b5061033361032e366004612464565b610906565b005b34801561034157600080fd5b506102b7610b06565b34801561035657600080fd5b506102b7610b0c565b34801561036b57600080fd5b5061030661037a366004612464565b610b12565b34801561038b57600080fd5b506102e461039a3660046124d4565b610b33565b3480156103ab57600080fd5b506103336103ba36600461249c565b610b8f565b3480156103cb57600080fd5b50610306610d9a565b3480156103e057600080fd5b506103e9610e1c565b6040516102999190612a54565b34801561040257600080fd5b50610333610411366004612464565b610e25565b34801561042257600080fd5b50610333610fec565b34801561043757600080fd5b50610306610446366004612464565b611012565b34801561045757600080fd5b506102e461046636600461253f565b611033565b34801561047757600080fd5b506103336104863660046126dc565b6110d8565b34801561049757600080fd5b5061030661116b565b3480156104ac57600080fd5b506102b761117a565b3480156104c157600080fd5b506103336104d03660046125c3565b611180565b3480156104e157600080fd5b5061033361119f565b3480156104f657600080fd5b506102b7610505366004612464565b6112c8565b34801561051657600080fd5b506102b7610525366004612464565b6112e3565b34801561053657600080fd5b506102b76113b9565b34801561054b57600080fd5b506103336113c0565b34801561056057600080fd5b5061033361145f565b34801561057557600080fd5b506103336114c4565b34801561058a57600080fd5b5061028c6114e4565b34801561059f57600080fd5b506102b76105ae366004612464565b611627565b3480156105bf57600080fd5b506102e4611645565b3480156105d457600080fd5b506102e46105e3366004612464565b61164c565b3480156105f457600080fd5b506102e461060336600461253f565b61166b565b34801561061457600080fd5b506102b761168f565b34801561062957600080fd5b506102e4610638366004612514565b611695565b34801561064957600080fd5b506102e4610658366004612464565b6116a8565b34801561066957600080fd5b50610333610678366004612514565b6116bd565b34801561068957600080fd5b5061030661175a565b34801561069e57600080fd5b50610306611769565b3480156106b357600080fd5b506106c76106c2366004612464565b611781565b604051610299949392919061284c565b3480156106e357600080fd5b5061028c6117b3565b6103336106fa3660046125fb565b611841565b34801561070b57600080fd5b506102b761071a36600461249c565b6119ff565b34801561072b57600080fd5b5061033361073a3660046126dc565b611a2a565b34801561074b57600080fd5b506102b761075a366004612464565b611a49565b34801561076b57600080fd5b5061033361077a36600461249c565b611a67565b6060610789611645565b1561083e57600860009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156107dc57600080fd5b505afa1580156107f0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108189190810190612633565b6040516020016108289190612751565b60405160208183030381529060405290506108d8565b600860009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b15801561088c57600080fd5b505afa1580156108a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c89190810190612633565b6040516020016108289190612783565b90565b60095481565b60006108ee338484611a9c565b50600192915050565b6006546001600160a01b031681565b6001600160a01b038082166000908152600460209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091908161097f5760405162461bcd60e51b815260040161097690612a05565b60405180910390fd5b82516001600160a01b031633146109a85760405162461bcd60e51b815260040161097690612953565b4262ed4e0084604001516109bc9190612a62565b11156109da5760405162461bcd60e51b815260040161097690612a28565b82516001600160a01b03808616600090815260046020819052604080832080546001600160a01b031990811682556001820185905560028201949094556003018054909316909255905163a9059cbb60e01b81529184169163a9059cbb91610a469185918891016127eb565b602060405180830381600087803b158015610a6057600080fd5b505af1158015610a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9891906125df565b610aa157600080fd5b610ab48582610aaf886112c8565b611af7565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee85604051610af79190612a4b565b60405180910390a35050505050565b600b5481565b60025490565b6001600160a01b03808216600090815260046020526040902054165b919050565b6000610b40848484611af7565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600160ff1b811015610b8457610b848533610b7f8685612ab9565b611a9c565b506001949350505050565b610b988161164c565b610bb45760405162461bcd60e51b815260040161097690612979565b6000610bbf836112e3565b905060008111610be15760405162461bcd60e51b8152600401610976906129ba565b336000610bed846112c8565b90506000610bfb8483612a9a565b90508582610c1b5760405162461bcd60e51b81526004016109769061299b565b6001600160a01b03861660009081526004602052604090206001015415610c545760405162461bcd60e51b81526004016109769061292a565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90610c84908790309087906004016127c7565b602060405180830381600087803b158015610c9e57600080fd5b505af1158015610cb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd691906125df565b610cdf57600080fd5b604080516080810182526001600160a01b038087168083526020808401878152428587019081528d8516606087019081528d86166000818152600490955293889020965187549087166001600160a01b0319918216178855925160018801559051600287015551600390950180549590941694169390931790915591517f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535990610d89908790612a4b565b60405180910390a350505050505050565b60085460408051632a0a4ed560e01b815290516000926001600160a01b031691632a0a4ed5916004808301926020929190829003018186803b158015610ddf57600080fd5b505afa158015610df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e179190612480565b905090565b60035460ff1681565b610e2d610d9a565b6001600160a01b0316336001600160a01b031614610e5d5760405162461bcd60e51b8152600401610976906129e2565b6001600160a01b038082166000908152600460209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091610ecb5760405162461bcd60e51b815260040161097690612a05565b6001600160a01b03808416600090815260046020818152604080842080546001600160a01b031990811682556001820186905560028201959095556003018054909416909355855190860151925163a9059cbb60e01b81529385169363a9059cbb93610f39939091016127eb565b602060405180830381600087803b158015610f5357600080fd5b505af1158015610f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8b91906125df565b610f9457600080fd5b81600001516001600160a01b0316836001600160a01b03167fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d58460200151604051610fdf9190612a4b565b60405180910390a3505050565b600a546001600160a01b031633141561101057600a80546001600160a01b03191690555b565b6001600160a01b039081166000908152600460205260409020600301541690565b6000806110408686611695565b905080156110cf57604051635260769b60e11b81526001600160a01b0387169063a4c0ed369061107a903390899089908990600401612804565b602060405180830381600087803b15801561109457600080fd5b505af11580156110a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cc91906125df565b90505b95945050505050565b6110e23382611bb4565b60006110ec611645565b6110f8576009546110fb565b60015b6008549091506001600160a01b03166342966c686111198385612a9a565b6040518263ffffffff1660e01b81526004016111359190612a4b565b600060405180830381600087803b15801561114f57600080fd5b505af1158015611163573d6000803e3d6000fd5b505050505050565b6008546001600160a01b031681565b60075481565b336000908152600560205260409020805460ff19169115919091179055565b33600090815260046020526040902060010154156110105733600081815260046020819052604080832060018101805460038301805484546001600160a01b0319908116865593889055600290940196909655908216909455905163a9059cbb60e01b815292936001600160a01b0390911692839263a9059cbb926112289290918791016127eb565b602060405180830381600087803b15801561124257600080fd5b505af1158015611256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127a91906125df565b61128357600080fd5b336001600160a01b03167f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd836040516112bc9190612a4b565b60405180910390a25050565b6001600160a01b031660009081526020819052604090205490565b6000806112ef83611c4e565b905080156112fe579050610b2e565b6008546001600160a01b038481169116141561131e575050600954610b2e565b6009546008546040516377e071ad60e01b81526001600160a01b03909116906377e071ad906113519087906004016127b3565b60206040518083038186803b15801561136957600080fd5b505afa15801561137d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a191906126f4565b6113ab9190612a9a565b915050610b2e565b50919050565b62ed4e0081565b336113c9611c90565b156113d357600080fd5b611f406113de610b0c565b6113e89190612a9a565b6113f1826112c8565b6113fd90612710612a9a565b101561141b5760405162461bcd60e51b81526004016109769061290a565b6114258182611ca1565b7f3b6b79a09e9fd230e8591b65c97236bf7df7a604edf733db0658e66b0e6eb2a98160405161145491906127b3565b60405180910390a150565b600854604051636427ed9760e01b81526001600160a01b0390911690636427ed979061149090600090600401612877565b600060405180830381600087803b1580156114aa57600080fd5b505af11580156114be573d6000803e3d6000fd5b50505050565b60006114ce611e69565b90506114d8611eae565b6114e181611ff7565b50565b60606114ee611645565b1561158d57600860009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561154157600080fd5b505afa158015611555573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261157d9190810190612633565b604051602001610828919061270c565b600860009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156115db57600080fd5b505afa1580156115ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116179190810190612633565b6040516020016108289190612735565b6001600160a01b031660009081526004602052604090206001015490565b6009541590565b6001600160a01b031660009081526005602052604090205460ff161590565b6008546000906001600160a01b0316331461168557600080fd5b610b848585612258565b600c5481565b60006116a183836122f9565b9392505050565b60056020526000908152604090205460ff1681565b6008546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906116f1903390309086906004016127c7565b602060405180830381600087803b15801561170b57600080fd5b505af115801561171f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174391906125df565b61174c57600080fd5b6117568282612258565b5050565b600a546001600160a01b031681565b73f9f92751f272f0872e2edb6a280b0990f3e2b8a381565b60046020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391921684565b600d80546117c090612afc565b80601f01602080910402602001604051908101604052809291908181526020018280546117ec90612afc565b80156118395780601f1061180e57610100808354040283529160200191611839565b820191906000526020600020905b81548152906001019060200180831161181c57829003601f168201915b505050505081565b611849611645565b61185257600080fd5b600b54600c54604051634dc5e43160e01b815260009273f9f92751f272f0872e2edb6a280b0990f3e2b8a392634dc5e43192349261189a928a9233928b928b92600401612882565b6020604051808303818588803b1580156118b357600080fd5b505af11580156118c7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118ec9190612480565b90506118f6611c90565b156119da57806001600160a01b0316633f5e3e7f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561193657600080fd5b505af115801561194a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196e91906125df565b61197757600080fd5b600a546040516306a169ed60e01b81526001600160a01b03909116906306a169ed906119a79084906004016127b3565b600060405180830381600087803b1580156119c157600080fd5b505af11580156119d5573d6000803e3d6000fd5b505050505b600a80546001600160a01b0319166001600160a01b0392909216919091179055505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611a32611645565b15611a3c57600080fd5b6114e13382600954612316565b6001600160a01b031660009081526004602052604090206002015490565b600a546001600160a01b03163314611a7e57600080fd5b611a9282611a8b846112c8565b6001612316565b6117568183611ca1565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610fdf908590612a4b565b6001600160a01b038216611b0a57600080fd5b611b158383836123b9565b6001600160a01b03831660009081526020819052604081208054839290611b3d908490612ab9565b90915550506001600160a01b03821660009081526020819052604081208054839290611b6a908490612a62565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fdf9190612a4b565b611bc0826000836123b9565b8060026000828254611bd29190612ab9565b90915550506001600160a01b03821660009081526020819052604081208054839290611bff908490612ab9565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c42908590612a4b565b60405180910390a35050565b60006001600160a01b038216301415611c6957506001610b2e565b6006546001600160a01b0383811691161415611c885750600754610b2e565b506000610b2e565b600a546001600160a01b0316151590565b611ca9611645565b611cb257600080fd5b6008546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90839083906370a0823190611cec9030906004016127b3565b60206040518083038186803b158015611d0457600080fd5b505afa158015611d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3c91906126f4565b6040518363ffffffff1660e01b8152600401611d599291906127eb565b602060405180830381600087803b158015611d7357600080fd5b505af1158015611d87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dab91906125df565b611db457600080fd5b600880546001600160a01b0319166001600160a01b038416179055611756611dda610b0c565b6008546040516370a0823160e01b81526001600160a01b03909116906370a0823190611e0a9030906004016127b3565b60206040518083038186803b158015611e2257600080fd5b505afa158015611e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5a91906126f4565b611e649190612a7a565b612431565b60085460408051635804791360e01b815290516000926001600160a01b0316916358047913916004808301926020929190829003018186803b158015610ddf57600080fd5b6008547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161415611eea57600080fd5b600854604080516318160ddd60e01b815290516001600160a01b039092169160009183916318160ddd9160048082019260209290919082900301818787803b158015611f3557600080fd5b505af1158015611f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6d91906126f4565b90506000611f79610b0c565b90506000611f878284612ab9565b9050611f933082612258565b611f9e308583611a9c565b836001600160a01b0316638fd3ab806040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611fd957600080fd5b505af1158015611fed573d6000803e3d6000fd5b5050505050505050565b6040516370a0823160e01b815281906001600160a01b0382169063095ea7b3907f00000000000000000000000000000000000000000000000000000000000000009083906370a082319061204f9030906004016127b3565b60206040518083038186803b15801561206757600080fd5b505afa15801561207b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209f91906126f4565b6040518363ffffffff1660e01b81526004016120bc9291906127eb565b602060405180830381600087803b1580156120d657600080fd5b505af11580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e91906125df565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e9850eb36040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561216a57600080fd5b505af115801561217e573d6000803e3d6000fd5b5050600880546001600160a01b0319167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316179055506121c6905061145f565b6008546040516370a0823160e01b81526001600160a01b03909116906370a08231906121f69030906004016127b3565b60206040518083038186803b15801561220e57600080fd5b505afa158015612222573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224691906126f4565b61224e610b0c565b1461175657600080fd5b6001600160a01b03821661226b57600080fd5b612277600083836123b9565b80600260008282546122899190612a62565b90915550506001600160a01b038216600090815260208190526040812080548392906122b6908490612a62565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c42908590612a4b565b60006123058383612457565b61230e57600080fd5b6108ee61119f565b6123208383611bb4565b6008546001600160a01b031663a9059cbb8461233c8486612a9a565b6040518363ffffffff1660e01b81526004016123599291906127eb565b602060405180830381600087803b15801561237357600080fd5b505af1158015612387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ab91906125df565b6123b457600080fd5b505050565b6123c1611c90565b156123b457600a5460405163e1a1810f60e01b81526001600160a01b039091169063e1a1810f906123fa908690869086906004016127c7565b600060405180830381600087803b15801561241457600080fd5b505af1158015612428573d6000803e3d6000fd5b50505050505050565b60018110156124525760405162461bcd60e51b8152600401610976906128ea565b600955565b60006108ee338484611af7565b600060208284031215612475578081fd5b81356116a181612b5d565b600060208284031215612491578081fd5b81516116a181612b5d565b600080604083850312156124ae578081fd5b82356124b981612b5d565b915060208301356124c981612b5d565b809150509250929050565b6000806000606084860312156124e8578081fd5b83356124f381612b5d565b9250602084013561250381612b5d565b929592945050506040919091013590565b60008060408385031215612526578182fd5b823561253181612b5d565b946020939093013593505050565b60008060008060608587031215612554578081fd5b843561255f81612b5d565b935060208501359250604085013567ffffffffffffffff80821115612582578283fd5b818701915087601f830112612595578283fd5b8135818111156125a3578384fd5b8860208285010111156125b4578384fd5b95989497505060200194505050565b6000602082840312156125d4578081fd5b81356116a181612b72565b6000602082840312156125f0578081fd5b81516116a181612b72565b60008060006060848603121561260f578283fd5b8335925060208401359150604084013561262881612b5d565b809150509250925092565b600060208284031215612644578081fd5b815167ffffffffffffffff8082111561265b578283fd5b818401915084601f83011261266e578283fd5b81518181111561268057612680612b47565b604051601f8201601f19908116603f011681019083821181831017156126a8576126a8612b47565b816040528281528760208487010111156126c0578586fd5b6126d1836020830160208801612ad0565b979650505050505050565b6000602082840312156126ed578081fd5b5035919050565b600060208284031215612705578081fd5b5051919050565b6000601160fa1b82528251612728816001850160208701612ad0565b9190910160010192915050565b6000605760f81b82528251612728816001850160208701612ad0565b6000690223930b3b3b0b13632960b51b8252825161277681600a850160208701612ad0565b91909101600a0192915050565b60006702bb930b83832b2160c51b825282516127a6816008850160208701612ad0565b9190910160080192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b901515815260200190565b9586526001600160a01b039485166020870152604086019390935292166060840152608083019190915260a082015260c00190565b60006020825282518060208401526128d6816040850160208701612ad0565b601f01601f19169190910160400192915050565b6020808252600690820152653330b1ba37b960d11b604082015260600190565b60208082526006908201526571756f72756d60d01b604082015260600190565b6020808252600f908201526e185b1c9958591e4818db185a5b5959608a1b604082015260600190565b6020808252600c908201526b1b9bdd0818db185a5b585b9d60a21b604082015260600190565b602080825260089082015267191a5cd8589b195960c21b604082015260600190565b602080825260059082015264656d70747960d81b604082015260600190565b6020808252600e908201526d1898590818dbdb1b185d195c985b60921b604082015260600190565b6020808252600990820152686e6f2061636365737360b81b604082015260600190565b6020808252600990820152681b9bdd08199bdd5b9960ba1b604082015260600190565b602080825260099082015268746f6f206561726c7960b81b604082015260600190565b90815260200190565b60ff91909116815260200190565b60008219821115612a7557612a75612b31565b500190565b600082612a9557634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612ab457612ab4612b31565b500290565b600082821015612acb57612acb612b31565b500390565b60005b83811015612aeb578181015183820152602001612ad3565b838111156114be5750506000910152565b600281046001821680612b1057607f821691505b602082108114156113b357634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114e157600080fd5b80151581146114e157600080fdfea264697066735822122088d83b87e94f3c6e56492bc72a9b8184e84cf27aa5343b59639f9820ece81ea764736f6c63430008010033000000000000000000000000ae7c2042c2f84ff5880a185bd7d81da5b822b3a700000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000414324b0aba49fb14cbfb37be40d8d78a2edf4470000000000000000000000000000000000000000000000000000000000001d4c00000000000000000000000000000000000000000000000000000000004f1a00000000000000000000000000000000000000000000000000000000000000001371756974742e63682f696e766573746f72656e00000000000000000000000000
Deployed Bytecode
0x6080604052600436106102725760003560e01c806377e071ad1161014f578063a9059cbb116100c1578063d50256251161007a578063d5025625146106d7578063dcc7d4ad146106ec578063dd62ed3e146106ff578063de0e9a3e1461071f578063eb470ebf1461073f578063fcb79a7e1461075f57610272565b8063a9059cbb1461061d578063b40e80d11461063d578063bf376c7a1461065d578063c028df061461067d578063c45a015514610692578063c6788bdd146106a757610272565b806395d89b411161011357806395d89b411461057e5780639b56d6c9146105935780639e4b5745146105b3578063a3ec1883146105c8578063a4c0ed36146105e8578063a78135871461060857610272565b806377e071ad1461050a5780637dc2cd981461052a5780638fd3ab801461053f5780638ff8831b1461055457806391bbdcc71461056957610272565b8063313ce567116101e857806342966c68116101ac57806342966c681461046b57806350e70d481461048b57806360918117146104a05780636427ed97146104b55780636b03ed5f146104d557806370a08231146104ea57610272565b8063313ce567146103d457806332a7ae95146103f657806332bc320b146104165780633bcc45ba1461042b5780634000aea01461044b57610272565b80631703a0181161023a5780631703a0181461033557806318160ddd1461034a5780631e3b9de51461035f57806323b872dd1461037f57806326773ddd1461039f5780632a0a4ed5146103bf57610272565b806306fdde03146102775780630832e470146102a2578063095ea7b3146102c45780630c6f0e5d146102f15780630cd865ec14610313575b600080fd5b34801561028357600080fd5b5061028c61077f565b60405161029991906128b7565b60405180910390f35b3480156102ae57600080fd5b506102b76108db565b6040516102999190612a4b565b3480156102d057600080fd5b506102e46102df366004612514565b6108e1565b6040516102999190612877565b3480156102fd57600080fd5b506103066108f7565b60405161029991906127b3565b34801561031f57600080fd5b5061033361032e366004612464565b610906565b005b34801561034157600080fd5b506102b7610b06565b34801561035657600080fd5b506102b7610b0c565b34801561036b57600080fd5b5061030661037a366004612464565b610b12565b34801561038b57600080fd5b506102e461039a3660046124d4565b610b33565b3480156103ab57600080fd5b506103336103ba36600461249c565b610b8f565b3480156103cb57600080fd5b50610306610d9a565b3480156103e057600080fd5b506103e9610e1c565b6040516102999190612a54565b34801561040257600080fd5b50610333610411366004612464565b610e25565b34801561042257600080fd5b50610333610fec565b34801561043757600080fd5b50610306610446366004612464565b611012565b34801561045757600080fd5b506102e461046636600461253f565b611033565b34801561047757600080fd5b506103336104863660046126dc565b6110d8565b34801561049757600080fd5b5061030661116b565b3480156104ac57600080fd5b506102b761117a565b3480156104c157600080fd5b506103336104d03660046125c3565b611180565b3480156104e157600080fd5b5061033361119f565b3480156104f657600080fd5b506102b7610505366004612464565b6112c8565b34801561051657600080fd5b506102b7610525366004612464565b6112e3565b34801561053657600080fd5b506102b76113b9565b34801561054b57600080fd5b506103336113c0565b34801561056057600080fd5b5061033361145f565b34801561057557600080fd5b506103336114c4565b34801561058a57600080fd5b5061028c6114e4565b34801561059f57600080fd5b506102b76105ae366004612464565b611627565b3480156105bf57600080fd5b506102e4611645565b3480156105d457600080fd5b506102e46105e3366004612464565b61164c565b3480156105f457600080fd5b506102e461060336600461253f565b61166b565b34801561061457600080fd5b506102b761168f565b34801561062957600080fd5b506102e4610638366004612514565b611695565b34801561064957600080fd5b506102e4610658366004612464565b6116a8565b34801561066957600080fd5b50610333610678366004612514565b6116bd565b34801561068957600080fd5b5061030661175a565b34801561069e57600080fd5b50610306611769565b3480156106b357600080fd5b506106c76106c2366004612464565b611781565b604051610299949392919061284c565b3480156106e357600080fd5b5061028c6117b3565b6103336106fa3660046125fb565b611841565b34801561070b57600080fd5b506102b761071a36600461249c565b6119ff565b34801561072b57600080fd5b5061033361073a3660046126dc565b611a2a565b34801561074b57600080fd5b506102b761075a366004612464565b611a49565b34801561076b57600080fd5b5061033361077a36600461249c565b611a67565b6060610789611645565b1561083e57600860009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156107dc57600080fd5b505afa1580156107f0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108189190810190612633565b6040516020016108289190612751565b60405160208183030381529060405290506108d8565b600860009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b15801561088c57600080fd5b505afa1580156108a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c89190810190612633565b6040516020016108289190612783565b90565b60095481565b60006108ee338484611a9c565b50600192915050565b6006546001600160a01b031681565b6001600160a01b038082166000908152600460209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091908161097f5760405162461bcd60e51b815260040161097690612a05565b60405180910390fd5b82516001600160a01b031633146109a85760405162461bcd60e51b815260040161097690612953565b4262ed4e0084604001516109bc9190612a62565b11156109da5760405162461bcd60e51b815260040161097690612a28565b82516001600160a01b03808616600090815260046020819052604080832080546001600160a01b031990811682556001820185905560028201949094556003018054909316909255905163a9059cbb60e01b81529184169163a9059cbb91610a469185918891016127eb565b602060405180830381600087803b158015610a6057600080fd5b505af1158015610a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9891906125df565b610aa157600080fd5b610ab48582610aaf886112c8565b611af7565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee85604051610af79190612a4b565b60405180910390a35050505050565b600b5481565b60025490565b6001600160a01b03808216600090815260046020526040902054165b919050565b6000610b40848484611af7565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600160ff1b811015610b8457610b848533610b7f8685612ab9565b611a9c565b506001949350505050565b610b988161164c565b610bb45760405162461bcd60e51b815260040161097690612979565b6000610bbf836112e3565b905060008111610be15760405162461bcd60e51b8152600401610976906129ba565b336000610bed846112c8565b90506000610bfb8483612a9a565b90508582610c1b5760405162461bcd60e51b81526004016109769061299b565b6001600160a01b03861660009081526004602052604090206001015415610c545760405162461bcd60e51b81526004016109769061292a565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90610c84908790309087906004016127c7565b602060405180830381600087803b158015610c9e57600080fd5b505af1158015610cb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd691906125df565b610cdf57600080fd5b604080516080810182526001600160a01b038087168083526020808401878152428587019081528d8516606087019081528d86166000818152600490955293889020965187549087166001600160a01b0319918216178855925160018801559051600287015551600390950180549590941694169390931790915591517f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535990610d89908790612a4b565b60405180910390a350505050505050565b60085460408051632a0a4ed560e01b815290516000926001600160a01b031691632a0a4ed5916004808301926020929190829003018186803b158015610ddf57600080fd5b505afa158015610df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e179190612480565b905090565b60035460ff1681565b610e2d610d9a565b6001600160a01b0316336001600160a01b031614610e5d5760405162461bcd60e51b8152600401610976906129e2565b6001600160a01b038082166000908152600460209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091610ecb5760405162461bcd60e51b815260040161097690612a05565b6001600160a01b03808416600090815260046020818152604080842080546001600160a01b031990811682556001820186905560028201959095556003018054909416909355855190860151925163a9059cbb60e01b81529385169363a9059cbb93610f39939091016127eb565b602060405180830381600087803b158015610f5357600080fd5b505af1158015610f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8b91906125df565b610f9457600080fd5b81600001516001600160a01b0316836001600160a01b03167fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d58460200151604051610fdf9190612a4b565b60405180910390a3505050565b600a546001600160a01b031633141561101057600a80546001600160a01b03191690555b565b6001600160a01b039081166000908152600460205260409020600301541690565b6000806110408686611695565b905080156110cf57604051635260769b60e11b81526001600160a01b0387169063a4c0ed369061107a903390899089908990600401612804565b602060405180830381600087803b15801561109457600080fd5b505af11580156110a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cc91906125df565b90505b95945050505050565b6110e23382611bb4565b60006110ec611645565b6110f8576009546110fb565b60015b6008549091506001600160a01b03166342966c686111198385612a9a565b6040518263ffffffff1660e01b81526004016111359190612a4b565b600060405180830381600087803b15801561114f57600080fd5b505af1158015611163573d6000803e3d6000fd5b505050505050565b6008546001600160a01b031681565b60075481565b336000908152600560205260409020805460ff19169115919091179055565b33600090815260046020526040902060010154156110105733600081815260046020819052604080832060018101805460038301805484546001600160a01b0319908116865593889055600290940196909655908216909455905163a9059cbb60e01b815292936001600160a01b0390911692839263a9059cbb926112289290918791016127eb565b602060405180830381600087803b15801561124257600080fd5b505af1158015611256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127a91906125df565b61128357600080fd5b336001600160a01b03167f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd836040516112bc9190612a4b565b60405180910390a25050565b6001600160a01b031660009081526020819052604090205490565b6000806112ef83611c4e565b905080156112fe579050610b2e565b6008546001600160a01b038481169116141561131e575050600954610b2e565b6009546008546040516377e071ad60e01b81526001600160a01b03909116906377e071ad906113519087906004016127b3565b60206040518083038186803b15801561136957600080fd5b505afa15801561137d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a191906126f4565b6113ab9190612a9a565b915050610b2e565b50919050565b62ed4e0081565b336113c9611c90565b156113d357600080fd5b611f406113de610b0c565b6113e89190612a9a565b6113f1826112c8565b6113fd90612710612a9a565b101561141b5760405162461bcd60e51b81526004016109769061290a565b6114258182611ca1565b7f3b6b79a09e9fd230e8591b65c97236bf7df7a604edf733db0658e66b0e6eb2a98160405161145491906127b3565b60405180910390a150565b600854604051636427ed9760e01b81526001600160a01b0390911690636427ed979061149090600090600401612877565b600060405180830381600087803b1580156114aa57600080fd5b505af11580156114be573d6000803e3d6000fd5b50505050565b60006114ce611e69565b90506114d8611eae565b6114e181611ff7565b50565b60606114ee611645565b1561158d57600860009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561154157600080fd5b505afa158015611555573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261157d9190810190612633565b604051602001610828919061270c565b600860009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156115db57600080fd5b505afa1580156115ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116179190810190612633565b6040516020016108289190612735565b6001600160a01b031660009081526004602052604090206001015490565b6009541590565b6001600160a01b031660009081526005602052604090205460ff161590565b6008546000906001600160a01b0316331461168557600080fd5b610b848585612258565b600c5481565b60006116a183836122f9565b9392505050565b60056020526000908152604090205460ff1681565b6008546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906116f1903390309086906004016127c7565b602060405180830381600087803b15801561170b57600080fd5b505af115801561171f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174391906125df565b61174c57600080fd5b6117568282612258565b5050565b600a546001600160a01b031681565b73f9f92751f272f0872e2edb6a280b0990f3e2b8a381565b60046020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391921684565b600d80546117c090612afc565b80601f01602080910402602001604051908101604052809291908181526020018280546117ec90612afc565b80156118395780601f1061180e57610100808354040283529160200191611839565b820191906000526020600020905b81548152906001019060200180831161181c57829003601f168201915b505050505081565b611849611645565b61185257600080fd5b600b54600c54604051634dc5e43160e01b815260009273f9f92751f272f0872e2edb6a280b0990f3e2b8a392634dc5e43192349261189a928a9233928b928b92600401612882565b6020604051808303818588803b1580156118b357600080fd5b505af11580156118c7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118ec9190612480565b90506118f6611c90565b156119da57806001600160a01b0316633f5e3e7f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561193657600080fd5b505af115801561194a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196e91906125df565b61197757600080fd5b600a546040516306a169ed60e01b81526001600160a01b03909116906306a169ed906119a79084906004016127b3565b600060405180830381600087803b1580156119c157600080fd5b505af11580156119d5573d6000803e3d6000fd5b505050505b600a80546001600160a01b0319166001600160a01b0392909216919091179055505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611a32611645565b15611a3c57600080fd5b6114e13382600954612316565b6001600160a01b031660009081526004602052604090206002015490565b600a546001600160a01b03163314611a7e57600080fd5b611a9282611a8b846112c8565b6001612316565b6117568183611ca1565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610fdf908590612a4b565b6001600160a01b038216611b0a57600080fd5b611b158383836123b9565b6001600160a01b03831660009081526020819052604081208054839290611b3d908490612ab9565b90915550506001600160a01b03821660009081526020819052604081208054839290611b6a908490612a62565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fdf9190612a4b565b611bc0826000836123b9565b8060026000828254611bd29190612ab9565b90915550506001600160a01b03821660009081526020819052604081208054839290611bff908490612ab9565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c42908590612a4b565b60405180910390a35050565b60006001600160a01b038216301415611c6957506001610b2e565b6006546001600160a01b0383811691161415611c885750600754610b2e565b506000610b2e565b600a546001600160a01b0316151590565b611ca9611645565b611cb257600080fd5b6008546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90839083906370a0823190611cec9030906004016127b3565b60206040518083038186803b158015611d0457600080fd5b505afa158015611d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3c91906126f4565b6040518363ffffffff1660e01b8152600401611d599291906127eb565b602060405180830381600087803b158015611d7357600080fd5b505af1158015611d87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dab91906125df565b611db457600080fd5b600880546001600160a01b0319166001600160a01b038416179055611756611dda610b0c565b6008546040516370a0823160e01b81526001600160a01b03909116906370a0823190611e0a9030906004016127b3565b60206040518083038186803b158015611e2257600080fd5b505afa158015611e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5a91906126f4565b611e649190612a7a565b612431565b60085460408051635804791360e01b815290516000926001600160a01b0316916358047913916004808301926020929190829003018186803b158015610ddf57600080fd5b6008547f000000000000000000000000ae7c2042c2f84ff5880a185bd7d81da5b822b3a76001600160a01b0390811691161415611eea57600080fd5b600854604080516318160ddd60e01b815290516001600160a01b039092169160009183916318160ddd9160048082019260209290919082900301818787803b158015611f3557600080fd5b505af1158015611f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6d91906126f4565b90506000611f79610b0c565b90506000611f878284612ab9565b9050611f933082612258565b611f9e308583611a9c565b836001600160a01b0316638fd3ab806040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611fd957600080fd5b505af1158015611fed573d6000803e3d6000fd5b5050505050505050565b6040516370a0823160e01b815281906001600160a01b0382169063095ea7b3907f000000000000000000000000ae7c2042c2f84ff5880a185bd7d81da5b822b3a79083906370a082319061204f9030906004016127b3565b60206040518083038186803b15801561206757600080fd5b505afa15801561207b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209f91906126f4565b6040518363ffffffff1660e01b81526004016120bc9291906127eb565b602060405180830381600087803b1580156120d657600080fd5b505af11580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e91906125df565b507f000000000000000000000000ae7c2042c2f84ff5880a185bd7d81da5b822b3a76001600160a01b031663e9850eb36040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561216a57600080fd5b505af115801561217e573d6000803e3d6000fd5b5050600880546001600160a01b0319167f000000000000000000000000ae7c2042c2f84ff5880a185bd7d81da5b822b3a76001600160a01b0316179055506121c6905061145f565b6008546040516370a0823160e01b81526001600160a01b03909116906370a08231906121f69030906004016127b3565b60206040518083038186803b15801561220e57600080fd5b505afa158015612222573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224691906126f4565b61224e610b0c565b1461175657600080fd5b6001600160a01b03821661226b57600080fd5b612277600083836123b9565b80600260008282546122899190612a62565b90915550506001600160a01b038216600090815260208190526040812080548392906122b6908490612a62565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c42908590612a4b565b60006123058383612457565b61230e57600080fd5b6108ee61119f565b6123208383611bb4565b6008546001600160a01b031663a9059cbb8461233c8486612a9a565b6040518363ffffffff1660e01b81526004016123599291906127eb565b602060405180830381600087803b15801561237357600080fd5b505af1158015612387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ab91906125df565b6123b457600080fd5b505050565b6123c1611c90565b156123b457600a5460405163e1a1810f60e01b81526001600160a01b039091169063e1a1810f906123fa908690869086906004016127c7565b600060405180830381600087803b15801561241457600080fd5b505af1158015612428573d6000803e3d6000fd5b50505050505050565b60018110156124525760405162461bcd60e51b8152600401610976906128ea565b600955565b60006108ee338484611af7565b600060208284031215612475578081fd5b81356116a181612b5d565b600060208284031215612491578081fd5b81516116a181612b5d565b600080604083850312156124ae578081fd5b82356124b981612b5d565b915060208301356124c981612b5d565b809150509250929050565b6000806000606084860312156124e8578081fd5b83356124f381612b5d565b9250602084013561250381612b5d565b929592945050506040919091013590565b60008060408385031215612526578182fd5b823561253181612b5d565b946020939093013593505050565b60008060008060608587031215612554578081fd5b843561255f81612b5d565b935060208501359250604085013567ffffffffffffffff80821115612582578283fd5b818701915087601f830112612595578283fd5b8135818111156125a3578384fd5b8860208285010111156125b4578384fd5b95989497505060200194505050565b6000602082840312156125d4578081fd5b81356116a181612b72565b6000602082840312156125f0578081fd5b81516116a181612b72565b60008060006060848603121561260f578283fd5b8335925060208401359150604084013561262881612b5d565b809150509250925092565b600060208284031215612644578081fd5b815167ffffffffffffffff8082111561265b578283fd5b818401915084601f83011261266e578283fd5b81518181111561268057612680612b47565b604051601f8201601f19908116603f011681019083821181831017156126a8576126a8612b47565b816040528281528760208487010111156126c0578586fd5b6126d1836020830160208801612ad0565b979650505050505050565b6000602082840312156126ed578081fd5b5035919050565b600060208284031215612705578081fd5b5051919050565b6000601160fa1b82528251612728816001850160208701612ad0565b9190910160010192915050565b6000605760f81b82528251612728816001850160208701612ad0565b6000690223930b3b3b0b13632960b51b8252825161277681600a850160208701612ad0565b91909101600a0192915050565b60006702bb930b83832b2160c51b825282516127a6816008850160208701612ad0565b9190910160080192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b901515815260200190565b9586526001600160a01b039485166020870152604086019390935292166060840152608083019190915260a082015260c00190565b60006020825282518060208401526128d6816040850160208701612ad0565b601f01601f19169190910160400192915050565b6020808252600690820152653330b1ba37b960d11b604082015260600190565b60208082526006908201526571756f72756d60d01b604082015260600190565b6020808252600f908201526e185b1c9958591e4818db185a5b5959608a1b604082015260600190565b6020808252600c908201526b1b9bdd0818db185a5b585b9d60a21b604082015260600190565b602080825260089082015267191a5cd8589b195960c21b604082015260600190565b602080825260059082015264656d70747960d81b604082015260600190565b6020808252600e908201526d1898590818dbdb1b185d195c985b60921b604082015260600190565b6020808252600990820152686e6f2061636365737360b81b604082015260600190565b6020808252600990820152681b9bdd08199bdd5b9960ba1b604082015260600190565b602080825260099082015268746f6f206561726c7960b81b604082015260600190565b90815260200190565b60ff91909116815260200190565b60008219821115612a7557612a75612b31565b500190565b600082612a9557634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612ab457612ab4612b31565b500290565b600082821015612acb57612acb612b31565b500390565b60005b83811015612aeb578181015183820152602001612ad3565b838111156114be5750506000910152565b600281046001821680612b1057607f821691505b602082108114156113b357634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114e157600080fd5b80151581146114e157600080fdfea264697066735822122088d83b87e94f3c6e56492bc72a9b8184e84cf27aa5343b59639f9820ece81ea764736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ae7c2042c2f84ff5880a185bd7d81da5b822b3a700000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000414324b0aba49fb14cbfb37be40d8d78a2edf4470000000000000000000000000000000000000000000000000000000000001d4c00000000000000000000000000000000000000000000000000000000004f1a00000000000000000000000000000000000000000000000000000000000000001371756974742e63682f696e766573746f72656e00000000000000000000000000
-----Decoded View---------------
Arg [0] : newBaseToken_ (address): 0xAe7c2042c2f84Ff5880A185Bd7D81dA5B822B3A7
Arg [1] : _terms (string): quitt.ch/investoren
Arg [2] : predecessor (address): 0x414324B0aBA49Fb14CbFB37BE40D8D78A2edf447
Arg [3] : quorum (uint256): 7500
Arg [4] : votePeriod (uint256): 5184000
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000ae7c2042c2f84ff5880a185bd7d81da5b822b3a7
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000414324b0aba49fb14cbfb37be40d8d78a2edf447
Arg [3] : 0000000000000000000000000000000000000000000000000000000000001d4c
Arg [4] : 00000000000000000000000000000000000000000000000000000000004f1a00
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [6] : 71756974742e63682f696e766573746f72656e00000000000000000000000000
Deployed Bytecode Sourcemap
3007:1560:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3377:274:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2669:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3085:157:2:-;;;;;;;;;;-1:-1:-1;3085:157:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3373:38:4:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9826:671::-;;;;;;;;;;-1:-1:-1;9826:671:4;;;;;:::i;:::-;;:::i;:::-;;2868:21:3;;;;;;;;;;;;;:::i;2064:100:2:-;;;;;;;;;;;;;:::i;8255:126:4:-;;;;;;;;;;-1:-1:-1;8255:126:4;;;;;:::i;:::-;;:::i;3713:508:2:-;;;;;;;;;;-1:-1:-1;3713:508:2;;;;;:::i;:::-;;:::i;7323:924:4:-;;;;;;;;;;-1:-1:-1;7323:924:4;;;;;:::i;:::-;;:::i;3610:140:0:-;;;;;;;;;;;;;:::i;1892:30:2:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10638:464:4:-;;;;;;;;;;-1:-1:-1;10638:464:4;;;;;:::i;:::-;;:::i;6939:139:3:-;;;;;;;;;;;;;:::i;8527:136:4:-;;;;;;;;;;-1:-1:-1;8527:136:4;;;;;:::i;:::-;;:::i;5127:313:2:-;;;;;;;;;;-1:-1:-1;5127:313:2;;;;;:::i;:::-;;:::i;6076:209:3:-;;;;;;;;;;-1:-1:-1;6076:209:3;;;;;:::i;:::-;;:::i;2319:21::-;;;;;;;;;;;;;:::i;3418:35:4:-;;;;;;;;;;;;;:::i;5066:103::-;;;;;;;;;;-1:-1:-1;5066:103:4;;;;;:::i;:::-;;:::i;9243:397::-;;;;;;;;;;;;;:::i;2227:119:2:-;;;;;;;;;;-1:-1:-1;2227:119:2;;;;;:::i;:::-;;:::i;3758:648:0:-;;;;;;;;;;-1:-1:-1;3758:648:0;;;;;:::i;:::-;;:::i;3012:46:4:-;;;;;;;;;;;;;:::i;7509:366:3:-;;;;;;;;;;;;;:::i;3259:110::-;;;;;;;;;;;;;:::i;3409:129:1:-;;;;;;;;;;;;;:::i;3659:264:3:-;;;;;;;;;;;;;:::i;8389:130:4:-;;;;;;;;;;-1:-1:-1;8389:130:4;;;;;:::i;:::-;;:::i;4787:101:3:-;;;;;;;;;;;;;:::i;5351:121:4:-;;;;;;;;;;-1:-1:-1;5351:121:4;;;;;:::i;:::-;;:::i;3931:212:3:-;;;;;;;;;;-1:-1:-1;3931:212:3;;;;;:::i;:::-;;:::i;2919:25::-;;;;;;;;;;;;;:::i;3450:152:0:-;;;;;;;;;;-1:-1:-1;3450:152:0;;;;;:::i;:::-;;:::i;3192:48:4:-;;;;;;;;;;-1:-1:-1;3192:48:4;;;;;:::i;:::-;;:::i;4265:178:3:-;;;;;;;;;;-1:-1:-1;4265:178:3;;;;;:::i;:::-;;:::i;2840:19::-;;;;;;;;;;;;;:::i;2400:97::-;;;;;;;;;;;;;:::i;3067:39:4:-;;;;;;;;;;-1:-1:-1;3067:39:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;3078:19:0:-;;;;;;;;;;;;;:::i;6293:433:3:-;;;;;;:::i;:::-;;:::i;2795:143:2:-;;;;;;;;;;-1:-1:-1;2795:143:2;;;;;:::i;:::-;;:::i;5232:140:3:-;;;;;;;;;;-1:-1:-1;5232:140:3;;;;;:::i;:::-;;:::i;8671:128:4:-;;;;;;;;;;-1:-1:-1;8671:128:4;;;;;:::i;:::-;;:::i;6734:197:3:-;;;;;;;;;;-1:-1:-1;6734:197:3;;;;;:::i;:::-;;:::i;3377:274::-;3423:13;3452:11;:9;:11::i;:::-;3448:196;;;3524:7;;;;;;;;;-1:-1:-1;;;;;3524:7:3;-1:-1:-1;;;;;3524:12:3;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3524:14:3;;;;;;;;;;;;:::i;:::-;3493:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;3479:61;;;;3448:196;3616:7;;;;;;;;;-1:-1:-1;;;;;3616:7:3;-1:-1:-1;;;;;3616:12:3;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3616:14:3;;;;;;;;;;;;:::i;:::-;3587:44;;;;;;;;:::i;3448:196::-;3377:274;:::o;2669:41::-;;;;:::o;3085:157:2:-;3159:4;3176:36;3185:10;3197:7;3206:5;3176:8;:36::i;:::-;-1:-1:-1;3230:4:2;3085:157;;;;:::o;3373:38:4:-;;;-1:-1:-1;;;;;3373:38:4;;:::o;9826:671::-;-1:-1:-1;;;;;9903:19:4;;;9882:18;9903:19;;;:6;:19;;;;;;;;;9882:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10044:15;10036:37;;;;-1:-1:-1;;;10036:37:4;;;;;;;:::i;:::-;;;;;;;;;10092:14;;-1:-1:-1;;;;;10092:28:4;10110:10;10092:28;10084:53;;;;-1:-1:-1;;;10084:53:4;;;;;;;:::i;:::-;10189:15;3050:8;10156:5;:15;;;:29;;;;:::i;:::-;:48;;10148:70;;;;-1:-1:-1;;;10148:70:4;;;;;;;:::i;:::-;10248:14;;-1:-1:-1;;;;;10280:19:4;;;10229:16;10280:19;;;:6;:19;;;;;;;;10273:26;;-1:-1:-1;;;;;;10273:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;10318:39;;-1:-1:-1;;;10318:39:4;;:17;;;;;;:39;;10248:14;;10346:10;;10318:39;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10310:48;;;;;;10369:56;10379:11;10392:8;10402:22;10412:11;10402:9;:22::i;:::-;10369:9;:56::i;:::-;10468:8;-1:-1:-1;;;;;10441:48:4;10455:11;-1:-1:-1;;;;;10441:48:4;;10478:10;10441:48;;;;;;:::i;:::-;;;;;;;;9826:671;;;;;:::o;2868:21:3:-;;;;:::o;2064:100:2:-;2144:12;;2064:100;:::o;8255:126:4:-;-1:-1:-1;;;;;8345:19:4;;;8318:7;8345:19;;;:6;:19;;;;;:28;;8255:126;;;;:::o;3713:508:2:-;3811:4;3828:36;3838:6;3846:9;3857:6;3828:9;:36::i;:::-;-1:-1:-1;;;;;3902:19:2;;3875:24;3902:19;;;:11;:19;;;;;;;;3922:10;3902:31;;;;;;;;-1:-1:-1;;;3948:29:2;;3944:248;;;4125:55;4134:6;4142:10;4154:25;4173:6;4154:16;:25;:::i;:::-;4125:8;:55::i;:::-;-1:-1:-1;4209:4:2;;3713:508;-1:-1:-1;;;;3713:508:2:o;7323:924:4:-;7415:30;7433:11;7415:17;:30::i;:::-;7407:51;;;;-1:-1:-1;;;7407:51:4;;;;;;;:::i;:::-;7469:22;7494:33;7512:14;7494:17;:33::i;:::-;7469:58;;7563:1;7546:14;:18;7538:45;;;;-1:-1:-1;;;7538:45:4;;;;;;;:::i;:::-;7613:10;7594:16;7652:22;7662:11;7652:9;:22::i;:::-;7634:40;-1:-1:-1;7685:18:4;7706:24;7716:14;7634:40;7706:24;:::i;:::-;7685:45;-1:-1:-1;7766:14:4;7800:11;7792:29;;;;-1:-1:-1;;;7792:29:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;7840:19:4;;;;;;:6;:19;;;;;:30;;;:35;7832:63;;;;-1:-1:-1;;;7832:63:4;;;;;;;:::i;:::-;7914:58;;-1:-1:-1;;;7914:58:4;;-1:-1:-1;;;;;7914:21:4;;;;;:58;;7936:8;;7954:4;;7961:10;;7914:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7906:67;;;;;;8008:172;;;;;;;;-1:-1:-1;;;;;8008:172:4;;;;;;;;;;;;;8110:15;8008:172;;;;;;;;;;;;;;;7986:19;;;-1:-1:-1;7986:19:4;;;:6;:19;;;;;;;:194;;;;;;;-1:-1:-1;;;;;;7986:194:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8198:41;;;;;;8231:7;;8198:41;:::i;:::-;;;;;;;;7323:924;;;;;;;:::o;3610:140:0:-;3715:7;;3694:48;;;-1:-1:-1;;;3694:48:0;;;;3667:7;;-1:-1:-1;;;;;3715:7:0;;3694:46;;:48;;;;;;;;;;;;;;3715:7;3694:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3687:55;;3610:140;:::o;1892:30:2:-;;;;;;:::o;10638:464:4:-;10720:17;:15;:17::i;:::-;-1:-1:-1;;;;;10706:31:4;:10;-1:-1:-1;;;;;10706:31:4;;10698:53;;;;-1:-1:-1;;;10698:53:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;10783:19:4;;;10762:18;10783:19;;;:6;:19;;;;;;;;;10762:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10868:43;;;;-1:-1:-1;;;10868:43:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;10929:19:4;;;;;;;:6;:19;;;;;;;;10922:26;;-1:-1:-1;;;;;;10922:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;10985:14;;11001:16;;;;10967:51;;-1:-1:-1;;;10967:51:4;;:17;;;;;;:51;;11001:16;;10967:51;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10959:60;;;;;;11061:5;:14;;;-1:-1:-1;;;;;11035:59:4;11048:11;-1:-1:-1;;;;;11035:59:4;;11077:5;:16;;;11035:59;;;;;;:::i;:::-;;;;;;;;10638:464;;;:::o;6939:139:3:-;7011:5;;-1:-1:-1;;;;;7011:5:3;6989:10;:28;6985:86;;;7033:5;:26;;-1:-1:-1;;;;;;7033:26:3;;;6985:86;6939:139::o;8527:136:4:-;-1:-1:-1;;;;;8623:19:4;;;8596:7;8623:19;;;:6;:19;;;;;:32;;;;;8527:136::o;5127:313:2:-;5221:4;5238:12;5253:27;5262:9;5273:6;5253:8;:27::i;:::-;5238:42;;5295:7;5291:117;;;5328:68;;-1:-1:-1;;;5328:68:2;;-1:-1:-1;;;;;5328:42:2;;;;;:68;;5371:10;;5383:6;;5391:4;;;;5328:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5318:78;;5291:117;5425:7;5127:313;-1:-1:-1;;;;;5127:313:2:o;6076:209:3:-;6124:25;6130:10;6142:6;6124:5;:25::i;:::-;6160:14;6177:11;:9;:11::i;:::-;:40;;6195:22;;6177:40;;;6191:1;6177:40;6246:7;;6160:57;;-1:-1:-1;;;;;;6246:7:3;6228:32;6261:15;6160:57;6261:6;:15;:::i;:::-;6228:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6076:209;;:::o;2319:21::-;;;-1:-1:-1;;;;;2319:21:3;;:::o;3418:35:4:-;;;;:::o;5066:103::-;5139:10;5122:28;;;;:16;:28;;;;;:39;;-1:-1:-1;;5122:39:4;5153:8;;5122:39;;;;;;5066:103::o;9243:397::-;9294:10;9287:18;;;;:6;:18;;;;;:29;;;:34;9283:350;;9366:10;9338:18;9359;;;:6;:18;;;;;;;;:29;;;;;9428:31;;;;;9475:25;;-1:-1:-1;;;;;;9475:25:4;;;;;;;;;-1:-1:-1;9475:25:4;;;;;;;;;;;;;9523:41;;-1:-1:-1;;;9523:41:4;;9359:29;;-1:-1:-1;;;;;9428:31:4;;;;;;9523:17;;:41;;9366:10;;9359:29;;9523:41;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9515:50;;;;;;9598:10;-1:-1:-1;;;;;9585:36:4;;9610:10;9585:36;;;;;;:::i;:::-;;;;;;;;9283:350;;9243:397::o;2227:119:2:-;-1:-1:-1;;;;;2320:18:2;2293:7;2320:18;;;;;;;;;;;;2227:119::o;3758:648:0:-;3839:7;3859:12;3874:39;3898:14;3874:23;:39::i;:::-;3859:54;-1:-1:-1;3928:8:0;;3924:475;;3960:4;-1:-1:-1;3953:11:0;;3924:475;4012:7;;-1:-1:-1;;;;;3986:34:0;;;4012:7;;3986:34;3982:417;;;-1:-1:-1;;4044:22:0;;4037:29;;3982:417;4365:22;;4319:7;;4298:64;;-1:-1:-1;;;4298:64:0;;-1:-1:-1;;;;;4319:7:0;;;;4298:48;;:64;;4347:14;;4298:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:89;;;;:::i;:::-;4291:96;;;;;3982:417;3758:648;;;;:::o;3012:46:4:-;3050:8;3012:46;:::o;7509:366:3:-;7566:10;7596:13;:11;:13::i;:::-;7595:14;7587:23;;;;;;2550:4;7732:13;:11;:13::i;:::-;:32;;;;:::i;:::-;7700:20;7710:9;7700;:20::i;:::-;:28;;7723:5;7700:28;:::i;:::-;:64;;7692:83;;;;-1:-1:-1;;;7692:83:3;;;;;;;:::i;:::-;7786:36;7801:9;7812;7786:14;:36::i;:::-;7838:29;7857:9;7838:29;;;;;;:::i;:::-;;;;;;;;7509:366;:::o;3259:110::-;3330:7;;3304:57;;-1:-1:-1;;;3304:57:3;;-1:-1:-1;;;;;3330:7:3;;;;3304:50;;:57;;3330:7;;3304:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3259:110::o;3409:129:1:-;3446:15;3464:12;:10;:12::i;:::-;3446:30;;3487:13;:11;:13::i;:::-;3511:19;3522:7;3511:10;:19::i;:::-;3409:129;:::o;3659:264:3:-;3707:13;3736:11;:9;:11::i;:::-;3732:184;;;3799:7;;;;;;;;;-1:-1:-1;;;;;3799:7:3;-1:-1:-1;;;;;3799:14:3;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3799:16:3;;;;;;;;;;;;:::i;:::-;3777:39;;;;;;;;:::i;3732:184::-;3886:7;;;;;;;;;-1:-1:-1;;;;;3886:7:3;-1:-1:-1;;;;;3886:14:3;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3886:16:3;;;;;;;;;;;;:::i;:::-;3864:39;;;;;;;;:::i;8389:130:4:-;-1:-1:-1;;;;;8481:19:4;8454:7;8481:19;;;:6;:19;;;;;:30;;;;8389:130::o;4787:101:3:-;4853:22;;:27;4787:101;:::o;5351:121:4:-;-1:-1:-1;;;;;5440:24:4;5415:4;5440:24;;;:16;:24;;;;;;;;5439:25;;5351:121::o;3931:212:3:-;4074:7;;4027:4;;-1:-1:-1;;;;;4074:7:3;4052:10;:30;4044:39;;;;;;4094:19;4100:4;4106:6;4094:5;:19::i;2919:25::-;;;;:::o;3450:152:0:-;3545:4;3569:25;3584:2;3588:5;3569:14;:25::i;:::-;3562:32;3450:152;-1:-1:-1;;;3450:152:0:o;3192:48:4:-;;;;;;;;;;;;;;;:::o;4265:178:3:-;4342:7;;:55;;-1:-1:-1;;;4342:55:3;;-1:-1:-1;;;;;4342:7:3;;;;:20;;:55;;4363:10;;4383:4;;4390:6;;4342:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4334:64;;;;;;4409:26;4415:11;4428:6;4409:5;:26::i;:::-;4265:178;;:::o;2840:19::-;;;-1:-1:-1;;;;;2840:19:3;;:::o;2400:97::-;2454:42;2400:97;:::o;3067:39:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3067:39:4;;;;;;;;:::o;3078:19:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6293:433:3:-;6412:11;:9;:11::i;:::-;6404:20;;;;;;6530:6;;6538:10;;6454:95;;-1:-1:-1;;;6454:95:3;;6435:16;;2454:42;;6454:14;;6476:9;;6454:95;;6487:4;;6493:10;;6505:13;;6520:8;;6454:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6435:114;;6564:13;:11;:13::i;:::-;6560:124;;;6609:8;-1:-1:-1;;;;;6602:29:3;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6594:40;;;;;;6649:5;;:23;;-1:-1:-1;;;6649:23:3;;-1:-1:-1;;;;;6649:5:3;;;;:13;;:23;;6663:8;;6649:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6560:124;6694:5;:24;;-1:-1:-1;;;;;;6694:24:3;-1:-1:-1;;;;;6694:24:3;;;;;;;;;;-1:-1:-1;;;6293:433:3:o;2795:143:2:-;-1:-1:-1;;;;;2903:18:2;;;2876:7;2903:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2795:143::o;5232:140:3:-;5291:11;:9;:11::i;:::-;5290:12;5282:21;;;;;;5314:50;5321:10;5333:6;5341:22;;5314:6;:50::i;8671:128:4:-;-1:-1:-1;;;;;8762:19:4;8735:7;8762:19;;;:6;:19;;;;;:29;;;;8671:128::o;6734:197:3:-;6829:5;;-1:-1:-1;;;;;6829:5:3;6807:10;:28;6799:37;;;;;;6847:34;6854:5;6861:16;6871:5;6861:9;:16::i;:::-;6879:1;6847:6;:34::i;:::-;6892:31;6907:8;6917:5;6892:14;:31::i;7067:175:2:-;-1:-1:-1;;;;;7152:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:35;;;7203:31;;;;;7182:5;;7203:31;:::i;4711:330::-;-1:-1:-1;;;;;4817:23:2;;4809:32;;;;;;4854:47;4875:6;4883:9;4894:6;4854:20;:47::i;:::-;-1:-1:-1;;;;;4914:17:2;;:9;:17;;;;;;;;;;:27;;4935:6;;4914:9;:27;;4935:6;;4914:27;:::i;:::-;;;;-1:-1:-1;;;;;;;4952:20:2;;:9;:20;;;;;;;;;;:30;;4976:6;;4952:9;:30;;4976:6;;4952:30;:::i;:::-;;;;;;;;5015:9;-1:-1:-1;;;;;4998:35:2;5007:6;-1:-1:-1;;;;;4998:35:2;;5026:6;4998:35;;;;;;:::i;6367:260::-;6443:49;6464:7;6481:1;6485:6;6443:20;:49::i;:::-;6521:6;6505:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;6538:18:2;;:9;:18;;;;;;;;;;:28;;6560:6;;6538:9;:28;;6560:6;;6538:28;:::i;:::-;;;;-1:-1:-1;;6582:37:2;;6608:1;;-1:-1:-1;;;;;6582:37:2;;;;;;;6612:6;;6582:37;:::i;:::-;;;;;;;;6367:260;;:::o;3791:327:4:-;3871:7;-1:-1:-1;;;;;3895:31:4;;3921:4;3895:31;3891:220;;;-1:-1:-1;3950:1:4;3943:8;;3891:220;3991:23;;-1:-1:-1;;;;;3973:41:4;;;3991:23;;3973:41;3969:142;;;-1:-1:-1;4038:20:4;;4031:27;;3969:142;-1:-1:-1;4098:1:4;4091:8;;8080:106:3;8158:5;;-1:-1:-1;;;;;8158:5:3;8150:28;;8080:106;:::o;7086:415::-;7189:11;:9;:11::i;:::-;7181:20;;;;;;7268:7;;7308:32;;-1:-1:-1;;;7308:32:3;;-1:-1:-1;;;;;7268:7:3;;;;:16;;7285:21;;7268:7;;7308:17;;:32;;7334:4;;7308:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7268:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7260:82;;;;;;7394:7;:28;;-1:-1:-1;;;;;;7394:28:3;-1:-1:-1;;;;;7394:28:3;;;;;7433:60;7479:13;:11;:13::i;:::-;7444:7;;:32;;-1:-1:-1;;;7444:32:3;;-1:-1:-1;;;;;7444:7:3;;;;:17;;:32;;7470:4;;7444:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;7433:10;:60::i;4063:124:1:-;4149:7;;4135:44;;;-1:-1:-1;;;4135:44:1;;;;4108:7;;-1:-1:-1;;;;;4149:7:1;;4135:42;;:44;;;;;;;;;;;;;;4149:7;4135:44;;;;;;;;;;3546:509;3605:7;;3617:12;-1:-1:-1;;;;;3597:32:1;;;3605:7;;3597:32;;3589:41;;;;;;3675:7;;3712:25;;;-1:-1:-1;;;3712:25:1;;;;-1:-1:-1;;;;;3675:7:1;;;;3641:17;;3675:7;;3712:23;;:25;;;;;;;;;;;;;;;3641:17;3675:7;3712:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3695:42;;3748:15;3766:13;:11;:13::i;:::-;3748:31;-1:-1:-1;3790:15:1;3808:16;3748:31;3808:6;:16;:::i;:::-;3790:34;;3921:29;3935:4;3942:7;3921:5;:29::i;:::-;3961:54;3978:4;3993:11;4007:7;3961:8;:54::i;:::-;4026:11;-1:-1:-1;;;;;4026:19:1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3546:509;;;;:::o;4195:369::-;4331:32;;-1:-1:-1;;;4331:32:1;;4279:10;;-1:-1:-1;;;;;4301:15:1;;;;;4317:12;;4301:15;;4331:17;;:32;;4357:4;;4331:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4301:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4386:12;-1:-1:-1;;;;;4375:41:1;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4429:7:1;:30;;-1:-1:-1;;;;;;4429:30:1;4446:12;-1:-1:-1;;;;;4429:30:1;;;;-1:-1:-1;4470:17:1;;-1:-1:-1;4470:15:1;:17::i;:::-;4523:7;;:32;;-1:-1:-1;;;4523:32:1;;-1:-1:-1;;;;;4523:7:1;;;;:17;;:32;;4549:4;;4523:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4506:13;:11;:13::i;:::-;:49;4498:58;;;;;5721:313:2;-1:-1:-1;;;;;5807:23:2;;5799:32;;;;;;5844:51;5873:1;5877:9;5888:6;5844:20;:51::i;:::-;5924:6;5908:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;5941:20:2;;:9;:20;;;;;;;;;;:30;;5965:6;;5941:9;:30;;5965:6;;5941:30;:::i;:::-;;;;-1:-1:-1;;5987:39:2;;-1:-1:-1;;;;;5987:39:2;;;6004:1;;5987:39;;;;6019:6;;5987:39;:::i;8807:198:4:-;8893:4;8918:33;8933:9;8944:6;8918:14;:33::i;:::-;8910:42;;;;;;8963:12;:10;:12::i;5384:171:3:-;5467:20;5473:5;5480:6;5467:5;:20::i;:::-;5506:7;;-1:-1:-1;;;;;5506:7:3;:16;5523:5;5530:15;5539:6;5530;:15;:::i;:::-;5506:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5498:49;;;;;;5384:171;;;:::o;7883:189::-;7988:13;:11;:13::i;:::-;7984:81;;;8018:5;;:35;;-1:-1:-1;;;8018:35:3;;-1:-1:-1;;;;;8018:5:3;;;;:17;;:35;;8036:4;;8042:2;;8046:6;;8018:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7883:189;;;:::o;4992:136::-;5066:1;5056:6;:11;;5048:30;;;;-1:-1:-1;;;5048:30:3;;;;;;;:::i;:::-;5089:22;:31;4992:136::o;2559:173:2:-;2645:4;2662:40;2672:10;2684:9;2695:6;2662:9;:40::i;14:259:7:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;546:402::-;;;675:2;663:9;654:7;650:23;646:32;643:2;;;696:6;688;681:22;643:2;740:9;727:23;759:33;786:5;759:33;:::i;:::-;811:5;-1:-1:-1;868:2:7;853:18;;840:32;881:35;840:32;881:35;:::i;:::-;935:7;925:17;;;633:315;;;;;:::o;953:470::-;;;;1099:2;1087:9;1078:7;1074:23;1070:32;1067:2;;;1120:6;1112;1105:22;1067:2;1164:9;1151:23;1183:33;1210:5;1183:33;:::i;:::-;1235:5;-1:-1:-1;1292:2:7;1277:18;;1264:32;1305:35;1264:32;1305:35;:::i;:::-;1057:366;;1359:7;;-1:-1:-1;;;1413:2:7;1398:18;;;;1385:32;;1057:366::o;1428:327::-;;;1557:2;1545:9;1536:7;1532:23;1528:32;1525:2;;;1578:6;1570;1563:22;1525:2;1622:9;1609:23;1641:33;1668:5;1641:33;:::i;:::-;1693:5;1745:2;1730:18;;;;1717:32;;-1:-1:-1;;;1515:240:7:o;1760:846::-;;;;;1925:2;1913:9;1904:7;1900:23;1896:32;1893:2;;;1946:6;1938;1931:22;1893:2;1990:9;1977:23;2009:33;2036:5;2009:33;:::i;:::-;2061:5;-1:-1:-1;2113:2:7;2098:18;;2085:32;;-1:-1:-1;2168:2:7;2153:18;;2140:32;2191:18;2221:14;;;2218:2;;;2253:6;2245;2238:22;2218:2;2296:6;2285:9;2281:22;2271:32;;2341:7;2334:4;2330:2;2326:13;2322:27;2312:2;;2368:6;2360;2353:22;2312:2;2413;2400:16;2439:2;2431:6;2428:14;2425:2;;;2460:6;2452;2445:22;2425:2;2510:7;2505:2;2496:6;2492:2;2488:15;2484:24;2481:37;2478:2;;;2536:6;2528;2521:22;2478:2;1883:723;;;;-1:-1:-1;;2572:2:7;2564:11;;-1:-1:-1;;;1883:723:7:o;2611:253::-;;2720:2;2708:9;2699:7;2695:23;2691:32;2688:2;;;2741:6;2733;2726:22;2688:2;2785:9;2772:23;2804:30;2828:5;2804:30;:::i;2869:257::-;;2989:2;2977:9;2968:7;2964:23;2960:32;2957:2;;;3010:6;3002;2995:22;2957:2;3047:9;3041:16;3066:30;3090:5;3066:30;:::i;3131:395::-;;;;3277:2;3265:9;3256:7;3252:23;3248:32;3245:2;;;3298:6;3290;3283:22;3245:2;3339:9;3326:23;3316:33;;3396:2;3385:9;3381:18;3368:32;3358:42;;3450:2;3439:9;3435:18;3422:32;3463:33;3490:5;3463:33;:::i;:::-;3515:5;3505:15;;;3235:291;;;;;:::o;3531:924::-;;3664:2;3652:9;3643:7;3639:23;3635:32;3632:2;;;3685:6;3677;3670:22;3632:2;3723:9;3717:16;3752:18;3793:2;3785:6;3782:14;3779:2;;;3814:6;3806;3799:22;3779:2;3857:6;3846:9;3842:22;3832:32;;3902:7;3895:4;3891:2;3887:13;3883:27;3873:2;;3929:6;3921;3914:22;3873:2;3963;3957:9;3985:2;3981;3978:10;3975:2;;;3991:18;;:::i;:::-;4066:2;4060:9;4034:2;4120:13;;-1:-1:-1;;4116:22:7;;;4140:2;4112:31;4108:40;4096:53;;;4164:18;;;4184:22;;;4161:46;4158:2;;;4210:18;;:::i;:::-;4250:10;4246:2;4239:22;4285:2;4277:6;4270:18;4325:7;4320:2;4315;4311;4307:11;4303:20;4300:33;4297:2;;;4351:6;4343;4336:22;4297:2;4369:55;4421:2;4416;4408:6;4404:15;4399:2;4395;4391:11;4369:55;:::i;:::-;4443:6;3622:833;-1:-1:-1;;;;;;;3622:833:7:o;4460:190::-;;4572:2;4560:9;4551:7;4547:23;4543:32;4540:2;;;4593:6;4585;4578:22;4540:2;-1:-1:-1;4621:23:7;;4530:120;-1:-1:-1;4530:120:7:o;4655:194::-;;4778:2;4766:9;4757:7;4753:23;4749:32;4746:2;;;4799:6;4791;4784:22;4746:2;-1:-1:-1;4827:16:7;;4736:113;-1:-1:-1;4736:113:7:o;4854:418::-;;-1:-1:-1;;;5111:3:7;5104:16;5149:6;5143:13;5165:61;5219:6;5215:1;5210:3;5206:11;5199:4;5191:6;5187:17;5165:61;:::i;:::-;5246:16;;;;5264:1;5242:24;;5094:178;-1:-1:-1;;5094:178:7:o;5277:418::-;;-1:-1:-1;;;5534:3:7;5527:16;5572:6;5566:13;5588:61;5642:6;5638:1;5633:3;5629:11;5622:4;5614:6;5610:17;5588:61;:::i;5700:429::-;;-1:-1:-1;;;5957:3:7;5950:25;6004:6;5998:13;6020:62;6075:6;6070:2;6065:3;6061:12;6054:4;6046:6;6042:17;6020:62;:::i;:::-;6102:16;;;;6120:2;6098:25;;5940:189;-1:-1:-1;;5940:189:7:o;6134:425::-;;-1:-1:-1;;;6391:3:7;6384:23;6436:6;6430:13;6452:61;6506:6;6502:1;6497:3;6493:11;6486:4;6478:6;6474:17;6452:61;:::i;:::-;6533:16;;;;6551:1;6529:24;;6374:185;-1:-1:-1;;6374:185:7:o;6564:203::-;-1:-1:-1;;;;;6728:32:7;;;;6710:51;;6698:2;6683:18;;6665:102::o;6772:375::-;-1:-1:-1;;;;;7030:15:7;;;7012:34;;7082:15;;;;7077:2;7062:18;;7055:43;7129:2;7114:18;;7107:34;;;;6962:2;6947:18;;6929:218::o;7152:274::-;-1:-1:-1;;;;;7344:32:7;;;;7326:51;;7408:2;7393:18;;7386:34;7314:2;7299:18;;7281:145::o;7431:562::-;-1:-1:-1;;;;;7644:32:7;;7626:51;;7708:2;7693:18;;7686:34;;;7756:2;7751;7736:18;;7729:30;;;7775:18;;7768:34;;;7431:562;7795:6;7845;7839:3;7824:19;;7811:49;7880:22;;;7904:3;7876:32;;;7869:46;;;;7976:2;7955:15;;;-1:-1:-1;;7951:29:7;7936:45;7932:55;;7616:377;-1:-1:-1;;;7616:377:7:o;7998:447::-;-1:-1:-1;;;;;8285:15:7;;;8267:34;;8332:2;8317:18;;8310:34;;;;8375:2;8360:18;;8353:34;;;;8423:15;;;8418:2;8403:18;;8396:43;8216:3;8201:19;;8183:262::o;8450:187::-;8615:14;;8608:22;8590:41;;8578:2;8563:18;;8545:92::o;8642:591::-;8929:25;;;-1:-1:-1;;;;;9028:15:7;;;9023:2;9008:18;;9001:43;9075:2;9060:18;;9053:34;;;;9123:15;;9118:2;9103:18;;9096:43;9170:3;9155:19;;9148:35;;;;8981:3;9199:19;;9192:35;8916:3;8901:19;;8883:350::o;9914:383::-;;10063:2;10052:9;10045:21;10095:6;10089:13;10138:6;10133:2;10122:9;10118:18;10111:34;10154:66;10213:6;10208:2;10197:9;10193:18;10188:2;10180:6;10176:15;10154:66;:::i;:::-;10281:2;10260:15;-1:-1:-1;;10256:29:7;10241:45;;;;10288:2;10237:54;;10035:262;-1:-1:-1;;10035:262:7:o;10302:329::-;10504:2;10486:21;;;10543:1;10523:18;;;10516:29;-1:-1:-1;;;10576:2:7;10561:18;;10554:36;10622:2;10607:18;;10476:155::o;10636:329::-;10838:2;10820:21;;;10877:1;10857:18;;;10850:29;-1:-1:-1;;;10910:2:7;10895:18;;10888:36;10956:2;10941:18;;10810:155::o;10970:339::-;11172:2;11154:21;;;11211:2;11191:18;;;11184:30;-1:-1:-1;;;11245:2:7;11230:18;;11223:45;11300:2;11285:18;;11144:165::o;11314:336::-;11516:2;11498:21;;;11555:2;11535:18;;;11528:30;-1:-1:-1;;;11589:2:7;11574:18;;11567:42;11641:2;11626:18;;11488:162::o;11655:331::-;11857:2;11839:21;;;11896:1;11876:18;;;11869:29;-1:-1:-1;;;11929:2:7;11914:18;;11907:38;11977:2;11962:18;;11829:157::o;11991:328::-;12193:2;12175:21;;;12232:1;12212:18;;;12205:29;-1:-1:-1;;;12265:2:7;12250:18;;12243:35;12310:2;12295:18;;12165:154::o;12324:338::-;12526:2;12508:21;;;12565:2;12545:18;;;12538:30;-1:-1:-1;;;12599:2:7;12584:18;;12577:44;12653:2;12638:18;;12498:164::o;12667:332::-;12869:2;12851:21;;;12908:1;12888:18;;;12881:29;-1:-1:-1;;;12941:2:7;12926:18;;12919:39;12990:2;12975:18;;12841:158::o;13004:332::-;13206:2;13188:21;;;13245:1;13225:18;;;13218:29;-1:-1:-1;;;13278:2:7;13263:18;;13256:39;13327:2;13312:18;;13178:158::o;13341:332::-;13543:2;13525:21;;;13582:1;13562:18;;;13555:29;-1:-1:-1;;;13615:2:7;13600:18;;13593:39;13664:2;13649:18;;13515:158::o;13678:177::-;13824:25;;;13812:2;13797:18;;13779:76::o;13860:184::-;14032:4;14020:17;;;;14002:36;;13990:2;13975:18;;13957:87::o;14049:128::-;;14120:1;14116:6;14113:1;14110:13;14107:2;;;14126:18;;:::i;:::-;-1:-1:-1;14162:9:7;;14097:80::o;14182:217::-;;14248:1;14238:2;;-1:-1:-1;;;14273:31:7;;14327:4;14324:1;14317:15;14355:4;14280:1;14345:15;14238:2;-1:-1:-1;14384:9:7;;14228:171::o;14404:168::-;;14510:1;14506;14502:6;14498:14;14495:1;14492:21;14487:1;14480:9;14473:17;14469:45;14466:2;;;14517:18;;:::i;:::-;-1:-1:-1;14557:9:7;;14456:116::o;14577:125::-;;14645:1;14642;14639:8;14636:2;;;14650:18;;:::i;:::-;-1:-1:-1;14687:9:7;;14626:76::o;14707:258::-;14779:1;14789:113;14803:6;14800:1;14797:13;14789:113;;;14879:11;;;14873:18;14860:11;;;14853:39;14825:2;14818:10;14789:113;;;14920:6;14917:1;14914:13;14911:2;;;-1:-1:-1;;14955:1:7;14937:16;;14930:27;14760:205::o;14970:380::-;15055:1;15045:12;;15102:1;15092:12;;;15113:2;;15167:4;15159:6;15155:17;15145:27;;15113:2;15220;15212:6;15209:14;15189:18;15186:38;15183:2;;;15266:10;15261:3;15257:20;15254:1;15247:31;15301:4;15298:1;15291:15;15329:4;15326:1;15319:15;15355:127;15416:10;15411:3;15407:20;15404:1;15397:31;15447:4;15444:1;15437:15;15471:4;15468:1;15461:15;15487:127;15548:10;15543:3;15539:20;15536:1;15529:31;15579:4;15576:1;15569:15;15603:4;15600:1;15593:15;15619:133;-1:-1:-1;;;;;15696:31:7;;15686:42;;15676:2;;15742:1;15739;15732:12;15757:120;15845:5;15838:13;15831:21;15824:5;15821:32;15811:2;;15867:1;15864;15857:12
Swarm Source
ipfs://88d83b87e94f3c6e56492bc72a9b8184e84cf27aa5343b59639f9820ece81ea7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.