More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 780 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Split My Pruf | 16200108 | 769 days ago | IN | 0 ETH | 0.00247444 | ||||
Split My Pruf | 16196401 | 769 days ago | IN | 0 ETH | 0.00252529 | ||||
Split My Pruf | 16191214 | 770 days ago | IN | 0 ETH | 0.00068063 | ||||
Split My Pruf | 15982004 | 799 days ago | IN | 0 ETH | 0.00204729 | ||||
Split My Pruf | 15809929 | 823 days ago | IN | 0 ETH | 0.00154591 | ||||
Split My Pruf | 15766248 | 829 days ago | IN | 0 ETH | 0.00163951 | ||||
Split My Pruf | 15766233 | 829 days ago | IN | 0 ETH | 0.00170649 | ||||
Split My Pruf | 15700138 | 838 days ago | IN | 0 ETH | 0.00036733 | ||||
Split My Pruf | 15688481 | 840 days ago | IN | 0 ETH | 0.00013807 | ||||
Split My Pruf | 15688481 | 840 days ago | IN | 0 ETH | 0.00084174 | ||||
Split My Pruf | 15686369 | 840 days ago | IN | 0 ETH | 0.00100491 | ||||
Split My Pruf | 15678984 | 841 days ago | IN | 0 ETH | 0.00104765 | ||||
Split My Pruf | 15659897 | 844 days ago | IN | 0 ETH | 0.0008004 | ||||
Split My Pruf | 15651081 | 845 days ago | IN | 0 ETH | 0.00151232 | ||||
Split My Pruf | 15631160 | 848 days ago | IN | 0 ETH | 0.00154331 | ||||
Split My Pruf | 15594006 | 853 days ago | IN | 0 ETH | 0.0006766 | ||||
Split My Pruf | 15559079 | 858 days ago | IN | 0 ETH | 0.00019408 | ||||
Split My Pruf | 15524744 | 863 days ago | IN | 0 ETH | 0.00152738 | ||||
Split My Pruf | 15524729 | 863 days ago | IN | 0 ETH | 0.00133175 | ||||
Split My Pruf | 15469845 | 872 days ago | IN | 0 ETH | 0.00099381 | ||||
Split My Pruf | 15464969 | 873 days ago | IN | 0 ETH | 0.00086715 | ||||
Split My Pruf | 15364507 | 889 days ago | IN | 0 ETH | 0.00126324 | ||||
Split My Pruf | 15288491 | 901 days ago | IN | 0 ETH | 0.00074821 | ||||
Split My Pruf | 15249037 | 907 days ago | IN | 0 ETH | 0.00148283 | ||||
Split My Pruf | 15242565 | 908 days ago | IN | 0 ETH | 0.00064023 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SPLIT
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity Multiple files format)
/*--------------------------------------------------------PRüF0.8.0 __/\\\\\\\\\\\\\ _____/\\\\\\\\\ _______/\\__/\\ ___/\\\\\\\\\\\\\\\ _\/\\\/////////\\\ _/\\\///////\\\ ____\//__\//____\/\\\///////////__ _\/\\\_______\/\\\_\/\\\_____\/\\\ ________________\/\\\ ____________ _\/\\\\\\\\\\\\\/__\/\\\\\\\\\\\/_____/\\\____/\\\_\/\\\\\\\\\\\ ____ _\/\\\/////////____\/\\\//////\\\ ___\/\\\___\/\\\_\/\\\///////______ _\/\\\ ____________\/\\\ ___\//\\\ __\/\\\___\/\\\_\/\\\ ____________ _\/\\\ ____________\/\\\ ____\//\\\ _\/\\\___\/\\\_\/\\\ ____________ _\/\\\ ____________\/\\\ _____\//\\\_\//\\\\\\\\\ _\/\\\ ____________ _\/// _____________\/// _______\/// __\///////// __\/// _____________ *-------------------------------------------------------------------*/ /*----------------------------------------------------------------- * PRUF DOUBLER CONTRACT -- requires MINTER_ROLE, (SNAPSHOT_ROLE), PAUSER_ROLE in UTIL_TKN *---------------------------------------------------------------*/ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./PRUF_INTERFACES.sol"; import "./AccessControl.sol"; import "./Pausable.sol"; import "./ReentrancyGuard.sol"; contract SPLIT is ReentrancyGuard, Pausable, AccessControl { //----------------------------ROLE DEFINITIONS bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant CONTRACT_ADMIN_ROLE = keccak256("CONTRACT_ADMIN_ROLE"); UTIL_TKN_Interface internal UTIL_TKN; mapping(address => uint256) internal hasSplit; constructor() { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(CONTRACT_ADMIN_ROLE, msg.sender); _setupRole(PAUSER_ROLE, msg.sender); UTIL_TKN = UTIL_TKN_Interface( 0xa49811140E1d6f653dEc28037Be0924C811C4538 ); // for hard coded util tkn address } //---------------------------------MODIFIERS-------------------------------// /** * @dev Verify user credentials * Originating Address: * is Admin */ modifier isContractAdmin() { require( hasRole(CONTRACT_ADMIN_ROLE, msg.sender), "SPLIT:MOD-ICA: must have CONTRACT_ADMIN_ROLE" ); _; } /** * @dev Verify user credentials * Originating Address: * is Pauser */ modifier isPauser() { require( hasRole(PAUSER_ROLE, msg.sender), "SPLIT:MOD-IP: must have PAUSER_ROLE" ); _; } //----------------------External functions---------------------// /** * @dev doubles pruf balance at snapshotID(1) */ function splitMyPruf() external whenNotPaused { require( hasSplit[msg.sender] == 0, "SPLIT:SMP: Caller address has already been split" ); //^^^^^^^checks^^^^^^^^^ uint256 balanceAtSnapshot = UTIL_TKN.balanceOfAt(msg.sender, 1); hasSplit[msg.sender] = 170; //mark caller address as having been split //^^^^^^^effects^^^^^^^^^ UTIL_TKN.mint(msg.sender, balanceAtSnapshot); //mint the new tokens to caller address //^^^^^^^Interactions^^^^^^^^^ } /** * @dev doubles pruf balance at snapshotID(1) * @param _address - address to be split */ function splitPrufAtAddress(address _address) external whenNotPaused { require( hasSplit[_address] == 0, "SPLIT:SMPAA: Caller address has already been split" ); //^^^^^^^checks^^^^^^^^^ uint256 balanceAtSnapshot = UTIL_TKN.balanceOfAt(_address, 1); hasSplit[_address] = 170; //mark caller address as having been split //^^^^^^^effects^^^^^^^^^ UTIL_TKN.mint(_address, balanceAtSnapshot); //mint the new tokens to caller address //^^^^^^^Interactions^^^^^^^^^ } /** * @dev checks address for available split, returns balance of pruf to be split * @param _address - address to be checked if eligible for split */ function checkMyAddress(address _address) external view returns (uint256) { return hasSplit[_address]; } /** * @dev Pauses pausable functions. * See {ERC20Pausable} and {Pausable-_pause}. * Requirements: * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual isPauser { //^^^^^^^checks^^^^^^^^^ _pause(); //^^^^^^^effects^^^^^^^^ } /** * @dev Unpauses all pausable functions. * See {ERC20Pausable} and {Pausable-_unpause}. * Requirements: * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual isPauser { //^^^^^^^checks^^^^^^^^^ _unpause(); //^^^^^^^effects^^^^^^^^ } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./EnumerableSet.sol"; import "./Address.sol"; import "./Context.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
/*--------------------------------------------------------PRüF0.8.0 __/\\\\\\\\\\\\\ _____/\\\\\\\\\ _______/\\__/\\ ___/\\\\\\\\\\\\\\\ _\/\\\/////////\\\ _/\\\///////\\\ ____\//__\//____\/\\\///////////__ _\/\\\_______\/\\\_\/\\\_____\/\\\ ________________\/\\\ ____________ _\/\\\\\\\\\\\\\/__\/\\\\\\\\\\\/_____/\\\____/\\\_\/\\\\\\\\\\\ ____ _\/\\\/////////____\/\\\//////\\\ ___\/\\\___\/\\\_\/\\\///////______ _\/\\\ ____________\/\\\ ___\//\\\ __\/\\\___\/\\\_\/\\\ ____________ _\/\\\ ____________\/\\\ ____\//\\\ _\/\\\___\/\\\_\/\\\ ____________ _\/\\\ ____________\/\\\ _____\//\\\_\//\\\\\\\\\ _\/\\\ ____________ _\/// _____________\/// _______\/// __\///////// __\/// _____________ *-------------------------------------------------------------------*/ /*----------------------------------------------------------------- * TO DO * *---------------------------------------------------------------*/ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; struct Record { uint8 assetStatus; // Status - Transferrable, locked, in transfer, stolen, lost, etc. uint8 modCount; // Number of times asset has been forceModded. uint8 currency; //currency for price information (0=not for sale, 1=ETH, 2=PRUF, 3=DAI, 4=WBTC.... ) uint16 numberOfTransfers; //number of transfers and forcemods uint32 assetClass; // Type of asset uint32 countDown; // Variable that can only be dencreased from countDownStart uint32 countDownStart; // Starting point for countdown variable (set once) uint120 price; //price set for items offered for sale bytes32 Ipfs1a; // Publically viewable asset description bytes32 Ipfs2a; // Publically viewable immutable notes bytes32 Ipfs1b; // Publically viewable asset description bytes32 Ipfs2b; // Publically viewable immutable notes bytes32 rightsHolder; // KEK256 Registered owner } struct AC { //Struct for holding and manipulating assetClass data string name; // NameHash for assetClass uint32 assetClassRoot; // asset type root (bicyles - USA Bicycles) //immutable uint8 custodyType; // custodial or noncustodial, special asset types //immutable uint8 managementType; // type of management for asset creation, import, export //immutable uint8 storageProvider; // Storage Provider uint32 discount; // price sharing //internal admin //immutable address referenceAddress; // Used with wrap / decorate uint8 switches; // bitwise Flags for AC control //immutable bytes32 IPFS; //IPFS data for defining idxHash creation attribute fields } struct ContractDataHash { //Struct for holding and manipulating contract authorization data uint8 contractType; // Auth Level / type bytes32 nameHash; // Contract Name hashed } struct DefaultContract { //Struct for holding and manipulating contract authorization data uint8 contractType; // Auth Level / type string name; // Contract name } struct escrowData { bytes32 controllingContractNameHash; //hash of the name of the controlling escrow contract bytes32 escrowOwnerAddressHash; //hash of an address designated as an executor for the escrow contract uint256 timelock; } struct escrowDataExtLight { //used only in recycle //1 slot uint8 escrowData; //used by recycle uint8 u8_1; uint8 u8_2; uint8 u8_3; uint16 u16_1; uint16 u16_2; uint32 u32_1; address addr_1; //used by recycle } struct escrowDataExtHeavy { //specific uses not defined // 5 slots uint32 u32_2; uint32 u32_3; uint32 u32_4; address addr_2; bytes32 b32_1; bytes32 b32_2; uint256 u256_1; uint256 u256_2; } struct Costs { //make these require full epoch to change??? uint256 serviceCost; // Cost in the given item category address paymentAddress; // 2nd-party fee beneficiary address } struct Invoice { //invoice struct to facilitate payment messaging in-contract uint32 assetClass; address rootAddress; address ACTHaddress; uint256 rootPrice; uint256 ACTHprice; } struct ID { //ID struct for ID info uint256 trustLevel; //admin only bytes32 URI; //caller address match string userName; //admin only///caller address match can set } /* * @dev Interface for UTIL_TKN * INHERIANCE: import "./Imports/access/AccessControl.sol"; import "./Imports/token/ERC20/ERC20.sol"; import "./Imports/token/ERC20/ERC20Burnable.sol"; import "./Imports/token/ERC20/ERC20Pausable.sol"; import "./Imports/token/ERC20/ERC20Snapshot.sol"; */ interface UTIL_TKN_Interface { /* * @dev PERMENANTLY !!! Kill trusted agent and payable */ function killTrustedAgent(uint256 _key) external; /* * @dev Set calling wallet to a "cold Wallet" that cannot be manipulated by TRUSTED_AGENT or PAYABLE permissioned functions */ function setColdWallet() external; /* * @dev un-set calling wallet to a "cold Wallet", enabling manipulation by TRUSTED_AGENT and PAYABLE permissioned functions */ function unSetColdWallet() external; /* * @dev return an adresses "cold wallet" status */ function isColdWallet(address _addr) external returns (uint256); /* * @dev Set adress of payment contract */ function AdminSetSharesAddress(address _paymentAddress) external; /* * @dev Deducts token payment from transaction * Requirements: * - the caller must have PAYABLE_ROLE. * - the caller must have a pruf token balance of at least `_rootPrice + _ACTHprice`. */ // ---- NON-LEGACY // function payForService(address _senderAddress, Invoice calldata invoice) // external; //---- LEGACY function payForService( address _senderAddress, address _rootAddress, uint256 _rootPrice, address _ACTHaddress, uint256 _ACTHprice ) external; /* * @dev arbitrary burn (requires TRUSTED_AGENT_ROLE) ****USE WITH CAUTION */ function trustedAgentBurn(address _addr, uint256 _amount) external; /* * @dev arbitrary transfer (requires TRUSTED_AGENT_ROLE) ****USE WITH CAUTION */ function trustedAgentTransfer( address _from, address _to, uint256 _amount ) external; /* * @dev Take a balance snapshot, returns snapshot ID * - the caller must have the `SNAPSHOT_ROLE`. */ function takeSnapshot() external returns (uint256); /** * @dev Creates `amount` new tokens for `to`. * * See {ERC20-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 amount) external; /** * @dev Pauses all token transfers. * * See {ERC20Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() external; /** * @dev Unpauses all token transfers. * * See {ERC20Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() external; /** * @dev Retrieves the balance of `account` at the time `snapshotId` was created. */ function balanceOfAt(address account, uint256 snapshotId) external returns (uint256); /** * @dev Retrieves the total supply at the time `snapshotId` was created. */ function totalSupplyAt(uint256 snapshotId) external returns (uint256); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external 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 returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) external returns (bool); /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) external; /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) external; /** * @dev Returns the cap on the token's total supply. */ function cap() external returns (uint256); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external returns (bool); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external returns (uint256); /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external returns (address); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } //------------------------------------------------------------------------------------------------ /* * @dev Interface for AC_TKN * INHERIANCE: import "./Imports/token/ERC721/ERC721.sol"; import "./Imports/access/Ownable.sol"; import "./Imports/utils/ReentrancyGuard.sol"; */ interface AC_TKN_Interface { /* * @dev Set storage contract to interface with */ function OO_setStorageContract(address _storageAddress) external; /* * @dev Address Setters */ function Admin_resolveContractAddresses() external; /* * @dev Mints assetClass token, must be isContractAdmin */ function mintACToken( address _recipientAddress, uint256 tokenId, string calldata _tokenURI ) external returns (uint256); /** * @dev Transfers the ownership of a given token ID to another address. * Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * Requires the _msgSender() to be the owner, approved, or operator. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata _data ) external; /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address tokenHolderAdress); /** * @dev Returns 170 if the specified token exists, otherwise zero * */ function tokenExists(uint256 tokenId) external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external returns (uint256); /** * @dev Returns the name of the token. */ function name() external view returns (string memory tokenName); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory tokenSymbol); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory URI); /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } //------------------------------------------------------------------------------------------------ /* * @dev Interface for A_TKN * INHERIANCE: import "./Imports/token/ERC721/ERC721.sol"; import "./Imports/access/Ownable.sol"; import "./Imports/utils/ReentrancyGuard.sol"; */ interface A_TKN_Interface { /* * @dev Set storage contract to interface with */ function OO_setStorageContract(address _storageAddress) external; /* * @dev Address Setters */ function Admin_resolveContractAddresses() external; /* * @dev Mint new asset token */ function mintAssetToken( address _recipientAddress, uint256 tokenId, string calldata _tokenURI ) external returns (uint256); /* * @dev Set new token URI String */ function setURI(uint256 tokenId, string calldata _tokenURI) external returns (uint256); // /* // * @dev Reassures user that token is minted in the PRUF system // */ // function validatePipToken( // uint256 tokenId, // uint32 _assetClass, // string calldata _authCode // ) external view; /* * @dev See if token exists */ function tokenExists(uint256 tokenId) external view returns (uint256); /** * @dev Transfers the ownership of a given token ID to another address. * Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * Requires the _msgSender() to be the owner, approved, or operator. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers the ownership of a given token ID to another address by a TRUSTED_AGENT. * Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * Requires the _msgSender() to be the owner, approved, or operator. * @param _from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function trustedAgentTransferFrom( address _from, address to, uint256 tokenId ) external; /** * @dev Burns a token */ function trustedAgentBurn(uint256 tokenId) external; /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata _data ) external; /** * @dev Safely burns a token and sets the corresponding RGT to zero in storage. */ function discard(uint256 tokenId) external; /** * @dev return an adresses "cold wallet" status * WALLET ADDRESSES SET TO "Cold" DO NOT WORK WITH TRUSTED_AGENT FUNCTIONS * @param _addr - address to check * returns 170 if adress is set to "cold wallet" status */ function isColdWallet(address _addr) external returns (uint256); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external returns (address tokenHolderAdress); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external returns (uint256); /** * @dev Returns the name of the token. */ function name() external returns (string memory tokenName); /** * @dev Returns the token collection symbol. */ function symbol() external returns (string memory tokenSymbol); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external returns (string memory URI); /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external returns (uint256); } //------------------------------------------------------------------------------------------------ /* * @dev Interface for ID_TKN * INHERIANCE: import "./Imports/token/ERC721/ERC721.sol"; import "./Imports/access/Ownable.sol"; import "./Imports/utils/ReentrancyGuard.sol"; */ interface ID_TKN_Interface { /* * @dev Mint new PRUF_ID token */ function mintPRUF_IDToken( address _recipientAddress, uint256 _tokenId, string calldata _URI ) external returns (uint256); /* * @dev remint ID Token * must set a new and unuiqe rgtHash * burns old token * Sends new token to original Caller */ function reMintPRUF_IDToken(address _recipientAddress, uint256 tokenId) external returns (uint256); /* * @dev See if token exists */ function tokenExists(uint256 tokenId) external view returns (uint256); /** * @dev @dev Blocks the transfer of a given token ID to another address * Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * Requires the _msgSender() to be the owner, approved, or operator. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Safely blocks the transfer of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Safely blocks the transfer of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata _data ) external; /* * @dev Set new ID data fields */ function setTrustLevel(uint256 _tokenId, uint256 _trustLevel) external; /* * @dev get ID data */ function IdData(uint256 _tokenId) external view returns (ID memory); /* * @dev get ID trustLevel */ function trustedLevel(uint256 _tokenId) external view returns (uint256); /* * @dev get ID trustLevel by address (token 0 at address) */ function trustedLevelByAddress(address _addr) external view returns (uint256); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address tokenHolderAdress); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external returns (uint256); /** * @dev Returns the name of the token. */ function name() external view returns (string memory tokenName); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory tokenSymbol); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory URI); /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } //------------------------------------------------------------------------------------------------ /* * @dev Interface for AC_MGR * INHERIANCE: import "./PRUF_BASIC.sol"; */ interface AC_MGR_Interface { /* * @dev Set pricing */ function OO_SetACpricing(uint256 _L1) external; /* * @dev Tincreases (but cannot decrease) price share for a given AC * !! to be used with great caution * This breaks decentralization and must eventually be given over to some kind of governance contract. */ function adminIncreaseShare(uint32 _assetClass, uint32 _newDiscount) external; /* * @dev Transfers a name from one asset class to another * !! -------- to be used with great caution and only as a result of community governance action ----------- * Designed to remedy brand infringement issues. This breaks decentralization and must eventually be given * over to some kind of governance contract. * Destination AC must have IPFS Set to 0xFFF..... * */ function transferName( uint32 _assetClass_source, uint32 _assetClass_dest, string calldata _name ) external; /* * @dev Modifies an asset class with minimal controls *--------DPS TEST ---- NEW args, order */ function AdminModAssetClass( uint32 _assetClass, uint32 _assetClassRoot, uint8 _custodyType, uint8 _managementType, uint8 _storageProvider, uint32 _discount, address _refAddress, uint8 _switches, bytes32 _IPFS ) external; /* * @dev Mints asset class token and creates an assetClass. Mints to @address * Requires that: * name is unuiqe * AC is not provisioned with a root (proxy for not yet registered) * that ACtoken does not exist * _discount 10000 = 100 percent price share , cannot exceed */ function createAssetClass( uint32 _assetClass, string calldata _name, uint32 _assetClassRoot, uint8 _custodyType, uint8 _managementType, uint32 _discount, bytes32 _IPFS, address _recipientAddress ) external; /** * @dev Burns (amount) tokens and mints a new asset class token to the caller address * * Requirements: * - the caller must have a balance of at least `amount`. */ function purchaseACnode( string calldata _name, uint32 _assetClassRoot, uint8 _custodyType, bytes32 _IPFS ) external returns (uint256); /* * @dev Authorize / Deauthorize / Authorize users for an address be permitted to make record modifications */ function addUser( uint32 _assetClass, bytes32 _addrHash, uint8 _userType ) external; /* * @dev Modifies an assetClass * Sets a new AC name. Asset Classes cannot be moved to a new root or custody type. * Requires that: * caller holds ACtoken * name is unuiqe or same as old name */ function updateACname(uint32 _assetClass, string calldata _name) external; /* * @dev Modifies an assetClass * Sets a new AC IPFS Address. Asset Classes cannot be moved to a new root or custody type. * Requires that: * caller holds ACtoken */ function updateACipfs(uint32 _assetClass, bytes32 _IPFS) external; /* * @dev Set function costs and payment address per asset class, in Wei */ function ACTH_setCosts( uint32 _assetClass, uint16 _service, uint256 _serviceCost, address _paymentAddress ) external; /* * @dev Modifies an assetClass * Sets the immutable data on an ACNode * Requires that: * caller holds ACtoken * ACnode is managementType 255 (unconfigured) */ function updateACImmutable( uint32 _assetClass, uint8 _managementType, uint8 _storageProvider, address _refAddress ) external; //-------------------------------------------Read-only functions ---------------------------------------------- /* * @dev get a User Record */ function getUserType(bytes32 _userHash, uint32 _assetClass) external view returns (uint8); /* * @dev get the authorization status of a management type 0 = not allowed DPS:TEST -- NEW */ function getManagementTypeStatus(uint8 _managementType) external view returns (uint8); /* * @dev get the authorization status of a storage type 0 = not allowed DPS:TEST -- NEW */ function getStorageProviderStatus(uint8 _storageProvider) external view returns (uint8); /* * @dev get the authorization status of a custody type 0 = not allowed DPS:TEST -- NEW */ function getCustodyTypeStatus(uint8 _custodyType) external view returns (uint8); /* * @dev Retrieve AC_data @ _assetClass */ function getAC_data(uint32 _assetClass) external returns ( uint32, uint8, uint8, uint32, address ); /* CAN'T RETURN A STRUCT WITH A STRING WITHOUT WIERDNESS-0.8.1 * @dev Retrieve AC_data @ _assetClass */ function getExtAC_data(uint32 _assetClass) external view returns (AC memory); /* CAN'T RETURN A STRUCT WITH A STRING WITHOUT WIERDNESS-0.8.1 * @dev Retrieve AC_data @ _assetClass */ function getExtAC_data_nostruct(uint32 _assetClass) external view returns ( uint8, address, uint8, bytes32 ); /* * @dev compare the root of two asset classes */ function isSameRootAC(uint32 _assetClass1, uint32 _assetClass2) external view returns (uint8); /* * @dev Retrieve AC_name @ _tokenId */ function getAC_name(uint32 _tokenId) external view returns (string memory); /* * @dev Retrieve AC_number @ AC_name */ function resolveAssetClass(string calldata _name) external view returns (uint32); /* * @dev return current AC token index pointer */ function currentACpricingInfo() external view returns (uint256, uint256); /* * @dev get bit (1/0) from .switches at specified position */ function getSwitchAt(uint32 _assetClass, uint8 _position) external view returns (uint256); /* * @dev Retrieve function costs per asset class, per service type, in Wei */ function getServiceCosts(uint32 _assetClass, uint16 _service) external view returns (Invoice memory); /* * @dev Retrieve AC_discount @ _assetClass, in percent ACTH share, * 100 (9000 = 90%) */ function getAC_discount(uint32 _assetClass) external view returns (uint32); } //------------------------------------------------------------------------------------------------ /* * @dev Interface for STOR * INHERIANCE: import "./Imports/access/Ownable.sol"; import "./Imports/utils/Pausable.sol"; import "./Imports/utils/ReentrancyGuard.sol"; */ interface STOR_Interface { /* * @dev Triggers stopped state. (pausable) */ function pause() external; /* * @dev Returns to normal state. (pausable) */ function unpause() external; /* * @dev Authorize / Deauthorize / Authorize ADRESSES permitted to make record modifications, per AssetClass * populates contract name resolution and data mappings */ function OO_addContract( string calldata _name, address _addr, uint32 _assetClass, uint8 _contractAuthLevel ) external; /* * @dev ASet the default 11 authorized contracts */ function enableDefaultContractsForAC(uint32 _assetClass) external; /* * @dev Authorize / Deauthorize / Authorize contract NAMES permitted to make record modifications, per AssetClass * allows ACtokenHolder to auithorize or deauthorize specific contracts to work within their asset class */ function enableContractForAC( string calldata _name, uint32 _assetClass, uint8 _contractAuthLevel ) external; /* * @dev Make a new record, writing to the 'database' mapping with basic initial asset data */ function newRecord( bytes32 _idxHash, bytes32 _rgtHash, uint32 _assetClass, uint32 _countDownStart ) external; /* * @dev Modify a record, writing to the 'database' mapping with updates to multiple fields */ function modifyRecord( bytes32 _idxHash, bytes32 _rgtHash, uint8 _newAssetStatus, uint32 _countDown, uint256 _incrementForceModCount, uint256 _incrementNumberOfTransfers ) external; /* * @dev Change asset class of an asset - writes to assetClass in the 'Record' struct of the 'database' at _idxHash */ function changeAC(bytes32 _idxHash, uint32 _newAssetClass) external; /* * @dev Set an asset to stolen or lost. Allows narrow modification of status 6/12 assets, normally locked */ function setLostOrStolen(bytes32 _idxHash, uint8 _newAssetStatus) external; /* * @dev Set an asset to escrow locked status (6/50/56). */ function setEscrow(bytes32 _idxHash, uint8 _newAssetStatus) external; /* * @dev remove an asset from escrow status. Implicitly trusts escrowManager ECR_MGR contract */ function endEscrow(bytes32 _idxHash) external; /* * @dev Modify record sale price and currency data */ function setPrice( bytes32 _idxHash, uint120 _price, uint8 _currency ) external; /* * @dev set record sale price and currency data to zero */ function clearPrice(bytes32 _idxHash) external; /* * @dev Modify record Ipfs1a data */ function modifyIpfs1( bytes32 _idxHash, bytes32 _Ipfs1a, bytes32 _Ipfs1b ) external; /* * @dev Write record Ipfs2 data */ function modifyIpfs2( bytes32 _idxHash, bytes32 _Ipfs2a, bytes32 _Ipfs2b ) external; /* * @dev return a record from the database, including rgt */ function retrieveRecord(bytes32 _idxHash) external returns (Record memory); // function retrieveRecord(bytes32 _idxHash) // external // view // returns ( // bytes32, // uint8, // uint32, // uint32, // uint32, // bytes32, // bytes32 // ); /* * @dev return a record from the database w/o rgt */ function retrieveShortRecord( bytes32 _idxHash //CTS:EXAMINE, doesn't return same number of params as STOR ) external view returns ( uint8, uint8, uint32, uint32, uint32, bytes32, bytes32, uint16 ); /* * @dev return the pricing and currency data from a record */ function getPriceData(bytes32 _idxHash) external view returns (uint120, uint8); /* * @dev Compare record.rightsholder with supplied bytes32 rightsholder * return 170 if matches, 0 if not */ function _verifyRightsHolder(bytes32 _idxHash, bytes32 _rgtHash) external view returns (uint256); /* * @dev Compare record.rightsholder with supplied bytes32 rightsholder (writes an emit in blockchain for independant verification) */ function blockchainVerifyRightsHolder(bytes32 _idxHash, bytes32 _rgtHash) external returns (uint8); /* * @dev //returns the address of a contract with name _name. This is for web3 implementations to find the right contract to interact with * example : Frontend = ****** so web 3 first asks storage where to find frontend, then calls for frontend functions. */ function resolveContractAddress(string calldata _name) external view returns (address); /* * @dev //returns the contract type of a contract with address _addr. */ function ContractInfoHash(address _addr, uint32 _assetClass) external view returns (uint8, bytes32); } //------------------------------------------------------------------------------------------------ /* * @dev Interface for ECR_MGR * INHERIANCE: import "./PRUF_BASIC.sol"; */ interface ECR_MGR_Interface { /* * @dev Set an asset to escrow status (6/50/56). Sets timelock for unix timestamp of escrow end. */ function setEscrow( bytes32 _idxHash, uint8 _newAssetStatus, bytes32 _escrowOwnerAddressHash, uint256 _timelock ) external; /* * @dev remove an asset from escrow status */ function endEscrow(bytes32 _idxHash) external; /* * @dev Set data in EDL mapping * Must be setter contract * Must be in escrow */ function setEscrowDataLight( bytes32 _idxHash, escrowDataExtLight calldata _escrowDataLight ) external; /* * @dev Set data in EDL mapping * Must be setter contract * Must be in escrow */ function setEscrowDataHeavy( bytes32 _idxHash, escrowDataExtHeavy calldata escrowDataHeavy ) external; /* * @dev Permissive removal of asset from escrow status after time-out */ function permissiveEndEscrow(bytes32 _idxHash) external; /* * @dev return escrow OwnerHash */ function retrieveEscrowOwner(bytes32 _idxHash) external returns (bytes32 hashOfEscrowOwnerAdress); /* * @dev return escrow data @ IDX */ function retrieveEscrowData(bytes32 _idxHash) external returns (escrowData memory); /* * @dev return EscrowDataLight @ IDX */ function retrieveEscrowDataLight(bytes32 _idxHash) external view returns (escrowDataExtLight memory); /* * @dev return EscrowDataHeavy @ IDX */ function retrieveEscrowDataHeavy(bytes32 _idxHash) external view returns (escrowDataExtHeavy memory); } //------------------------------------------------------------------------------------------------ /* * @dev Interface for RCLR * INHERIANCE: import "./PRUF_ECR_CORE.sol"; import "./PRUF_CORE.sol"; */ interface RCLR_Interface { function discard(bytes32 _idxHash, address _sender) external; function recycle(bytes32 _idxHash) external; } //------------------------------------------------------------------------------------------------ /* * @dev Interface for APP * INHERIANCE: import "./PRUF_CORE.sol"; */ interface APP_Interface { function transferAssetToken(address _to, bytes32 _idxHash) external; } //------------------------------------------------------------------------------------------------ /* * @dev Interface for APP_NC * INHERIANCE: import "./PRUF_CORE.sol"; */ interface APP_NC_Interface { function transferAssetToken(address _to, bytes32 _idxHash) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CONTRACT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"checkMyAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"splitMyPruf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"splitPrufAtAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060016000818155815460ff19169091556200002e9033620000b2565b6200005a7f2ce8d04a9c35987429af538825cd2438cc5c5bb5dc427955f84daaa3ea10501633620000b2565b620000867f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620000b2565b600380546001600160a01b03191673a49811140e1d6f653dec28037be0924c811c4538179055620001c8565b620000be8282620000c2565b5050565b6000828152600260209081526040909120620000e99183906200077c6200013d821b17901c565b15620000be57620000f96200015d565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062000154836001600160a01b03841662000161565b90505b92915050565b3390565b60006200016f8383620001b0565b620001a75750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000157565b50600062000157565b60009081526001919091016020526040902054151590565b610fae80620001d86000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806387356e0c11610097578063a217fddf11610066578063a217fddf146101e4578063ca15c873146101ec578063d547741f146101ff578063e63ab1e91461021257610100565b806387356e0c146101965780639010d07c1461019e57806391d14854146101be57806395ac828a146101d157610100565b80633f4ba83a116100d35780633f4ba83a1461015e5780635c975abb1461016657806372890c951461017b5780638456cb591461018e57610100565b80631da0331214610105578063248a9ca3146101235780632f2ff15d1461013657806336568abe1461014b575b600080fd5b61010d61021a565b60405161011a9190610c31565b60405180910390f35b61010d610131366004610b7d565b61023e565b610149610144366004610b95565b610257565b005b610149610159366004610b95565b6102a9565b6101496102eb565b61016e61033b565b60405161011a9190610c26565b610149610189366004610b63565b610344565b6101496104d7565b610149610525565b6101b16101ac366004610bc0565b6106ad565b60405161011a9190610bf9565b61016e6101cc366004610b95565b6106ce565b61010d6101df366004610b63565b6106e6565b61010d610701565b61010d6101fa366004610b7d565b610706565b61014961020d366004610b95565b61071d565b61010d610758565b7f2ce8d04a9c35987429af538825cd2438cc5c5bb5dc427955f84daaa3ea10501681565b600081815260026020819052604090912001545b919050565b60008281526002602081905260409091200154610276906101cc610791565b61029b5760405162461bcd60e51b815260040161029290610c97565b60405180910390fd5b6102a58282610795565b5050565b6102b1610791565b6001600160a01b0316816001600160a01b0316146102e15760405162461bcd60e51b815260040161029290610ed6565b6102a582826107fe565b6103157f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336106ce565b6103315760405162461bcd60e51b815260040161029290610e1c565b610339610867565b565b60015460ff1690565b61034c61033b565b156103695760405162461bcd60e51b815260040161029290610de5565b6001600160a01b0381166000908152600460205260409020541561039f5760405162461bcd60e51b815260040161029290610d2b565b6003546040517f4ee2cd7e0000000000000000000000000000000000000000000000000000000081526000916001600160a01b031690634ee2cd7e906103ec908590600190600401610c0d565b602060405180830381600087803b15801561040657600080fd5b505af115801561041a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043e9190610be1565b6001600160a01b0380841660009081526004602081905260409182902060aa905560035491517f40c10f190000000000000000000000000000000000000000000000000000000081529394509116916340c10f19916104a1918691869101610c0d565b600060405180830381600087803b1580156104bb57600080fd5b505af11580156104cf573d6000803e3d6000fd5b505050505050565b6105017f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336106ce565b61051d5760405162461bcd60e51b815260040161029290610e1c565b6103396108d5565b61052d61033b565b1561054a5760405162461bcd60e51b815260040161029290610de5565b33600090815260046020526040902054156105775760405162461bcd60e51b815260040161029290610e79565b6003546040517f4ee2cd7e0000000000000000000000000000000000000000000000000000000081526000916001600160a01b031690634ee2cd7e906105c4903390600190600401610c0d565b602060405180830381600087803b1580156105de57600080fd5b505af11580156105f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106169190610be1565b3360008181526004602081905260409182902060aa905560035491517f40c10f190000000000000000000000000000000000000000000000000000000081529394506001600160a01b03909116926340c10f1992610678929091869101610c0d565b600060405180830381600087803b15801561069257600080fd5b505af11580156106a6573d6000803e3d6000fd5b5050505050565b60008281526002602052604081206106c5908361092f565b90505b92915050565b60008281526002602052604081206106c5908361093b565b6001600160a01b031660009081526004602052604090205490565b600081565b60008181526002602052604081206106c890610950565b6000828152600260208190526040909120015461073c906101cc610791565b6102e15760405162461bcd60e51b815260040161029290610d88565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60006106c5836001600160a01b03841661095b565b3390565b60008281526002602052604090206107ad908261077c565b156102a5576107ba610791565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260026020526040902061081690826109a5565b156102a557610823610791565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b61086f61033b565b61088b5760405162461bcd60e51b815260040161029290610cf4565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6108be610791565b6040516108cb9190610bf9565b60405180910390a1565b6108dd61033b565b156108fa5760405162461bcd60e51b815260040161029290610de5565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586108be610791565b60006106c583836109ba565b60006106c5836001600160a01b038416610a13565b60006106c882610a2b565b60006109678383610a13565b61099d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106c8565b5060006106c8565b60006106c5836001600160a01b038416610a2f565b815460009082106109dd5760405162461bcd60e51b815260040161029290610c3a565b826000018281548110610a0057634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b5490565b60008181526001830160205260408120548015610b42576000610a53600183610f4b565b8554909150600090610a6790600190610f4b565b90506000866000018281548110610a8e57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110610abf57634e487b7160e01b600052603260045260246000fd5b600091825260209091200155610ad6836001610f33565b60008281526001890160205260409020558654879080610b0657634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506106c8565b60009150506106c8565b80356001600160a01b038116811461025257600080fd5b600060208284031215610b74578081fd5b6106c582610b4c565b600060208284031215610b8e578081fd5b5035919050565b60008060408385031215610ba7578081fd5b82359150610bb760208401610b4c565b90509250929050565b60008060408385031215610bd2578182fd5b50508035926020909101359150565b600060208284031215610bf2578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60408201527f6473000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201527f2061646d696e20746f206772616e740000000000000000000000000000000000606082015260800190565b60208082526014908201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604082015260600190565b60208082526032908201527f53504c49543a534d5041413a2043616c6c65722061646472657373206861732060408201527f616c7265616479206265656e2073706c69740000000000000000000000000000606082015260800190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000606082015260800190565b60208082526010908201527f5061757361626c653a2070617573656400000000000000000000000000000000604082015260600190565b60208082526023908201527f53504c49543a4d4f442d49503a206d7573742068617665205041555345525f5260408201527f4f4c450000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f53504c49543a534d503a2043616c6c657220616464726573732068617320616c60408201527f7265616479206265656e2073706c697400000000000000000000000000000000606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201527f20726f6c657320666f722073656c660000000000000000000000000000000000606082015260800190565b60008219821115610f4657610f46610f62565b500190565b600082821015610f5d57610f5d610f62565b500390565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220ddefff9b7b7c06acb3cc0f5ca3fe9ef24c86b4e896bd721102a8be95a1295fa964736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c806387356e0c11610097578063a217fddf11610066578063a217fddf146101e4578063ca15c873146101ec578063d547741f146101ff578063e63ab1e91461021257610100565b806387356e0c146101965780639010d07c1461019e57806391d14854146101be57806395ac828a146101d157610100565b80633f4ba83a116100d35780633f4ba83a1461015e5780635c975abb1461016657806372890c951461017b5780638456cb591461018e57610100565b80631da0331214610105578063248a9ca3146101235780632f2ff15d1461013657806336568abe1461014b575b600080fd5b61010d61021a565b60405161011a9190610c31565b60405180910390f35b61010d610131366004610b7d565b61023e565b610149610144366004610b95565b610257565b005b610149610159366004610b95565b6102a9565b6101496102eb565b61016e61033b565b60405161011a9190610c26565b610149610189366004610b63565b610344565b6101496104d7565b610149610525565b6101b16101ac366004610bc0565b6106ad565b60405161011a9190610bf9565b61016e6101cc366004610b95565b6106ce565b61010d6101df366004610b63565b6106e6565b61010d610701565b61010d6101fa366004610b7d565b610706565b61014961020d366004610b95565b61071d565b61010d610758565b7f2ce8d04a9c35987429af538825cd2438cc5c5bb5dc427955f84daaa3ea10501681565b600081815260026020819052604090912001545b919050565b60008281526002602081905260409091200154610276906101cc610791565b61029b5760405162461bcd60e51b815260040161029290610c97565b60405180910390fd5b6102a58282610795565b5050565b6102b1610791565b6001600160a01b0316816001600160a01b0316146102e15760405162461bcd60e51b815260040161029290610ed6565b6102a582826107fe565b6103157f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336106ce565b6103315760405162461bcd60e51b815260040161029290610e1c565b610339610867565b565b60015460ff1690565b61034c61033b565b156103695760405162461bcd60e51b815260040161029290610de5565b6001600160a01b0381166000908152600460205260409020541561039f5760405162461bcd60e51b815260040161029290610d2b565b6003546040517f4ee2cd7e0000000000000000000000000000000000000000000000000000000081526000916001600160a01b031690634ee2cd7e906103ec908590600190600401610c0d565b602060405180830381600087803b15801561040657600080fd5b505af115801561041a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043e9190610be1565b6001600160a01b0380841660009081526004602081905260409182902060aa905560035491517f40c10f190000000000000000000000000000000000000000000000000000000081529394509116916340c10f19916104a1918691869101610c0d565b600060405180830381600087803b1580156104bb57600080fd5b505af11580156104cf573d6000803e3d6000fd5b505050505050565b6105017f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336106ce565b61051d5760405162461bcd60e51b815260040161029290610e1c565b6103396108d5565b61052d61033b565b1561054a5760405162461bcd60e51b815260040161029290610de5565b33600090815260046020526040902054156105775760405162461bcd60e51b815260040161029290610e79565b6003546040517f4ee2cd7e0000000000000000000000000000000000000000000000000000000081526000916001600160a01b031690634ee2cd7e906105c4903390600190600401610c0d565b602060405180830381600087803b1580156105de57600080fd5b505af11580156105f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106169190610be1565b3360008181526004602081905260409182902060aa905560035491517f40c10f190000000000000000000000000000000000000000000000000000000081529394506001600160a01b03909116926340c10f1992610678929091869101610c0d565b600060405180830381600087803b15801561069257600080fd5b505af11580156106a6573d6000803e3d6000fd5b5050505050565b60008281526002602052604081206106c5908361092f565b90505b92915050565b60008281526002602052604081206106c5908361093b565b6001600160a01b031660009081526004602052604090205490565b600081565b60008181526002602052604081206106c890610950565b6000828152600260208190526040909120015461073c906101cc610791565b6102e15760405162461bcd60e51b815260040161029290610d88565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60006106c5836001600160a01b03841661095b565b3390565b60008281526002602052604090206107ad908261077c565b156102a5576107ba610791565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260026020526040902061081690826109a5565b156102a557610823610791565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b61086f61033b565b61088b5760405162461bcd60e51b815260040161029290610cf4565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6108be610791565b6040516108cb9190610bf9565b60405180910390a1565b6108dd61033b565b156108fa5760405162461bcd60e51b815260040161029290610de5565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586108be610791565b60006106c583836109ba565b60006106c5836001600160a01b038416610a13565b60006106c882610a2b565b60006109678383610a13565b61099d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106c8565b5060006106c8565b60006106c5836001600160a01b038416610a2f565b815460009082106109dd5760405162461bcd60e51b815260040161029290610c3a565b826000018281548110610a0057634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b5490565b60008181526001830160205260408120548015610b42576000610a53600183610f4b565b8554909150600090610a6790600190610f4b565b90506000866000018281548110610a8e57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110610abf57634e487b7160e01b600052603260045260246000fd5b600091825260209091200155610ad6836001610f33565b60008281526001890160205260409020558654879080610b0657634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506106c8565b60009150506106c8565b80356001600160a01b038116811461025257600080fd5b600060208284031215610b74578081fd5b6106c582610b4c565b600060208284031215610b8e578081fd5b5035919050565b60008060408385031215610ba7578081fd5b82359150610bb760208401610b4c565b90509250929050565b60008060408385031215610bd2578182fd5b50508035926020909101359150565b600060208284031215610bf2578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60408201527f6473000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201527f2061646d696e20746f206772616e740000000000000000000000000000000000606082015260800190565b60208082526014908201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604082015260600190565b60208082526032908201527f53504c49543a534d5041413a2043616c6c65722061646472657373206861732060408201527f616c7265616479206265656e2073706c69740000000000000000000000000000606082015260800190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000606082015260800190565b60208082526010908201527f5061757361626c653a2070617573656400000000000000000000000000000000604082015260600190565b60208082526023908201527f53504c49543a4d4f442d49503a206d7573742068617665205041555345525f5260408201527f4f4c450000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f53504c49543a534d503a2043616c6c657220616464726573732068617320616c60408201527f7265616479206265656e2073706c697400000000000000000000000000000000606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201527f20726f6c657320666f722073656c660000000000000000000000000000000000606082015260800190565b60008219821115610f4657610f46610f62565b500190565b600082821015610f5d57610f5d610f62565b500390565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220ddefff9b7b7c06acb3cc0f5ca3fe9ef24c86b4e896bd721102a8be95a1295fa964736f6c63430008000033
Deployed Bytecode Sourcemap
1264:3613:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1448:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4253:112:0;;;;;;:::i;:::-;;:::i;4615:223::-;;;;;;:::i;:::-;;:::i;:::-;;5789:205;;;;;;:::i;:::-;;:::i;4738:137:5:-;;;:::i;1035:84:6:-;;;:::i;:::-;;;;;;;:::i;3390:554:5:-;;;;;;:::i;:::-;;:::i;4416:133::-;;;:::i;2736:537::-;;;:::i;3936:136:0:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2921:137::-;;;;;;:::i;:::-;;:::i;4119:116:5:-;;;;;;:::i;:::-;;:::i;1698:49:0:-;;;:::i;3226:125::-;;;;;;:::i;:::-;;:::i;5072:226::-;;;;;;:::i;:::-;;:::i;1380:62:5:-;;;:::i;1448:86::-;1502:32;1448:86;:::o;4253:112:0:-;4310:7;4336:12;;;:6;:12;;;;;;;;:22;;4253:112;;;;:::o;4615:223::-;4706:12;;;;:6;:12;;;;;;;;:22;;4698:45;;4730:12;:10;:12::i;4698:45::-;4690:105;;;;-1:-1:-1;;;4690:105:0;;;;;;;:::i;:::-;;;;;;;;;4806:25;4817:4;4823:7;4806:10;:25::i;:::-;4615:223;;:::o;5789:205::-;5886:12;:10;:12::i;:::-;-1:-1:-1;;;;;5875:23:0;:7;-1:-1:-1;;;;;5875:23:0;;5867:83;;;;-1:-1:-1;;;5867:83:0;;;;;;;:::i;:::-;5961:26;5973:4;5979:7;5961:11;:26::i;4738:137:5:-;2482:32;1418:24;2503:10;2482:7;:32::i;:::-;2461:114;;;;-1:-1:-1;;;2461:114:5;;;;;;;:::i;:::-;4825:10:::1;:8;:10::i;:::-;4738:137::o:0;1035:84:6:-;1105:7;;;;1035:84;:::o;3390:554:5:-;1349:8:6;:6;:8::i;:::-;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;3490:18:5;::::1;;::::0;;;:8:::1;:18;::::0;;;;;:23;3469:120:::1;;;;-1:-1:-1::0;;;3469:120:5::1;;;;;;;:::i;:::-;3661:8;::::0;:33:::1;::::0;;;;3633:25:::1;::::0;-1:-1:-1;;;;;3661:8:5::1;::::0;:20:::1;::::0;:33:::1;::::0;3682:8;;3661;;:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3704:18:5;;::::1;;::::0;;;:8:::1;:18;::::0;;;;;;;;3725:3:::1;3704:24:::0;;3816:8:::1;::::0;:42;;;;;3633:61;;-1:-1:-1;3816:8:5;::::1;::::0;:13:::1;::::0;:42:::1;::::0;3713:8;;3633:61;;3816:42:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;1388:1:6;3390:554:5::0;:::o;4416:133::-;2482:32;1418:24;2503:10;2482:7;:32::i;:::-;2461:114;;;;-1:-1:-1;;;2461:114:5;;;;;;;:::i;:::-;4501:8:::1;:6;:8::i;2736:537::-:0;1349:8:6;:6;:8::i;:::-;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:6;;;;;;;:::i;:::-;2822:10:5::1;2813:20;::::0;;;:8:::1;:20;::::0;;;;;:25;2792:120:::1;;;;-1:-1:-1::0;;;2792:120:5::1;;;;;;;:::i;:::-;2984:8;::::0;:35:::1;::::0;;;;2956:25:::1;::::0;-1:-1:-1;;;;;2984:8:5::1;::::0;:20:::1;::::0;:35:::1;::::0;3005:10:::1;::::0;2984:8;;:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3038:10;3029:20;::::0;;;:8:::1;:20;::::0;;;;;;;;3052:3:::1;3029:26:::0;;3143:8:::1;::::0;:44;;;;;2956:63;;-1:-1:-1;;;;;;3143:8:5;;::::1;::::0;:13:::1;::::0;:44:::1;::::0;3038:10;;2956:63;;3143:44:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;1388:1:6;2736:537:5:o:0;3936:136:0:-;4009:7;4035:12;;;:6;:12;;;;;:30;;4059:5;4035:23;:30::i;:::-;4028:37;;3936:136;;;;;:::o;2921:137::-;2990:4;3013:12;;;:6;:12;;;;;:38;;3043:7;3013:29;:38::i;4119:116:5:-;-1:-1:-1;;;;;4210:18:5;4184:7;4210:18;;;:8;:18;;;;;;;4119:116::o;1698:49:0:-;1743:4;1698:49;:::o;3226:125::-;3289:7;3315:12;;;:6;:12;;;;;:29;;:27;:29::i;5072:226::-;5164:12;;;;:6;:12;;;;;;;;:22;;5156:45;;5188:12;:10;:12::i;5156:45::-;5148:106;;;;-1:-1:-1;;;5148:106:0;;;;;;;:::i;1380:62:5:-;1418:24;1380:62;:::o;6421:150:3:-;6491:4;6514:50;6519:3;-1:-1:-1;;;;;6539:23:3;;6514:4;:50::i;586:96:2:-;665:10;586:96;:::o;6996:184:0:-;7069:12;;;;:6;:12;;;;;:33;;7094:7;7069:24;:33::i;:::-;7065:109;;;7150:12;:10;:12::i;:::-;-1:-1:-1;;;;;7123:40:0;7141:7;-1:-1:-1;;;;;7123:40:0;7135:4;7123:40;;;;;;;;;;6996:184;;:::o;7186:188::-;7260:12;;;;:6;:12;;;;;:36;;7288:7;7260:27;:36::i;:::-;7256:112;;;7344:12;:10;:12::i;:::-;-1:-1:-1;;;;;7317:40:0;7335:7;-1:-1:-1;;;;;7317:40:0;7329:4;7317:40;;;;;;;;;;7186:188;;:::o;2047:117:6:-;1614:8;:6;:8::i;:::-;1606:41;;;;-1:-1:-1;;;1606:41:6;;;;;;;:::i;:::-;2105:7:::1;:15:::0;;-1:-1:-1;;2105:15:6::1;::::0;;2135:22:::1;2144:12;:10;:12::i;:::-;2135:22;;;;;;:::i;:::-;;;;;;;;2047:117::o:0;1800:115::-;1349:8;:6;:8::i;:::-;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:6;;;;;;;:::i;:::-;1869:4:::1;1859:14:::0;;-1:-1:-1;;1859:14:6::1;::::0;::::1;::::0;;1888:20:::1;1895:12;:10;:12::i;7669:156:3:-:0;7743:7;7793:22;7797:3;7809:5;7793:3;:22::i;6976:165::-;7056:4;7079:55;7089:3;-1:-1:-1;;;;;7109:23:3;;7079:9;:55::i;7222:115::-;7285:7;7311:19;7319:3;7311:7;:19::i;1632:404::-;1695:4;1716:21;1726:3;1731:5;1716:9;:21::i;:::-;1711:319;;-1:-1:-1;1753:23:3;;;;;;;;:11;:23;;;;;;;;;;;;;1933:18;;1911:19;;;:12;;;:19;;;;;;:40;;;;1965:11;;1711:319;-1:-1:-1;2014:5:3;2007:12;;6739:156;6812:4;6835:53;6843:3;-1:-1:-1;;;;;6863:23:3;;6835:7;:53::i;4444:201::-;4538:18;;4511:7;;4538:26;-1:-1:-1;4530:73:3;;;;-1:-1:-1;;;4530:73:3;;;;;;;:::i;:::-;4620:3;:11;;4632:5;4620:18;;;;;;-1:-1:-1;;;4620:18:3;;;;;;;;;;;;;;;;;4613:25;;4444:201;;;;:::o;3797:127::-;3870:4;3893:19;;;:12;;;;;:19;;;;;;:24;;;3797:127::o;4005:107::-;4087:18;;4005:107::o;2204:1512::-;2270:4;2407:19;;;:12;;;:19;;;;;;2441:15;;2437:1273;;2798:21;2822:14;2835:1;2822:10;:14;:::i;:::-;2870:18;;2798:38;;-1:-1:-1;2850:17:3;;2870:22;;2891:1;;2870:22;:::i;:::-;2850:42;;3132:17;3152:3;:11;;3164:9;3152:22;;;;;;-1:-1:-1;;;3152:22:3;;;;;;;;;;;;;;;;;3132:42;;3295:9;3266:3;:11;;3278:13;3266:26;;;;;;-1:-1:-1;;;3266:26:3;;;;;;;;;;;;;;;;;;:38;3396:17;:13;3412:1;3396:17;:::i;:::-;3370:23;;;;:12;;;:23;;;;;:43;3519:17;;3370:3;;3519:17;;;-1:-1:-1;;;3519:17:3;;;;;;;;;;;;;;;;;;;;;;;;;;3611:3;:12;;:19;3624:5;3611:19;;;;;;;;;;;3604:26;;;3652:4;3645:11;;;;;;;;2437:1273;3694:5;3687:12;;;;;14:198:8;84:20;;-1:-1:-1;;;;;133:54:8;;123:65;;113:2;;202:1;199;192:12;217:198;;329:2;317:9;308:7;304:23;300:32;297:2;;;350:6;342;335:22;297:2;378:31;399:9;378:31;:::i;420:190::-;;532:2;520:9;511:7;507:23;503:32;500:2;;;553:6;545;538:22;500:2;-1:-1:-1;581:23:8;;490:120;-1:-1:-1;490:120:8:o;615:266::-;;;744:2;732:9;723:7;719:23;715:32;712:2;;;765:6;757;750:22;712:2;806:9;793:23;783:33;;835:40;871:2;860:9;856:18;835:40;:::i;:::-;825:50;;702:179;;;;;:::o;886:258::-;;;1015:2;1003:9;994:7;990:23;986:32;983:2;;;1036:6;1028;1021:22;983:2;-1:-1:-1;;1064:23:8;;;1134:2;1119:18;;;1106:32;;-1:-1:-1;973:171:8:o;1149:194::-;;1272:2;1260:9;1251:7;1247:23;1243:32;1240:2;;;1293:6;1285;1278:22;1240:2;-1:-1:-1;1321:16:8;;1230:113;-1:-1:-1;1230:113:8:o;1348:226::-;-1:-1:-1;;;;;1512:55:8;;;;1494:74;;1482:2;1467:18;;1449:125::o;1579:305::-;-1:-1:-1;;;;;1779:55:8;;;;1761:74;;1866:2;1851:18;;1844:34;1749:2;1734:18;;1716:168::o;2191:187::-;2356:14;;2349:22;2331:41;;2319:2;2304:18;;2286:92::o;2383:177::-;2529:25;;;2517:2;2502:18;;2484:76::o;2565:398::-;2767:2;2749:21;;;2806:2;2786:18;;;2779:30;2845:34;2840:2;2825:18;;2818:62;2916:4;2911:2;2896:18;;2889:32;2953:3;2938:19;;2739:224::o;2968:411::-;3170:2;3152:21;;;3209:2;3189:18;;;3182:30;3248:34;3243:2;3228:18;;3221:62;3319:17;3314:2;3299:18;;3292:45;3369:3;3354:19;;3142:237::o;3384:344::-;3586:2;3568:21;;;3625:2;3605:18;;;3598:30;3664:22;3659:2;3644:18;;3637:50;3719:2;3704:18;;3558:170::o;3733:414::-;3935:2;3917:21;;;3974:2;3954:18;;;3947:30;4013:34;4008:2;3993:18;;3986:62;4084:20;4079:2;4064:18;;4057:48;4137:3;4122:19;;3907:240::o;4152:412::-;4354:2;4336:21;;;4393:2;4373:18;;;4366:30;4432:34;4427:2;4412:18;;4405:62;4503:18;4498:2;4483:18;;4476:46;4554:3;4539:19;;4326:238::o;4569:340::-;4771:2;4753:21;;;4810:2;4790:18;;;4783:30;4849:18;4844:2;4829:18;;4822:46;4900:2;4885:18;;4743:166::o;4914:399::-;5116:2;5098:21;;;5155:2;5135:18;;;5128:30;5194:34;5189:2;5174:18;;5167:62;5265:5;5260:2;5245:18;;5238:33;5303:3;5288:19;;5088:225::o;5318:412::-;5520:2;5502:21;;;5559:2;5539:18;;;5532:30;5598:34;5593:2;5578:18;;5571:62;5669:18;5664:2;5649:18;;5642:46;5720:3;5705:19;;5492:238::o;5735:411::-;5937:2;5919:21;;;5976:2;5956:18;;;5949:30;6015:34;6010:2;5995:18;;5988:62;6086:17;6081:2;6066:18;;6059:45;6136:3;6121:19;;5909:237::o;6333:128::-;;6404:1;6400:6;6397:1;6394:13;6391:2;;;6410:18;;:::i;:::-;-1:-1:-1;6446:9:8;;6381:80::o;6466:125::-;;6534:1;6531;6528:8;6525:2;;;6539:18;;:::i;:::-;-1:-1:-1;6576:9:8;;6515:76::o;6596:184::-;-1:-1:-1;;;6645:1:8;6638:88;6745:4;6742:1;6735:15;6769:4;6766:1;6759:15
Swarm Source
ipfs://ddefff9b7b7c06acb3cc0f5ca3fe9ef24c86b4e896bd721102a8be95a1295fa9
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.