├── docs └── docs.rst ├── workflow.yml ├── pinksale ├── __init__.py ├── exceptions.py ├── typez.py ├── decorators.py ├── constants.py ├── utils.py ├── pinksale.py └── assets │ └── pinksale.json ├── MANIFEST.in ├── images └── pinksale.jpg ├── setup.py └── README.md /docs/docs.rst: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workflow.yml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pinksale/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pinksale/exceptions.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include *.json 2 | recursive-include pinksale/assets * 3 | -------------------------------------------------------------------------------- /images/pinksale.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkey0/pinksale-python/HEAD/images/pinksale.jpg -------------------------------------------------------------------------------- /pinksale/typez.py: -------------------------------------------------------------------------------- 1 | from typing import Union 2 | 3 | from eth_typing.evm import Address, ChecksumAddress 4 | 5 | 6 | AddressLike = Union[Address, ChecksumAddress] 7 | -------------------------------------------------------------------------------- /pinksale/decorators.py: -------------------------------------------------------------------------------- 1 | def requires_private_key(function) -> None: 2 | def wrapper(*args, **kwargs): 3 | assert args[0].private_key != None, "This functions requires a private key." 4 | resp = function(*args, **kwargs) 5 | return resp 6 | 7 | return wrapper 8 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name="pinksale-python", 5 | version="0.1.7", 6 | packages=find_packages(), 7 | install_requires=[ 8 | "web3" 9 | ], 10 | include_package_data=True, 11 | url="https://github.com/hkey0/pinksale-python", 12 | author="hkey", 13 | description=" The unofficial Python client for the Pinksale.", 14 | long_description=open('readme.md').read(), 15 | long_description_content_type="text/markdown", 16 | ) 17 | -------------------------------------------------------------------------------- /pinksale/constants.py: -------------------------------------------------------------------------------- 1 | WETH_ADDRESS = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" 2 | WBNB_ADDRESS = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c" 3 | DECIMALS = 10 ** 18 4 | ZERO_ADDRESS = "0x0000000000000000000000000000000000000000" 5 | 6 | 7 | _stable_coins = { 8 | "USDT": [ 9 | { 10 | "chainId": 1, 11 | "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7" 12 | }, 13 | { 14 | "chainId": 56, 15 | "address": "0x55d398326f99059ff775485246999027b3197955" 16 | } 17 | ], 18 | "USDC": [ 19 | { 20 | "chainId": 1, 21 | "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" 22 | }, 23 | { 24 | "chainId": 56, 25 | "address": "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d" 26 | } 27 | ], 28 | "BUSD": [ 29 | { 30 | "chainId": 56, 31 | "address": "0xe9e7cea3dedca5984780bafc599bd69add087d56" 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /pinksale/utils.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | from web3 import Web3 5 | from web3.contract import Contract 6 | from web3.types import ( 7 | TxData, 8 | TxReceipt 9 | ) 10 | 11 | from .typez import AddressLike 12 | 13 | 14 | def _get_abi(ca_type: str) -> dict: 15 | with open(f"{os.path.dirname(os.path.abspath(__file__))}/assets/{ca_type}.json", "r") as f: 16 | abi: str = json.load(f) 17 | return abi 18 | 19 | 20 | def _load_contract( 21 | w3: Web3, 22 | ca_type: str, 23 | address: AddressLike 24 | ) -> Contract: 25 | address = Web3.to_checksum_address(address) 26 | return w3.eth.contract(address=address, abi=_get_abi(ca_type)) 27 | 28 | 29 | def _sign_and_send_transaction( 30 | w3: Web3, 31 | amount: float or int, 32 | tx: TxData, 33 | wallet: AddressLike, 34 | priv_key: str 35 | ) -> TxReceipt: 36 | nonce = w3.eth.get_transaction_count(wallet) 37 | txn = tx.build_transaction({ 38 | "from": wallet, 39 | "nonce": nonce, 40 | 'gas': 700000, 41 | "gasPrice": w3.to_wei('5', 'gwei'), 42 | "value": w3.to_wei(amount, 'ether'), 43 | }) 44 | 45 | gas_estimate = w3.eth.estimate_gas(txn) 46 | txn = tx.build_transaction({ 47 | "from": wallet, 48 | "nonce": nonce, 49 | 'gas': gas_estimate, 50 | "gasPrice": w3.to_wei('5', 'gwei'), 51 | "value": w3.to_wei(amount, 'ether'), 52 | }) 53 | 54 | signed_txn = w3.eth.account.sign_transaction(txn, priv_key) 55 | txn_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction) 56 | txn_hash = w3.to_hex(txn_hash) 57 | txn_receipt = w3.eth.wait_for_transaction_receipt(txn_hash) 58 | return txn_receipt 59 | 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://raw.githubusercontent.com/hkey0/pinksale-python/main/images/pinksale.jpg) 2 | 3 | # pinksale-python 4 | 5 | The unofficial Python client for [Pinksale](https://pinksale.finance). 6 | 7 | # Functionalty 8 | 9 | - A Python wrapper for any presale contract. 10 | - Easy access to the necessary data about the presale. 11 | - Supports BSC and ETH for now. 12 | 13 | 14 | # Installation 15 | 16 | ``` 17 | pip install pinksale-python 18 | ``` 19 | 20 | #### Supports 21 | - Binance Smart Chain 22 | - Supports ETH (BNB) 23 | 24 | - Ethereum 25 | - Supports ETH (ETH) 26 | 27 | 28 | # Donation 29 | You can support the project by donating :)\ 30 | for ETH/BSC/ARBI/AVAX/POLYGON chains: `0x09a27f3647aD2Fd081e515F9D2d785292Fba38C1` 31 | ## Usage/Examples 32 | 33 | #### Write functions 34 | 35 | To make a contribution, you only need to enter the amount in ether: 36 | ```python 37 | from pinksale.pinksale import Pinksale 38 | 39 | 40 | client = Pinksale("0x0A8527e4A1e3f8b56508e26b8Dc332e067916108", "your_private_key", provider="https://bsc-dataseed1.ninicoin.io") 41 | tx_receipt = client.contribute(1) # Contribute with 1 BNB 42 | ``` 43 | 44 | Emergency withdraw: 45 | ```py 46 | client.emergency_withdraw() 47 | ``` 48 | 49 | You can claim your tokens when pool finalizes: 50 | ```py 51 | client.claim() 52 | ``` 53 | 54 | #### View Functions 55 | 56 | A simple call example for view functions. Contract address is your presale address. 57 | ```python 58 | from pinksale.pinksale import Pinksale 59 | 60 | 61 | client = Pinksale("0x0A8527e4A1e3f8b56508e26b8Dc332e067916108", provider="https://bsc-dataseed1.ninicoin.io") 62 | contributors = client.get_all_contributors() 63 | >> ['0x0080b399E21475a7ca6d6cf9081C983BE51Bdead', '0xA8617881a6914b59000f279e4425F0E8E84BeBa5', ...] 64 | ``` 65 | 66 | You can get Pool Details: Total raised, Details (image, links, etc.), KYC 67 | ```python 68 | client.get_pool_details() 69 | >> {'total_raised': 120222334187259780175, 'details': {'a': 'https://photos.pinksale.finance/file/pinksale-logo-upload/1696947582061-36b70f470f30f10fb3055f7c2a32ca88.jpg', 'b': 'https://zhaodavinci.com/', 'd': 'https://twitter.com/Zhao_DaVinci', 'e': 'https://github.com/AnalytixAudit/Solidity/blob/main/20231009_AnalytixAudit_ZhaoDaVinc_VINCI_Audit.pdf', 'f': 'https://t.me/ZhaoDaVinci', 'h': "♠️ Hottest Meta of the Month ♠️\nWhy did CZ tokenize the Mona Lisa? To blend Da Vinci's genius with crypto magic, creating a masterpiece of digital value ♠️ Top Trending ♠️ Audited Contract ♠️ Top Tier Listings ♠️ CMC & CG Fast track ♠️ Top Incubator ♠️ Based Team ♠️ Buy Back & Burn ♠️ 100x Target ♠️", 's': 'https://youtu.be/HYnUI5dDyeo'}, 'kyc': {'a': '', 'b': 'https://app.analytixaudit.com/zhao-da-vinc', 'c': '', 'd': '', 'e': '', 'f': ''}} 70 | ``` 71 | 72 | Also pool settings: "token", "currency", "start_time", "end_time", "soft_cap", "total_selling_tokens", "max_contribution" 73 | 74 | ```py 75 | client.get_pool_settings() 76 | ``` 77 | 78 | Get current rate returns amount of tokens for 1 bnb. 79 | ```py 80 | client.get_current_rate() 81 | ``` 82 | 83 | Get all contributor addresses: 84 | ```py 85 | client.get_all_contributors() 86 | ``` 87 | 88 | Get contribution amount of an address: 89 | ```py 90 | address = "" 91 | client.get_contribution_of(address) 92 | ``` 93 | 94 | 95 | # Changelog 96 | 97 | _0.1.0_ 98 | - Support for BSC (BNB) and ETH (ETH) 99 | -------------------------------------------------------------------------------- /pinksale/pinksale.py: -------------------------------------------------------------------------------- 1 | import json 2 | from typing import Optional 3 | 4 | from web3 import Web3, Account 5 | from web3.types import TxReceipt 6 | 7 | from .typez import AddressLike, Address 8 | from .constants import ZERO_ADDRESS 9 | from .utils import ( 10 | _load_contract, 11 | _sign_and_send_transaction 12 | ) 13 | from .decorators import requires_private_key 14 | 15 | class Pinksale: 16 | def __init__( 17 | self, 18 | contract: AddressLike, 19 | private_key: Optional[str] = None, 20 | provider: Optional[str] = None, 21 | web3: Optional[Web3] = None, 22 | ) -> None: 23 | """ 24 | :param contract: Presale contract address. Each presale event has a different contract address. 25 | :private_key: The private key of the ETH wallet to use. 26 | :param provider: You can optionally set to a RPC URI. 27 | :param web3: You can optionally set to a custom Web3 object. 28 | """ 29 | 30 | if web3: 31 | self.w3 = web3 32 | else: 33 | self.w3 = Web3(Web3.HTTPProvider(provider, request_kwargs={"timeout": 60})) 34 | 35 | self.pinksale_ca = _load_contract(self.w3, "pinksale", contract) 36 | if private_key: 37 | self.private_key = private_key 38 | self.address = Account.from_key(self.private_key).address 39 | else: 40 | self.private_key = None 41 | 42 | def get_pool_details( 43 | self 44 | ) -> dict: 45 | data = self.pinksale_ca.functions.poolStates().call() 46 | return { 47 | "total_raised": data[3], 48 | "details": json.loads(data[7]), 49 | "kyc": json.loads(data[-1]) 50 | } 51 | 52 | def get_pool_settings( 53 | self 54 | ) -> dict: 55 | data = self.pinksale_ca.functions.poolSettings().call() 56 | keys = ["token", "currency", "start_time", "end_time", "soft_cap", "total_selling_tokens", "max_contribution", "unknown"] 57 | return dict(zip(keys, data)) # I don't understand what the last parameter means 58 | 59 | @requires_private_key 60 | def contribute( 61 | self, 62 | amount: int | float 63 | ) -> TxReceipt: 64 | transaction = self.pinksale_ca.functions.contribute(0, ZERO_ADDRESS) 65 | tx_receipt = _sign_and_send_transaction( 66 | self.w3, 67 | amount, 68 | transaction, 69 | self.address, 70 | self.private_key 71 | ) 72 | return tx_receipt 73 | 74 | def get_pool_owner(self) -> Address: 75 | return self.pinksale_ca.functions.owner().call() 76 | 77 | def get_current_rate( 78 | self 79 | ) -> int: 80 | return self.pinksale_ca.functions.currentRate().call() 81 | 82 | def get_contribution_of( 83 | self, 84 | address: AddressLike 85 | ) -> int : 86 | address = Web3.to_checksum_address(address) 87 | return self.pinksale_ca.functions.contributionOf(address).call() 88 | 89 | @requires_private_key 90 | def claim(self) -> TxReceipt: 91 | transaction = self.pinksale_ca.functions.claim() 92 | tx_receipt = _sign_and_send_transaction(self.w3, 0, transaction, self.address, self.private_key) 93 | return tx_receipt 94 | 95 | @requires_private_key 96 | def emergency_withdraw(self) -> TxReceipt: 97 | transaction = self.pinksale_ca.functions.emergencyWithdrawContribution() 98 | tx_receipt = _sign_and_send_transaction(self.w3, 0, transaction, self.address, self.private_key) 99 | return tx_receipt 100 | 101 | def get_contributor_count(self) -> int: 102 | return self.pinksale_ca.functions.getContributorCount().call() 103 | 104 | def get_contributors( 105 | self, 106 | start_index: int, 107 | end_index: int 108 | ) -> list: 109 | return self.pinksale_ca.functions.getContributors(start_index, end_index).call() 110 | 111 | def get_all_contributors(self) -> list: 112 | start, end = 0, self.get_contributor_count() 113 | return self.pinksale_ca.functions.getContributors(start, end).call() 114 | -------------------------------------------------------------------------------- /pinksale/assets/pinksale.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [], 4 | "name": "amountTilRebalance", 5 | "outputs": [ 6 | { 7 | "internalType": "uint256", 8 | "name": "", 9 | "type": "uint256" 10 | } 11 | ], 12 | "stateMutability": "view", 13 | "type": "function" 14 | }, 15 | { 16 | "inputs": [], 17 | "name": "cancel", 18 | "outputs": [], 19 | "stateMutability": "nonpayable", 20 | "type": "function" 21 | }, 22 | { 23 | "inputs": [], 24 | "name": "claim", 25 | "outputs": [], 26 | "stateMutability": "nonpayable", 27 | "type": "function" 28 | }, 29 | { 30 | "inputs": [ 31 | { 32 | "internalType": "address", 33 | "name": "", 34 | "type": "address" 35 | } 36 | ], 37 | "name": "claimedOf", 38 | "outputs": [ 39 | { 40 | "internalType": "uint256", 41 | "name": "", 42 | "type": "uint256" 43 | } 44 | ], 45 | "stateMutability": "view", 46 | "type": "function" 47 | }, 48 | { 49 | "inputs": [{ 50 | "internalType": "uint256", 51 | "name": "amount", 52 | "type": "uint256" 53 | },{ 54 | "internalType": "address", 55 | "name": "addr", 56 | "type": "address" 57 | }], 58 | "name": "contribute", 59 | "outputs": [], 60 | "stateMutability": "payable", 61 | "type": "function" 62 | }, 63 | { 64 | "inputs": [ 65 | { 66 | "internalType": "uint256", 67 | "name": "amount", 68 | "type": "uint256" 69 | } 70 | ], 71 | "name": "contributeCustomCurrency", 72 | "outputs": [], 73 | "stateMutability": "nonpayable", 74 | "type": "function" 75 | }, 76 | { 77 | "inputs": [ 78 | { 79 | "internalType": "address", 80 | "name": "", 81 | "type": "address" 82 | } 83 | ], 84 | "name": "contributionOf", 85 | "outputs": [ 86 | { 87 | "internalType": "uint256", 88 | "name": "", 89 | "type": "uint256" 90 | } 91 | ], 92 | "stateMutability": "view", 93 | "type": "function" 94 | }, 95 | { 96 | "inputs": [], 97 | "name": "currentRate", 98 | "outputs": [ 99 | { 100 | "internalType": "uint256", 101 | "name": "", 102 | "type": "uint256" 103 | } 104 | ], 105 | "stateMutability": "view", 106 | "type": "function" 107 | }, 108 | { 109 | "inputs": [ 110 | { 111 | "internalType": "uint8", 112 | "name": "distributedType", 113 | "type": "uint8" 114 | } 115 | ], 116 | "name": "distributionCompleted", 117 | "outputs": [ 118 | { 119 | "internalType": "bool", 120 | "name": "", 121 | "type": "bool" 122 | } 123 | ], 124 | "stateMutability": "view", 125 | "type": "function" 126 | }, 127 | { 128 | "inputs": [ 129 | { 130 | "internalType": "address", 131 | "name": "to_", 132 | "type": "address" 133 | }, 134 | { 135 | "internalType": "address", 136 | "name": "token_", 137 | "type": "address" 138 | } 139 | ], 140 | "name": "emergencyWithdraw", 141 | "outputs": [], 142 | "stateMutability": "nonpayable", 143 | "type": "function" 144 | }, 145 | { 146 | "inputs": [ 147 | { 148 | "internalType": "address payable", 149 | "name": "to_", 150 | "type": "address" 151 | }, 152 | { 153 | "internalType": "uint256", 154 | "name": "amount_", 155 | "type": "uint256" 156 | } 157 | ], 158 | "name": "emergencyWithdraw", 159 | "outputs": [], 160 | "stateMutability": "nonpayable", 161 | "type": "function" 162 | }, 163 | { 164 | "inputs": [], 165 | "name": "emergencyWithdrawContribution", 166 | "outputs": [], 167 | "stateMutability": "nonpayable", 168 | "type": "function" 169 | }, 170 | { 171 | "inputs": [], 172 | "name": "factory", 173 | "outputs": [ 174 | { 175 | "internalType": "contract ILaunchPadFactory", 176 | "name": "", 177 | "type": "address" 178 | } 179 | ], 180 | "stateMutability": "view", 181 | "type": "function" 182 | }, 183 | { 184 | "inputs": [], 185 | "name": "finalize", 186 | "outputs": [], 187 | "stateMutability": "nonpayable", 188 | "type": "function" 189 | }, 190 | { 191 | "inputs": [], 192 | "name": "getContributorCount", 193 | "outputs": [ 194 | { 195 | "internalType": "uint256", 196 | "name": "", 197 | "type": "uint256" 198 | } 199 | ], 200 | "stateMutability": "view", 201 | "type": "function" 202 | }, 203 | { 204 | "inputs": [ 205 | { 206 | "internalType": "uint256", 207 | "name": "start", 208 | "type": "uint256" 209 | }, 210 | { 211 | "internalType": "uint256", 212 | "name": "end", 213 | "type": "uint256" 214 | } 215 | ], 216 | "name": "getContributors", 217 | "outputs": [ 218 | { 219 | "internalType": "address[]", 220 | "name": "", 221 | "type": "address[]" 222 | } 223 | ], 224 | "stateMutability": "view", 225 | "type": "function" 226 | }, 227 | { 228 | "inputs": [], 229 | "name": "getFeeSettings", 230 | "outputs": [ 231 | { 232 | "internalType": "uint128", 233 | "name": "currency", 234 | "type": "uint128" 235 | }, 236 | { 237 | "internalType": "uint128", 238 | "name": "token", 239 | "type": "uint128" 240 | } 241 | ], 242 | "stateMutability": "view", 243 | "type": "function" 244 | }, 245 | { 246 | "inputs": [ 247 | { 248 | "internalType": "uint8", 249 | "name": "distributedType", 250 | "type": "uint8" 251 | } 252 | ], 253 | "name": "getUndistributedIndexes", 254 | "outputs": [ 255 | { 256 | "internalType": "uint256[]", 257 | "name": "", 258 | "type": "uint256[]" 259 | } 260 | ], 261 | "stateMutability": "view", 262 | "type": "function" 263 | }, 264 | { 265 | "inputs": [ 266 | { 267 | "components": [ 268 | { 269 | "internalType": "uint256", 270 | "name": "totalVestingTokens", 271 | "type": "uint256" 272 | }, 273 | { 274 | "internalType": "uint256", 275 | "name": "tgeLockDuration", 276 | "type": "uint256" 277 | }, 278 | { 279 | "internalType": "uint256", 280 | "name": "cycle", 281 | "type": "uint256" 282 | }, 283 | { 284 | "internalType": "uint256", 285 | "name": "tgeReleasePct", 286 | "type": "uint256" 287 | }, 288 | { 289 | "internalType": "uint256", 290 | "name": "cycleReleasePct", 291 | "type": "uint256" 292 | } 293 | ], 294 | "internalType": "struct LaunchPadStorage.OwnerVestingSettings", 295 | "name": "_ownerVestingSettings", 296 | "type": "tuple" 297 | } 298 | ], 299 | "name": "initializeOwnerVesting", 300 | "outputs": [], 301 | "stateMutability": "nonpayable", 302 | "type": "function" 303 | }, 304 | { 305 | "inputs": [ 306 | { 307 | "internalType": "address", 308 | "name": "user", 309 | "type": "address" 310 | } 311 | ], 312 | "name": "isGovernor", 313 | "outputs": [ 314 | { 315 | "internalType": "bool", 316 | "name": "", 317 | "type": "bool" 318 | } 319 | ], 320 | "stateMutability": "view", 321 | "type": "function" 322 | }, 323 | { 324 | "inputs": [], 325 | "name": "owner", 326 | "outputs": [ 327 | { 328 | "internalType": "address", 329 | "name": "", 330 | "type": "address" 331 | } 332 | ], 333 | "stateMutability": "view", 334 | "type": "function" 335 | }, 336 | { 337 | "inputs": [], 338 | "name": "ownerVestingSettings", 339 | "outputs": [ 340 | { 341 | "internalType": "uint256", 342 | "name": "totalVestingTokens", 343 | "type": "uint256" 344 | }, 345 | { 346 | "internalType": "uint256", 347 | "name": "tgeLockDuration", 348 | "type": "uint256" 349 | }, 350 | { 351 | "internalType": "uint256", 352 | "name": "cycle", 353 | "type": "uint256" 354 | }, 355 | { 356 | "internalType": "uint256", 357 | "name": "tgeReleasePct", 358 | "type": "uint256" 359 | }, 360 | { 361 | "internalType": "uint256", 362 | "name": "cycleReleasePct", 363 | "type": "uint256" 364 | } 365 | ], 366 | "stateMutability": "view", 367 | "type": "function" 368 | }, 369 | { 370 | "inputs": [], 371 | "name":"poolSettings", 372 | "outputs": [ 373 | { 374 | "internalType": "address", 375 | "name": "token", 376 | "type": "address" 377 | }, 378 | { 379 | "internalType": "address", 380 | "name": "currency", 381 | "type": "address" 382 | }, 383 | { 384 | "internalType": "uint256", 385 | "name": "startTime", 386 | "type": "uint256" 387 | }, 388 | { 389 | "internalType": "uint256", 390 | "name": "endTime", 391 | "type": "uint256" 392 | }, 393 | { 394 | "internalType": "uint256", 395 | "name": "softCap", 396 | "type": "uint256" 397 | }, 398 | { 399 | "internalType": "uint256", 400 | "name": "totalSellingTokens", 401 | "type": "uint256" 402 | }, 403 | { 404 | "internalType": "uint256", 405 | "name": "maxContribution", 406 | "type": "uint256" 407 | }, 408 | { 409 | "internalType": "uint128", 410 | "name": "liquidityPercent", 411 | "type": "uint128" 412 | } 413 | ], 414 | "stateMutability": "view", 415 | "type": "function" 416 | }, 417 | { 418 | "inputs": [], 419 | "name":"poolStates", 420 | "outputs": [ 421 | { 422 | "internalType": "enum LaunchPadStorage.State", 423 | "name": "state", 424 | "type": "uint8" 425 | }, 426 | { 427 | "internalType": "uint256", 428 | "name": "finishTime", 429 | "type": "uint256" 430 | }, 431 | { 432 | "internalType": "uint256", 433 | "name": "rate", 434 | "type": "uint256" 435 | }, 436 | { 437 | "internalType": "uint256", 438 | "name": "totalRaised", 439 | "type": "uint256" 440 | }, 441 | { 442 | "internalType": "uint256", 443 | "name": "liquidityUnlockTime", 444 | "type": "uint256" 445 | }, 446 | { 447 | "internalType": "uint256", 448 | "name": "totalVestedTokens", 449 | "type": "uint256" 450 | }, 451 | { 452 | "internalType": "int256", 453 | "name": "lockId", 454 | "type": "int256" 455 | }, 456 | { 457 | "internalType": "string", 458 | "name": "poolDetails", 459 | "type": "string" 460 | }, 461 | { 462 | "internalType": "string", 463 | "name": "kycDetails", 464 | "type": "string" 465 | } 466 | ], 467 | "stateMutability": "view", 468 | "type": "function" 469 | }, 470 | { 471 | "inputs": [ 472 | { 473 | "internalType": "address", 474 | "name": "user", 475 | "type": "address" 476 | } 477 | ], 478 | "name": "purchasedVolumeOf", 479 | "outputs": [ 480 | { 481 | "internalType": "uint256", 482 | "name": "", 483 | "type": "uint256" 484 | } 485 | ], 486 | "stateMutability": "view", 487 | "type": "function" 488 | }, 489 | { 490 | "inputs": [ 491 | { 492 | "internalType": "address", 493 | "name": "to_", 494 | "type": "address" 495 | }, 496 | { 497 | "internalType": "uint256", 498 | "name": "amount_", 499 | "type": "uint256" 500 | } 501 | ], 502 | "name": "recover", 503 | "outputs": [], 504 | "stateMutability": "nonpayable", 505 | "type": "function" 506 | }, 507 | { 508 | "inputs": [ 509 | { 510 | "internalType": "address", 511 | "name": "", 512 | "type": "address" 513 | } 514 | ], 515 | "name": "refundedOf", 516 | "outputs": [ 517 | { 518 | "internalType": "uint256", 519 | "name": "", 520 | "type": "uint256" 521 | } 522 | ], 523 | "stateMutability": "view", 524 | "type": "function" 525 | }, 526 | { 527 | "inputs": [], 528 | "name": "renounceOwnership", 529 | "outputs": [], 530 | "stateMutability": "nonpayable", 531 | "type": "function" 532 | }, 533 | { 534 | "inputs": [], 535 | "name": "router", 536 | "outputs": [ 537 | { 538 | "internalType": "contract IUniswapV2Router02", 539 | "name": "", 540 | "type": "address" 541 | } 542 | ], 543 | "stateMutability": "view", 544 | "type": "function" 545 | }, 546 | { 547 | "inputs": [], 548 | "name": "tgeTime", 549 | "outputs": [ 550 | { 551 | "internalType": "uint256", 552 | "name": "", 553 | "type": "uint256" 554 | } 555 | ], 556 | "stateMutability": "view", 557 | "type": "function" 558 | }, 559 | { 560 | "inputs": [ 561 | { 562 | "internalType": "address", 563 | "name": "newOwner", 564 | "type": "address" 565 | } 566 | ], 567 | "name": "transferOwnership", 568 | "outputs": [], 569 | "stateMutability": "nonpayable", 570 | "type": "function" 571 | }, 572 | 573 | 574 | { 575 | "inputs": [], 576 | "name": "version", 577 | "outputs": [ 578 | { 579 | "internalType": "uint8", 580 | "name": "", 581 | "type": "uint8" 582 | } 583 | ], 584 | "stateMutability": "view", 585 | "type": "function" 586 | }, 587 | 588 | { 589 | "inputs": [], 590 | "name": "withdrawContribution", 591 | "outputs": [], 592 | "stateMutability": "nonpayable", 593 | "type": "function" 594 | }, 595 | { 596 | "inputs": [], 597 | "name": "withdrawVestingToken", 598 | "outputs": [], 599 | "stateMutability": "nonpayable", 600 | "type": "function" 601 | }, 602 | { 603 | "inputs": [], 604 | "name": "withdrawableTokens", 605 | "outputs": [ 606 | { 607 | "internalType": "uint256", 608 | "name": "", 609 | "type": "uint256" 610 | } 611 | ], 612 | "stateMutability": "view", 613 | "type": "function" 614 | }, 615 | { 616 | "stateMutability": "payable", 617 | "type": "receive" 618 | } 619 | ] --------------------------------------------------------------------------------