[
  {
    "path": ".gitignore",
    "content": "venv/\n__pycache__/\nmain.py\n\n# Compiler files\ncache/\nout/\n\n# Ignores development broadcast logs\n!/broadcast\n/broadcast/*/31337/\n/broadcast/**/dry-run/\n\n# Docs\ndocs/\n\n# Dotenv file\n.env\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n#.idea/"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 0xtaodev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n    <h1>🐍 JUPITER PYTHON SDK 🪐</h1>\n    <img src=\"https://github.com/0xTaoDev/jupiter-python-sdk/blob/main/images/jupiter-python-sdk-banner.png?raw=true\" width=\"75%\" height=\"75%\">\n</div>\n\n---\n\n<p align=\"center\">\n    <img src=\"https://img.shields.io/github/stars/0xtaodev/jupiter-python-sdk\">\n    <img src=\"https://img.shields.io/github/forks/0xtaodev/jupiter-python-sdk\">\n    <br>\n    <img src=\"https://img.shields.io/github/issues/0xtaodev/jupiter-python-sdk\">\n    <img src=\"https://img.shields.io/github/issues-closed/0xtaodev/jupiter-python-sdk\">\n    <br>\n    <img src=\"https://img.shields.io/github/languages/top/0xtaodev/jupiter-python-sdk\">\n    <img src=\"https://img.shields.io/github/last-commit/0xtaodev/jupiter-python-sdk\">\n    <br>\n</p>\n\n# 📖 Introduction\n**Jupiter Python SDK** is a Python library that allows you to use most of **[Jupiter](https://jup.ag/) features**.<br>\nIt enables executing swaps, limit orders, DCA, swap pairs, tokens prices, fetching wallet infos, stats, data and more!<br>\nThis library is using packages like: [solana-py](https://github.com/michaelhly/solana-py), [solders](https://github.com/kevinheavey/solders), [anchorpy](https://github.com/kevinheavey/anchorpy).<br>\nThere is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs) for more information.\n\n# ⚠️ Disclaimer\n**Please note that I'm not responsible for any loss of funds, damages, or other libailities resulting from the use of this software or any associated services.<br>\nThis tool is provided for educational purposes only and should not be used as financial advice, it is still in expiremental phase so use it at your own risk.**\n\n# ✨ Quickstart\n\n### 🛠️ Installation\n\n```sh\npip install jupiter-python-sdk\n```\n\n### 📃 General Usage\n**Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.<br>\nOtherwise, this is required, for instance, to open a DCA account or to close one.**\n\n**You can set custom URLs for any self-hosted Jupiter APIs. Like the [V6 Swap API](https://station.jup.ag/docs/apis/self-hosted) or [QuickNode's Metis API](https://marketplace.quicknode.com/add-on/metis-jupiter-v6-swap-api).**\n\nIf you encounter ```ImportError: cannot import name 'sync_native' from 'spl.token.instructions``` error when trying to import Jupiter, Jupiter_DCA from jupiter_python_sdk.jupiter, follow these steps:\n1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py```\n2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded.\n\n### Here is a code snippet on how to use the SDK\n```py\nimport base58\nimport base64\nimport json\n\nfrom solders import message\nfrom solders.pubkey import Pubkey\nfrom solders.keypair import Keypair\nfrom solders.transaction import VersionedTransaction\n\nfrom solana.rpc.types import TxOpts\nfrom solana.rpc.async_api import AsyncClient\nfrom solana.rpc.commitment import Processed\n\nfrom jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA\n\n\nprivate_key = Keypair.from_bytes(base58.b58decode(os.getenv(\"PRIVATE-KEY\"))) # Replace PRIVATE-KEY with your private key as string\nasync_client = AsyncClient(\"SOLANA-RPC-ENDPOINT-URL\") # Replace SOLANA-RPC-ENDPOINT-URL with your Solana RPC Endpoint URL\njupiter = Jupiter(\n    async_client=async_client,\n    keypair=private_key,\n    quote_api_url=\"https://quote-api.jup.ag/v6/quote?\",\n    swap_api_url=\"https://quote-api.jup.ag/v6/swap\",\n    open_order_api_url=\"https://jup.ag/api/limit/v1/createOrder\",\n    cancel_orders_api_url=\"https://jup.ag/api/limit/v1/cancelOrders\",\n    query_open_orders_api_url=\"https://jup.ag/api/limit/v1/openOrders?wallet=\",\n    query_order_history_api_url=\"https://jup.ag/api/limit/v1/orderHistory\",\n    query_trade_history_api_url=\"https://jup.ag/api/limit/v1/tradeHistory\"\n)\n\n\n\"\"\"\nEXECUTE A SWAP\n\"\"\"\ntransaction_data = await jupiter.swap(\n    input_mint=\"So11111111111111111111111111111111111111112\",\n    output_mint=\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n    amount=5_000_000,\n    slippage_bps=1,\n)\n# Returns str: serialized transactions to execute the swap.\n\nraw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data))\nsignature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message))\nsigned_txn = VersionedTransaction.populate(raw_transaction.message, [signature])\nopts = TxOpts(skip_preflight=False, preflight_commitment=Processed)\nresult = await async_client.send_raw_transaction(txn=bytes(signed_txn), opts=opts)\ntransaction_id = json.loads(result.to_json())['result']\nprint(f\"Transaction sent: https://explorer.solana.com/tx/{transaction_id}\")\n\n\n\"\"\"\nOPEN LIMIT ORDER\n\"\"\"\ntransaction_data = await jupiter.open_order(\n    input_mint=So11111111111111111111111111111111111111112\",\n    output_mint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n    in_amount=5_000_000,\n    out_amount=100_000,\n)\n# Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened}\n\nraw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data['transaction_data']))\nsignature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message))\nsigned_txn = VersionedTransaction.populate(raw_transaction.message, [signature, transaction_data['signature2']])\nopts = TxOpts(skip_preflight=False, preflight_commitment=Processed)\nresult = await async_client.send_raw_transaction(txn=bytes(signed_txn), opts=opts)\ntransaction_id = json.loads(result.to_json())['result']\nprint(f\"Transaction sent: https://explorer.solana.com/tx/{transaction_id}\")\n\n\n\"\"\"\nCREATE DCA ACCOUNT\n\"\"\"\ncreate_dca_account = await jupiter.dca.create_dca(\n    input_mint=Pubkey.from_string(\"So11111111111111111111111111111111111111112\"),\n    output_mint=Pubkey.from_string(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"),\n    total_in_amount=5_000_000,\n    in_amount_per_cycle=100_000,\n    cycle_frequency=60,\n    min_out_amount_per_cycle=0,\n    max_out_amount_per_cycle=0,\n    start=0\n)\n# Returns DCA Account Pubkey and transaction hash.\n\n\n\"\"\"\nCLOSE DCA ACCOUNT\n\"\"\"\nclose_dca_account = await jupiter.dca.close_dca(\n    dca_pubkey=Pubkey.from_string(\"45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1\")\n)\n# Returns transaction hash.\n```\n\n### 📜 All available features\n```py\n- quote\n- swap\n- open_order\n- cancel_orders\n- create_dca\n- close_dca\n- fetch_user_dca_accounts\n- fetch_dca_account_fills_history\n- get_available_dca_tokens\n- fetch_dca_data\n- query_open_orders\n- query_orders_history\n- query_trades_history\n- get_jupiter_stats\n- get_token_price\n- get_indexed_route_map\n- get_tokens_list\n- get_all_tickers\n- get_all_swap_pairs\n- get_swap_pairs\n- get_token_stats_by_date\n- program_id_to_label\n```\n\n# 📝 TO-DO\n- [ ] Bridge 🌉\n- [ ] Perpetual 💸\n- [ ] Price API\n- [ ] Wallet Transactions History\n\n# 🤝 Contributions\nIf you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.<br>\nContact me for any inquiry, I will reach you as soon as possible.<br>\n[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/QxwPGcXDp7)\n[![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_)\n\n# 👑 Donations\nThis project doesn't include platform fees. If you find value in it and would like to support its development, your donations are greatly appreciated.<br>\n**SOLANA ADDRESS**\n```sh\nAyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX\n```\n"
  },
  {
    "path": "requirements.txt",
    "content": "base58\nsolders==0.18.1\nsolana==0.30.2\nhttpx\nanchorpy==0.18.0\njupiter-python-sdk\n"
  },
  {
    "path": "src/LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) 2023 0xtaodev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "src/README.md",
    "content": "<div align=\"center\">\n    <h1>🐍 JUPITER PYTHON SDK 🪐</h1>\n    <img src=\"https://github.com/0xTaoDev/jupiter-python-sdk/blob/main/images/jupiter-python-sdk-banner.png?raw=true\" width=\"75%\" height=\"75%\">\n</div>\n\n---\n\n<p align=\"center\">\n    <img src=\"https://img.shields.io/github/stars/0xtaodev/jupiter-python-sdk\">\n    <img src=\"https://img.shields.io/github/forks/0xtaodev/jupiter-python-sdk\">\n    <br>\n    <img src=\"https://img.shields.io/github/issues/0xtaodev/jupiter-python-sdk\">\n    <img src=\"https://img.shields.io/github/issues-closed/0xtaodev/jupiter-python-sdk\">\n    <br>\n    <img src=\"https://img.shields.io/github/languages/top/0xtaodev/jupiter-python-sdk\">\n    <img src=\"https://img.shields.io/github/last-commit/0xtaodev/jupiter-python-sdk\">\n    <br>\n</p>\n\n# 📖 Introduction\n**Jupiter Python SDK** is a Python library that allows you to use most of **[Jupiter](https://jup.ag/) features**.<br>\nIt enables executing swaps, limit orders, DCA, swap pairs, tokens prices, fetching wallet infos, stats, data and more!<br>\nThis library is using packages like: [solana-py](https://github.com/michaelhly/solana-py), [solders](https://github.com/kevinheavey/solders), [anchorpy](https://github.com/kevinheavey/anchorpy).<br>\nThere is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs) for more information.\n\n# ⚠️ Disclaimer\n**Please note that I'm not responsible for any loss of funds, damages, or other libailities resulting from the use of this software or any associated services.<br>\nThis tool is provided for educational purposes only and should not be used as financial advice, it is still in expiremental phase so use it at your own risk.**\n\n# ✨ Quickstart\n\n### 🛠️ Installation\n\n```sh\npip install jupiter-python-sdk\n```\n\n### 📃 General Usage\n**Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.<br>\nOtherwise, this is required, for instance, to open a DCA account or to close one.**\n\n**You can set custom URLs for any self-hosted Jupiter APIs. Like the [V6 Swap API](https://station.jup.ag/docs/apis/self-hosted) or [QuickNode's Metis API](https://marketplace.quicknode.com/add-on/metis-jupiter-v6-swap-api).**\n\nIf you encounter ```ImportError: cannot import name 'sync_native' from 'spl.token.instructions``` error when trying to import Jupiter, Jupiter_DCA from jupiter_python_sdk.jupiter, follow these steps:\n1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py```\n2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded.\n\n### Here is a code snippet on how to use the SDK\n```py\nimport base58\nimport base64\nimport json\n\nfrom solders import message\nfrom solders.pubkey import Pubkey\nfrom solders.keypair import Keypair\nfrom solders.transaction import VersionedTransaction\n\nfrom solana.rpc.types import TxOpts\nfrom solana.rpc.async_api import AsyncClient\nfrom solana.rpc.commitment import Processed\n\nfrom jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA\n\n\nprivate_key = Keypair.from_bytes(base58.b58decode(os.getenv(\"PRIVATE-KEY\"))) # Replace PRIVATE-KEY with your private key as string\nasync_client = AsyncClient(\"SOLANA-RPC-ENDPOINT-URL\") # Replace SOLANA-RPC-ENDPOINT-URL with your Solana RPC Endpoint URL\njupiter = Jupiter(\n    async_client=async_client,\n    keypair=private_key,\n    quote_api_url=\"https://quote-api.jup.ag/v6/quote?\",\n    swap_api_url=\"https://quote-api.jup.ag/v6/swap\",\n    open_order_api_url=\"https://jup.ag/api/limit/v1/createOrder\",\n    cancel_orders_api_url=\"https://jup.ag/api/limit/v1/cancelOrders\",\n    query_open_orders_api_url=\"https://jup.ag/api/limit/v1/openOrders?wallet=\",\n    query_order_history_api_url=\"https://jup.ag/api/limit/v1/orderHistory\",\n    query_trade_history_api_url=\"https://jup.ag/api/limit/v1/tradeHistory\"\n)\n\n\n\"\"\"\nEXECUTE A SWAP\n\"\"\"\ntransaction_data = await jupiter.swap(\n    input_mint=\"So11111111111111111111111111111111111111112\",\n    output_mint=\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n    amount=5_000_000,\n    slippage_bps=1,\n)\n# Returns str: serialized transactions to execute the swap.\n\nraw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data))\nsignature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message))\nsigned_txn = VersionedTransaction.populate(raw_transaction.message, [signature])\nopts = TxOpts(skip_preflight=False, preflight_commitment=Processed)\nresult = await async_client.send_raw_transaction(txn=bytes(signed_txn), opts=opts)\ntransaction_id = json.loads(result.to_json())['result']\nprint(f\"Transaction sent: https://explorer.solana.com/tx/{transaction_id}\")\n\n\n\"\"\"\nOPEN LIMIT ORDER\n\"\"\"\ntransaction_data = await jupiter.open_order(\n    input_mint=So11111111111111111111111111111111111111112\",\n    output_mint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n    in_amount=5_000_000,\n    out_amount=100_000,\n)\n# Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened}\n\nraw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data['transaction_data']))\nsignature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message))\nsigned_txn = VersionedTransaction.populate(raw_transaction.message, [signature, transaction_data['signature2']])\nopts = TxOpts(skip_preflight=False, preflight_commitment=Processed)\nresult = await async_client.send_raw_transaction(txn=bytes(signed_txn), opts=opts)\ntransaction_id = json.loads(result.to_json())['result']\nprint(f\"Transaction sent: https://explorer.solana.com/tx/{transaction_id}\")\n\n\n\"\"\"\nCREATE DCA ACCOUNT\n\"\"\"\ncreate_dca_account = await jupiter.dca.create_dca(\n    input_mint=Pubkey.from_string(\"So11111111111111111111111111111111111111112\"),\n    output_mint=Pubkey.from_string(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"),\n    total_in_amount=5_000_000,\n    in_amount_per_cycle=100_000,\n    cycle_frequency=60,\n    min_out_amount_per_cycle=0,\n    max_out_amount_per_cycle=0,\n    start=0\n)\n# Returns DCA Account Pubkey and transaction hash.\n\n\n\"\"\"\nCLOSE DCA ACCOUNT\n\"\"\"\nclose_dca_account = await jupiter.dca.close_dca(\n    dca_pubkey=Pubkey.from_string(\"45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1\")\n)\n# Returns transaction hash.\n```\n\n### 📜 All available features\n```py\n- quote\n- swap\n- open_order\n- cancel_orders\n- create_dca\n- close_dca\n- fetch_user_dca_accounts\n- fetch_dca_account_fills_history\n- get_available_dca_tokens\n- fetch_dca_data\n- query_open_orders\n- query_orders_history\n- query_trades_history\n- get_jupiter_stats\n- get_token_price\n- get_indexed_route_map\n- get_tokens_list\n- get_all_tickers\n- get_all_swap_pairs\n- get_swap_pairs\n- get_token_stats_by_date\n- program_id_to_label\n```\n\n# 📝 TO-DO\n- [ ] Bridge 🌉\n- [ ] Perpetual 💸\n\n# 🤝 Contributions\nIf you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.<br>\nContact me for any inquiry, I will reach you as soon as possible.<br>\n[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/QxwPGcXDp7)\n[![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_)\n\n# 👑 Donations\nThis project doesn't include platform fees. If you find value in it and would like to support its development, your donations are greatly appreciated.<br>\n**SOLANA ADDRESS**\n```sh\nAyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX\n```\n"
  },
  {
    "path": "src/jupiter_python_sdk/__init__.py",
    "content": "\"\"\"Classes to use Jupiter features.\"\"\"\n"
  },
  {
    "path": "src/jupiter_python_sdk/jupiter.py",
    "content": "import base64\nimport json\nimport time\nimport struct\n\nimport httpx\nfrom httpx._config import Timeout\n\nfrom typing import Any\n\nfrom solders import message\nfrom solders.pubkey import Pubkey\nfrom solders.keypair import Keypair\nfrom solders.transaction import VersionedTransaction\nfrom solders.system_program import transfer, TransferParams\n\nfrom solana.rpc.types import TxOpts\nfrom solana.rpc.async_api import AsyncClient\nfrom solana.rpc.commitment import Processed\n\nfrom spl.token.instructions import create_associated_token_account, get_associated_token_address, sync_native, SyncNativeParams, close_account, CloseAccountParams\nfrom spl.token.constants import *\n\nfrom construct import Container\nfrom anchorpy.program.core import Program as AnchorProgram\nfrom anchorpy.program.core import Idl, Provider\nfrom anchorpy.provider import Wallet\nfrom anchorpy import Context\nfrom anchorpy import AccountsCoder\n\n\nclass Jupiter_DCA():\n    \n    DCA_PROGRAM_ID = Pubkey.from_string(\"DCA265Vj8a9CEuX1eb1LWRnDT7uK6q1xMipnNyatn23M\")\n    IDL = {\"version\":\"0.1.0\",\"name\":\"dca\",\"instructions\":[{\"name\":\"openDca\",\"accounts\":[{\"name\":\"dca\",\"isMut\":True,\"isSigner\":False},{\"name\":\"user\",\"isMut\":True,\"isSigner\":True},{\"name\":\"inputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"outputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"userAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"inAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"outAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"systemProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"tokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"associatedTokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"eventAuthority\",\"isMut\":False,\"isSigner\":False},{\"name\":\"program\",\"isMut\":False,\"isSigner\":False}],\"args\":[{\"name\":\"applicationIdx\",\"type\":\"u64\"},{\"name\":\"inAmount\",\"type\":\"u64\"},{\"name\":\"inAmountPerCycle\",\"type\":\"u64\"},{\"name\":\"cycleFrequency\",\"type\":\"i64\"},{\"name\":\"minPrice\",\"type\":{\"option\":\"u64\"}},{\"name\":\"maxPrice\",\"type\":{\"option\":\"u64\"}},{\"name\":\"startAt\",\"type\":{\"option\":\"i64\"}},{\"name\":\"closeWsolInAta\",\"type\":{\"option\":\"bool\"}}]},{\"name\":\"openDcaV2\",\"accounts\":[{\"name\":\"dca\",\"isMut\":True,\"isSigner\":False},{\"name\":\"user\",\"isMut\":False,\"isSigner\":True},{\"name\":\"payer\",\"isMut\":True,\"isSigner\":True},{\"name\":\"inputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"outputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"userAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"inAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"outAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"systemProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"tokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"associatedTokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"eventAuthority\",\"isMut\":False,\"isSigner\":False},{\"name\":\"program\",\"isMut\":False,\"isSigner\":False}],\"args\":[{\"name\":\"applicationIdx\",\"type\":\"u64\"},{\"name\":\"inAmount\",\"type\":\"u64\"},{\"name\":\"inAmountPerCycle\",\"type\":\"u64\"},{\"name\":\"cycleFrequency\",\"type\":\"i64\"},{\"name\":\"minPrice\",\"type\":{\"option\":\"u64\"}},{\"name\":\"maxPrice\",\"type\":{\"option\":\"u64\"}},{\"name\":\"startAt\",\"type\":{\"option\":\"i64\"}}]},{\"name\":\"closeDca\",\"accounts\":[{\"name\":\"user\",\"isMut\":True,\"isSigner\":True},{\"name\":\"dca\",\"isMut\":True,\"isSigner\":False},{\"name\":\"inputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"outputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"inAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"outAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"userInAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"userOutAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"systemProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"tokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"associatedTokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"eventAuthority\",\"isMut\":False,\"isSigner\":False},{\"name\":\"program\",\"isMut\":False,\"isSigner\":False}],\"args\":[]},{\"name\":\"withdraw\",\"accounts\":[{\"name\":\"user\",\"isMut\":True,\"isSigner\":True},{\"name\":\"dca\",\"isMut\":True,\"isSigner\":False},{\"name\":\"inputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"outputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"dcaAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"userInAta\",\"isMut\":True,\"isSigner\":False,\"isOptional\":True},{\"name\":\"userOutAta\",\"isMut\":True,\"isSigner\":False,\"isOptional\":True},{\"name\":\"systemProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"tokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"associatedTokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"eventAuthority\",\"isMut\":False,\"isSigner\":False},{\"name\":\"program\",\"isMut\":False,\"isSigner\":False}],\"args\":[{\"name\":\"withdrawParams\",\"type\":{\"defined\":\"WithdrawParams\"}}]},{\"name\":\"deposit\",\"accounts\":[{\"name\":\"user\",\"isMut\":True,\"isSigner\":True},{\"name\":\"dca\",\"isMut\":True,\"isSigner\":False},{\"name\":\"inAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"userInAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"tokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"eventAuthority\",\"isMut\":False,\"isSigner\":False},{\"name\":\"program\",\"isMut\":False,\"isSigner\":False}],\"args\":[{\"name\":\"depositIn\",\"type\":\"u64\"}]},{\"name\":\"withdrawFees\",\"accounts\":[{\"name\":\"admin\",\"isMut\":True,\"isSigner\":True},{\"name\":\"mint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"feeAuthority\",\"isMut\":False,\"isSigner\":False,\"docs\":[\"CHECK\"]},{\"name\":\"programFeeAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"adminFeeAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"systemProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"tokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"associatedTokenProgram\",\"isMut\":False,\"isSigner\":False}],\"args\":[{\"name\":\"amount\",\"type\":\"u64\"}]},{\"name\":\"initiateFlashFill\",\"accounts\":[{\"name\":\"keeper\",\"isMut\":True,\"isSigner\":True},{\"name\":\"dca\",\"isMut\":True,\"isSigner\":False},{\"name\":\"inputMint\",\"isMut\":False,\"isSigner\":False,\"docs\":[\"The token to borrow\"]},{\"name\":\"keeperInAta\",\"isMut\":True,\"isSigner\":False,\"docs\":[\"The account to send borrowed tokens to\"]},{\"name\":\"inAta\",\"isMut\":True,\"isSigner\":False,\"docs\":[\"The account to borrow from\"]},{\"name\":\"outAta\",\"isMut\":False,\"isSigner\":False,\"docs\":[\"The account to repay to\"]},{\"name\":\"instructionsSysvar\",\"isMut\":False,\"isSigner\":False,\"docs\":[\"Solana Instructions Sysvar\"]},{\"name\":\"systemProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"tokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"associatedTokenProgram\",\"isMut\":False,\"isSigner\":False}],\"args\":[]},{\"name\":\"fulfillFlashFill\",\"accounts\":[{\"name\":\"keeper\",\"isMut\":True,\"isSigner\":True},{\"name\":\"dca\",\"isMut\":True,\"isSigner\":False},{\"name\":\"inputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"outputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"keeperInAta\",\"isMut\":False,\"isSigner\":False},{\"name\":\"inAta\",\"isMut\":False,\"isSigner\":False},{\"name\":\"outAta\",\"isMut\":False,\"isSigner\":False},{\"name\":\"feeAuthority\",\"isMut\":False,\"isSigner\":False,\"docs\":[\"CHECK\"]},{\"name\":\"feeAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"instructionsSysvar\",\"isMut\":False,\"isSigner\":False,\"docs\":[\"Solana Instructions Sysvar\"]},{\"name\":\"systemProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"tokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"associatedTokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"eventAuthority\",\"isMut\":False,\"isSigner\":False},{\"name\":\"program\",\"isMut\":False,\"isSigner\":False}],\"args\":[{\"name\":\"repayAmount\",\"type\":\"u64\"}]},{\"name\":\"transfer\",\"accounts\":[{\"name\":\"keeper\",\"isMut\":True,\"isSigner\":True},{\"name\":\"dca\",\"isMut\":True,\"isSigner\":False},{\"name\":\"user\",\"isMut\":True,\"isSigner\":False},{\"name\":\"outputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"dcaOutAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"userOutAta\",\"isMut\":True,\"isSigner\":False,\"isOptional\":True},{\"name\":\"intermediateAccount\",\"isMut\":True,\"isSigner\":False,\"isOptional\":True},{\"name\":\"systemProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"tokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"associatedTokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"eventAuthority\",\"isMut\":False,\"isSigner\":False},{\"name\":\"program\",\"isMut\":False,\"isSigner\":False}],\"args\":[]},{\"name\":\"endAndClose\",\"accounts\":[{\"name\":\"keeper\",\"isMut\":True,\"isSigner\":True},{\"name\":\"dca\",\"isMut\":True,\"isSigner\":False},{\"name\":\"inputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"outputMint\",\"isMut\":False,\"isSigner\":False},{\"name\":\"inAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"outAta\",\"isMut\":True,\"isSigner\":False},{\"name\":\"user\",\"isMut\":True,\"isSigner\":False},{\"name\":\"userOutAta\",\"isMut\":True,\"isSigner\":False,\"isOptional\":True},{\"name\":\"initUserOutAta\",\"isMut\":True,\"isSigner\":False,\"isOptional\":True},{\"name\":\"intermediateAccount\",\"isMut\":True,\"isSigner\":False,\"isOptional\":True},{\"name\":\"systemProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"tokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"associatedTokenProgram\",\"isMut\":False,\"isSigner\":False},{\"name\":\"eventAuthority\",\"isMut\":False,\"isSigner\":False},{\"name\":\"program\",\"isMut\":False,\"isSigner\":False}],\"args\":[]}],\"accounts\":[{\"name\":\"Dca\",\"type\":{\"kind\":\"struct\",\"fields\":[{\"name\":\"user\",\"type\":\"publicKey\"},{\"name\":\"inputMint\",\"type\":\"publicKey\"},{\"name\":\"outputMint\",\"type\":\"publicKey\"},{\"name\":\"idx\",\"type\":\"u64\"},{\"name\":\"nextCycleAt\",\"type\":\"i64\"},{\"name\":\"inDeposited\",\"type\":\"u64\"},{\"name\":\"inWithdrawn\",\"type\":\"u64\"},{\"name\":\"outWithdrawn\",\"type\":\"u64\"},{\"name\":\"inUsed\",\"type\":\"u64\"},{\"name\":\"outReceived\",\"type\":\"u64\"},{\"name\":\"inAmountPerCycle\",\"type\":\"u64\"},{\"name\":\"cycleFrequency\",\"type\":\"i64\"},{\"name\":\"nextCycleAmountLeft\",\"type\":\"u64\"},{\"name\":\"inAccount\",\"type\":\"publicKey\"},{\"name\":\"outAccount\",\"type\":\"publicKey\"},{\"name\":\"minOutAmount\",\"type\":\"u64\"},{\"name\":\"maxOutAmount\",\"type\":\"u64\"},{\"name\":\"keeperInBalanceBeforeBorrow\",\"type\":\"u64\"},{\"name\":\"dcaOutBalanceBeforeSwap\",\"type\":\"u64\"},{\"name\":\"createdAt\",\"type\":\"i64\"},{\"name\":\"bump\",\"type\":\"u8\"}]}}],\"types\":[{\"name\":\"WithdrawParams\",\"type\":{\"kind\":\"struct\",\"fields\":[{\"name\":\"withdrawAmount\",\"type\":\"u64\"},{\"name\":\"withdrawal\",\"type\":{\"defined\":\"Withdrawal\"}}]}},{\"name\":\"Withdrawal\",\"type\":{\"kind\":\"enum\",\"variants\":[{\"name\":\"In\"},{\"name\":\"Out\"}]}}],\"events\":[{\"name\":\"CollectedFee\",\"fields\":[{\"name\":\"userKey\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"dcaKey\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"mint\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"amount\",\"type\":\"u64\",\"index\":False}]},{\"name\":\"Filled\",\"fields\":[{\"name\":\"userKey\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"dcaKey\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"inputMint\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"outputMint\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"inAmount\",\"type\":\"u64\",\"index\":False},{\"name\":\"outAmount\",\"type\":\"u64\",\"index\":False},{\"name\":\"feeMint\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"fee\",\"type\":\"u64\",\"index\":False}]},{\"name\":\"Opened\",\"fields\":[{\"name\":\"userKey\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"dcaKey\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"inDeposited\",\"type\":\"u64\",\"index\":False},{\"name\":\"inputMint\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"outputMint\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"cycleFrequency\",\"type\":\"i64\",\"index\":False},{\"name\":\"inAmountPerCycle\",\"type\":\"u64\",\"index\":False},{\"name\":\"createdAt\",\"type\":\"i64\",\"index\":False}]},{\"name\":\"Closed\",\"fields\":[{\"name\":\"userKey\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"dcaKey\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"inDeposited\",\"type\":\"u64\",\"index\":False},{\"name\":\"inputMint\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"outputMint\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"cycleFrequency\",\"type\":\"i64\",\"index\":False},{\"name\":\"inAmountPerCycle\",\"type\":\"u64\",\"index\":False},{\"name\":\"createdAt\",\"type\":\"i64\",\"index\":False},{\"name\":\"totalInWithdrawn\",\"type\":\"u64\",\"index\":False},{\"name\":\"totalOutWithdrawn\",\"type\":\"u64\",\"index\":False},{\"name\":\"unfilledAmount\",\"type\":\"u64\",\"index\":False},{\"name\":\"userClosed\",\"type\":\"bool\",\"index\":False}]},{\"name\":\"Withdraw\",\"fields\":[{\"name\":\"dcaKey\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"inAmount\",\"type\":\"u64\",\"index\":False},{\"name\":\"outAmount\",\"type\":\"u64\",\"index\":False},{\"name\":\"userWithdraw\",\"type\":\"bool\",\"index\":False}]},{\"name\":\"Deposit\",\"fields\":[{\"name\":\"dcaKey\",\"type\":\"publicKey\",\"index\":False},{\"name\":\"amount\",\"type\":\"u64\",\"index\":False}]}],\"errors\":[{\"code\":6000,\"name\":\"InvalidAmount\",\"msg\":\"Invalid deposit amount\"},{\"code\":6001,\"name\":\"InvalidCycleAmount\",\"msg\":\"Invalid deposit amount\"},{\"code\":6002,\"name\":\"InvalidPair\",\"msg\":\"Invalid pair\"},{\"code\":6003,\"name\":\"TooFrequent\",\"msg\":\"Too frequent DCA cycle\"},{\"code\":6004,\"name\":\"InvalidMinPrice\",\"msg\":\"Minimum price constraint must be greater than 0\"},{\"code\":6005,\"name\":\"InvalidMaxPrice\",\"msg\":\"Maximum price constraint must be greater than 0\"},{\"code\":6006,\"name\":\"InAmountInsufficient\",\"msg\":\"In amount needs to be more than in amount per cycle\"},{\"code\":6007,\"name\":\"Unauthorized\",\"msg\":\"Wrong user\"},{\"code\":6008,\"name\":\"NoInATA\",\"msg\":\"inAta not passed in\"},{\"code\":6009,\"name\":\"NoUserInATA\",\"msg\":\"userInAta not passed in\"},{\"code\":6010,\"name\":\"NoOutATA\",\"msg\":\"outAta not passed in\"},{\"code\":6011,\"name\":\"NoUserOutATA\",\"msg\":\"userOutAta not passed in\"},{\"code\":6012,\"name\":\"InsufficientBalanceInProgram\",\"msg\":\"Trying to withdraw more than available\"},{\"code\":6013,\"name\":\"InvalidDepositAmount\",\"msg\":\"Deposit should be more than 0\"},{\"code\":6014,\"name\":\"UserInsufficientBalance\",\"msg\":\"User has insufficient balance\"},{\"code\":6015,\"name\":\"UnauthorizedKeeper\",\"msg\":\"Unauthorized Keeper\"},{\"code\":6016,\"name\":\"UnrecognizedProgram\",\"msg\":\"Unrecognized Program\"},{\"code\":6017,\"name\":\"MathErrors\",\"msg\":\"Calculation errors\"},{\"code\":6018,\"name\":\"KeeperNotTimeToFill\",\"msg\":\"Not time to fill\"},{\"code\":6019,\"name\":\"OrderFillAmountWrong\",\"msg\":\"Order amount wrong\"},{\"code\":6020,\"name\":\"SwapOutAmountBelowMinimum\",\"msg\":\"Out amount below expectations\"},{\"code\":6021,\"name\":\"WrongAdmin\",\"msg\":\"Wrong admin\"},{\"code\":6022,\"name\":\"MathOverflow\",\"msg\":\"Overflow in arithmetic operation\"},{\"code\":6023,\"name\":\"AddressMismatch\",\"msg\":\"Address Mismatch\"},{\"code\":6024,\"name\":\"ProgramMismatch\",\"msg\":\"Program Mismatch\"},{\"code\":6025,\"name\":\"IncorrectRepaymentAmount\",\"msg\":\"Incorrect Repayment Amount\"},{\"code\":6026,\"name\":\"CannotBorrowBeforeRepay\",\"msg\":\"Cannot Borrow Before Repay\"},{\"code\":6027,\"name\":\"NoRepaymentInstructionFound\",\"msg\":\"No Repayment Found\"},{\"code\":6028,\"name\":\"MissingSwapInstructions\",\"msg\":\"Missing Swap Instruction\"},{\"code\":6029,\"name\":\"UnexpectedSwapProgram\",\"msg\":\"Expected Instruction to use Jupiter Swap Program\"},{\"code\":6030,\"name\":\"UnknownInstruction\",\"msg\":\"Unknown Instruction\"},{\"code\":6031,\"name\":\"MissingRepayInstructions\",\"msg\":\"Missing Repay Instruction\"},{\"code\":6032,\"name\":\"KeeperShortchanged\",\"msg\":\"Keeper Shortchanged\"},{\"code\":6033,\"name\":\"WrongSwapOutAccount\",\"msg\":\"Jup Swap to Wrong Out Account\"},{\"code\":6034,\"name\":\"WrongTransferAmount\",\"msg\":\"Transfer amount should be exactly account balance\"},{\"code\":6035,\"name\":\"InsufficientBalanceForRent\",\"msg\":\"Insufficient balance for rent\"},{\"code\":6036,\"name\":\"UnexpectedSolBalance\",\"msg\":\"Unexpected SOL amount in intermediate account\"},{\"code\":6037,\"name\":\"InsufficientWsolForTransfer\",\"msg\":\"Too little WSOL to perform transfer\"},{\"code\":6038,\"name\":\"MissedInstruction\",\"msg\":\"Did not call initiate_flash_fill\"},{\"code\":6039,\"name\":\"WrongProgram\",\"msg\":\"Did not call this program's initiate_flash_fill\"},{\"code\":6040,\"name\":\"BalanceNotZero\",\"msg\":\"Can't close account with balance\"},{\"code\":6041,\"name\":\"UnexpectedWSOLLeftover\",\"msg\":\"Should not have WSOL leftover in DCA out-token account\"},{\"code\":6042,\"name\":\"IntermediateAccountNotSet\",\"msg\":\"Should pass in a WSOL intermediate account when transferring SOL\"},{\"code\":6043,\"name\":\"UnexpectedSwapInstruction\",\"msg\":\"Did not call jup swap\"}]}\n    \n    def __init__(\n        self,\n        async_client: AsyncClient,\n        keypair: Keypair\n    ):\n        self.rpc = async_client\n        self.keypair = keypair  \n        self.dca_program = AnchorProgram(\n            idl=Idl.from_json(json.dumps(self.IDL)),\n            program_id=self.DCA_PROGRAM_ID,\n            provider=Provider(\n                connection=self.rpc,\n                wallet=Wallet(payer=self.keypair),\n                opts=TxOpts(skip_preflight=True, preflight_commitment=Processed)\n            )\n        )\n    \n    async def get_mint_token_program(\n        self,\n        token_mint: Pubkey,\n    ) -> Pubkey:\n        \"\"\"Returns token mint token program from token mint Pubkey.\n        \n        Args:\n            ``token_mint (Pubkey)``: Pubkey of the token mint.\n            \n        Returns:\n            ``Pubkey (Pubkey)``: Mint token program Pubkey.\n        \n        Example:\n            >>> rpc_url = \"https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/\"\n            >>> async_client = AsyncClient(rpc_url)\n            >>> private_key_string = \"tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P\"\n            >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string))\n            >>> jupiter = Jupiter(async_client, private_key)\n            >>> token_mint = Pubkey.from_string(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\")\n            >>> token_mint_program = await jupiter.dca.get_mint_token_program(token_mint)\n            \n            Pubkey(\n                TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,\n            )\n        \"\"\"\n        \n        mint_token_program_info = await self.rpc.get_account_info(token_mint)\n        mint_token_program = mint_token_program_info.value.owner\n        return mint_token_program\n        \n    async def get_or_create_associated_token_address(\n        self,\n        token_mint: Pubkey,\n    ) -> dict:\n        \"\"\"Returns assosciated token address Pubkey with instruction to create it if it doesn't exists.\n        \n        Args:\n            ``token_mint (Pubkey)``: Pubkey of the token mint.\n            \n        Returns:\n            ``Dict``: Associated token address Pubkey and instruction.\n        \n        Example:\n            >>> rpc_url = \"https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/\"\n            >>> async_client = AsyncClient(rpc_url)\n            >>> private_key_string = \"tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P\"\n            >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string))\n            >>> jupiter = Jupiter(async_client, private_key)\n            >>> token_mint = Pubkey.from_string(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\")\n            >>> associated_token_address = await jupiter.dca.get_or_create_associated_token_address(token_mint)\n            \n            {'pubkey': Pubkey(\n                2GWpKNsfBq7y2LS9FNpAUWsr6atnywB7JTwRrifMHzwU,\n            ), 'instruction': Instruction(\n                Instruction {\n                    program_id: ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL,\n                    accounts: [\n                        AccountMeta {\n                            pubkey: AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX,\n                            is_signer: True,\n                            is_writable: True,\n                        },\n                        AccountMeta {\n                            pubkey: 2GWpKNsfBq7y2LS9FNpAUWsr6atnywB7JTwRrifMHzwU,\n                            is_signer: False,\n                            is_writable: True,\n                        },\n                        AccountMeta {\n                            pubkey: AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX,\n                            is_signer: False,\n                            is_writable: False,\n                        },\n                        AccountMeta {\n                            pubkey: EPjFWdd1ufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v,\n                            is_signer: False,\n                            is_writable: False,\n                        },\n                        AccountMeta {\n                            pubkey: 11111111111111111111111111111111,\n                            is_signer: False,\n                            is_writable: False,\n                        },\n                        AccountMeta {\n                            pubkey: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,\n                            is_signer: False,\n                            is_writable: False,\n                        },\n                        AccountMeta {\n                            pubkey: SysvarRent111111111111111111111111111111111,\n                            is_signer: False,\n                            is_writable: False,\n                        },\n                    ],\n                    data: [],\n                },\n            )}\n        \"\"\"\n        \n        toAccount = get_associated_token_address(self.keypair.pubkey(), token_mint)\n        accountInfo = await self.rpc.get_account_info(toAccount)\n        account = accountInfo.value\n        \n        if account:\n            instruction = None\n            return {'pubkey': toAccount, 'instruction': instruction}\n        else:\n            instruction = create_associated_token_account(self.keypair.pubkey(), self.keypair.pubkey(), token_mint)\n            return {'pubkey': toAccount, 'instruction': instruction}\n    \n    async def get_dca_pubkey(\n        self,\n        input_mint: Pubkey,\n        output_mint: Pubkey,\n        uid: int,\n    ) -> Pubkey:\n        \"\"\"Returns DCA Pubkey to be created.\n        \n        Args:\n            ``input_mint (Pubkey)``: Pubkey of the token to sell.\n            ``output_mint (Pubkey)``: Pubkey of the token to buy.\n            ``uid (int)``: A unix timestamp in seconds.\n            \n        Returns:\n            ``Pubkey``: DCA Pubkey to be created.\n        \n        Example:\n            >>> rpc_url = \"https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/\"\n            >>> async_client = AsyncClient(rpc_url)\n            >>> private_key_string = \"tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P\"\n            >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string))\n            >>> jupiter = Jupiter(async_client, private_key)\n            >>> input_mint = Pubkey.from_string(\"So11111111111111111111111111111111111111112\")\n            >>> output_mint = Pubkey.from_string(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\")\n            >>> uid = int(time.time())\n            >>> dca_pubkey = await jupiter.dca.get_dca_pubkey(input_mint, output_mint, uid)\n            \n            Pubkey(\n                ArotVdXCEw4Zy5ywUVP7ZJBPFvXR8v8Md6jSQK9pLaCb,\n            )\n        \"\"\" \n            \n        dcaPubKey = Pubkey.find_program_address(\n            seeds=[\n            b'dca',\n            self.keypair.pubkey().__bytes__(),\n            input_mint.__bytes__(),\n            output_mint.__bytes__(),\n            struct.pack(\"<Q\", uid)\n            ],\n            program_id=self.DCA_PROGRAM_ID\n        )\n        return dcaPubKey[0]\n\n    async def fetch_dca_data(\n        self,\n        dca_pubkey: Pubkey,\n    ) -> Container[Any]:\n        \"\"\"Fetch DCA Account Anchor Data\n        \n        Args:\n            ``dca_pubkey (Pubkey)``: Pubkey of the DCA account.\n        \n        Returns:\n            ``Dca``: DCA Account Anchor Data\n        \n        Example:\n            >>> rpc_url = \"https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/\"\n            >>> async_client = AsyncClient(rpc_url)\n            >>> private_key_string = \"tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P\"\n            >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string))\n            >>> jupiter = Jupiter(async_client, private_key)\n            >>> dca_pubkey = Pubkey.from_string(\"45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1\")\n            >>> fetch_dca_data = await jupiter.dca.fetch_dca_data(dca_pubkey)\n            Dca(user=Pubkey(\n                AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX,\n            ), input_mint=Pubkey(\n                So11111111111111111111111111111111111111112,\n            ), output_mint=Pubkey(\n                EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v,\n            ), idx=1703051020, next_cycle_at=1703052580, in_deposited=5000000, in_withdrawn=0, out_withdrawn=194361, in_used=2600000, out_received=194361, in_amount_per_cycle=100000, cycle_frequency=60, next_cycle_amount_left=100000, in_account=Pubkey(\n                3NFmVtdyxQvmhXa1a82j62dd9kCmKFa3uv3vv7WRQsRY,\n            ), out_account=Pubkey(\n                ErFYjASdQ5HVtJoQ3dqrjp8MgFKjSjFVQiRSqBbKT9kJ,\n            ), min_out_amount=0, max_out_amount=0, keeper_in_balance_before_borrow=0, dca_out_balance_before_swap=0, created_at=1703050997, bump=253)\n        \"\"\" \n        dca_account_coder = AccountsCoder(idl=Idl.from_json(json.dumps(self.IDL)))\n        get_dca_account_details  = await self.rpc.get_account_info(dca_pubkey)\n        dca_account_details = get_dca_account_details.value.data\n        dca_account_decoded_details = dca_account_coder.decode(dca_account_details)\n        return dca_account_decoded_details\n\n    async def create_dca(\n        self,\n        input_mint: Pubkey,\n        output_mint: Pubkey,\n        total_in_amount: int,\n        in_amount_per_cycle: int,\n        cycle_frequency: int,\n        min_out_amount_per_cycle: int=None,\n        max_out_amount_per_cycle: int=None,\n        start_at: int=0,\n        ) -> dict:\n        \"\"\"Setting up a DCA account with signing and sending the transaction.\n        \n        Args:\n            ``input_mint (Pubkey)``: Pubkey of the token to sell.\n            ``output_mint (Pubkey)``: Pubkey of the token to buy.\n            ``total_in_amount (int)``: Total input mint amount to sell.\n            ``in_amount_per_cycle (int)``: Input mint amount to sell each time. For e.g. if you are trying to buy SOL using 100 USDC every day over 10 days, in_amount_per_cycle should be 100*10**6.\n            ``cycle_frequency (int)``: The number of seconds between each periodic buys. For e.g. if you are trying to DCA on a daily basis, cycle_frequency should be 60*60*24 = 86,400.\n            ``min_out_amount_per_cycle (int)``: Optional field. Following the examples above, let's say you only want to buy SOL if SOL is below SOL-USDC $20, that means for each cycle, with every 100 USDC, you want to receive a minimum of 100 / 20 = 5 SOL. You can then pass 5 * LAMPORTS_PER_SOL as argument here. This ensures that you receive > 5 SOL for each order.\n            ``max_out_amount_per_cycle (int)``: This is just the inverse scenario of min_out_amount_per_cycle. While max_out_amount_per_cycle is a little counter intuitive, it can be used by advanced traders / investors who believe an asset is at risk of further decline in prices if it goes beyond a certain threshold. Say in the case of output mint being a stablecoin, if the stablecoin drops to $0.5, you will get more buying into it, but that may not necessary be a good thing since the risk of a stablecoin going to $0 is very real if it could depeg to $0.5. This is where max_out_amount_per_cycle could be useful.\n            ``start_at (int)``: Optional field. Unix timestamp in seconds of when you would like DCA to start. Pass 0 if you want to start immediately or pass a future time as a unix timestamp in seconds.\n            \n        Returns:\n            ``Dict``: Transaction hash and DCA Account Pubkey.\n        \n        Example:\n            >>> rpc_url = \"https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/\"\n            >>> async_client = AsyncClient(rpc_url)\n            >>> private_key_string = \"tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P\"\n            >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string))\n            >>> jupiter = Jupiter(async_client, private_key)\n            >>> input_mint = Pubkey.from_string(\"So11111111111111111111111111111111111111112\")\n            >>> output_mint = Pubkey.from_string(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\")\n            >>> total_in_amount = 5_000_000\n            >>> in_amount_per_cycle = 100\n            >>> cycle_frequency = 60\n            >>> min_out_amount_per_cycle = 0\n            >>> max_out_amount_per_cycle = 0\n            >>> start = 0\n            >>> create_dca = await jupiter.dca.create_dca(input_mint, output_mint, total_in_amount, in_amount_per_cycle, cycle_frequency, min_out_amount_per_cycle, max_out_amount_per_cycle, start)\n\n            {\n                'dca_pubkey': Pubkey(Duop8ynu7WozpmLUsc1pAq6gobS3vdxe8GJMFzF8rY56,),\n                'transaction_hash': '5zFwgyHExYcWLTgqh6GMDPML2mPHzmJUFfsVD882tYd4oGhekiDufcBZSbcoNFKxvhRLQt8WwYU4SsW8fCefYmHf'\n            }\n        \"\"\"\n        \n        pre_instructions = []\n        post_instructions = []\n    \n        input_token_program, output_token_program = await self.get_mint_token_program(input_mint), await self.get_mint_token_program(output_mint)\n        user_input_account = get_associated_token_address(self.keypair.pubkey(), input_mint)\n        \n        if input_mint == WRAPPED_SOL_MINT:\n            input_mint_ata = await self.get_or_create_associated_token_address(input_mint)\n            transfer_IX = transfer(TransferParams(\n                from_pubkey=self.keypair.pubkey(),\n                to_pubkey=user_input_account,\n                lamports=total_in_amount\n            ))\n            sync_native_IX = sync_native(SyncNativeParams(\n                program_id=input_token_program,\n                account=user_input_account\n            ))\n            \n            if input_mint_ata['instruction']:\n                pre_instructions.append(input_mint_ata['instruction'])\n                post_instructions.append(close_account(\n                    CloseAccountParams(\n                        program_id=input_mint_ata['pubkey'],\n                        account=self.keypair.pubkey(),\n                        dest=self.keypair.pubkey(),\n                        owner=self.keypair.pubkey()\n                    )\n                ))\n                \n            pre_instructions.append(transfer_IX)\n            pre_instructions.append(sync_native_IX)\n        \n        if output_mint != WRAPPED_SOL_MINT:\n            output_mint_ata = await self.get_or_create_associated_token_address(output_mint)\n            \n            if output_mint_ata['instruction']:\n                pre_instructions.append(output_mint_ata['instruction'])\n        \n        uid = int(time.time())\n        dca_pubkey = await self.get_dca_pubkey(input_mint, output_mint, uid)\n\n        accounts = {\n            'dca': dca_pubkey,\n            'user': self.keypair.pubkey(),\n            'payer': self.keypair.pubkey(),\n            'input_mint': input_mint,\n            'output_mint': output_mint,\n            'user_ata': user_input_account,\n            'in_ata': get_associated_token_address(dca_pubkey, input_mint),\n            'out_ata': get_associated_token_address(dca_pubkey, output_mint),\n            'system_program': Pubkey.from_string(\"11111111111111111111111111111111\"),\n            'token_program': Pubkey.from_string(\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"),\n            'associated_token_program': Pubkey.from_string(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"),\n            'event_authority': Pubkey.from_string(\"Cspp27eGUDMXxPEdhmEXFVRn6Lt1L7xJyALF3nmnWoBj\"),\n            'program': self.DCA_PROGRAM_ID \n        }\n\n        transaction = await self.dca_program.rpc['open_dca'](\n            uid,\n            total_in_amount,\n            in_amount_per_cycle,\n            cycle_frequency,\n            min_out_amount_per_cycle,\n            max_out_amount_per_cycle,\n            start_at,\n            False,\n            ctx=Context(\n                accounts=accounts,\n                signers=[self.keypair],\n                pre_instructions=pre_instructions,\n                # post_instructions=post_instructions,\n                options=TxOpts(skip_preflight=False, preflight_commitment=Processed)\n            )\n        )\n\n        return {'dca_pubkey': dca_pubkey, 'transaction_hash': str(transaction)}\n\n    async def close_dca(\n        self,\n        dca_pubkey: Pubkey,\n    ) -> str:\n        \"\"\"Close DCA Account with signing and sending the transaction.\n        \n        Args:\n            ``dca_pubkey (Pubkey)``: Pubkey of the DCA account to be closed.\n        \n        Returns:\n            ``str``: transaction hash of the DCA account closed.\n        \n        Example:\n            >>> rpc_url = \"https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/\"\n            >>> async_client = AsyncClient(rpc_url)\n            >>> private_key_string = \"tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P\"\n            >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string))\n            >>> jupiter = Jupiter(async_client, private_key)\n            >>> dca_pubkey = Pubkey.from_string(\"45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1\")\n            >>> close_dca = await jupiter.dca.close_dca(dca_pubkey)\n            HXiWtTPLjgtiuNoAN7CEfyDyftdsAnMfuQ93Yp1vukgBbdU1Lb2Bo59p48PVr7CMhxPDwGQbsfjvKT5HXXQfvE2\n        \"\"\"\n        dca_account = await self.fetch_dca_data(dca_pubkey)\n        input_mint = dca_account.input_mint\n        output_mint = dca_account.output_mint\n        input_token_program, output_token_program = await self.get_mint_token_program(input_mint), await self.get_mint_token_program(output_mint)\n        user_input_account = get_associated_token_address(self.keypair.pubkey(), input_mint)\n        user_output_account = get_associated_token_address(self.keypair.pubkey(), output_mint)\n        reserve_input_account = get_associated_token_address(dca_pubkey, input_mint)\n        reserve_output_account = get_associated_token_address(dca_pubkey, output_mint)\n        \n        accounts = {\n            'user': self.keypair.pubkey(),\n            'dca': dca_pubkey,\n            'input_mint': input_mint,\n            'output_mint': output_mint,\n            'in_ata': reserve_input_account,\n            'out_ata': reserve_output_account,\n            'user_in_ata': user_input_account,\n            'user_out_ata': user_output_account,\n            'system_program': Pubkey.from_string(\"11111111111111111111111111111111\"),\n            'token_program': Pubkey.from_string(\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"),\n            'associated_token_program': Pubkey.from_string(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"),\n            'event_authority': Pubkey.from_string(\"Cspp27eGUDMXxPEdhmEXFVRn6Lt1L7xJyALF3nmnWoBj\"),\n            'program': self.DCA_PROGRAM_ID \n        }\n        transaction = await self.dca_program.rpc['close_dca'](\n            ctx=Context(\n                accounts=accounts,\n                signers=[self.keypair],\n                # pre_instructions=pre_instructions,\n                # post_instructions=post_instructions,\n                options=TxOpts(skip_preflight=False, preflight_commitment=Processed)\n            )\n        )\n        return str(transaction)\n\n    @staticmethod\n    async def fetch_user_dca_accounts(\n        wallet_address: str,\n        status: int\n    ) -> dict:\n        \"\"\"Returns all DCA Accounts from a wallet address\n\n        Args:\n            ``wallet_address (str)``: Wallet address.\n            ``status (int)``: 0 = DCA Running | 1 = DCA Done\n                \n        Returns:\n            ``dict``: all DCA Accounts from the wallet address.\n\n        Example:\n            >>> wallet_address = \"AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX\"\n            >>> status = 0\n            >>> user_dca_accounts = await Jupiter_DCA.fetch_user_dca_accounts(wallet_address, status)\n        {\n            'ok': True,\n            'data': {\n                'dcaAccounts': [\n                    {\n                        'id': 202513,\n                        'createdAt': '2023-12-18T12:39:40.000Z',\n                        'updatedAt': '2023-12-18T12:39:42.265Z',\n                        'userKey': 'AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX',\n                        'dcaKey': 'FTG9eN99uJJBqBtcz1bR6pGfj2Pb3yNAZmGYXggcAgio',\n                        'inputMint': 'So11111111111111111111111111111111111111112',\n                        'outputMint': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n                        'inDeposited': '1000000',\n                        'inAmountPerCycle': '100',\n                        'cycleFrequency': '60',\n                        'closeTxHash': '',\n                        'openTxHash': '2bwo4ds3Xpiwr9gLptXVFTcxnz2rP9pu3fAppNn3E61g33tprBCy6X8PT3SaXMn7fpG2c5CRw1LWGMEz3ik5SgnP',\n                        'status': 0,\n                        'inWithdrawn': '0',\n                        'outWithdrawn': '0',\n                        'unfilledAmount': '1000000',\n                        'userClosed': False, \n                        'fills': []\n                    }\n                ]\n            }\n        }\n        \"\"\"\n        user_dca_accounts = httpx.get(f\"https://dca-api.jup.ag/user/{wallet_address}/dca?status={status}\", timeout=Timeout(timeout=30.0)).json()\n        return user_dca_accounts\n    \n    @staticmethod\n    async def fetch_dca_account_fills_history(\n        dca_account_address: str,\n    ) -> dict:\n        \"\"\"Returns all DCA Account fills history\n\n        Args:\n            ``dca_account_address (str)``: DCA Account address.\n                \n        Returns:\n            ``dict``: all DCA Account fills history.\n\n        Example:\n            >>> dca_account_address = \"C91FGJAvQgeaXka1exMihC5qChwdcJzFemFVQutv4dev\"\n            >>> dca_account_fills_history = await Jupiter_DCA.fetch_dca_fills_history(dca_account_address)\n        {\n            'ok': True,\n            'data': {\n                'fills': [\n                    {\n                        'userKey': 'AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX',\n                        'dcaKey': 'C91FGJAvQgeaXka1exMihC5qChwdcJzFemFVQutv4dev',\n                        'inputMint': 'So11111111111111111111111111111111111111112', \n                        'outputMint': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n                        'inAmount': '100000',\n                        'outAmount': '7540',\n                        'feeMint': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'\n                        'fee': '7',\n                        'txId': '48kC4ZnkPpiRc6T3eVKYghmUERa2geC2e9FvGbVjDMaNkbrDJ3tj36GMkNdi1AkXkqrAHoDZcLW5SFjQEZcKB2NB',\n                        'confirmedAt': 1703055843\n                    }\n                ]\n            }\n        }    \n        \"\"\"\n        dca_account_fills_history = httpx.get(f\"https://dca-api.jup.ag/dca/{dca_account_address}/fills\", timeout=Timeout(timeout=30.0)).json()\n        return dca_account_fills_history\n          \n    @staticmethod\n    async def get_available_dca_tokens(\n    ) -> list:\n        \"\"\"Get available tokens for DCA.\n        \n        Returns:\n            ``list``: all available tokens from https://cache.jup.ag/top-tokens\n        \n        Example:\n            >>> available_dca_tokens = await Jupiter_DCA.get_available_dca_tokens()\n        \"\"\"\n        available_dca_tokens = httpx.get(f\"https://cache.jup.ag/top-tokens\", timeout=Timeout(timeout=30.0)).json()\n        return available_dca_tokens\n    \nclass Jupiter():\n    \n    ENDPOINT_APIS_URL = {\n        \"QUOTE\": \"https://quote-api.jup.ag/v6/quote?\",\n        \"SWAP\": \"https://quote-api.jup.ag/v6/swap\",\n        \"OPEN_ORDER\": \"https://jup.ag/api/limit/v1/createOrder\",\n        \"CANCEL_ORDERS\": \"https://jup.ag/api/limit/v1/cancelOrders\",\n        \"QUERY_OPEN_ORDERS\": \"https://jup.ag/api/limit/v1/openOrders?wallet=\",\n        \"QUERY_ORDER_HISTORY\": \"https://jup.ag/api/limit/v1/orderHistory\",\n        \"QUERY_TRADE_HISTORY\": \"https://jup.ag/api/limit/v1/tradeHistory\"\n    }\n    \n    def __init__(\n        self,\n        async_client: AsyncClient,\n        keypair: Keypair,\n        quote_api_url: str=\"https://quote-api.jup.ag/v6/quote?\",\n        swap_api_url: str=\"https://quote-api.jup.ag/v6/swap\",\n        open_order_api_url: str=\"https://jup.ag/api/limit/v1/createOrder\",\n        cancel_orders_api_url: str=\"https://jup.ag/api/limit/v1/cancelOrders\",\n        query_open_orders_api_url: str=\"https://jup.ag/api/limit/v1/openOrders?wallet=\",\n        query_order_history_api_url: str=\"https://jup.ag/api/limit/v1/orderHistory\",\n        query_trade_history_api_url: str=\"https://jup.ag/api/limit/v1/tradeHistory\",\n    ):\n        self.dca = Jupiter_DCA(async_client, keypair)\n        self.rpc = async_client\n        self.keypair = keypair\n        \n        self.ENDPOINT_APIS_URL[\"QUOTE\"] = quote_api_url\n        self.ENDPOINT_APIS_URL[\"SWAP\"] = swap_api_url\n        self.ENDPOINT_APIS_URL[\"OPEN_ORDER\"] = open_order_api_url\n        self.ENDPOINT_APIS_URL[\"CANCEL_ORDERS\"] = cancel_orders_api_url\n        self.ENDPOINT_APIS_URL[\"QUERY_OPEN_ORDERS\"] = query_open_orders_api_url\n        self.ENDPOINT_APIS_URL[\"QUERY_ORDER_HISTORY\"] = query_order_history_api_url\n        self.ENDPOINT_APIS_URL[\"QUERY_TRADE_HISTORY\"] = query_trade_history_api_url\n    \n    async def quote(\n        self,\n        input_mint: str,\n        output_mint: str,\n        amount: int,\n        slippage_bps: int=None,\n        swap_mode: str=\"ExactIn\",\n        only_direct_routes: bool=False,\n        as_legacy_transaction: bool=False,\n        exclude_dexes: list=None,\n        max_accounts: int=None,\n        platform_fee_bps: int=None\n    ) -> dict:\n        \"\"\"Get the best swap route for a token trade pair sorted by largest output token amount from https://quote-api.jup.ag/v6/quote\n        \n        Args:\n            Required:\n                ``input_mint (str)``: Input token mint address\\n\n                ``output_mint (str)``: Output token mint address\\n\n                ``amount (int)``: The API takes in amount in integer and you have to factor in the decimals for each token by looking up the decimals for that token. For example, USDC has 6 decimals and 1 USDC is 1000000 in integer when passing it in into the API.\\n\n            Optionals:\n                ``slippage_bps (int)``: The slippage % in BPS. If the output token amount exceeds the slippage then the swap transaction will fail.\\n\n                ``swap_mode (str)``: (ExactIn or ExactOut) Defaults to ExactIn. ExactOut is for supporting use cases where you need an exact token amount, like payments. In this case the slippage is on the input token.\\n\n                ``only_direct_routes (bool)``: Default is False. Direct Routes limits Jupiter routing to single hop routes only.\\n\n                ``as_legacy_transaction (bool)``: Default is False. Instead of using versioned transaction, this will use the legacy transaction.\\n\n                ``exclude_dexes (list)``: Default is that all DEXes are included. You can pass in the DEXes that you want to exclude in a list. For example, ['Aldrin','Saber'].\\n\n                ``max_accounts (int)``: Find a route given a maximum number of accounts involved, this might dangerously limit routing ending up giving a bad price. The max is an estimation and not the exact count.\\n\n                ``platform_fee_bps (int)``: If you want to charge the user a fee, you can specify the fee in BPS. Fee % is taken out of the output token.\n        \n        Returns:\n            ``dict``: returns best swap route\n            \n        Example:\n            >>> rpc_url = \"https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/\"\n            >>> async_client = AsyncClient(rpc_url)\n            >>> private_key_string = \"tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P\"\n            >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string))\n            >>> jupiter = Jupiter(async_client, private_key)\n            >>> input_mint = \"So11111111111111111111111111111111111111112\"\n            >>> output_mint = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"\n            >>> amount = 5_000_000\n            >>> quote = await jupiter.quote(input_mint, output_mint, amount)\n            {\n                'inputMint': 'So11111111111111111111111111111111111111112',\n                'inAmount': '5000000',\n                'outputMint': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n                'outAmount': '353237',\n                'otherAmountThreshold':'351471',\n                'swapMode': 'ExactIn',\n                'slippageBps': 50,\n                'platformFee': None,\n                'priceImpactPct': '0',\n                'routePlan': [{'swapInfo': {'ammKey': 'Cx8eWxJAaCQAFVmv1mP7B2cVie2BnkR7opP8vUh23Wcr', 'label': 'Lifinity V2', 'inputMint': 'So11111111111111111111111111111111111111112', 'outputMint': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', 'inAmount': '5000000', 'outAmount': '353237', 'feeAmount': '1000', 'feeMint': 'So11111111111111111111111111111111111111112'}, 'percent': 100}],\n                'contextSlot': 236625263,\n                'timeTaken': 0.069434356}\n        \"\"\"\n        \n        quote_url = self.ENDPOINT_APIS_URL['QUOTE'] + \"inputMint=\" + input_mint + \"&outputMint=\" + output_mint + \"&amount=\" + str(amount) + \"&swapMode=\" + swap_mode + \"&onlyDirectRoutes=\" + str(only_direct_routes).lower() + \"&asLegacyTransaction=\" + str(as_legacy_transaction).lower()\n        if slippage_bps:\n            quote_url += \"&slippageBps=\" + str(slippage_bps)\n        if exclude_dexes:\n            quote_url += \"&excludeDexes=\" + ','.join(exclude_dexes)\n        if max_accounts:\n            quote_url += \"&maxAccounts=\" + str(max_accounts)\n        if platform_fee_bps:\n            quote_url += \"&plateformFeeBps=\" + platform_fee_bps\n        \n        quote_response = httpx.get(url=quote_url).json()\n        try:\n            quote_response['routePlan']\n            return quote_response\n        except:\n            raise Exception(quote_response['error'])\n\n    async def swap(\n        self,\n        input_mint: str,\n        output_mint: str,\n        amount: int=0,\n        quoteResponse: str=None,\n        wrap_unwrap_sol: bool=True,\n        slippage_bps: int=1,\n        swap_mode: str=\"ExactIn\",\n        prioritization_fee_lamports: int=None,\n        only_direct_routes: bool=False,\n        as_legacy_transaction: bool=False,\n        exclude_dexes: list=None,\n        max_accounts: int=None,\n        platform_fee_bps: int=None\n    ) -> str:\n        \"\"\"Perform a swap.\n        \n        Args:\n            Required:\n                ``input_mint (str)``: Input token mint str\\n\n                ``output_mint (str)``: Output token mint str\\n\n                ``amount (int)``: The API takes in amount in integer and you have to factor in the decimals for each token by looking up the decimals for that token. For example, USDC has 6 decimals and 1 USDC is 1000000 in integer when passing it in into the API.\\n\n            Optionals:\n                ``prioritizationFeeLamports (int)``: If transactions are expiring without confirmation on-chain, this might mean that you have to pay additional fees to prioritize your transaction. To do so, you can set the prioritizationFeeLamports parameter.\\n\n                ``wrap_unwrap_sol (bool)``: Auto wrap and unwrap SOL. Default is True.\\n\n                ``slippage_bps (int)``: The slippage % in BPS. If the output token amount exceeds the slippage then the swap transaction will fail.\\n\n                ``swap_mode (str)``: (ExactIn or ExactOut) Defaults to ExactIn. ExactOut is for supporting use cases where you need an exact token amount, like payments. In this case the slippage is on the input token.\\n\n                ``only_direct_routes (bool)``: Default is False. Direct Routes limits Jupiter routing to single hop routes only.\\n\n                ``as_legacy_transaction (bool)``: Default is False. Instead of using versioned transaction, this will use the legacy transaction.\\n\n                ``exclude_dexes (list)``: Default is that all DEXes are included. You can pass in the DEXes that you want to exclude in a list. For example, ['Aldrin','Saber'].\\n\n                ``max_accounts (int)``: Find a route given a maximum number of accounts involved, this might dangerously limit routing ending up giving a bad price. The max is an estimation and not the exact count.\\n\n                ``platform_fee_bps (int)``: If you want to charge the user a fee, you can specify the fee in BPS. Fee % is taken out of the output token.\n        \n        Returns:\n            ``str``: returns serialized transactions to perform the swap from https://quote-api.jup.ag/v6/swap\n            \n        Example:\n            >>> rpc_url = \"https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/\"\n            >>> async_client = AsyncClient(rpc_url)\n            >>> private_key_string = \"tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P\"\n            >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string))\n            >>> jupiter = Jupiter(async_client, private_key)\n            >>> input_mint = \"So11111111111111111111111111111111111111112\"\n            >>> output_mint = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"\n            >>> amount = 5_000_000\n            >>> transaction_data = await jupiter.swap(user_public_key, input_mint, output_mint, amount)\n            AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAJDpQzg6Gwmq0Gtgp4+LWUVz0yQOAuHGNJAGTs0dcqEMVCoh2aSWdVMvcatcojrWtwXATiOw7/o5hE7NFuy3p8vgLfsLhf7Ff9NofcPgIyAbMytm5ggTyKwmR+JqgXUXARVfefILshj4ZhFSjUfRpiSI47mVNFUq9v5NOOCWSEZJZM/GHGfBesEb9blQsf7DnKodziY279S/OPkZf0/OalnPEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABHnVW/IxwG7udMVuzmgVB/2xst6j9I5RArHNola8E48Gm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpT0tsDkEI/SpqJHjq4KzFnbIbtO31EcFiz2AtHgwJAfuMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WbQ/+if11/ZKdMCbHylYed5LCas238ndUUsyGqezjOXoxvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWHmraeknnR8/memFAZWZHeDMQG7C5ZFLxolWUniPl6SYgcGAAUCwFwVAAYACQNIDQAAAAAAAAsGAAMACAUJAQEFAgADDAIAAAAgTgAAAAAAAAkBAwERBx8JCgADAQIECA0HBwwHGREBAhUOFxMWDxIQFAoYCQcHJMEgmzNB1pyBBwEAAAATZAABIE4AAAAAAACHBQAAAAAAADIAAAkDAwAAAQkB1rO1s+JVEuIRoGsE8f2MlAkFWssCkimIonlHpLV2w4gKBwKRTE0SjIeLSwIICg==\n        \"\"\"\n        \n        if quoteResponse is None:\n            quoteResponse = await self.quote(\n            input_mint=input_mint,\n            output_mint=output_mint,\n            amount=amount,\n            slippage_bps=slippage_bps,\n            swap_mode=swap_mode,\n            only_direct_routes=only_direct_routes,\n            as_legacy_transaction=as_legacy_transaction,\n            exclude_dexes=exclude_dexes,\n            max_accounts=max_accounts,\n            platform_fee_bps=platform_fee_bps\n            )\n        transaction_parameters = {\n            \"quoteResponse\": quoteResponse,\n            \"userPublicKey\": self.keypair.pubkey().__str__(),\n            \"wrapAndUnwrapSol\": wrap_unwrap_sol\n        }\n        if prioritization_fee_lamports:\n            transaction_parameters.update({\"prioritizationFeeLamports\": prioritization_fee_lamports})\n        transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['SWAP'], json=transaction_parameters).json()\n        return transaction_data['swapTransaction']\n\n    async def open_order(\n        self,\n        input_mint: str,\n        output_mint: str,\n        in_amount: int=0,\n        out_amount: int=0,\n        expired_at: int=None\n    ) -> dict:\n        \"\"\"Open an order.\n        \n        Args:\n            Required:\n                ``input_mint (str)``: Input token mint address\\n\n                ``output_mint (str)``: Output token mint address\\n\n                ``in_amount (int)``: The API takes in amount in integer and you have to factor in the decimals for each token by looking up the decimals for that token. For example, USDC has 6 decimals and 1 USDC is 1000000 in integer when passing it in into the API.\\n\n                ``out_amount (int)``: The API takes in amount in integer and you have to factor in the decimals for each token by looking up the decimals for that token. For example, USDC has 6 decimals and 1 USDC is 1000000 in integer when passing it in into the API.\\n\n            Optionals:\n                ``expired_at (int)``: Deadline for when the limit order expires. It can be either None or Unix timestamp in seconds.\n        Returns:\n            ``dict``: transaction_data and signature2 in order to create the limit order.\n            \n        Example:\n            >>> rpc_url = \"https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/\"\n            >>> async_client = AsyncClient(rpc_url)\n            >>> private_key_string = \"tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P\"\n            >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string))\n            >>> jupiter = Jupiter(async_client, private_key)\n            >>> input_mint = \"So11111111111111111111111111111111111111112\"\n            >>> output_mint = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"\n            >>> in_amount = 5_000_000\n            >>> out_amount = 100_000\n            >>> transaction_data = await jupiter.open_order(user_public_key, input_mint, output_mint, in_amount, out_amount)\n            {\n                'transaction_data': 'AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEGC5Qzg6Gwmq0Gtgp4+LWUVz0yQOAuHGNJAGTs0dcqEMVCBvqBKhFi2uRFEKYI4zPatxbdm7DylvnQUby9MexSmeAdsqhWUMQ86Ddz4+7pQFooE6wLglATS/YvzOVUNMOqnyAmC8Ioh9cSvEZniys4XY0OyEvxe39gSdHqlHWJQUPMn4prs0EwIc9JznmgzyMliG5PJTvaFYw75ssASGlB2gMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImg/TLoYktlelMGKAi4mA0icnTD92092qSZhd3wNABMCv4fVqQvV1OYZ3a3bH43JpI5pIln+UAHnO1fyDJwCfIGm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAQan1RcZLFxRIYzJTD1K8X9Y2u4Im6H9ROPb2YoAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKmr+pT0gdwb1ZeE73qr11921UvCtCB3MMpBcLaiY8+u7QEHDAEABAMCCAIHBgUKCRmFbkqvcJ/1nxAnAAAAAAAAECcAAAAAAAAA',\n                'signature2': Signature(\n                    2Pip6gx9FLGVqmRqfAgwJ8HEuCY8ZbUbVERR18vHyxFngSi3Jxq8Vkpm74hS5zq7RAM6tqGUAkf3ufCBsxGXZrUC,)\n            }\n        \"\"\"\n        \n        keypair = Keypair()\n        transaction_parameters = {\n            \"owner\": self.keypair.pubkey().__str__(),\n            \"inputMint\": input_mint,\n            \"outputMint\": output_mint,\n            \"outAmount\": out_amount,\n            \"inAmount\": in_amount,\n            \"base\": keypair.pubkey().__str__()\n        }\n        if expired_at:\n            transaction_parameters['expiredAt'] = expired_at\n        transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['OPEN_ORDER'], json=transaction_parameters).json()['tx']\n        raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data))\n        signature2 = keypair.sign_message(message.to_bytes_versioned(raw_transaction.message))\n        return {\"transaction_data\": transaction_data, \"signature2\": signature2}\n\n    async def cancel_orders(\n        self,\n        orders: list=[]\n    ) -> str:\n        \"\"\"Cancel open orders from a list (max. 10).\n        \n        Args:\n            Required:!:\n                ``orders (list)``: List of orders to be cancelled.\n        Returns:\n            ``str``: returns serialized transactions to cancel orders from https://jup.ag/api/limit/v1/cancelOrders\n        \n        Example:\n            >>> rpc_url = \"https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/\"\n            >>> async_client = AsyncClient(rpc_url)\n            >>> private_key_string = \"tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P\"\n            >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string))\n            >>> jupiter = Jupiter(async_client, private_key)\n            >>> list_orders = [item['publicKey'] for item in await jupiter.query_open_orders()] # Cancel all open orders\n            >>> transaction_data = await jupiter.cancel_orders(orders=openOrders)\n            AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAQIlDODobCarQa2Cnj4tZRXPTJA4C4cY0kAZOzR1yoQxUIklPdDonxNd5JDfdYoHE56dvNBQ1SLN90fFZxvVlzZr9DPwpfbd+ANTB35SSvHYVViD27UZR578oC2faxJea7y958guyGPhmEVKNR9GmJIjjuZU0VSr2/k044JZIRklkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr+H1akL1dTmGd2t2x+NyaSOaSJZ/lAB5ztX8gycAnyBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAEG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqW9ZjNTy3JS6YYFodCWqtWH80+eLPmN4igHrkYHIsdQfAQUHAQIAAwQHBghfge3wCDHfhA==\n        \"\"\"\n        \n        transaction_parameters = {\n            \"owner\": self.keypair.pubkey().__str__(),\n            \"feePayer\": self.keypair.pubkey().__str__(), \n            \"orders\": orders\n        }\n        transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['CANCEL_ORDERS'], json=transaction_parameters).json()['tx']\n        return transaction_data\n\n    @staticmethod\n    async def query_open_orders(\n        wallet_address: str,\n        input_mint: str=None,\n        output_mint: str=None\n    ) -> list:\n        \"\"\"     \n        Query open orders from self.keypair public address.\n        \n        Args:\n            Required:\n                ``wallet_address (str)``: Wallet address.\n            Optionals:\n                ``input_mint (str)``: Input token mint address.\n                ``output_mint (str)``: Output token mint address.\n        Returns:\n            ``list``: returns open orders list from https://jup.ag/api/limit/v1/openOrders\n            \n        Example:\n            >>> list_open_orders = await Jupiter.query_open_orders(\"AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX\")\n            [\n                {   \n                    'publicKey': '3ToRYxxMHN3CHkbqWHcbXBCBLNqmDeLoubGGfNKGSCDL',\n                    'account': {\n                        'maker': 'AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX',\n                        'inputMint': 'So11111111111111111111111111111111111111112',\n                        'outputMint': 'AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3',\n                        'oriInAmount': '10000',\n                        'oriOutAmount': '10000',\n                        'inAmount': '10000',\n                        'outAmount': '10000',\n                        'expiredAt': None,\n                        'base': 'FghAhphJkhT74PXFQAz3QKqGVGA72Y2gUeVHU7QRw31c'\n                    }\n                }\n            ]      \n        \"\"\"\n        \n        query_openorders_url = \"https://jup.ag/api/limit/v1/openOrders?wallet=\" + wallet_address\n        if input_mint:\n            query_openorders_url += \"inputMint=\" + input_mint\n        if output_mint:\n            query_openorders_url += \"outputMint\" + output_mint\n            \n        list_open_orders = httpx.get(query_openorders_url, timeout=Timeout(timeout=30.0)).json()\n        return list_open_orders\n\n    @staticmethod\n    async def query_orders_history(\n        wallet_address: str,\n        cursor: int=None,\n        skip: int=None,\n        take: int=None\n    ) -> list:\n        \"\"\"\n        Query orders history from self.keypair public address.\n        \n        Args:\n            Required:\n                ``wallet_address (str)``: Wallet address.\n            Optionals:\n                ``cursor (int)``: Pointer to a specific result in the data set.\n                ``skip (int)``: Number of records to skip from the beginning.\n                ``take (int)``: Number of records to retrieve from the current position.\n        Returns:\n            ``list``: returns open orders list from https://jup.ag/api/limit/v1/orderHistory\n            \n        Example:\n            >>> list_orders_history = await Jupiter.query_orders_history(\"AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX\")\n            [\n                {\n                    'id': 1639144,\n                    'orderKey': '3ToRYxxMHN3CHkbqWHcbXBCBLNqmDeLoubGGfNKGSCDL',\n                    'maker': 'AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX',\n                    'inputMint': 'So11111111111111111111111111111111111111112',\n                    'outputMint': 'AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3',\n                    'inAmount': '10000',\n                    'oriInAmount': '10000',\n                    'outAmount': '10000',\n                    'oriOutAmount': '10000',\n                    'expiredAt': None,\n                    'state': 'Cancelled',\n                    'createTxid': '4CYy8wZG2aRPctL9do7UBzaK9w4EDLJxGkkU1EEAx4LYNYW7j7Kyet2vL4q6cKK7HbJNHp6QXzLQftpTiDdhtyfL',\n                    'cancelTxid': '83eN6Lm41t2VWUchm1T6hWX2qK3sf39XzPGbxV9s2WjBZfdUADQdRGg2Y1xAKn4igMJU1xRPCTgUhnm6qFUPWRc',\n                    'updatedAt': '2023-12-18T15:55:30.617Z',\n                    'createdAt': '2023-12-18T15:29:34.000Z'\n                }\n            ]\n        \"\"\"\n        \n        query_orders_history_url = \"https://jup.ag/api/limit/v1/orderHistory\" + \"?wallet=\" + wallet_address\n        if cursor:\n            query_orders_history_url += \"?cursor=\" + str(cursor)\n        if skip:\n            query_orders_history_url += \"?skip=\" + str(skip)\n        if take:\n            query_orders_history_url += \"?take=\" + str(take)\n            \n        list_orders_history = httpx.get(query_orders_history_url, timeout=Timeout(timeout=30.0)).json()\n        return list_orders_history\n\n    @staticmethod\n    async def query_trades_history(\n        wallet_address: str,\n        input_mint: str=None,\n        output_mint: str=None,\n        cursor: int=None,\n        skip: int=None,\n        take: int=None\n    ) -> list:\n        \"\"\"\n        Query trades history from a public address.\n        \n        Args:\n            Required:\n                ``wallet_address (str)``: Wallet address.\n            Optionals:\n                ``input_mint (str)``: Input token mint address.\n                ``output_mint (str)``: Output token mint address.\n                ``cursor (int)``: Pointer to a specific result in the data set.\n                ``skip (int)``: Number of records to skip from the beginning.\n                ``take (int)``: Number of records to retrieve from the current position.\n        Returns:\n            ``list``: returns trades history list from https://jup.ag/api/limit/v1/tradeHistory\n        \n        Example:\n            >>> list_trades_history = await Jupiter.query_trades_history(\"AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX\")\n            [\n                {\n                    'id': 10665592,\n                    'inAmount':\n                    '10000000',\n                    'outAmount': '675870652',\n                    'txid': '5rmA1S5MDAVdRYWeVgUWYFp6pYuy5vwrYpRJUJdhjoWnuuheeg1YwqK6P5H6u4tv99cUwQttSBYm6kjSNHJGENgb',\n                    'updatedAt': '2023-12-13T15:39:04.800Z',\n                    'createdAt': '2023-12-13T15:37:08.000Z',\n                    'order': {\n                        'id': 1278268,\n                        'orderKey': '3bGykFCMWPNQDTRVBdKBbZuVHqNB5z5XaphkRHLWYmE5',\n                        'inputMint': 'So11111111111111111111111111111111111111112',\n                        'outputMint': '8XSsNvaKU9FDhYWAv7Yc7qSNwuJSzVrXBNEk7AFiWF69'\n                    }\n                }\n            ]\n        \"\"\"\n        \n        query_tradeHistoryUrl = \"https://jup.ag/api/limit/v1/tradeHistory\" + \"?wallet=\" + wallet_address\n        if input_mint:\n            query_tradeHistoryUrl += \"inputMint=\" + input_mint\n        if output_mint:\n            query_tradeHistoryUrl += \"outputMint\" + output_mint\n        if cursor:\n            query_tradeHistoryUrl += \"?cursor=\" + cursor\n        if skip:\n            query_tradeHistoryUrl += \"?skip=\" + skip\n        if take:\n            query_tradeHistoryUrl += \"?take=\" + take\n            \n        tradeHistory = httpx.get(query_tradeHistoryUrl, timeout=Timeout(timeout=30.0)).json()\n        return tradeHistory\n    \n    @staticmethod\n    async def get_indexed_route_map(\n    ) -> dict:\n        \"\"\"\n        Retrieve an indexed route map for all the possible token pairs you can swap between.\n\n        Returns:\n            ``dict``: indexed route map for all the possible token pairs you can swap betwee from https://quote-api.jup.ag/v6/indexed-route-map\n        \n        Example:\n            >>> indexed_route_map = await Jupiter.get_indexed_route_map()\n        \"\"\"\n        \n        indexed_route_map = httpx.get(\"https://quote-api.jup.ag/v6/indexed-route-map\", timeout=Timeout(timeout=30.0)).json()\n        return indexed_route_map\n\n    @staticmethod\n    async def get_tokens_list(\n        list_type: str=\"strict\",\n        banned_tokens: bool=False\n    ) -> dict:\n        \"\"\"\n        The Jupiter Token List API is an open, collaborative, and dynamic token list to make trading on Solana more transparent and safer for users and developers.\\n\n        There are two types of list:\\n\n        ``strict``\\n\n            - Only tokens that are tagged \"old-registry\", \"community\", or \"wormhole\" verified.\\n\n            - No unknown and banned tokens.\\n\n        ``all``\\n\n            - Everything including unknown/untagged tokens that are picked up automatically.\\n\n            - It does not include banned tokens by default.\\n\n            - Often, projects notice that the token got banned and withdraw liquidity. As our lists are designed for trading, banned tokens that used to, but no longer meet our minimum liquidity requirements will not appear in this response.\n        \n        Args:\n            Optionals:\n                ``list_type (str)``: Default is \"strict\" (strict/all).\n                ``banned_tokens (bool)``: Only if list_type is \"all\"\n        Returns:\n            ``dict``: indexed route map for all the possible token pairs you can swap betwee from https://token.jup.ag/{list_type}\n        \n        Example:\n        >>> tokens_list = await Jupiter.get_tokens_list()\n        \"\"\"\n        \n        tokens_list_url = \"https://token.jup.ag/\"  + list_type\n        if banned_tokens is True:\n            tokens_list_url +=  \"?includeBanned=true\"\n        tokens_list = httpx.get(tokens_list_url, timeout=Timeout(timeout=30.0)).json()\n        return tokens_list\n\n    @staticmethod\n    async def get_all_tickers(\n    ) -> dict:\n        \"\"\"Returns all tickers (cached for every 2-5 mins) from https://stats.jup.ag/coingecko/tickers\n\n        Returns:\n            ``dict``: all tickers(cached for every 2-5 mins)\n\n        Example:\n            >>> all_tickers_list = await Jupiter.get_all_tickers()\n        \"\"\"\n        all_tickers_list = httpx.get(\"https://stats.jup.ag/coingecko/tickers\", timeout=Timeout(timeout=30.0)).json()\n        return all_tickers_list\n\n    @staticmethod\n    async def get_all_swap_pairs(\n    ) -> dict:\n        \"\"\"Returns all swap pairs (cached for every 2-5 mins) from https://stats.jup.ag/coingecko/pairs\n\n        Returns:\n            ``dict``: all swap pairs\n\n        Example:\n            >>> all_swap_pairs_list = await Jupiter.get_all_swap_pairs()\n        \"\"\"\n        all_swap_pairs_list = httpx.get(\"https://stats.jup.ag/coingecko/pairs\", timeout=Timeout(timeout=30.0)).json()\n        return all_swap_pairs_list\n\n    @staticmethod\n    async def get_swap_pairs(\n        input_mint: str,\n        output_mint: str,\n    ) -> dict:\n        \"\"\"Returns swap pairs for input token and output token\n        \n        Args:\n            Required:\n                ``input_mint (str)``: Input token mint address.\\n\n                ``output_mint (str)``: Output token mint address.\\n\n\n        Returns:\n            ``dict``: all swap pairs for input token and output token\n\n        Example:\n            >>> swap_pairs_list = await Jupiter.get_swap_pairs(\"So11111111111111111111111111111111111111112\", \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\")\n        \"\"\"\n        swap_pairs_url = \"https://stats.jup.ag/coingecko/tickers?ticker_id=\" + input_mint + \"_\" + output_mint\n        swap_pairs_list = httpx.get(swap_pairs_url, timeout=Timeout(timeout=30.0)).json()\n        return swap_pairs_list\n    \n    @staticmethod\n    async def get_token_stats_by_date(\n        token: str,\n        date: str,\n    ) -> list:\n        \"\"\"Returns swap pairs for input token and output token\n        \n        Args:\n            Required:\n                ``token (str)``: Input token mint address.\\n\n                ``date (str)``: YYYY-MM-DD format date.\\n\n                \n        Returns:\n            ``list``: all swap pairs for input token and output token\n\n        Example:\n            >>> token_stats_by_date = await Jupiter.get_swap_pairs(\"B5mW68TkDewnKvWNc2trkmmdSRxcCjZz3Yd9BWxQTSRU\", \"2022-04-1\")\n        \"\"\"\n        token_stats_by_date_url = \"https://stats.jup.ag/token-ledger/\" + token + \"/\" + date\n        token_stats_by_date = httpx.get(token_stats_by_date_url, timeout=Timeout(timeout=30.0)).json()\n        return token_stats_by_date\n\n    @staticmethod\n    async def get_jupiter_stats(\n        unit_of_time: str,\n    ) -> dict:\n        \"\"\"Stats for the unit of time specified.\n        \n        Args:\n            Required:\n                ``unit_of_time (str)``: Unit of time: day/week/month\n                \n        Returns:\n            ``dict``: stats for the unit of time specified.\n\n        Example:\n            >>> jupiter_stats = await Jupiter.get_jupiter_stats(\"day\")\n        \"\"\"\n        jupiter_stats_url = \"https://stats.jup.ag/info/\" + unit_of_time\n        jupiter_stats = httpx.get(jupiter_stats_url, timeout=Timeout(timeout=30.0)).json()\n        return jupiter_stats\n\n    @staticmethod\n    async def get_token_price(\n        input_mint: str,\n        output_mint: str=None,\n    ) -> dict:\n        \"\"\"The Jupiter Price API aims to make getting precise and real-time pricing for all SPL tokens as powerful and simple as possible.\n        \n        Args:\n            Required:\n                ``input_mint (str)``: Input token mint name or address.\n            Optionals:\n                ``output_mint (str)``: Output token mint name or address.\n                \n        Returns:\n            ``dict``: id, mintSymbol, vsToken, vsTokenSymbol, price, timeTaken\n\n        Example:\n            >>> token_price = await Jupiter.get_jupiter_stats(\"So11111111111111111111111111111111111111112\", \"USDC\")\n        {\n            'So11111111111111111111111111111111111111112': {\n                'id': 'So11111111111111111111111111111111111111112',\n                'mintSymbol': 'SOL',\n                'vsToken': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n                'vsTokenSymbol': 'USDC',\n                'price': 71.893496709\n            }\n        }\n        \"\"\"\n        token_prices_url = \"https://price.jup.ag/v4/price?ids=\" + input_mint\n        if output_mint:\n            token_prices_url += \"&vsToken=\" + output_mint\n        token_prices = httpx.get(token_prices_url, timeout=Timeout(timeout=30.0)).json()['data']\n        return token_prices\n\n    @staticmethod\n    async def program_id_to_label(\n    ) -> dict:\n        \"\"\"Returns a dict, which key is the program id and value is the label.\\n\n        This is used to help map error from transaction by identifying the fault program id.\\n\n        With that, we can use the exclude_dexes or dexes parameter for swap.\n\n        Returns:\n            ``dict``: program_id and label\n\n        Example:\n            >>> program_id_to_label_list = await Jupiter.program_id_to_label()\n        \"\"\"\n        program_id_to_label_list = httpx.get(\"https://quote-api.jup.ag/v6/program-id-to-label\", timeout=Timeout(timeout=30.0)).json()\n        return program_id_to_label_list\n"
  },
  {
    "path": "src/setup.py",
    "content": "from setuptools import setup, find_packages\nimport codecs\nimport os\n\nhere = os.path.abspath(os.path.dirname(__file__))\n\nwith codecs.open(os.path.join(here, \"README.md\"), encoding=\"utf-8\") as fh:\n    long_description = \"\\n\" + fh.read()\n\nVERSION = '0.0.2.0'\nDESCRIPTION = 'Jupiter Python SDK'\nLONG_DESCRIPTION = 'This package allows the use of Jupiter decentralized exchange features on Solana using Python.'\n\n# Setting up\nsetup(\n    name=\"jupiter-python-sdk\",\n    version=VERSION,\n    author=\"TaoDev\",\n    author_email=\"taodev3@proton.me\",\n    description=DESCRIPTION,\n    long_description_content_type=\"text/markdown\",\n    long_description=long_description,\n    packages=find_packages(),\n    license=('LICENSE.txt'),\n    install_requires=[\n    'base58',\n    'solders',\n    'solana',\n    'httpx',\n    'anchorpy',\n    ],\n    keywords=['python', 'solana', 'jupiter', 'dex', 'trading', 'sdk'],\n    classifiers=[\n        \"Development Status :: 3 - Alpha\",\n        \"Intended Audience :: Developers\",\n        \"Programming Language :: Python :: 3\",\n        \"Operating System :: Unix\",\n        \"Operating System :: MacOS :: MacOS X\",\n        \"Operating System :: Microsoft :: Windows\",\n    ]\n)"
  }
]