Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
Latest 25 from a total of 3,851 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem Many | 20620292 | 67 days ago | IN | 0 ETH | 0.00561362 | ||||
Redeem Many | 20550675 | 77 days ago | IN | 0 ETH | 0.02572436 | ||||
Redeem Many | 20205218 | 125 days ago | IN | 0 ETH | 0.00106465 | ||||
Redeem Many | 20197849 | 126 days ago | IN | 0 ETH | 0.00533612 | ||||
Redeem Many | 20191676 | 127 days ago | IN | 0 ETH | 0.00422796 | ||||
Redeem Many | 20190261 | 127 days ago | IN | 0 ETH | 0.00142439 | ||||
Redeem Many | 20182886 | 128 days ago | IN | 0 ETH | 0.00211464 | ||||
Redeem Many | 20083079 | 142 days ago | IN | 0 ETH | 0.00543971 | ||||
Redeem Many | 20078892 | 142 days ago | IN | 0 ETH | 0.00501207 | ||||
Redeem Many | 20075603 | 143 days ago | IN | 0 ETH | 0.0184988 | ||||
Redeem Many | 20075598 | 143 days ago | IN | 0 ETH | 0.00530707 | ||||
Redeem Many | 20053856 | 146 days ago | IN | 0 ETH | 0.00752465 | ||||
Redeem Many | 20053851 | 146 days ago | IN | 0 ETH | 0.00273788 | ||||
Redeem Many | 20003506 | 153 days ago | IN | 0 ETH | 0.01253276 | ||||
Redeem Many | 19943806 | 161 days ago | IN | 0 ETH | 0.00213351 | ||||
Redeem Many | 19917208 | 165 days ago | IN | 0 ETH | 0.00279592 | ||||
Redeem Many | 19917124 | 165 days ago | IN | 0 ETH | 0.00275052 | ||||
Redeem Many | 19883928 | 170 days ago | IN | 0 ETH | 0.00402726 | ||||
Redeem Many | 19713617 | 194 days ago | IN | 0 ETH | 0.04509739 | ||||
Redeem Many | 19517989 | 221 days ago | IN | 0 ETH | 0.1501008 | ||||
Redeem Many | 19517889 | 221 days ago | IN | 0 ETH | 0.01295857 | ||||
Redeem Many | 19206760 | 265 days ago | IN | 0 ETH | 0.03362414 | ||||
Redeem Many | 19099994 | 280 days ago | IN | 0 ETH | 0.00357096 | ||||
Redeem Many | 19006846 | 293 days ago | IN | 0 ETH | 0.01659312 | ||||
Redeem Many | 18946188 | 301 days ago | IN | 0 ETH | 0.00400293 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AllocationExchange
Compiler Version
v0.7.4+commit.3f05b770
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/cryptography/ECDSA.sol"; import "../governance/Governed.sol"; import "../staking/IStaking.sol"; import "../token/IGraphToken.sol"; /** * @title Allocation Exchange * @dev This contract holds tokens that anyone with a voucher signed by the * authority can redeem. The contract validates if the voucher presented is valid * and then sends tokens to the Staking contract by calling the collect() function * passing the voucher allocationID. The contract enforces that only one voucher for * an allocationID can be redeemed. * Only governance can change the authority. */ contract AllocationExchange is Governed { // An allocation voucher represents a signed message that allows // redeeming an amount of funds from this contract and collect // them as part of an allocation struct AllocationVoucher { address allocationID; uint256 amount; bytes signature; // 65 bytes } // -- Constants -- uint256 private constant MAX_UINT256 = 2**256 - 1; uint256 private constant SIGNATURE_LENGTH = 65; // -- State -- IStaking private immutable staking; IGraphToken private immutable graphToken; address public authority; mapping(address => bool) public allocationsRedeemed; // -- Events event AuthoritySet(address indexed account); event AllocationRedeemed(address indexed allocationID, uint256 amount); event TokensWithdrawn(address indexed to, uint256 amount); // -- Functions constructor( IGraphToken _graphToken, IStaking _staking, address _governor, address _authority ) { Governed._initialize(_governor); graphToken = _graphToken; staking = _staking; _setAuthority(_authority); } /** * @notice Approve the staking contract to pull any amount of tokens from this contract. * @dev Increased gas efficiency instead of approving on each voucher redeem */ function approveAll() external { graphToken.approve(address(staking), MAX_UINT256); } /** * @notice Withdraw tokens held in the contract. * @dev Only the governor can withdraw * @param _to Destination to send the tokens * @param _amount Amount of tokens to withdraw */ function withdraw(address _to, uint256 _amount) external onlyGovernor { require(_to != address(0), "Exchange: empty destination"); require(_amount != 0, "Exchange: empty amount"); require(graphToken.transfer(_to, _amount), "Exchange: cannot transfer"); emit TokensWithdrawn(_to, _amount); } /** * @notice Set the authority allowed to sign vouchers. * @dev Only the governor can set the authority * @param _authority Address of the signing authority */ function setAuthority(address _authority) external onlyGovernor { _setAuthority(_authority); } /** * @notice Set the authority allowed to sign vouchers. * @param _authority Address of the signing authority */ function _setAuthority(address _authority) private { require(_authority != address(0), "Exchange: empty authority"); authority = _authority; emit AuthoritySet(authority); } /** * @notice Redeem a voucher signed by the authority. No voucher double spending is allowed. * @dev The voucher must be signed using an Ethereum signed message * @param _voucher Voucher data */ function redeem(AllocationVoucher memory _voucher) external { _redeem(_voucher); } /** * @notice Redeem multiple vouchers. * @dev Each voucher must be signed using an Ethereum signed message * @param _vouchers An array of vouchers */ function redeemMany(AllocationVoucher[] memory _vouchers) external { for (uint256 i = 0; i < _vouchers.length; i++) { _redeem(_vouchers[i]); } } /** * @notice Redeem a voucher signed by the authority. No voucher double spending is allowed. * @dev The voucher must be signed using an Ethereum signed message * @param _voucher Voucher data */ function _redeem(AllocationVoucher memory _voucher) private { require(_voucher.amount > 0, "Exchange: zero tokens voucher"); require(_voucher.signature.length == SIGNATURE_LENGTH, "Exchange: invalid signature"); // Already redeemed check require( !allocationsRedeemed[_voucher.allocationID], "Exchange: allocation already redeemed" ); // Signature check bytes32 messageHash = keccak256(abi.encodePacked(_voucher.allocationID, _voucher.amount)); require( authority == ECDSA.recover(messageHash, _voucher.signature), "Exchange: invalid signer" ); // Mark allocation as collected allocationsRedeemed[_voucher.allocationID] = true; // Make the staking contract collect funds from this contract // The Staking contract will validate if the allocation is valid staking.collect(_voucher.amount, _voucher.allocationID); emit AllocationRedeemed(_voucher.allocationID, _voucher.amount); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.3; /** * @title Graph Governance contract * @dev All contracts that will be owned by a Governor entity should extend this contract. */ contract Governed { // -- State -- address public governor; address public pendingGovernor; // -- Events -- event NewPendingOwnership(address indexed from, address indexed to); event NewOwnership(address indexed from, address indexed to); /** * @dev Check if the caller is the governor. */ modifier onlyGovernor { require(msg.sender == governor, "Only Governor can call"); _; } /** * @dev Initialize the governor to the contract caller. */ function _initialize(address _initGovernor) internal { governor = _initGovernor; } /** * @dev Admin function to begin change of governor. The `_newGovernor` must call * `acceptOwnership` to finalize the transfer. * @param _newGovernor Address of new `governor` */ function transferOwnership(address _newGovernor) external onlyGovernor { require(_newGovernor != address(0), "Governor must be set"); address oldPendingGovernor = pendingGovernor; pendingGovernor = _newGovernor; emit NewPendingOwnership(oldPendingGovernor, pendingGovernor); } /** * @dev Admin function for pending governor to accept role and update governor. * This function must called by the pending governor. */ function acceptOwnership() external { require( pendingGovernor != address(0) && msg.sender == pendingGovernor, "Caller must be pending governor" ); address oldGovernor = governor; address oldPendingGovernor = pendingGovernor; governor = pendingGovernor; pendingGovernor = address(0); emit NewOwnership(oldGovernor, governor); emit NewPendingOwnership(oldPendingGovernor, pendingGovernor); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.12 <0.8.0; pragma experimental ABIEncoderV2; import "./IStakingData.sol"; interface IStaking is IStakingData { // -- Allocation Data -- /** * @dev Possible states an allocation can be * States: * - Null = indexer == address(0) * - Active = not Null && tokens > 0 * - Closed = Active && closedAtEpoch != 0 * - Finalized = Closed && closedAtEpoch + channelDisputeEpochs > now() * - Claimed = not Null && tokens == 0 */ enum AllocationState { Null, Active, Closed, Finalized, Claimed } // -- Configuration -- function setMinimumIndexerStake(uint256 _minimumIndexerStake) external; function setThawingPeriod(uint32 _thawingPeriod) external; function setCurationPercentage(uint32 _percentage) external; function setProtocolPercentage(uint32 _percentage) external; function setChannelDisputeEpochs(uint32 _channelDisputeEpochs) external; function setMaxAllocationEpochs(uint32 _maxAllocationEpochs) external; function setRebateRatio(uint32 _alphaNumerator, uint32 _alphaDenominator) external; function setDelegationRatio(uint32 _delegationRatio) external; function setDelegationParameters( uint32 _indexingRewardCut, uint32 _queryFeeCut, uint32 _cooldownBlocks ) external; function setDelegationParametersCooldown(uint32 _blocks) external; function setDelegationUnbondingPeriod(uint32 _delegationUnbondingPeriod) external; function setDelegationTaxPercentage(uint32 _percentage) external; function setSlasher(address _slasher, bool _allowed) external; function setAssetHolder(address _assetHolder, bool _allowed) external; // -- Operation -- function setOperator(address _operator, bool _allowed) external; function isOperator(address _operator, address _indexer) external view returns (bool); // -- Staking -- function stake(uint256 _tokens) external; function stakeTo(address _indexer, uint256 _tokens) external; function unstake(uint256 _tokens) external; function slash( address _indexer, uint256 _tokens, uint256 _reward, address _beneficiary ) external; function withdraw() external; function setRewardsDestination(address _destination) external; // -- Delegation -- function delegate(address _indexer, uint256 _tokens) external returns (uint256); function undelegate(address _indexer, uint256 _shares) external returns (uint256); function withdrawDelegated(address _indexer, address _newIndexer) external returns (uint256); // -- Channel management and allocations -- function allocate( bytes32 _subgraphDeploymentID, uint256 _tokens, address _allocationID, bytes32 _metadata, bytes calldata _proof ) external; function allocateFrom( address _indexer, bytes32 _subgraphDeploymentID, uint256 _tokens, address _allocationID, bytes32 _metadata, bytes calldata _proof ) external; function closeAllocation(address _allocationID, bytes32 _poi) external; function closeAllocationMany(CloseAllocationRequest[] calldata _requests) external; function closeAndAllocate( address _oldAllocationID, bytes32 _poi, address _indexer, bytes32 _subgraphDeploymentID, uint256 _tokens, address _allocationID, bytes32 _metadata, bytes calldata _proof ) external; function collect(uint256 _tokens, address _allocationID) external; function claim(address _allocationID, bool _restake) external; function claimMany(address[] calldata _allocationID, bool _restake) external; // -- Getters and calculations -- function hasStake(address _indexer) external view returns (bool); function getIndexerStakedTokens(address _indexer) external view returns (uint256); function getIndexerCapacity(address _indexer) external view returns (uint256); function getAllocation(address _allocationID) external view returns (Allocation memory); function getAllocationState(address _allocationID) external view returns (AllocationState); function isAllocation(address _allocationID) external view returns (bool); function getSubgraphAllocatedTokens(bytes32 _subgraphDeploymentID) external view returns (uint256); function getDelegation(address _indexer, address _delegator) external view returns (Delegation memory); function isDelegator(address _indexer, address _delegator) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.3; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IGraphToken is IERC20 { // -- Mint and Burn -- function burn(uint256 amount) external; function mint(address _to, uint256 _amount) external; // -- Mint Admin -- function addMinter(address _account) external; function removeMinter(address _account) external; function renounceMinter() external; function isMinter(address _account) external view returns (bool); // -- Permit -- function permit( address _owner, address _spender, uint256 _value, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.12 <0.8.0; interface IStakingData { /** * @dev Allocate GRT tokens for the purpose of serving queries of a subgraph deployment * An allocation is created in the allocate() function and consumed in claim() */ struct Allocation { address indexer; bytes32 subgraphDeploymentID; uint256 tokens; // Tokens allocated to a SubgraphDeployment uint256 createdAtEpoch; // Epoch when it was created uint256 closedAtEpoch; // Epoch when it was closed uint256 collectedFees; // Collected fees for the allocation uint256 effectiveAllocation; // Effective allocation when closed uint256 accRewardsPerAllocatedToken; // Snapshot used for reward calc } /** * @dev Represents a request to close an allocation with a specific proof of indexing. * This is passed when calling closeAllocationMany to define the closing parameters for * each allocation. */ struct CloseAllocationRequest { address allocationID; bytes32 poi; } // -- Delegation Data -- /** * @dev Delegation pool information. One per indexer. */ struct DelegationPool { uint32 cooldownBlocks; // Blocks to wait before updating parameters uint32 indexingRewardCut; // in PPM uint32 queryFeeCut; // in PPM uint256 updatedAtBlock; // Block when the pool was last updated uint256 tokens; // Total tokens as pool reserves uint256 shares; // Total shares minted in the pool mapping(address => Delegation) delegators; // Mapping of delegator => Delegation } /** * @dev Individual delegation data of a delegator in a pool. */ struct Delegation { uint256 shares; // Shares owned by a delegator in the pool uint256 tokensLocked; // Tokens locked for undelegation uint256 tokensLockedUntil; // Block when locked tokens can be withdrawn } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IGraphToken","name":"_graphToken","type":"address"},{"internalType":"contract IStaking","name":"_staking","type":"address"},{"internalType":"address","name":"_governor","type":"address"},{"internalType":"address","name":"_authority","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"allocationID","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AllocationRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AuthoritySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"NewOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"NewPendingOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allocationsRedeemed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approveAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"allocationID","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct AllocationExchange.AllocationVoucher","name":"_voucher","type":"tuple"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"allocationID","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct AllocationExchange.AllocationVoucher[]","name":"_vouchers","type":"tuple[]"}],"name":"redeemMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_authority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newGovernor","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620012313803806200123183398101604081905262000034916200011d565b6200004a826200007960201b620006c41760201c565b6001600160601b0319606085811b821660a05284901b166080526200006f816200009b565b50505050620001d4565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116620000cd5760405162461bcd60e51b8152600401620000c49062000184565b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f17898fd7375ca5152626d6fdd4ceb2bce6cc033c9b61e254dd0087d5f8b4743090600090a250565b6000806000806080858703121562000133578384fd5b84516200014081620001bb565b60208601519094506200015381620001bb565b60408601519093506200016681620001bb565b60608601519092506200017981620001bb565b939692955090935050565b60208082526019908201527f45786368616e67653a20656d70747920617574686f7269747900000000000000604082015260600190565b6001600160a01b0381168114620001d157600080fd5b50565b60805160601c60a05160601c61102962000208600039806101a852806105da5250806101d5528061088c52506110296000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063bf7e214f11610071578063bf7e214f14610111578063cd2b1af814610119578063dfc224b41461012c578063e3056a341461013f578063f2fde38b14610147578063f3fef3a31461015a576100a9565b80630c340a24146100ae578063185f182d146100cc578063380d0c08146100ec57806379ba5097146100f65780637a9e5e4b146100fe575b600080fd5b6100b661016d565b6040516100c39190610d74565b60405180910390f35b6100df6100da366004610c14565b61017c565b6040516100c39190610da1565b6100f4610191565b005b6100f4610256565b6100f461010c366004610c14565b610365565b6100b66103c6565b6100f4610127366004610c5e565b6103d5565b6100f461013a366004610d17565b610409565b6100b6610412565b6100f4610155366004610c14565b610421565b6100f4610168366004610c35565b61051f565b6000546001600160a01b031681565b60036020526000908152604090205460ff1681565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390610201907f00000000000000000000000000000000000000000000000000000000000000009060001990600401610d88565b602060405180830381600087803b15801561021b57600080fd5b505af115801561022f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102539190610cf7565b50565b6001546001600160a01b03161580159061027a57506001546001600160a01b031633145b6102cb576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b60008054600180546001600160a01b038082166001600160a01b03198086168217808855931690935560405193811694929391169184917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f9190a36001546040516001600160a01b03918216918316907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000546001600160a01b031633146103bd576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b610253816106e6565b6002546001600160a01b031681565b60005b8151811015610405576103fd8282815181106103f057fe5b602002602001015161075c565b6001016103d8565b5050565b6102538161075c565b6001546001600160a01b031681565b6000546001600160a01b03163314610479576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b0381166104cb576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000546001600160a01b03163314610577576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b0382166105a65760405162461bcd60e51b815260040161059d90610dac565b60405180910390fd5b806105c35760405162461bcd60e51b815260040161059d90610f3b565b60405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906106119085908590600401610d88565b602060405180830381600087803b15801561062b57600080fd5b505af115801561063f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106639190610cf7565b61067f5760405162461bcd60e51b815260040161059d90610e28565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516106b89190610f6b565b60405180910390a25050565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811661070c5760405162461bcd60e51b815260040161059d90610f04565b600280546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f17898fd7375ca5152626d6fdd4ceb2bce6cc033c9b61e254dd0087d5f8b4743090600090a250565b60008160200151116107805760405162461bcd60e51b815260040161059d90610e5f565b6041816040015151146107a55760405162461bcd60e51b815260040161059d90610ecd565b80516001600160a01b031660009081526003602052604090205460ff16156107df5760405162461bcd60e51b815260040161059d90610de3565b6000816000015182602001516040516020016107fc929190610d52565b604051602081830303815290604052805190602001209050610822818360400151610935565b6002546001600160a01b0390811691161461084f5760405162461bcd60e51b815260040161059d90610e96565b81516001600160a01b03908116600090815260036020908152604091829020805460ff191660011790558401518451915163469e080560e11b81527f000000000000000000000000000000000000000000000000000000000000000090931692638d3c100a926108c29291600401610f74565b600060405180830381600087803b1580156108dc57600080fd5b505af11580156108f0573d6000803e3d6000fd5b5050505081600001516001600160a01b03167fe86f6a4e34293c4b00e73d2a8b6237e4ab10bb4849b1495a1a8b45d3a59d811883602001516040516106b89190610f6b565b6000815160411461098d576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a6109ab868285856109b5565b9695505050505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610a165760405162461bcd60e51b8152600401808060200182810382526022815260200180610fb06022913960400191505060405180910390fd5b8360ff16601b1480610a2b57508360ff16601c145b610a665760405162461bcd60e51b8152600401808060200182810382526022815260200180610fd26022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610ac2573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610b2a576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80356001600160a01b0381168114610b4a57600080fd5b919050565b600060608284031215610b60578081fd5b6040516060810167ffffffffffffffff8282108183111715610b7e57fe5b81604052829350610b8e85610b33565b8352602091508185013582840152604085013581811115610bae57600080fd5b8501601f81018713610bbf57600080fd5b803582811115610bcb57fe5b610bdd601f8201601f19168501610f8b565b92508083528784828401011115610bf357600080fd5b80848301858501376000848285010152505080604084015250505092915050565b600060208284031215610c25578081fd5b610c2e82610b33565b9392505050565b60008060408385031215610c47578081fd5b610c5083610b33565b946020939093013593505050565b60006020808385031215610c70578182fd5b823567ffffffffffffffff80821115610c87578384fd5b818501915085601f830112610c9a578384fd5b813581811115610ca657fe5b610cb38485830201610f8b565b8181528481019250838501865b83811015610ce957610cd78a888435890101610b4f565b85529386019390860190600101610cc0565b509098975050505050505050565b600060208284031215610d08578081fd5b81518015158114610c2e578182fd5b600060208284031215610d28578081fd5b813567ffffffffffffffff811115610d3e578182fd5b610d4a84828501610b4f565b949350505050565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6020808252601b908201527f45786368616e67653a20656d7074792064657374696e6174696f6e0000000000604082015260600190565b60208082526025908201527f45786368616e67653a20616c6c6f636174696f6e20616c72656164792072656460408201526419595b595960da1b606082015260800190565b60208082526019908201527f45786368616e67653a2063616e6e6f74207472616e7366657200000000000000604082015260600190565b6020808252601d908201527f45786368616e67653a207a65726f20746f6b656e7320766f7563686572000000604082015260600190565b60208082526018908201527f45786368616e67653a20696e76616c6964207369676e65720000000000000000604082015260600190565b6020808252601b908201527f45786368616e67653a20696e76616c6964207369676e61747572650000000000604082015260600190565b60208082526019908201527f45786368616e67653a20656d70747920617574686f7269747900000000000000604082015260600190565b602080825260169082015275115e18da185b99d94e88195b5c1d1e48185b5bdd5b9d60521b604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff81118282101715610fa757fe5b60405291905056fe45434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c7565a26469706673582212208132e86bff25535972a35984768fe071a772d0d3fe57f51a7d10e112d1c1f30964736f6c63430007040033000000000000000000000000c944e90c64b2c07662a292be6244bdf05cda44a7000000000000000000000000f55041e37e12cd407ad00ce2910b8269b01263b900000000000000000000000074db79268e63302d3fc69fb5a7627f7454a4173200000000000000000000000079fd74da4c906509862c8fe93e87a9602e370bc4
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063bf7e214f11610071578063bf7e214f14610111578063cd2b1af814610119578063dfc224b41461012c578063e3056a341461013f578063f2fde38b14610147578063f3fef3a31461015a576100a9565b80630c340a24146100ae578063185f182d146100cc578063380d0c08146100ec57806379ba5097146100f65780637a9e5e4b146100fe575b600080fd5b6100b661016d565b6040516100c39190610d74565b60405180910390f35b6100df6100da366004610c14565b61017c565b6040516100c39190610da1565b6100f4610191565b005b6100f4610256565b6100f461010c366004610c14565b610365565b6100b66103c6565b6100f4610127366004610c5e565b6103d5565b6100f461013a366004610d17565b610409565b6100b6610412565b6100f4610155366004610c14565b610421565b6100f4610168366004610c35565b61051f565b6000546001600160a01b031681565b60036020526000908152604090205460ff1681565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000c944e90c64b2c07662a292be6244bdf05cda44a7169063095ea7b390610201907f000000000000000000000000f55041e37e12cd407ad00ce2910b8269b01263b99060001990600401610d88565b602060405180830381600087803b15801561021b57600080fd5b505af115801561022f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102539190610cf7565b50565b6001546001600160a01b03161580159061027a57506001546001600160a01b031633145b6102cb576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b60008054600180546001600160a01b038082166001600160a01b03198086168217808855931690935560405193811694929391169184917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f9190a36001546040516001600160a01b03918216918316907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000546001600160a01b031633146103bd576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b610253816106e6565b6002546001600160a01b031681565b60005b8151811015610405576103fd8282815181106103f057fe5b602002602001015161075c565b6001016103d8565b5050565b6102538161075c565b6001546001600160a01b031681565b6000546001600160a01b03163314610479576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b0381166104cb576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000546001600160a01b03163314610577576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b0382166105a65760405162461bcd60e51b815260040161059d90610dac565b60405180910390fd5b806105c35760405162461bcd60e51b815260040161059d90610f3b565b60405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000c944e90c64b2c07662a292be6244bdf05cda44a7169063a9059cbb906106119085908590600401610d88565b602060405180830381600087803b15801561062b57600080fd5b505af115801561063f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106639190610cf7565b61067f5760405162461bcd60e51b815260040161059d90610e28565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516106b89190610f6b565b60405180910390a25050565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811661070c5760405162461bcd60e51b815260040161059d90610f04565b600280546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f17898fd7375ca5152626d6fdd4ceb2bce6cc033c9b61e254dd0087d5f8b4743090600090a250565b60008160200151116107805760405162461bcd60e51b815260040161059d90610e5f565b6041816040015151146107a55760405162461bcd60e51b815260040161059d90610ecd565b80516001600160a01b031660009081526003602052604090205460ff16156107df5760405162461bcd60e51b815260040161059d90610de3565b6000816000015182602001516040516020016107fc929190610d52565b604051602081830303815290604052805190602001209050610822818360400151610935565b6002546001600160a01b0390811691161461084f5760405162461bcd60e51b815260040161059d90610e96565b81516001600160a01b03908116600090815260036020908152604091829020805460ff191660011790558401518451915163469e080560e11b81527f000000000000000000000000f55041e37e12cd407ad00ce2910b8269b01263b990931692638d3c100a926108c29291600401610f74565b600060405180830381600087803b1580156108dc57600080fd5b505af11580156108f0573d6000803e3d6000fd5b5050505081600001516001600160a01b03167fe86f6a4e34293c4b00e73d2a8b6237e4ab10bb4849b1495a1a8b45d3a59d811883602001516040516106b89190610f6b565b6000815160411461098d576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a6109ab868285856109b5565b9695505050505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610a165760405162461bcd60e51b8152600401808060200182810382526022815260200180610fb06022913960400191505060405180910390fd5b8360ff16601b1480610a2b57508360ff16601c145b610a665760405162461bcd60e51b8152600401808060200182810382526022815260200180610fd26022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610ac2573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610b2a576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80356001600160a01b0381168114610b4a57600080fd5b919050565b600060608284031215610b60578081fd5b6040516060810167ffffffffffffffff8282108183111715610b7e57fe5b81604052829350610b8e85610b33565b8352602091508185013582840152604085013581811115610bae57600080fd5b8501601f81018713610bbf57600080fd5b803582811115610bcb57fe5b610bdd601f8201601f19168501610f8b565b92508083528784828401011115610bf357600080fd5b80848301858501376000848285010152505080604084015250505092915050565b600060208284031215610c25578081fd5b610c2e82610b33565b9392505050565b60008060408385031215610c47578081fd5b610c5083610b33565b946020939093013593505050565b60006020808385031215610c70578182fd5b823567ffffffffffffffff80821115610c87578384fd5b818501915085601f830112610c9a578384fd5b813581811115610ca657fe5b610cb38485830201610f8b565b8181528481019250838501865b83811015610ce957610cd78a888435890101610b4f565b85529386019390860190600101610cc0565b509098975050505050505050565b600060208284031215610d08578081fd5b81518015158114610c2e578182fd5b600060208284031215610d28578081fd5b813567ffffffffffffffff811115610d3e578182fd5b610d4a84828501610b4f565b949350505050565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6020808252601b908201527f45786368616e67653a20656d7074792064657374696e6174696f6e0000000000604082015260600190565b60208082526025908201527f45786368616e67653a20616c6c6f636174696f6e20616c72656164792072656460408201526419595b595960da1b606082015260800190565b60208082526019908201527f45786368616e67653a2063616e6e6f74207472616e7366657200000000000000604082015260600190565b6020808252601d908201527f45786368616e67653a207a65726f20746f6b656e7320766f7563686572000000604082015260600190565b60208082526018908201527f45786368616e67653a20696e76616c6964207369676e65720000000000000000604082015260600190565b6020808252601b908201527f45786368616e67653a20696e76616c6964207369676e61747572650000000000604082015260600190565b60208082526019908201527f45786368616e67653a20656d70747920617574686f7269747900000000000000604082015260600190565b602080825260169082015275115e18da185b99d94e88195b5c1d1e48185b5bdd5b9d60521b604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff81118282101715610fa757fe5b60405291905056fe45434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c7565a26469706673582212208132e86bff25535972a35984768fe071a772d0d3fe57f51a7d10e112d1c1f30964736f6c63430007040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c944e90c64b2c07662a292be6244bdf05cda44a7000000000000000000000000f55041e37e12cd407ad00ce2910b8269b01263b900000000000000000000000074db79268e63302d3fc69fb5a7627f7454a4173200000000000000000000000079fd74da4c906509862c8fe93e87a9602e370bc4
-----Decoded View---------------
Arg [0] : _graphToken (address): 0xc944E90C64B2c07662A292be6244BDf05Cda44a7
Arg [1] : _staking (address): 0xF55041E37E12cD407ad00CE2910B8269B01263b9
Arg [2] : _governor (address): 0x74Db79268e63302d3FC69FB5a7627F7454a41732
Arg [3] : _authority (address): 0x79Fd74DA4c906509862C8Fe93e87A9602e370BC4
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c944e90c64b2c07662a292be6244bdf05cda44a7
Arg [1] : 000000000000000000000000f55041e37e12cd407ad00ce2910b8269b01263b9
Arg [2] : 00000000000000000000000074db79268e63302d3fc69fb5a7627f7454a41732
Arg [3] : 00000000000000000000000079fd74da4c906509862c8fe93e87a9602e370bc4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.143324 | 86,659.4386 | $12,420.38 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.