Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 25 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute Proposal | 19709650 | 145 days ago | IN | 0 ETH | 0.00089738 | ||||
Execute Proposal | 19709648 | 145 days ago | IN | 0 ETH | 0.00085842 | ||||
Execute Proposal | 19661546 | 151 days ago | IN | 0 ETH | 0.00481333 | ||||
Execute Proposal | 19661544 | 151 days ago | IN | 0 ETH | 0.00499101 | ||||
Execute Proposal | 19661542 | 151 days ago | IN | 0 ETH | 0.00495704 | ||||
Execute Proposal | 19661540 | 151 days ago | IN | 0 ETH | 0.00302525 | ||||
Execute Proposal | 19661537 | 151 days ago | IN | 0 ETH | 0.00242051 | ||||
Execute Proposal | 19626063 | 156 days ago | IN | 0 ETH | 0.00341069 | ||||
Execute Proposal | 19561887 | 165 days ago | IN | 0 ETH | 0.00618518 | ||||
Execute Proposal | 19561885 | 165 days ago | IN | 0 ETH | 0.00602993 | ||||
Execute Proposal | 19561883 | 165 days ago | IN | 0 ETH | 0.0065786 | ||||
Execute Proposal | 19561880 | 165 days ago | IN | 0 ETH | 0.00611065 | ||||
Execute Proposal | 19428870 | 184 days ago | IN | 0 ETH | 0.01740856 | ||||
Execute Proposal | 19419528 | 185 days ago | IN | 0 ETH | 0.01937498 | ||||
Execute Proposal | 19419525 | 185 days ago | IN | 0 ETH | 0.01002645 | ||||
Execute Proposal | 19419515 | 185 days ago | IN | 0 ETH | 0.00977168 | ||||
Execute Proposal | 18081506 | 373 days ago | IN | 0 ETH | 0.00149242 | ||||
Execute Proposal | 18012925 | 382 days ago | IN | 0 ETH | 0.00224122 | ||||
Multicall | 17668884 | 431 days ago | IN | 0 ETH | 0.024212 | ||||
Execute Proposal | 17322239 | 479 days ago | IN | 0 ETH | 0.00420169 | ||||
Execute Proposal | 16794150 | 554 days ago | IN | 0 ETH | 0.00341478 | ||||
Reset Member | 16697425 | 568 days ago | IN | 0 ETH | 0.00081094 | ||||
Reset Member | 16697423 | 568 days ago | IN | 0 ETH | 0.00101778 | ||||
Reset Member | 16697421 | 568 days ago | IN | 0 ETH | 0.0010307 | ||||
0x60a06040 | 16697276 | 568 days ago | IN | 0 ETH | 0.07213288 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GovernorV2
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.16; import "../../common/implementation/Lockable.sol"; import "../../common/implementation/MultiCaller.sol"; import "../../common/implementation/MultiRole.sol"; import "../interfaces/FinderInterface.sol"; import "../interfaces/IdentifierWhitelistInterface.sol"; import "../interfaces/OracleGovernanceInterface.sol"; import "./Constants.sol"; import "./AdminIdentifierLib.sol"; import "@openzeppelin/contracts/utils/Address.sol"; /** * @title Takes proposals for certain governance actions and allows UMA token holders to vote on them. */ contract GovernorV2 is MultiRole, Lockable, MultiCaller { using Address for address; /**************************************** * GOVERNOR STATE * ****************************************/ // Permissioned governor rolls. enum Roles { Owner, // Can set the proposer. Proposer, // Address that can make proposals. EmergencyProposer // Address that can make emergency proposals. } // Structure to represent a transaction. struct Transaction { address to; // Target. uint256 value; // value, in eth, to be sent as the msg.value. bytes data; // payload data to be sent to the target. Would include encoded function call data usually. } // Structure to represent a governance proposal. struct Proposal { Transaction[] transactions; // Set of transactions to be sent, if the proposal is executed. uint256 requestTime; // Time at which the proposal was proposed. bytes ancillaryData; // Extra data appended to a proposal to enhance the voters information. } // Reference to UMA finder, used to find addresses of other UMA ecosystem contracts. FinderInterface public immutable finder; // Array of all proposals. Proposal[] public proposals; /**************************************** * EVENTS * ****************************************/ event NewProposal(uint256 indexed id, Transaction[] transactions); event ProposalExecuted(uint256 indexed id, uint256 transactionIndex); event EmergencyExecution(address indexed to, uint256 value, bytes data); /** * @notice Construct the Governor contract. * @param _finderAddress keeps track of all contracts within the system based on their interfaceName. * @param _startingId the initial proposal id that the contract will begin incrementing from. */ constructor(address _finderAddress, uint256 _startingId) { finder = FinderInterface(_finderAddress); _createExclusiveRole(uint256(Roles.Owner), uint256(Roles.Owner), msg.sender); _createExclusiveRole(uint256(Roles.Proposer), uint256(Roles.Owner), msg.sender); _createExclusiveRole(uint256(Roles.EmergencyProposer), uint256(Roles.Owner), msg.sender); // Ensure the startingId is not set unreasonably high to avoid it being set such that new proposals overwrite // other storage slots in the contract. uint256 maxStartingId = 10**18; require(_startingId <= maxStartingId, "Cannot set startingId larger than 10^18"); // Sets the initial length of the array to the startingId. Modifying length directly has been disallowed in solidity 0.6. assembly { sstore(proposals.slot, _startingId) } } /**************************************** * PROPOSAL ACTIONS * ****************************************/ /** * @notice Proposes a new governance action. Can only be called by the holder of the Proposer role. * @param transactions list of transactions that are being proposed. * @param ancillaryData arbitrary data appended to a price request to give the voters more info from the caller. */ function propose(Transaction[] memory transactions, bytes memory ancillaryData) external nonReentrant() onlyRoleHolder(uint256(Roles.Proposer)) { require(transactions.length > 0, "Empty transactions array"); uint256 id = proposals.length; uint256 time = getCurrentTime(); // Note: doing all of this array manipulation manually is necessary because directly setting an array of // structs in storage to an array of structs in memory is currently not implemented in solidity :/. // Add a zero-initialized element to the proposals array. proposals.push(); // Initialize the new proposal. Proposal storage proposal = proposals[id]; proposal.requestTime = time; proposal.ancillaryData = ancillaryData; // Initialize the transaction array. for (uint256 i = 0; i < transactions.length; i++) { require(transactions[i].to != address(0), "The `to` address cannot be 0x0"); // If the transaction has any data with it the recipient must be a contract, not an EOA. if (transactions[i].data.length > 0) { require(transactions[i].to.isContract(), "EOA can't accept tx with data"); } proposal.transactions.push(transactions[i]); } bytes32 identifier = AdminIdentifierLib._constructIdentifier(id); // Request a vote on this proposal in the DVM. _getOracle().requestGovernanceAction(identifier, time, ancillaryData); emit NewProposal(id, transactions); } /** * @notice Executes a proposed governance action that has been approved by voters. * @dev This can be called by any address. Caller is expected to send enough ETH to execute payable transactions. * @param id unique id for the executed proposal. * @param transactionIndex unique transaction index for the executed proposal. */ function executeProposal(uint256 id, uint256 transactionIndex) external payable nonReentrant() { Proposal storage proposal = proposals[id]; int256 price = _getOracle().getPrice( AdminIdentifierLib._constructIdentifier(id), proposal.requestTime, proposal.ancillaryData ); Transaction memory transaction = proposal.transactions[transactionIndex]; require( transactionIndex == 0 || proposal.transactions[transactionIndex - 1].to == address(0), "Previous tx not yet executed" ); require(transaction.to != address(0), "Tx already executed"); require(price != 0, "Proposal was rejected"); require(msg.value == transaction.value, "Must send exact amount of ETH"); // Delete the transaction before execution to avoid any potential re-entrancy issues. delete proposal.transactions[transactionIndex]; require(_executeCall(transaction.to, transaction.value, transaction.data), "Tx execution failed"); emit ProposalExecuted(id, transactionIndex); } /** * @notice Emergency execution method that bypasses the voting system to execute a transaction. * @dev This can only be called by the EmergencyProposer. * @param transaction a single transaction to execute. */ function emergencyExecute(Transaction memory transaction) external payable nonReentrant() onlyRoleHolder(uint256(Roles.EmergencyProposer)) { require(_executeCall(transaction.to, transaction.value, transaction.data), "Tx execution failed"); emit EmergencyExecution(transaction.to, transaction.value, transaction.data); } /** * @notice Returns the current block timestamp. * @dev Can be overridden to control contract time. * @return the current block timestamp. */ function getCurrentTime() public view virtual returns (uint256) { return block.timestamp; } /**************************************** * GOVERNOR STATE GETTERS * ****************************************/ /** * @notice Gets the total number of proposals (includes executed and non-executed). * @return uint256 representing the current number of proposals. */ function numProposals() external view returns (uint256) { return proposals.length; } /** * @notice Gets the proposal data for a particular id. * @dev after a proposal is executed, its data will be zeroed out, except for the request time and ancillary data. * @param id uniquely identify the identity of the proposal. * @return proposal struct containing transactions[] and requestTime. */ function getProposal(uint256 id) external view returns (Proposal memory) { return proposals[id]; } /**************************************** * PRIVATE GETTERS AND FUNCTIONS * ****************************************/ // Runs a function call on to, with value eth sent and data payload. function _executeCall( address to, uint256 value, bytes memory data ) private returns (bool) { // Mostly copied from: // solhint-disable-next-line max-line-length // https://github.com/gnosis/safe-contracts/blob/59cfdaebcd8b87a0a32f87b50fead092c10d3a05/contracts/base/Executor.sol#L23-L31 // solhint-disable-next-line no-inline-assembly bool success; assembly { let inputData := add(data, 0x20) let inputDataSize := mload(data) success := call(gas(), to, value, inputData, inputDataSize, 0, 0) } return success; } // Returns the Voting contract address, named "Oracle" in the finder. function _getOracle() private view returns (OracleGovernanceInterface) { return OracleGovernanceInterface(finder.getImplementationAddress(OracleInterfaces.Oracle)); } // Returns the IdentifierWhitelist contract address, named "IdentifierWhitelist" in the finder. function _getIdentifierWhitelist() private view returns (IdentifierWhitelistInterface) { return IdentifierWhitelistInterface(finder.getImplementationAddress(OracleInterfaces.IdentifierWhitelist)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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: AGPL-3.0-only pragma solidity ^0.8.0; /** * @title A contract that provides modifiers to prevent reentrancy to state-changing and view-only methods. This contract * is inspired by https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol * and https://github.com/balancer-labs/balancer-core/blob/master/contracts/BPool.sol. */ contract Lockable { bool private _notEntered; constructor() { // Storing an initial 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. _notEntered = true; } /** * @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 making it call a `private` * function that does the actual state modification. */ modifier nonReentrant() { _preEntranceCheck(); _preEntranceSet(); _; _postEntranceReset(); } /** * @dev Designed to prevent a view-only method from being re-entered during a call to a `nonReentrant()` state-changing method. */ modifier nonReentrantView() { _preEntranceCheck(); _; } // Internal methods are used to avoid copying the require statement's bytecode to every `nonReentrant()` method. // On entry into a function, `_preEntranceCheck()` should always be called to check if the function is being // re-entered. Then, if the function modifies state, it should call `_postEntranceSet()`, perform its logic, and // then call `_postEntranceReset()`. // View-only methods can simply call `_preEntranceCheck()` to make sure that it is not being re-entered. function _preEntranceCheck() internal view { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); } function _preEntranceSet() internal { // Any calls to nonReentrant after this point will fail _notEntered = false; } function _postEntranceReset() internal { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } // These functions are intended to be used by child contracts to temporarily disable and re-enable the guard. // Intended use: // _startReentrantGuardDisabled(); // ... // _endReentrantGuardDisabled(); // // IMPORTANT: these should NEVER be used in a method that isn't inside a nonReentrant block. Otherwise, it's // possible to permanently lock your contract. function _startReentrantGuardDisabled() internal { _notEntered = true; } function _endReentrantGuardDisabled() internal { _notEntered = false; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; // This contract is taken from Uniswap's multi call implementation (https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/base/Multicall.sol) // and was modified to be solidity 0.8 compatible. Additionally, the method was restricted to only work with msg.value // set to 0 to avoid any nasty attack vectors on function calls that use value sent with deposits. /// @title MultiCaller /// @notice Enables calling multiple methods in a single call to the contract contract MultiCaller { function multicall(bytes[] calldata data) external returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); if (!success) { // Next 5 lines from https://ethereum.stackexchange.com/a/83577 if (result.length < 68) revert(); assembly { result := add(result, 0x04) } revert(abi.decode(result, (string))); } results[i] = result; } } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; library Exclusive { struct RoleMembership { address member; } function isMember(RoleMembership storage roleMembership, address memberToCheck) internal view returns (bool) { return roleMembership.member == memberToCheck; } function resetMember(RoleMembership storage roleMembership, address newMember) internal { require(newMember != address(0x0), "Cannot set an exclusive role to 0x0"); roleMembership.member = newMember; } function getMember(RoleMembership storage roleMembership) internal view returns (address) { return roleMembership.member; } function init(RoleMembership storage roleMembership, address initialMember) internal { resetMember(roleMembership, initialMember); } } library Shared { struct RoleMembership { mapping(address => bool) members; } function isMember(RoleMembership storage roleMembership, address memberToCheck) internal view returns (bool) { return roleMembership.members[memberToCheck]; } function addMember(RoleMembership storage roleMembership, address memberToAdd) internal { require(memberToAdd != address(0x0), "Cannot add 0x0 to a shared role"); roleMembership.members[memberToAdd] = true; } function removeMember(RoleMembership storage roleMembership, address memberToRemove) internal { roleMembership.members[memberToRemove] = false; } function init(RoleMembership storage roleMembership, address[] memory initialMembers) internal { for (uint256 i = 0; i < initialMembers.length; i++) { addMember(roleMembership, initialMembers[i]); } } } /** * @title Base class to manage permissions for the derived class. */ abstract contract MultiRole { using Exclusive for Exclusive.RoleMembership; using Shared for Shared.RoleMembership; enum RoleType { Invalid, Exclusive, Shared } struct Role { uint256 managingRole; RoleType roleType; Exclusive.RoleMembership exclusiveRoleMembership; Shared.RoleMembership sharedRoleMembership; } mapping(uint256 => Role) private roles; event ResetExclusiveMember(uint256 indexed roleId, address indexed newMember, address indexed manager); event AddedSharedMember(uint256 indexed roleId, address indexed newMember, address indexed manager); event RemovedSharedMember(uint256 indexed roleId, address indexed oldMember, address indexed manager); /** * @notice Reverts unless the caller is a member of the specified roleId. */ modifier onlyRoleHolder(uint256 roleId) { require(holdsRole(roleId, msg.sender), "Sender does not hold required role"); _; } /** * @notice Reverts unless the caller is a member of the manager role for the specified roleId. */ modifier onlyRoleManager(uint256 roleId) { require(holdsRole(roles[roleId].managingRole, msg.sender), "Can only be called by a role manager"); _; } /** * @notice Reverts unless the roleId represents an initialized, exclusive roleId. */ modifier onlyExclusive(uint256 roleId) { require(roles[roleId].roleType == RoleType.Exclusive, "Must be called on an initialized Exclusive role"); _; } /** * @notice Reverts unless the roleId represents an initialized, shared roleId. */ modifier onlyShared(uint256 roleId) { require(roles[roleId].roleType == RoleType.Shared, "Must be called on an initialized Shared role"); _; } /** * @notice Whether `memberToCheck` is a member of roleId. * @dev Reverts if roleId does not correspond to an initialized role. * @param roleId the Role to check. * @param memberToCheck the address to check. * @return True if `memberToCheck` is a member of `roleId`. */ function holdsRole(uint256 roleId, address memberToCheck) public view returns (bool) { Role storage role = roles[roleId]; if (role.roleType == RoleType.Exclusive) { return role.exclusiveRoleMembership.isMember(memberToCheck); } else if (role.roleType == RoleType.Shared) { return role.sharedRoleMembership.isMember(memberToCheck); } revert("Invalid roleId"); } /** * @notice Changes the exclusive role holder of `roleId` to `newMember`. * @dev Reverts if the caller is not a member of the managing role for `roleId` or if `roleId` is not an * initialized, ExclusiveRole. * @param roleId the ExclusiveRole membership to modify. * @param newMember the new ExclusiveRole member. */ function resetMember(uint256 roleId, address newMember) public onlyExclusive(roleId) onlyRoleManager(roleId) { roles[roleId].exclusiveRoleMembership.resetMember(newMember); emit ResetExclusiveMember(roleId, newMember, msg.sender); } /** * @notice Gets the current holder of the exclusive role, `roleId`. * @dev Reverts if `roleId` does not represent an initialized, exclusive role. * @param roleId the ExclusiveRole membership to check. * @return the address of the current ExclusiveRole member. */ function getMember(uint256 roleId) public view onlyExclusive(roleId) returns (address) { return roles[roleId].exclusiveRoleMembership.getMember(); } /** * @notice Adds `newMember` to the shared role, `roleId`. * @dev Reverts if `roleId` does not represent an initialized, SharedRole or if the caller is not a member of the * managing role for `roleId`. * @param roleId the SharedRole membership to modify. * @param newMember the new SharedRole member. */ function addMember(uint256 roleId, address newMember) public onlyShared(roleId) onlyRoleManager(roleId) { roles[roleId].sharedRoleMembership.addMember(newMember); emit AddedSharedMember(roleId, newMember, msg.sender); } /** * @notice Removes `memberToRemove` from the shared role, `roleId`. * @dev Reverts if `roleId` does not represent an initialized, SharedRole or if the caller is not a member of the * managing role for `roleId`. * @param roleId the SharedRole membership to modify. * @param memberToRemove the current SharedRole member to remove. */ function removeMember(uint256 roleId, address memberToRemove) public onlyShared(roleId) onlyRoleManager(roleId) { roles[roleId].sharedRoleMembership.removeMember(memberToRemove); emit RemovedSharedMember(roleId, memberToRemove, msg.sender); } /** * @notice Removes caller from the role, `roleId`. * @dev Reverts if the caller is not a member of the role for `roleId` or if `roleId` is not an * initialized, SharedRole. * @param roleId the SharedRole membership to modify. */ function renounceMembership(uint256 roleId) public onlyShared(roleId) onlyRoleHolder(roleId) { roles[roleId].sharedRoleMembership.removeMember(msg.sender); emit RemovedSharedMember(roleId, msg.sender, msg.sender); } /** * @notice Reverts if `roleId` is not initialized. */ modifier onlyValidRole(uint256 roleId) { require(roles[roleId].roleType != RoleType.Invalid, "Attempted to use an invalid roleId"); _; } /** * @notice Reverts if `roleId` is initialized. */ modifier onlyInvalidRole(uint256 roleId) { require(roles[roleId].roleType == RoleType.Invalid, "Cannot use a pre-existing role"); _; } /** * @notice Internal method to initialize a shared role, `roleId`, which will be managed by `managingRoleId`. * `initialMembers` will be immediately added to the role. * @dev Should be called by derived contracts, usually at construction time. Will revert if the role is already * initialized. */ function _createSharedRole( uint256 roleId, uint256 managingRoleId, address[] memory initialMembers ) internal onlyInvalidRole(roleId) { Role storage role = roles[roleId]; role.roleType = RoleType.Shared; role.managingRole = managingRoleId; role.sharedRoleMembership.init(initialMembers); require( roles[managingRoleId].roleType != RoleType.Invalid, "Attempted to use an invalid role to manage a shared role" ); } /** * @notice Internal method to initialize an exclusive role, `roleId`, which will be managed by `managingRoleId`. * `initialMember` will be immediately added to the role. * @dev Should be called by derived contracts, usually at construction time. Will revert if the role is already * initialized. */ function _createExclusiveRole( uint256 roleId, uint256 managingRoleId, address initialMember ) internal onlyInvalidRole(roleId) { Role storage role = roles[roleId]; role.roleType = RoleType.Exclusive; role.managingRole = managingRoleId; role.exclusiveRoleMembership.init(initialMember); require( roles[managingRoleId].roleType != RoleType.Invalid, "Attempted to use an invalid role to manage an exclusive role" ); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.16; /** * @title Library to construct admin identifiers. */ library AdminIdentifierLib { // Returns a UTF-8 identifier representing a particular admin proposal. // The identifier is of the form "Admin n", where n is the proposal id provided. function _constructIdentifier(uint256 id) internal pure returns (bytes32) { bytes32 bytesId = _uintToUtf8(id); return _addPrefix(bytesId, "Admin ", 6); } // This method converts the integer `v` into a base-10, UTF-8 representation stored in a `bytes32` type. // If the input cannot be represented by 32 base-10 digits, it returns only the highest 32 digits. // This method is based off of this code: https://ethereum.stackexchange.com/a/6613/47801. function _uintToUtf8(uint256 v) internal pure returns (bytes32) { bytes32 ret; if (v == 0) { // Handle 0 case explicitly. ret = "0"; } else { // Constants. uint256 bitsPerByte = 8; uint256 base = 10; // Note: the output should be base-10. The below implementation will not work for bases > 10. uint256 utf8NumberOffset = 48; while (v > 0) { // Downshift the entire bytes32 to allow the new digit to be added at the "front" of the bytes32, which // translates to the beginning of the UTF-8 representation. ret = ret >> bitsPerByte; // Separate the last digit that remains in v by modding by the base of desired output representation. uint256 leastSignificantDigit = v % base; // Digits 0-9 are represented by 48-57 in UTF-8, so an offset must be added to create the character. bytes32 utf8Digit = bytes32(leastSignificantDigit + utf8NumberOffset); // The top byte of ret has already been cleared to make room for the new digit. // Upshift by 31 bytes to put it in position, and OR it with ret to leave the other characters untouched. ret |= utf8Digit << (31 * bitsPerByte); // Divide v by the base to remove the digit that was just added. v /= base; } } return ret; } // This method takes two UTF-8 strings represented as bytes32 and outputs one as a prefixed by the other. // `input` is the UTF-8 that should have the prefix prepended. // `prefix` is the UTF-8 that should be prepended onto input. // `prefixLength` is number of UTF-8 characters represented by `prefix`. // Notes: // 1. If the resulting UTF-8 is larger than 32 characters, then only the first 32 characters will be represented // by the bytes32 output. // 2. If `prefix` has more characters than `prefixLength`, the function will produce an invalid result. function _addPrefix( bytes32 input, bytes32 prefix, uint256 prefixLength ) internal pure returns (bytes32) { // Downshift `input` to open space at the "front" of the bytes32 bytes32 shiftedInput = input >> (prefixLength * 8); return shiftedInput | prefix; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; /** * @title Stores common interface names used throughout the DVM by registration in the Finder. */ library OracleInterfaces { bytes32 public constant Oracle = "Oracle"; bytes32 public constant IdentifierWhitelist = "IdentifierWhitelist"; bytes32 public constant Store = "Store"; bytes32 public constant FinancialContractsAdmin = "FinancialContractsAdmin"; bytes32 public constant Registry = "Registry"; bytes32 public constant CollateralWhitelist = "CollateralWhitelist"; bytes32 public constant OptimisticOracle = "OptimisticOracle"; bytes32 public constant OptimisticOracleV2 = "OptimisticOracleV2"; bytes32 public constant OptimisticOracleV3 = "OptimisticOracleV3"; bytes32 public constant Bridge = "Bridge"; bytes32 public constant GenericHandler = "GenericHandler"; bytes32 public constant SkinnyOptimisticOracle = "SkinnyOptimisticOracle"; bytes32 public constant ChildMessenger = "ChildMessenger"; bytes32 public constant OracleHub = "OracleHub"; bytes32 public constant OracleSpoke = "OracleSpoke"; } /** * @title Commonly re-used values for contracts associated with the OptimisticOracle. */ library OptimisticOracleConstraints { // Any price request submitted to the OptimisticOracle must contain ancillary data no larger than this value. // This value must be <= the Voting contract's `ancillaryBytesLimit` constant value otherwise it is possible // that a price can be requested to the OptimisticOracle successfully, but cannot be resolved by the DVM which // refuses to accept a price request made with ancillary data length over a certain size. uint256 public constant ancillaryBytesLimit = 8192; }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; /** * @title Provides addresses of the live contracts implementing certain interfaces. * @dev Examples are the Oracle or Store interfaces. */ interface FinderInterface { /** * @notice Updates the address of the contract that implements `interfaceName`. * @param interfaceName bytes32 encoding of the interface name that is either changed or registered. * @param implementationAddress address of the deployed contract that implements the interface. */ function changeImplementationAddress(bytes32 interfaceName, address implementationAddress) external; /** * @notice Gets the address of the contract that implements the given `interfaceName`. * @param interfaceName queried interface. * @return implementationAddress address of the deployed contract that implements the interface. */ function getImplementationAddress(bytes32 interfaceName) external view returns (address); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; /** * @title Interface for whitelists of supported identifiers that the oracle can provide prices for. */ interface IdentifierWhitelistInterface { /** * @notice Adds the provided identifier as a supported identifier. * @dev Price requests using this identifier will succeed after this call. * @param identifier bytes32 encoding of the string identifier. Eg: BTC/USD. */ function addSupportedIdentifier(bytes32 identifier) external; /** * @notice Removes the identifier from the whitelist. * @dev Price requests using this identifier will no longer succeed after this call. * @param identifier bytes32 encoding of the string identifier. Eg: BTC/USD. */ function removeSupportedIdentifier(bytes32 identifier) external; /** * @notice Checks whether an identifier is on the whitelist. * @param identifier bytes32 encoding of the string identifier. Eg: BTC/USD. * @return bool if the identifier is supported (or not). */ function isIdentifierSupported(bytes32 identifier) external view returns (bool); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; /** * @title Financial contract facing Oracle interface. * @dev Interface used by financial contracts to interact with the Oracle. Voters will use a different interface. */ abstract contract OracleAncillaryInterface { /** * @notice Enqueues a request (if a request isn't already present) for the given `identifier`, `time` pair. * @dev Time must be in the past and the identifier must be supported. * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested. * @param ancillaryData arbitrary data appended to a price request to give the voters more info from the caller. * @param time unix timestamp for the price request. */ function requestPrice( bytes32 identifier, uint256 time, bytes memory ancillaryData ) public virtual; /** * @notice Whether the price for `identifier` and `time` is available. * @dev Time must be in the past and the identifier must be supported. * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested. * @param time unix timestamp for the price request. * @param ancillaryData arbitrary data appended to a price request to give the voters more info from the caller. * @return bool if the DVM has resolved to a price for the given identifier and timestamp. */ function hasPrice( bytes32 identifier, uint256 time, bytes memory ancillaryData ) public view virtual returns (bool); /** * @notice Gets the price for `identifier` and `time` if it has already been requested and resolved. * @dev If the price is not available, the method reverts. * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested. * @param time unix timestamp for the price request. * @param ancillaryData arbitrary data appended to a price request to give the voters more info from the caller. * @return int256 representing the resolved price for the given identifier and timestamp. */ function getPrice( bytes32 identifier, uint256 time, bytes memory ancillaryData ) public view virtual returns (int256); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; import "./OracleInterface.sol"; import "./OracleAncillaryInterface.sol"; /** * @title Financial contract facing extending the Oracle interface with governance actions. * @dev Interface used by financial contracts to interact with the Oracle extending governance actions. Voters will use a different interface. */ abstract contract OracleGovernanceInterface is OracleInterface, OracleAncillaryInterface { /** * @notice Enqueues a request (if a request isn't already present) for the given `identifier`, `time` pair. * @dev Time must be in the past and the identifier must be supported. * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested. * @param ancillaryData arbitrary data appended to a price request to give the voters more info from the caller. * @param time unix timestamp for the price request. */ function requestGovernanceAction( bytes32 identifier, uint256 time, bytes memory ancillaryData ) external virtual; }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; /** * @title Financial contract facing Oracle interface. * @dev Interface used by financial contracts to interact with the Oracle. Voters will use a different interface. */ abstract contract OracleInterface { /** * @notice Enqueues a request (if a request isn't already present) for the given `identifier`, `time` pair. * @dev Time must be in the past and the identifier must be supported. * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested. * @param time unix timestamp for the price request. */ function requestPrice(bytes32 identifier, uint256 time) external virtual; /** * @notice Whether the price for `identifier` and `time` is available. * @dev Time must be in the past and the identifier must be supported. * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested. * @param time unix timestamp for the price request. * @return bool if the DVM has resolved to a price for the given identifier and timestamp. */ function hasPrice(bytes32 identifier, uint256 time) external view virtual returns (bool); /** * @notice Gets the price for `identifier` and `time` if it has already been requested and resolved. * @dev If the price is not available, the method reverts. * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested. * @param time unix timestamp for the price request. * @return int256 representing the resolved price for the given identifier and timestamp. */ function getPrice(bytes32 identifier, uint256 time) external view virtual returns (int256); }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_finderAddress","type":"address"},{"internalType":"uint256","name":"_startingId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"newMember","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"AddedSharedMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"EmergencyExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct GovernorV2.Transaction[]","name":"transactions","type":"tuple[]"}],"name":"NewProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transactionIndex","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldMember","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"RemovedSharedMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"newMember","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ResetExclusiveMember","type":"event"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"newMember","type":"address"}],"name":"addMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct GovernorV2.Transaction","name":"transaction","type":"tuple"}],"name":"emergencyExecute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"transactionIndex","type":"uint256"}],"name":"executeProposal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"finder","outputs":[{"internalType":"contract FinderInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"name":"getMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getProposal","outputs":[{"components":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct GovernorV2.Transaction[]","name":"transactions","type":"tuple[]"},{"internalType":"uint256","name":"requestTime","type":"uint256"},{"internalType":"bytes","name":"ancillaryData","type":"bytes"}],"internalType":"struct GovernorV2.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"memberToCheck","type":"address"}],"name":"holdsRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"numProposals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"requestTime","type":"uint256"},{"internalType":"bytes","name":"ancillaryData","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct GovernorV2.Transaction[]","name":"transactions","type":"tuple[]"},{"internalType":"bytes","name":"ancillaryData","type":"bytes"}],"name":"propose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"memberToRemove","type":"address"}],"name":"removeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"name":"renounceMembership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"newMember","type":"address"}],"name":"resetMember","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162002f6f38038062002f6f8339810160408190526200003491620002dd565b6001805460ff1916811790556001600160a01b0382166080526200005d60005b600033620000ef565b62000069600162000054565b62000075600262000054565b670de0b6b3a764000080821115620000e45760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420736574207374617274696e674964206c6172676572207468616044820152660dc406260bc62760cb1b60648201526084015b60405180910390fd5b50600255506200032f565b826000808281526020819052604090206001015460ff1660028111156200011a576200011a62000319565b14620001695760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74207573652061207072652d6578697374696e6720726f6c6500006044820152606401620000db565b60008481526020819052604090206001808201805460ff191682800217905550838155620001a760028201846200024c602090811b62001c8117901c565b60008481526020819052604081206001015460ff166002811115620001d057620001d062000319565b03620002455760405162461bcd60e51b815260206004820152603c60248201527f417474656d7074656420746f2075736520616e20696e76616c696420726f6c6560448201527f20746f206d616e61676520616e206578636c757369766520726f6c65000000006064820152608401620000db565b5050505050565b6200025882826200025c565b5050565b6001600160a01b038116620002c05760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f742073657420616e206578636c757369766520726f6c6520746f2060448201526203078360ec1b6064820152608401620000db565b81546001600160a01b0319166001600160a01b0391909116179055565b60008060408385031215620002f157600080fd5b82516001600160a01b03811681146200030957600080fd5b6020939093015192949293505050565b634e487b7160e01b600052602160045260246000fd5b608051612c1d620003526000396000818161029f0152611d4a0152612c1d6000f3fe6080604052600436106100e85760003560e01c8063a7d0967c1161008a578063b9a3c84c11610059578063b9a3c84c1461028d578063c7f758a8146102c1578063d4c408ac146102ee578063d97c05be1461030157600080fd5b8063a7d0967c146101db578063aaa14ca3146101fb578063ab3545e51461021b578063ac9650d81461026057600080fd5b8063400e3949116100c6578063400e3949146101565780636be7658b1461016b57806374d0a6761461018b5780637cdc1cb9146101ab57600080fd5b8063013cf08b146100ed5780631ab767121461012457806329cb924d14610139575b600080fd5b3480156100f957600080fd5b5061010d6101083660046120d1565b610321565b60405161011b929190612158565b60405180910390f35b610137610132366004612179565b6103dd565b005b34801561014557600080fd5b50425b60405190815260200161011b565b34801561016257600080fd5b50600254610148565b34801561017757600080fd5b506101376101863660046121bd565b610952565b34801561019757600080fd5b506101376101a63660046121bd565b610b37565b3480156101b757600080fd5b506101cb6101c63660046121bd565b610cf9565b604051901515815260200161011b565b3480156101e757600080fd5b506101376101f636600461238c565b610e07565b34801561020757600080fd5b506101376102163660046120d1565b6112b8565b34801561022757600080fd5b5061023b6102363660046120d1565b611479565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b34801561026c57600080fd5b5061028061027b366004612472565b611563565b60405161011b91906124e7565b34801561029957600080fd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cd57600080fd5b506102e16102dc3660046120d1565b6116d5565b60405161011b91906125ef565b6101376102fc366004612659565b6118e6565b34801561030d57600080fd5b5061013761031c3660046121bd565b611abf565b6002818154811061033157600080fd5b906000526020600020906003020160009150905080600101549080600201805461035a9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546103869061268e565b80156103d35780601f106103a8576101008083540402835291602001916103d3565b820191906000526020600020905b8154815290600101906020018083116103b657829003601f168201915b5050505050905082565b6103e5611c8b565b610412600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600060028381548110610427576104276126db565b906000526020600020906003020190506000610441611cf9565b73ffffffffffffffffffffffffffffffffffffffff1663719c6d5661046586611dcf565b8460010154856002016040518463ffffffff1660e01b815260040161048c9392919061270a565b602060405180830381865afa1580156104a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cd91906127c2565b905060008260000184815481106104e6576104e66126db565b90600052602060002090600302016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201805461056f9061268e565b80601f016020809104026020016040519081016040528092919081815260200182805461059b9061268e565b80156105e85780601f106105bd576101008083540402835291602001916105e8565b820191906000526020600020905b8154815290600101906020018083116105cb57829003601f168201915b50505050508152505090508360001480610644575060008361060b60018761280a565b8154811061061b5761061b6126db565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff16145b6106af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50726576696f7573207478206e6f74207965742065786563757465640000000060448201526064015b60405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff1661072d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820616c72656164792065786563757465640000000000000000000000000060448201526064016106a6565b81600003610797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f50726f706f73616c207761732072656a6563746564000000000000000000000060448201526064016106a6565b80602001513414610804576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d7573742073656e6420657861637420616d6f756e74206f662045544800000060448201526064016106a6565b826000018481548110610819576108196126db565b60009182526020822060039091020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055906108636002830182612083565b505061087c816000015182602001518360400151611e09565b6108e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820657865637574696f6e206661696c65640000000000000000000000000060448201526064016106a6565b847ff758fc91e01b00ea6b4a6138756f7f28e021f9bf21db6dbf8c36c88eb737257a8560405161091491815260200190565b60405180910390a250505061094e600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b5050565b81600260008281526020819052604090206001015460ff16600281111561097b5761097b61281d565b14610a08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390610a239033610cf9565b610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552600390910190925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af9190a450505050565b81600260008281526020819052604090206001015460ff166002811115610b6057610b6061281d565b14610bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390610c089033610cf9565b610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000848152602081905260409020610cae9060030184611e26565b604051339073ffffffffffffffffffffffffffffffffffffffff85169086907f63502af7324ff6db91ab38f8236a648727d9385ea6c782073dd4882d8a61a48f90600090a450505050565b600082815260208190526040812060018082015460ff166002811115610d2157610d2161281d565b03610d4f57600281015473ffffffffffffffffffffffffffffffffffffffff8481169116145b915050610e01565b6002600182015460ff166002811115610d6a57610d6a61281d565b03610d9f5773ffffffffffffffffffffffffffffffffffffffff8316600090815260038201602052604090205460ff16610d47565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420726f6c65496400000000000000000000000000000000000060448201526064016106a6565b92915050565b610e0f611c8b565b610e3c600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6001610e488133610cf9565b610ed4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000835111610f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f456d707479207472616e73616374696f6e73206172726179000000000000000060448201526064016106a6565b60028054600181018083556000838152919242929184908110610f6457610f646126db565b6000918252602090912060039091020160018101839055905060028101610f8b868261289b565b5060005b86518110156111c857600073ffffffffffffffffffffffffffffffffffffffff16878281518110610fc257610fc26126db565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff160361104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5468652060746f6020616464726573732063616e6e6f7420626520307830000060448201526064016106a6565b600087828151811061105f5761105f6126db565b602002602001015160400151511115611115576110af878281518110611087576110876126db565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff163b151590565b611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f454f412063616e2774206163636570742074782077697468206461746100000060448201526064016106a6565b8160000187828151811061112b5761112b6126db565b602090810291909101810151825460018082018555600094855293839020825160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781559181015192820192909255604082015160028201906111b2908261289b565b50505080806111c0906129b5565b915050610f8f565b5060006111d484611dcf565b90506111de611cf9565b73ffffffffffffffffffffffffffffffffffffffff16639b21758d8285896040518463ffffffff1660e01b815260040161121a939291906129ed565b600060405180830381600087803b15801561123457600080fd5b505af1158015611248573d6000803e3d6000fd5b50505050837f082d2a29e61e3d0508e5617570bed4c7c58ae73d4719b31052d8638812bc4c0c8860405161127c9190612a0c565b60405180910390a2505050505061094e600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b80600260008281526020819052604090206001015460ff1660028111156112e1576112e161281d565b1461136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b816113798133610cf9565b611405576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b600083815260208181526040808320338452600301909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513390819085907feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af90600090a4505050565b600081600160008281526020819052604090206001015460ff1660028111156114a4576114a461281d565b14611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f204578636c757369766520726f6c65000000000000000000000000000000000060648201526084016106a6565b60008381526020819052604090206002015473ffffffffffffffffffffffffffffffffffffffff165b91505b50919050565b60608167ffffffffffffffff81111561157e5761157e6121ed565b6040519080825280602002602001820160405280156115b157816020015b606081526020019060019003908161159c5790505b50905060005b828110156116ce57600080308686858181106115d5576115d56126db565b90506020028101906115e79190612a26565b6040516115f5929190612a92565b600060405180830381855af49150503d8060008114611630576040519150601f19603f3d011682016040523d82523d6000602084013e611635565b606091505b50915091508161169b5760448151101561164e57600080fd5b600481019050808060200190518101906116689190612aa2565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a69190612b10565b808484815181106116ae576116ae6126db565b6020026020010181905250505080806116c6906129b5565b9150506115b7565b5092915050565b6116f960405180606001604052806060815260200160008152602001606081525090565b6002828154811061170c5761170c6126db565b906000526020600020906003020160405180606001604052908160008201805480602002602001604051908101604052809291908181526020016000905b8282101561183b5760008481526020908190206040805160608101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff168352600181015493830193909352600283018054929392918401916117aa9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546117d69061268e565b80156118235780601f106117f857610100808354040283529160200191611823565b820191906000526020600020905b81548152906001019060200180831161180657829003601f168201915b5050505050815250508152602001906001019061174a565b5050505081526020016001820154815260200160028201805461185d9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546118899061268e565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b5050505050815250509050919050565b6118ee611c8b565b61191b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60026119278133610cf9565b6119b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6119ca826000015183602001518460400151611e09565b611a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820657865637574696f6e206661696c65640000000000000000000000000060448201526064016106a6565b816000015173ffffffffffffffffffffffffffffffffffffffff167f30b23081131d845e535ea154259726b125804196aa1b2fcb38ac52e5fc34db3683602001518460400151604051611a84929190612158565b60405180910390a250611abc600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b50565b81600160008281526020819052604090206001015460ff166002811115611ae857611ae861281d565b14611b75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f204578636c757369766520726f6c65000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390611b909033610cf9565b611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000848152602081905260409020611c369060020184611ef3565b604051339073ffffffffffffffffffffffffffffffffffffffff85169086907f3b855c56b409b671c7112789d022675eb639d0bcb8896f1b6197c132f799e74690600090a450505050565b61094e8282611ef3565b60015460ff16611cf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a6565b565b6040517faafd5e400000000000000000000000000000000000000000000000000000000081527f4f7261636c65000000000000000000000000000000000000000000000000000060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063aafd5e4090602401602060405180830381865afa158015611da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dca9190612b23565b905090565b600080611ddb83611fd8565b905061155a817f41646d696e2000000000000000000000000000000000000000000000000000006006612066565b6000806020830183516000808284898b5af1979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116611ea3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43616e6e6f74206164642030783020746f20612073686172656420726f6c650060448201526064016106a6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff8116611f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f43616e6e6f742073657420616e206578636c757369766520726f6c6520746f2060448201527f307830000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff91909116179055565b6000808260000361200a57507f3000000000000000000000000000000000000000000000000000000000000000610e01565b6008600a60305b851561205d5792821c9260006120278388612b6f565b905060006120358383612b83565b905061204285601f612b96565b81901b95909517946120548489612bd3565b97505050612011565b50505092915050565b600080612074836008612b96565b85901c84179150509392505050565b50805461208f9061268e565b6000825580601f1061209f575050565b601f016020900490600052602060002090810190611abc91905b808211156120cd57600081556001016120b9565b5090565b6000602082840312156120e357600080fd5b5035919050565b60005b838110156121055781810151838201526020016120ed565b50506000910152565b600081518084526121268160208601602086016120ea565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b828152604060208201526000612171604083018461210e565b949350505050565b6000806040838503121561218c57600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114611abc57600080fd5b600080604083850312156121d057600080fd5b8235915060208301356121e28161219b565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612263576122636121ed565b604052919050565b600067ffffffffffffffff821115612285576122856121ed565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126122c257600080fd5b81356122d56122d08261226b565b61221c565b8181528460208386010111156122ea57600080fd5b816020850160208301376000918101602001919091529392505050565b60006060828403121561231957600080fd5b6040516060810167ffffffffffffffff828210818311171561233d5761233d6121ed565b81604052829350843591506123518261219b565b81835260208501356020840152604085013591508082111561237257600080fd5b5061237f858286016122b1565b6040830152505092915050565b6000806040838503121561239f57600080fd5b823567ffffffffffffffff808211156123b757600080fd5b818501915085601f8301126123cb57600080fd5b81356020828211156123df576123df6121ed565b8160051b6123ee82820161221c565b928352848101820192828101908a85111561240857600080fd5b83870192505b84831015612444578235868111156124265760008081fd5b6124348c86838b0101612307565b835250918301919083019061240e565b975050508601359250508082111561245b57600080fd5b50612468858286016122b1565b9150509250929050565b6000806020838503121561248557600080fd5b823567ffffffffffffffff8082111561249d57600080fd5b818501915085601f8301126124b157600080fd5b8135818111156124c057600080fd5b8660208260051b85010111156124d557600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561255a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261254885835161210e565b9450928501929085019060010161250e565b5092979650505050505050565b6000815180845260208085019450848260051b860182860160005b858110156125e25783830389528151805173ffffffffffffffffffffffffffffffffffffffff16845285810151868501526040908101516060918501829052906125ce8186018361210e565b9a87019a9450505090840190600101612582565b5090979650505050505050565b60208152600082516060602084015261260b6080840182612567565b90506020840151604084015260408401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016060850152612650828261210e565b95945050505050565b60006020828403121561266b57600080fd5b813567ffffffffffffffff81111561268257600080fd5b61217184828501612307565b600181811c908216806126a257607f821691505b60208210810361155d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b838152600060208481840152606060408401526000845461272a8161268e565b806060870152608060018084166000811461274c5760018114612784576127b2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506127b2565b896000528660002060005b858110156127aa5781548b820186015290830190880161278f565b8a0184019650505b50939a9950505050505050505050565b6000602082840312156127d457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610e0157610e016127db565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601f82111561289657600081815260208120601f850160051c810160208610156128735750805b601f850160051c820191505b818110156128925782815560010161287f565b5050505b505050565b815167ffffffffffffffff8111156128b5576128b56121ed565b6128c9816128c3845461268e565b8461284c565b602080601f83116001811461291c57600084156128e65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612892565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156129695788860151825594840194600190910190840161294a565b50858210156129a557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129e6576129e66127db565b5060010190565b838152826020820152606060408201526000612650606083018461210e565b602081526000612a1f6020830184612567565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612a5b57600080fd5b83018035915067ffffffffffffffff821115612a7657600080fd5b602001915036819003821315612a8b57600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215612ab457600080fd5b815167ffffffffffffffff811115612acb57600080fd5b8201601f81018413612adc57600080fd5b8051612aea6122d08261226b565b818152856020838501011115612aff57600080fd5b6126508260208301602086016120ea565b602081526000612a1f602083018461210e565b600060208284031215612b3557600080fd5b8151612a1f8161219b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b7e57612b7e612b40565b500690565b80820180821115610e0157610e016127db565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bce57612bce6127db565b500290565b600082612be257612be2612b40565b50049056fea264697066735822122044f677d6a970b275314d4082c5537fe69d1d4d9488e9c2be5af178843b706db764736f6c6343000810003300000000000000000000000040f941e48a552bf496b154af6bf55725f18d77c300000000000000000000000000000000000000000000000000000000000000bf
Deployed Bytecode
0x6080604052600436106100e85760003560e01c8063a7d0967c1161008a578063b9a3c84c11610059578063b9a3c84c1461028d578063c7f758a8146102c1578063d4c408ac146102ee578063d97c05be1461030157600080fd5b8063a7d0967c146101db578063aaa14ca3146101fb578063ab3545e51461021b578063ac9650d81461026057600080fd5b8063400e3949116100c6578063400e3949146101565780636be7658b1461016b57806374d0a6761461018b5780637cdc1cb9146101ab57600080fd5b8063013cf08b146100ed5780631ab767121461012457806329cb924d14610139575b600080fd5b3480156100f957600080fd5b5061010d6101083660046120d1565b610321565b60405161011b929190612158565b60405180910390f35b610137610132366004612179565b6103dd565b005b34801561014557600080fd5b50425b60405190815260200161011b565b34801561016257600080fd5b50600254610148565b34801561017757600080fd5b506101376101863660046121bd565b610952565b34801561019757600080fd5b506101376101a63660046121bd565b610b37565b3480156101b757600080fd5b506101cb6101c63660046121bd565b610cf9565b604051901515815260200161011b565b3480156101e757600080fd5b506101376101f636600461238c565b610e07565b34801561020757600080fd5b506101376102163660046120d1565b6112b8565b34801561022757600080fd5b5061023b6102363660046120d1565b611479565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b34801561026c57600080fd5b5061028061027b366004612472565b611563565b60405161011b91906124e7565b34801561029957600080fd5b5061023b7f00000000000000000000000040f941e48a552bf496b154af6bf55725f18d77c381565b3480156102cd57600080fd5b506102e16102dc3660046120d1565b6116d5565b60405161011b91906125ef565b6101376102fc366004612659565b6118e6565b34801561030d57600080fd5b5061013761031c3660046121bd565b611abf565b6002818154811061033157600080fd5b906000526020600020906003020160009150905080600101549080600201805461035a9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546103869061268e565b80156103d35780601f106103a8576101008083540402835291602001916103d3565b820191906000526020600020905b8154815290600101906020018083116103b657829003601f168201915b5050505050905082565b6103e5611c8b565b610412600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600060028381548110610427576104276126db565b906000526020600020906003020190506000610441611cf9565b73ffffffffffffffffffffffffffffffffffffffff1663719c6d5661046586611dcf565b8460010154856002016040518463ffffffff1660e01b815260040161048c9392919061270a565b602060405180830381865afa1580156104a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cd91906127c2565b905060008260000184815481106104e6576104e66126db565b90600052602060002090600302016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201805461056f9061268e565b80601f016020809104026020016040519081016040528092919081815260200182805461059b9061268e565b80156105e85780601f106105bd576101008083540402835291602001916105e8565b820191906000526020600020905b8154815290600101906020018083116105cb57829003601f168201915b50505050508152505090508360001480610644575060008361060b60018761280a565b8154811061061b5761061b6126db565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff16145b6106af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50726576696f7573207478206e6f74207965742065786563757465640000000060448201526064015b60405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff1661072d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820616c72656164792065786563757465640000000000000000000000000060448201526064016106a6565b81600003610797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f50726f706f73616c207761732072656a6563746564000000000000000000000060448201526064016106a6565b80602001513414610804576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d7573742073656e6420657861637420616d6f756e74206f662045544800000060448201526064016106a6565b826000018481548110610819576108196126db565b60009182526020822060039091020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055906108636002830182612083565b505061087c816000015182602001518360400151611e09565b6108e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820657865637574696f6e206661696c65640000000000000000000000000060448201526064016106a6565b847ff758fc91e01b00ea6b4a6138756f7f28e021f9bf21db6dbf8c36c88eb737257a8560405161091491815260200190565b60405180910390a250505061094e600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b5050565b81600260008281526020819052604090206001015460ff16600281111561097b5761097b61281d565b14610a08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390610a239033610cf9565b610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552600390910190925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af9190a450505050565b81600260008281526020819052604090206001015460ff166002811115610b6057610b6061281d565b14610bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390610c089033610cf9565b610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000848152602081905260409020610cae9060030184611e26565b604051339073ffffffffffffffffffffffffffffffffffffffff85169086907f63502af7324ff6db91ab38f8236a648727d9385ea6c782073dd4882d8a61a48f90600090a450505050565b600082815260208190526040812060018082015460ff166002811115610d2157610d2161281d565b03610d4f57600281015473ffffffffffffffffffffffffffffffffffffffff8481169116145b915050610e01565b6002600182015460ff166002811115610d6a57610d6a61281d565b03610d9f5773ffffffffffffffffffffffffffffffffffffffff8316600090815260038201602052604090205460ff16610d47565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420726f6c65496400000000000000000000000000000000000060448201526064016106a6565b92915050565b610e0f611c8b565b610e3c600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6001610e488133610cf9565b610ed4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000835111610f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f456d707479207472616e73616374696f6e73206172726179000000000000000060448201526064016106a6565b60028054600181018083556000838152919242929184908110610f6457610f646126db565b6000918252602090912060039091020160018101839055905060028101610f8b868261289b565b5060005b86518110156111c857600073ffffffffffffffffffffffffffffffffffffffff16878281518110610fc257610fc26126db565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff160361104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5468652060746f6020616464726573732063616e6e6f7420626520307830000060448201526064016106a6565b600087828151811061105f5761105f6126db565b602002602001015160400151511115611115576110af878281518110611087576110876126db565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff163b151590565b611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f454f412063616e2774206163636570742074782077697468206461746100000060448201526064016106a6565b8160000187828151811061112b5761112b6126db565b602090810291909101810151825460018082018555600094855293839020825160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781559181015192820192909255604082015160028201906111b2908261289b565b50505080806111c0906129b5565b915050610f8f565b5060006111d484611dcf565b90506111de611cf9565b73ffffffffffffffffffffffffffffffffffffffff16639b21758d8285896040518463ffffffff1660e01b815260040161121a939291906129ed565b600060405180830381600087803b15801561123457600080fd5b505af1158015611248573d6000803e3d6000fd5b50505050837f082d2a29e61e3d0508e5617570bed4c7c58ae73d4719b31052d8638812bc4c0c8860405161127c9190612a0c565b60405180910390a2505050505061094e600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b80600260008281526020819052604090206001015460ff1660028111156112e1576112e161281d565b1461136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b816113798133610cf9565b611405576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b600083815260208181526040808320338452600301909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513390819085907feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af90600090a4505050565b600081600160008281526020819052604090206001015460ff1660028111156114a4576114a461281d565b14611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f204578636c757369766520726f6c65000000000000000000000000000000000060648201526084016106a6565b60008381526020819052604090206002015473ffffffffffffffffffffffffffffffffffffffff165b91505b50919050565b60608167ffffffffffffffff81111561157e5761157e6121ed565b6040519080825280602002602001820160405280156115b157816020015b606081526020019060019003908161159c5790505b50905060005b828110156116ce57600080308686858181106115d5576115d56126db565b90506020028101906115e79190612a26565b6040516115f5929190612a92565b600060405180830381855af49150503d8060008114611630576040519150601f19603f3d011682016040523d82523d6000602084013e611635565b606091505b50915091508161169b5760448151101561164e57600080fd5b600481019050808060200190518101906116689190612aa2565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a69190612b10565b808484815181106116ae576116ae6126db565b6020026020010181905250505080806116c6906129b5565b9150506115b7565b5092915050565b6116f960405180606001604052806060815260200160008152602001606081525090565b6002828154811061170c5761170c6126db565b906000526020600020906003020160405180606001604052908160008201805480602002602001604051908101604052809291908181526020016000905b8282101561183b5760008481526020908190206040805160608101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff168352600181015493830193909352600283018054929392918401916117aa9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546117d69061268e565b80156118235780601f106117f857610100808354040283529160200191611823565b820191906000526020600020905b81548152906001019060200180831161180657829003601f168201915b5050505050815250508152602001906001019061174a565b5050505081526020016001820154815260200160028201805461185d9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546118899061268e565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b5050505050815250509050919050565b6118ee611c8b565b61191b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60026119278133610cf9565b6119b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6119ca826000015183602001518460400151611e09565b611a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820657865637574696f6e206661696c65640000000000000000000000000060448201526064016106a6565b816000015173ffffffffffffffffffffffffffffffffffffffff167f30b23081131d845e535ea154259726b125804196aa1b2fcb38ac52e5fc34db3683602001518460400151604051611a84929190612158565b60405180910390a250611abc600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b50565b81600160008281526020819052604090206001015460ff166002811115611ae857611ae861281d565b14611b75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f204578636c757369766520726f6c65000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390611b909033610cf9565b611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000848152602081905260409020611c369060020184611ef3565b604051339073ffffffffffffffffffffffffffffffffffffffff85169086907f3b855c56b409b671c7112789d022675eb639d0bcb8896f1b6197c132f799e74690600090a450505050565b61094e8282611ef3565b60015460ff16611cf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a6565b565b6040517faafd5e400000000000000000000000000000000000000000000000000000000081527f4f7261636c65000000000000000000000000000000000000000000000000000060048201526000907f00000000000000000000000040f941e48a552bf496b154af6bf55725f18d77c373ffffffffffffffffffffffffffffffffffffffff169063aafd5e4090602401602060405180830381865afa158015611da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dca9190612b23565b905090565b600080611ddb83611fd8565b905061155a817f41646d696e2000000000000000000000000000000000000000000000000000006006612066565b6000806020830183516000808284898b5af1979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116611ea3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43616e6e6f74206164642030783020746f20612073686172656420726f6c650060448201526064016106a6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff8116611f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f43616e6e6f742073657420616e206578636c757369766520726f6c6520746f2060448201527f307830000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff91909116179055565b6000808260000361200a57507f3000000000000000000000000000000000000000000000000000000000000000610e01565b6008600a60305b851561205d5792821c9260006120278388612b6f565b905060006120358383612b83565b905061204285601f612b96565b81901b95909517946120548489612bd3565b97505050612011565b50505092915050565b600080612074836008612b96565b85901c84179150509392505050565b50805461208f9061268e565b6000825580601f1061209f575050565b601f016020900490600052602060002090810190611abc91905b808211156120cd57600081556001016120b9565b5090565b6000602082840312156120e357600080fd5b5035919050565b60005b838110156121055781810151838201526020016120ed565b50506000910152565b600081518084526121268160208601602086016120ea565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b828152604060208201526000612171604083018461210e565b949350505050565b6000806040838503121561218c57600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114611abc57600080fd5b600080604083850312156121d057600080fd5b8235915060208301356121e28161219b565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612263576122636121ed565b604052919050565b600067ffffffffffffffff821115612285576122856121ed565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126122c257600080fd5b81356122d56122d08261226b565b61221c565b8181528460208386010111156122ea57600080fd5b816020850160208301376000918101602001919091529392505050565b60006060828403121561231957600080fd5b6040516060810167ffffffffffffffff828210818311171561233d5761233d6121ed565b81604052829350843591506123518261219b565b81835260208501356020840152604085013591508082111561237257600080fd5b5061237f858286016122b1565b6040830152505092915050565b6000806040838503121561239f57600080fd5b823567ffffffffffffffff808211156123b757600080fd5b818501915085601f8301126123cb57600080fd5b81356020828211156123df576123df6121ed565b8160051b6123ee82820161221c565b928352848101820192828101908a85111561240857600080fd5b83870192505b84831015612444578235868111156124265760008081fd5b6124348c86838b0101612307565b835250918301919083019061240e565b975050508601359250508082111561245b57600080fd5b50612468858286016122b1565b9150509250929050565b6000806020838503121561248557600080fd5b823567ffffffffffffffff8082111561249d57600080fd5b818501915085601f8301126124b157600080fd5b8135818111156124c057600080fd5b8660208260051b85010111156124d557600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561255a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261254885835161210e565b9450928501929085019060010161250e565b5092979650505050505050565b6000815180845260208085019450848260051b860182860160005b858110156125e25783830389528151805173ffffffffffffffffffffffffffffffffffffffff16845285810151868501526040908101516060918501829052906125ce8186018361210e565b9a87019a9450505090840190600101612582565b5090979650505050505050565b60208152600082516060602084015261260b6080840182612567565b90506020840151604084015260408401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016060850152612650828261210e565b95945050505050565b60006020828403121561266b57600080fd5b813567ffffffffffffffff81111561268257600080fd5b61217184828501612307565b600181811c908216806126a257607f821691505b60208210810361155d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b838152600060208481840152606060408401526000845461272a8161268e565b806060870152608060018084166000811461274c5760018114612784576127b2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506127b2565b896000528660002060005b858110156127aa5781548b820186015290830190880161278f565b8a0184019650505b50939a9950505050505050505050565b6000602082840312156127d457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610e0157610e016127db565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601f82111561289657600081815260208120601f850160051c810160208610156128735750805b601f850160051c820191505b818110156128925782815560010161287f565b5050505b505050565b815167ffffffffffffffff8111156128b5576128b56121ed565b6128c9816128c3845461268e565b8461284c565b602080601f83116001811461291c57600084156128e65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612892565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156129695788860151825594840194600190910190840161294a565b50858210156129a557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129e6576129e66127db565b5060010190565b838152826020820152606060408201526000612650606083018461210e565b602081526000612a1f6020830184612567565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612a5b57600080fd5b83018035915067ffffffffffffffff821115612a7657600080fd5b602001915036819003821315612a8b57600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215612ab457600080fd5b815167ffffffffffffffff811115612acb57600080fd5b8201601f81018413612adc57600080fd5b8051612aea6122d08261226b565b818152856020838501011115612aff57600080fd5b6126508260208301602086016120ea565b602081526000612a1f602083018461210e565b600060208284031215612b3557600080fd5b8151612a1f8161219b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b7e57612b7e612b40565b500690565b80820180821115610e0157610e016127db565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bce57612bce6127db565b500290565b600082612be257612be2612b40565b50049056fea264697066735822122044f677d6a970b275314d4082c5537fe69d1d4d9488e9c2be5af178843b706db764736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000040f941e48a552bf496b154af6bf55725f18d77c300000000000000000000000000000000000000000000000000000000000000bf
-----Decoded View---------------
Arg [0] : _finderAddress (address): 0x40f941E48A552bF496B154Af6bf55725f18D77c3
Arg [1] : _startingId (uint256): 191
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000040f941e48a552bf496b154af6bf55725f18d77c3
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000bf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2.25 | 34,605,190.52 | $77,861,678.67 |
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.