Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
12 addresses found via
Latest 25 from a total of 2,508 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Queue | 18207641 | 2 days 21 hrs ago | IN | 0 ETH | 0.00165736 | ||||
Submit Vote | 18199661 | 4 days 1 min ago | IN | 0 ETH | 0.00088766 | ||||
Submit Vote | 18199296 | 4 days 1 hr ago | IN | 0 ETH | 0.00077513 | ||||
Submit Vote | 18199038 | 4 days 2 hrs ago | IN | 0 ETH | 0.00067538 | ||||
Submit Vote | 18198774 | 4 days 3 hrs ago | IN | 0 ETH | 0.00071241 | ||||
Submit Vote | 18197635 | 4 days 6 hrs ago | IN | 0 ETH | 0.00064207 | ||||
Submit Vote | 18197588 | 4 days 7 hrs ago | IN | 0 ETH | 0.00074727 | ||||
Submit Vote | 18197367 | 4 days 7 hrs ago | IN | 0 ETH | 0.00063994 | ||||
Submit Vote | 18197333 | 4 days 7 hrs ago | IN | 0 ETH | 0.00070505 | ||||
Submit Vote | 18197247 | 4 days 8 hrs ago | IN | 0 ETH | 0.00075503 | ||||
Submit Vote | 18196998 | 4 days 8 hrs ago | IN | 0 ETH | 0.00068485 | ||||
Submit Vote | 18196796 | 4 days 9 hrs ago | IN | 0 ETH | 0.00067783 | ||||
Submit Vote | 18196719 | 4 days 9 hrs ago | IN | 0 ETH | 0.00063493 | ||||
Submit Vote | 18196709 | 4 days 9 hrs ago | IN | 0 ETH | 0.0006848 | ||||
Submit Vote | 18195970 | 4 days 12 hrs ago | IN | 0 ETH | 0.00069428 | ||||
Submit Vote | 18194398 | 4 days 17 hrs ago | IN | 0 ETH | 0.00066978 | ||||
Submit Vote | 18193065 | 4 days 22 hrs ago | IN | 0 ETH | 0.00150913 | ||||
Submit Vote | 18191576 | 5 days 3 hrs ago | IN | 0 ETH | 0.00146608 | ||||
Submit Vote | 18191331 | 5 days 4 hrs ago | IN | 0 ETH | 0.00089466 | ||||
Submit Vote | 18190852 | 5 days 5 hrs ago | IN | 0 ETH | 0.00075907 | ||||
Submit Vote | 18190640 | 5 days 6 hrs ago | IN | 0 ETH | 0.00073039 | ||||
Submit Vote | 18189814 | 5 days 9 hrs ago | IN | 0 ETH | 0.00071383 | ||||
Submit Vote | 18189805 | 5 days 9 hrs ago | IN | 0 ETH | 0.00070109 | ||||
Submit Vote | 18189802 | 5 days 9 hrs ago | IN | 0 ETH | 0.00078315 | ||||
Submit Vote | 18189802 | 5 days 9 hrs ago | IN | 0 ETH | 0.00078315 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DydxGovernor
Compiler Version
v0.7.5+commit.eb77ed08
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0 // // Contracts by dYdX Foundation. Individual files are released under different licenses. // // https://dydx.community // https://github.com/dydxfoundation/governance-contracts pragma solidity 0.7.5; pragma abicoder v2; import { AccessControl } from '../dependencies/open-zeppelin/AccessControl.sol'; import { SafeMath } from '../dependencies/open-zeppelin/SafeMath.sol'; import { IDydxGovernor } from '../interfaces/IDydxGovernor.sol'; import { IExecutorWithTimelock } from '../interfaces/IExecutorWithTimelock.sol'; import { IGovernanceStrategy } from '../interfaces/IGovernanceStrategy.sol'; import { IProposalValidator } from '../interfaces/IProposalValidator.sol'; import { IVotingStrategy } from '../interfaces/IVotingStrategy.sol'; import { isContract, getChainId } from '../misc/Helpers.sol'; /** * @title dYdX governor contract. * @author dYdX * * @notice Main point of interaction for dYdX governance. Holds governance proposals. Delegates to * the governance strategy contract to determine how voting and proposing powers are counted. The * content of a proposal is a sequence of function calls. These function calls must be made * through authorized executor contracts. * * Functionality includes: * - Create a proposal * - Cancel a proposal * - Queue a proposal * - Execute a proposal * - Submit a vote to a proposal * * Proposal state transitions in success case: * * Pending => Active => Succeeded => Queued => Executed * * Proposal state transitions in failure cases: * * Pending => Active => Failed * Pending => Active => Succeeded => Queued => Expired * Pending => Canceled * Pending => Active => Canceled * Pending => Active => Succeeded => Canceled * Pending => Active => Succeeded => Queued => Canceled **/ contract DydxGovernor is AccessControl, IDydxGovernor { using SafeMath for uint256; // ============ Constants ============ bytes32 public constant OWNER_ROLE = keccak256('OWNER_ROLE'); bytes32 public constant ADD_EXECUTOR_ROLE = keccak256('ADD_EXECUTOR_ROLE'); // ============ Storage ============ address private _governanceStrategy; uint256 private _votingDelay; uint256 private _proposalsCount; mapping(uint256 => Proposal) private _proposals; mapping(address => bool) private _authorizedExecutors; bytes32 public constant DOMAIN_TYPEHASH = keccak256( 'EIP712Domain(string name,uint256 chainId,address verifyingContract)' ); bytes32 public constant VOTE_EMITTED_TYPEHASH = keccak256( 'VoteEmitted(uint256 id,bool support)' ); string public constant EIP712_DOMAIN_NAME = 'dYdX Governance'; constructor( address governanceStrategy, uint256 votingDelay, address addExecutorAdmin ) { _setGovernanceStrategy(governanceStrategy); _setVotingDelay(votingDelay); // Assign roles. _setupRole(OWNER_ROLE, msg.sender); _setupRole(ADD_EXECUTOR_ROLE, addExecutorAdmin); // Set OWNER_ROLE as the admin for all roles. _setRoleAdmin(OWNER_ROLE, OWNER_ROLE); _setRoleAdmin(ADD_EXECUTOR_ROLE, OWNER_ROLE); } struct CreateVars { uint256 startBlock; uint256 endBlock; uint256 previousProposalsCount; } /** * @notice Creates a Proposal (needs to be validated by the Proposal Validator) * @param executor The ExecutorWithTimelock contract that will execute the proposal * @param targets list of contracts called by proposal's associated transactions * @param values list of value in wei for each propoposal's associated transaction * @param signatures list of function signatures (can be empty) to be used when created the callData * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments * @param withDelegatecalls boolean, true = transaction delegatecalls the taget, else calls the target * @param ipfsHash IPFS hash of the proposal **/ function create( IExecutorWithTimelock executor, address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas, bool[] memory withDelegatecalls, bytes32 ipfsHash ) external override returns (uint256) { require(targets.length != 0, 'INVALID_EMPTY_TARGETS'); require( targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length && targets.length == withDelegatecalls.length, 'INCONSISTENT_PARAMS_LENGTH' ); require(isExecutorAuthorized(address(executor)), 'EXECUTOR_NOT_AUTHORIZED'); require( IProposalValidator(address(executor)).validateCreatorOfProposal( this, msg.sender, block.number - 1 ), 'PROPOSITION_CREATION_INVALID' ); CreateVars memory vars; vars.startBlock = block.number.add(_votingDelay); vars.endBlock = vars.startBlock.add(IProposalValidator(address(executor)).VOTING_DURATION()); vars.previousProposalsCount = _proposalsCount; Proposal storage newProposal = _proposals[vars.previousProposalsCount]; newProposal.id = vars.previousProposalsCount; newProposal.creator = msg.sender; newProposal.executor = executor; newProposal.targets = targets; newProposal.values = values; newProposal.signatures = signatures; newProposal.calldatas = calldatas; newProposal.withDelegatecalls = withDelegatecalls; newProposal.startBlock = vars.startBlock; newProposal.endBlock = vars.endBlock; newProposal.strategy = _governanceStrategy; newProposal.ipfsHash = ipfsHash; _proposalsCount = vars.previousProposalsCount + 1; emit ProposalCreated( vars.previousProposalsCount, msg.sender, executor, targets, values, signatures, calldatas, withDelegatecalls, vars.startBlock, vars.endBlock, _governanceStrategy, ipfsHash ); return newProposal.id; } /** * @dev Cancels a Proposal. Callable by anyone if the conditions on the executor are fulfilled. * @param proposalId id of the proposal **/ function cancel(uint256 proposalId) external override { ProposalState state = getProposalState(proposalId); require( state != ProposalState.Canceled && state != ProposalState.Failed && state != ProposalState.Expired && state != ProposalState.Executed, 'ONLY_BEFORE_EXECUTED' ); Proposal storage proposal = _proposals[proposalId]; require( IProposalValidator(address(proposal.executor)).validateProposalCancellation( this, proposal.creator, block.number - 1 ), 'PROPOSITION_CANCELLATION_INVALID' ); proposal.canceled = true; for (uint256 i = 0; i < proposal.targets.length; i++) { proposal.executor.cancelTransaction( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.executionTime, proposal.withDelegatecalls[i] ); } emit ProposalCanceled(proposalId); } /** * @dev Queue the proposal. Requires that the proposal succeeded. * @param proposalId id of the proposal to queue **/ function queue(uint256 proposalId) external override { require(getProposalState(proposalId) == ProposalState.Succeeded, 'INVALID_STATE_FOR_QUEUE'); Proposal storage proposal = _proposals[proposalId]; uint256 executionTime = block.timestamp.add(proposal.executor.getDelay()); for (uint256 i = 0; i < proposal.targets.length; i++) { _queueOrRevert( proposal.executor, proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], executionTime, proposal.withDelegatecalls[i] ); } proposal.executionTime = executionTime; emit ProposalQueued(proposalId, executionTime, msg.sender); } /** * @dev Execute the proposal. Requires that the proposal is queued. * @param proposalId id of the proposal to execute **/ function execute(uint256 proposalId) external payable override { require(getProposalState(proposalId) == ProposalState.Queued, 'ONLY_QUEUED_PROPOSALS'); Proposal storage proposal = _proposals[proposalId]; proposal.executed = true; for (uint256 i = 0; i < proposal.targets.length; i++) { proposal.executor.executeTransaction{value: proposal.values[i]}( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.executionTime, proposal.withDelegatecalls[i] ); } emit ProposalExecuted(proposalId, msg.sender); } /** * @dev Function allowing msg.sender to vote for/against a proposal * @param proposalId id of the proposal * @param support boolean, true = vote for, false = vote against **/ function submitVote(uint256 proposalId, bool support) external override { return _submitVote(msg.sender, proposalId, support); } /** * @dev Function to register the vote of user that has voted offchain via signature * @param proposalId id of the proposal * @param support boolean, true = vote for, false = vote against * @param v v part of the voter signature * @param r r part of the voter signature * @param s s part of the voter signature **/ function submitVoteBySignature( uint256 proposalId, bool support, uint8 v, bytes32 r, bytes32 s ) external override { bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(EIP712_DOMAIN_NAME)), getChainId(), address(this) ) ), keccak256(abi.encode(VOTE_EMITTED_TYPEHASH, proposalId, support)) ) ); address signer = ecrecover(digest, v, r, s); require(signer != address(0), 'INVALID_SIGNATURE'); return _submitVote(signer, proposalId, support); } /** * @dev Set new GovernanceStrategy * Note: owner should be a timelocked executor, so needs to make a proposal * @param governanceStrategy new Address of the GovernanceStrategy contract **/ function setGovernanceStrategy(address governanceStrategy) external override onlyRole(OWNER_ROLE) { _setGovernanceStrategy(governanceStrategy); } /** * @dev Set new Voting Delay (delay before a newly created proposal can be voted on) * Note: owner should be a timelocked executor, so needs to make a proposal * @param votingDelay new voting delay in terms of blocks **/ function setVotingDelay(uint256 votingDelay) external override onlyRole(OWNER_ROLE) { _setVotingDelay(votingDelay); } /** * @dev Add new addresses to the list of authorized executors * @param executors list of new addresses to be authorized executors **/ function authorizeExecutors(address[] memory executors) public override onlyRole(ADD_EXECUTOR_ROLE) { for (uint256 i = 0; i < executors.length; i++) { _authorizeExecutor(executors[i]); } } /** * @dev Remove addresses to the list of authorized executors * @param executors list of addresses to be removed as authorized executors **/ function unauthorizeExecutors(address[] memory executors) public override onlyRole(OWNER_ROLE) { for (uint256 i = 0; i < executors.length; i++) { _unauthorizeExecutor(executors[i]); } } /** * @dev Getter of the current GovernanceStrategy address * @return The address of the current GovernanceStrategy contracts **/ function getGovernanceStrategy() external view override returns (address) { return _governanceStrategy; } /** * @dev Getter of the current Voting Delay (delay before a created proposal can be voted on) * Different from the voting duration * @return The voting delay in number of blocks **/ function getVotingDelay() external view override returns (uint256) { return _votingDelay; } /** * @dev Returns whether an address is an authorized executor * @param executor address to evaluate as authorized executor * @return true if authorized **/ function isExecutorAuthorized(address executor) public view override returns (bool) { return _authorizedExecutors[executor]; } /** * @dev Getter of the proposal count (the current number of proposals ever created) * @return the proposal count **/ function getProposalsCount() external view override returns (uint256) { return _proposalsCount; } /** * @dev Getter of a proposal by id * @param proposalId id of the proposal to get * @return the proposal as ProposalWithoutVotes memory object **/ function getProposalById(uint256 proposalId) external view override returns (ProposalWithoutVotes memory) { Proposal storage proposal = _proposals[proposalId]; ProposalWithoutVotes memory proposalWithoutVotes = ProposalWithoutVotes({ id: proposal.id, creator: proposal.creator, executor: proposal.executor, targets: proposal.targets, values: proposal.values, signatures: proposal.signatures, calldatas: proposal.calldatas, withDelegatecalls: proposal.withDelegatecalls, startBlock: proposal.startBlock, endBlock: proposal.endBlock, executionTime: proposal.executionTime, forVotes: proposal.forVotes, againstVotes: proposal.againstVotes, executed: proposal.executed, canceled: proposal.canceled, strategy: proposal.strategy, ipfsHash: proposal.ipfsHash }); return proposalWithoutVotes; } /** * @notice Get information about a voter's vote on a proposal. * Note: Vote is a struct: ({bool support, uint248 votingPower}) * @param proposalId id of the proposal * @param voter address of the voter * @return The associated Vote object **/ function getVoteOnProposal(uint256 proposalId, address voter) external view override returns (Vote memory) { return _proposals[proposalId].votes[voter]; } /** * @notice Get the current state of a proposal. * @param proposalId id of the proposal * @return The current state of the proposal **/ function getProposalState(uint256 proposalId) public view override returns (ProposalState) { require(_proposalsCount > proposalId, 'INVALID_PROPOSAL_ID'); Proposal storage proposal = _proposals[proposalId]; if (proposal.canceled) { return ProposalState.Canceled; } else if (block.number <= proposal.startBlock) { return ProposalState.Pending; } else if (block.number <= proposal.endBlock) { return ProposalState.Active; } else if (!IProposalValidator(address(proposal.executor)).isProposalPassed(this, proposalId)) { return ProposalState.Failed; } else if (proposal.executionTime == 0) { return ProposalState.Succeeded; } else if (proposal.executed) { return ProposalState.Executed; } else if (proposal.executor.isProposalOverGracePeriod(this, proposalId)) { return ProposalState.Expired; } else { return ProposalState.Queued; } } function _queueOrRevert( IExecutorWithTimelock executor, address target, uint256 value, string memory signature, bytes memory callData, uint256 executionTime, bool withDelegatecall ) internal { require( !executor.isActionQueued( keccak256(abi.encode(target, value, signature, callData, executionTime, withDelegatecall)) ), 'DUPLICATED_ACTION' ); executor.queueTransaction(target, value, signature, callData, executionTime, withDelegatecall); } function _submitVote( address voter, uint256 proposalId, bool support ) internal { require(getProposalState(proposalId) == ProposalState.Active, 'VOTING_CLOSED'); Proposal storage proposal = _proposals[proposalId]; Vote storage vote = proposal.votes[voter]; require(vote.votingPower == 0, 'VOTE_ALREADY_SUBMITTED'); uint256 votingPower = IVotingStrategy(proposal.strategy).getVotingPowerAt( voter, proposal.startBlock ); if (support) { proposal.forVotes = proposal.forVotes.add(votingPower); } else { proposal.againstVotes = proposal.againstVotes.add(votingPower); } vote.support = support; vote.votingPower = uint248(votingPower); emit VoteEmitted(proposalId, voter, support, votingPower); } function _setGovernanceStrategy(address governanceStrategy) internal { _governanceStrategy = governanceStrategy; emit GovernanceStrategyChanged(governanceStrategy, msg.sender); } function _setVotingDelay(uint256 votingDelay) internal { _votingDelay = votingDelay; emit VotingDelayChanged(votingDelay, msg.sender); } function _authorizeExecutor(address executor) internal { _authorizedExecutors[executor] = true; emit ExecutorAuthorized(executor); } function _unauthorizeExecutor(address executor) internal { _authorizedExecutors[executor] = false; emit ExecutorUnauthorized(executor); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.5; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = '0123456789abcdef'; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return '0'; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return '0x00'; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = '0'; buffer[1] = 'x'; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, 'Strings: hex length insufficient'); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; import './IERC165.sol'; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.7.5; pragma abicoder v2; import { IExecutorWithTimelock } from './IExecutorWithTimelock.sol'; interface IDydxGovernor { enum ProposalState { Pending, Canceled, Active, Failed, Succeeded, Queued, Expired, Executed } struct Vote { bool support; uint248 votingPower; } struct Proposal { uint256 id; address creator; IExecutorWithTimelock executor; address[] targets; uint256[] values; string[] signatures; bytes[] calldatas; bool[] withDelegatecalls; uint256 startBlock; uint256 endBlock; uint256 executionTime; uint256 forVotes; uint256 againstVotes; bool executed; bool canceled; address strategy; bytes32 ipfsHash; mapping(address => Vote) votes; } struct ProposalWithoutVotes { uint256 id; address creator; IExecutorWithTimelock executor; address[] targets; uint256[] values; string[] signatures; bytes[] calldatas; bool[] withDelegatecalls; uint256 startBlock; uint256 endBlock; uint256 executionTime; uint256 forVotes; uint256 againstVotes; bool executed; bool canceled; address strategy; bytes32 ipfsHash; } /** * @dev emitted when a new proposal is created * @param id Id of the proposal * @param creator address of the creator * @param executor The ExecutorWithTimelock contract that will execute the proposal * @param targets list of contracts called by proposal's associated transactions * @param values list of value in wei for each propoposal's associated transaction * @param signatures list of function signatures (can be empty) to be used when created the callData * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments * @param withDelegatecalls boolean, true = transaction delegatecalls the taget, else calls the target * @param startBlock block number when vote starts * @param endBlock block number when vote ends * @param strategy address of the governanceStrategy contract * @param ipfsHash IPFS hash of the proposal **/ event ProposalCreated( uint256 id, address indexed creator, IExecutorWithTimelock indexed executor, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, bool[] withDelegatecalls, uint256 startBlock, uint256 endBlock, address strategy, bytes32 ipfsHash ); /** * @dev emitted when a proposal is canceled * @param id Id of the proposal **/ event ProposalCanceled(uint256 id); /** * @dev emitted when a proposal is queued * @param id Id of the proposal * @param executionTime time when proposal underlying transactions can be executed * @param initiatorQueueing address of the initiator of the queuing transaction **/ event ProposalQueued(uint256 id, uint256 executionTime, address indexed initiatorQueueing); /** * @dev emitted when a proposal is executed * @param id Id of the proposal * @param initiatorExecution address of the initiator of the execution transaction **/ event ProposalExecuted(uint256 id, address indexed initiatorExecution); /** * @dev emitted when a vote is registered * @param id Id of the proposal * @param voter address of the voter * @param support boolean, true = vote for, false = vote against * @param votingPower Power of the voter/vote **/ event VoteEmitted(uint256 id, address indexed voter, bool support, uint256 votingPower); event GovernanceStrategyChanged(address indexed newStrategy, address indexed initiatorChange); event VotingDelayChanged(uint256 newVotingDelay, address indexed initiatorChange); event ExecutorAuthorized(address executor); event ExecutorUnauthorized(address executor); /** * @dev Creates a Proposal (needs Proposition Power of creator > Threshold) * @param executor The ExecutorWithTimelock contract that will execute the proposal * @param targets list of contracts called by proposal's associated transactions * @param values list of value in wei for each propoposal's associated transaction * @param signatures list of function signatures (can be empty) to be used when created the callData * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments * @param withDelegatecalls if true, transaction delegatecalls the taget, else calls the target * @param ipfsHash IPFS hash of the proposal **/ function create( IExecutorWithTimelock executor, address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas, bool[] memory withDelegatecalls, bytes32 ipfsHash ) external returns (uint256); /** * @dev Cancels a Proposal, when proposal is Pending/Active and threshold no longer reached * @param proposalId id of the proposal **/ function cancel(uint256 proposalId) external; /** * @dev Queue the proposal (If Proposal Succeeded) * @param proposalId id of the proposal to queue **/ function queue(uint256 proposalId) external; /** * @dev Execute the proposal (If Proposal Queued) * @param proposalId id of the proposal to execute **/ function execute(uint256 proposalId) external payable; /** * @dev Function allowing msg.sender to vote for/against a proposal * @param proposalId id of the proposal * @param support boolean, true = vote for, false = vote against **/ function submitVote(uint256 proposalId, bool support) external; /** * @dev Function to register the vote of user that has voted offchain via signature * @param proposalId id of the proposal * @param support boolean, true = vote for, false = vote against * @param v v part of the voter signature * @param r r part of the voter signature * @param s s part of the voter signature **/ function submitVoteBySignature( uint256 proposalId, bool support, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Set new GovernanceStrategy * Note: owner should be a timelocked executor, so needs to make a proposal * @param governanceStrategy new Address of the GovernanceStrategy contract **/ function setGovernanceStrategy(address governanceStrategy) external; /** * @dev Set new Voting Delay (delay before a newly created proposal can be voted on) * Note: owner should be a timelocked executor, so needs to make a proposal * @param votingDelay new voting delay in seconds **/ function setVotingDelay(uint256 votingDelay) external; /** * @dev Add new addresses to the list of authorized executors * @param executors list of new addresses to be authorized executors **/ function authorizeExecutors(address[] memory executors) external; /** * @dev Remove addresses to the list of authorized executors * @param executors list of addresses to be removed as authorized executors **/ function unauthorizeExecutors(address[] memory executors) external; /** * @dev Getter of the current GovernanceStrategy address * @return The address of the current GovernanceStrategy contracts **/ function getGovernanceStrategy() external view returns (address); /** * @dev Getter of the current Voting Delay (delay before a created proposal can be voted on) * Different from the voting duration * @return The voting delay in seconds **/ function getVotingDelay() external view returns (uint256); /** * @dev Returns whether an address is an authorized executor * @param executor address to evaluate as authorized executor * @return true if authorized **/ function isExecutorAuthorized(address executor) external view returns (bool); /** * @dev Getter of the proposal count (the current number of proposals ever created) * @return the proposal count **/ function getProposalsCount() external view returns (uint256); /** * @dev Getter of a proposal by id * @param proposalId id of the proposal to get * @return the proposal as ProposalWithoutVotes memory object **/ function getProposalById(uint256 proposalId) external view returns (ProposalWithoutVotes memory); /** * @dev Getter of the Vote of a voter about a proposal * Note: Vote is a struct: ({bool support, uint248 votingPower}) * @param proposalId id of the proposal * @param voter address of the voter * @return The associated Vote memory object **/ function getVoteOnProposal(uint256 proposalId, address voter) external view returns (Vote memory); /** * @dev Get the current state of a proposal * @param proposalId id of the proposal * @return The current state if the proposal **/ function getProposalState(uint256 proposalId) external view returns (ProposalState); }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.7.5; pragma abicoder v2; import { IDydxGovernor } from './IDydxGovernor.sol'; interface IExecutorWithTimelock { /** * @dev emitted when a new pending admin is set * @param newPendingAdmin address of the new pending admin **/ event NewPendingAdmin(address newPendingAdmin); /** * @dev emitted when a new admin is set * @param newAdmin address of the new admin **/ event NewAdmin(address newAdmin); /** * @dev emitted when a new delay (between queueing and execution) is set * @param delay new delay **/ event NewDelay(uint256 delay); /** * @dev emitted when a new (trans)action is Queued. * @param actionHash hash of the action * @param target address of the targeted contract * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ event QueuedAction( bytes32 actionHash, address indexed target, uint256 value, string signature, bytes data, uint256 executionTime, bool withDelegatecall ); /** * @dev emitted when an action is Cancelled * @param actionHash hash of the action * @param target address of the targeted contract * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ event CancelledAction( bytes32 actionHash, address indexed target, uint256 value, string signature, bytes data, uint256 executionTime, bool withDelegatecall ); /** * @dev emitted when an action is Cancelled * @param actionHash hash of the action * @param target address of the targeted contract * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target * @param resultData the actual callData used on the target **/ event ExecutedAction( bytes32 actionHash, address indexed target, uint256 value, string signature, bytes data, uint256 executionTime, bool withDelegatecall, bytes resultData ); /** * @dev Getter of the current admin address (should be governance) * @return The address of the current admin **/ function getAdmin() external view returns (address); /** * @dev Getter of the current pending admin address * @return The address of the pending admin **/ function getPendingAdmin() external view returns (address); /** * @dev Getter of the delay between queuing and execution * @return The delay in seconds **/ function getDelay() external view returns (uint256); /** * @dev Returns whether an action (via actionHash) is queued * @param actionHash hash of the action to be checked * keccak256(abi.encode(target, value, signature, data, executionTime, withDelegatecall)) * @return true if underlying action of actionHash is queued **/ function isActionQueued(bytes32 actionHash) external view returns (bool); /** * @dev Checks whether a proposal is over its grace period * @param governance Governance contract * @param proposalId Id of the proposal against which to test * @return true of proposal is over grace period **/ function isProposalOverGracePeriod(IDydxGovernor governance, uint256 proposalId) external view returns (bool); /** * @dev Getter of grace period constant * @return grace period in seconds **/ function GRACE_PERIOD() external view returns (uint256); /** * @dev Getter of minimum delay constant * @return minimum delay in seconds **/ function MINIMUM_DELAY() external view returns (uint256); /** * @dev Getter of maximum delay constant * @return maximum delay in seconds **/ function MAXIMUM_DELAY() external view returns (uint256); /** * @dev Function, called by Governance, that queue a transaction, returns action hash * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ function queueTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) external returns (bytes32); /** * @dev Function, called by Governance, that executes a transaction, returns the callData executed * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ function executeTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) external payable returns (bytes memory); /** * @dev Function, called by Governance, that cancels a transaction, returns action hash * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ function cancelTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) external returns (bytes32); }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.7.5; pragma abicoder v2; interface IGovernanceStrategy { /** * @dev Returns the Proposition Power of a user at a specific block number. * @param user Address of the user. * @param blockNumber Blocknumber at which to fetch Proposition Power * @return Power number **/ function getPropositionPowerAt(address user, uint256 blockNumber) external view returns (uint256); /** * @dev Returns the total supply of Outstanding Proposition Tokens * @param blockNumber Blocknumber at which to evaluate * @return total supply at blockNumber **/ function getTotalPropositionSupplyAt(uint256 blockNumber) external view returns (uint256); /** * @dev Returns the total supply of Outstanding Voting Tokens * @param blockNumber Blocknumber at which to evaluate * @return total supply at blockNumber **/ function getTotalVotingSupplyAt(uint256 blockNumber) external view returns (uint256); /** * @dev Returns the Vote Power of a user at a specific block number. * @param user Address of the user. * @param blockNumber Blocknumber at which to fetch Vote Power * @return Vote number **/ function getVotingPowerAt(address user, uint256 blockNumber) external view returns (uint256); }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.7.5; pragma abicoder v2; import { IDydxGovernor } from './IDydxGovernor.sol'; interface IProposalValidator { /** * @dev Called to validate a proposal (e.g when creating new proposal in Governance) * @param governance Governance Contract * @param user Address of the proposal creator * @param blockNumber Block Number against which to make the test (e.g proposal creation block -1). * @return boolean, true if can be created **/ function validateCreatorOfProposal( IDydxGovernor governance, address user, uint256 blockNumber ) external view returns (bool); /** * @dev Called to validate the cancellation of a proposal * @param governance Governance Contract * @param user Address of the proposal creator * @param blockNumber Block Number against which to make the test (e.g proposal creation block -1). * @return boolean, true if can be cancelled **/ function validateProposalCancellation( IDydxGovernor governance, address user, uint256 blockNumber ) external view returns (bool); /** * @dev Returns whether a user has enough Proposition Power to make a proposal. * @param governance Governance Contract * @param user Address of the user to be challenged. * @param blockNumber Block Number against which to make the challenge. * @return true if user has enough power **/ function isPropositionPowerEnough( IDydxGovernor governance, address user, uint256 blockNumber ) external view returns (bool); /** * @dev Returns the minimum Proposition Power needed to create a proposition. * @param governance Governance Contract * @param blockNumber Blocknumber at which to evaluate * @return minimum Proposition Power needed **/ function getMinimumPropositionPowerNeeded(IDydxGovernor governance, uint256 blockNumber) external view returns (uint256); /** * @dev Returns whether a proposal passed or not * @param governance Governance Contract * @param proposalId Id of the proposal to set * @return true if proposal passed **/ function isProposalPassed(IDydxGovernor governance, uint256 proposalId) external view returns (bool); /** * @dev Check whether a proposal has reached quorum, ie has enough FOR-voting-power * Here quorum is not to understand as number of votes reached, but number of for-votes reached * @param governance Governance Contract * @param proposalId Id of the proposal to verify * @return voting power needed for a proposal to pass **/ function isQuorumValid(IDydxGovernor governance, uint256 proposalId) external view returns (bool); /** * @dev Check whether a proposal has enough extra FOR-votes than AGAINST-votes * FOR VOTES - AGAINST VOTES > VOTE_DIFFERENTIAL * voting supply * @param governance Governance Contract * @param proposalId Id of the proposal to verify * @return true if enough For-Votes **/ function isVoteDifferentialValid(IDydxGovernor governance, uint256 proposalId) external view returns (bool); /** * @dev Calculates the minimum amount of Voting Power needed for a proposal to Pass * @param votingSupply Total number of oustanding voting tokens * @return voting power needed for a proposal to pass **/ function getMinimumVotingPowerNeeded(uint256 votingSupply) external view returns (uint256); /** * @dev Get proposition threshold constant value * @return the proposition threshold value (100 <=> 1%) **/ function PROPOSITION_THRESHOLD() external view returns (uint256); /** * @dev Get voting duration constant value * @return the voting duration value in seconds **/ function VOTING_DURATION() external view returns (uint256); /** * @dev Get the vote differential threshold constant value * to compare with % of for votes/total supply - % of against votes/total supply * @return the vote differential threshold value (100 <=> 1%) **/ function VOTE_DIFFERENTIAL() external view returns (uint256); /** * @dev Get quorum threshold constant value * to compare with % of for votes/total supply * @return the quorum threshold value (100 <=> 1%) **/ function MINIMUM_QUORUM() external view returns (uint256); /** * @dev precision helper: 100% = 10000 * @return one hundred percents with our chosen precision **/ function ONE_HUNDRED_WITH_PRECISION() external view returns (uint256); }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.7.5; pragma abicoder v2; interface IVotingStrategy { function getVotingPowerAt(address user, uint256 blockNumber) external view returns (uint256); }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.7.5; pragma abicoder v2; function getChainId() pure returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } function isContract(address account) view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "istanbul", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"governanceStrategy","type":"address"},{"internalType":"uint256","name":"votingDelay","type":"uint256"},{"internalType":"address","name":"addExecutorAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"}],"name":"ExecutorAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"}],"name":"ExecutorUnauthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newStrategy","type":"address"},{"indexed":true,"internalType":"address","name":"initiatorChange","type":"address"}],"name":"GovernanceStrategyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"bytes32","name":"ipfsHash","type":"bytes32"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"initiatorExecution","type":"address"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionTime","type":"uint256"},{"indexed":true,"internalType":"address","name":"initiatorQueueing","type":"address"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"votingPower","type":"uint256"}],"name":"VoteEmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newVotingDelay","type":"uint256"},{"indexed":true,"internalType":"address","name":"initiatorChange","type":"address"}],"name":"VotingDelayChanged","type":"event"},{"inputs":[],"name":"ADD_EXECUTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_DOMAIN_NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_EMITTED_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"executors","type":"address[]"}],"name":"authorizeExecutors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"internalType":"bytes32","name":"ipfsHash","type":"bytes32"}],"name":"create","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getGovernanceStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalById","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"executionTime","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"address","name":"strategy","type":"address"},{"internalType":"bytes32","name":"ipfsHash","type":"bytes32"}],"internalType":"struct IDydxGovernor.ProposalWithoutVotes","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalState","outputs":[{"internalType":"enum IDydxGovernor.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProposalsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getVoteOnProposal","outputs":[{"components":[{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint248","name":"votingPower","type":"uint248"}],"internalType":"struct IDydxGovernor.Vote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVotingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"}],"name":"isExecutorAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governanceStrategy","type":"address"}],"name":"setGovernanceStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"votingDelay","type":"uint256"}],"name":"setVotingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"submitVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"submitVoteBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"executors","type":"address[]"}],"name":"unauthorizeExecutors","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003920380380620039208339810160408190526200003491620002a2565b6200003f83620000ce565b6200004a826200011b565b62000065600080516020620038e0833981519152336200015f565b6200008060008051602062003900833981519152826200015f565b6200009b600080516020620038e0833981519152806200016f565b620000c560008051602062003900833981519152600080516020620038e08339815191526200016f565b505050620002eb565b600180546001600160a01b0319166001600160a01b0383169081179091556040513391907f9e8e9f668db69a2cefb172dabe284d0d3aea2b7ee64212a205bd033bd03a3d5590600090a350565b600281905560405133907fc46fc23e244f0720a98ddbac6efb5bb40d212cf15e6478fc4b3017648715289d9062000154908490620002e2565b60405180910390a250565b6200016b8282620001bb565b5050565b806200017b8362000245565b60405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a460009182526020829052604090912060010155565b620001c782826200025d565b6200016b576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200020162000286565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000818152602081905260409020600101545b919050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3390565b80516001600160a01b03811681146200025857600080fd5b600080600060608486031215620002b7578283fd5b620002c2846200028a565b925060208401519150620002d9604085016200028a565b90509250925092565b90815260200190565b6135e580620002fb6000396000f3fe6080604052600436106101c25760003560e01c806364c786d9116100f7578063a2b170b011610095578063e58378bb11610064578063e58378bb146104f3578063f8741a9c14610508578063fd07029614610528578063fe0d94c11461054a576101c2565b8063a2b170b01461047e578063af1e0bd314610493578063d547741f146104b3578063ddf0b009146104d3576101c2565b806391d14854116100d157806391d148541461041457806398e527d3146104345780639aad6f6a14610449578063a217fddf14610469576101c2565b806364c786d9146103a757806370b0f660146103c75780639080936f146103e7576101c2565b806334b18c261161016457806340e58ee51161013e57806340e58ee51461031a5780634185ff831461033a578063548b514e14610367578063612c56fa14610387576101c2565b806334b18c26146102b857806336568abe146102cd5780633656de21146102ed576101c2565b80631a1caf7f116101a05780631a1caf7f1461024157806320606b7014610263578063248a9ca3146102785780632f2ff15d14610298576101c2565b806301ffc9a7146101c757806306be3e8e146101fd578063195677571461021f575b600080fd5b3480156101d357600080fd5b506101e76101e2366004612a94565b61055d565b6040516101f49190612f2e565b60405180910390f35b34801561020957600080fd5b5061021261058a565b6040516101f49190612e74565b34801561022b57600080fd5b50610234610599565b6040516101f49190612f39565b34801561024d57600080fd5b5061026161025c3660046129de565b6105bd565b005b34801561026f57600080fd5b50610234610612565b34801561028457600080fd5b50610234610293366004612a35565b610636565b3480156102a457600080fd5b506102616102b3366004612a65565b61064b565b3480156102c457600080fd5b5061023461066a565b3480156102d957600080fd5b506102616102e8366004612a65565b61068e565b3480156102f957600080fd5b5061030d610308366004612a35565b6106f3565b6040516101f4919061325e565b34801561032657600080fd5b50610261610335366004612a35565b610aa2565b34801561034657600080fd5b5061035a610355366004612c15565b610d82565b6040516101f491906133b8565b34801561037357600080fd5b506101e76103823660046129c2565b610ddb565b34801561039357600080fd5b506102616103a2366004612c27565b610df9565b3480156103b357600080fd5b506102616103c23660046129de565b610e04565b3480156103d357600080fd5b506102616103e2366004612a35565b610e61565b3480156103f357600080fd5b50610407610402366004612a35565b610e85565b6040516101f49190612fc0565b34801561042057600080fd5b506101e761042f366004612a65565b611055565b34801561044057600080fd5b5061023461107e565b34801561045557600080fd5b506102616104643660046129c2565b611084565b34801561047557600080fd5b506102346110a8565b34801561048a57600080fd5b506102346110ad565b34801561049f57600080fd5b506102616104ae366004612c4b565b6110b3565b3480156104bf57600080fd5b506102616104ce366004612a65565b611252565b3480156104df57600080fd5b506102616104ee366004612a35565b611271565b3480156104ff57600080fd5b5061023461156d565b34801561051457600080fd5b50610234610523366004612b2f565b61157f565b34801561053457600080fd5b5061053d611904565b6040516101f49190612fd4565b610261610558366004612a35565b61192f565b60006001600160e01b03198216637965db0b60e01b1480610582575061058282611b2e565b90505b919050565b6001546001600160a01b031690565b7f6d7de061afba91040b8f2fa055f62976f5be484e30e6b3eb7e3c831c2f411f0981565b6000805160206135618339815191526105dd816105d8611b47565b611b4b565b60005b825181101561060d576106058382815181106105f857fe5b6020026020010151611cea565b6001016105e0565b505050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60009081526020819052604090206001015490565b61065482610636565b610660816105d8611b47565b61060d8383611d45565b7f4e031542a9553ed1c4e810c54674ab4b984243e335b246aa3de73663bf4c11ee81565b610696611b47565b6001600160a01b0316816001600160a01b0316146106e55760405162461bcd60e51b815260040180806020018281038252602f815260200180613581602f913960400191505060405180910390fd5b6106ef8282611dca565b5050565b6106fb612407565b6000828152600460205260409020610711612407565b60408051610220810182528354815260018401546001600160a01b0390811660208084019190915260028601549091168284015260038501805484518184028101840190955280855292936060850193909283018282801561079c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161077e575b50505050508152602001836004018054806020026020016040519081016040528092919081815260200182805480156107f457602002820191906000526020600020905b8154815260200190600101908083116107e0575b5050505050815260200183600501805480602002602001604051908101604052809291908181526020016000905b828210156108cd5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156108b95780601f1061088e576101008083540402835291602001916108b9565b820191906000526020600020905b81548152906001019060200180831161089c57829003601f168201915b505050505081526020019060010190610822565b50505050815260200183600601805480602002602001604051908101604052809291908181526020016000905b828210156109a55760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156109915780601f1061096657610100808354040283529160200191610991565b820191906000526020600020905b81548152906001019060200180831161097457829003601f168201915b5050505050815260200190600101906108fa565b50505050815260200183600701805480602002602001604051908101604052809291908181526020018280548015610a1c57602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116109eb5790505b50505091835250506008840154602082015260098401546040820152600a8401546060820152600b8401546080820152600c84015460a0820152600d84015460ff808216151560c0840152610100808304909116151560e0840152620100009091046001600160a01b031690820152600e90930154610120909301929092525092915050565b6000610aad82610e85565b90506001816007811115610abd57fe5b14158015610ad757506003816007811115610ad457fe5b14155b8015610aef57506006816007811115610aec57fe5b14155b8015610b0757506007816007811115610b0457fe5b14155b610b2c5760405162461bcd60e51b8152600401610b23906131d4565b60405180910390fd5b6000828152600460208190526040918290206002810154600182015493516331a7bc4160e01b815291936001600160a01b03918216936331a7bc4193610b7c933093169160001943019101612f9c565b60206040518083038186803b158015610b9457600080fd5b505afa158015610ba8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcc9190612a19565b610be85760405162461bcd60e51b8152600401610b239061319f565b600d8101805461ff00191661010017905560005b6003820154811015610d455760028201546003830180546001600160a01b0390921691631dc40b51919084908110610c3057fe5b6000918252602090912001546004850180546001600160a01b039092169185908110610c5857fe5b9060005260206000200154856005018581548110610c7257fe5b90600052602060002001866006018681548110610c8b57fe5b9060005260206000200187600a0154886007018881548110610ca957fe5b90600052602060002090602091828204019190069054906101000a900460ff166040518763ffffffff1660e01b8152600401610cea96959493929190612ef5565b602060405180830381600087803b158015610d0457600080fd5b505af1158015610d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3c9190612a4d565b50600101610bfc565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c83604051610d759190612f39565b60405180910390a1505050565b610d8a6124ad565b5060008281526004602090815260408083206001600160a01b0385168452600f0182529182902082518084019093525460ff8116151583526001600160f81b03610100909104169082015292915050565b6001600160a01b031660009081526005602052604090205460ff1690565b6106ef338383611e4d565b7f6d7de061afba91040b8f2fa055f62976f5be484e30e6b3eb7e3c831c2f411f09610e31816105d8611b47565b60005b825181101561060d57610e59838281518110610e4c57fe5b6020026020010151612007565b600101610e34565b600080516020613561833981519152610e7c816105d8611b47565b6106ef8261205a565b60008160035411610ea85760405162461bcd60e51b8152600401610b2390613202565b6000828152600460205260409020600d810154610100900460ff1615610ed2576001915050610585565b80600801544311610ee7576000915050610585565b80600901544311610efc576002915050610585565b60028101546040516306fbb3ab60e01b81526001600160a01b03909116906306fbb3ab90610f309030908790600401612e88565b60206040518083038186803b158015610f4857600080fd5b505afa158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f809190612a19565b610f8e576003915050610585565b600a810154610fa1576004915050610585565b600d81015460ff1615610fb8576007915050610585565b600281015460405163f670a5f960e01b81526001600160a01b039091169063f670a5f990610fec9030908790600401612e88565b60206040518083038186803b15801561100457600080fd5b505afa158015611018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103c9190612a19565b1561104b576006915050610585565b6005915050610585565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60035490565b60008051602061356183398151915261109f816105d8611b47565b6106ef8261209c565b600081565b60025490565b60408051808201909152600f81526e6459645820476f7665726e616e636560881b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f1b8e614c98d105651e90303d9b487888b1e921d59b39d4602e3bcf7da4b7ef9d6111266120e9565b3060405160200161113a9493929190612f42565b604051602081830303815290604052805190602001207f4e031542a9553ed1c4e810c54674ab4b984243e335b246aa3de73663bf4c11ee878760405160200161118593929190612f66565b604051602081830303815290604052805190602001206040516020016111ac929190612e59565b6040516020818303038152906040528051906020012090506000600182868686604051600081526020016040526040516111e99493929190612f7e565b6020604051602081039080840390855afa15801561120b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661123e5760405162461bcd60e51b8152600401610b23906130d6565b611249818888611e4d565b50505050505050565b61125b82610636565b611267816105d8611b47565b61060d8383611dca565b600461127c82610e85565b600781111561128757fe5b146112a45760405162461bcd60e51b8152600401610b2390613045565b60008181526004602081815260408084206002810154825163675e4d4160e11b8152925191959461133b946001600160a01b039092169363cebc9a829381830193929091829003018186803b1580156112fc57600080fd5b505afa158015611310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113349190612a4d565b42906120ed565b905060005b600383015481101561152457600283015460038401805461151c926001600160a01b031691908490811061137057fe5b6000918252602090912001546004860180546001600160a01b03909216918590811061139857fe5b90600052602060002001548660050185815481106113b257fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156114405780601f1061141557610100808354040283529160200191611440565b820191906000526020600020905b81548152906001019060200180831161142357829003601f168201915b505050505087600601868154811061145457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156114e25780601f106114b7576101008083540402835291602001916114e2565b820191906000526020600020905b8154815290600101906020018083116114c557829003601f168201915b5050505050878960070188815481106114f757fe5b90600052602060002090602091828204019190069054906101000a900460ff1661214e565b600101611340565b50600a820181905560405133907f11a0b38e70585e4b09b794bd1d9f9b1a51a802eb8ee2101eeee178d0349e73fe90611560908690859061348f565b60405180910390a2505050565b60008051602061356183398151915281565b60008651600014156115a35760405162461bcd60e51b8152600401610b23906130a7565b855187511480156115b5575084518751145b80156115c2575083518751145b80156115cf575082518751145b6115eb5760405162461bcd60e51b8152600401610b2390613168565b6115f488610ddb565b6116105760405162461bcd60e51b8152600401610b2390613131565b604051631a1b205360e31b81526001600160a01b0389169063d0d90298906116449030903390600019430190600401612f9c565b60206040518083038186803b15801561165c57600080fd5b505afa158015611670573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116949190612a19565b6116b05760405162461bcd60e51b8152600401610b2390612fe7565b6116b86124c4565b6002546116c69043906120ed565b81600001818152505061174b896001600160a01b031663a438d2086040518163ffffffff1660e01b815260040160206040518083038186803b15801561170b57600080fd5b505afa15801561171f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117439190612a4d565b8251906120ed565b602082810191909152600380546040808501828152600092835260048552912090518155600181018054336001600160a01b0319918216179091556002820180549091166001600160a01b038e161790558a5190926117b092840191908c01906124e5565b5087516117c690600483019060208b019061254a565b5086516117dc90600583019060208a0190612585565b5085516117f290600683019060208901906125de565b5084516118089060078301906020880190612637565b508160000151816008018190555081602001518160090181905550600160009054906101000a90046001600160a01b031681600d0160026101000a8154816001600160a01b0302191690836001600160a01b031602179055508381600e01819055508160400151600101600381905550896001600160a01b0316336001600160a01b03167fd272d67d2c8c66de43c1d2515abb064978a5020c173e15903b6a2ab3bf7440ec84604001518c8c8c8c8c8a600001518b60200151600160009054906101000a90046001600160a01b03168f6040516118ee9a999897969594939291906133da565b60405180910390a3549998505050505050505050565b6040518060400160405280600f81526020016e6459645820476f7665726e616e636560881b81525081565b600561193a82610e85565b600781111561194557fe5b146119625760405162461bcd60e51b8152600401610b239061322f565b6000818152600460205260408120600d8101805460ff19166001179055905b6003820154811015611ae85760028201546004830180546001600160a01b0390921691638902ab659190849081106119b557fe5b90600052602060002001548460030184815481106119cf57fe5b6000918252602090912001546004860180546001600160a01b0390921691869081106119f757fe5b9060005260206000200154866005018681548110611a1157fe5b90600052602060002001876006018781548110611a2a57fe5b9060005260206000200188600a0154896007018981548110611a4857fe5b90600052602060002090602091828204019190069054906101000a900460ff166040518863ffffffff1660e01b8152600401611a8996959493929190612ef5565b6000604051808303818588803b158015611aa257600080fd5b505af1158015611ab6573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611adf9190810190612abc565b50600101611981565b50336001600160a01b03167f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec2483604051611b229190612f39565b60405180910390a25050565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b611b558282611055565b6106ef57611b6d816001600160a01b031660146122a9565b611b788360206122a9565b60405160200180807f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525060170183805190602001908083835b60208310611bd25780518252601f199092019160209182019101611bb3565b51815160209384036101000a60001901801990921691161790527001034b99036b4b9b9b4b733903937b6329607d1b919093019081528451601190910192850191508083835b60208310611c375780518252601f199092019160209182019101611c18565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f190183529384905262461bcd60e51b84526004840181815282516024860152825192975095508594506044909301928601915080838360005b83811015611caf578181015183820152602001611c97565b50505050905090810190601f168015611cdc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6001600160a01b03811660009081526005602052604090819020805460ff19169055517f5e8105a2af24345971359d2289f43efa80d093f4a7123561b8d63836b98724f490611d3a908390612e74565b60405180910390a150565b611d4f8282611055565b6106ef576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611d86611b47565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611dd48282611055565b156106ef576000828152602081815260408083206001600160a01b03851684529091529020805460ff19169055611e09611b47565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6002611e5883610e85565b6007811115611e6357fe5b14611e805760405162461bcd60e51b8152600401610b239061301e565b60008281526004602090815260408083206001600160a01b0387168452600f8101909252909120805461010090046001600160f81b031615611ed45760405162461bcd60e51b8152600401610b2390613101565b600d820154600883015460405163eaeded5f60e01b81526000926201000090046001600160a01b03169163eaeded5f91611f12918a91600401612e88565b60206040518083038186803b158015611f2a57600080fd5b505afa158015611f3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f629190612a4d565b90508315611f8357600b830154611f7990826120ed565b600b840155611f98565b600c830154611f9290826120ed565b600c8401555b815460ff60ff1990911685151517166101006001600160f81b038316021782556040516001600160a01b038716907f0c611e7b6ae0de26f4772260e1bbdb5f58cbb7c275fe2de14671968d29add8d690611ff790889088908690613479565b60405180910390a2505050505050565b6001600160a01b03811660009081526005602052604090819020805460ff19166001179055517f52762435f58790076157ea2a4914a5a4d0aa0eb421588891377692f7fd3bc08290611d3a908390612e74565b600281905560405133907fc46fc23e244f0720a98ddbac6efb5bb40d212cf15e6478fc4b3017648715289d90612091908490612f39565b60405180910390a250565b600180546001600160a01b0319166001600160a01b0383169081179091556040513391907f9e8e9f668db69a2cefb172dabe284d0d3aea2b7ee64212a205bd033bd03a3d5590600090a350565b4690565b600082820183811015612147576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b866001600160a01b031663b1fc879687878787878760405160200161217896959493929190612ea1565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016121aa9190612f39565b60206040518083038186803b1580156121c257600080fd5b505afa1580156121d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fa9190612a19565b156122175760405162461bcd60e51b8152600401610b239061307c565b604051638d8fe2e360e01b81526001600160a01b03881690638d8fe2e39061224d90899089908990899089908990600401612ea1565b602060405180830381600087803b15801561226757600080fd5b505af115801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190612a4d565b5050505050505050565b6060808260020260020167ffffffffffffffff811180156122c957600080fd5b506040519080825280601f01601f1916602001820160405280156122f4576020820181803683370190505b509050600360fc1b8160008151811061230957fe5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061233257fe5b60200101906001600160f81b031916908160001a905350600160028402015b60018111156123b3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061237c57fe5b1a60f81b82828151811061238c57fe5b60200101906001600160f81b031916908160001a90535060049490941c9360001901612351565b508315612147576040805162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015290519081900360640190fd5b6040518061022001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016060815260200160608152602001606081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160006001600160a01b03168152602001600080191681525090565b604080518082019091526000808252602082015290565b60405180606001604052806000815260200160008152602001600081525090565b82805482825590600052602060002090810192821561253a579160200282015b8281111561253a57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612505565b506125469291506126d3565b5090565b82805482825590600052602060002090810192821561253a579160200282015b8281111561253a57825182559160200191906001019061256a565b8280548282559060005260206000209081019282156125d2579160200282015b828111156125d257825180516125c29184916020909101906126e8565b50916020019190600101906125a5565b50612546929150612763565b82805482825590600052602060002090810192821561262b579160200282015b8281111561262b578251805161261b9184916020909101906126e8565b50916020019190600101906125fe565b50612546929150612780565b82805482825590600052602060002090601f0160209004810192821561253a5791602002820160005b8382111561269d57835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302612660565b80156126ca5782816101000a81549060ff021916905560010160208160000104928301926001030261269d565b50506125469291505b5b8082111561254657600081556001016126d4565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261271e576000855561253a565b82601f1061273757805160ff191683800117855561253a565b8280016001018555821561253a579182018281111561253a57825182559160200191906001019061256a565b80821115612546576000612777828261279d565b50600101612763565b80821115612546576000612794828261279d565b50600101612780565b50805460018160011615610100020316600290046000825580601f106127c357506127e1565b601f0160209004906000526020600020908101906127e191906126d3565b50565b600082601f8301126127f4578081fd5b8135612807612802826134c1565b61349d565b81815291506020808301908481018184028601820187101561282857600080fd5b60005b8481101561285057813561283e8161353d565b8452928201929082019060010161282b565b505050505092915050565b600082601f83011261286b578081fd5b8135612879612802826134c1565b81815291506020808301908481018184028601820187101561289a57600080fd5b60005b848110156128505781356128b081613552565b8452928201929082019060010161289d565b600082601f8301126128d2578081fd5b81356128e0612802826134c1565b818152915060208083019084810160005b84811015612850578135870188603f82011261290c57600080fd5b8381013561291c612802826134df565b81815260408b8184860101111561293257600080fd5b828185018884013750600091810186019190915285525092820192908201906001016128f1565b600082601f830112612969578081fd5b8135612977612802826134c1565b81815291506020808301908481018184028601820187101561299857600080fd5b60005b848110156128505781358452928201929082019060010161299b565b80356105858161353d565b6000602082840312156129d3578081fd5b81356121478161353d565b6000602082840312156129ef578081fd5b813567ffffffffffffffff811115612a05578182fd5b612a11848285016127e4565b949350505050565b600060208284031215612a2a578081fd5b815161214781613552565b600060208284031215612a46578081fd5b5035919050565b600060208284031215612a5e578081fd5b5051919050565b60008060408385031215612a77578081fd5b823591506020830135612a898161353d565b809150509250929050565b600060208284031215612aa5578081fd5b81356001600160e01b031981168114612147578182fd5b600060208284031215612acd578081fd5b815167ffffffffffffffff811115612ae3578182fd5b8201601f81018413612af3578182fd5b8051612b01612802826134df565b818152856020838501011115612b15578384fd5b612b2682602083016020860161350d565b95945050505050565b600080600080600080600060e0888a031215612b49578283fd5b612b52886129b7565b9650602088013567ffffffffffffffff80821115612b6e578485fd5b612b7a8b838c016127e4565b975060408a0135915080821115612b8f578485fd5b612b9b8b838c01612959565b965060608a0135915080821115612bb0578485fd5b612bbc8b838c016128c2565b955060808a0135915080821115612bd1578485fd5b612bdd8b838c016128c2565b945060a08a0135915080821115612bf2578384fd5b50612bff8a828b0161285b565b92505060c0880135905092959891949750929550565b60008060408385031215612a77578182fd5b60008060408385031215612c39578182fd5b823591506020830135612a8981613552565b600080600080600060a08688031215612c62578283fd5b853594506020860135612c7481613552565b9350604086013560ff81168114612c89578384fd5b94979396509394606081013594506080013592915050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015612ce65781516001600160a01b031687529582019590820190600101612cc1565b509495945050505050565b6000815180845260208085019450808401835b83811015612ce6578151151587529582019590820190600101612d04565b6000815180845260208085018081965082840281019150828601855b85811015612d68578284038952612d56848351612daa565b98850198935090840190600101612d3e565b5091979650505050505050565b6000815180845260208085019450808401835b83811015612ce657815187529582019590820190600101612d88565b15159052565b60008151808452612dc281602086016020860161350d565b601f01601f19169290920160200192915050565b60008154600180821660008114612df45760018114612e1257612e50565b60028304607f16865260ff1983166020870152604086019350612e50565b60028304808752612e2286613501565b60005b82811015612e465781546020828b0101528482019150602081019050612e25565b8801602001955050505b50505092915050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038816825286602083015260c06040830152612ec860c0830187612daa565b8281036060840152612eda8187612daa565b6080840195909552505090151560a090910152949350505050565b600060018060a01b038816825286602083015260c06040830152612f1c60c0830187612dd6565b8281036060840152612eda8187612dd6565b901515815260200190565b90815260200190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b92835260208301919091521515604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020810160088310612fce57fe5b91905290565b6000602082526121476020830184612daa565b6020808252601c908201527f50524f504f534954494f4e5f4352454154494f4e5f494e56414c494400000000604082015260600190565b6020808252600d908201526c1593d5125391d7d0d313d4d151609a1b604082015260600190565b60208082526017908201527f494e56414c49445f53544154455f464f525f5155455545000000000000000000604082015260600190565b602080825260119082015270222aa82624a1a0aa22a22fa0a1aa24a7a760791b604082015260600190565b602080825260159082015274494e56414c49445f454d5054595f5441524745545360581b604082015260600190565b602080825260119082015270494e56414c49445f5349474e415455524560781b604082015260600190565b6020808252601690820152751593d51157d053149150511657d4d55093525515115160521b604082015260600190565b60208082526017908201527f4558454355544f525f4e4f545f415554484f52495a4544000000000000000000604082015260600190565b6020808252601a908201527f494e434f4e53495354454e545f504152414d535f4c454e475448000000000000604082015260600190565b6020808252818101527f50524f504f534954494f4e5f43414e43454c4c4154494f4e5f494e56414c4944604082015260600190565b60208082526014908201527313d3931657d0915193d49157d1561150d555115160621b604082015260600190565b6020808252601390820152721253959053125117d41493d413d4d05317d251606a1b604082015260600190565b6020808252601590820152744f4e4c595f5155455545445f50524f504f53414c5360581b604082015260600190565b60006020825282516020830152602083015161327d6040840182612ca1565b5060408301516132906060840182612ca1565b5060608301516102208060808501526132ad610240850183612cae565b91506080850151601f19808685030160a08701526132cb8483612d75565b935060a08701519150808685030160c08701526132e88483612d22565b935060c08701519150808685030160e08701526133058483612d22565b935060e087015191506101008187860301818801526133248584612cf1565b90880151610120888101919091528801516101408089019190915288015161016080890191909152880151610180808901919091528801516101a08089019190915288015190945091506101c0905061337f81870183612da4565b86015190506101e061339386820183612da4565b86015190506102006133a786820183612ca1565b959095015193019290925250919050565b8151151581526020918201516001600160f81b03169181019190915260400190565b60006101408c83528060208401526133f48184018d612cae565b90508281036040840152613408818c612d75565b9050828103606084015261341c818b612d22565b90508281036080840152613430818a612d22565b905082810360a08401526134448189612cf1565b60c0840197909752505060e08101939093526001600160a01b0391909116610100830152610120909101529695505050505050565b9283529015156020830152604082015260600190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156134b957fe5b604052919050565b600067ffffffffffffffff8211156134d557fe5b5060209081020190565b600067ffffffffffffffff8211156134f357fe5b50601f01601f191660200190565b60009081526020902090565b60005b83811015613528578181015183820152602001613510565b83811115613537576000848401525b50505050565b6001600160a01b03811681146127e157600080fd5b80151581146127e157600080fdfeb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a2646970667358221220116d5fc8bfdf2930fcf64f786ea230080be4c2c27561426c509658ff3bf709dd64736f6c63430007050033b19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e6d7de061afba91040b8f2fa055f62976f5be484e30e6b3eb7e3c831c2f411f09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019aa000000000000000000000000301df37d653b281af83a1ddf4464ef21a622ec83
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806364c786d9116100f7578063a2b170b011610095578063e58378bb11610064578063e58378bb146104f3578063f8741a9c14610508578063fd07029614610528578063fe0d94c11461054a576101c2565b8063a2b170b01461047e578063af1e0bd314610493578063d547741f146104b3578063ddf0b009146104d3576101c2565b806391d14854116100d157806391d148541461041457806398e527d3146104345780639aad6f6a14610449578063a217fddf14610469576101c2565b806364c786d9146103a757806370b0f660146103c75780639080936f146103e7576101c2565b806334b18c261161016457806340e58ee51161013e57806340e58ee51461031a5780634185ff831461033a578063548b514e14610367578063612c56fa14610387576101c2565b806334b18c26146102b857806336568abe146102cd5780633656de21146102ed576101c2565b80631a1caf7f116101a05780631a1caf7f1461024157806320606b7014610263578063248a9ca3146102785780632f2ff15d14610298576101c2565b806301ffc9a7146101c757806306be3e8e146101fd578063195677571461021f575b600080fd5b3480156101d357600080fd5b506101e76101e2366004612a94565b61055d565b6040516101f49190612f2e565b60405180910390f35b34801561020957600080fd5b5061021261058a565b6040516101f49190612e74565b34801561022b57600080fd5b50610234610599565b6040516101f49190612f39565b34801561024d57600080fd5b5061026161025c3660046129de565b6105bd565b005b34801561026f57600080fd5b50610234610612565b34801561028457600080fd5b50610234610293366004612a35565b610636565b3480156102a457600080fd5b506102616102b3366004612a65565b61064b565b3480156102c457600080fd5b5061023461066a565b3480156102d957600080fd5b506102616102e8366004612a65565b61068e565b3480156102f957600080fd5b5061030d610308366004612a35565b6106f3565b6040516101f4919061325e565b34801561032657600080fd5b50610261610335366004612a35565b610aa2565b34801561034657600080fd5b5061035a610355366004612c15565b610d82565b6040516101f491906133b8565b34801561037357600080fd5b506101e76103823660046129c2565b610ddb565b34801561039357600080fd5b506102616103a2366004612c27565b610df9565b3480156103b357600080fd5b506102616103c23660046129de565b610e04565b3480156103d357600080fd5b506102616103e2366004612a35565b610e61565b3480156103f357600080fd5b50610407610402366004612a35565b610e85565b6040516101f49190612fc0565b34801561042057600080fd5b506101e761042f366004612a65565b611055565b34801561044057600080fd5b5061023461107e565b34801561045557600080fd5b506102616104643660046129c2565b611084565b34801561047557600080fd5b506102346110a8565b34801561048a57600080fd5b506102346110ad565b34801561049f57600080fd5b506102616104ae366004612c4b565b6110b3565b3480156104bf57600080fd5b506102616104ce366004612a65565b611252565b3480156104df57600080fd5b506102616104ee366004612a35565b611271565b3480156104ff57600080fd5b5061023461156d565b34801561051457600080fd5b50610234610523366004612b2f565b61157f565b34801561053457600080fd5b5061053d611904565b6040516101f49190612fd4565b610261610558366004612a35565b61192f565b60006001600160e01b03198216637965db0b60e01b1480610582575061058282611b2e565b90505b919050565b6001546001600160a01b031690565b7f6d7de061afba91040b8f2fa055f62976f5be484e30e6b3eb7e3c831c2f411f0981565b6000805160206135618339815191526105dd816105d8611b47565b611b4b565b60005b825181101561060d576106058382815181106105f857fe5b6020026020010151611cea565b6001016105e0565b505050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60009081526020819052604090206001015490565b61065482610636565b610660816105d8611b47565b61060d8383611d45565b7f4e031542a9553ed1c4e810c54674ab4b984243e335b246aa3de73663bf4c11ee81565b610696611b47565b6001600160a01b0316816001600160a01b0316146106e55760405162461bcd60e51b815260040180806020018281038252602f815260200180613581602f913960400191505060405180910390fd5b6106ef8282611dca565b5050565b6106fb612407565b6000828152600460205260409020610711612407565b60408051610220810182528354815260018401546001600160a01b0390811660208084019190915260028601549091168284015260038501805484518184028101840190955280855292936060850193909283018282801561079c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161077e575b50505050508152602001836004018054806020026020016040519081016040528092919081815260200182805480156107f457602002820191906000526020600020905b8154815260200190600101908083116107e0575b5050505050815260200183600501805480602002602001604051908101604052809291908181526020016000905b828210156108cd5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156108b95780601f1061088e576101008083540402835291602001916108b9565b820191906000526020600020905b81548152906001019060200180831161089c57829003601f168201915b505050505081526020019060010190610822565b50505050815260200183600601805480602002602001604051908101604052809291908181526020016000905b828210156109a55760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156109915780601f1061096657610100808354040283529160200191610991565b820191906000526020600020905b81548152906001019060200180831161097457829003601f168201915b5050505050815260200190600101906108fa565b50505050815260200183600701805480602002602001604051908101604052809291908181526020018280548015610a1c57602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116109eb5790505b50505091835250506008840154602082015260098401546040820152600a8401546060820152600b8401546080820152600c84015460a0820152600d84015460ff808216151560c0840152610100808304909116151560e0840152620100009091046001600160a01b031690820152600e90930154610120909301929092525092915050565b6000610aad82610e85565b90506001816007811115610abd57fe5b14158015610ad757506003816007811115610ad457fe5b14155b8015610aef57506006816007811115610aec57fe5b14155b8015610b0757506007816007811115610b0457fe5b14155b610b2c5760405162461bcd60e51b8152600401610b23906131d4565b60405180910390fd5b6000828152600460208190526040918290206002810154600182015493516331a7bc4160e01b815291936001600160a01b03918216936331a7bc4193610b7c933093169160001943019101612f9c565b60206040518083038186803b158015610b9457600080fd5b505afa158015610ba8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcc9190612a19565b610be85760405162461bcd60e51b8152600401610b239061319f565b600d8101805461ff00191661010017905560005b6003820154811015610d455760028201546003830180546001600160a01b0390921691631dc40b51919084908110610c3057fe5b6000918252602090912001546004850180546001600160a01b039092169185908110610c5857fe5b9060005260206000200154856005018581548110610c7257fe5b90600052602060002001866006018681548110610c8b57fe5b9060005260206000200187600a0154886007018881548110610ca957fe5b90600052602060002090602091828204019190069054906101000a900460ff166040518763ffffffff1660e01b8152600401610cea96959493929190612ef5565b602060405180830381600087803b158015610d0457600080fd5b505af1158015610d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3c9190612a4d565b50600101610bfc565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c83604051610d759190612f39565b60405180910390a1505050565b610d8a6124ad565b5060008281526004602090815260408083206001600160a01b0385168452600f0182529182902082518084019093525460ff8116151583526001600160f81b03610100909104169082015292915050565b6001600160a01b031660009081526005602052604090205460ff1690565b6106ef338383611e4d565b7f6d7de061afba91040b8f2fa055f62976f5be484e30e6b3eb7e3c831c2f411f09610e31816105d8611b47565b60005b825181101561060d57610e59838281518110610e4c57fe5b6020026020010151612007565b600101610e34565b600080516020613561833981519152610e7c816105d8611b47565b6106ef8261205a565b60008160035411610ea85760405162461bcd60e51b8152600401610b2390613202565b6000828152600460205260409020600d810154610100900460ff1615610ed2576001915050610585565b80600801544311610ee7576000915050610585565b80600901544311610efc576002915050610585565b60028101546040516306fbb3ab60e01b81526001600160a01b03909116906306fbb3ab90610f309030908790600401612e88565b60206040518083038186803b158015610f4857600080fd5b505afa158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f809190612a19565b610f8e576003915050610585565b600a810154610fa1576004915050610585565b600d81015460ff1615610fb8576007915050610585565b600281015460405163f670a5f960e01b81526001600160a01b039091169063f670a5f990610fec9030908790600401612e88565b60206040518083038186803b15801561100457600080fd5b505afa158015611018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103c9190612a19565b1561104b576006915050610585565b6005915050610585565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60035490565b60008051602061356183398151915261109f816105d8611b47565b6106ef8261209c565b600081565b60025490565b60408051808201909152600f81526e6459645820476f7665726e616e636560881b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f1b8e614c98d105651e90303d9b487888b1e921d59b39d4602e3bcf7da4b7ef9d6111266120e9565b3060405160200161113a9493929190612f42565b604051602081830303815290604052805190602001207f4e031542a9553ed1c4e810c54674ab4b984243e335b246aa3de73663bf4c11ee878760405160200161118593929190612f66565b604051602081830303815290604052805190602001206040516020016111ac929190612e59565b6040516020818303038152906040528051906020012090506000600182868686604051600081526020016040526040516111e99493929190612f7e565b6020604051602081039080840390855afa15801561120b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661123e5760405162461bcd60e51b8152600401610b23906130d6565b611249818888611e4d565b50505050505050565b61125b82610636565b611267816105d8611b47565b61060d8383611dca565b600461127c82610e85565b600781111561128757fe5b146112a45760405162461bcd60e51b8152600401610b2390613045565b60008181526004602081815260408084206002810154825163675e4d4160e11b8152925191959461133b946001600160a01b039092169363cebc9a829381830193929091829003018186803b1580156112fc57600080fd5b505afa158015611310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113349190612a4d565b42906120ed565b905060005b600383015481101561152457600283015460038401805461151c926001600160a01b031691908490811061137057fe5b6000918252602090912001546004860180546001600160a01b03909216918590811061139857fe5b90600052602060002001548660050185815481106113b257fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156114405780601f1061141557610100808354040283529160200191611440565b820191906000526020600020905b81548152906001019060200180831161142357829003601f168201915b505050505087600601868154811061145457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156114e25780601f106114b7576101008083540402835291602001916114e2565b820191906000526020600020905b8154815290600101906020018083116114c557829003601f168201915b5050505050878960070188815481106114f757fe5b90600052602060002090602091828204019190069054906101000a900460ff1661214e565b600101611340565b50600a820181905560405133907f11a0b38e70585e4b09b794bd1d9f9b1a51a802eb8ee2101eeee178d0349e73fe90611560908690859061348f565b60405180910390a2505050565b60008051602061356183398151915281565b60008651600014156115a35760405162461bcd60e51b8152600401610b23906130a7565b855187511480156115b5575084518751145b80156115c2575083518751145b80156115cf575082518751145b6115eb5760405162461bcd60e51b8152600401610b2390613168565b6115f488610ddb565b6116105760405162461bcd60e51b8152600401610b2390613131565b604051631a1b205360e31b81526001600160a01b0389169063d0d90298906116449030903390600019430190600401612f9c565b60206040518083038186803b15801561165c57600080fd5b505afa158015611670573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116949190612a19565b6116b05760405162461bcd60e51b8152600401610b2390612fe7565b6116b86124c4565b6002546116c69043906120ed565b81600001818152505061174b896001600160a01b031663a438d2086040518163ffffffff1660e01b815260040160206040518083038186803b15801561170b57600080fd5b505afa15801561171f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117439190612a4d565b8251906120ed565b602082810191909152600380546040808501828152600092835260048552912090518155600181018054336001600160a01b0319918216179091556002820180549091166001600160a01b038e161790558a5190926117b092840191908c01906124e5565b5087516117c690600483019060208b019061254a565b5086516117dc90600583019060208a0190612585565b5085516117f290600683019060208901906125de565b5084516118089060078301906020880190612637565b508160000151816008018190555081602001518160090181905550600160009054906101000a90046001600160a01b031681600d0160026101000a8154816001600160a01b0302191690836001600160a01b031602179055508381600e01819055508160400151600101600381905550896001600160a01b0316336001600160a01b03167fd272d67d2c8c66de43c1d2515abb064978a5020c173e15903b6a2ab3bf7440ec84604001518c8c8c8c8c8a600001518b60200151600160009054906101000a90046001600160a01b03168f6040516118ee9a999897969594939291906133da565b60405180910390a3549998505050505050505050565b6040518060400160405280600f81526020016e6459645820476f7665726e616e636560881b81525081565b600561193a82610e85565b600781111561194557fe5b146119625760405162461bcd60e51b8152600401610b239061322f565b6000818152600460205260408120600d8101805460ff19166001179055905b6003820154811015611ae85760028201546004830180546001600160a01b0390921691638902ab659190849081106119b557fe5b90600052602060002001548460030184815481106119cf57fe5b6000918252602090912001546004860180546001600160a01b0390921691869081106119f757fe5b9060005260206000200154866005018681548110611a1157fe5b90600052602060002001876006018781548110611a2a57fe5b9060005260206000200188600a0154896007018981548110611a4857fe5b90600052602060002090602091828204019190069054906101000a900460ff166040518863ffffffff1660e01b8152600401611a8996959493929190612ef5565b6000604051808303818588803b158015611aa257600080fd5b505af1158015611ab6573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611adf9190810190612abc565b50600101611981565b50336001600160a01b03167f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec2483604051611b229190612f39565b60405180910390a25050565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b611b558282611055565b6106ef57611b6d816001600160a01b031660146122a9565b611b788360206122a9565b60405160200180807f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525060170183805190602001908083835b60208310611bd25780518252601f199092019160209182019101611bb3565b51815160209384036101000a60001901801990921691161790527001034b99036b4b9b9b4b733903937b6329607d1b919093019081528451601190910192850191508083835b60208310611c375780518252601f199092019160209182019101611c18565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f190183529384905262461bcd60e51b84526004840181815282516024860152825192975095508594506044909301928601915080838360005b83811015611caf578181015183820152602001611c97565b50505050905090810190601f168015611cdc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6001600160a01b03811660009081526005602052604090819020805460ff19169055517f5e8105a2af24345971359d2289f43efa80d093f4a7123561b8d63836b98724f490611d3a908390612e74565b60405180910390a150565b611d4f8282611055565b6106ef576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611d86611b47565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611dd48282611055565b156106ef576000828152602081815260408083206001600160a01b03851684529091529020805460ff19169055611e09611b47565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6002611e5883610e85565b6007811115611e6357fe5b14611e805760405162461bcd60e51b8152600401610b239061301e565b60008281526004602090815260408083206001600160a01b0387168452600f8101909252909120805461010090046001600160f81b031615611ed45760405162461bcd60e51b8152600401610b2390613101565b600d820154600883015460405163eaeded5f60e01b81526000926201000090046001600160a01b03169163eaeded5f91611f12918a91600401612e88565b60206040518083038186803b158015611f2a57600080fd5b505afa158015611f3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f629190612a4d565b90508315611f8357600b830154611f7990826120ed565b600b840155611f98565b600c830154611f9290826120ed565b600c8401555b815460ff60ff1990911685151517166101006001600160f81b038316021782556040516001600160a01b038716907f0c611e7b6ae0de26f4772260e1bbdb5f58cbb7c275fe2de14671968d29add8d690611ff790889088908690613479565b60405180910390a2505050505050565b6001600160a01b03811660009081526005602052604090819020805460ff19166001179055517f52762435f58790076157ea2a4914a5a4d0aa0eb421588891377692f7fd3bc08290611d3a908390612e74565b600281905560405133907fc46fc23e244f0720a98ddbac6efb5bb40d212cf15e6478fc4b3017648715289d90612091908490612f39565b60405180910390a250565b600180546001600160a01b0319166001600160a01b0383169081179091556040513391907f9e8e9f668db69a2cefb172dabe284d0d3aea2b7ee64212a205bd033bd03a3d5590600090a350565b4690565b600082820183811015612147576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b866001600160a01b031663b1fc879687878787878760405160200161217896959493929190612ea1565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016121aa9190612f39565b60206040518083038186803b1580156121c257600080fd5b505afa1580156121d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fa9190612a19565b156122175760405162461bcd60e51b8152600401610b239061307c565b604051638d8fe2e360e01b81526001600160a01b03881690638d8fe2e39061224d90899089908990899089908990600401612ea1565b602060405180830381600087803b15801561226757600080fd5b505af115801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190612a4d565b5050505050505050565b6060808260020260020167ffffffffffffffff811180156122c957600080fd5b506040519080825280601f01601f1916602001820160405280156122f4576020820181803683370190505b509050600360fc1b8160008151811061230957fe5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061233257fe5b60200101906001600160f81b031916908160001a905350600160028402015b60018111156123b3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061237c57fe5b1a60f81b82828151811061238c57fe5b60200101906001600160f81b031916908160001a90535060049490941c9360001901612351565b508315612147576040805162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015290519081900360640190fd5b6040518061022001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016060815260200160608152602001606081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160006001600160a01b03168152602001600080191681525090565b604080518082019091526000808252602082015290565b60405180606001604052806000815260200160008152602001600081525090565b82805482825590600052602060002090810192821561253a579160200282015b8281111561253a57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612505565b506125469291506126d3565b5090565b82805482825590600052602060002090810192821561253a579160200282015b8281111561253a57825182559160200191906001019061256a565b8280548282559060005260206000209081019282156125d2579160200282015b828111156125d257825180516125c29184916020909101906126e8565b50916020019190600101906125a5565b50612546929150612763565b82805482825590600052602060002090810192821561262b579160200282015b8281111561262b578251805161261b9184916020909101906126e8565b50916020019190600101906125fe565b50612546929150612780565b82805482825590600052602060002090601f0160209004810192821561253a5791602002820160005b8382111561269d57835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302612660565b80156126ca5782816101000a81549060ff021916905560010160208160000104928301926001030261269d565b50506125469291505b5b8082111561254657600081556001016126d4565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261271e576000855561253a565b82601f1061273757805160ff191683800117855561253a565b8280016001018555821561253a579182018281111561253a57825182559160200191906001019061256a565b80821115612546576000612777828261279d565b50600101612763565b80821115612546576000612794828261279d565b50600101612780565b50805460018160011615610100020316600290046000825580601f106127c357506127e1565b601f0160209004906000526020600020908101906127e191906126d3565b50565b600082601f8301126127f4578081fd5b8135612807612802826134c1565b61349d565b81815291506020808301908481018184028601820187101561282857600080fd5b60005b8481101561285057813561283e8161353d565b8452928201929082019060010161282b565b505050505092915050565b600082601f83011261286b578081fd5b8135612879612802826134c1565b81815291506020808301908481018184028601820187101561289a57600080fd5b60005b848110156128505781356128b081613552565b8452928201929082019060010161289d565b600082601f8301126128d2578081fd5b81356128e0612802826134c1565b818152915060208083019084810160005b84811015612850578135870188603f82011261290c57600080fd5b8381013561291c612802826134df565b81815260408b8184860101111561293257600080fd5b828185018884013750600091810186019190915285525092820192908201906001016128f1565b600082601f830112612969578081fd5b8135612977612802826134c1565b81815291506020808301908481018184028601820187101561299857600080fd5b60005b848110156128505781358452928201929082019060010161299b565b80356105858161353d565b6000602082840312156129d3578081fd5b81356121478161353d565b6000602082840312156129ef578081fd5b813567ffffffffffffffff811115612a05578182fd5b612a11848285016127e4565b949350505050565b600060208284031215612a2a578081fd5b815161214781613552565b600060208284031215612a46578081fd5b5035919050565b600060208284031215612a5e578081fd5b5051919050565b60008060408385031215612a77578081fd5b823591506020830135612a898161353d565b809150509250929050565b600060208284031215612aa5578081fd5b81356001600160e01b031981168114612147578182fd5b600060208284031215612acd578081fd5b815167ffffffffffffffff811115612ae3578182fd5b8201601f81018413612af3578182fd5b8051612b01612802826134df565b818152856020838501011115612b15578384fd5b612b2682602083016020860161350d565b95945050505050565b600080600080600080600060e0888a031215612b49578283fd5b612b52886129b7565b9650602088013567ffffffffffffffff80821115612b6e578485fd5b612b7a8b838c016127e4565b975060408a0135915080821115612b8f578485fd5b612b9b8b838c01612959565b965060608a0135915080821115612bb0578485fd5b612bbc8b838c016128c2565b955060808a0135915080821115612bd1578485fd5b612bdd8b838c016128c2565b945060a08a0135915080821115612bf2578384fd5b50612bff8a828b0161285b565b92505060c0880135905092959891949750929550565b60008060408385031215612a77578182fd5b60008060408385031215612c39578182fd5b823591506020830135612a8981613552565b600080600080600060a08688031215612c62578283fd5b853594506020860135612c7481613552565b9350604086013560ff81168114612c89578384fd5b94979396509394606081013594506080013592915050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015612ce65781516001600160a01b031687529582019590820190600101612cc1565b509495945050505050565b6000815180845260208085019450808401835b83811015612ce6578151151587529582019590820190600101612d04565b6000815180845260208085018081965082840281019150828601855b85811015612d68578284038952612d56848351612daa565b98850198935090840190600101612d3e565b5091979650505050505050565b6000815180845260208085019450808401835b83811015612ce657815187529582019590820190600101612d88565b15159052565b60008151808452612dc281602086016020860161350d565b601f01601f19169290920160200192915050565b60008154600180821660008114612df45760018114612e1257612e50565b60028304607f16865260ff1983166020870152604086019350612e50565b60028304808752612e2286613501565b60005b82811015612e465781546020828b0101528482019150602081019050612e25565b8801602001955050505b50505092915050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038816825286602083015260c06040830152612ec860c0830187612daa565b8281036060840152612eda8187612daa565b6080840195909552505090151560a090910152949350505050565b600060018060a01b038816825286602083015260c06040830152612f1c60c0830187612dd6565b8281036060840152612eda8187612dd6565b901515815260200190565b90815260200190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b92835260208301919091521515604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020810160088310612fce57fe5b91905290565b6000602082526121476020830184612daa565b6020808252601c908201527f50524f504f534954494f4e5f4352454154494f4e5f494e56414c494400000000604082015260600190565b6020808252600d908201526c1593d5125391d7d0d313d4d151609a1b604082015260600190565b60208082526017908201527f494e56414c49445f53544154455f464f525f5155455545000000000000000000604082015260600190565b602080825260119082015270222aa82624a1a0aa22a22fa0a1aa24a7a760791b604082015260600190565b602080825260159082015274494e56414c49445f454d5054595f5441524745545360581b604082015260600190565b602080825260119082015270494e56414c49445f5349474e415455524560781b604082015260600190565b6020808252601690820152751593d51157d053149150511657d4d55093525515115160521b604082015260600190565b60208082526017908201527f4558454355544f525f4e4f545f415554484f52495a4544000000000000000000604082015260600190565b6020808252601a908201527f494e434f4e53495354454e545f504152414d535f4c454e475448000000000000604082015260600190565b6020808252818101527f50524f504f534954494f4e5f43414e43454c4c4154494f4e5f494e56414c4944604082015260600190565b60208082526014908201527313d3931657d0915193d49157d1561150d555115160621b604082015260600190565b6020808252601390820152721253959053125117d41493d413d4d05317d251606a1b604082015260600190565b6020808252601590820152744f4e4c595f5155455545445f50524f504f53414c5360581b604082015260600190565b60006020825282516020830152602083015161327d6040840182612ca1565b5060408301516132906060840182612ca1565b5060608301516102208060808501526132ad610240850183612cae565b91506080850151601f19808685030160a08701526132cb8483612d75565b935060a08701519150808685030160c08701526132e88483612d22565b935060c08701519150808685030160e08701526133058483612d22565b935060e087015191506101008187860301818801526133248584612cf1565b90880151610120888101919091528801516101408089019190915288015161016080890191909152880151610180808901919091528801516101a08089019190915288015190945091506101c0905061337f81870183612da4565b86015190506101e061339386820183612da4565b86015190506102006133a786820183612ca1565b959095015193019290925250919050565b8151151581526020918201516001600160f81b03169181019190915260400190565b60006101408c83528060208401526133f48184018d612cae565b90508281036040840152613408818c612d75565b9050828103606084015261341c818b612d22565b90508281036080840152613430818a612d22565b905082810360a08401526134448189612cf1565b60c0840197909752505060e08101939093526001600160a01b0391909116610100830152610120909101529695505050505050565b9283529015156020830152604082015260600190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156134b957fe5b604052919050565b600067ffffffffffffffff8211156134d557fe5b5060209081020190565b600067ffffffffffffffff8211156134f357fe5b50601f01601f191660200190565b60009081526020902090565b60005b83811015613528578181015183820152602001613510565b83811115613537576000848401525b50505050565b6001600160a01b03811681146127e157600080fd5b80151581146127e157600080fdfeb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a2646970667358221220116d5fc8bfdf2930fcf64f786ea230080be4c2c27561426c509658ff3bf709dd64736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019aa000000000000000000000000301df37d653b281af83a1ddf4464ef21a622ec83
-----Decoded View---------------
Arg [0] : governanceStrategy (address): 0x0000000000000000000000000000000000000000
Arg [1] : votingDelay (uint256): 6570
Arg [2] : addExecutorAdmin (address): 0x301DF37d653b281AF83a1DDf4464eF21A622eC83
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 00000000000000000000000000000000000000000000000000000000000019aa
Arg [2] : 000000000000000000000000301df37d653b281af83a1ddf4464ef21a622ec83
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.