Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 176 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer And Cal... | 21072544 | 4 days ago | IN | 0 ETH | 0.00153189 | ||||
Transfer And Cal... | 21046121 | 8 days ago | IN | 0 ETH | 0.00102033 | ||||
Transfer | 21046085 | 8 days ago | IN | 0 ETH | 0.00085404 | ||||
Transfer | 20955699 | 21 days ago | IN | 0 ETH | 0.00058431 | ||||
Transfer And Cal... | 20915288 | 26 days ago | IN | 0 ETH | 0.00302256 | ||||
Transfer And Cal... | 20885050 | 31 days ago | IN | 0 ETH | 0.00083104 | ||||
Transfer | 20777610 | 46 days ago | IN | 0 ETH | 0.00032346 | ||||
Transfer | 20740227 | 51 days ago | IN | 0 ETH | 0.00007291 | ||||
Transfer And Cal... | 20692452 | 57 days ago | IN | 0 ETH | 0.00156676 | ||||
Transfer And Cal... | 20673144 | 60 days ago | IN | 0 ETH | 0.00020232 | ||||
Transfer | 20673116 | 60 days ago | IN | 0 ETH | 0.00004177 | ||||
Transfer And Cal... | 20592606 | 71 days ago | IN | 0 ETH | 0.00031702 | ||||
Transfer | 20592576 | 71 days ago | IN | 0 ETH | 0.00008884 | ||||
Transfer | 20592541 | 71 days ago | IN | 0 ETH | 0.00008488 | ||||
Transfer | 20471325 | 88 days ago | IN | 0 ETH | 0.00018552 | ||||
Transfer | 20389780 | 100 days ago | IN | 0 ETH | 0.00019496 | ||||
Transfer And Cal... | 20383845 | 100 days ago | IN | 0 ETH | 0.00093384 | ||||
Transfer | 20331320 | 108 days ago | IN | 0 ETH | 0.00032545 | ||||
Transfer And Cal... | 20248275 | 119 days ago | IN | 0 ETH | 0.00039475 | ||||
Transfer | 20235586 | 121 days ago | IN | 0 ETH | 0.00046515 | ||||
Transfer | 20184746 | 128 days ago | IN | 0 ETH | 0.00092145 | ||||
Transfer And Cal... | 20175013 | 130 days ago | IN | 0 ETH | 0.00050443 | ||||
Transfer And Cal... | 20161679 | 132 days ago | IN | 0 ETH | 0.00063419 | ||||
Transfer And Cal... | 20161268 | 132 days ago | IN | 0 ETH | 0.00062478 | ||||
Transfer | 20083744 | 142 days ago | IN | 0 ETH | 0.00064378 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AllowlistShares
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input 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.0; import "../recovery/ERC20Recoverable.sol"; import "../ERC20/ERC20Allowlistable.sol"; import "./Shares.sol"; contract AllowlistShares is Shares, ERC20Allowlistable { constructor( string memory _symbol, string memory _name, string memory _terms, uint256 _totalShares, IRecoveryHub _recoveryHub, address _owner ) Shares(_symbol, _name, _terms, _totalShares, _owner, _recoveryHub) ERC20Allowlistable() { // initialization in shares } function transfer(address recipient, uint256 amount) override(ERC20Flaggable, Shares) virtual public returns (bool) { return super.transfer(recipient, amount); } function _mint(address account, uint256 amount) internal override(ERC20Flaggable, Shares) { super._mint(account, amount); } function _beforeTokenTransfer(address from, address to, uint256 amount) virtual override(ERC20Flaggable, ERC20Allowlistable) internal { super._beforeTokenTransfer(from, to, amount); } }
/** * SPDX-License-Identifier: LicenseRef-Aktionariat * * MIT License with Automated License Fee Payments * * Copyright (c) 2021 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.0; import "./ERC20Flaggable.sol"; import "../utils/Ownable.sol"; /** * A very flexible and efficient form to subject ERC-20 tokens to an allowlisting. * See ../../doc/allowlist.md for more information. */ abstract contract ERC20Allowlistable is ERC20Flaggable, Ownable { uint8 private constant TYPE_DEFAULT = 0x0; uint8 private constant TYPE_ALLOWLISTED = 0x1; uint8 private constant TYPE_FORBIDDEN = 0x2; uint8 private constant TYPE_POWERLISTED = 0x4; // I think TYPE_POWERLISTED should have been 0x3. :) But MOP was deployed like this so we keep it. Does not hurt. uint8 private constant FLAG_INDEX_ALLOWLIST = 20; uint8 private constant FLAG_INDEX_FORBIDDEN = 21; uint8 private constant FLAG_INDEX_POWERLIST = 22; event AddressTypeUpdate(address indexed account, uint8 addressType); bool public restrictTransfers; constructor(){ } /** * Configures whether the allowlisting is applied. * Also sets the powerlist and allowlist flags on the null address accordingly. * It is recommended to also deactivate the powerlist flag on other addresses. */ function setApplicable(bool transferRestrictionsApplicable) external onlyOwner { setApplicableInternal(transferRestrictionsApplicable); } function setApplicableInternal(bool transferRestrictionsApplicable) internal { restrictTransfers = transferRestrictionsApplicable; // if transfer restrictions are applied, we guess that should also be the case for newly minted tokens // if the admin disagrees, it is still possible to change the type of the null address if (transferRestrictionsApplicable){ setTypeInternal(address(0x0), TYPE_POWERLISTED); } else { setTypeInternal(address(0x0), TYPE_DEFAULT); } } function setType(address account, uint8 typeNumber) public onlyOwner { setTypeInternal(account, typeNumber); } /** * If TYPE_DEFAULT all flags are set to 0 */ function setTypeInternal(address account, uint8 typeNumber) internal { setFlag(account, FLAG_INDEX_ALLOWLIST, typeNumber == TYPE_ALLOWLISTED); setFlag(account, FLAG_INDEX_FORBIDDEN, typeNumber == TYPE_FORBIDDEN); setFlag(account, FLAG_INDEX_POWERLIST, typeNumber == TYPE_POWERLISTED); emit AddressTypeUpdate(account, typeNumber); } function setType(address[] calldata addressesToAdd, uint8 value) public onlyOwner { for (uint i=0; i<addressesToAdd.length; i++){ setType(addressesToAdd[i], value); } } /** * If true, this address is allowlisted and can only transfer tokens to other allowlisted addresses. */ function canReceiveFromAnyone(address account) public view returns (bool) { return hasFlagInternal(account, FLAG_INDEX_ALLOWLIST) || hasFlagInternal(account, FLAG_INDEX_POWERLIST); } /** * If true, this address can only transfer tokens to allowlisted addresses and not receive from anyone. */ function isForbidden(address account) public view returns (bool){ return hasFlagInternal(account, FLAG_INDEX_FORBIDDEN); } /** * If true, this address can automatically allowlist target addresses if necessary. */ function isPowerlisted(address account) public view returns (bool) { return hasFlagInternal(account, FLAG_INDEX_POWERLIST); } function _beforeTokenTransfer(address from, address to, uint256 amount) override virtual internal { super._beforeTokenTransfer(from, to, amount); // empty block for gas saving fall through // solhint-disable-next-line no-empty-blocks if (canReceiveFromAnyone(to)){ // ok, transfers to allowlisted addresses are always allowed } else if (isForbidden(to)){ // Target is forbidden, but maybe restrictions have been removed and we can clean the flag require(!restrictTransfers, "not allowed"); setFlag(to, FLAG_INDEX_FORBIDDEN, false); } else { if (isPowerlisted(from)){ // it is not allowlisted, but we can make it so // we know the recipient is neither forbidden, allowlisted or powerlisted, so we can set flag directly setFlag(to, FLAG_INDEX_ALLOWLIST, true); } // if we made it to here, the target must be a free address and we are not powerlisted else if (hasFlagInternal(from, FLAG_INDEX_ALLOWLIST)){ // We cannot send to free addresses, but maybe the restrictions have been removed and we can clean the flag? require(!restrictTransfers, "not allowed"); setFlag(from, FLAG_INDEX_ALLOWLIST, false); } else if (isForbidden(from)){ require(!restrictTransfers, "not allowed"); setFlag(from, FLAG_INDEX_FORBIDDEN, false); } } } }
// SPDX-License-Identifier: MIT // Copied and adjusted from OpenZeppelin // Adjustments: // - modifications to support ERC-677 // - 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 // - use upper 32 bits of balance for flags // - add a global settings variable pragma solidity ^0.8.0; 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 ERC20Flaggable is IERC20 { // as Documented in /doc/infiniteallowance.md // 0x8000000000000000000000000000000000000000000000000000000000000000 uint256 constant private INFINITE_ALLOWANCE = 2**255; uint256 private constant FLAGGING_MASK = 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000; // Documentation of flags used by subclasses: // NOTE: flags denote the bit number that is being used and must be smaller than 32 // ERC20Draggable: uint8 private constant FLAG_INDEX_VOTED = 1; // ERC20Recoverable: uint8 private constant FLAG_INDEX_CLAIM_PRESENT = 10; // ERCAllowlistable: uint8 private constant FLAG_INDEX_ALLOWLIST = 20; // ERCAllowlistable: uint8 private constant FLAG_INDEX_FORBIDDEN = 21; // ERCAllowlistable: uint8 private constant FLAG_INDEX_POWERLIST = 22; mapping (address => uint256) private _balances; // upper 32 bits reserved for flags mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; uint8 public override decimals; event NameChanged(string name, string symbol); 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 uint224 (_balances [account]); } function hasFlag(address account, uint8 number) external view returns (bool) { return hasFlagInternal(account, number); } function setFlag(address account, uint8 index, bool value) internal { uint256 flagMask = 1 << (index + 224); uint256 balance = _balances [account]; if ((balance & flagMask == flagMask) != value) { _balances [account] = balance ^ flagMask; } } function hasFlagInternal(address account, uint8 number) internal view returns (bool) { uint256 flag = 0x1 << (number + 224); return _balances[account] & flag == flag; } /** * @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) external 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) external 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) external override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][msg.sender]; if (currentAllowance < INFINITE_ALLOWANCE){ // Only decrease the allowance if it was not set to 'infinite' // Documented in /doc/infiniteallowance.md _allowances[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 { _beforeTokenTransfer(sender, recipient, amount); decreaseBalance(sender, amount); increaseBalance(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) external virtual returns (bool) { return transfer (recipient, amount) && IERC677Receiver (recipient).onTokenTransfer (msg.sender, amount, data); } /** @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 { _beforeTokenTransfer(address(0), recipient, amount); _totalSupply += amount; increaseBalance(recipient, amount); emit Transfer(address(0), recipient, amount); } function increaseBalance(address recipient, uint256 amount) private { require(recipient != address(0x0), "0x0"); // use burn instead uint256 oldBalance = _balances[recipient]; uint256 newBalance = oldBalance + amount; require(oldBalance & FLAGGING_MASK == newBalance & FLAGGING_MASK, "overflow"); _balances[recipient] = newBalance; } /** * @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; decreaseBalance(account, amount); emit Transfer(account, address(0), amount); } function decreaseBalance(address sender, uint256 amount) private { uint256 oldBalance = _balances[sender]; uint256 newBalance = oldBalance - amount; require(oldBalance & FLAGGING_MASK == newBalance & FLAGGING_MASK, "underflow"); _balances[sender] = newBalance; } /** * @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]. */ // solhint-disable-next-line no-empty-blocks function _beforeTokenTransfer(address from, address to, uint256 amount) virtual internal { // intentionally left blank } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC20Flaggable.sol"; import "../utils/Ownable.sol"; contract ERC20Named is ERC20Flaggable, Ownable { string public override name; string public override symbol; constructor(string memory _symbol, string memory _name, uint8 _decimals, address _admin) ERC20Flaggable(_decimals) Ownable(_admin) { setNameInternal(_symbol, _name); } function setName(string memory _symbol, string memory _name) external onlyOwner { setNameInternal(_symbol, _name); } function setNameInternal(string memory _symbol, string memory _name) internal { symbol = _symbol; name = _name; emit NameChanged(_name, _symbol); } }
/** * SPDX-License-Identifier: MIT * * Copyright (c) 2016-2019 zOS Global Limited * */ pragma solidity ^0.8.0; /** * @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.0; interface IERC677Receiver { function onTokenTransfer(address from, uint256 amount, bytes calldata data) external returns (bool); }
/** * 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.0; import "../ERC20/ERC20Flaggable.sol"; import "./IRecoveryHub.sol"; import "./IRecoverable.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 on the recovery hub to post a deposit and claim that the shares assigned to a * specific address are lost. * If an attacker trying to claim shares belonging to someone else, they risk 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, e.g. cases of front-running. * Most functionality is implemented in a shared RecoveryHub. */ abstract contract ERC20Recoverable is ERC20Flaggable, IRecoverable { uint8 private constant FLAG_CLAIM_PRESENT = 10; // ERC-20 token that can be used as collateral or 0x0 if disabled IERC20 public customCollateralAddress; // Rate the custom collateral currency is multiplied to be valued like one share. uint256 public customCollateralRate; uint256 constant CLAIM_PERIOD = 180 days; IRecoveryHub public immutable recovery; constructor(IRecoveryHub recoveryHub){ recovery = recoveryHub; } /** * 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(IERC20 collateralType) public override virtual view returns (uint256) { if (address(collateralType) == address(this)) { return 1; } else if (collateralType == customCollateralAddress) { return customCollateralRate; } else { return 0; } } function claimPeriod() external pure override returns (uint256){ return CLAIM_PERIOD; } /** * 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(IERC20 collateral, uint256 rate) internal { customCollateralAddress = collateral; if (address(customCollateralAddress) == address(0)) { customCollateralRate = 0; // disabled } else { require(rate > 0, "zero"); customCollateralRate = rate; } } function getClaimDeleter() virtual public view returns (address); function transfer(address recipient, uint256 amount) override(ERC20Flaggable, IERC20) virtual public returns (bool) { require(super.transfer(recipient, amount), "transfer"); if (hasFlagInternal(msg.sender, FLAG_CLAIM_PRESENT)){ recovery.clearClaimFromToken(msg.sender); } return true; } function notifyClaimMade(address target) external override { require(msg.sender == address(recovery), "not recovery"); setFlag(target, FLAG_CLAIM_PRESENT, true); } function notifyClaimDeleted(address target) external override { require(msg.sender == address(recovery), "not recovery"); setFlag(target, FLAG_CLAIM_PRESENT, false); } function deleteClaim(address lostAddress) external { require(msg.sender == getClaimDeleter(), "not claim deleter"); recovery.deleteClaim(lostAddress); } function recover(address oldAddress, address newAddress) external override { require(msg.sender == address(recovery), "not recovery"); _transfer(oldAddress, newAddress, balanceOf(oldAddress)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC20/IERC20.sol"; interface IRecoverable is IERC20{ function claimPeriod() external view returns (uint256); function notifyClaimMade(address target) external; function notifyClaimDeleted(address target) external; function getCollateralRate(IERC20 collateral) external view returns(uint256); function recover(address oldAddress, address newAddress) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IRecoveryHub { function setRecoverable(bool flag) external; // deletes claim and transfers collateral back to claimer function deleteClaim(address target) external; // clears claim and transfers collateral to holder function clearClaimFromToken(address holder) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IShares { function burn(uint256) external; function totalShares() external view 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.0; import "../ERC20/ERC20Named.sol"; import "../ERC20/IERC677Receiver.sol"; import "../recovery/ERC20Recoverable.sol"; import "../shares/IShares.sol"; /** * @title CompanyName AG Shares * @author Luzius Meisser, [email protected] * * These tokens represent ledger-based securities according to article 973d of the Swiss Code of Obligations. * This smart contract serves as an ownership registry, enabling the token holders to register them as * shareholders in the issuer's shareholder registry. This is equivalent to the traditional system * of having physical share certificates kept at home by the shareholders and a shareholder registry run by * the company. Just like with physical certificates, the owners of the tokens are the owners of the shares. * However, in order to exercise their rights (for example receive a dividend), shareholders must register * themselves. For example, in case the company pays out a dividend to a previous shareholder because * the current shareholder did not register, the company cannot be held liable for paying the dividend to * the "wrong" shareholder. In relation to the company, only the registered shareholders count as such. */ contract Shares is ERC20Recoverable, ERC20Named, IShares{ string public terms; uint256 public override totalShares; // total number of shares, maybe not all tokenized uint256 public invalidTokens; event Announcement(string message); event TokensDeclaredInvalid(address indexed holder, uint256 amount, string message); event ChangeTerms(string terms); event ChangeTotalShares(uint256 total); constructor( string memory _symbol, string memory _name, string memory _terms, uint256 _totalShares, address _owner, IRecoveryHub _recoveryHub ) ERC20Named(_symbol, _name, 0, _owner) ERC20Recoverable(_recoveryHub) { totalShares = _totalShares; terms = _terms; invalidTokens = 0; _recoveryHub.setRecoverable(false); } function setTerms(string memory _terms) external onlyOwner { terms = _terms; emit ChangeTerms(_terms); } /** * Declares the number of total shares, including those that have not been tokenized and those * that are held by the company itself. This number can be substiantially higher than totalSupply() * in case not all shares have been tokenized. Also, it can be lower than totalSupply() in case some * tokens have become invalid. */ function setTotalShares(uint256 _newTotalShares) external onlyOwner() { require(_newTotalShares >= totalValidSupply(), "below supply"); totalShares = _newTotalShares; emit ChangeTotalShares(_newTotalShares); } /** * Allows the issuer to make public announcements that are visible on the blockchain. */ function announcement(string calldata message) external onlyOwner() { emit Announcement(message); } /** * See parent method for collateral requirements. */ function setCustomClaimCollateral(IERC20 collateral, uint256 rate) external onlyOwner() { super._setCustomClaimCollateral(collateral, rate); } function getClaimDeleter() public override view returns (address) { return owner; } /** * Signals that the indicated tokens have been declared invalid (e.g. by a court ruling in accordance * with article 973g of the Swiss Code of Obligations) and got detached from * the underlying shares. Invalid tokens do not carry any shareholder rights any more. * * This function is purely declarative. It does not technically immobilize the affected tokens as * that would give the issuer too much power. */ function declareInvalid(address holder, uint256 amount, string calldata message) external onlyOwner() { uint256 holderBalance = balanceOf(holder); require(amount <= holderBalance, "amount too high"); invalidTokens += amount; emit TokensDeclaredInvalid(holder, amount, message); } /** * The total number of valid tokens in circulation. In case some tokens have been declared invalid, this * number might be lower than totalSupply(). Also, it will always be lower than or equal to totalShares(). */ function totalValidSupply() public view returns (uint256) { return totalSupply() - invalidTokens; } /** * Allows the company to tokenize shares and transfer them e.g to the draggable contract and wrap them. * If these shares are newly created, setTotalShares must be called first in order to adjust the total number of shares. */ function mintAndCall(address shareholder, address callee, uint256 amount, bytes calldata data) external { mint(callee, amount); require(IERC677Receiver(callee).onTokenTransfer(shareholder, amount, data)); } function mint(address target, uint256 amount) public onlyOwner { _mint(target, amount); } function _mint(address account, uint256 amount) internal virtual override { require(totalValidSupply() + amount <= totalShares, "total"); super._mint(account, amount); } function transfer(address to, uint256 value) virtual override(ERC20Recoverable, ERC20Flaggable) public returns (bool) { return super.transfer(to, value); } /** * Transfers _amount tokens to the company and burns them. * The meaning of this operation depends on the circumstances and the fate of the shares does * not necessarily follow the fate of the tokens. For example, the company itself might call * this function to implement a formal decision to destroy some of the outstanding shares. * Also, this function might be called by an owner to return the shares to the company and * get them back in another form under an according agreement (e.g. printed certificates or * tokens on a different blockchain). It is not recommended to call this function without * having agreed with the company on the further fate of the shares in question. */ function burn(uint256 _amount) override external { _transfer(msg.sender, address(this), _amount); _burn(address(this), _amount); } }
// SPDX-License-Identifier: MIT // // From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol // // Modifications: // - Replaced Context._msgSender() with msg.sender // - Made leaner // - Extracted interface pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor (address initialOwner) { owner = initialOwner; emit OwnershipTransferred(address(0), owner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) external onlyOwner { emit OwnershipTransferred(owner, newOwner); owner = newOwner; } modifier onlyOwner() { require(owner == msg.sender, "not owner"); _; } }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_terms","type":"string"},{"internalType":"uint256","name":"_totalShares","type":"uint256"},{"internalType":"contract IRecoveryHub","name":"_recoveryHub","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint8","name":"addressType","type":"uint8"}],"name":"AddressTypeUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"Announcement","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"terms","type":"string"}],"name":"ChangeTerms","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"ChangeTotalShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"TokensDeclaredInvalid","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":"string","name":"message","type":"string"}],"name":"announcement","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"account","type":"address"}],"name":"canReceiveFromAnyone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"customCollateralAddress","outputs":[{"internalType":"contract IERC20","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":"holder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"message","type":"string"}],"name":"declareInvalid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"deleteClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getClaimDeleter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"collateralType","type":"address"}],"name":"getCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"number","type":"uint8"}],"name":"hasFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invalidTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isForbidden","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPowerlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"},{"internalType":"address","name":"callee","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintAndCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"notifyClaimDeleted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"notifyClaimMade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oldAddress","type":"address"},{"internalType":"address","name":"newAddress","type":"address"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recovery","outputs":[{"internalType":"contract IRecoveryHub","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"restrictTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"transferRestrictionsApplicable","type":"bool"}],"name":"setApplicable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"collateral","type":"address"},{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setCustomClaimCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_name","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_terms","type":"string"}],"name":"setTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTotalShares","type":"uint256"}],"name":"setTotalShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressesToAdd","type":"address[]"},{"internalType":"uint8","name":"value","type":"uint8"}],"name":"setType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"typeNumber","type":"uint8"}],"name":"setType","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":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalValidSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200238e3803806200238e8339810160408190526200003491620002f4565b6003805460ff19169055606082901b6001600160601b031916608052600580546001600160a01b0319166001600160a01b03831690811790915560405187918791879187918691889187918791600091869182919084907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000bd848462000152565b5050506009849055508351620000db906008906020870190620001bd565b506000600a819055604051636427ed9760e01b815260048101919091526001600160a01b03821690636427ed9790602401600060405180830381600087803b1580156200012757600080fd5b505af11580156200013c573d6000803e3d6000fd5b50505050505050505050505050505050620004b9565b815162000167906007906020850190620001bd565b5080516200017d906006906020840190620001bd565b507f6c20b91d1723b78732eba64ff11ebd7966a6e4af568a00fa4f6b72c20f58b02a8183604051620001b1929190620003e8565b60405180910390a15050565b828054620001cb906200044d565b90600052602060002090601f016020900481019282620001ef57600085556200023a565b82601f106200020a57805160ff19168380011785556200023a565b828001600101855582156200023a579182015b828111156200023a5782518255916020019190600101906200021d565b50620002489291506200024c565b5090565b5b808211156200024857600081556001016200024d565b600082601f8301126200027557600080fd5b81516001600160401b03808211156200029257620002926200048a565b604051601f8301601f19908116603f01168101908282118183101715620002bd57620002bd6200048a565b81604052838152866020858801011115620002d757600080fd5b620002ea8460208301602089016200041a565b9695505050505050565b60008060008060008060c087890312156200030e57600080fd5b86516001600160401b03808211156200032657600080fd5b620003348a838b0162000263565b975060208901519150808211156200034b57600080fd5b620003598a838b0162000263565b965060408901519150808211156200037057600080fd5b506200037f89828a0162000263565b9450506060870151925060808701516200039981620004a0565b60a0880151909250620003ac81620004a0565b809150509295509295509295565b60008151808452620003d48160208601602086016200041a565b601f01601f19169290920160200192915050565b604081526000620003fd6040830185620003ba565b8281036020840152620004118185620003ba565b95945050505050565b60005b83811015620004375781810151838201526020016200041d565b8381111562000447576000848401525b50505050565b600181811c908216806200046257607f821691505b602082108114156200048457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114620004b657600080fd5b50565b60805160601c611e93620004fb6000396000818161054c015281816107d801528181610af501528181610d7801528181610e0d01526115010152611e936000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c806370a0823111610151578063b1c8db66116100c3578063ddceafa911610087578063ddceafa914610547578063e445d70a1461056e578063e5b824ec14610581578063f2fde38b14610594578063f54fc060146105a7578063f5c0b95f146105ba57600080fd5b8063b1c8db66146104d3578063c18172c4146104e6578063d37a9bb0146104f9578063d502562514610506578063dd62ed3e1461050e57600080fd5b806395d89b411161011557806395d89b41146104775780639e37878c1461047f578063a49a7cb114610492578063a77384c1146104a5578063a9059cbb146104b8578063b0d04c7a146104cb57600080fd5b806370a082311461042257806377e071ad1461043557806378f86afc146104485780637dc2cd981461045b5780638da5cb5b1461046457600080fd5b806337a8129c116101ea57806342966c68116101ae57806342966c68146103ba578063429c66f0146103cd5780635c707f07146103e05780635d6624b7146103f35780636091811714610406578063648bf7741461040f57600080fd5b806337a8129c1461036f5780633a1cdf32146103785780633a98ef391461038b5780634000aea01461039457806340c10f19146103a757600080fd5b806323b872dd1161023157806323b872dd146103065780632a0a4ed5146103195780632b3430991461032a578063313ce5671461033d57806332a7ae951461035c57600080fd5b806306fdde031461026e578063095ea7b31461028c5780630c6f0e5d146102af57806318160ddd146102df5780631f0f06aa146102f1575b600080fd5b6102766105cd565b6040516102839190611c8e565b60405180910390f35b61029f61029a36600461195b565b61065b565b6040519015158152602001610283565b6003546102c79061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610283565b6002545b604051908152602001610283565b6103046102ff366004611ad6565b610671565b005b61029f6103143660046118a7565b6106e1565b6005546001600160a01b03166102c7565b61029f610338366004611851565b610758565b60035461034a9060ff1681565b60405160ff9091168152602001610283565b61030461036a366004611851565b61076b565b6102e3600a5481565b61030461038636600461195b565b610837565b6102e360095481565b61029f6103a2366004611987565b61086f565b6103046103b536600461195b565b61090f565b6103046103c8366004611bb9565b610943565b6103046103db366004611a18565b61095b565b6103046103ee366004611b55565b6109d8565b610304610401366004611987565b610a0c565b6102e360045481565b61030461041d36600461186e565b610aea565b6102e3610430366004611851565b610b45565b6102e3610443366004611851565b610b69565b610304610456366004611b18565b610bb4565b62ed4e006102e3565b6005546102c7906001600160a01b031681565b610276610c2c565b61029f61048d366004611851565b610c39565b6103046104a03660046119e3565b610c46565b6103046104b3366004611bb9565b610c7a565b61029f6104c636600461195b565b610d1f565b6102e3610d32565b61029f6104e1366004611851565b610d4f565b6103046104f4366004611851565b610d6d565b600b5461029f9060ff1681565b610276610dc2565b6102e361051c36600461186e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102c77f000000000000000000000000000000000000000000000000000000000000000081565b61030461057c366004611a9c565b610dcf565b61030461058f366004611851565b610e02565b6103046105a2366004611851565b610e57565b6103046105b53660046118e8565b610edd565b61029f6105c83660046119e3565b610f74565b600680546105da90611da2565b80601f016020809104026020016040519081016040528092919081815260200182805461060690611da2565b80156106535780601f1061062857610100808354040283529160200191610653565b820191906000526020600020905b81548152906001019060200180831161063657829003601f168201915b505050505081565b6000610668338484610f80565b50600192915050565b6005546001600160a01b031633146106a45760405162461bcd60e51b815260040161069b90611d11565b60405180910390fd5b7f07ce702fc13ca0620c174dab22996a6d5fd9e7accb663555a4e85323692706ba82826040516106d5929190611c7a565b60405180910390a15050565b60006106ee848484610fe2565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600160ff1b81101561074d576107288382611d8b565b6001600160a01b03861660009081526001602090815260408083203384529091529020555b506001949350505050565b6000610765826016611046565b92915050565b6005546001600160a01b031633146107b95760405162461bcd60e51b81526020600482015260116024820152703737ba1031b630b4b6903232b632ba32b960791b604482015260640161069b565b6040516332a7ae9560e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906332a7ae9590602401600060405180830381600087803b15801561081c57600080fd5b505af1158015610830573d6000803e3d6000fd5b5050505050565b6005546001600160a01b031633146108615760405162461bcd60e51b815260040161069b90611d11565b61086b8282611086565b5050565b600061087b8585610d1f565b80156109065750604051635260769b60e11b81526001600160a01b0386169063a4c0ed36906108b4903390889088908890600401611c48565b602060405180830381600087803b1580156108ce57600080fd5b505af11580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109069190611ab9565b95945050505050565b6005546001600160a01b031633146109395760405162461bcd60e51b815260040161069b90611d11565b61086b82826110fd565b61094e333083610fe2565b6109583082611107565b50565b6005546001600160a01b031633146109855760405162461bcd60e51b815260040161069b90611d11565b60005b828110156109d2576109c08484838181106109a5576109a5611e0e565b90506020020160208101906109ba9190611851565b83610c46565b806109ca81611ddd565b915050610988565b50505050565b6005546001600160a01b03163314610a025760405162461bcd60e51b815260040161069b90611d11565b61086b828261117b565b6005546001600160a01b03163314610a365760405162461bcd60e51b815260040161069b90611d11565b6000610a4185610b45565b905080841115610a855760405162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840e8dede40d0d2ced608b1b604482015260640161069b565b83600a6000828254610a979190611d4e565b92505081905550846001600160a01b03167f0a605cd1294f60fa3b73548ac68428f33300a051f225afcdcc75e56083c96ee7858585604051610adb93929190611d34565b60405180910390a25050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b325760405162461bcd60e51b815260040161069b90611ceb565b61086b8282610b4085610b45565b610fe2565b6001600160a01b03166000908152602081905260409020546001600160e01b031690565b60006001600160a01b038216301415610b8457506001919050565b6003546001600160a01b03838116610100909204161415610ba757505060045490565b506000919050565b919050565b6005546001600160a01b03163314610bde5760405162461bcd60e51b815260040161069b90611d11565b8051610bf19060089060208401906116d1565b507fe9f2468ecc8d3dff15a70a5909151e6297cee4cf05268eff3d7ef0c696ec50f281604051610c219190611c8e565b60405180910390a150565b600780546105da90611da2565b6000610765826015611046565b6005546001600160a01b03163314610c705760405162461bcd60e51b815260040161069b90611d11565b61086b82826111d4565b6005546001600160a01b03163314610ca45760405162461bcd60e51b815260040161069b90611d11565b610cac610d32565b811015610cea5760405162461bcd60e51b815260206004820152600c60248201526b62656c6f7720737570706c7960a01b604482015260640161069b565b60098190556040518181527fdcbf73bf1e396dbe03ccbcd29c0aa52eb8028ae24726098296357286de4f5b2690602001610c21565b6000610d2b838361124f565b9392505050565b6000600a54610d4060025490565b610d4a9190611d8b565b905090565b6000610d5c826014611046565b806107655750610765826016611046565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610db55760405162461bcd60e51b815260040161069b90611ceb565b61095881600a600161125b565b600880546105da90611da2565b6005546001600160a01b03163314610df95760405162461bcd60e51b815260040161069b90611d11565b610958816112bf565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e4a5760405162461bcd60e51b815260040161069b90611ceb565b61095881600a600061125b565b6005546001600160a01b03163314610e815760405162461bcd60e51b815260040161069b90611d11565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b610ee7848461090f565b604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690610f19908890879087908790600401611c48565b602060405180830381600087803b158015610f3357600080fd5b505af1158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b9190611ab9565b61083057600080fd5b6000610d2b8383611046565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b610fed8383836112ed565b610ff783826112fd565b6110018282611393565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fd591815260200190565b6000806110548360e0611d66565b6001600160a01b038516600090815260208190526040902054600160ff929092169190911b9081161491505092915050565b60038054610100600160a81b0319166101006001600160a01b0385811682029290921792839055909104166110be5760006004555050565b600081116110f75760405162461bcd60e51b815260040161069b906020808252600490820152637a65726f60e01b604082015260600190565b60045550565b61086b8282611443565b611113826000836112ed565b80600260008282546111259190611d8b565b90915550611135905082826112fd565b6040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b815161118e9060079060208501906116d1565b5080516111a29060069060208401906116d1565b507f6c20b91d1723b78732eba64ff11ebd7966a6e4af568a00fa4f6b72c20f58b02a81836040516106d5929190611ca1565b6111e682601460ff841660011461125b565b6111f882601560ff841660021461125b565b61120a82601660ff841660041461125b565b60405160ff821681526001600160a01b038316907fe423d7d31023dbacefed7c937785d0012ad8f314381295efebfc0471d2c434549060200160405180910390a25050565b6000610d2b8383611499565b60006112688360e0611d66565b6001600160a01b038516600090815260208190526040902054600160ff929092169190911b9150808216821483151514610830576001600160a01b0394909416600090815260208190526040902093189092555050565b600b805460ff191682158015919091179091556112e257610958600060046111d4565b6109586000806111d4565b6112f883838361156e565b505050565b6001600160a01b038216600090815260208190526040812054906113218383611d8b565b90506001600160e01b031981166001600160e01b03198316146113725760405162461bcd60e51b8152602060048201526009602482015268756e646572666c6f7760b81b604482015260640161069b565b6001600160a01b039093166000908152602081905260409020929092555050565b6001600160a01b0382166113cf5760405162461bcd60e51b815260206004820152600360248201526203078360ec1b604482015260640161069b565b6001600160a01b038216600090815260208190526040812054906113f38383611d4e565b90506001600160e01b031981166001600160e01b03198316146113725760405162461bcd60e51b81526020600482015260086024820152676f766572666c6f7760c01b604482015260640161069b565b6009548161144f610d32565b6114599190611d4e565b111561148f5760405162461bcd60e51b81526020600482015260056024820152641d1bdd185b60da1b604482015260640161069b565b61086b8282611658565b60006114a583836116c4565b6114dc5760405162461bcd60e51b81526020600482015260086024820152673a3930b739b332b960c11b604482015260640161069b565b6114e733600a611046565b15610668576040516304d301a360e41b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634d301a3090602401600060405180830381600087803b15801561154d57600080fd5b505af1158015611561573d6000803e3d6000fd5b5050505050600192915050565b61157782610d4f565b1561158157505050565b61158a82610c39565b156115bf57600b5460ff16156115b25760405162461bcd60e51b815260040161069b90611cc6565b6112f8826015600061125b565b6115c883610758565b156115da576112f8826014600161125b565b6115e5836014611046565b1561161a57600b5460ff161561160d5760405162461bcd60e51b815260040161069b90611cc6565b6112f8836014600061125b565b61162383610c39565b156112f857600b5460ff161561164b5760405162461bcd60e51b815260040161069b90611cc6565b6112f8836015600061125b565b611664600083836112ed565b80600260008282546116769190611d4e565b9091555061168690508282611393565b6040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161116f565b6000610668338484610fe2565b8280546116dd90611da2565b90600052602060002090601f0160209004810192826116ff5760008555611745565b82601f1061171857805160ff1916838001178555611745565b82800160010185558215611745579182015b8281111561174557825182559160200191906001019061172a565b50611751929150611755565b5090565b5b808211156117515760008155600101611756565b60008083601f84011261177c57600080fd5b50813567ffffffffffffffff81111561179457600080fd5b6020830191508360208285010111156117ac57600080fd5b9250929050565b600082601f8301126117c457600080fd5b813567ffffffffffffffff808211156117df576117df611e24565b604051601f8301601f19908116603f0116810190828211818310171561180757611807611e24565b8160405283815286602085880101111561182057600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff81168114610baf57600080fd5b60006020828403121561186357600080fd5b8135610d2b81611e3a565b6000806040838503121561188157600080fd5b823561188c81611e3a565b9150602083013561189c81611e3a565b809150509250929050565b6000806000606084860312156118bc57600080fd5b83356118c781611e3a565b925060208401356118d781611e3a565b929592945050506040919091013590565b60008060008060006080868803121561190057600080fd5b853561190b81611e3a565b9450602086013561191b81611e3a565b935060408601359250606086013567ffffffffffffffff81111561193e57600080fd5b61194a8882890161176a565b969995985093965092949392505050565b6000806040838503121561196e57600080fd5b823561197981611e3a565b946020939093013593505050565b6000806000806060858703121561199d57600080fd5b84356119a881611e3a565b935060208501359250604085013567ffffffffffffffff8111156119cb57600080fd5b6119d78782880161176a565b95989497509550505050565b600080604083850312156119f657600080fd5b8235611a0181611e3a565b9150611a0f60208401611840565b90509250929050565b600080600060408486031215611a2d57600080fd5b833567ffffffffffffffff80821115611a4557600080fd5b818601915086601f830112611a5957600080fd5b813581811115611a6857600080fd5b8760208260051b8501011115611a7d57600080fd5b602092830195509350611a939186019050611840565b90509250925092565b600060208284031215611aae57600080fd5b8135610d2b81611e4f565b600060208284031215611acb57600080fd5b8151610d2b81611e4f565b60008060208385031215611ae957600080fd5b823567ffffffffffffffff811115611b0057600080fd5b611b0c8582860161176a565b90969095509350505050565b600060208284031215611b2a57600080fd5b813567ffffffffffffffff811115611b4157600080fd5b611b4d848285016117b3565b949350505050565b60008060408385031215611b6857600080fd5b823567ffffffffffffffff80821115611b8057600080fd5b611b8c868387016117b3565b93506020850135915080821115611ba257600080fd5b50611baf858286016117b3565b9150509250929050565b600060208284031215611bcb57600080fd5b5035919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845260005b81811015611c2157602081850181015186830182015201611c05565b81811115611c33576000602083870101525b50601f01601f19169290920160200192915050565b60018060a01b0385168152836020820152606060408201526000611c70606083018486611bd2565b9695505050505050565b602081526000611b4d602083018486611bd2565b602081526000610d2b6020830184611bfb565b604081526000611cb46040830185611bfb565b82810360208401526109068185611bfb565b6020808252600b908201526a1b9bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252600c908201526b6e6f74207265636f7665727960a01b604082015260600190565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b838152604060208201526000610906604083018486611bd2565b60008219821115611d6157611d61611df8565b500190565b600060ff821660ff84168060ff03821115611d8357611d83611df8565b019392505050565b600082821015611d9d57611d9d611df8565b500390565b600181811c90821680611db657607f821691505b60208210811415611dd757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611df157611df1611df8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461095857600080fd5b801515811461095857600080fdfea264697066735822122044c62bbacc50dffac4578636f8ca28d2d02a199f11cf708a4a9ead26a9f30f3e64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002530000000000000000000000009b886c04ce3cfb74e644de92d65cfb873636e1fb0000000000000000000000003789b2436cf939ae4060127180daf5aba11174fe00000000000000000000000000000000000000000000000000000000000000055245414c55000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5265616c556e6974205368617265730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f7265616c756e69742e63682f746f6b656e2f000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102695760003560e01c806370a0823111610151578063b1c8db66116100c3578063ddceafa911610087578063ddceafa914610547578063e445d70a1461056e578063e5b824ec14610581578063f2fde38b14610594578063f54fc060146105a7578063f5c0b95f146105ba57600080fd5b8063b1c8db66146104d3578063c18172c4146104e6578063d37a9bb0146104f9578063d502562514610506578063dd62ed3e1461050e57600080fd5b806395d89b411161011557806395d89b41146104775780639e37878c1461047f578063a49a7cb114610492578063a77384c1146104a5578063a9059cbb146104b8578063b0d04c7a146104cb57600080fd5b806370a082311461042257806377e071ad1461043557806378f86afc146104485780637dc2cd981461045b5780638da5cb5b1461046457600080fd5b806337a8129c116101ea57806342966c68116101ae57806342966c68146103ba578063429c66f0146103cd5780635c707f07146103e05780635d6624b7146103f35780636091811714610406578063648bf7741461040f57600080fd5b806337a8129c1461036f5780633a1cdf32146103785780633a98ef391461038b5780634000aea01461039457806340c10f19146103a757600080fd5b806323b872dd1161023157806323b872dd146103065780632a0a4ed5146103195780632b3430991461032a578063313ce5671461033d57806332a7ae951461035c57600080fd5b806306fdde031461026e578063095ea7b31461028c5780630c6f0e5d146102af57806318160ddd146102df5780631f0f06aa146102f1575b600080fd5b6102766105cd565b6040516102839190611c8e565b60405180910390f35b61029f61029a36600461195b565b61065b565b6040519015158152602001610283565b6003546102c79061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610283565b6002545b604051908152602001610283565b6103046102ff366004611ad6565b610671565b005b61029f6103143660046118a7565b6106e1565b6005546001600160a01b03166102c7565b61029f610338366004611851565b610758565b60035461034a9060ff1681565b60405160ff9091168152602001610283565b61030461036a366004611851565b61076b565b6102e3600a5481565b61030461038636600461195b565b610837565b6102e360095481565b61029f6103a2366004611987565b61086f565b6103046103b536600461195b565b61090f565b6103046103c8366004611bb9565b610943565b6103046103db366004611a18565b61095b565b6103046103ee366004611b55565b6109d8565b610304610401366004611987565b610a0c565b6102e360045481565b61030461041d36600461186e565b610aea565b6102e3610430366004611851565b610b45565b6102e3610443366004611851565b610b69565b610304610456366004611b18565b610bb4565b62ed4e006102e3565b6005546102c7906001600160a01b031681565b610276610c2c565b61029f61048d366004611851565b610c39565b6103046104a03660046119e3565b610c46565b6103046104b3366004611bb9565b610c7a565b61029f6104c636600461195b565b610d1f565b6102e3610d32565b61029f6104e1366004611851565b610d4f565b6103046104f4366004611851565b610d6d565b600b5461029f9060ff1681565b610276610dc2565b6102e361051c36600461186e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102c77f0000000000000000000000009b886c04ce3cfb74e644de92d65cfb873636e1fb81565b61030461057c366004611a9c565b610dcf565b61030461058f366004611851565b610e02565b6103046105a2366004611851565b610e57565b6103046105b53660046118e8565b610edd565b61029f6105c83660046119e3565b610f74565b600680546105da90611da2565b80601f016020809104026020016040519081016040528092919081815260200182805461060690611da2565b80156106535780601f1061062857610100808354040283529160200191610653565b820191906000526020600020905b81548152906001019060200180831161063657829003601f168201915b505050505081565b6000610668338484610f80565b50600192915050565b6005546001600160a01b031633146106a45760405162461bcd60e51b815260040161069b90611d11565b60405180910390fd5b7f07ce702fc13ca0620c174dab22996a6d5fd9e7accb663555a4e85323692706ba82826040516106d5929190611c7a565b60405180910390a15050565b60006106ee848484610fe2565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600160ff1b81101561074d576107288382611d8b565b6001600160a01b03861660009081526001602090815260408083203384529091529020555b506001949350505050565b6000610765826016611046565b92915050565b6005546001600160a01b031633146107b95760405162461bcd60e51b81526020600482015260116024820152703737ba1031b630b4b6903232b632ba32b960791b604482015260640161069b565b6040516332a7ae9560e01b81526001600160a01b0382811660048301527f0000000000000000000000009b886c04ce3cfb74e644de92d65cfb873636e1fb16906332a7ae9590602401600060405180830381600087803b15801561081c57600080fd5b505af1158015610830573d6000803e3d6000fd5b5050505050565b6005546001600160a01b031633146108615760405162461bcd60e51b815260040161069b90611d11565b61086b8282611086565b5050565b600061087b8585610d1f565b80156109065750604051635260769b60e11b81526001600160a01b0386169063a4c0ed36906108b4903390889088908890600401611c48565b602060405180830381600087803b1580156108ce57600080fd5b505af11580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109069190611ab9565b95945050505050565b6005546001600160a01b031633146109395760405162461bcd60e51b815260040161069b90611d11565b61086b82826110fd565b61094e333083610fe2565b6109583082611107565b50565b6005546001600160a01b031633146109855760405162461bcd60e51b815260040161069b90611d11565b60005b828110156109d2576109c08484838181106109a5576109a5611e0e565b90506020020160208101906109ba9190611851565b83610c46565b806109ca81611ddd565b915050610988565b50505050565b6005546001600160a01b03163314610a025760405162461bcd60e51b815260040161069b90611d11565b61086b828261117b565b6005546001600160a01b03163314610a365760405162461bcd60e51b815260040161069b90611d11565b6000610a4185610b45565b905080841115610a855760405162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840e8dede40d0d2ced608b1b604482015260640161069b565b83600a6000828254610a979190611d4e565b92505081905550846001600160a01b03167f0a605cd1294f60fa3b73548ac68428f33300a051f225afcdcc75e56083c96ee7858585604051610adb93929190611d34565b60405180910390a25050505050565b336001600160a01b037f0000000000000000000000009b886c04ce3cfb74e644de92d65cfb873636e1fb1614610b325760405162461bcd60e51b815260040161069b90611ceb565b61086b8282610b4085610b45565b610fe2565b6001600160a01b03166000908152602081905260409020546001600160e01b031690565b60006001600160a01b038216301415610b8457506001919050565b6003546001600160a01b03838116610100909204161415610ba757505060045490565b506000919050565b919050565b6005546001600160a01b03163314610bde5760405162461bcd60e51b815260040161069b90611d11565b8051610bf19060089060208401906116d1565b507fe9f2468ecc8d3dff15a70a5909151e6297cee4cf05268eff3d7ef0c696ec50f281604051610c219190611c8e565b60405180910390a150565b600780546105da90611da2565b6000610765826015611046565b6005546001600160a01b03163314610c705760405162461bcd60e51b815260040161069b90611d11565b61086b82826111d4565b6005546001600160a01b03163314610ca45760405162461bcd60e51b815260040161069b90611d11565b610cac610d32565b811015610cea5760405162461bcd60e51b815260206004820152600c60248201526b62656c6f7720737570706c7960a01b604482015260640161069b565b60098190556040518181527fdcbf73bf1e396dbe03ccbcd29c0aa52eb8028ae24726098296357286de4f5b2690602001610c21565b6000610d2b838361124f565b9392505050565b6000600a54610d4060025490565b610d4a9190611d8b565b905090565b6000610d5c826014611046565b806107655750610765826016611046565b336001600160a01b037f0000000000000000000000009b886c04ce3cfb74e644de92d65cfb873636e1fb1614610db55760405162461bcd60e51b815260040161069b90611ceb565b61095881600a600161125b565b600880546105da90611da2565b6005546001600160a01b03163314610df95760405162461bcd60e51b815260040161069b90611d11565b610958816112bf565b336001600160a01b037f0000000000000000000000009b886c04ce3cfb74e644de92d65cfb873636e1fb1614610e4a5760405162461bcd60e51b815260040161069b90611ceb565b61095881600a600061125b565b6005546001600160a01b03163314610e815760405162461bcd60e51b815260040161069b90611d11565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b610ee7848461090f565b604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690610f19908890879087908790600401611c48565b602060405180830381600087803b158015610f3357600080fd5b505af1158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b9190611ab9565b61083057600080fd5b6000610d2b8383611046565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b610fed8383836112ed565b610ff783826112fd565b6110018282611393565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fd591815260200190565b6000806110548360e0611d66565b6001600160a01b038516600090815260208190526040902054600160ff929092169190911b9081161491505092915050565b60038054610100600160a81b0319166101006001600160a01b0385811682029290921792839055909104166110be5760006004555050565b600081116110f75760405162461bcd60e51b815260040161069b906020808252600490820152637a65726f60e01b604082015260600190565b60045550565b61086b8282611443565b611113826000836112ed565b80600260008282546111259190611d8b565b90915550611135905082826112fd565b6040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b815161118e9060079060208501906116d1565b5080516111a29060069060208401906116d1565b507f6c20b91d1723b78732eba64ff11ebd7966a6e4af568a00fa4f6b72c20f58b02a81836040516106d5929190611ca1565b6111e682601460ff841660011461125b565b6111f882601560ff841660021461125b565b61120a82601660ff841660041461125b565b60405160ff821681526001600160a01b038316907fe423d7d31023dbacefed7c937785d0012ad8f314381295efebfc0471d2c434549060200160405180910390a25050565b6000610d2b8383611499565b60006112688360e0611d66565b6001600160a01b038516600090815260208190526040902054600160ff929092169190911b9150808216821483151514610830576001600160a01b0394909416600090815260208190526040902093189092555050565b600b805460ff191682158015919091179091556112e257610958600060046111d4565b6109586000806111d4565b6112f883838361156e565b505050565b6001600160a01b038216600090815260208190526040812054906113218383611d8b565b90506001600160e01b031981166001600160e01b03198316146113725760405162461bcd60e51b8152602060048201526009602482015268756e646572666c6f7760b81b604482015260640161069b565b6001600160a01b039093166000908152602081905260409020929092555050565b6001600160a01b0382166113cf5760405162461bcd60e51b815260206004820152600360248201526203078360ec1b604482015260640161069b565b6001600160a01b038216600090815260208190526040812054906113f38383611d4e565b90506001600160e01b031981166001600160e01b03198316146113725760405162461bcd60e51b81526020600482015260086024820152676f766572666c6f7760c01b604482015260640161069b565b6009548161144f610d32565b6114599190611d4e565b111561148f5760405162461bcd60e51b81526020600482015260056024820152641d1bdd185b60da1b604482015260640161069b565b61086b8282611658565b60006114a583836116c4565b6114dc5760405162461bcd60e51b81526020600482015260086024820152673a3930b739b332b960c11b604482015260640161069b565b6114e733600a611046565b15610668576040516304d301a360e41b81523360048201527f0000000000000000000000009b886c04ce3cfb74e644de92d65cfb873636e1fb6001600160a01b031690634d301a3090602401600060405180830381600087803b15801561154d57600080fd5b505af1158015611561573d6000803e3d6000fd5b5050505050600192915050565b61157782610d4f565b1561158157505050565b61158a82610c39565b156115bf57600b5460ff16156115b25760405162461bcd60e51b815260040161069b90611cc6565b6112f8826015600061125b565b6115c883610758565b156115da576112f8826014600161125b565b6115e5836014611046565b1561161a57600b5460ff161561160d5760405162461bcd60e51b815260040161069b90611cc6565b6112f8836014600061125b565b61162383610c39565b156112f857600b5460ff161561164b5760405162461bcd60e51b815260040161069b90611cc6565b6112f8836015600061125b565b611664600083836112ed565b80600260008282546116769190611d4e565b9091555061168690508282611393565b6040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161116f565b6000610668338484610fe2565b8280546116dd90611da2565b90600052602060002090601f0160209004810192826116ff5760008555611745565b82601f1061171857805160ff1916838001178555611745565b82800160010185558215611745579182015b8281111561174557825182559160200191906001019061172a565b50611751929150611755565b5090565b5b808211156117515760008155600101611756565b60008083601f84011261177c57600080fd5b50813567ffffffffffffffff81111561179457600080fd5b6020830191508360208285010111156117ac57600080fd5b9250929050565b600082601f8301126117c457600080fd5b813567ffffffffffffffff808211156117df576117df611e24565b604051601f8301601f19908116603f0116810190828211818310171561180757611807611e24565b8160405283815286602085880101111561182057600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff81168114610baf57600080fd5b60006020828403121561186357600080fd5b8135610d2b81611e3a565b6000806040838503121561188157600080fd5b823561188c81611e3a565b9150602083013561189c81611e3a565b809150509250929050565b6000806000606084860312156118bc57600080fd5b83356118c781611e3a565b925060208401356118d781611e3a565b929592945050506040919091013590565b60008060008060006080868803121561190057600080fd5b853561190b81611e3a565b9450602086013561191b81611e3a565b935060408601359250606086013567ffffffffffffffff81111561193e57600080fd5b61194a8882890161176a565b969995985093965092949392505050565b6000806040838503121561196e57600080fd5b823561197981611e3a565b946020939093013593505050565b6000806000806060858703121561199d57600080fd5b84356119a881611e3a565b935060208501359250604085013567ffffffffffffffff8111156119cb57600080fd5b6119d78782880161176a565b95989497509550505050565b600080604083850312156119f657600080fd5b8235611a0181611e3a565b9150611a0f60208401611840565b90509250929050565b600080600060408486031215611a2d57600080fd5b833567ffffffffffffffff80821115611a4557600080fd5b818601915086601f830112611a5957600080fd5b813581811115611a6857600080fd5b8760208260051b8501011115611a7d57600080fd5b602092830195509350611a939186019050611840565b90509250925092565b600060208284031215611aae57600080fd5b8135610d2b81611e4f565b600060208284031215611acb57600080fd5b8151610d2b81611e4f565b60008060208385031215611ae957600080fd5b823567ffffffffffffffff811115611b0057600080fd5b611b0c8582860161176a565b90969095509350505050565b600060208284031215611b2a57600080fd5b813567ffffffffffffffff811115611b4157600080fd5b611b4d848285016117b3565b949350505050565b60008060408385031215611b6857600080fd5b823567ffffffffffffffff80821115611b8057600080fd5b611b8c868387016117b3565b93506020850135915080821115611ba257600080fd5b50611baf858286016117b3565b9150509250929050565b600060208284031215611bcb57600080fd5b5035919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845260005b81811015611c2157602081850181015186830182015201611c05565b81811115611c33576000602083870101525b50601f01601f19169290920160200192915050565b60018060a01b0385168152836020820152606060408201526000611c70606083018486611bd2565b9695505050505050565b602081526000611b4d602083018486611bd2565b602081526000610d2b6020830184611bfb565b604081526000611cb46040830185611bfb565b82810360208401526109068185611bfb565b6020808252600b908201526a1b9bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252600c908201526b6e6f74207265636f7665727960a01b604082015260600190565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b838152604060208201526000610906604083018486611bd2565b60008219821115611d6157611d61611df8565b500190565b600060ff821660ff84168060ff03821115611d8357611d83611df8565b019392505050565b600082821015611d9d57611d9d611df8565b500390565b600181811c90821680611db657607f821691505b60208210811415611dd757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611df157611df1611df8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461095857600080fd5b801515811461095857600080fdfea264697066735822122044c62bbacc50dffac4578636f8ca28d2d02a199f11cf708a4a9ead26a9f30f3e64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002530000000000000000000000009b886c04ce3cfb74e644de92d65cfb873636e1fb0000000000000000000000003789b2436cf939ae4060127180daf5aba11174fe00000000000000000000000000000000000000000000000000000000000000055245414c55000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5265616c556e6974205368617265730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f7265616c756e69742e63682f746f6b656e2f000000000000
-----Decoded View---------------
Arg [0] : _symbol (string): REALU
Arg [1] : _name (string): RealUnit Shares
Arg [2] : _terms (string): https://realunit.ch/token/
Arg [3] : _totalShares (uint256): 595
Arg [4] : _recoveryHub (address): 0x9b886c04CE3CFB74E644DE92d65CfB873636e1fb
Arg [5] : _owner (address): 0x3789B2436cF939AE4060127180dAf5aBa11174FE
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000253
Arg [4] : 0000000000000000000000009b886c04ce3cfb74e644de92d65cfb873636e1fb
Arg [5] : 0000000000000000000000003789b2436cf939ae4060127180daf5aba11174fe
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 5245414c55000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [9] : 5265616c556e6974205368617265730000000000000000000000000000000000
Arg [10] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [11] : 68747470733a2f2f7265616c756e69742e63682f746f6b656e2f000000000000
Loading...
Loading
Loading...
Loading
OVERVIEW
RealUnit Schweiz AG is a listed investment company that invests broadly diversified in real assets. RealUnit Schweiz AG pursues the goal of protecting the assets entrusted as best as possible against crises and loss of purchasing power.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.