Contract Overview
Balance:
0 MATIC
MATIC Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x58401f59eff5b00af48f8cd7fe9ef05cb117f6570a08dd6d010170d77258535d | Multicall | 31245184 | 245 days 2 hrs ago | 0x07883ebd6f178420f24969279bd425ab0b99f10b | IN | 0xa1251eeb1e306f471828ea19069cb5cfb9b5dcec | 0 MATIC | 0.231141069624 | |
0x7c795e1d9341d33a9e23cb8331f31c4a64fe357527ac9dd63abff6a3653f5486 | 0x60806040 | 31245180 | 245 days 2 hrs ago | 0x07883ebd6f178420f24969279bd425ab0b99f10b | IN | Contract Creation | 0 MATIC | 0.076045435998 |
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x6B4c3D5dfcE50355e766a12Bc15fcf43ef01199F
Contract Name:
ContractRegistry
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @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 {AccessControl-_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) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @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 view returns (address); /** * @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 view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) 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; 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"); (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"); (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"); (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"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Multicall.sol) pragma solidity ^0.8.0; import "./Address.sol"; /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ abstract contract Multicall { /** * @dev Receives and executes a batch of function calls on this contract. */ function multicall(bytes[] calldata data) external returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { results[i] = Address.functionDelegateCall(address(this), data[i]); } return results; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/structs/EnumerableSet.sol) 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; if (lastIndex != toDeleteIndex) { 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] = valueIndex; // Replace lastvalue's index to valueIndex } // 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) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // 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); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // 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)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // 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)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.9; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/utils/Multicall.sol"; import "./interfaces/IProtocolGovernance.sol"; import "./interfaces/IContractRegistry.sol"; import "./libraries/ExceptionsLibrary.sol"; import "./libraries/SemverLibrary.sol"; import "./utils/ContractMeta.sol"; contract ContractRegistry is ContractMeta, IContractRegistry, Multicall { using EnumerableSet for EnumerableSet.AddressSet; using EnumerableSet for EnumerableSet.Bytes32Set; IProtocolGovernance public governance; mapping(bytes32 => mapping(uint256 => address)) private _nameToVersionToAddress; mapping(bytes32 => uint256[]) private _nameToVersions; EnumerableSet.AddressSet private _addresses; EnumerableSet.Bytes32Set private _names; constructor(address _governance) { governance = IProtocolGovernance(_governance); } // ------------------- EXTERNAL, VIEW ------------------- /// @inheritdoc IContractRegistry function addresses() external view returns (address[] memory) { return _addresses.values(); } /// @inheritdoc IContractRegistry function names() external view returns (string[] memory result) { uint256 length = _names.length(); result = new string[](length); for (uint256 i; i != length; ++i) { result[i] = _bytes32ToString(_names.at(i)); } } /// @inheritdoc IContractRegistry function versions(string memory name_) external view returns (string[] memory result) { bytes32 name = bytes32(bytes(name_)); uint256[] memory versions_ = _nameToVersions[name]; result = new string[](versions_.length); for (uint256 i = 0; i < versions_.length; i++) { result[i] = SemverLibrary.stringifySemver(versions_[i]); } } /// @inheritdoc IContractRegistry function versionAddress(string memory name_, string memory version) external view returns (address) { bytes32 name = bytes32(bytes(name_)); uint256 versionNum = SemverLibrary.numberifySemver(version); return _nameToVersionToAddress[name][versionNum]; } /// @inheritdoc IContractRegistry function latestVersion(string memory name_) external view returns (string memory, address) { bytes32 name = bytes32(abi.encodePacked(name_)); uint256 version = _latestVersion(name); return (string(SemverLibrary.stringifySemver(version)), _nameToVersionToAddress[name][version]); } // ------------------- EXTERNAL, MUTATING ------------------- /// @inheritdoc IContractRegistry function registerContract(address target) external { _requireAtLeastOperator(); require(_addresses.add(target), ExceptionsLibrary.DUPLICATE); IContractMeta newContract = IContractMeta(target); bytes32 newContractName = newContract.contractNameBytes(); require(_validateContractName(newContractName), ExceptionsLibrary.INVALID_VALUE); bytes32 newContractVersionRaw = newContract.contractVersionBytes(); uint256 newContractVersion = SemverLibrary.numberifySemver(newContract.contractVersion()); uint256 latestContractVersion = _latestVersion(newContractName); require(newContractVersion > latestContractVersion, ExceptionsLibrary.INVARIANT); uint256 newContractVersionMajor = newContractVersion >> 16; uint256 latestContractVersionMajor = latestContractVersion >> 16; require(newContractVersionMajor - latestContractVersionMajor <= 1, ExceptionsLibrary.INVARIANT); _nameToVersionToAddress[newContractName][newContractVersion] = target; _nameToVersions[newContractName].push(newContractVersion); _names.add(newContractName); emit ContractRegistered(tx.origin, msg.sender, newContractName, newContractVersionRaw, target); } // ------------------------- INTERNAL, VIEW ------------------------------ function _contractName() internal pure override returns (bytes32) { return bytes32("ContractRegistry"); } function _contractVersion() internal pure override returns (bytes32) { return bytes32("1.0.0"); } function _requireAtLeastOperator() private view { require( governance.isOperator(msg.sender) || governance.isAdmin(msg.sender), ExceptionsLibrary.FORBIDDEN ); } function _latestVersion(bytes32 name) private view returns (uint256) { uint256 versionsLength = _nameToVersions[name].length; return versionsLength != 0 ? _nameToVersions[name][versionsLength - 1] : 0; } function _validateContractName(bytes32 name_) private pure returns (bool) { bytes memory name = bytes(_bytes32ToString(name_)); for (uint256 i; i < name.length; ++i) { uint8 ascii = uint8(name[i]); bool isAlphanumeric = ((0x61 <= ascii && ascii <= 0x7a) || (0x41 <= ascii && ascii <= 0x5a) || (0x30 <= ascii && ascii <= 0x39)); if (!isAlphanumeric) { return false; } } return true; } // -------------------------- EVENTS -------------------------- event ContractRegistered( address indexed origin, address indexed sender, bytes32 indexed name, bytes32 version, address target ); }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.9; interface IContractRegistry { // ------------------- EXTERNAL, VIEW ------------------- /// @notice Addresses of the registered contracts function addresses() external view returns (address[] memory); /// @notice Names of the registered contracts function names() external view returns (string[] memory); /// @notice Latest version of the contract /// @param name Name of the contract function latestVersion(string memory name) external view returns (string memory, address); /// @notice All versions of the contract /// @param name Name of the contract function versions(string memory name) external view returns (string[] memory result); /// @notice Address of the contract at a given version /// @param name Name of the contract /// @param version Version of the contract function versionAddress(string memory name, string memory version) external view returns (address); // ------------------- EXTERNAL, MUTATING ------------------- /// @notice Register a new contract /// @param target Address of the contract to be registered function registerContract(address target) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "./utils/IDefaultAccessControl.sol"; import "./IUnitPricesGovernance.sol"; interface IProtocolGovernance is IDefaultAccessControl, IUnitPricesGovernance { /// @notice CommonLibrary protocol params. /// @param maxTokensPerVault Max different token addresses that could be managed by the vault /// @param governanceDelay The delay (in secs) that must pass before setting new pending params to commiting them /// @param protocolTreasury The address that collects protocolFees, if protocolFee is not zero /// @param forceAllowMask If a permission bit is set in this mask it forces all addresses to have this permission as true /// @param withdrawLimit Withdraw limit (in unit prices, i.e. usd) struct Params { uint256 maxTokensPerVault; uint256 governanceDelay; address protocolTreasury; uint256 forceAllowMask; uint256 withdrawLimit; } // ------------------- EXTERNAL, VIEW ------------------- /// @notice Timestamp after which staged granted permissions for the given address can be committed. /// @param target The given address /// @return Zero if there are no staged permission grants, timestamp otherwise function stagedPermissionGrantsTimestamps(address target) external view returns (uint256); /// @notice Staged granted permission bitmask for the given address. /// @param target The given address /// @return Bitmask function stagedPermissionGrantsMasks(address target) external view returns (uint256); /// @notice Permission bitmask for the given address. /// @param target The given address /// @return Bitmask function permissionMasks(address target) external view returns (uint256); /// @notice Timestamp after which staged pending protocol parameters can be committed /// @return Zero if there are no staged parameters, timestamp otherwise. function stagedParamsTimestamp() external view returns (uint256); /// @notice Staged pending protocol parameters. function stagedParams() external view returns (Params memory); /// @notice Current protocol parameters. function params() external view returns (Params memory); /// @notice Addresses for which non-zero permissions are set. function permissionAddresses() external view returns (address[] memory); /// @notice Permission addresses staged for commit. function stagedPermissionGrantsAddresses() external view returns (address[] memory); /// @notice Return all addresses where rawPermissionMask bit for permissionId is set to 1. /// @param permissionId Id of the permission to check. /// @return A list of dirty addresses. function addressesByPermission(uint8 permissionId) external view returns (address[] memory); /// @notice Checks if address has permission or given permission is force allowed for any address. /// @param addr Address to check /// @param permissionId Permission to check function hasPermission(address addr, uint8 permissionId) external view returns (bool); /// @notice Checks if address has all permissions. /// @param target Address to check /// @param permissionIds A list of permissions to check function hasAllPermissions(address target, uint8[] calldata permissionIds) external view returns (bool); /// @notice Max different ERC20 token addresses that could be managed by the protocol. function maxTokensPerVault() external view returns (uint256); /// @notice The delay for committing any governance params. function governanceDelay() external view returns (uint256); /// @notice The address of the protocol treasury. function protocolTreasury() external view returns (address); /// @notice Permissions mask which defines if ordinary permission should be reverted. /// This bitmask is xored with ordinary mask. function forceAllowMask() external view returns (uint256); /// @notice Withdraw limit per token per block. /// @param token Address of the token /// @return Withdraw limit per token per block function withdrawLimit(address token) external view returns (uint256); /// @notice Addresses that has staged validators. function stagedValidatorsAddresses() external view returns (address[] memory); /// @notice Timestamp after which staged granted permissions for the given address can be committed. /// @param target The given address /// @return Zero if there are no staged permission grants, timestamp otherwise function stagedValidatorsTimestamps(address target) external view returns (uint256); /// @notice Staged validator for the given address. /// @param target The given address /// @return Validator function stagedValidators(address target) external view returns (address); /// @notice Addresses that has validators. function validatorsAddresses() external view returns (address[] memory); /// @notice Address that has validators. /// @param i The number of address /// @return Validator address function validatorsAddress(uint256 i) external view returns (address); /// @notice Validator for the given address. /// @param target The given address /// @return Validator function validators(address target) external view returns (address); // ------------------- EXTERNAL, MUTATING, GOVERNANCE, IMMEDIATE ------------------- /// @notice Rollback all staged validators. function rollbackStagedValidators() external; /// @notice Revoke validator instantly from the given address. /// @param target The given address function revokeValidator(address target) external; /// @notice Stages a new validator for the given address /// @param target The given address /// @param validator The validator for the given address function stageValidator(address target, address validator) external; /// @notice Commits validator for the given address. /// @dev Reverts if governance delay has not passed yet. /// @param target The given address. function commitValidator(address target) external; /// @notice Commites all staged validators for which governance delay passed /// @return Addresses for which validators were committed function commitAllValidatorsSurpassedDelay() external returns (address[] memory); /// @notice Rollback all staged granted permission grant. function rollbackStagedPermissionGrants() external; /// @notice Commits permission grants for the given address. /// @dev Reverts if governance delay has not passed yet. /// @param target The given address. function commitPermissionGrants(address target) external; /// @notice Commites all staged permission grants for which governance delay passed. /// @return An array of addresses for which permission grants were committed. function commitAllPermissionGrantsSurpassedDelay() external returns (address[] memory); /// @notice Revoke permission instantly from the given address. /// @param target The given address. /// @param permissionIds A list of permission ids to revoke. function revokePermissions(address target, uint8[] memory permissionIds) external; /// @notice Commits staged protocol params. /// Reverts if governance delay has not passed yet. function commitParams() external; // ------------------- EXTERNAL, MUTATING, GOVERNANCE, DELAY ------------------- /// @notice Sets new pending params that could have been committed after governance delay expires. /// @param newParams New protocol parameters to set. function stageParams(Params memory newParams) external; /// @notice Stage granted permissions that could have been committed after governance delay expires. /// Resets commit delay and permissions if there are already staged permissions for this address. /// @param target Target address /// @param permissionIds A list of permission ids to grant function stagePermissionGrants(address target, uint8[] memory permissionIds) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import "./utils/IDefaultAccessControl.sol"; interface IUnitPricesGovernance is IDefaultAccessControl, IERC165 { // ------------------- EXTERNAL, VIEW ------------------- /// @notice Estimated amount of token worth 1 USD staged for commit. /// @param token Address of the token /// @return The amount of token function stagedUnitPrices(address token) external view returns (uint256); /// @notice Timestamp after which staged unit prices for the given token can be committed. /// @param token Address of the token /// @return Timestamp function stagedUnitPricesTimestamps(address token) external view returns (uint256); /// @notice Estimated amount of token worth 1 USD. /// @param token Address of the token /// @return The amount of token function unitPrices(address token) external view returns (uint256); // ------------------- EXTERNAL, MUTATING ------------------- /// @notice Stage estimated amount of token worth 1 USD staged for commit. /// @param token Address of the token /// @param value The amount of token function stageUnitPrice(address token, uint256 value) external; /// @notice Reset staged value /// @param token Address of the token function rollbackUnitPrice(address token) external; /// @notice Commit staged unit price /// @param token Address of the token function commitUnitPrice(address token) external; }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.9; interface IContractMeta { function contractName() external view returns (string memory); function contractNameBytes() external view returns (bytes32); function contractVersion() external view returns (string memory); function contractVersionBytes() external view returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/access/IAccessControlEnumerable.sol"; interface IDefaultAccessControl is IAccessControlEnumerable { /// @notice Checks that the address is contract admin. /// @param who Address to check /// @return `true` if who is admin, `false` otherwise function isAdmin(address who) external view returns (bool); /// @notice Checks that the address is contract admin. /// @param who Address to check /// @return `true` if who is operator, `false` otherwise function isOperator(address who) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; /// @notice Exceptions stores project`s smart-contracts exceptions library ExceptionsLibrary { string constant ADDRESS_ZERO = "AZ"; string constant VALUE_ZERO = "VZ"; string constant EMPTY_LIST = "EMPL"; string constant NOT_FOUND = "NF"; string constant INIT = "INIT"; string constant DUPLICATE = "DUP"; string constant NULL = "NULL"; string constant TIMESTAMP = "TS"; string constant FORBIDDEN = "FRB"; string constant ALLOWLIST = "ALL"; string constant LIMIT_OVERFLOW = "LIMO"; string constant LIMIT_UNDERFLOW = "LIMU"; string constant INVALID_VALUE = "INV"; string constant INVARIANT = "INVA"; string constant INVALID_TARGET = "INVTR"; string constant INVALID_TOKEN = "INVTO"; string constant INVALID_INTERFACE = "INVI"; string constant INVALID_SELECTOR = "INVS"; string constant INVALID_STATE = "INVST"; string constant INVALID_LENGTH = "INVL"; string constant LOCK = "LCKD"; string constant DISABLED = "DIS"; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/utils/Strings.sol"; library SemverLibrary { uint8 internal constant ASCII_ZERO = 48; function numberifySemver(string memory _semver) internal pure returns (uint256) { uint256[3] memory res; uint256 semverIndex; uint256 semverLength; for (uint256 i = 0; (i < bytes(_semver).length) && (semverIndex < 3); i++) { uint8 b = uint8(bytes(_semver)[i]); if (b == uint8(bytes1("."))) { // forbid empty semver part if (semverLength == 0) { return 0; } semverIndex += 1; semverLength = 0; continue; } if (b < ASCII_ZERO || b > ASCII_ZERO + 9) { return 0; } res[semverIndex] = res[semverIndex] * 10 + b - ASCII_ZERO; semverLength += 1; } if ((semverIndex != 2) || (semverLength == 0)) { return 0; } return (res[0] << 16) + (res[1] << 8) + res[2]; } function stringifySemver(uint256 num) internal pure returns (string memory) { if (num >= 1 << 24) { return "0"; } string memory major = Strings.toString(num >> 16); string memory minor = Strings.toString((num >> 8) & 0xff); string memory patch = Strings.toString(num & 0xff); return string(abi.encodePacked(abi.encodePacked(major, ".", minor, ".", patch))); } }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.9; import "../interfaces/utils/IContractMeta.sol"; abstract contract ContractMeta is IContractMeta { // ------------------- EXTERNAL, VIEW ------------------- function contractName() external pure returns (string memory) { return _bytes32ToString(_contractName()); } function contractNameBytes() external pure returns (bytes32) { return _contractName(); } function contractVersion() external pure returns (string memory) { return _bytes32ToString(_contractVersion()); } function contractVersionBytes() external pure returns (bytes32) { return _contractVersion(); } // ------------------- INTERNAL, VIEW ------------------- function _contractName() internal pure virtual returns (bytes32); function _contractVersion() internal pure virtual returns (bytes32); function _bytes32ToString(bytes32 b) internal pure returns (string memory s) { s = new string(32); uint256 len = 32; for (uint256 i = 0; i < 32; ++i) { if (uint8(b[i]) == 0) { len = i; break; } } assembly { mstore(s, len) mstore(add(s, 0x20), b) } } }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"origin","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"version","type":"bytes32"},{"indexed":false,"internalType":"address","name":"target","type":"address"}],"name":"ContractRegistered","type":"event"},{"inputs":[],"name":"addresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractNameBytes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractVersionBytes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"contract IProtocolGovernance","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"}],"name":"latestVersion","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"names","outputs":[{"internalType":"string[]","name":"result","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"registerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"version","type":"string"}],"name":"versionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"}],"name":"versions","outputs":[{"internalType":"string[]","name":"result","type":"string[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5060405161184d38038061184d83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6117ba806100936000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80635107f348116100715780635107f348146101695780635aa6e6751461017c57806375d0c0dc1461018f578063a0a8e460146101a4578063ac9650d8146101ac578063da0321cd146101cc57600080fd5b8063056da048146100b957806306a46239146100d7578063070f8f5a146100ef5780630e3e80ac1461011057806322a5dde4146101295780634e3889961461013e575b600080fd5b6100c16101e1565b6040516100ce9190611194565b60405180910390f35b640312e302e360dc1b5b6040519081526020016100ce565b6101026100fd3660046112bb565b610295565b6040516100ce9291906112f0565b6f436f6e7472616374526567697374727960801b6100e1565b61013c61013736600461131a565b610309565b005b61015161014c366004611343565b61065b565b6040516001600160a01b0390911681526020016100ce565b6100c16101773660046112bb565b6106a2565b600054610151906001600160a01b031681565b6101976107c5565b6040516100ce91906113a7565b6101976107e3565b6101bf6101ba3660046113ba565b6107f6565b6040516100ce919061142f565b6101d46108eb565b6040516100ce9190611484565b606060006101ef60056108f7565b90508067ffffffffffffffff81111561020a5761020a6111f6565b60405190808252806020026020018201604052801561023d57816020015b60608152602001906001900390816102285790505b50915060005b81811461028b5761025d610258600583610901565b610914565b83828151811061026f5761026f6114d1565b602002602001018190525080610284906114fd565b9050610243565b505090565b905090565b6060600080836040516020016102ab9190611518565b6040516020818303038152906040526102c390611534565b905060006102d082610980565b90506102db816109d6565b600092835260016020908152604080852093855292905291205490946001600160a01b039091169350915050565b610311610a80565b61031c600382610bb9565b6040518060400160405280600381526020016204455560ec1b8152509061035f5760405162461bcd60e51b815260040161035691906113a7565b60405180910390fd5b5060008190506000816001600160a01b0316630e3e80ac6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103a057600080fd5b505afa1580156103b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d8919061155b565b90506103e381610bce565b6040518060400160405280600381526020016224a72b60e91b8152509061041d5760405162461bcd60e51b815260040161035691906113a7565b506000826001600160a01b03166306a462396040518163ffffffff1660e01b815260040160206040518083038186803b15801561045957600080fd5b505afa15801561046d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610491919061155b565b90506000610512846001600160a01b031663a0a8e4606040518163ffffffff1660e01b815260040160006040518083038186803b1580156104d157600080fd5b505afa1580156104e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261050d9190810190611574565b610c89565b9050600061051f84610980565b905080821160405180604001604052806004815260200163494e564160e01b8152509061055f5760405162461bcd60e51b815260040161035691906113a7565b50601082811c9082901c600161057582846115e2565b111560405180604001604052806004815260200163494e564160e01b815250906105b25760405162461bcd60e51b815260040161035691906113a7565b506000868152600160208181526040808420888552825280842080546001600160a01b0319166001600160a01b038e1617905589845260028252832080549283018155835290912001849055610609600587610df4565b50604080518681526001600160a01b038a1660208201528791339132917f7e8be5380240a9107eaeb7481a3915da9f146bbebc641a9367d620b78650ffa3910160405180910390a45050505050505050565b60008061066784611534565b9050600061067484610c89565b6000928352600160209081526040808520928552919052909120546001600160a01b03169150505b92915050565b606060006106af83611534565b60008181526002602090815260408083208054825181850281018501909352808352949550929390929183018282801561070857602002820191906000526020600020905b8154815260200190600101908083116106f4575b50505050509050805167ffffffffffffffff811115610729576107296111f6565b60405190808252806020026020018201604052801561075c57816020015b60608152602001906001900390816107475790505b50925060005b81518110156107bd5761078d828281518110610780576107806114d1565b60200260200101516109d6565b84828151811061079f5761079f6114d1565b602002602001018190525080806107b5906114fd565b915050610762565b505050919050565b60606102906f436f6e7472616374526567697374727960801b610914565b6060610290640312e302e360dc1b610914565b60608167ffffffffffffffff811115610811576108116111f6565b60405190808252806020026020018201604052801561084457816020015b606081526020019060019003908161082f5790505b50905060005b828110156108e4576108b430858584818110610868576108686114d1565b905060200281019061087a91906115f9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e0092505050565b8282815181106108c6576108c66114d1565b602002602001018190525080806108dc906114fd565b91505061084a565b5092915050565b60606102906003610e25565b600061069c825490565b600061090d8383610e32565b9392505050565b604080516020808252818301909252606091602082018180368337019050509050602060005b602081101561097257838160208110610955576109556114d1565b1a61096257809150610972565b61096b816114fd565b905061093a565b508152602081019190915290565b6000818152600260205260408120548061099b57600061090d565b60008381526002602052604090206109b46001836115e2565b815481106109c4576109c46114d1565b90600052602060002001549392505050565b606063010000008210610a005750506040805180820190915260018152600360fc1b602082015290565b6000610a0f601084901c610e5c565b90506000610a23600885901c60ff16610e5c565b90506000610a338560ff16610e5c565b9050828282604051602001610a4a93929190611647565b60408051601f1981840301815290829052610a6791602001611518565b6040516020818303038152906040529350505050919050565b6000546040516336b87bd760e11b81523360048201526001600160a01b0390911690636d70f7ae9060240160206040518083038186803b158015610ac357600080fd5b505afa158015610ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afb91906116a1565b80610b7c5750600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b158015610b4457600080fd5b505afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c91906116a1565b6040518060400160405280600381526020016223292160e91b81525090610bb65760405162461bcd60e51b815260040161035691906113a7565b50565b600061090d836001600160a01b038416610f62565b600080610bda83610914565b905060005b8151811015610c7f576000828281518110610bfc57610bfc6114d1565b016020015160f81c9050600060618210801590610c1d5750607a8260ff1611155b80610c3b57508160ff16604111158015610c3b5750605a8260ff1611155b80610c5957508160ff16603011158015610c59575060398260ff1611155b905080610c6c5750600095945050505050565b505080610c78906114fd565b9050610bdf565b5060019392505050565b6000610c9361111a565b60008060005b855181108015610ca95750600383105b15610da6576000868281518110610cc257610cc26114d1565b016020015160f81c9050602e811415610cfe5782610ce7575060009695505050505050565b610cf26001856116c3565b93506000925050610d94565b603060ff82161080610d205750610d17603060096116db565b60ff168160ff16115b15610d32575060009695505050505050565b603060ff8216868660038110610d4a57610d4a6114d1565b6020020151610d5a90600a611700565b610d6491906116c3565b610d6e91906115e2565b858560038110610d8057610d806114d1565b6020020152610d906001846116c3565b9250505b80610d9e816114fd565b915050610c99565b50816002141580610db5575080155b15610dc557506000949350505050565b604083015160208401518451610de19160081b9060101b6116c3565b610deb91906116c3565b95945050505050565b600061090d8383610f62565b606061090d838360405180606001604052806027815260200161175e60279139610fb1565b6060600061090d83611085565b6000826000018281548110610e4957610e496114d1565b9060005260206000200154905092915050565b606081610e805750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610eaa5780610e94816114fd565b9150610ea39050600a83611735565b9150610e84565b60008167ffffffffffffffff811115610ec557610ec56111f6565b6040519080825280601f01601f191660200182016040528015610eef576020820181803683370190505b5090505b8415610f5a57610f046001836115e2565b9150610f11600a86611749565b610f1c9060306116c3565b60f81b818381518110610f3157610f316114d1565b60200101906001600160f81b031916908160001a905350610f53600a86611735565b9450610ef3565b949350505050565b6000818152600183016020526040812054610fa95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561069c565b50600061069c565b6060833b6110105760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610356565b600080856001600160a01b03168560405161102b9190611518565b600060405180830381855af49150503d8060008114611066576040519150601f19603f3d011682016040523d82523d6000602084013e61106b565b606091505b509150915061107b8282866110e1565b9695505050505050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156110d557602002820191906000526020600020905b8154815260200190600101908083116110c1575b50505050509050919050565b606083156110f057508161090d565b8251156111005782518084602001fd5b8160405162461bcd60e51b815260040161035691906113a7565b60405180606001604052806003906020820280368337509192915050565b60005b8381101561115357818101518382015260200161113b565b83811115611162576000848401525b50505050565b60008151808452611180816020860160208601611138565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156111e957603f198886030184526111d7858351611168565b945092850192908501906001016111bb565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611235576112356111f6565b604052919050565b600067ffffffffffffffff821115611257576112576111f6565b50601f01601f191660200190565b600082601f83011261127657600080fd5b81356112896112848261123d565b61120c565b81815284602083860101111561129e57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156112cd57600080fd5b813567ffffffffffffffff8111156112e457600080fd5b610f5a84828501611265565b6040815260006113036040830185611168565b905060018060a01b03831660208301529392505050565b60006020828403121561132c57600080fd5b81356001600160a01b038116811461090d57600080fd5b6000806040838503121561135657600080fd5b823567ffffffffffffffff8082111561136e57600080fd5b61137a86838701611265565b9350602085013591508082111561139057600080fd5b5061139d85828601611265565b9150509250929050565b60208152600061090d6020830184611168565b600080602083850312156113cd57600080fd5b823567ffffffffffffffff808211156113e557600080fd5b818501915085601f8301126113f957600080fd5b81358181111561140857600080fd5b8660208260051b850101111561141d57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156111e957603f19888603018452611472858351611168565b94509285019290850190600101611456565b6020808252825182820181905260009190848201906040850190845b818110156114c55783516001600160a01b0316835292840192918401916001016114a0565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611511576115116114e7565b5060010190565b6000825161152a818460208701611138565b9190910192915050565b80516020808301519190811015611555576000198160200360031b1b821691505b50919050565b60006020828403121561156d57600080fd5b5051919050565b60006020828403121561158657600080fd5b815167ffffffffffffffff81111561159d57600080fd5b8201601f810184136115ae57600080fd5b80516115bc6112848261123d565b8181528560208385010111156115d157600080fd5b610deb826020830160208601611138565b6000828210156115f4576115f46114e7565b500390565b6000808335601e1984360301811261161057600080fd5b83018035915067ffffffffffffffff82111561162b57600080fd5b60200191503681900382131561164057600080fd5b9250929050565b60008451611659818460208901611138565b8083019050601760f91b8082528551611679816001850160208a01611138565b60019201918201528351611694816002840160208801611138565b0160020195945050505050565b6000602082840312156116b357600080fd5b8151801515811461090d57600080fd5b600082198211156116d6576116d66114e7565b500190565b600060ff821660ff84168060ff038211156116f8576116f86114e7565b019392505050565b600081600019048311821515161561171a5761171a6114e7565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826117445761174461171f565b500490565b6000826117585761175861171f565b50069056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ace32ad31103d75fdac002bb2334e4cb28238ae3ed814d80e4b75fceeb350d6164736f6c6343000809003300000000000000000000000007706daa46e82e26f60ede841fa81544dfc8b18f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.