{"id":"9719fafda8cad7362c6721d33cb63274","_format":"hh-sol-build-info-1","solcVersion":"0.7.6","solcLongVersion":"0.7.6+commit.7338295f","input":{"language":"Solidity","sources":{"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address recipient, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"},"@openzeppelin/contracts/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address recipient, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"},"@openzeppelin/contracts/token/ERC721/IERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\nimport \"../../introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n    /**\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n     */\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n     */\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    /**\n     * @dev Returns the number of tokens in ``owner``'s account.\n     */\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /**\n     * @dev Returns the owner of the `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Transfers `tokenId` token from `from` to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n     * The approval is cleared when the token is transferred.\n     *\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n     *\n     * Requirements:\n     *\n     * - The caller must own the token or be an approved operator.\n     * - `tokenId` must exist.\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address to, uint256 tokenId) external;\n\n    /**\n     * @dev Returns the account approved for `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function getApproved(uint256 tokenId) external view returns (address operator);\n\n    /**\n     * @dev Approve or remove `operator` as an operator for the caller.\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n     *\n     * Requirements:\n     *\n     * - The `operator` cannot be the caller.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function setApprovalForAll(address operator, bool _approved) external;\n\n    /**\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n     *\n     * See {setApprovalForAll}\n     */\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n\n    /**\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\n      *\n      * Requirements:\n      *\n      * - `from` cannot be the zero address.\n      * - `to` cannot be the zero address.\n      * - `tokenId` token must exist and be owned by `from`.\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n      *\n      * Emits a {Transfer} event.\n      */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n}\n"},"contracts/contracts/curation/IGraphCurationToken.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || ^0.8.0;\n\nimport { IERC20Upgradeable } from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\n/**\n * @title Graph Curation Token Interface\n * @author Edge & Node\n * @notice Interface for curation tokens that represent shares in subgraph curation pools\n */\ninterface IGraphCurationToken is IERC20Upgradeable {\n    /**\n     * @notice Graph Curation Token Contract initializer.\n     * @param owner Address of the contract issuing this token\n     */\n    function initialize(address owner) external;\n\n    /**\n     * @notice Burn tokens from an address.\n     * @param account Address from where tokens will be burned\n     * @param amount Amount of tokens to burn\n     */\n    function burnFrom(address account, uint256 amount) external;\n\n    /**\n     * @notice Mint new tokens.\n     * @param to Address to send the newly minted tokens\n     * @param amount Amount of tokens to mint\n     */\n    function mint(address to, uint256 amount) external;\n}\n"},"contracts/contracts/discovery/ISubgraphNFT.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || ^0.8.0;\n\nimport { IERC721 } from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\n\n/**\n * @title Subgraph NFT Interface\n * @author Edge & Node\n * @notice Interface for the Subgraph NFT contract that represents subgraph ownership\n */\ninterface ISubgraphNFT is IERC721 {\n    // -- Config --\n\n    /**\n     * @notice Set the minter allowed to perform actions on the NFT\n     * @dev Minter can mint, burn and update the metadata\n     * @param minter Address of the allowed minter\n     */\n    function setMinter(address minter) external;\n\n    /**\n     * @notice Set the token descriptor contract\n     * @dev Token descriptor can be zero. If set, it must be a contract\n     * @param tokenDescriptor Address of the contract that creates the NFT token URI\n     */\n    function setTokenDescriptor(address tokenDescriptor) external;\n\n    /**\n     * @notice Set the base URI\n     * @dev Can be set to empty\n     * @param baseURI Base URI to use to build the token URI\n     */\n    function setBaseURI(string memory baseURI) external;\n\n    // -- Actions --\n\n    /**\n     * @notice Mint `tokenId` and transfers it to `to`\n     * @dev `tokenId` must not exist and `to` cannot be the zero address\n     * @param to Address receiving the minted NFT\n     * @param tokenId ID of the NFT\n     */\n    function mint(address to, uint256 tokenId) external;\n\n    /**\n     * @notice Burn `tokenId`\n     * @dev The approval is cleared when the token is burned\n     * @param tokenId ID of the NFT\n     */\n    function burn(uint256 tokenId) external;\n\n    /**\n     * @notice Set the metadata for a subgraph represented by `tokenId`\n     * @dev `tokenId` must exist\n     * @param tokenId ID of the NFT\n     * @param subgraphMetadata IPFS hash for the metadata\n     */\n    function setSubgraphMetadata(uint256 tokenId, bytes32 subgraphMetadata) external;\n\n    /**\n     * @notice Returns the Uniform Resource Identifier (URI) for `tokenId` token\n     * @param tokenId ID of the NFT\n     * @return The URI for the token\n     */\n    function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n"},"contracts/contracts/l2/token/IL2GraphToken.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity ^0.7.6 || ^0.8.0;\n\n// TODO: Re-enable and fix issues when publishing a new version\n// solhint-disable gas-indexed-events\n\nimport { IGraphToken } from \"../../token/IGraphToken.sol\";\n\n/**\n * @title IL2GraphToken\n * @author Edge & Node\n * @notice Interface for the L2 Graph Token contract that extends IGraphToken with L2-specific functionality\n */\ninterface IL2GraphToken is IGraphToken {\n    // Events\n    /**\n     * @notice Emitted when tokens are minted through the bridge\n     * @param account The account that received the minted tokens\n     * @param amount The amount of tokens minted\n     */\n    event BridgeMinted(address indexed account, uint256 amount);\n\n    /**\n     * @notice Emitted when tokens are burned through the bridge\n     * @param account The account from which tokens were burned\n     * @param amount The amount of tokens burned\n     */\n    event BridgeBurned(address indexed account, uint256 amount);\n\n    /**\n     * @notice Emitted when the gateway address is set\n     * @param gateway The new gateway address\n     */\n    event GatewaySet(address gateway);\n\n    /**\n     * @notice Emitted when the L1 address is set\n     * @param l1Address The new L1 address\n     */\n    event L1AddressSet(address l1Address);\n\n    // Public state variables (view functions)\n    /**\n     * @notice Get the gateway contract address\n     * @return The address of the gateway contract\n     */\n    function gateway() external view returns (address);\n\n    /**\n     * @notice Get the L1 contract address\n     * @return The address of the L1 contract\n     */\n    function l1Address() external view returns (address);\n\n    // Functions\n\n    /**\n     * @notice Initialize the L2 token contract\n     * @param owner The owner address for the contract\n     */\n    function initialize(address owner) external;\n\n    /**\n     * @notice Set the gateway address.\n     * @param gw Address of the gateway\n     */\n    function setGateway(address gw) external;\n\n    /**\n     * @notice Set the L1 address.\n     * @param addr Address of the L1 contract\n     */\n    function setL1Address(address addr) external;\n\n    /**\n     * @notice Mint tokens for a bridge transfer.\n     * @param account Address to mint tokens to\n     * @param amount Amount of tokens to mint\n     */\n    function bridgeMint(address account, uint256 amount) external;\n\n    /**\n     * @notice Burn tokens for a bridge transfer.\n     * @param account Address to burn tokens from\n     * @param amount Amount of tokens to burn\n     */\n    function bridgeBurn(address account, uint256 amount) external;\n}\n"},"contracts/contracts/token/IGraphToken.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || ^0.8.0;\n\n// Solhint linting fails for 0.8.0.\n// solhint-disable-next-line import-path-check\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/**\n * @title IGraphToken\n * @author Edge & Node\n * @notice Interface for the Graph Token contract\n * @dev Extends IERC20 with additional functionality for minting, burning, and permit\n */\ninterface IGraphToken is IERC20 {\n    // -- Mint and Burn --\n\n    /**\n     * @notice Burns tokens from the caller's account\n     * @param amount The amount of tokens to burn\n     */\n    function burn(uint256 amount) external;\n\n    /**\n     * @notice Burns tokens from a specified account (requires allowance)\n     * @param from The account to burn tokens from\n     * @param amount The amount of tokens to burn\n     */\n    function burnFrom(address from, uint256 amount) external;\n\n    /**\n     * @notice Mints new tokens to a specified account\n     * @dev Only callable by accounts with minter role\n     * @param to The account to mint tokens to\n     * @param amount The amount of tokens to mint\n     */\n    function mint(address to, uint256 amount) external;\n\n    // -- Mint Admin --\n\n    /**\n     * @notice Adds a new minter account\n     * @dev Only callable by accounts with appropriate permissions\n     * @param account The account to grant minter role to\n     */\n    function addMinter(address account) external;\n\n    /**\n     * @notice Removes minter role from an account\n     * @dev Only callable by accounts with appropriate permissions\n     * @param account The account to revoke minter role from\n     */\n    function removeMinter(address account) external;\n\n    /**\n     * @notice Renounces minter role for the caller\n     * @dev Allows a minter to voluntarily give up their minting privileges\n     */\n    function renounceMinter() external;\n\n    /**\n     * @notice Checks if an account has minter role\n     * @param account The account to check\n     * @return True if the account is a minter, false otherwise\n     */\n    function isMinter(address account) external view returns (bool);\n\n    // -- Permit --\n\n    /**\n     * @notice Permit the spender to spend tokens on behalf of the owner.\n     * @param owner Address of the token owner\n     * @param spender Address of the token spender\n     * @param value Amount of tokens to spend\n     * @param deadline Expiration timestamp for the permit\n     * @param v Recovery byte of the signature\n     * @param r R value of the signature\n     * @param s S value of the signature\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    // -- Allowance --\n\n    /**\n     * @notice Increases the allowance granted to a spender\n     * @param spender The account whose allowance will be increased\n     * @param addedValue The amount to increase the allowance by\n     * @return True if the operation succeeded\n     */\n    function increaseAllowance(address spender, uint256 addedValue) external returns (bool);\n\n    /**\n     * @notice Decreases the allowance granted to a spender\n     * @param spender The account whose allowance will be decreased\n     * @param subtractedValue The amount to decrease the allowance by\n     * @return True if the operation succeeded\n     */\n    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);\n}\n"}},"settings":{"optimizer":{"enabled":false,"runs":200},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}}}},"output":{"sources":{"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol":{"ast":{"absolutePath":"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","exportedSymbols":{"IERC20Upgradeable":[77]},"id":78,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1,"literals":["solidity",">=","0.6",".0","<","0.8",".0"],"nodeType":"PragmaDirective","src":"33:31:0"},{"abstract":false,"baseContracts":[],"contractDependencies":[],"contractKind":"interface","documentation":{"id":2,"nodeType":"StructuredDocumentation","src":"66:70:0","text":" @dev Interface of the ERC20 standard as defined in the EIP."},"fullyImplemented":false,"id":77,"linearizedBaseContracts":[77],"name":"IERC20Upgradeable","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":3,"nodeType":"StructuredDocumentation","src":"171:66:0","text":" @dev Returns the amount of tokens in existence."},"functionSelector":"18160ddd","id":8,"implemented":false,"kind":"function","modifiers":[],"name":"totalSupply","nodeType":"FunctionDefinition","parameters":{"id":4,"nodeType":"ParameterList","parameters":[],"src":"262:2:0"},"returnParameters":{"id":7,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":8,"src":"288:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5,"name":"uint256","nodeType":"ElementaryTypeName","src":"288:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"287:9:0"},"scope":77,"src":"242:55:0","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":9,"nodeType":"StructuredDocumentation","src":"303:72:0","text":" @dev Returns the amount of tokens owned by `account`."},"functionSelector":"70a08231","id":16,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nodeType":"FunctionDefinition","parameters":{"id":12,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":16,"src":"399:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10,"name":"address","nodeType":"ElementaryTypeName","src":"399:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"398:17:0"},"returnParameters":{"id":15,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":16,"src":"439:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13,"name":"uint256","nodeType":"ElementaryTypeName","src":"439:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"438:9:0"},"scope":77,"src":"380:68:0","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":17,"nodeType":"StructuredDocumentation","src":"454:209:0","text":" @dev Moves `amount` tokens from the caller's account to `recipient`.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."},"functionSelector":"a9059cbb","id":26,"implemented":false,"kind":"function","modifiers":[],"name":"transfer","nodeType":"FunctionDefinition","parameters":{"id":22,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19,"mutability":"mutable","name":"recipient","nodeType":"VariableDeclaration","scope":26,"src":"686:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18,"name":"address","nodeType":"ElementaryTypeName","src":"686:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":26,"src":"705:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20,"name":"uint256","nodeType":"ElementaryTypeName","src":"705:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"685:35:0"},"returnParameters":{"id":25,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":26,"src":"739:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":23,"name":"bool","nodeType":"ElementaryTypeName","src":"739:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"738:6:0"},"scope":77,"src":"668:77:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":27,"nodeType":"StructuredDocumentation","src":"751:264:0","text":" @dev Returns the remaining number of tokens that `spender` will be\n allowed to spend on behalf of `owner` through {transferFrom}. This is\n zero by default.\n This value changes when {approve} or {transferFrom} are called."},"functionSelector":"dd62ed3e","id":36,"implemented":false,"kind":"function","modifiers":[],"name":"allowance","nodeType":"FunctionDefinition","parameters":{"id":32,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":36,"src":"1039:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28,"name":"address","nodeType":"ElementaryTypeName","src":"1039:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31,"mutability":"mutable","name":"spender","nodeType":"VariableDeclaration","scope":36,"src":"1054:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30,"name":"address","nodeType":"ElementaryTypeName","src":"1054:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1038:32:0"},"returnParameters":{"id":35,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":36,"src":"1094:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33,"name":"uint256","nodeType":"ElementaryTypeName","src":"1094:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1093:9:0"},"scope":77,"src":"1020:83:0","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":37,"nodeType":"StructuredDocumentation","src":"1109:642:0","text":" @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n Returns a boolean value indicating whether the operation succeeded.\n IMPORTANT: Beware that changing an allowance with this method brings the risk\n that someone may use both the old and the new allowance by unfortunate\n transaction ordering. One possible solution to mitigate this race\n condition is to first reduce the spender's allowance to 0 and set the\n desired value afterwards:\n https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n Emits an {Approval} event."},"functionSelector":"095ea7b3","id":46,"implemented":false,"kind":"function","modifiers":[],"name":"approve","nodeType":"FunctionDefinition","parameters":{"id":42,"nodeType":"ParameterList","parameters":[{"constant":false,"id":39,"mutability":"mutable","name":"spender","nodeType":"VariableDeclaration","scope":46,"src":"1773:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":38,"name":"address","nodeType":"ElementaryTypeName","src":"1773:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":41,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":46,"src":"1790:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":40,"name":"uint256","nodeType":"ElementaryTypeName","src":"1790:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1772:33:0"},"returnParameters":{"id":45,"nodeType":"ParameterList","parameters":[{"constant":false,"id":44,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":46,"src":"1824:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":43,"name":"bool","nodeType":"ElementaryTypeName","src":"1824:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1823:6:0"},"scope":77,"src":"1756:74:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":47,"nodeType":"StructuredDocumentation","src":"1836:296:0","text":" @dev Moves `amount` tokens from `sender` to `recipient` using the\n allowance mechanism. `amount` is then deducted from the caller's\n allowance.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."},"functionSelector":"23b872dd","id":58,"implemented":false,"kind":"function","modifiers":[],"name":"transferFrom","nodeType":"FunctionDefinition","parameters":{"id":54,"nodeType":"ParameterList","parameters":[{"constant":false,"id":49,"mutability":"mutable","name":"sender","nodeType":"VariableDeclaration","scope":58,"src":"2159:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":48,"name":"address","nodeType":"ElementaryTypeName","src":"2159:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":51,"mutability":"mutable","name":"recipient","nodeType":"VariableDeclaration","scope":58,"src":"2175:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50,"name":"address","nodeType":"ElementaryTypeName","src":"2175:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":53,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":58,"src":"2194:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52,"name":"uint256","nodeType":"ElementaryTypeName","src":"2194:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2158:51:0"},"returnParameters":{"id":57,"nodeType":"ParameterList","parameters":[{"constant":false,"id":56,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":58,"src":"2228:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":55,"name":"bool","nodeType":"ElementaryTypeName","src":"2228:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2227:6:0"},"scope":77,"src":"2137:97:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"anonymous":false,"documentation":{"id":59,"nodeType":"StructuredDocumentation","src":"2240:158:0","text":" @dev Emitted when `value` tokens are moved from one account (`from`) to\n another (`to`).\n Note that `value` may be zero."},"id":67,"name":"Transfer","nodeType":"EventDefinition","parameters":{"id":66,"nodeType":"ParameterList","parameters":[{"constant":false,"id":61,"indexed":true,"mutability":"mutable","name":"from","nodeType":"VariableDeclaration","scope":67,"src":"2418:20:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":60,"name":"address","nodeType":"ElementaryTypeName","src":"2418:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":63,"indexed":true,"mutability":"mutable","name":"to","nodeType":"VariableDeclaration","scope":67,"src":"2440:18:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":62,"name":"address","nodeType":"ElementaryTypeName","src":"2440:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":65,"indexed":false,"mutability":"mutable","name":"value","nodeType":"VariableDeclaration","scope":67,"src":"2460:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":64,"name":"uint256","nodeType":"ElementaryTypeName","src":"2460:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2417:57:0"},"src":"2403:72:0"},{"anonymous":false,"documentation":{"id":68,"nodeType":"StructuredDocumentation","src":"2481:148:0","text":" @dev Emitted when the allowance of a `spender` for an `owner` is set by\n a call to {approve}. `value` is the new allowance."},"id":76,"name":"Approval","nodeType":"EventDefinition","parameters":{"id":75,"nodeType":"ParameterList","parameters":[{"constant":false,"id":70,"indexed":true,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":76,"src":"2649:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":69,"name":"address","nodeType":"ElementaryTypeName","src":"2649:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":72,"indexed":true,"mutability":"mutable","name":"spender","nodeType":"VariableDeclaration","scope":76,"src":"2672:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":71,"name":"address","nodeType":"ElementaryTypeName","src":"2672:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":74,"indexed":false,"mutability":"mutable","name":"value","nodeType":"VariableDeclaration","scope":76,"src":"2697:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":73,"name":"uint256","nodeType":"ElementaryTypeName","src":"2697:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2648:63:0"},"src":"2634:78:0"}],"scope":78,"src":"137:2577:0"}],"src":"33:2682:0"},"id":0},"@openzeppelin/contracts/introspection/IERC165.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/introspection/IERC165.sol","exportedSymbols":{"IERC165":[89]},"id":90,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":79,"literals":["solidity",">=","0.6",".0","<","0.8",".0"],"nodeType":"PragmaDirective","src":"33:31:1"},{"abstract":false,"baseContracts":[],"contractDependencies":[],"contractKind":"interface","documentation":{"id":80,"nodeType":"StructuredDocumentation","src":"66:279:1","text":" @dev Interface of the ERC165 standard, as defined in the\n https://eips.ethereum.org/EIPS/eip-165[EIP].\n Implementers can declare support of contract interfaces, which can then be\n queried by others ({ERC165Checker}).\n For an implementation, see {ERC165}."},"fullyImplemented":false,"id":89,"linearizedBaseContracts":[89],"name":"IERC165","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":81,"nodeType":"StructuredDocumentation","src":"370:340:1","text":" @dev Returns true if this contract implements the interface defined by\n `interfaceId`. See the corresponding\n https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n to learn more about how these ids are created.\n This function call must use less than 30 000 gas."},"functionSelector":"01ffc9a7","id":88,"implemented":false,"kind":"function","modifiers":[],"name":"supportsInterface","nodeType":"FunctionDefinition","parameters":{"id":84,"nodeType":"ParameterList","parameters":[{"constant":false,"id":83,"mutability":"mutable","name":"interfaceId","nodeType":"VariableDeclaration","scope":88,"src":"742:18:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":82,"name":"bytes4","nodeType":"ElementaryTypeName","src":"742:6:1","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"741:20:1"},"returnParameters":{"id":87,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":88,"src":"785:4:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":85,"name":"bool","nodeType":"ElementaryTypeName","src":"785:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"784:6:1"},"scope":89,"src":"715:76:1","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":90,"src":"346:447:1"}],"src":"33:761:1"},"id":1},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","exportedSymbols":{"IERC20":[167]},"id":168,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":91,"literals":["solidity",">=","0.6",".0","<","0.8",".0"],"nodeType":"PragmaDirective","src":"33:31:2"},{"abstract":false,"baseContracts":[],"contractDependencies":[],"contractKind":"interface","documentation":{"id":92,"nodeType":"StructuredDocumentation","src":"66:70:2","text":" @dev Interface of the ERC20 standard as defined in the EIP."},"fullyImplemented":false,"id":167,"linearizedBaseContracts":[167],"name":"IERC20","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":93,"nodeType":"StructuredDocumentation","src":"160:66:2","text":" @dev Returns the amount of tokens in existence."},"functionSelector":"18160ddd","id":98,"implemented":false,"kind":"function","modifiers":[],"name":"totalSupply","nodeType":"FunctionDefinition","parameters":{"id":94,"nodeType":"ParameterList","parameters":[],"src":"251:2:2"},"returnParameters":{"id":97,"nodeType":"ParameterList","parameters":[{"constant":false,"id":96,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":98,"src":"277:7:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":95,"name":"uint256","nodeType":"ElementaryTypeName","src":"277:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"276:9:2"},"scope":167,"src":"231:55:2","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":99,"nodeType":"StructuredDocumentation","src":"292:72:2","text":" @dev Returns the amount of tokens owned by `account`."},"functionSelector":"70a08231","id":106,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nodeType":"FunctionDefinition","parameters":{"id":102,"nodeType":"ParameterList","parameters":[{"constant":false,"id":101,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":106,"src":"388:15:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":100,"name":"address","nodeType":"ElementaryTypeName","src":"388:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"387:17:2"},"returnParameters":{"id":105,"nodeType":"ParameterList","parameters":[{"constant":false,"id":104,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":106,"src":"428:7:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":103,"name":"uint256","nodeType":"ElementaryTypeName","src":"428:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"427:9:2"},"scope":167,"src":"369:68:2","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":107,"nodeType":"StructuredDocumentation","src":"443:209:2","text":" @dev Moves `amount` tokens from the caller's account to `recipient`.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."},"functionSelector":"a9059cbb","id":116,"implemented":false,"kind":"function","modifiers":[],"name":"transfer","nodeType":"FunctionDefinition","parameters":{"id":112,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109,"mutability":"mutable","name":"recipient","nodeType":"VariableDeclaration","scope":116,"src":"675:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":108,"name":"address","nodeType":"ElementaryTypeName","src":"675:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":111,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":116,"src":"694:14:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":110,"name":"uint256","nodeType":"ElementaryTypeName","src":"694:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"674:35:2"},"returnParameters":{"id":115,"nodeType":"ParameterList","parameters":[{"constant":false,"id":114,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":116,"src":"728:4:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":113,"name":"bool","nodeType":"ElementaryTypeName","src":"728:4:2","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"727:6:2"},"scope":167,"src":"657:77:2","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":117,"nodeType":"StructuredDocumentation","src":"740:264:2","text":" @dev Returns the remaining number of tokens that `spender` will be\n allowed to spend on behalf of `owner` through {transferFrom}. This is\n zero by default.\n This value changes when {approve} or {transferFrom} are called."},"functionSelector":"dd62ed3e","id":126,"implemented":false,"kind":"function","modifiers":[],"name":"allowance","nodeType":"FunctionDefinition","parameters":{"id":122,"nodeType":"ParameterList","parameters":[{"constant":false,"id":119,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":126,"src":"1028:13:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":118,"name":"address","nodeType":"ElementaryTypeName","src":"1028:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":121,"mutability":"mutable","name":"spender","nodeType":"VariableDeclaration","scope":126,"src":"1043:15:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":120,"name":"address","nodeType":"ElementaryTypeName","src":"1043:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1027:32:2"},"returnParameters":{"id":125,"nodeType":"ParameterList","parameters":[{"constant":false,"id":124,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":126,"src":"1083:7:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":123,"name":"uint256","nodeType":"ElementaryTypeName","src":"1083:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1082:9:2"},"scope":167,"src":"1009:83:2","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":127,"nodeType":"StructuredDocumentation","src":"1098:642:2","text":" @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n Returns a boolean value indicating whether the operation succeeded.\n IMPORTANT: Beware that changing an allowance with this method brings the risk\n that someone may use both the old and the new allowance by unfortunate\n transaction ordering. One possible solution to mitigate this race\n condition is to first reduce the spender's allowance to 0 and set the\n desired value afterwards:\n https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n Emits an {Approval} event."},"functionSelector":"095ea7b3","id":136,"implemented":false,"kind":"function","modifiers":[],"name":"approve","nodeType":"FunctionDefinition","parameters":{"id":132,"nodeType":"ParameterList","parameters":[{"constant":false,"id":129,"mutability":"mutable","name":"spender","nodeType":"VariableDeclaration","scope":136,"src":"1762:15:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":128,"name":"address","nodeType":"ElementaryTypeName","src":"1762:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":131,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":136,"src":"1779:14:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":130,"name":"uint256","nodeType":"ElementaryTypeName","src":"1779:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1761:33:2"},"returnParameters":{"id":135,"nodeType":"ParameterList","parameters":[{"constant":false,"id":134,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":136,"src":"1813:4:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":133,"name":"bool","nodeType":"ElementaryTypeName","src":"1813:4:2","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1812:6:2"},"scope":167,"src":"1745:74:2","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":137,"nodeType":"StructuredDocumentation","src":"1825:296:2","text":" @dev Moves `amount` tokens from `sender` to `recipient` using the\n allowance mechanism. `amount` is then deducted from the caller's\n allowance.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."},"functionSelector":"23b872dd","id":148,"implemented":false,"kind":"function","modifiers":[],"name":"transferFrom","nodeType":"FunctionDefinition","parameters":{"id":144,"nodeType":"ParameterList","parameters":[{"constant":false,"id":139,"mutability":"mutable","name":"sender","nodeType":"VariableDeclaration","scope":148,"src":"2148:14:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":138,"name":"address","nodeType":"ElementaryTypeName","src":"2148:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":141,"mutability":"mutable","name":"recipient","nodeType":"VariableDeclaration","scope":148,"src":"2164:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":140,"name":"address","nodeType":"ElementaryTypeName","src":"2164:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":143,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":148,"src":"2183:14:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":142,"name":"uint256","nodeType":"ElementaryTypeName","src":"2183:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2147:51:2"},"returnParameters":{"id":147,"nodeType":"ParameterList","parameters":[{"constant":false,"id":146,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":148,"src":"2217:4:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":145,"name":"bool","nodeType":"ElementaryTypeName","src":"2217:4:2","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2216:6:2"},"scope":167,"src":"2126:97:2","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"anonymous":false,"documentation":{"id":149,"nodeType":"StructuredDocumentation","src":"2229:158:2","text":" @dev Emitted when `value` tokens are moved from one account (`from`) to\n another (`to`).\n Note that `value` may be zero."},"id":157,"name":"Transfer","nodeType":"EventDefinition","parameters":{"id":156,"nodeType":"ParameterList","parameters":[{"constant":false,"id":151,"indexed":true,"mutability":"mutable","name":"from","nodeType":"VariableDeclaration","scope":157,"src":"2407:20:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":150,"name":"address","nodeType":"ElementaryTypeName","src":"2407:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":153,"indexed":true,"mutability":"mutable","name":"to","nodeType":"VariableDeclaration","scope":157,"src":"2429:18:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":152,"name":"address","nodeType":"ElementaryTypeName","src":"2429:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":155,"indexed":false,"mutability":"mutable","name":"value","nodeType":"VariableDeclaration","scope":157,"src":"2449:13:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":154,"name":"uint256","nodeType":"ElementaryTypeName","src":"2449:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2406:57:2"},"src":"2392:72:2"},{"anonymous":false,"documentation":{"id":158,"nodeType":"StructuredDocumentation","src":"2470:148:2","text":" @dev Emitted when the allowance of a `spender` for an `owner` is set by\n a call to {approve}. `value` is the new allowance."},"id":166,"name":"Approval","nodeType":"EventDefinition","parameters":{"id":165,"nodeType":"ParameterList","parameters":[{"constant":false,"id":160,"indexed":true,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":166,"src":"2638:21:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":159,"name":"address","nodeType":"ElementaryTypeName","src":"2638:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":162,"indexed":true,"mutability":"mutable","name":"spender","nodeType":"VariableDeclaration","scope":166,"src":"2661:23:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":161,"name":"address","nodeType":"ElementaryTypeName","src":"2661:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":164,"indexed":false,"mutability":"mutable","name":"value","nodeType":"VariableDeclaration","scope":166,"src":"2686:13:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":163,"name":"uint256","nodeType":"ElementaryTypeName","src":"2686:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2637:63:2"},"src":"2623:78:2"}],"scope":168,"src":"137:2566:2"}],"src":"33:2671:2"},"id":2},"@openzeppelin/contracts/token/ERC721/IERC721.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC721/IERC721.sol","exportedSymbols":{"IERC165":[89],"IERC721":[283]},"id":284,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":169,"literals":["solidity",">=","0.6",".2","<","0.8",".0"],"nodeType":"PragmaDirective","src":"33:31:3"},{"absolutePath":"@openzeppelin/contracts/introspection/IERC165.sol","file":"../../introspection/IERC165.sol","id":170,"nodeType":"ImportDirective","scope":284,"sourceUnit":90,"src":"66:41:3","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":172,"name":"IERC165","nodeType":"UserDefinedTypeName","referencedDeclaration":89,"src":"198:7:3","typeDescriptions":{"typeIdentifier":"t_contract$_IERC165_$89","typeString":"contract IERC165"}},"id":173,"nodeType":"InheritanceSpecifier","src":"198:7:3"}],"contractDependencies":[89],"contractKind":"interface","documentation":{"id":171,"nodeType":"StructuredDocumentation","src":"109:67:3","text":" @dev Required interface of an ERC721 compliant contract."},"fullyImplemented":false,"id":283,"linearizedBaseContracts":[283,89],"name":"IERC721","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"documentation":{"id":174,"nodeType":"StructuredDocumentation","src":"212:88:3","text":" @dev Emitted when `tokenId` token is transferred from `from` to `to`."},"id":182,"name":"Transfer","nodeType":"EventDefinition","parameters":{"id":181,"nodeType":"ParameterList","parameters":[{"constant":false,"id":176,"indexed":true,"mutability":"mutable","name":"from","nodeType":"VariableDeclaration","scope":182,"src":"320:20:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":175,"name":"address","nodeType":"ElementaryTypeName","src":"320:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":178,"indexed":true,"mutability":"mutable","name":"to","nodeType":"VariableDeclaration","scope":182,"src":"342:18:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":177,"name":"address","nodeType":"ElementaryTypeName","src":"342:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":180,"indexed":true,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":182,"src":"362:23:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":179,"name":"uint256","nodeType":"ElementaryTypeName","src":"362:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"319:67:3"},"src":"305:82:3"},{"anonymous":false,"documentation":{"id":183,"nodeType":"StructuredDocumentation","src":"393:94:3","text":" @dev Emitted when `owner` enables `approved` to manage the `tokenId` token."},"id":191,"name":"Approval","nodeType":"EventDefinition","parameters":{"id":190,"nodeType":"ParameterList","parameters":[{"constant":false,"id":185,"indexed":true,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":191,"src":"507:21:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":184,"name":"address","nodeType":"ElementaryTypeName","src":"507:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":187,"indexed":true,"mutability":"mutable","name":"approved","nodeType":"VariableDeclaration","scope":191,"src":"530:24:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":186,"name":"address","nodeType":"ElementaryTypeName","src":"530:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":189,"indexed":true,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":191,"src":"556:23:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":188,"name":"uint256","nodeType":"ElementaryTypeName","src":"556:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"506:74:3"},"src":"492:89:3"},{"anonymous":false,"documentation":{"id":192,"nodeType":"StructuredDocumentation","src":"587:117:3","text":" @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets."},"id":200,"name":"ApprovalForAll","nodeType":"EventDefinition","parameters":{"id":199,"nodeType":"ParameterList","parameters":[{"constant":false,"id":194,"indexed":true,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":200,"src":"730:21:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":193,"name":"address","nodeType":"ElementaryTypeName","src":"730:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":196,"indexed":true,"mutability":"mutable","name":"operator","nodeType":"VariableDeclaration","scope":200,"src":"753:24:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":195,"name":"address","nodeType":"ElementaryTypeName","src":"753:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":198,"indexed":false,"mutability":"mutable","name":"approved","nodeType":"VariableDeclaration","scope":200,"src":"779:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":197,"name":"bool","nodeType":"ElementaryTypeName","src":"779:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"729:64:3"},"src":"709:85:3"},{"documentation":{"id":201,"nodeType":"StructuredDocumentation","src":"800:76:3","text":" @dev Returns the number of tokens in ``owner``'s account."},"functionSelector":"70a08231","id":208,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nodeType":"FunctionDefinition","parameters":{"id":204,"nodeType":"ParameterList","parameters":[{"constant":false,"id":203,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":208,"src":"900:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":202,"name":"address","nodeType":"ElementaryTypeName","src":"900:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"899:15:3"},"returnParameters":{"id":207,"nodeType":"ParameterList","parameters":[{"constant":false,"id":206,"mutability":"mutable","name":"balance","nodeType":"VariableDeclaration","scope":208,"src":"938:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":205,"name":"uint256","nodeType":"ElementaryTypeName","src":"938:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"937:17:3"},"scope":283,"src":"881:74:3","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":209,"nodeType":"StructuredDocumentation","src":"961:131:3","text":" @dev Returns the owner of the `tokenId` token.\n Requirements:\n - `tokenId` must exist."},"functionSelector":"6352211e","id":216,"implemented":false,"kind":"function","modifiers":[],"name":"ownerOf","nodeType":"FunctionDefinition","parameters":{"id":212,"nodeType":"ParameterList","parameters":[{"constant":false,"id":211,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":216,"src":"1114:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":210,"name":"uint256","nodeType":"ElementaryTypeName","src":"1114:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1113:17:3"},"returnParameters":{"id":215,"nodeType":"ParameterList","parameters":[{"constant":false,"id":214,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":216,"src":"1154:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":213,"name":"address","nodeType":"ElementaryTypeName","src":"1154:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1153:15:3"},"scope":283,"src":"1097:72:3","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":217,"nodeType":"StructuredDocumentation","src":"1175:690:3","text":" @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n are aware of the ERC721 protocol to prevent tokens from being forever locked.\n Requirements:\n - `from` cannot be the zero address.\n - `to` cannot be the zero address.\n - `tokenId` token must exist and be owned by `from`.\n - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\n - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n Emits a {Transfer} event."},"functionSelector":"42842e0e","id":226,"implemented":false,"kind":"function","modifiers":[],"name":"safeTransferFrom","nodeType":"FunctionDefinition","parameters":{"id":224,"nodeType":"ParameterList","parameters":[{"constant":false,"id":219,"mutability":"mutable","name":"from","nodeType":"VariableDeclaration","scope":226,"src":"1896:12:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":218,"name":"address","nodeType":"ElementaryTypeName","src":"1896:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":221,"mutability":"mutable","name":"to","nodeType":"VariableDeclaration","scope":226,"src":"1910:10:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":220,"name":"address","nodeType":"ElementaryTypeName","src":"1910:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":223,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":226,"src":"1922:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":222,"name":"uint256","nodeType":"ElementaryTypeName","src":"1922:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1895:43:3"},"returnParameters":{"id":225,"nodeType":"ParameterList","parameters":[],"src":"1947:0:3"},"scope":283,"src":"1870:78:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":227,"nodeType":"StructuredDocumentation","src":"1954:504:3","text":" @dev Transfers `tokenId` token from `from` to `to`.\n WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\n Requirements:\n - `from` cannot be the zero address.\n - `to` cannot be the zero address.\n - `tokenId` token must be owned by `from`.\n - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n Emits a {Transfer} event."},"functionSelector":"23b872dd","id":236,"implemented":false,"kind":"function","modifiers":[],"name":"transferFrom","nodeType":"FunctionDefinition","parameters":{"id":234,"nodeType":"ParameterList","parameters":[{"constant":false,"id":229,"mutability":"mutable","name":"from","nodeType":"VariableDeclaration","scope":236,"src":"2485:12:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":228,"name":"address","nodeType":"ElementaryTypeName","src":"2485:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":231,"mutability":"mutable","name":"to","nodeType":"VariableDeclaration","scope":236,"src":"2499:10:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":230,"name":"address","nodeType":"ElementaryTypeName","src":"2499:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":233,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":236,"src":"2511:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":232,"name":"uint256","nodeType":"ElementaryTypeName","src":"2511:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2484:43:3"},"returnParameters":{"id":235,"nodeType":"ParameterList","parameters":[],"src":"2536:0:3"},"scope":283,"src":"2463:74:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":237,"nodeType":"StructuredDocumentation","src":"2543:452:3","text":" @dev Gives permission to `to` to transfer `tokenId` token to another account.\n The approval is cleared when the token is transferred.\n Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n Requirements:\n - The caller must own the token or be an approved operator.\n - `tokenId` must exist.\n Emits an {Approval} event."},"functionSelector":"095ea7b3","id":244,"implemented":false,"kind":"function","modifiers":[],"name":"approve","nodeType":"FunctionDefinition","parameters":{"id":242,"nodeType":"ParameterList","parameters":[{"constant":false,"id":239,"mutability":"mutable","name":"to","nodeType":"VariableDeclaration","scope":244,"src":"3017:10:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":238,"name":"address","nodeType":"ElementaryTypeName","src":"3017:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":241,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":244,"src":"3029:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":240,"name":"uint256","nodeType":"ElementaryTypeName","src":"3029:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3016:29:3"},"returnParameters":{"id":243,"nodeType":"ParameterList","parameters":[],"src":"3054:0:3"},"scope":283,"src":"3000:55:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":245,"nodeType":"StructuredDocumentation","src":"3061:139:3","text":" @dev Returns the account approved for `tokenId` token.\n Requirements:\n - `tokenId` must exist."},"functionSelector":"081812fc","id":252,"implemented":false,"kind":"function","modifiers":[],"name":"getApproved","nodeType":"FunctionDefinition","parameters":{"id":248,"nodeType":"ParameterList","parameters":[{"constant":false,"id":247,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":252,"src":"3226:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":246,"name":"uint256","nodeType":"ElementaryTypeName","src":"3226:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3225:17:3"},"returnParameters":{"id":251,"nodeType":"ParameterList","parameters":[{"constant":false,"id":250,"mutability":"mutable","name":"operator","nodeType":"VariableDeclaration","scope":252,"src":"3266:16:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":249,"name":"address","nodeType":"ElementaryTypeName","src":"3266:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3265:18:3"},"scope":283,"src":"3205:79:3","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":253,"nodeType":"StructuredDocumentation","src":"3290:309:3","text":" @dev Approve or remove `operator` as an operator for the caller.\n Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n Requirements:\n - The `operator` cannot be the caller.\n Emits an {ApprovalForAll} event."},"functionSelector":"a22cb465","id":260,"implemented":false,"kind":"function","modifiers":[],"name":"setApprovalForAll","nodeType":"FunctionDefinition","parameters":{"id":258,"nodeType":"ParameterList","parameters":[{"constant":false,"id":255,"mutability":"mutable","name":"operator","nodeType":"VariableDeclaration","scope":260,"src":"3631:16:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":254,"name":"address","nodeType":"ElementaryTypeName","src":"3631:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":257,"mutability":"mutable","name":"_approved","nodeType":"VariableDeclaration","scope":260,"src":"3649:14:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":256,"name":"bool","nodeType":"ElementaryTypeName","src":"3649:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3630:34:3"},"returnParameters":{"id":259,"nodeType":"ParameterList","parameters":[],"src":"3673:0:3"},"scope":283,"src":"3604:70:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":261,"nodeType":"StructuredDocumentation","src":"3680:138:3","text":" @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n See {setApprovalForAll}"},"functionSelector":"e985e9c5","id":270,"implemented":false,"kind":"function","modifiers":[],"name":"isApprovedForAll","nodeType":"FunctionDefinition","parameters":{"id":266,"nodeType":"ParameterList","parameters":[{"constant":false,"id":263,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":270,"src":"3849:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":262,"name":"address","nodeType":"ElementaryTypeName","src":"3849:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":265,"mutability":"mutable","name":"operator","nodeType":"VariableDeclaration","scope":270,"src":"3864:16:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":264,"name":"address","nodeType":"ElementaryTypeName","src":"3864:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3848:33:3"},"returnParameters":{"id":269,"nodeType":"ParameterList","parameters":[{"constant":false,"id":268,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":270,"src":"3905:4:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":267,"name":"bool","nodeType":"ElementaryTypeName","src":"3905:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3904:6:3"},"scope":283,"src":"3823:88:3","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":271,"nodeType":"StructuredDocumentation","src":"3917:568:3","text":" @dev Safely transfers `tokenId` token from `from` to `to`.\n Requirements:\n - `from` cannot be the zero address.\n - `to` cannot be the zero address.\n - `tokenId` token must exist and be owned by `from`.\n - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n Emits a {Transfer} event."},"functionSelector":"b88d4fde","id":282,"implemented":false,"kind":"function","modifiers":[],"name":"safeTransferFrom","nodeType":"FunctionDefinition","parameters":{"id":280,"nodeType":"ParameterList","parameters":[{"constant":false,"id":273,"mutability":"mutable","name":"from","nodeType":"VariableDeclaration","scope":282,"src":"4516:12:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":272,"name":"address","nodeType":"ElementaryTypeName","src":"4516:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":275,"mutability":"mutable","name":"to","nodeType":"VariableDeclaration","scope":282,"src":"4530:10:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":274,"name":"address","nodeType":"ElementaryTypeName","src":"4530:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":277,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":282,"src":"4542:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":276,"name":"uint256","nodeType":"ElementaryTypeName","src":"4542:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":279,"mutability":"mutable","name":"data","nodeType":"VariableDeclaration","scope":282,"src":"4559:19:3","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":278,"name":"bytes","nodeType":"ElementaryTypeName","src":"4559:5:3","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4515:64:3"},"returnParameters":{"id":281,"nodeType":"ParameterList","parameters":[],"src":"4588:0:3"},"scope":283,"src":"4490:99:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":284,"src":"177:4414:3"}],"src":"33:4559:3"},"id":3},"contracts/contracts/curation/IGraphCurationToken.sol":{"ast":{"absolutePath":"contracts/contracts/curation/IGraphCurationToken.sol","exportedSymbols":{"IERC20Upgradeable":[77],"IGraphCurationToken":[313]},"id":314,"license":"GPL-2.0-or-later","nodeType":"SourceUnit","nodes":[{"id":285,"literals":["solidity","^","0.7",".6","||","^","0.8",".0"],"nodeType":"PragmaDirective","src":"46:33:4"},{"absolutePath":"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","file":"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","id":287,"nodeType":"ImportDirective","scope":314,"sourceUnit":78,"src":"81:106:4","symbolAliases":[{"foreign":{"id":286,"name":"IERC20Upgradeable","nodeType":"Identifier","overloadedDeclarations":[],"src":"90:17:4","typeDescriptions":{}}}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":289,"name":"IERC20Upgradeable","nodeType":"UserDefinedTypeName","referencedDeclaration":77,"src":"384:17:4","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20Upgradeable_$77","typeString":"contract IERC20Upgradeable"}},"id":290,"nodeType":"InheritanceSpecifier","src":"384:17:4"}],"contractDependencies":[77],"contractKind":"interface","documentation":{"id":288,"nodeType":"StructuredDocumentation","src":"189:161:4","text":" @title Graph Curation Token Interface\n @author Edge & Node\n @notice Interface for curation tokens that represent shares in subgraph curation pools"},"fullyImplemented":false,"id":313,"linearizedBaseContracts":[313,77],"name":"IGraphCurationToken","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":291,"nodeType":"StructuredDocumentation","src":"408:132:4","text":" @notice Graph Curation Token Contract initializer.\n @param owner Address of the contract issuing this token"},"functionSelector":"c4d66de8","id":296,"implemented":false,"kind":"function","modifiers":[],"name":"initialize","nodeType":"FunctionDefinition","parameters":{"id":294,"nodeType":"ParameterList","parameters":[{"constant":false,"id":293,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":296,"src":"565:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":292,"name":"address","nodeType":"ElementaryTypeName","src":"565:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"564:15:4"},"returnParameters":{"id":295,"nodeType":"ParameterList","parameters":[],"src":"588:0:4"},"scope":313,"src":"545:44:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":297,"nodeType":"StructuredDocumentation","src":"595:164:4","text":" @notice Burn tokens from an address.\n @param account Address from where tokens will be burned\n @param amount Amount of tokens to burn"},"functionSelector":"79cc6790","id":304,"implemented":false,"kind":"function","modifiers":[],"name":"burnFrom","nodeType":"FunctionDefinition","parameters":{"id":302,"nodeType":"ParameterList","parameters":[{"constant":false,"id":299,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":304,"src":"782:15:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":298,"name":"address","nodeType":"ElementaryTypeName","src":"782:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":301,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":304,"src":"799:14:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":300,"name":"uint256","nodeType":"ElementaryTypeName","src":"799:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"781:33:4"},"returnParameters":{"id":303,"nodeType":"ParameterList","parameters":[],"src":"823:0:4"},"scope":313,"src":"764:60:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":305,"nodeType":"StructuredDocumentation","src":"830:146:4","text":" @notice Mint new tokens.\n @param to Address to send the newly minted tokens\n @param amount Amount of tokens to mint"},"functionSelector":"40c10f19","id":312,"implemented":false,"kind":"function","modifiers":[],"name":"mint","nodeType":"FunctionDefinition","parameters":{"id":310,"nodeType":"ParameterList","parameters":[{"constant":false,"id":307,"mutability":"mutable","name":"to","nodeType":"VariableDeclaration","scope":312,"src":"995:10:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":306,"name":"address","nodeType":"ElementaryTypeName","src":"995:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":309,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":312,"src":"1007:14:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":308,"name":"uint256","nodeType":"ElementaryTypeName","src":"1007:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"994:28:4"},"returnParameters":{"id":311,"nodeType":"ParameterList","parameters":[],"src":"1031:0:4"},"scope":313,"src":"981:51:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":314,"src":"351:683:4"}],"src":"46:989:4"},"id":4},"contracts/contracts/discovery/ISubgraphNFT.sol":{"ast":{"absolutePath":"contracts/contracts/discovery/ISubgraphNFT.sol","exportedSymbols":{"IERC721":[283],"ISubgraphNFT":[369]},"id":370,"license":"GPL-2.0-or-later","nodeType":"SourceUnit","nodes":[{"id":315,"literals":["solidity","^","0.7",".6","||","^","0.8",".0"],"nodeType":"PragmaDirective","src":"46:33:5"},{"absolutePath":"@openzeppelin/contracts/token/ERC721/IERC721.sol","file":"@openzeppelin/contracts/token/ERC721/IERC721.sol","id":317,"nodeType":"ImportDirective","scope":370,"sourceUnit":284,"src":"81:75:5","symbolAliases":[{"foreign":{"id":316,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"src":"90:7:5","typeDescriptions":{}}}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":319,"name":"IERC721","nodeType":"UserDefinedTypeName","referencedDeclaration":283,"src":"334:7:5","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$283","typeString":"contract IERC721"}},"id":320,"nodeType":"InheritanceSpecifier","src":"334:7:5"}],"contractDependencies":[89,283],"contractKind":"interface","documentation":{"id":318,"nodeType":"StructuredDocumentation","src":"158:149:5","text":" @title Subgraph NFT Interface\n @author Edge & Node\n @notice Interface for the Subgraph NFT contract that represents subgraph ownership"},"fullyImplemented":false,"id":369,"linearizedBaseContracts":[369,283,89],"name":"ISubgraphNFT","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":321,"nodeType":"StructuredDocumentation","src":"369:188:5","text":" @notice Set the minter allowed to perform actions on the NFT\n @dev Minter can mint, burn and update the metadata\n @param minter Address of the allowed minter"},"functionSelector":"fca3b5aa","id":326,"implemented":false,"kind":"function","modifiers":[],"name":"setMinter","nodeType":"FunctionDefinition","parameters":{"id":324,"nodeType":"ParameterList","parameters":[{"constant":false,"id":323,"mutability":"mutable","name":"minter","nodeType":"VariableDeclaration","scope":326,"src":"581:14:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":322,"name":"address","nodeType":"ElementaryTypeName","src":"581:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"580:16:5"},"returnParameters":{"id":325,"nodeType":"ParameterList","parameters":[],"src":"605:0:5"},"scope":369,"src":"562:44:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":327,"nodeType":"StructuredDocumentation","src":"612:217:5","text":" @notice Set the token descriptor contract\n @dev Token descriptor can be zero. If set, it must be a contract\n @param tokenDescriptor Address of the contract that creates the NFT token URI"},"functionSelector":"b6dc7ea3","id":332,"implemented":false,"kind":"function","modifiers":[],"name":"setTokenDescriptor","nodeType":"FunctionDefinition","parameters":{"id":330,"nodeType":"ParameterList","parameters":[{"constant":false,"id":329,"mutability":"mutable","name":"tokenDescriptor","nodeType":"VariableDeclaration","scope":332,"src":"862:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":328,"name":"address","nodeType":"ElementaryTypeName","src":"862:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"861:25:5"},"returnParameters":{"id":331,"nodeType":"ParameterList","parameters":[],"src":"895:0:5"},"scope":369,"src":"834:62:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":333,"nodeType":"StructuredDocumentation","src":"902:136:5","text":" @notice Set the base URI\n @dev Can be set to empty\n @param baseURI Base URI to use to build the token URI"},"functionSelector":"55f804b3","id":338,"implemented":false,"kind":"function","modifiers":[],"name":"setBaseURI","nodeType":"FunctionDefinition","parameters":{"id":336,"nodeType":"ParameterList","parameters":[{"constant":false,"id":335,"mutability":"mutable","name":"baseURI","nodeType":"VariableDeclaration","scope":338,"src":"1063:21:5","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":334,"name":"string","nodeType":"ElementaryTypeName","src":"1063:6:5","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1062:23:5"},"returnParameters":{"id":337,"nodeType":"ParameterList","parameters":[],"src":"1094:0:5"},"scope":369,"src":"1043:52:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":339,"nodeType":"StructuredDocumentation","src":"1123:225:5","text":" @notice Mint `tokenId` and transfers it to `to`\n @dev `tokenId` must not exist and `to` cannot be the zero address\n @param to Address receiving the minted NFT\n @param tokenId ID of the NFT"},"functionSelector":"40c10f19","id":346,"implemented":false,"kind":"function","modifiers":[],"name":"mint","nodeType":"FunctionDefinition","parameters":{"id":344,"nodeType":"ParameterList","parameters":[{"constant":false,"id":341,"mutability":"mutable","name":"to","nodeType":"VariableDeclaration","scope":346,"src":"1367:10:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":340,"name":"address","nodeType":"ElementaryTypeName","src":"1367:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":343,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":346,"src":"1379:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":342,"name":"uint256","nodeType":"ElementaryTypeName","src":"1379:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1366:29:5"},"returnParameters":{"id":345,"nodeType":"ParameterList","parameters":[],"src":"1404:0:5"},"scope":369,"src":"1353:52:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":347,"nodeType":"StructuredDocumentation","src":"1411:138:5","text":" @notice Burn `tokenId`\n @dev The approval is cleared when the token is burned\n @param tokenId ID of the NFT"},"functionSelector":"42966c68","id":352,"implemented":false,"kind":"function","modifiers":[],"name":"burn","nodeType":"FunctionDefinition","parameters":{"id":350,"nodeType":"ParameterList","parameters":[{"constant":false,"id":349,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":352,"src":"1568:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":348,"name":"uint256","nodeType":"ElementaryTypeName","src":"1568:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1567:17:5"},"returnParameters":{"id":351,"nodeType":"ParameterList","parameters":[],"src":"1593:0:5"},"scope":369,"src":"1554:40:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":353,"nodeType":"StructuredDocumentation","src":"1600:210:5","text":" @notice Set the metadata for a subgraph represented by `tokenId`\n @dev `tokenId` must exist\n @param tokenId ID of the NFT\n @param subgraphMetadata IPFS hash for the metadata"},"functionSelector":"398b28d2","id":360,"implemented":false,"kind":"function","modifiers":[],"name":"setSubgraphMetadata","nodeType":"FunctionDefinition","parameters":{"id":358,"nodeType":"ParameterList","parameters":[{"constant":false,"id":355,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":360,"src":"1844:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":354,"name":"uint256","nodeType":"ElementaryTypeName","src":"1844:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":357,"mutability":"mutable","name":"subgraphMetadata","nodeType":"VariableDeclaration","scope":360,"src":"1861:24:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":356,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1861:7:5","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1843:43:5"},"returnParameters":{"id":359,"nodeType":"ParameterList","parameters":[],"src":"1895:0:5"},"scope":369,"src":"1815:81:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":361,"nodeType":"StructuredDocumentation","src":"1902:165:5","text":" @notice Returns the Uniform Resource Identifier (URI) for `tokenId` token\n @param tokenId ID of the NFT\n @return The URI for the token"},"functionSelector":"c87b56dd","id":368,"implemented":false,"kind":"function","modifiers":[],"name":"tokenURI","nodeType":"FunctionDefinition","parameters":{"id":364,"nodeType":"ParameterList","parameters":[{"constant":false,"id":363,"mutability":"mutable","name":"tokenId","nodeType":"VariableDeclaration","scope":368,"src":"2090:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":362,"name":"uint256","nodeType":"ElementaryTypeName","src":"2090:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2089:17:5"},"returnParameters":{"id":367,"nodeType":"ParameterList","parameters":[{"constant":false,"id":366,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":368,"src":"2130:13:5","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":365,"name":"string","nodeType":"ElementaryTypeName","src":"2130:6:5","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2129:15:5"},"scope":369,"src":"2072:73:5","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":370,"src":"308:1839:5"}],"src":"46:2102:5"},"id":5},"contracts/contracts/l2/token/IL2GraphToken.sol":{"ast":{"absolutePath":"contracts/contracts/l2/token/IL2GraphToken.sol","exportedSymbols":{"IGraphToken":[539],"IL2GraphToken":[447]},"id":448,"license":"GPL-2.0-or-later","nodeType":"SourceUnit","nodes":[{"id":371,"literals":["solidity","^","0.7",".6","||","^","0.8",".0"],"nodeType":"PragmaDirective","src":"45:33:6"},{"absolutePath":"contracts/contracts/token/IGraphToken.sol","file":"../../token/IGraphToken.sol","id":373,"nodeType":"ImportDirective","scope":448,"sourceUnit":540,"src":"183:58:6","symbolAliases":[{"foreign":{"id":372,"name":"IGraphToken","nodeType":"Identifier","overloadedDeclarations":[],"src":"192:11:6","typeDescriptions":{}}}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":375,"name":"IGraphToken","nodeType":"UserDefinedTypeName","referencedDeclaration":539,"src":"434:11:6","typeDescriptions":{"typeIdentifier":"t_contract$_IGraphToken_$539","typeString":"contract IGraphToken"}},"id":376,"nodeType":"InheritanceSpecifier","src":"434:11:6"}],"contractDependencies":[167,539],"contractKind":"interface","documentation":{"id":374,"nodeType":"StructuredDocumentation","src":"243:163:6","text":" @title IL2GraphToken\n @author Edge & Node\n @notice Interface for the L2 Graph Token contract that extends IGraphToken with L2-specific functionality"},"fullyImplemented":false,"id":447,"linearizedBaseContracts":[447,539,167],"name":"IL2GraphToken","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"documentation":{"id":377,"nodeType":"StructuredDocumentation","src":"466:191:6","text":" @notice Emitted when tokens are minted through the bridge\n @param account The account that received the minted tokens\n @param amount The amount of tokens minted"},"id":383,"name":"BridgeMinted","nodeType":"EventDefinition","parameters":{"id":382,"nodeType":"ParameterList","parameters":[{"constant":false,"id":379,"indexed":true,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":383,"src":"681:23:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":378,"name":"address","nodeType":"ElementaryTypeName","src":"681:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":381,"indexed":false,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":383,"src":"706:14:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":380,"name":"uint256","nodeType":"ElementaryTypeName","src":"706:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"680:41:6"},"src":"662:60:6"},{"anonymous":false,"documentation":{"id":384,"nodeType":"StructuredDocumentation","src":"728:189:6","text":" @notice Emitted when tokens are burned through the bridge\n @param account The account from which tokens were burned\n @param amount The amount of tokens burned"},"id":390,"name":"BridgeBurned","nodeType":"EventDefinition","parameters":{"id":389,"nodeType":"ParameterList","parameters":[{"constant":false,"id":386,"indexed":true,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":390,"src":"941:23:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":385,"name":"address","nodeType":"ElementaryTypeName","src":"941:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":388,"indexed":false,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":390,"src":"966:14:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":387,"name":"uint256","nodeType":"ElementaryTypeName","src":"966:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"940:41:6"},"src":"922:60:6"},{"anonymous":false,"documentation":{"id":391,"nodeType":"StructuredDocumentation","src":"988:112:6","text":" @notice Emitted when the gateway address is set\n @param gateway The new gateway address"},"id":395,"name":"GatewaySet","nodeType":"EventDefinition","parameters":{"id":394,"nodeType":"ParameterList","parameters":[{"constant":false,"id":393,"indexed":false,"mutability":"mutable","name":"gateway","nodeType":"VariableDeclaration","scope":395,"src":"1122:15:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":392,"name":"address","nodeType":"ElementaryTypeName","src":"1122:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1121:17:6"},"src":"1105:34:6"},{"anonymous":false,"documentation":{"id":396,"nodeType":"StructuredDocumentation","src":"1145:104:6","text":" @notice Emitted when the L1 address is set\n @param l1Address The new L1 address"},"id":400,"name":"L1AddressSet","nodeType":"EventDefinition","parameters":{"id":399,"nodeType":"ParameterList","parameters":[{"constant":false,"id":398,"indexed":false,"mutability":"mutable","name":"l1Address","nodeType":"VariableDeclaration","scope":400,"src":"1273:17:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":397,"name":"address","nodeType":"ElementaryTypeName","src":"1273:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1272:19:6"},"src":"1254:38:6"},{"documentation":{"id":401,"nodeType":"StructuredDocumentation","src":"1345:110:6","text":" @notice Get the gateway contract address\n @return The address of the gateway contract"},"functionSelector":"116191b6","id":406,"implemented":false,"kind":"function","modifiers":[],"name":"gateway","nodeType":"FunctionDefinition","parameters":{"id":402,"nodeType":"ParameterList","parameters":[],"src":"1476:2:6"},"returnParameters":{"id":405,"nodeType":"ParameterList","parameters":[{"constant":false,"id":404,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":406,"src":"1502:7:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":403,"name":"address","nodeType":"ElementaryTypeName","src":"1502:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1501:9:6"},"scope":447,"src":"1460:51:6","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":407,"nodeType":"StructuredDocumentation","src":"1517:100:6","text":" @notice Get the L1 contract address\n @return The address of the L1 contract"},"functionSelector":"c2eeeebd","id":412,"implemented":false,"kind":"function","modifiers":[],"name":"l1Address","nodeType":"FunctionDefinition","parameters":{"id":408,"nodeType":"ParameterList","parameters":[],"src":"1640:2:6"},"returnParameters":{"id":411,"nodeType":"ParameterList","parameters":[{"constant":false,"id":410,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":412,"src":"1666:7:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":409,"name":"address","nodeType":"ElementaryTypeName","src":"1666:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1665:9:6"},"scope":447,"src":"1622:53:6","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":413,"nodeType":"StructuredDocumentation","src":"1699:114:6","text":" @notice Initialize the L2 token contract\n @param owner The owner address for the contract"},"functionSelector":"c4d66de8","id":418,"implemented":false,"kind":"function","modifiers":[],"name":"initialize","nodeType":"FunctionDefinition","parameters":{"id":416,"nodeType":"ParameterList","parameters":[{"constant":false,"id":415,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":418,"src":"1838:13:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":414,"name":"address","nodeType":"ElementaryTypeName","src":"1838:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1837:15:6"},"returnParameters":{"id":417,"nodeType":"ParameterList","parameters":[],"src":"1861:0:6"},"scope":447,"src":"1818:44:6","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":419,"nodeType":"StructuredDocumentation","src":"1868:91:6","text":" @notice Set the gateway address.\n @param gw Address of the gateway"},"functionSelector":"90646b4a","id":424,"implemented":false,"kind":"function","modifiers":[],"name":"setGateway","nodeType":"FunctionDefinition","parameters":{"id":422,"nodeType":"ParameterList","parameters":[{"constant":false,"id":421,"mutability":"mutable","name":"gw","nodeType":"VariableDeclaration","scope":424,"src":"1984:10:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":420,"name":"address","nodeType":"ElementaryTypeName","src":"1984:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1983:12:6"},"returnParameters":{"id":423,"nodeType":"ParameterList","parameters":[],"src":"2004:0:6"},"scope":447,"src":"1964:41:6","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":425,"nodeType":"StructuredDocumentation","src":"2011:92:6","text":" @notice Set the L1 address.\n @param addr Address of the L1 contract"},"functionSelector":"ca52d7d7","id":430,"implemented":false,"kind":"function","modifiers":[],"name":"setL1Address","nodeType":"FunctionDefinition","parameters":{"id":428,"nodeType":"ParameterList","parameters":[{"constant":false,"id":427,"mutability":"mutable","name":"addr","nodeType":"VariableDeclaration","scope":430,"src":"2130:12:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":426,"name":"address","nodeType":"ElementaryTypeName","src":"2130:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2129:14:6"},"returnParameters":{"id":429,"nodeType":"ParameterList","parameters":[],"src":"2152:0:6"},"scope":447,"src":"2108:45:6","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":431,"nodeType":"StructuredDocumentation","src":"2159:155:6","text":" @notice Mint tokens for a bridge transfer.\n @param account Address to mint tokens to\n @param amount Amount of tokens to mint"},"functionSelector":"8c2a993e","id":438,"implemented":false,"kind":"function","modifiers":[],"name":"bridgeMint","nodeType":"FunctionDefinition","parameters":{"id":436,"nodeType":"ParameterList","parameters":[{"constant":false,"id":433,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":438,"src":"2339:15:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":432,"name":"address","nodeType":"ElementaryTypeName","src":"2339:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":435,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":438,"src":"2356:14:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":434,"name":"uint256","nodeType":"ElementaryTypeName","src":"2356:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2338:33:6"},"returnParameters":{"id":437,"nodeType":"ParameterList","parameters":[],"src":"2380:0:6"},"scope":447,"src":"2319:62:6","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":439,"nodeType":"StructuredDocumentation","src":"2387:157:6","text":" @notice Burn tokens for a bridge transfer.\n @param account Address to burn tokens from\n @param amount Amount of tokens to burn"},"functionSelector":"74f4f547","id":446,"implemented":false,"kind":"function","modifiers":[],"name":"bridgeBurn","nodeType":"FunctionDefinition","parameters":{"id":444,"nodeType":"ParameterList","parameters":[{"constant":false,"id":441,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":446,"src":"2569:15:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":440,"name":"address","nodeType":"ElementaryTypeName","src":"2569:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":443,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":446,"src":"2586:14:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":442,"name":"uint256","nodeType":"ElementaryTypeName","src":"2586:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2568:33:6"},"returnParameters":{"id":445,"nodeType":"ParameterList","parameters":[],"src":"2610:0:6"},"scope":447,"src":"2549:62:6","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":448,"src":"407:2206:6"}],"src":"45:2569:6"},"id":6},"contracts/contracts/token/IGraphToken.sol":{"ast":{"absolutePath":"contracts/contracts/token/IGraphToken.sol","exportedSymbols":{"IERC20":[167],"IGraphToken":[539]},"id":540,"license":"GPL-2.0-or-later","nodeType":"SourceUnit","nodes":[{"id":449,"literals":["solidity","^","0.7",".6","||","^","0.8",".0"],"nodeType":"PragmaDirective","src":"46:33:7"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","file":"@openzeppelin/contracts/token/ERC20/IERC20.sol","id":451,"nodeType":"ImportDirective","scope":540,"sourceUnit":168,"src":"164:72:7","symbolAliases":[{"foreign":{"id":450,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"src":"173:6:7","typeDescriptions":{}}}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":453,"name":"IERC20","nodeType":"UserDefinedTypeName","referencedDeclaration":167,"src":"452:6:7","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$167","typeString":"contract IERC20"}},"id":454,"nodeType":"InheritanceSpecifier","src":"452:6:7"}],"contractDependencies":[167],"contractKind":"interface","documentation":{"id":452,"nodeType":"StructuredDocumentation","src":"238:188:7","text":" @title IGraphToken\n @author Edge & Node\n @notice Interface for the Graph Token contract\n @dev Extends IERC20 with additional functionality for minting, burning, and permit"},"fullyImplemented":false,"id":539,"linearizedBaseContracts":[539,167],"name":"IGraphToken","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":455,"nodeType":"StructuredDocumentation","src":"493:115:7","text":" @notice Burns tokens from the caller's account\n @param amount The amount of tokens to burn"},"functionSelector":"42966c68","id":460,"implemented":false,"kind":"function","modifiers":[],"name":"burn","nodeType":"FunctionDefinition","parameters":{"id":458,"nodeType":"ParameterList","parameters":[{"constant":false,"id":457,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":460,"src":"627:14:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":456,"name":"uint256","nodeType":"ElementaryTypeName","src":"627:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"626:16:7"},"returnParameters":{"id":459,"nodeType":"ParameterList","parameters":[],"src":"651:0:7"},"scope":539,"src":"613:39:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":461,"nodeType":"StructuredDocumentation","src":"658:186:7","text":" @notice Burns tokens from a specified account (requires allowance)\n @param from The account to burn tokens from\n @param amount The amount of tokens to burn"},"functionSelector":"79cc6790","id":468,"implemented":false,"kind":"function","modifiers":[],"name":"burnFrom","nodeType":"FunctionDefinition","parameters":{"id":466,"nodeType":"ParameterList","parameters":[{"constant":false,"id":463,"mutability":"mutable","name":"from","nodeType":"VariableDeclaration","scope":468,"src":"867:12:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":462,"name":"address","nodeType":"ElementaryTypeName","src":"867:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":465,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":468,"src":"881:14:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":464,"name":"uint256","nodeType":"ElementaryTypeName","src":"881:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"866:30:7"},"returnParameters":{"id":467,"nodeType":"ParameterList","parameters":[],"src":"905:0:7"},"scope":539,"src":"849:57:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":469,"nodeType":"StructuredDocumentation","src":"912:218:7","text":" @notice Mints new tokens to a specified account\n @dev Only callable by accounts with minter role\n @param to The account to mint tokens to\n @param amount The amount of tokens to mint"},"functionSelector":"40c10f19","id":476,"implemented":false,"kind":"function","modifiers":[],"name":"mint","nodeType":"FunctionDefinition","parameters":{"id":474,"nodeType":"ParameterList","parameters":[{"constant":false,"id":471,"mutability":"mutable","name":"to","nodeType":"VariableDeclaration","scope":476,"src":"1149:10:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":470,"name":"address","nodeType":"ElementaryTypeName","src":"1149:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":473,"mutability":"mutable","name":"amount","nodeType":"VariableDeclaration","scope":476,"src":"1161:14:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":472,"name":"uint256","nodeType":"ElementaryTypeName","src":"1161:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1148:28:7"},"returnParameters":{"id":475,"nodeType":"ParameterList","parameters":[],"src":"1185:0:7"},"scope":539,"src":"1135:51:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":477,"nodeType":"StructuredDocumentation","src":"1217:177:7","text":" @notice Adds a new minter account\n @dev Only callable by accounts with appropriate permissions\n @param account The account to grant minter role to"},"functionSelector":"983b2d56","id":482,"implemented":false,"kind":"function","modifiers":[],"name":"addMinter","nodeType":"FunctionDefinition","parameters":{"id":480,"nodeType":"ParameterList","parameters":[{"constant":false,"id":479,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":482,"src":"1418:15:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":478,"name":"address","nodeType":"ElementaryTypeName","src":"1418:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1417:17:7"},"returnParameters":{"id":481,"nodeType":"ParameterList","parameters":[],"src":"1443:0:7"},"scope":539,"src":"1399:45:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":483,"nodeType":"StructuredDocumentation","src":"1450:190:7","text":" @notice Removes minter role from an account\n @dev Only callable by accounts with appropriate permissions\n @param account The account to revoke minter role from"},"functionSelector":"3092afd5","id":488,"implemented":false,"kind":"function","modifiers":[],"name":"removeMinter","nodeType":"FunctionDefinition","parameters":{"id":486,"nodeType":"ParameterList","parameters":[{"constant":false,"id":485,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":488,"src":"1667:15:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":484,"name":"address","nodeType":"ElementaryTypeName","src":"1667:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1666:17:7"},"returnParameters":{"id":487,"nodeType":"ParameterList","parameters":[],"src":"1692:0:7"},"scope":539,"src":"1645:48:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":489,"nodeType":"StructuredDocumentation","src":"1699:139:7","text":" @notice Renounces minter role for the caller\n @dev Allows a minter to voluntarily give up their minting privileges"},"functionSelector":"98650275","id":492,"implemented":false,"kind":"function","modifiers":[],"name":"renounceMinter","nodeType":"FunctionDefinition","parameters":{"id":490,"nodeType":"ParameterList","parameters":[],"src":"1866:2:7"},"returnParameters":{"id":491,"nodeType":"ParameterList","parameters":[],"src":"1877:0:7"},"scope":539,"src":"1843:35:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":493,"nodeType":"StructuredDocumentation","src":"1884:170:7","text":" @notice Checks if an account has minter role\n @param account The account to check\n @return True if the account is a minter, false otherwise"},"functionSelector":"aa271e1a","id":500,"implemented":false,"kind":"function","modifiers":[],"name":"isMinter","nodeType":"FunctionDefinition","parameters":{"id":496,"nodeType":"ParameterList","parameters":[{"constant":false,"id":495,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":500,"src":"2077:15:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":494,"name":"address","nodeType":"ElementaryTypeName","src":"2077:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2076:17:7"},"returnParameters":{"id":499,"nodeType":"ParameterList","parameters":[{"constant":false,"id":498,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":500,"src":"2117:4:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":497,"name":"bool","nodeType":"ElementaryTypeName","src":"2117:4:7","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2116:6:7"},"scope":539,"src":"2059:64:7","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":501,"nodeType":"StructuredDocumentation","src":"2150:417:7","text":" @notice Permit the spender to spend tokens on behalf of the owner.\n @param owner Address of the token owner\n @param spender Address of the token spender\n @param value Amount of tokens to spend\n @param deadline Expiration timestamp for the permit\n @param v Recovery byte of the signature\n @param r R value of the signature\n @param s S value of the signature"},"functionSelector":"d505accf","id":518,"implemented":false,"kind":"function","modifiers":[],"name":"permit","nodeType":"FunctionDefinition","parameters":{"id":516,"nodeType":"ParameterList","parameters":[{"constant":false,"id":503,"mutability":"mutable","name":"owner","nodeType":"VariableDeclaration","scope":518,"src":"2597:13:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":502,"name":"address","nodeType":"ElementaryTypeName","src":"2597:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":505,"mutability":"mutable","name":"spender","nodeType":"VariableDeclaration","scope":518,"src":"2620:15:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":504,"name":"address","nodeType":"ElementaryTypeName","src":"2620:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":507,"mutability":"mutable","name":"value","nodeType":"VariableDeclaration","scope":518,"src":"2645:13:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":506,"name":"uint256","nodeType":"ElementaryTypeName","src":"2645:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":509,"mutability":"mutable","name":"deadline","nodeType":"VariableDeclaration","scope":518,"src":"2668:16:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":508,"name":"uint256","nodeType":"ElementaryTypeName","src":"2668:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":511,"mutability":"mutable","name":"v","nodeType":"VariableDeclaration","scope":518,"src":"2694:7:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":510,"name":"uint8","nodeType":"ElementaryTypeName","src":"2694:5:7","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":513,"mutability":"mutable","name":"r","nodeType":"VariableDeclaration","scope":518,"src":"2711:9:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":512,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2711:7:7","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":515,"mutability":"mutable","name":"s","nodeType":"VariableDeclaration","scope":518,"src":"2730:9:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":514,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2730:7:7","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2587:158:7"},"returnParameters":{"id":517,"nodeType":"ParameterList","parameters":[],"src":"2754:0:7"},"scope":539,"src":"2572:183:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":519,"nodeType":"StructuredDocumentation","src":"2785:251:7","text":" @notice Increases the allowance granted to a spender\n @param spender The account whose allowance will be increased\n @param addedValue The amount to increase the allowance by\n @return True if the operation succeeded"},"functionSelector":"39509351","id":528,"implemented":false,"kind":"function","modifiers":[],"name":"increaseAllowance","nodeType":"FunctionDefinition","parameters":{"id":524,"nodeType":"ParameterList","parameters":[{"constant":false,"id":521,"mutability":"mutable","name":"spender","nodeType":"VariableDeclaration","scope":528,"src":"3068:15:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":520,"name":"address","nodeType":"ElementaryTypeName","src":"3068:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":523,"mutability":"mutable","name":"addedValue","nodeType":"VariableDeclaration","scope":528,"src":"3085:18:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":522,"name":"uint256","nodeType":"ElementaryTypeName","src":"3085:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3067:37:7"},"returnParameters":{"id":527,"nodeType":"ParameterList","parameters":[{"constant":false,"id":526,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":528,"src":"3123:4:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":525,"name":"bool","nodeType":"ElementaryTypeName","src":"3123:4:7","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3122:6:7"},"scope":539,"src":"3041:88:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":529,"nodeType":"StructuredDocumentation","src":"3135:256:7","text":" @notice Decreases the allowance granted to a spender\n @param spender The account whose allowance will be decreased\n @param subtractedValue The amount to decrease the allowance by\n @return True if the operation succeeded"},"functionSelector":"a457c2d7","id":538,"implemented":false,"kind":"function","modifiers":[],"name":"decreaseAllowance","nodeType":"FunctionDefinition","parameters":{"id":534,"nodeType":"ParameterList","parameters":[{"constant":false,"id":531,"mutability":"mutable","name":"spender","nodeType":"VariableDeclaration","scope":538,"src":"3423:15:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":530,"name":"address","nodeType":"ElementaryTypeName","src":"3423:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":533,"mutability":"mutable","name":"subtractedValue","nodeType":"VariableDeclaration","scope":538,"src":"3440:23:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":532,"name":"uint256","nodeType":"ElementaryTypeName","src":"3440:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3422:42:7"},"returnParameters":{"id":537,"nodeType":"ParameterList","parameters":[{"constant":false,"id":536,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":538,"src":"3483:4:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":535,"name":"bool","nodeType":"ElementaryTypeName","src":"3483:4:7","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3482:6:7"},"scope":539,"src":"3396:93:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":540,"src":"427:3064:7"}],"src":"46:3446:7"},"id":7}},"contracts":{"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol":{"IERC20Upgradeable":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC20 standard as defined in the EIP.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"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.\"},\"approve(address,uint256)\":{\"details\":\"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.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"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.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":\"IERC20Upgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2cbeb499bad52667b96dd7df8e9b1f583e8c07afaba0018a75e5b7ff6e777173\",\"dweb:/ipfs/QmPLJnuhEcWnpmhMHKsiuVHVxMwb5k6idYyjajbrtZLz5B\"]}},\"version\":1}"}},"@openzeppelin/contracts/introspection/IERC165.sol":{"IERC165":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/introspection/IERC165.sol\":\"IERC165\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/introspection/IERC165.sol\":{\"keccak256\":\"0xf70bc25d981e4ec9673a995ad2995d5d493ea188d3d8f388bba9c227ce09fb82\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd970f51e3a77790c2f02b5b1759827c3b897c3d98c407b3631e8af32e3dc93c\",\"dweb:/ipfs/QmPF85Amgbqjk3SNZKsPCsqCw8JfwYEPMnnhvMJUyX58je\"]}},\"version\":1}"}},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"IERC20":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC20 standard as defined in the EIP.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"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.\"},\"approve(address,uint256)\":{\"details\":\"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.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"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.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":\"IERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x5f02220344881ce43204ae4a6281145a67bc52c2bb1290a791857df3d19d78f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://24427744bd3e6cb73c17010119af12a318289c0253a4d9acb8576c9fb3797b08\",\"dweb:/ipfs/QmTLDqpKRBuxGxRAmjgXt9AkXyACW3MtKzi7PYjm5iMfGC\"]}},\"version\":1}"}},"@openzeppelin/contracts/token/ERC721/IERC721.sol":{"IERC721":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","supportsInterface(bytes4)":"01ffc9a7","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Required interface of an ERC721 compliant contract.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. The approval is cleared when the token is transferred. Only a single account can be approved at a time, so approving the zero address clears previous approvals. Requirements: - The caller must own the token or be an approved operator. - `tokenId` must exist. Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in ``owner``'s account.\"},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}\"},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients are aware of the ERC721 protocol to prevent tokens from being forever locked. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` token from `from` to `to`. WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":\"IERC721\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/introspection/IERC165.sol\":{\"keccak256\":\"0xf70bc25d981e4ec9673a995ad2995d5d493ea188d3d8f388bba9c227ce09fb82\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd970f51e3a77790c2f02b5b1759827c3b897c3d98c407b3631e8af32e3dc93c\",\"dweb:/ipfs/QmPF85Amgbqjk3SNZKsPCsqCw8JfwYEPMnnhvMJUyX58je\"]},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x2d99a0deb6648c34fbc66d6ac4a2d64798d7a5321b45624f6736fadc63da1962\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2dcdce5ede1e5e650d174ec0b35be7d47b6a50f30bc895ef0d9e59fb75052e45\",\"dweb:/ipfs/QmQ2XFsDLTYqfEdw7pYzHiGtFRY11yQm4b6ynYgKqDxeB8\"]}},\"version\":1}"}},"contracts/contracts/curation/IGraphCurationToken.sol":{"IGraphCurationToken":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","burnFrom(address,uint256)":"79cc6790","initialize(address)":"c4d66de8","mint(address,uint256)":"40c10f19","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Edge & Node\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"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.\"},\"approve(address,uint256)\":{\"details\":\"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.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"burnFrom(address,uint256)\":{\"params\":{\"account\":\"Address from where tokens will be burned\",\"amount\":\"Amount of tokens to burn\"}},\"initialize(address)\":{\"params\":{\"owner\":\"Address of the contract issuing this token\"}},\"mint(address,uint256)\":{\"params\":{\"amount\":\"Amount of tokens to mint\",\"to\":\"Address to send the newly minted tokens\"}},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"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.\"}},\"title\":\"Graph Curation Token Interface\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"burnFrom(address,uint256)\":{\"notice\":\"Burn tokens from an address.\"},\"initialize(address)\":{\"notice\":\"Graph Curation Token Contract initializer.\"},\"mint(address,uint256)\":{\"notice\":\"Mint new tokens.\"}},\"notice\":\"Interface for curation tokens that represent shares in subgraph curation pools\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/contracts/curation/IGraphCurationToken.sol\":\"IGraphCurationToken\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2cbeb499bad52667b96dd7df8e9b1f583e8c07afaba0018a75e5b7ff6e777173\",\"dweb:/ipfs/QmPLJnuhEcWnpmhMHKsiuVHVxMwb5k6idYyjajbrtZLz5B\"]},\"contracts/contracts/curation/IGraphCurationToken.sol\":{\"keccak256\":\"0x4326e0a2608248daf35aa0992925050f95457fdea9fb9ce0c2bfed2b55682daf\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://63e286539b71e97666c765c913ea489742e18050f6fa29c612a4f7513cd837b7\",\"dweb:/ipfs/QmXkuNqNQ8niKath4LA1qgvPGVgpaudZYLPA3G88pALvM3\"]}},\"version\":1}"}},"contracts/contracts/discovery/ISubgraphNFT.sol":{"ISubgraphNFT":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"subgraphMetadata","type":"bytes32"}],"name":"setSubgraphMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenDescriptor","type":"address"}],"name":"setTokenDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","burn(uint256)":"42966c68","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","mint(address,uint256)":"40c10f19","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setBaseURI(string)":"55f804b3","setMinter(address)":"fca3b5aa","setSubgraphMetadata(uint256,bytes32)":"398b28d2","setTokenDescriptor(address)":"b6dc7ea3","supportsInterface(bytes4)":"01ffc9a7","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"}],\"name\":\"setBaseURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"setMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphMetadata\",\"type\":\"bytes32\"}],\"name\":\"setSubgraphMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenDescriptor\",\"type\":\"address\"}],\"name\":\"setTokenDescriptor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Edge & Node\",\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. The approval is cleared when the token is transferred. Only a single account can be approved at a time, so approving the zero address clears previous approvals. Requirements: - The caller must own the token or be an approved operator. - `tokenId` must exist. Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in ``owner``'s account.\"},\"burn(uint256)\":{\"details\":\"The approval is cleared when the token is burned\",\"params\":{\"tokenId\":\"ID of the NFT\"}},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}\"},\"mint(address,uint256)\":{\"details\":\"`tokenId` must not exist and `to` cannot be the zero address\",\"params\":{\"to\":\"Address receiving the minted NFT\",\"tokenId\":\"ID of the NFT\"}},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients are aware of the ERC721 protocol to prevent tokens from being forever locked. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"setBaseURI(string)\":{\"details\":\"Can be set to empty\",\"params\":{\"baseURI\":\"Base URI to use to build the token URI\"}},\"setMinter(address)\":{\"details\":\"Minter can mint, burn and update the metadata\",\"params\":{\"minter\":\"Address of the allowed minter\"}},\"setSubgraphMetadata(uint256,bytes32)\":{\"details\":\"`tokenId` must exist\",\"params\":{\"subgraphMetadata\":\"IPFS hash for the metadata\",\"tokenId\":\"ID of the NFT\"}},\"setTokenDescriptor(address)\":{\"details\":\"Token descriptor can be zero. If set, it must be a contract\",\"params\":{\"tokenDescriptor\":\"Address of the contract that creates the NFT token URI\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"tokenURI(uint256)\":{\"params\":{\"tokenId\":\"ID of the NFT\"},\"returns\":{\"_0\":\"The URI for the token\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` token from `from` to `to`. WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"}},\"title\":\"Subgraph NFT Interface\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"burn(uint256)\":{\"notice\":\"Burn `tokenId`\"},\"mint(address,uint256)\":{\"notice\":\"Mint `tokenId` and transfers it to `to`\"},\"setBaseURI(string)\":{\"notice\":\"Set the base URI\"},\"setMinter(address)\":{\"notice\":\"Set the minter allowed to perform actions on the NFT\"},\"setSubgraphMetadata(uint256,bytes32)\":{\"notice\":\"Set the metadata for a subgraph represented by `tokenId`\"},\"setTokenDescriptor(address)\":{\"notice\":\"Set the token descriptor contract\"},\"tokenURI(uint256)\":{\"notice\":\"Returns the Uniform Resource Identifier (URI) for `tokenId` token\"}},\"notice\":\"Interface for the Subgraph NFT contract that represents subgraph ownership\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/contracts/discovery/ISubgraphNFT.sol\":\"ISubgraphNFT\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/introspection/IERC165.sol\":{\"keccak256\":\"0xf70bc25d981e4ec9673a995ad2995d5d493ea188d3d8f388bba9c227ce09fb82\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd970f51e3a77790c2f02b5b1759827c3b897c3d98c407b3631e8af32e3dc93c\",\"dweb:/ipfs/QmPF85Amgbqjk3SNZKsPCsqCw8JfwYEPMnnhvMJUyX58je\"]},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x2d99a0deb6648c34fbc66d6ac4a2d64798d7a5321b45624f6736fadc63da1962\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2dcdce5ede1e5e650d174ec0b35be7d47b6a50f30bc895ef0d9e59fb75052e45\",\"dweb:/ipfs/QmQ2XFsDLTYqfEdw7pYzHiGtFRY11yQm4b6ynYgKqDxeB8\"]},\"contracts/contracts/discovery/ISubgraphNFT.sol\":{\"keccak256\":\"0xb7c794382a86260d1f9736de6c9724cabb87fa310245f56d8a9bc5a442ebd814\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d629812f454f878ce4467163ada6d2c83038416d6f2e6814e84791fbd48fc68c\",\"dweb:/ipfs/QmVjHgDuaAekfTFTXbomqY7obMpnfVuKtPimonybNpBHTJ\"]}},\"version\":1}"}},"contracts/contracts/l2/token/IL2GraphToken.sol":{"IL2GraphToken":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgeBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgeMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gateway","type":"address"}],"name":"GatewaySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"l1Address","type":"address"}],"name":"L1AddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bridgeBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bridgeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gateway","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gw","type":"address"}],"name":"setGateway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setL1Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"addMinter(address)":"983b2d56","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","bridgeBurn(address,uint256)":"74f4f547","bridgeMint(address,uint256)":"8c2a993e","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790","decreaseAllowance(address,uint256)":"a457c2d7","gateway()":"116191b6","increaseAllowance(address,uint256)":"39509351","initialize(address)":"c4d66de8","isMinter(address)":"aa271e1a","l1Address()":"c2eeeebd","mint(address,uint256)":"40c10f19","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","removeMinter(address)":"3092afd5","renounceMinter()":"98650275","setGateway(address)":"90646b4a","setL1Address(address)":"ca52d7d7","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BridgeBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BridgeMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"gateway\",\"type\":\"address\"}],\"name\":\"GatewaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"l1Address\",\"type\":\"address\"}],\"name\":\"L1AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"addMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"bridgeBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"bridgeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"removeMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"gw\",\"type\":\"address\"}],\"name\":\"setGateway\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"setL1Address\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Edge & Node\",\"events\":{\"BridgeBurned(address,uint256)\":{\"params\":{\"account\":\"The account from which tokens were burned\",\"amount\":\"The amount of tokens burned\"}},\"BridgeMinted(address,uint256)\":{\"params\":{\"account\":\"The account that received the minted tokens\",\"amount\":\"The amount of tokens minted\"}},\"GatewaySet(address)\":{\"params\":{\"gateway\":\"The new gateway address\"}},\"L1AddressSet(address)\":{\"params\":{\"l1Address\":\"The new L1 address\"}}},\"kind\":\"dev\",\"methods\":{\"addMinter(address)\":{\"details\":\"Only callable by accounts with appropriate permissions\",\"params\":{\"account\":\"The account to grant minter role to\"}},\"allowance(address,address)\":{\"details\":\"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.\"},\"approve(address,uint256)\":{\"details\":\"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.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"bridgeBurn(address,uint256)\":{\"params\":{\"account\":\"Address to burn tokens from\",\"amount\":\"Amount of tokens to burn\"}},\"bridgeMint(address,uint256)\":{\"params\":{\"account\":\"Address to mint tokens to\",\"amount\":\"Amount of tokens to mint\"}},\"burn(uint256)\":{\"params\":{\"amount\":\"The amount of tokens to burn\"}},\"burnFrom(address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to burn\",\"from\":\"The account to burn tokens from\"}},\"decreaseAllowance(address,uint256)\":{\"params\":{\"spender\":\"The account whose allowance will be decreased\",\"subtractedValue\":\"The amount to decrease the allowance by\"},\"returns\":{\"_0\":\"True if the operation succeeded\"}},\"gateway()\":{\"returns\":{\"_0\":\"The address of the gateway contract\"}},\"increaseAllowance(address,uint256)\":{\"params\":{\"addedValue\":\"The amount to increase the allowance by\",\"spender\":\"The account whose allowance will be increased\"},\"returns\":{\"_0\":\"True if the operation succeeded\"}},\"initialize(address)\":{\"params\":{\"owner\":\"The owner address for the contract\"}},\"isMinter(address)\":{\"params\":{\"account\":\"The account to check\"},\"returns\":{\"_0\":\"True if the account is a minter, false otherwise\"}},\"l1Address()\":{\"returns\":{\"_0\":\"The address of the L1 contract\"}},\"mint(address,uint256)\":{\"details\":\"Only callable by accounts with minter role\",\"params\":{\"amount\":\"The amount of tokens to mint\",\"to\":\"The account to mint tokens to\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"deadline\":\"Expiration timestamp for the permit\",\"owner\":\"Address of the token owner\",\"r\":\"R value of the signature\",\"s\":\"S value of the signature\",\"spender\":\"Address of the token spender\",\"v\":\"Recovery byte of the signature\",\"value\":\"Amount of tokens to spend\"}},\"removeMinter(address)\":{\"details\":\"Only callable by accounts with appropriate permissions\",\"params\":{\"account\":\"The account to revoke minter role from\"}},\"renounceMinter()\":{\"details\":\"Allows a minter to voluntarily give up their minting privileges\"},\"setGateway(address)\":{\"params\":{\"gw\":\"Address of the gateway\"}},\"setL1Address(address)\":{\"params\":{\"addr\":\"Address of the L1 contract\"}},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"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.\"}},\"title\":\"IL2GraphToken\",\"version\":1},\"userdoc\":{\"events\":{\"BridgeBurned(address,uint256)\":{\"notice\":\"Emitted when tokens are burned through the bridge\"},\"BridgeMinted(address,uint256)\":{\"notice\":\"Emitted when tokens are minted through the bridge\"},\"GatewaySet(address)\":{\"notice\":\"Emitted when the gateway address is set\"},\"L1AddressSet(address)\":{\"notice\":\"Emitted when the L1 address is set\"}},\"kind\":\"user\",\"methods\":{\"addMinter(address)\":{\"notice\":\"Adds a new minter account\"},\"bridgeBurn(address,uint256)\":{\"notice\":\"Burn tokens for a bridge transfer.\"},\"bridgeMint(address,uint256)\":{\"notice\":\"Mint tokens for a bridge transfer.\"},\"burn(uint256)\":{\"notice\":\"Burns tokens from the caller's account\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns tokens from a specified account (requires allowance)\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to a spender\"},\"gateway()\":{\"notice\":\"Get the gateway contract address\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to a spender\"},\"initialize(address)\":{\"notice\":\"Initialize the L2 token contract\"},\"isMinter(address)\":{\"notice\":\"Checks if an account has minter role\"},\"l1Address()\":{\"notice\":\"Get the L1 contract address\"},\"mint(address,uint256)\":{\"notice\":\"Mints new tokens to a specified account\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Permit the spender to spend tokens on behalf of the owner.\"},\"removeMinter(address)\":{\"notice\":\"Removes minter role from an account\"},\"renounceMinter()\":{\"notice\":\"Renounces minter role for the caller\"},\"setGateway(address)\":{\"notice\":\"Set the gateway address.\"},\"setL1Address(address)\":{\"notice\":\"Set the L1 address.\"}},\"notice\":\"Interface for the L2 Graph Token contract that extends IGraphToken with L2-specific functionality\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/contracts/l2/token/IL2GraphToken.sol\":\"IL2GraphToken\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x5f02220344881ce43204ae4a6281145a67bc52c2bb1290a791857df3d19d78f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://24427744bd3e6cb73c17010119af12a318289c0253a4d9acb8576c9fb3797b08\",\"dweb:/ipfs/QmTLDqpKRBuxGxRAmjgXt9AkXyACW3MtKzi7PYjm5iMfGC\"]},\"contracts/contracts/l2/token/IL2GraphToken.sol\":{\"keccak256\":\"0x105282127de09881acb604e19b71be3dd34b5a6ade0abc7c1710e7ef1b239a63\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cd642624f2916d8df0146f9e63cc63920e8997962d72eadf72ef277ef77fe62\",\"dweb:/ipfs/QmaGNpbzWtiPydeY2mQ9yu7sDL4keYZmvLk7nsSwhRcCre\"]},\"contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x324ea4bd2473a62483d92675fd7ff5b6d8fedb1eecdba53f9c51fa957df21f8f\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a56fcd63e7f29de8d943c1b79fa33874938473473afaf4b60f611197a5fcf4f2\",\"dweb:/ipfs/QmYB9JPwLcqg7veN7D5BNc7hCeLiz6y5JDUQQpooTfLqsv\"]}},\"version\":1}"}},"contracts/contracts/token/IGraphToken.sol":{"IGraphToken":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"addMinter(address)":"983b2d56","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790","decreaseAllowance(address,uint256)":"a457c2d7","increaseAllowance(address,uint256)":"39509351","isMinter(address)":"aa271e1a","mint(address,uint256)":"40c10f19","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","removeMinter(address)":"3092afd5","renounceMinter()":"98650275","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"addMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"removeMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Edge & Node\",\"details\":\"Extends IERC20 with additional functionality for minting, burning, and permit\",\"kind\":\"dev\",\"methods\":{\"addMinter(address)\":{\"details\":\"Only callable by accounts with appropriate permissions\",\"params\":{\"account\":\"The account to grant minter role to\"}},\"allowance(address,address)\":{\"details\":\"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.\"},\"approve(address,uint256)\":{\"details\":\"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.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"burn(uint256)\":{\"params\":{\"amount\":\"The amount of tokens to burn\"}},\"burnFrom(address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to burn\",\"from\":\"The account to burn tokens from\"}},\"decreaseAllowance(address,uint256)\":{\"params\":{\"spender\":\"The account whose allowance will be decreased\",\"subtractedValue\":\"The amount to decrease the allowance by\"},\"returns\":{\"_0\":\"True if the operation succeeded\"}},\"increaseAllowance(address,uint256)\":{\"params\":{\"addedValue\":\"The amount to increase the allowance by\",\"spender\":\"The account whose allowance will be increased\"},\"returns\":{\"_0\":\"True if the operation succeeded\"}},\"isMinter(address)\":{\"params\":{\"account\":\"The account to check\"},\"returns\":{\"_0\":\"True if the account is a minter, false otherwise\"}},\"mint(address,uint256)\":{\"details\":\"Only callable by accounts with minter role\",\"params\":{\"amount\":\"The amount of tokens to mint\",\"to\":\"The account to mint tokens to\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"deadline\":\"Expiration timestamp for the permit\",\"owner\":\"Address of the token owner\",\"r\":\"R value of the signature\",\"s\":\"S value of the signature\",\"spender\":\"Address of the token spender\",\"v\":\"Recovery byte of the signature\",\"value\":\"Amount of tokens to spend\"}},\"removeMinter(address)\":{\"details\":\"Only callable by accounts with appropriate permissions\",\"params\":{\"account\":\"The account to revoke minter role from\"}},\"renounceMinter()\":{\"details\":\"Allows a minter to voluntarily give up their minting privileges\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"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.\"}},\"title\":\"IGraphToken\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addMinter(address)\":{\"notice\":\"Adds a new minter account\"},\"burn(uint256)\":{\"notice\":\"Burns tokens from the caller's account\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns tokens from a specified account (requires allowance)\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to a spender\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to a spender\"},\"isMinter(address)\":{\"notice\":\"Checks if an account has minter role\"},\"mint(address,uint256)\":{\"notice\":\"Mints new tokens to a specified account\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Permit the spender to spend tokens on behalf of the owner.\"},\"removeMinter(address)\":{\"notice\":\"Removes minter role from an account\"},\"renounceMinter()\":{\"notice\":\"Renounces minter role for the caller\"}},\"notice\":\"Interface for the Graph Token contract\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/contracts/token/IGraphToken.sol\":\"IGraphToken\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x5f02220344881ce43204ae4a6281145a67bc52c2bb1290a791857df3d19d78f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://24427744bd3e6cb73c17010119af12a318289c0253a4d9acb8576c9fb3797b08\",\"dweb:/ipfs/QmTLDqpKRBuxGxRAmjgXt9AkXyACW3MtKzi7PYjm5iMfGC\"]},\"contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x324ea4bd2473a62483d92675fd7ff5b6d8fedb1eecdba53f9c51fa957df21f8f\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a56fcd63e7f29de8d943c1b79fa33874938473473afaf4b60f611197a5fcf4f2\",\"dweb:/ipfs/QmYB9JPwLcqg7veN7D5BNc7hCeLiz6y5JDUQQpooTfLqsv\"]}},\"version\":1}"}}}}}