ETH Price: $2,491.80 (-0.80%)

Contract

0x4a53cf3b3EdA545dc61dee0cA21eA8996C94385f
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Redeem Many206202922024-08-27 13:42:3567 days ago1724766155IN
0x4a53cf3b...96C94385f
0 ETH0.005613623.69274085
Redeem Many205506752024-08-17 20:17:2377 days ago1723925843IN
0x4a53cf3b...96C94385f
0 ETH0.025724362.49802577
Redeem Many202052182024-06-30 14:52:23125 days ago1719759143IN
0x4a53cf3b...96C94385f
0 ETH0.001064654.83107613
Redeem Many201978492024-06-29 14:10:59126 days ago1719670259IN
0x4a53cf3b...96C94385f
0 ETH0.005336125.13486938
Redeem Many201916762024-06-28 17:28:11127 days ago1719595691IN
0x4a53cf3b...96C94385f
0 ETH0.004227965.20101962
Redeem Many201902612024-06-28 12:43:35127 days ago1719578615IN
0x4a53cf3b...96C94385f
0 ETH0.001424396.28166353
Redeem Many201828862024-06-27 12:00:23128 days ago1719489623IN
0x4a53cf3b...96C94385f
0 ETH0.002114645.23413129
Redeem Many200830792024-06-13 13:04:11142 days ago1718283851IN
0x4a53cf3b...96C94385f
0 ETH0.0054397114.98513974
Redeem Many200788922024-06-12 23:00:47142 days ago1718233247IN
0x4a53cf3b...96C94385f
0 ETH0.0050120711.63808115
Redeem Many200756032024-06-12 11:59:11143 days ago1718193551IN
0x4a53cf3b...96C94385f
0 ETH0.018498821.65437128
Redeem Many200755982024-06-12 11:58:11143 days ago1718193491IN
0x4a53cf3b...96C94385f
0 ETH0.0053070722.25666651
Redeem Many200538562024-06-09 11:05:47146 days ago1717931147IN
0x4a53cf3b...96C94385f
0 ETH0.007524656.40670357
Redeem Many200538512024-06-09 11:04:47146 days ago1717931087IN
0x4a53cf3b...96C94385f
0 ETH0.002737885.61586774
Redeem Many200035062024-06-02 10:21:35153 days ago1717323695IN
0x4a53cf3b...96C94385f
0 ETH0.0125327612.60698135
Redeem Many199438062024-05-25 2:07:23161 days ago1716602843IN
0x4a53cf3b...96C94385f
0 ETH0.002133517.49296814
Redeem Many199172082024-05-21 8:51:59165 days ago1716281519IN
0x4a53cf3b...96C94385f
0 ETH0.002795929.81999493
Redeem Many199171242024-05-21 8:34:59165 days ago1716280499IN
0x4a53cf3b...96C94385f
0 ETH0.002750529.65993787
Redeem Many198839282024-05-16 17:08:11170 days ago1715879291IN
0x4a53cf3b...96C94385f
0 ETH0.004027269.56312078
Redeem Many197136172024-04-22 21:27:47194 days ago1713821267IN
0x4a53cf3b...96C94385f
0 ETH0.0450973911.76237281
Redeem Many195179892024-03-26 10:21:59221 days ago1711448519IN
0x4a53cf3b...96C94385f
0 ETH0.150100823.27714038
Redeem Many195178892024-03-26 10:01:47221 days ago1711447307IN
0x4a53cf3b...96C94385f
0 ETH0.0129585724.07283194
Redeem Many192067602024-02-11 19:00:59265 days ago1707678059IN
0x4a53cf3b...96C94385f
0 ETH0.0336241427.08440172
Redeem Many190999942024-01-27 19:27:23280 days ago1706383643IN
0x4a53cf3b...96C94385f
0 ETH0.0035709612.54187435
Redeem Many190068462024-01-14 18:14:35293 days ago1705256075IN
0x4a53cf3b...96C94385f
0 ETH0.0165931222.76705313
Redeem Many189461882024-01-06 5:45:11301 days ago1704519911IN
0x4a53cf3b...96C94385f
0 ETH0.0040029313.31445801
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AllocationExchange

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : AllocationExchange.sol
// 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);
    }
}

File 2 of 7 : ECDSA.sol
// 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));
    }
}

File 3 of 7 : Governed.sol
// 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);
    }
}

File 4 of 7 : IStaking.sol
// 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);
}

File 5 of 7 : IGraphToken.sol
// 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;
}

File 6 of 7 : IStakingData.sol
// 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
    }
}

File 7 of 7 : IERC20.sol
// 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"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"}]

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.