{
  "compiler": {
    "version": "0.8.30+commit.73712a01"
  },
  "language": "Solidity",
  "output": {
    "abi": [
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "priceFeed_",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "token_",
            "type": "address"
          },
          {
            "internalType": "address payable",
            "name": "wallet_",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "usdRate_",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "vestingEndDate_",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "vestingVault_",
            "type": "address"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "constructor"
      },
      {
        "inputs": [],
        "type": "error",
        "name": "AccessControlBadConfirmation"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "account",
            "type": "address"
          },
          {
            "internalType": "bytes32",
            "name": "neededRole",
            "type": "bytes32"
          }
        ],
        "type": "error",
        "name": "AccessControlUnauthorizedAccount"
      },
      {
        "inputs": [],
        "type": "error",
        "name": "EnforcedPause"
      },
      {
        "inputs": [],
        "type": "error",
        "name": "ExpectedPause"
      },
      {
        "inputs": [],
        "type": "error",
        "name": "ReentrancyGuardReentrantCall"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "account",
            "type": "address",
            "indexed": false
          }
        ],
        "type": "event",
        "name": "Paused",
        "anonymous": false
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "role",
            "type": "bytes32",
            "indexed": true
          },
          {
            "internalType": "bytes32",
            "name": "previousAdminRole",
            "type": "bytes32",
            "indexed": true
          },
          {
            "internalType": "bytes32",
            "name": "newAdminRole",
            "type": "bytes32",
            "indexed": true
          }
        ],
        "type": "event",
        "name": "RoleAdminChanged",
        "anonymous": false
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "role",
            "type": "bytes32",
            "indexed": true
          },
          {
            "internalType": "address",
            "name": "account",
            "type": "address",
            "indexed": true
          },
          {
            "internalType": "address",
            "name": "sender",
            "type": "address",
            "indexed": true
          }
        ],
        "type": "event",
        "name": "RoleGranted",
        "anonymous": false
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "role",
            "type": "bytes32",
            "indexed": true
          },
          {
            "internalType": "address",
            "name": "account",
            "type": "address",
            "indexed": true
          },
          {
            "internalType": "address",
            "name": "sender",
            "type": "address",
            "indexed": true
          }
        ],
        "type": "event",
        "name": "RoleRevoked",
        "anonymous": false
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "purchaser",
            "type": "address",
            "indexed": true
          },
          {
            "internalType": "address",
            "name": "beneficiary",
            "type": "address",
            "indexed": true
          },
          {
            "internalType": "uint256",
            "name": "value",
            "type": "uint256",
            "indexed": false
          },
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256",
            "indexed": false
          }
        ],
        "type": "event",
        "name": "TokensPurchased",
        "anonymous": false
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "account",
            "type": "address",
            "indexed": false
          }
        ],
        "type": "event",
        "name": "Unpaused",
        "anonymous": false
      },
      {
        "inputs": [],
        "stateMutability": "payable",
        "type": "fallback"
      },
      {
        "inputs": [],
        "stateMutability": "view",
        "type": "function",
        "name": "DEFAULT_ADMIN_ROLE",
        "outputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "type": "bytes32"
          }
        ]
      },
      {
        "inputs": [],
        "stateMutability": "view",
        "type": "function",
        "name": "WHITELISTED_ROLE",
        "outputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "type": "bytes32"
          }
        ]
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "beneficiary",
            "type": "address"
          }
        ],
        "stateMutability": "payable",
        "type": "function",
        "name": "buyTokens"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "beneficiary",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "tokenAmount",
            "type": "uint256"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function",
        "name": "externalBuyTokens"
      },
      {
        "inputs": [],
        "stateMutability": "view",
        "type": "function",
        "name": "fundsRaised",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ]
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "role",
            "type": "bytes32"
          }
        ],
        "stateMutability": "view",
        "type": "function",
        "name": "getRoleAdmin",
        "outputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "type": "bytes32"
          }
        ]
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "weiAmount",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function",
        "name": "getTokenAmount",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ]
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "tokenAmount",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function",
        "name": "getWeiAmount",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ]
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "role",
            "type": "bytes32"
          },
          {
            "internalType": "address",
            "name": "account",
            "type": "address"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function",
        "name": "grantRole"
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "role",
            "type": "bytes32"
          },
          {
            "internalType": "address",
            "name": "account",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function",
        "name": "hasRole",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ]
      },
      {
        "inputs": [],
        "stateMutability": "nonpayable",
        "type": "function",
        "name": "pause"
      },
      {
        "inputs": [],
        "stateMutability": "view",
        "type": "function",
        "name": "paused",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ]
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "role",
            "type": "bytes32"
          },
          {
            "internalType": "address",
            "name": "callerConfirmation",
            "type": "address"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function",
        "name": "renounceRole"
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "role",
            "type": "bytes32"
          },
          {
            "internalType": "address",
            "name": "account",
            "type": "address"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function",
        "name": "revokeRole"
      },
      {
        "inputs": [
          {
            "internalType": "bytes4",
            "name": "interfaceId",
            "type": "bytes4"
          }
        ],
        "stateMutability": "view",
        "type": "function",
        "name": "supportsInterface",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ]
      },
      {
        "inputs": [],
        "stateMutability": "view",
        "type": "function",
        "name": "token",
        "outputs": [
          {
            "internalType": "contract IERC20",
            "name": "",
            "type": "address"
          }
        ]
      },
      {
        "inputs": [],
        "stateMutability": "view",
        "type": "function",
        "name": "tokensAvailable",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ]
      },
      {
        "inputs": [],
        "stateMutability": "nonpayable",
        "type": "function",
        "name": "unpause"
      },
      {
        "inputs": [],
        "stateMutability": "view",
        "type": "function",
        "name": "wallet",
        "outputs": [
          {
            "internalType": "address payable",
            "name": "",
            "type": "address"
          }
        ]
      },
      {
        "inputs": [],
        "stateMutability": "payable",
        "type": "receive"
      }
    ],
    "devdoc": {
      "kind": "dev",
      "methods": {
        "buyTokens(address)": {
          "details": "low level token purchase This function has a non-reentrancy guard, so it shouldn't be called by another `nonReentrant` function.",
          "params": {
            "beneficiary": "Recipient of the token purchase"
          }
        },
        "externalBuyTokens(address,uint256)": {
          "details": "utility function to allow the owner to handle private and bitcoin buyers This function has a non-reentrancy guard, so it shouldn't be called by another `nonReentrant` function.",
          "params": {
            "beneficiary": "Recipient of the token purchase",
            "tokenAmount": "Number of tokens to be purchased"
          }
        },
        "fundsRaised()": {
          "returns": {
            "_0": "the amount of funds raised."
          }
        },
        "getRoleAdmin(bytes32)": {
          "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
        },
        "getTokenAmount(uint256)": {
          "details": "Converts the weiAmount into equivalent number of tokens",
          "params": {
            "weiAmount": "Value of wei for conversion"
          }
        },
        "getWeiAmount(uint256)": {
          "details": "Converts the tokenAmount into equivalent number of wei",
          "params": {
            "tokenAmount": "Number of tokens for convertion"
          }
        },
        "grantRole(bytes32,address)": {
          "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."
        },
        "hasRole(bytes32,address)": {
          "details": "Returns `true` if `account` has been granted `role`."
        },
        "pause()": {
          "details": "Triggers stopped state. Requirements: - The contract must not be paused. - The sender of the transaction must have the DEFAULT_ADMIN_ROLE"
        },
        "paused()": {
          "details": "Returns true if the contract is paused, and false otherwise."
        },
        "renounceRole(bytes32,address)": {
          "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."
        },
        "revokeRole(bytes32,address)": {
          "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."
        },
        "token()": {
          "returns": {
            "_0": "the address of the token being sold."
          }
        },
        "tokensAvailable()": {
          "returns": {
            "_0": "the amount tokens available to the crowdsale for selling."
          }
        },
        "unpause()": {
          "details": "Returns to normal state. Requirements: - The contract must be paused. - The sender of the transaction must have the DEFAULT_ADMIN_ROLE"
        },
        "wallet()": {
          "returns": {
            "_0": "the address where funds are collected."
          }
        }
      },
      "version": 1
    },
    "userdoc": {
      "kind": "user",
      "methods": {},
      "version": 1
    }
  },
  "settings": {
    "remappings": [
      "@openzeppelin/=node_modules/@openzeppelin/",
      "forge-std/=lib/forge-std/src/",
      "hardhat/=node_modules/hardhat/"
    ],
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "metadata": {
      "bytecodeHash": "ipfs"
    },
    "compilationTarget": {
      "contracts/ExampleCrowdSale.sol": "ExampleCrowdSale"
    },
    "evmVersion": "cancun",
    "libraries": {},
    "viaIR": true
  },
  "sources": {
    "contracts/ExampleCrowdSale.sol": {
      "keccak256": "0xe5a0e34725bd73ea710cab6c17941d1ab35047dc4bf532d30d06f8a19acd9bbb",
      "urls": [
        "bzz-raw://4436dd594f102b555a4f02aeab0b795e9e9ec302e3b998e04d2de0dc265994f1",
        "dweb:/ipfs/QmecLoA7j1gR5BcmYWJr8cgPDL8Mz6tSYjPS2RTyzjs92k"
      ],
      "license": "FSL-1.1-MIT"
    },
    "contracts/library/AggregatorV3Interface.sol": {
      "keccak256": "0x6fe9022adc0ea2fe59271183cd952e1679262f1c239583ecad824dbd25f723b8",
      "urls": [
        "bzz-raw://c7eb625f0943857cb5d4820d8b44918153fae0b6e6204debb4a0c3dd763f91de",
        "dweb:/ipfs/QmNz2mLb7X17sqf7EQmNai3bG9NqVw732M9ogyddeqgRuV"
      ],
      "license": "FSL-1.1-MIT"
    },
    "contracts/library/CrowdSale.sol": {
      "keccak256": "0x6daf7c8f3c38229eca479270cbbee2aec5090f1758941f9979faf6117af4787d",
      "urls": [
        "bzz-raw://0bfc8f658db29b8ad4055fe1f4bf5090e5a7043be3eda0d308e9d7ac943b147d",
        "dweb:/ipfs/QmNMGdx1tgoy8ZE4boqYsnXvBmaoGMqtquz16hP5JfrssD"
      ],
      "license": "FSL-1.1-MIT"
    },
    "contracts/library/ICrowdSale.sol": {
      "keccak256": "0xe5539638218e0e027b15b9c236cb9d2dcffcb0ea3ed79d8374e11d120d1b1d4d",
      "urls": [
        "bzz-raw://3600a70cc759026e923c594f69fd68d5ad3476fcfaa5945245ce08fe94b0a953",
        "dweb:/ipfs/QmRq9A3iei2J1ocWDoq1xL5xLdnSAgxfuktuC3XsFhFUqh"
      ],
      "license": "FSL-1.1-MIT"
    },
    "contracts/library/IVestingVault.sol": {
      "keccak256": "0xf3f074546fdb24b8d2889ffd7947b5134669f1eb47c4baf30abf4663f6d320d7",
      "urls": [
        "bzz-raw://e13d929241510074238c4d3797aeaa9a8f3bea58c9d8beab73c2a39583dcf56e",
        "dweb:/ipfs/QmNX2cSo1uxxuviE5SL8wUgMgC2DBrDEyZa8KVd9DipUAU"
      ],
      "license": "FSL-1.1-MIT"
    },
    "contracts/library/VestingVault.sol": {
      "keccak256": "0x0386c58188ed9a89f544a617e7b628210935857895b07549854a19e140a1b21c",
      "urls": [
        "bzz-raw://c2d8275e0105f4a6c134acb7057706b00c437e3b5e72185479024343346ab1ee",
        "dweb:/ipfs/QmegrKCswosuTqn2uizDBKmrMFboBN9ATcXPVcyLzbUpdR"
      ],
      "license": "FSL-1.1-MIT"
    },
    "node_modules/@openzeppelin/contracts/access/AccessControl.sol": {
      "keccak256": "0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af",
      "urls": [
        "bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c",
        "dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"
      ],
      "license": "MIT"
    },
    "node_modules/@openzeppelin/contracts/access/IAccessControl.sol": {
      "keccak256": "0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c",
      "urls": [
        "bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d",
        "dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"
      ],
      "license": "MIT"
    },
    "node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol": {
      "keccak256": "0x19fdfb0f3b89a230e7dbd1cf416f1a6b531a3ee5db4da483f946320fc74afc0e",
      "urls": [
        "bzz-raw://3490d794728f5bfecb46820431adaff71ba374141545ec20b650bb60353fac23",
        "dweb:/ipfs/QmPsfxjVpMcZbpE7BH93DzTpEaktESigEw4SmDzkXuJ4WR"
      ],
      "license": "MIT"
    },
    "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": {
      "keccak256": "0x86b7b71a6aedefdad89b607378eeab1dcc5389b9ea7d17346d08af01d7190994",
      "urls": [
        "bzz-raw://1dc2db8d94a21eac8efe03adf574c419b08536409b416057a2b5b95cb772c43c",
        "dweb:/ipfs/QmZfqJCKVU1ScuX2A7s8WZdQEaikwJbDH5JBrBdKTUT4Gu"
      ],
      "license": "MIT"
    },
    "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": {
      "keccak256": "0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2",
      "urls": [
        "bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303",
        "dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"
      ],
      "license": "MIT"
    },
    "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": {
      "keccak256": "0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f",
      "urls": [
        "bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e",
        "dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR"
      ],
      "license": "MIT"
    },
    "node_modules/@openzeppelin/contracts/utils/Context.sol": {
      "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2",
      "urls": [
        "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12",
        "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"
      ],
      "license": "MIT"
    },
    "node_modules/@openzeppelin/contracts/utils/Pausable.sol": {
      "keccak256": "0xdb484371dfbb848cb6f5d70464e9ac9b2900e4164ead76bbce4fef0b44bcc68f",
      "urls": [
        "bzz-raw://f9d6f6f6600a2bec622f699081b58350873b5e63ce05464d17d674a290bb8a7c",
        "dweb:/ipfs/QmQKVzSQY1PM3Bid4QhgVVZyx6B4Jx7XgaQzLKHj38vJz8"
      ],
      "license": "MIT"
    },
    "node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol": {
      "keccak256": "0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3",
      "urls": [
        "bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a",
        "dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA"
      ],
      "license": "MIT"
    },
    "node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol": {
      "keccak256": "0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e",
      "urls": [
        "bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377",
        "dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"
      ],
      "license": "MIT"
    },
    "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": {
      "keccak256": "0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c",
      "urls": [
        "bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617",
        "dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"
      ],
      "license": "MIT"
    }
  },
  "version": 1
}