From 0605ecee9360624c6f92f36f4525030c7f4fbcd2 Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Sat, 23 Dec 2023 11:36:49 +0100 Subject: [PATCH 01/36] [+] Fix package installation (wrong readme.md) --- src/{jupiter_python_sdk => }/LICENSE.txt | 0 src/{jupiter_python_sdk => }/README.md | 0 src/build/lib/jupiter_python_sdk/__init__.py | 1 - src/build/lib/jupiter_python_sdk/jupiter.py | 1122 ----------------- src/dist/jupiter-python-sdk-0.0.1.1.tar.gz | Bin 19880 -> 0 bytes src/dist/jupiter-python-sdk-0.0.1.3.tar.gz | Bin 0 -> 21017 bytes .../jupiter_python_sdk-0.0.1-py3-none-any.whl | Bin 17939 -> 0 bytes src/jupiter_python_sdk.egg-info/PKG-INFO | 294 ++--- src/jupiter_python_sdk.egg-info/SOURCES.txt | 2 + src/setup.py | 5 +- 10 files changed, 153 insertions(+), 1271 deletions(-) rename src/{jupiter_python_sdk => }/LICENSE.txt (100%) rename src/{jupiter_python_sdk => }/README.md (100%) delete mode 100644 src/build/lib/jupiter_python_sdk/__init__.py delete mode 100644 src/build/lib/jupiter_python_sdk/jupiter.py delete mode 100644 src/dist/jupiter-python-sdk-0.0.1.1.tar.gz create mode 100644 src/dist/jupiter-python-sdk-0.0.1.3.tar.gz delete mode 100644 src/dist/jupiter_python_sdk-0.0.1-py3-none-any.whl diff --git a/src/jupiter_python_sdk/LICENSE.txt b/src/LICENSE.txt similarity index 100% rename from src/jupiter_python_sdk/LICENSE.txt rename to src/LICENSE.txt diff --git a/src/jupiter_python_sdk/README.md b/src/README.md similarity index 100% rename from src/jupiter_python_sdk/README.md rename to src/README.md diff --git a/src/build/lib/jupiter_python_sdk/__init__.py b/src/build/lib/jupiter_python_sdk/__init__.py deleted file mode 100644 index f987a05..0000000 --- a/src/build/lib/jupiter_python_sdk/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Classes to use Jupiter features.""" diff --git a/src/build/lib/jupiter_python_sdk/jupiter.py b/src/build/lib/jupiter_python_sdk/jupiter.py deleted file mode 100644 index 207fd54..0000000 --- a/src/build/lib/jupiter_python_sdk/jupiter.py +++ /dev/null @@ -1,1122 +0,0 @@ -import base64 -import json -import time -import struct - -import httpx -from httpx._config import Timeout - -from typing import Any - -from solders import message -from solders.pubkey import Pubkey -from solders.keypair import Keypair -from solders.transaction import VersionedTransaction -from solders.system_program import transfer, TransferParams - -from solana.rpc.types import TxOpts -from solana.rpc.async_api import AsyncClient -from solana.rpc.commitment import Processed - -from spl.token.instructions import create_associated_token_account, get_associated_token_address, sync_native, SyncNativeParams, close_account, CloseAccountParams -from spl.token.constants import * - -from construct import Container -from anchorpy.program.core import Program as AnchorProgram -from anchorpy.program.core import Idl, Provider -from anchorpy.provider import Wallet -from anchorpy import Context -from anchorpy import AccountsCoder - - -class Jupiter_DCA(): - - DCA_PROGRAM_ID = Pubkey.from_string("DCA265Vj8a9CEuX1eb1LWRnDT7uK6q1xMipnNyatn23M") - 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"}]} - - def __init__( - self, - async_client: AsyncClient, - keypair: Keypair - ): - self.rpc = async_client - self.keypair = keypair - self.dca_program = AnchorProgram( - idl=Idl.from_json(json.dumps(self.IDL)), - program_id=self.DCA_PROGRAM_ID, - provider=Provider( - connection=self.rpc, - wallet=Wallet(payer=self.keypair), - opts=TxOpts(skip_preflight=True, preflight_commitment=Processed) - ) - ) - - async def get_mint_token_program( - self, - token_mint: Pubkey, - ) -> Pubkey: - """Returns token mint token program from token mint Pubkey. - - Args: - ``token_mint (Pubkey)``: Pubkey of the token mint. - - Returns: - ``Pubkey (Pubkey)``: Mint token program Pubkey. - - Example: - >>> rpc_url = "https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/" - >>> async_client = AsyncClient(rpc_url) - >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" - >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) - >>> jupiter = Jupiter(async_client, private_key) - >>> token_mint = Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") - >>> token_mint_program = await jupiter.dca.get_mint_token_program(token_mint) - - Pubkey( - TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA, - ) - """ - - mint_token_program_info = await self.rpc.get_account_info(token_mint) - mint_token_program = mint_token_program_info.value.owner - return mint_token_program - - async def get_or_create_associated_token_address( - self, - token_mint: Pubkey, - ) -> dict: - """Returns assosciated token address Pubkey with instruction to create it if it doesn't exists. - - Args: - ``token_mint (Pubkey)``: Pubkey of the token mint. - - Returns: - ``Dict``: Associated token address Pubkey and instruction. - - Example: - >>> rpc_url = "https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/" - >>> async_client = AsyncClient(rpc_url) - >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" - >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) - >>> jupiter = Jupiter(async_client, private_key) - >>> token_mint = Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") - >>> associated_token_address = await jupiter.dca.get_or_create_associated_token_address(token_mint) - - {'pubkey': Pubkey( - 2GWpKNsfBq7y2LS9FNpAUWsr6atnywB7JTwRrifMHzwU, - ), 'instruction': Instruction( - Instruction { - program_id: ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL, - accounts: [ - AccountMeta { - pubkey: AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX, - is_signer: True, - is_writable: True, - }, - AccountMeta { - pubkey: 2GWpKNsfBq7y2LS9FNpAUWsr6atnywB7JTwRrifMHzwU, - is_signer: False, - is_writable: True, - }, - AccountMeta { - pubkey: AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX, - is_signer: False, - is_writable: False, - }, - AccountMeta { - pubkey: EPjFWdd1ufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v, - is_signer: False, - is_writable: False, - }, - AccountMeta { - pubkey: 11111111111111111111111111111111, - is_signer: False, - is_writable: False, - }, - AccountMeta { - pubkey: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA, - is_signer: False, - is_writable: False, - }, - AccountMeta { - pubkey: SysvarRent111111111111111111111111111111111, - is_signer: False, - is_writable: False, - }, - ], - data: [], - }, - )} - """ - - toAccount = get_associated_token_address(self.keypair.pubkey(), token_mint) - accountInfo = await self.rpc.get_account_info(toAccount) - account = accountInfo.value - - if account: - instruction = None - return {'pubkey': toAccount, 'instruction': instruction} - else: - instruction = create_associated_token_account(self.keypair.pubkey(), self.keypair.pubkey(), token_mint) - return {'pubkey': toAccount, 'instruction': instruction} - - async def get_dca_pubkey( - self, - input_mint: Pubkey, - output_mint: Pubkey, - uid: int, - ) -> Pubkey: - """Returns DCA Pubkey to be created. - - Args: - ``input_mint (Pubkey)``: Pubkey of the token to sell. - ``output_mint (Pubkey)``: Pubkey of the token to buy. - ``uid (int)``: A unix timestamp in seconds. - - Returns: - ``Pubkey``: DCA Pubkey to be created. - - Example: - >>> rpc_url = "https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/" - >>> async_client = AsyncClient(rpc_url) - >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" - >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) - >>> jupiter = Jupiter(async_client, private_key) - >>> input_mint = Pubkey.from_string("So11111111111111111111111111111111111111112") - >>> output_mint = Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") - >>> uid = int(time.time()) - >>> dca_pubkey = await jupiter.dca.get_dca_pubkey(input_mint, output_mint, uid) - - Pubkey( - ArotVdXCEw4Zy5ywUVP7ZJBPFvXR8v8Md6jSQK9pLaCb, - ) - """ - - dcaPubKey = Pubkey.find_program_address( - seeds=[ - b'dca', - self.keypair.pubkey().__bytes__(), - input_mint.__bytes__(), - output_mint.__bytes__(), - struct.pack(" Container[Any]: - """Fetch DCA Account Anchor Data - - Args: - ``dca_pubkey (Pubkey)``: Pubkey of the DCA account. - - Returns: - ``Dca``: DCA Account Anchor Data - - Example: - >>> rpc_url = "https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/" - >>> async_client = AsyncClient(rpc_url) - >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" - >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) - >>> jupiter = Jupiter(async_client, private_key) - >>> dca_pubkey = Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") - >>> fetch_dca_data = await jupiter.dca.fetch_dca_data(dca_pubkey) - Dca(user=Pubkey( - AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX, - ), input_mint=Pubkey( - So11111111111111111111111111111111111111112, - ), output_mint=Pubkey( - EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v, - ), 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( - 3NFmVtdyxQvmhXa1a82j62dd9kCmKFa3uv3vv7WRQsRY, - ), out_account=Pubkey( - ErFYjASdQ5HVtJoQ3dqrjp8MgFKjSjFVQiRSqBbKT9kJ, - ), 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) - """ - dca_account_coder = AccountsCoder(idl=Idl.from_json(json.dumps(self.IDL))) - get_dca_account_details = await self.rpc.get_account_info(dca_pubkey) - dca_account_details = get_dca_account_details.value.data - dca_account_decoded_details = dca_account_coder.decode(dca_account_details) - return dca_account_decoded_details - - async def create_dca( - self, - input_mint: Pubkey, - output_mint: Pubkey, - total_in_amount: int, - in_amount_per_cycle: int, - cycle_frequency: int, - min_out_amount_per_cycle: int=None, - max_out_amount_per_cycle: int=None, - start_at: int=0, - ) -> dict: - """Setting up a DCA account with signing and sending the transaction. - - Args: - ``input_mint (Pubkey)``: Pubkey of the token to sell. - ``output_mint (Pubkey)``: Pubkey of the token to buy. - ``total_in_amount (int)``: Total input mint amount to sell. - ``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. - ``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. - ``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. - ``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. - ``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. - - Returns: - ``Dict``: Transaction hash and DCA Account Pubkey. - - Example: - >>> rpc_url = "https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/" - >>> async_client = AsyncClient(rpc_url) - >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" - >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) - >>> jupiter = Jupiter(async_client, private_key) - >>> input_mint = Pubkey.from_string("So11111111111111111111111111111111111111112") - >>> output_mint = Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") - >>> total_in_amount = 5_000_000 - >>> in_amount_per_cycle = 100 - >>> cycle_frequency = 60 - >>> min_out_amount_per_cycle = 0 - >>> max_out_amount_per_cycle = 0 - >>> start = 0 - >>> 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) - - { - 'dca_pubkey': Pubkey(Duop8ynu7WozpmLUsc1pAq6gobS3vdxe8GJMFzF8rY56,), - 'transaction_hash': '5zFwgyHExYcWLTgqh6GMDPML2mPHzmJUFfsVD882tYd4oGhekiDufcBZSbcoNFKxvhRLQt8WwYU4SsW8fCefYmHf' - } - """ - - pre_instructions = [] - post_instructions = [] - - input_token_program, output_token_program = await self.get_mint_token_program(input_mint), await self.get_mint_token_program(output_mint) - user_input_account = get_associated_token_address(self.keypair.pubkey(), input_mint) - - if input_mint == WRAPPED_SOL_MINT: - input_mint_ata = await self.get_or_create_associated_token_address(input_mint) - transfer_IX = transfer(TransferParams( - from_pubkey=self.keypair.pubkey(), - to_pubkey=user_input_account, - lamports=total_in_amount - )) - sync_native_IX = sync_native(SyncNativeParams( - program_id=input_token_program, - account=user_input_account - )) - - if input_mint_ata['instruction']: - pre_instructions.append(input_mint_ata['instruction']) - post_instructions.append(close_account( - CloseAccountParams( - program_id=input_mint_ata['pubkey'], - account=self.keypair.pubkey(), - dest=self.keypair.pubkey(), - owner=self.keypair.pubkey() - ) - )) - - pre_instructions.append(transfer_IX) - pre_instructions.append(sync_native_IX) - - if output_mint != WRAPPED_SOL_MINT: - output_mint_ata = await self.get_or_create_associated_token_address(output_mint) - - if output_mint_ata['instruction']: - pre_instructions.append(output_mint_ata['instruction']) - - uid = int(time.time()) - dca_pubkey = await self.get_dca_pubkey(input_mint, output_mint, uid) - - accounts = { - 'dca': dca_pubkey, - 'user': self.keypair.pubkey(), - 'payer': self.keypair.pubkey(), - 'input_mint': input_mint, - 'output_mint': output_mint, - 'user_ata': user_input_account, - 'in_ata': get_associated_token_address(dca_pubkey, input_mint), - 'out_ata': get_associated_token_address(dca_pubkey, output_mint), - 'system_program': Pubkey.from_string("11111111111111111111111111111111"), - 'token_program': Pubkey.from_string("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), - 'associated_token_program': Pubkey.from_string("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"), - 'event_authority': Pubkey.from_string("Cspp27eGUDMXxPEdhmEXFVRn6Lt1L7xJyALF3nmnWoBj"), - 'program': self.DCA_PROGRAM_ID - } - - transaction = await self.dca_program.rpc['open_dca']( - uid, - total_in_amount, - in_amount_per_cycle, - cycle_frequency, - min_out_amount_per_cycle, - max_out_amount_per_cycle, - start_at, - False, - ctx=Context( - accounts=accounts, - signers=[self.keypair], - pre_instructions=pre_instructions, - # post_instructions=post_instructions, - options=TxOpts(skip_preflight=False, preflight_commitment=Processed) - ) - ) - - return {'dca_pubkey': dca_pubkey, 'transaction_hash': str(transaction)} - - async def close_dca( - self, - dca_pubkey: Pubkey, - ) -> str: - """Close DCA Account with signing and sending the transaction. - - Args: - ``dca_pubkey (Pubkey)``: Pubkey of the DCA account to be closed. - - Returns: - ``str``: transaction hash of the DCA account closed. - - Example: - >>> rpc_url = "https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/" - >>> async_client = AsyncClient(rpc_url) - >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" - >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) - >>> jupiter = Jupiter(async_client, private_key) - >>> dca_pubkey = Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") - >>> close_dca = await jupiter.dca.close_dca(dca_pubkey) - HXiWtTPLjgtiuNoAN7CEfyDyftdsAnMfuQ93Yp1vukgBbdU1Lb2Bo59p48PVr7CMhxPDwGQbsfjvKT5HXXQfvE2 - """ - dca_account = await self.fetch_dca_data(dca_pubkey) - input_mint = dca_account.input_mint - output_mint = dca_account.output_mint - input_token_program, output_token_program = await self.get_mint_token_program(input_mint), await self.get_mint_token_program(output_mint) - user_input_account = get_associated_token_address(self.keypair.pubkey(), input_mint) - user_output_account = get_associated_token_address(self.keypair.pubkey(), output_mint) - reserve_input_account = get_associated_token_address(dca_pubkey, input_mint) - reserve_output_account = get_associated_token_address(dca_pubkey, output_mint) - - accounts = { - 'user': self.keypair.pubkey(), - 'dca': dca_pubkey, - 'input_mint': input_mint, - 'output_mint': output_mint, - 'in_ata': reserve_input_account, - 'out_ata': reserve_output_account, - 'user_in_ata': user_input_account, - 'user_out_ata': user_output_account, - 'system_program': Pubkey.from_string("11111111111111111111111111111111"), - 'token_program': Pubkey.from_string("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), - 'associated_token_program': Pubkey.from_string("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"), - 'event_authority': Pubkey.from_string("Cspp27eGUDMXxPEdhmEXFVRn6Lt1L7xJyALF3nmnWoBj"), - 'program': self.DCA_PROGRAM_ID - } - transaction = await self.dca_program.rpc['close_dca']( - ctx=Context( - accounts=accounts, - signers=[self.keypair], - # pre_instructions=pre_instructions, - # post_instructions=post_instructions, - options=TxOpts(skip_preflight=False, preflight_commitment=Processed) - ) - ) - return str(transaction) - - @staticmethod - async def fetch_user_dca_accounts( - wallet_address: str, - status: int - ) -> dict: - """Returns all DCA Accounts from a wallet address - - Args: - ``wallet_address (str)``: Wallet address. - ``status (int)``: 0 = DCA Running | 1 = DCA Done - - Returns: - ``dict``: all DCA Accounts from the wallet address. - - Example: - >>> wallet_address = "AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX" - >>> status = 0 - >>> user_dca_accounts = await Jupiter_DCA.fetch_user_dca_accounts(wallet_address, status) - { - 'ok': True, - 'data': { - 'dcaAccounts': [ - { - 'id': 202513, - 'createdAt': '2023-12-18T12:39:40.000Z', - 'updatedAt': '2023-12-18T12:39:42.265Z', - 'userKey': 'AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX', - 'dcaKey': 'FTG9eN99uJJBqBtcz1bR6pGfj2Pb3yNAZmGYXggcAgio', - 'inputMint': 'So11111111111111111111111111111111111111112', - 'outputMint': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', - 'inDeposited': '1000000', - 'inAmountPerCycle': '100', - 'cycleFrequency': '60', - 'closeTxHash': '', - 'openTxHash': '2bwo4ds3Xpiwr9gLptXVFTcxnz2rP9pu3fAppNn3E61g33tprBCy6X8PT3SaXMn7fpG2c5CRw1LWGMEz3ik5SgnP', - 'status': 0, - 'inWithdrawn': '0', - 'outWithdrawn': '0', - 'unfilledAmount': '1000000', - 'userClosed': False, - 'fills': [] - } - ] - } - } - """ - user_dca_accounts = httpx.get(f"https://dca-api.jup.ag/user/{wallet_address}/dca?status={status}", timeout=Timeout(timeout=30.0)).json() - return user_dca_accounts - - @staticmethod - async def fetch_dca_account_fills_history( - dca_account_address: str, - ) -> dict: - """Returns all DCA Account fills history - - Args: - ``dca_account_address (str)``: DCA Account address. - - Returns: - ``dict``: all DCA Account fills history. - - Example: - >>> dca_account_address = "C91FGJAvQgeaXka1exMihC5qChwdcJzFemFVQutv4dev" - >>> dca_account_fills_history = await Jupiter_DCA.fetch_dca_fills_history(dca_account_address) - { - 'ok': True, - 'data': { - 'fills': [ - { - 'userKey': 'AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX', - 'dcaKey': 'C91FGJAvQgeaXka1exMihC5qChwdcJzFemFVQutv4dev', - 'inputMint': 'So11111111111111111111111111111111111111112', - 'outputMint': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', - 'inAmount': '100000', - 'outAmount': '7540', - 'feeMint': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' - 'fee': '7', - 'txId': '48kC4ZnkPpiRc6T3eVKYghmUERa2geC2e9FvGbVjDMaNkbrDJ3tj36GMkNdi1AkXkqrAHoDZcLW5SFjQEZcKB2NB', - 'confirmedAt': 1703055843 - } - ] - } - } - """ - dca_account_fills_history = httpx.get(f"https://dca-api.jup.ag/dca/{dca_account_address}/fills", timeout=Timeout(timeout=30.0)).json() - return dca_account_fills_history - - @staticmethod - async def get_available_dca_tokens( - ) -> list: - """Get available tokens for DCA. - - Returns: - ``list``: all available tokens from https://cache.jup.ag/top-tokens - - Example: - >>> available_dca_tokens = await Jupiter_DCA.get_available_dca_tokens() - """ - available_dca_tokens = httpx.get(f"https://cache.jup.ag/top-tokens", timeout=Timeout(timeout=30.0)).json() - return available_dca_tokens - -class Jupiter(): - - ENDPOINT_APIS_URL = { - "QUOTE": "https://quote-api.jup.ag/v6/quote?", - "SWAP": "https://quote-api.jup.ag/v6/swap", - "OPEN_ORDER": "https://jup.ag/api/limit/v1/createOrder", - "CANCEL_ORDERS": "https://jup.ag/api/limit/v1/cancelOrders", - "QUERY_OPEN_ORDERS": "https://jup.ag/api/limit/v1/openOrders?wallet=", - "QUERY_ORDER_HISTORY": "https://jup.ag/api/limit/v1/orderHistory", - "QUERY_TRADE_HISTORY": "https://jup.ag/api/limit/v1/tradeHistory" - } - - def __init__( - self, - async_client: AsyncClient, - keypair: Keypair - ): - self.dca = Jupiter_DCA(async_client, keypair) - self.rpc = async_client - self.keypair = keypair - - async def quote( - self, - input_mint: Pubkey, - output_mint: Pubkey, - amount: int, - slippage_bps: int=None, - swap_mode: str="ExactIn", - only_direct_routes: bool=False, - as_legacy_transaction: bool=False, - exclude_dexes: list=None, - max_accounts: int=None - ) -> dict: - """Get the best swap route for a token trade pair sorted by largest output token amount from https://quote-api.jup.ag/v6/quote - - Args: - Required: - ``input_mint (Pubkey)``: Input token mint Pubkey\n - ``output_mint (Pubkey)``: Output token mint Pubkey\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 - Optionals: - ``slippage_bps (int)``: The slippage % in BPS. If the output token amount exceeds the slippage then the swap transaction will fail.\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 - ``only_direct_routes (bool)``: Default is False. Direct Routes limits Jupiter routing to single hop routes only.\n - ``as_legacy_transaction (bool)``: Default is False. Instead of using versioned transaction, this will use the legacy transaction.\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 - ``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. - - Returns: - ``dict``: returns best swap route - - Example: - >>> rpc_url = "https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/" - >>> async_client = AsyncClient(rpc_url) - >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" - >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) - >>> jupiter = Jupiter(async_client, private_key) - >>> input_mint = Pubkey.from_string("So11111111111111111111111111111111111111112") - >>> output_mint = Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") - >>> amount = 5_000_000 - >>> quote = await jupiter.quote(input_mint, output_mint, amount) - { - 'inputMint': 'So11111111111111111111111111111111111111112', - 'inAmount': '5000000', - 'outputMint': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', - 'outAmount': '353237', - 'otherAmountThreshold':'351471', - 'swapMode': 'ExactIn', - 'slippageBps': 50, - 'platformFee': None, - 'priceImpactPct': '0', - 'routePlan': [{'swapInfo': {'ammKey': 'Cx8eWxJAaCQAFVmv1mP7B2cVie2BnkR7opP8vUh23Wcr', 'label': 'Lifinity V2', 'inputMint': 'So11111111111111111111111111111111111111112', 'outputMint': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', 'inAmount': '5000000', 'outAmount': '353237', 'feeAmount': '1000', 'feeMint': 'So11111111111111111111111111111111111111112'}, 'percent': 100}], - 'contextSlot': 236625263, - 'timeTaken': 0.069434356} - """ - - quote_url = self.ENDPOINT_APIS_URL['QUOTE'] + "inputMint=" + input_mint.__str__() + "&outputMint=" + output_mint.__str__() + "&amount=" + str(amount) + "&swapMode=" + swap_mode + "&onlyDirectRoutes=" + str(only_direct_routes).lower() + "&asLegacyTransaction=" + str(as_legacy_transaction).lower() - if slippage_bps: - quote_url += "&slippageBps=" + str(slippage_bps) - if exclude_dexes: - quote_url += "&excludeDexes=" + ','.join(exclude_dexes).lower() - if max_accounts: - quote_url += "&maxAccounts=" + str(max_accounts) - - quote_response = httpx.get(url=quote_url).json() - return quote_response - - async def swap( - self, - input_mint: Pubkey, - output_mint: Pubkey, - amount: int=0, - wrap_unwrap_sol: bool=True, - slippage_bps: int=0, - swap_mode: str="ExactIn", - only_direct_routes: bool=False, - as_legacy_transaction: bool=False, - exclude_dexes: list=None, - max_accounts: int=None - ) -> str: - """Perform a swap. - - Args: - Required: - ``input_mint (Pubkey)``: Input token mint Pubkey\n - ``output_mint (Pubkey)``: Output token mint Pubkey\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 - Optionals: - ``wrap_unwrap_sol (bool)``: Auto wrap and unwrap SOL. Default is True.\n - ``slippage_bps (int)``: The slippage % in BPS. If the output token amount exceeds the slippage then the swap transaction will fail.\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 - ``only_direct_routes (bool)``: Default is False. Direct Routes limits Jupiter routing to single hop routes only.\n - ``as_legacy_transaction (bool)``: Default is False. Instead of using versioned transaction, this will use the legacy transaction.\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 - ``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. - - Returns: - ``str``: returns serialized transactions to perform the swap from https://quote-api.jup.ag/v6/swap - - Example: - >>> rpc_url = "https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/" - >>> async_client = AsyncClient(rpc_url) - >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" - >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) - >>> jupiter = Jupiter(async_client, private_key) - >>> input_mint = Pubkey.from_string("So11111111111111111111111111111111111111112") - >>> output_mint = Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") - >>> amount = 5_000_000 - >>> transaction_data = await jupiter.swap(user_public_key, input_mint, output_mint, amount) - AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAJDpQzg6Gwmq0Gtgp4+LWUVz0yQOAuHGNJAGTs0dcqEMVCoh2aSWdVMvcatcojrWtwXATiOw7/o5hE7NFuy3p8vgLfsLhf7Ff9NofcPgIyAbMytm5ggTyKwmR+JqgXUXARVfefILshj4ZhFSjUfRpiSI47mVNFUq9v5NOOCWSEZJZM/GHGfBesEb9blQsf7DnKodziY279S/OPkZf0/OalnPEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABHnVW/IxwG7udMVuzmgVB/2xst6j9I5RArHNola8E48Gm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpT0tsDkEI/SpqJHjq4KzFnbIbtO31EcFiz2AtHgwJAfuMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WbQ/+if11/ZKdMCbHylYed5LCas238ndUUsyGqezjOXoxvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWHmraeknnR8/memFAZWZHeDMQG7C5ZFLxolWUniPl6SYgcGAAUCwFwVAAYACQNIDQAAAAAAAAsGAAMACAUJAQEFAgADDAIAAAAgTgAAAAAAAAkBAwERBx8JCgADAQIECA0HBwwHGREBAhUOFxMWDxIQFAoYCQcHJMEgmzNB1pyBBwEAAAATZAABIE4AAAAAAACHBQAAAAAAADIAAAkDAwAAAQkB1rO1s+JVEuIRoGsE8f2MlAkFWssCkimIonlHpLV2w4gKBwKRTE0SjIeLSwIICg== - """ - - quoteResponse = await self.quote( - input_mint=input_mint, - output_mint=output_mint, - amount=amount, - slippage_bps=slippage_bps, - swap_mode=swap_mode, - only_direct_routes=only_direct_routes, - as_legacy_transaction=as_legacy_transaction, - exclude_dexes=exclude_dexes, - max_accounts=max_accounts - ) - transaction_parameters = { - "quoteResponse": quoteResponse, - "userPublicKey": self.keypair.pubkey(), - "wrapUnwrapSOL": wrap_unwrap_sol - } - transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['SWAP'], json=transaction_parameters).json()['swapTransaction'] - return transaction_data - - async def open_order( - self, - input_mint: Pubkey, - output_mint: Pubkey, - in_amount: int=0, - out_amount: int=0, - expired_at: int=None - ) -> dict: - """Open an order. - - Args: - Required: - ``input_mint (Pubkey)``: Input token mint Pubkey\n - ``output_mint (Pubkey)``: Output token mint Pubkey\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 - ``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 - Optionals: - ``expired_at (int)``: Deadline for when the limit order expires. It can be either None or Unix timestamp in seconds. - Returns: - ``dict``: transaction_data and signature2 in order to create the limit order. - - Example: - >>> rpc_url = "https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/" - >>> async_client = AsyncClient(rpc_url) - >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" - >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) - >>> jupiter = Jupiter(async_client, private_key) - >>> input_mint = Pubkey.from_string("So11111111111111111111111111111111111111112") - >>> output_mint = Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") - >>> in_amount = 5_000_000 - >>> out_amount = 100_000 - >>> transaction_data = await jupiter.swap(user_public_key, input_mint, output_mint, amount) - { - 'transaction_data': 'AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEGC5Qzg6Gwmq0Gtgp4+LWUVz0yQOAuHGNJAGTs0dcqEMVCBvqBKhFi2uRFEKYI4zPatxbdm7DylvnQUby9MexSmeAdsqhWUMQ86Ddz4+7pQFooE6wLglATS/YvzOVUNMOqnyAmC8Ioh9cSvEZniys4XY0OyEvxe39gSdHqlHWJQUPMn4prs0EwIc9JznmgzyMliG5PJTvaFYw75ssASGlB2gMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImg/TLoYktlelMGKAi4mA0icnTD92092qSZhd3wNABMCv4fVqQvV1OYZ3a3bH43JpI5pIln+UAHnO1fyDJwCfIGm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAQan1RcZLFxRIYzJTD1K8X9Y2u4Im6H9ROPb2YoAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKmr+pT0gdwb1ZeE73qr11921UvCtCB3MMpBcLaiY8+u7QEHDAEABAMCCAIHBgUKCRmFbkqvcJ/1nxAnAAAAAAAAECcAAAAAAAAA', - 'signature2': Signature( - 2Pip6gx9FLGVqmRqfAgwJ8HEuCY8ZbUbVERR18vHyxFngSi3Jxq8Vkpm74hS5zq7RAM6tqGUAkf3ufCBsxGXZrUC,) - } - """ - - keypair = Keypair() - transaction_parameters = { - "owner": self.keypair.pubkey().__str__(), - "inputMint": input_mint, - "outputMint": output_mint, - "outAmount": out_amount, - "inAmount": in_amount, - "base": keypair.pubkey().__str__() - } - if expired_at: - transaction_parameters['expiredAt'] = expired_at - transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['OPEN_ORDER'], json=transaction_parameters).json()['tx'] - raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data)) - signature2 = keypair.sign_message(message.to_bytes_versioned(raw_transaction.message)) - return {"transaction_data": transaction_data, "signature2": signature2} - - async def cancel_orders( - self, - orders: list=[] - ) -> str: - """Cancel open orders from a list (max. 10). - - Args: - Required:!: - ``orders (list)``: List of orders to be cancelled. - Returns: - ``str``: returns serialized transactions to cancel orders from https://jup.ag/api/limit/v1/cancelOrders - - Example: - >>> rpc_url = "https://neat-hidden-sanctuary.solana-mainnet.discover.quiknode.pro/2af5315d336f9ae920028bbb90a73b724dc1bbed/" - >>> async_client = AsyncClient(rpc_url) - >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" - >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) - >>> jupiter = Jupiter(async_client, private_key) - >>> list_orders = [item['publicKey'] for item in await jupiter.query_open_orders()] # Cancel all open orders - >>> transaction_data = await jupiter.cancel_orders(orders=openOrders) - AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAQIlDODobCarQa2Cnj4tZRXPTJA4C4cY0kAZOzR1yoQxUIklPdDonxNd5JDfdYoHE56dvNBQ1SLN90fFZxvVlzZr9DPwpfbd+ANTB35SSvHYVViD27UZR578oC2faxJea7y958guyGPhmEVKNR9GmJIjjuZU0VSr2/k044JZIRklkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr+H1akL1dTmGd2t2x+NyaSOaSJZ/lAB5ztX8gycAnyBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAEG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqW9ZjNTy3JS6YYFodCWqtWH80+eLPmN4igHrkYHIsdQfAQUHAQIAAwQHBghfge3wCDHfhA== - """ - - transaction_parameters = { - "owner": self.keypair.pubkey().__str__(), - "feePayer": self.keypair.pubkey().__str__(), - "orders": orders - } - transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['CANCEL_ORDERS'], json=transaction_parameters).json()['tx'] - return transaction_data - - @staticmethod - async def query_open_orders( - wallet_address: str, - input_mint: str=None, - output_mint: str=None - ) -> list: - """ - Query open orders from self.keypair public address. - - Args: - Required: - ``wallet_address (str)``: Wallet address. - Optionals: - ``input_mint (str)``: Input token mint address. - ``output_mint (str)``: Output token mint address. - Returns: - ``list``: returns open orders list from https://jup.ag/api/limit/v1/openOrders - - Example: - >>> list_open_orders = await Jupiter.query_open_orders("AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX") - [ - { - 'publicKey': '3ToRYxxMHN3CHkbqWHcbXBCBLNqmDeLoubGGfNKGSCDL', - 'account': { - 'maker': 'AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX', - 'inputMint': 'So11111111111111111111111111111111111111112', - 'outputMint': 'AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3', - 'oriInAmount': '10000', - 'oriOutAmount': '10000', - 'inAmount': '10000', - 'outAmount': '10000', - 'expiredAt': None, - 'base': 'FghAhphJkhT74PXFQAz3QKqGVGA72Y2gUeVHU7QRw31c' - } - } - ] - """ - - query_openorders_url = "https://jup.ag/api/limit/v1/openOrders?wallet=" + wallet_address - if input_mint: - query_openorders_url += "inputMint=" + input_mint - if output_mint: - query_openorders_url += "outputMint" + output_mint - - list_open_orders = httpx.get(query_openorders_url, timeout=Timeout(timeout=30.0)).json() - return list_open_orders - - @staticmethod - async def query_orders_history( - wallet_address: str, - cursor: int=None, - skip: int=None, - take: int=None - ) -> list: - """ - Query orders history from self.keypair public address. - - Args: - Required: - ``wallet_address (str)``: Wallet address. - Optionals: - ``cursor (int)``: Pointer to a specific result in the data set. - ``skip (int)``: Number of records to skip from the beginning. - ``take (int)``: Number of records to retrieve from the current position. - Returns: - ``list``: returns open orders list from https://jup.ag/api/limit/v1/orderHistory - - Example: - >>> list_orders_history = await Jupiter.query_orders_history("AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX") - [ - { - 'id': 1639144, - 'orderKey': '3ToRYxxMHN3CHkbqWHcbXBCBLNqmDeLoubGGfNKGSCDL', - 'maker': 'AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX', - 'inputMint': 'So11111111111111111111111111111111111111112', - 'outputMint': 'AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3', - 'inAmount': '10000', - 'oriInAmount': '10000', - 'outAmount': '10000', - 'oriOutAmount': '10000', - 'expiredAt': None, - 'state': 'Cancelled', - 'createTxid': '4CYy8wZG2aRPctL9do7UBzaK9w4EDLJxGkkU1EEAx4LYNYW7j7Kyet2vL4q6cKK7HbJNHp6QXzLQftpTiDdhtyfL', - 'cancelTxid': '83eN6Lm41t2VWUchm1T6hWX2qK3sf39XzPGbxV9s2WjBZfdUADQdRGg2Y1xAKn4igMJU1xRPCTgUhnm6qFUPWRc', - 'updatedAt': '2023-12-18T15:55:30.617Z', - 'createdAt': '2023-12-18T15:29:34.000Z' - } - ] - """ - - query_orders_history_url = "https://jup.ag/api/limit/v1/orderHistory" + "?wallet=" + wallet_address - if cursor: - query_orders_history_url += "?cursor=" + str(cursor) - if skip: - query_orders_history_url += "?skip=" + str(skip) - if take: - query_orders_history_url += "?take=" + str(take) - - list_orders_history = httpx.get(query_orders_history_url, timeout=Timeout(timeout=30.0)).json() - return list_orders_history - - @staticmethod - async def query_trades_history( - wallet_address: str, - input_mint: str=None, - output_mint: str=None, - cursor: int=None, - skip: int=None, - take: int=None - ) -> list: - """ - Query trades history from a public address. - - Args: - Required: - ``wallet_address (str)``: Wallet address. - Optionals: - ``input_mint (str)``: Input token mint address. - ``output_mint (str)``: Output token mint address. - ``cursor (int)``: Pointer to a specific result in the data set. - ``skip (int)``: Number of records to skip from the beginning. - ``take (int)``: Number of records to retrieve from the current position. - Returns: - ``list``: returns trades history list from https://jup.ag/api/limit/v1/tradeHistory - - Example: - >>> list_trades_history = await Jupiter.query_trades_history("AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX") - [ - { - 'id': 10665592, - 'inAmount': - '10000000', - 'outAmount': '675870652', - 'txid': '5rmA1S5MDAVdRYWeVgUWYFp6pYuy5vwrYpRJUJdhjoWnuuheeg1YwqK6P5H6u4tv99cUwQttSBYm6kjSNHJGENgb', - 'updatedAt': '2023-12-13T15:39:04.800Z', - 'createdAt': '2023-12-13T15:37:08.000Z', - 'order': { - 'id': 1278268, - 'orderKey': '3bGykFCMWPNQDTRVBdKBbZuVHqNB5z5XaphkRHLWYmE5', - 'inputMint': 'So11111111111111111111111111111111111111112', - 'outputMint': '8XSsNvaKU9FDhYWAv7Yc7qSNwuJSzVrXBNEk7AFiWF69' - } - } - ] - """ - - query_tradeHistoryUrl = "https://jup.ag/api/limit/v1/tradeHistory" + "?wallet=" + wallet_address - if input_mint: - query_tradeHistoryUrl += "inputMint=" + input_mint - if output_mint: - query_tradeHistoryUrl += "outputMint" + output_mint - if cursor: - query_tradeHistoryUrl += "?cursor=" + cursor - if skip: - query_tradeHistoryUrl += "?skip=" + skip - if take: - query_tradeHistoryUrl += "?take=" + take - - tradeHistory = httpx.get(query_tradeHistoryUrl, timeout=Timeout(timeout=30.0)).json() - return tradeHistory - - @staticmethod - async def get_indexed_route_map( - ) -> dict: - """ - Retrieve an indexed route map for all the possible token pairs you can swap between. - - Args: - Optionals: - ``input_mint (str)``: Input token mint Pubkey.\n - ``output_mint (str)``: Output token mint Pubkey.\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. - Returns: - ``dict``: indexed route map for all the possible token pairs you can swap betwee from https://quote-api.jup.ag/v6/indexed-route-map - - Example: - >>> indexed_route_map = await Jupiter.get_indexed_route_map() - """ - - indexed_route_map = httpx.get("https://quote-api.jup.ag/v6/indexed-route-map", timeout=Timeout(timeout=30.0)).json() - return indexed_route_map - - @staticmethod - async def get_tokens_list( - list_type: str="strict", - banned_tokens: bool=False - ) -> dict: - """ - 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 - There are two types of list:\n - ``strict``\n - - Only tokens that are tagged "old-registry", "community", or "wormhole" verified.\n - - No unknown and banned tokens.\n - ``all``\n - - Everything including unknown/untagged tokens that are picked up automatically.\n - - It does not include banned tokens by default.\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. - - Args: - Optionals: - ``list_type (str)``: Default is "strict" (strict/all). - ``banned_tokens (bool)``: Only if list_type is "all" - Returns: - ``dict``: indexed route map for all the possible token pairs you can swap betwee from https://token.jup.ag/{list_type} - - Example: - >>> tokens_list = await Jupiter.get_tokens_list() - """ - - tokens_list_url = "https://token.jup.ag/" + list_type - if banned_tokens is True: - tokens_list_url += "?includeBanned=true" - tokens_list = httpx.get(tokens_list_url, timeout=Timeout(timeout=30.0)).json() - return tokens_list - - @staticmethod - async def get_all_tickers( - ) -> dict: - """Returns all tickers (cached for every 2-5 mins) from https://stats.jup.ag/coingecko/tickers - - Returns: - ``dict``: all tickers(cached for every 2-5 mins) - - Example: - >>> all_tickers_list = await Jupiter.get_all_tickers() - """ - all_tickers_list = httpx.get("https://stats.jup.ag/coingecko/tickers", timeout=Timeout(timeout=30.0)).json() - return all_tickers_list - - @staticmethod - async def get_all_swap_pairs( - ) -> dict: - """Returns all swap pairs (cached for every 2-5 mins) from https://stats.jup.ag/coingecko/pairs - - Returns: - ``dict``: all swap pairs - - Example: - >>> all_swap_pairs_list = await Jupiter.get_all_swap_pairs() - """ - all_swap_pairs_list = httpx.get("https://stats.jup.ag/coingecko/pairs", timeout=Timeout(timeout=30.0)).json() - return all_swap_pairs_list - - @staticmethod - async def get_swap_pairs( - input_mint: str, - output_mint: str, - ) -> dict: - """Returns swap pairs for input token and output token - - Args: - Required: - ``input_mint (str)``: Input token mint address.\n - ``output_mint (str)``: Output token mint address.\n - - Returns: - ``dict``: all swap pairs for input token and output token - - Example: - >>> swap_pairs_list = await Jupiter.get_swap_pairs("So11111111111111111111111111111111111111112", "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") - """ - swap_pairs_url = "https://stats.jup.ag/coingecko/tickers?ticker_id=" + input_mint + "_" + output_mint - swap_pairs_list = httpx.get(swap_pairs_url, timeout=Timeout(timeout=30.0)).json() - return swap_pairs_list - - @staticmethod - async def get_token_stats_by_date( - token: str, - date: str, - ) -> list: - """Returns swap pairs for input token and output token - - Args: - Required: - ``token (str)``: Input token mint address.\n - ``date (str)``: YYYY-MM-DD format date.\n - - Returns: - ``list``: all swap pairs for input token and output token - - Example: - >>> token_stats_by_date = await Jupiter.get_swap_pairs("B5mW68TkDewnKvWNc2trkmmdSRxcCjZz3Yd9BWxQTSRU", "2022-04-1") - """ - token_stats_by_date_url = "https://stats.jup.ag/token-ledger/" + token + "/" + date - token_stats_by_date = httpx.get(token_stats_by_date_url, timeout=Timeout(timeout=30.0)).json() - return token_stats_by_date - - @staticmethod - async def get_jupiter_stats( - unit_of_time: str, - ) -> dict: - """Stats for the unit of time specified. - - Args: - Required: - ``unit_of_time (str)``: Unit of time: day/week/month - - Returns: - ``dict``: stats for the unit of time specified. - - Example: - >>> jupiter_stats = await Jupiter.get_jupiter_stats("day") - """ - jupiter_stats_url = "https://stats.jup.ag/info/" + unit_of_time - jupiter_stats = httpx.get(jupiter_stats_url, timeout=Timeout(timeout=30.0)).json() - return jupiter_stats - - @staticmethod - async def get_token_price( - input_mint: str, - output_mint: str=None, - ) -> dict: - """The Jupiter Price API aims to make getting precise and real-time pricing for all SPL tokens as powerful and simple as possible. - - Args: - Required: - ``input_mint (str)``: Input token mint name or address. - Optionals: - ``output_mint (str)``: Output token mint name or address. - - Returns: - ``dict``: id, mintSymbol, vsToken, vsTokenSymbol, price, timeTaken - - Example: - >>> token_price = await Jupiter.get_jupiter_stats("So11111111111111111111111111111111111111112", "USDC") - { - 'So11111111111111111111111111111111111111112': { - 'id': 'So11111111111111111111111111111111111111112', - 'mintSymbol': 'SOL', - 'vsToken': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', - 'vsTokenSymbol': 'USDC', - 'price': 71.893496709 - } - } - """ - token_prices_url = "https://price.jup.ag/v4/price?ids=" + input_mint - if output_mint: - token_prices_url += "&vsToken=" + output_mint - token_prices = httpx.get(token_prices_url, timeout=Timeout(timeout=30.0)).json()['data'] - return token_prices - - @staticmethod - async def program_id_to_label( - ) -> dict: - """Returns a dict, which key is the program id and value is the label.\n - This is used to help map error from transaction by identifying the fault program id.\n - With that, we can use the exclude_dexes or dexes parameter for swap. - - Returns: - ``dict``: program_id and label - - Example: - >>> program_id_to_label_list = await Jupiter.program_id_to_label() - """ - program_id_to_label_list = httpx.get("https://quote-api.jup.ag/v6/program-id-to-label", timeout=Timeout(timeout=30.0)).json() - return program_id_to_label_list diff --git a/src/dist/jupiter-python-sdk-0.0.1.1.tar.gz b/src/dist/jupiter-python-sdk-0.0.1.1.tar.gz deleted file mode 100644 index 7af4e5e011a2055fb20f8a5e00cc263c3014e93e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19880 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 literal 0 HcmV?d00001 diff --git a/src/dist/jupiter_python_sdk-0.0.1-py3-none-any.whl b/src/dist/jupiter_python_sdk-0.0.1-py3-none-any.whl deleted file mode 100644 index 6cfbc1839f10ec39bbb27605349ef5a67eaeec52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17939 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 Ghz9`ra@Z>X diff --git a/src/jupiter_python_sdk.egg-info/PKG-INFO b/src/jupiter_python_sdk.egg-info/PKG-INFO index 1c159b6..2acf001 100644 --- a/src/jupiter_python_sdk.egg-info/PKG-INFO +++ b/src/jupiter_python_sdk.egg-info/PKG-INFO @@ -1,146 +1,148 @@ -Metadata-Version: 2.1 -Name: jupiter-python-sdk -Version: 0.0.1.1 -Summary: Jupiter Python SDK -Author: TaoDev -Author-email: taodev3@proton.me -Keywords: python,solana,jupiter,dex,trading,sdk -Classifier: Development Status :: 1 - Planning -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python :: 3 -Classifier: Operating System :: Unix -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows -Description-Content-Type: text/markdown - - -
-

🐍 JUPITER PYTHON SDK 🪐

- -
- ---- - -

- - -
- - -
- - -
-

- -# 📖 Introduction -**Jupiter Python SDK** is a Python library that allows you to use most of **[Jupiter](https://jup.ag/) features**.
-It enables executing swaps, limit orders, DCA, swap pairs, tokens prices, fetching wallet infos, stats, data and more!
-This 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).
-There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs). - -# ⚠️ Disclaimer -**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.
-This 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.** - -# ✨ Quickstart - -### 🛠️ Installation - -```sh -pip install jupiter-python-sdk -``` -### 📃 General Usage -**Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
-Otherwise, this is required, for instance, to open a DCA account or to close one.** -```py -import base58 -from solders.pubkey import Pubkey -from solders.keypair import Keypair -from solana.rpc.async_api import AsyncClient -from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA - -async def main(): - private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE_KEY"))) # Private key as string - async_client = AsyncClient(os.getenv("RPC_API")) - jupiter = Jupiter(async_client, private_key) - - # EXECUTE A SWAP - swap = await jupiter.swap( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - amount=5_000_000, - slippage_bps=1, - ) - # Returns str: serialized transactions to execute the swap. - - # OPEN LIMIT ORDER - open_limit_order = await jupiter.open_order( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - in_amount=5_000_000, - out_amount=100_000, - ) - # Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened} - - # CREATE DCA ACCOUNT - create_dca_account = await jupiter.dca.create_dca( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - total_in_amount=5_000_000, - in_amount_per_cycle=100_000, - cycle_frequency=60, - min_out_amount_per_cycle=0, - max_out_amount_per_cycle=0, - start=0 - ) - # Returns DCA Account Pubkey and transaction hash. - - # CLOSE DCA ACCOUNT - close_dca_account = await jupiter.dca.close_dca( - dca_pubkey=Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") - ) - # Returns transaction hash. -``` -### 📜 All available features -```py -- quote -- swap -- open_order -- cancel_orders -- create_dca -- close_dca -- fetch_user_dca_accounts -- fetch_dca_account_fills_history -- get_available_dca_tokens -- fetch_dca_data -- query_open_orders -- query_orders_history -- query_trades_history -- get_jupiter_stats -- get_token_price -- get_indexed_route_map -- get_tokens_list -- get_all_tickers -- get_all_swap_pairs -- get_swap_pairs -- get_token_stats_by_date -- program_id_to_label -``` - -# 📝 TO-DO -- [ ] Bridge 🌉 -- [ ] Perpetual 💸 - -# 🤝 Contributions -If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
-Contact me for any inquiry, I will reach you as soon as possible.
-[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/_taodev_) -[![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) - -# 👑 Donations -This project doesn't include platform fees. If you find value in it and would like to support its development, your donations are greatly appreciated.
-**SOLANA ADDRESS** -```sh -AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX -``` +Metadata-Version: 2.1 +Name: jupiter-python-sdk +Version: 0.0.1.3 +Summary: Jupiter Python SDK +Author: TaoDev +Author-email: taodev3@proton.me +License: LICENSE.txt +Keywords: python,solana,jupiter,dex,trading,sdk +Classifier: Development Status :: 1 - Planning +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python :: 3 +Classifier: Operating System :: Unix +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Description-Content-Type: text/markdown +License-File: LICENSE.txt + + +
+

🐍 JUPITER PYTHON SDK 🪐

+ +
+ +--- + +

+ + +
+ + +
+ + +
+

+ +# 📖 Introduction +**Jupiter Python SDK** is a Python library that allows you to use most of **[Jupiter](https://jup.ag/) features**.
+It enables executing swaps, limit orders, DCA, swap pairs, tokens prices, fetching wallet infos, stats, data and more!
+This 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).
+There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs). + +# ⚠️ Disclaimer +**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.
+This 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.** + +# ✨ Quickstart + +### 🛠️ Installation + +```sh +pip install jupiter-python-sdk +``` +### 📃 General Usage +**Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
+Otherwise, this is required, for instance, to open a DCA account or to close one.** +```py +import base58 +from solders.pubkey import Pubkey +from solders.keypair import Keypair +from solana.rpc.async_api import AsyncClient +from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA + +async def main(): + private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE_KEY"))) # Private key as string + async_client = AsyncClient(os.getenv("RPC_API")) + jupiter = Jupiter(async_client, private_key) + + # EXECUTE A SWAP + swap = await jupiter.swap( + input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), + output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + amount=5_000_000, + slippage_bps=1, + ) + # Returns str: serialized transactions to execute the swap. + + # OPEN LIMIT ORDER + open_limit_order = await jupiter.open_order( + input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), + output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + in_amount=5_000_000, + out_amount=100_000, + ) + # Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened} + + # CREATE DCA ACCOUNT + create_dca_account = await jupiter.dca.create_dca( + input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), + output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + total_in_amount=5_000_000, + in_amount_per_cycle=100_000, + cycle_frequency=60, + min_out_amount_per_cycle=0, + max_out_amount_per_cycle=0, + start=0 + ) + # Returns DCA Account Pubkey and transaction hash. + + # CLOSE DCA ACCOUNT + close_dca_account = await jupiter.dca.close_dca( + dca_pubkey=Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") + ) + # Returns transaction hash. +``` +### 📜 All available features +```py +- quote +- swap +- open_order +- cancel_orders +- create_dca +- close_dca +- fetch_user_dca_accounts +- fetch_dca_account_fills_history +- get_available_dca_tokens +- fetch_dca_data +- query_open_orders +- query_orders_history +- query_trades_history +- get_jupiter_stats +- get_token_price +- get_indexed_route_map +- get_tokens_list +- get_all_tickers +- get_all_swap_pairs +- get_swap_pairs +- get_token_stats_by_date +- program_id_to_label +``` + +# 📝 TO-DO +- [ ] Bridge 🌉 +- [ ] Perpetual 💸 + +# 🤝 Contributions +If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
+Contact me for any inquiry, I will reach you as soon as possible.
+[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/_taodev_) +[![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) + +# 👑 Donations +This project doesn't include platform fees. If you find value in it and would like to support its development, your donations are greatly appreciated.
+**SOLANA ADDRESS** +```sh +AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX +``` diff --git a/src/jupiter_python_sdk.egg-info/SOURCES.txt b/src/jupiter_python_sdk.egg-info/SOURCES.txt index 7f8379d..abe1590 100644 --- a/src/jupiter_python_sdk.egg-info/SOURCES.txt +++ b/src/jupiter_python_sdk.egg-info/SOURCES.txt @@ -1,3 +1,5 @@ +LICENSE.txt +README.md setup.py jupiter_python_sdk/__init__.py jupiter_python_sdk/jupiter.py diff --git a/src/setup.py b/src/setup.py index e260d2e..9a799e0 100644 --- a/src/setup.py +++ b/src/setup.py @@ -4,10 +4,10 @@ here = os.path.abspath(os.path.dirname(__file__)) -with codecs.open(os.path.join(here, "jupiter_python_sdk/README.md"), encoding="utf-8") as fh: +with codecs.open(os.path.join(here, "README.md"), encoding="utf-8") as fh: long_description = "\n" + fh.read() -VERSION = '0.0.1.1' +VERSION = '0.0.1.3' DESCRIPTION = 'Jupiter Python SDK' LONG_DESCRIPTION = 'This package allows the use of Jupiter decentralized exchange features on Solana using Python.' @@ -21,6 +21,7 @@ long_description_content_type="text/markdown", long_description=long_description, packages=find_packages(), + license=('LICENSE.txt'), install_requires=[ 'wheel', 'pyaudio', From 9fee1d14892bd91268456deb0e5d26ef1f1113d9 Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Sat, 23 Dec 2023 18:54:52 +0100 Subject: [PATCH 02/36] fix: package --- src/dist/jupiter-python-sdk-0.0.1.3.tar.gz | Bin 21017 -> 0 bytes src/dist/jupiter-python-sdk-0.0.1.4.tar.gz | Bin 0 -> 20996 bytes src/jupiter_python_sdk.egg-info/PKG-INFO | 2 +- src/jupiter_python_sdk.egg-info/requires.txt | 1 - src/setup.py | 3 +-- 5 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 src/dist/jupiter-python-sdk-0.0.1.3.tar.gz create mode 100644 src/dist/jupiter-python-sdk-0.0.1.4.tar.gz diff --git a/src/dist/jupiter-python-sdk-0.0.1.3.tar.gz b/src/dist/jupiter-python-sdk-0.0.1.3.tar.gz deleted file mode 100644 index 8bd5531a82953d91f13e67f49a76faa9c40518c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21017 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 diff --git a/src/dist/jupiter-python-sdk-0.0.1.4.tar.gz b/src/dist/jupiter-python-sdk-0.0.1.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9cedfed8c05094378cc6515416c8c6a0588b0b80 GIT binary patch literal 20996 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 Dd2QV# literal 0 HcmV?d00001 diff --git a/src/jupiter_python_sdk.egg-info/PKG-INFO b/src/jupiter_python_sdk.egg-info/PKG-INFO index 2acf001..0649ceb 100644 --- a/src/jupiter_python_sdk.egg-info/PKG-INFO +++ b/src/jupiter_python_sdk.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: jupiter-python-sdk -Version: 0.0.1.3 +Version: 0.0.1.4 Summary: Jupiter Python SDK Author: TaoDev Author-email: taodev3@proton.me diff --git a/src/jupiter_python_sdk.egg-info/requires.txt b/src/jupiter_python_sdk.egg-info/requires.txt index 6caca51..5c5a130 100644 --- a/src/jupiter_python_sdk.egg-info/requires.txt +++ b/src/jupiter_python_sdk.egg-info/requires.txt @@ -1,5 +1,4 @@ wheel -pyaudio anchorpy anchorpy-core anyio diff --git a/src/setup.py b/src/setup.py index 9a799e0..583e69c 100644 --- a/src/setup.py +++ b/src/setup.py @@ -7,7 +7,7 @@ with codecs.open(os.path.join(here, "README.md"), encoding="utf-8") as fh: long_description = "\n" + fh.read() -VERSION = '0.0.1.3' +VERSION = '0.0.1.4' DESCRIPTION = 'Jupiter Python SDK' LONG_DESCRIPTION = 'This package allows the use of Jupiter decentralized exchange features on Solana using Python.' @@ -24,7 +24,6 @@ license=('LICENSE.txt'), install_requires=[ 'wheel', - 'pyaudio', 'anchorpy', 'anchorpy-core', 'anyio', From 711604d9e2a3014fc2e3e598cf3ffedc8a90691f Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Mon, 25 Dec 2023 19:40:04 +0100 Subject: [PATCH 03/36] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index b9390fb..9b3efdc 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,15 @@ This tool is provided for educational purposes only and should not be used as fi ```sh pip install jupiter-python-sdk ``` + ### 📃 General Usage **Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
Otherwise, this is required, for instance, to open a DCA account or to close one.** + +If 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: +1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` +2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. + ```py import base58 from solders.pubkey import Pubkey From c1070fd7fc22e67c0eb27b8f57bc8416b8a9d95e Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Mon, 25 Dec 2023 19:57:17 +0100 Subject: [PATCH 04/36] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b3efdc..e176d7c 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ **Jupiter Python SDK** is a Python library that allows you to use most of **[Jupiter](https://jup.ag/) features**.
It enables executing swaps, limit orders, DCA, swap pairs, tokens prices, fetching wallet infos, stats, data and more!
This 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).
-There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs). +There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs) for more information. # ⚠️ Disclaimer **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.
From 61a76afb8ad4471ca9aa7d38669974272324a3f2 Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Mon, 25 Dec 2023 20:32:07 +0100 Subject: [PATCH 05/36] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e176d7c..4c9e1a1 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ async def main(): # 🤝 Contributions If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
Contact me for any inquiry, I will reach you as soon as possible.
-[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/_taodev_) +[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/H3QRapcC) [![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) # 👑 Donations From 14f8f5ddd1371914b46222cbe53834f030782d76 Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Mon, 25 Dec 2023 21:03:38 +0100 Subject: [PATCH 06/36] [+] fix: docstring swap & open_order --- LICENSE.txt => LICENSE | 0 README.md | 10 +- src/README.md | 10 +- src/dist/jupiter-python-sdk-0.0.1.4.tar.gz | Bin 20996 -> 0 bytes src/jupiter_python_sdk.egg-info/PKG-INFO | 148 ------------------ src/jupiter_python_sdk.egg-info/SOURCES.txt | 10 -- .../dependency_links.txt | 1 - src/jupiter_python_sdk.egg-info/requires.txt | 42 ----- src/jupiter_python_sdk.egg-info/top_level.txt | 1 - src/jupiter_python_sdk/jupiter.py | 36 ++--- src/setup.py | 2 +- 11 files changed, 35 insertions(+), 225 deletions(-) rename LICENSE.txt => LICENSE (100%) delete mode 100644 src/dist/jupiter-python-sdk-0.0.1.4.tar.gz delete mode 100644 src/jupiter_python_sdk.egg-info/PKG-INFO delete mode 100644 src/jupiter_python_sdk.egg-info/SOURCES.txt delete mode 100644 src/jupiter_python_sdk.egg-info/dependency_links.txt delete mode 100644 src/jupiter_python_sdk.egg-info/requires.txt delete mode 100644 src/jupiter_python_sdk.egg-info/top_level.txt diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE diff --git a/README.md b/README.md index b9390fb..4c9e1a1 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ **Jupiter Python SDK** is a Python library that allows you to use most of **[Jupiter](https://jup.ag/) features**.
It enables executing swaps, limit orders, DCA, swap pairs, tokens prices, fetching wallet infos, stats, data and more!
This 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).
-There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs). +There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs) for more information. # ⚠️ Disclaimer **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.
@@ -34,9 +34,15 @@ This tool is provided for educational purposes only and should not be used as fi ```sh pip install jupiter-python-sdk ``` + ### 📃 General Usage **Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
Otherwise, this is required, for instance, to open a DCA account or to close one.** + +If 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: +1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` +2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. + ```py import base58 from solders.pubkey import Pubkey @@ -119,7 +125,7 @@ async def main(): # 🤝 Contributions If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
Contact me for any inquiry, I will reach you as soon as possible.
-[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/_taodev_) +[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/H3QRapcC) [![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) # 👑 Donations diff --git a/src/README.md b/src/README.md index b9390fb..4c9e1a1 100644 --- a/src/README.md +++ b/src/README.md @@ -21,7 +21,7 @@ **Jupiter Python SDK** is a Python library that allows you to use most of **[Jupiter](https://jup.ag/) features**.
It enables executing swaps, limit orders, DCA, swap pairs, tokens prices, fetching wallet infos, stats, data and more!
This 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).
-There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs). +There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs) for more information. # ⚠️ Disclaimer **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.
@@ -34,9 +34,15 @@ This tool is provided for educational purposes only and should not be used as fi ```sh pip install jupiter-python-sdk ``` + ### 📃 General Usage **Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
Otherwise, this is required, for instance, to open a DCA account or to close one.** + +If 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: +1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` +2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. + ```py import base58 from solders.pubkey import Pubkey @@ -119,7 +125,7 @@ async def main(): # 🤝 Contributions If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
Contact me for any inquiry, I will reach you as soon as possible.
-[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/_taodev_) +[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/H3QRapcC) [![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) # 👑 Donations diff --git a/src/dist/jupiter-python-sdk-0.0.1.4.tar.gz b/src/dist/jupiter-python-sdk-0.0.1.4.tar.gz deleted file mode 100644 index 9cedfed8c05094378cc6515416c8c6a0588b0b80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20996 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 Dd2QV# diff --git a/src/jupiter_python_sdk.egg-info/PKG-INFO b/src/jupiter_python_sdk.egg-info/PKG-INFO deleted file mode 100644 index 0649ceb..0000000 --- a/src/jupiter_python_sdk.egg-info/PKG-INFO +++ /dev/null @@ -1,148 +0,0 @@ -Metadata-Version: 2.1 -Name: jupiter-python-sdk -Version: 0.0.1.4 -Summary: Jupiter Python SDK -Author: TaoDev -Author-email: taodev3@proton.me -License: LICENSE.txt -Keywords: python,solana,jupiter,dex,trading,sdk -Classifier: Development Status :: 1 - Planning -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python :: 3 -Classifier: Operating System :: Unix -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows -Description-Content-Type: text/markdown -License-File: LICENSE.txt - - -
-

🐍 JUPITER PYTHON SDK 🪐

- -
- ---- - -

- - -
- - -
- - -
-

- -# 📖 Introduction -**Jupiter Python SDK** is a Python library that allows you to use most of **[Jupiter](https://jup.ag/) features**.
-It enables executing swaps, limit orders, DCA, swap pairs, tokens prices, fetching wallet infos, stats, data and more!
-This 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).
-There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs). - -# ⚠️ Disclaimer -**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.
-This 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.** - -# ✨ Quickstart - -### 🛠️ Installation - -```sh -pip install jupiter-python-sdk -``` -### 📃 General Usage -**Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
-Otherwise, this is required, for instance, to open a DCA account or to close one.** -```py -import base58 -from solders.pubkey import Pubkey -from solders.keypair import Keypair -from solana.rpc.async_api import AsyncClient -from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA - -async def main(): - private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE_KEY"))) # Private key as string - async_client = AsyncClient(os.getenv("RPC_API")) - jupiter = Jupiter(async_client, private_key) - - # EXECUTE A SWAP - swap = await jupiter.swap( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - amount=5_000_000, - slippage_bps=1, - ) - # Returns str: serialized transactions to execute the swap. - - # OPEN LIMIT ORDER - open_limit_order = await jupiter.open_order( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - in_amount=5_000_000, - out_amount=100_000, - ) - # Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened} - - # CREATE DCA ACCOUNT - create_dca_account = await jupiter.dca.create_dca( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - total_in_amount=5_000_000, - in_amount_per_cycle=100_000, - cycle_frequency=60, - min_out_amount_per_cycle=0, - max_out_amount_per_cycle=0, - start=0 - ) - # Returns DCA Account Pubkey and transaction hash. - - # CLOSE DCA ACCOUNT - close_dca_account = await jupiter.dca.close_dca( - dca_pubkey=Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") - ) - # Returns transaction hash. -``` -### 📜 All available features -```py -- quote -- swap -- open_order -- cancel_orders -- create_dca -- close_dca -- fetch_user_dca_accounts -- fetch_dca_account_fills_history -- get_available_dca_tokens -- fetch_dca_data -- query_open_orders -- query_orders_history -- query_trades_history -- get_jupiter_stats -- get_token_price -- get_indexed_route_map -- get_tokens_list -- get_all_tickers -- get_all_swap_pairs -- get_swap_pairs -- get_token_stats_by_date -- program_id_to_label -``` - -# 📝 TO-DO -- [ ] Bridge 🌉 -- [ ] Perpetual 💸 - -# 🤝 Contributions -If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
-Contact me for any inquiry, I will reach you as soon as possible.
-[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/_taodev_) -[![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) - -# 👑 Donations -This project doesn't include platform fees. If you find value in it and would like to support its development, your donations are greatly appreciated.
-**SOLANA ADDRESS** -```sh -AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX -``` diff --git a/src/jupiter_python_sdk.egg-info/SOURCES.txt b/src/jupiter_python_sdk.egg-info/SOURCES.txt deleted file mode 100644 index abe1590..0000000 --- a/src/jupiter_python_sdk.egg-info/SOURCES.txt +++ /dev/null @@ -1,10 +0,0 @@ -LICENSE.txt -README.md -setup.py -jupiter_python_sdk/__init__.py -jupiter_python_sdk/jupiter.py -jupiter_python_sdk.egg-info/PKG-INFO -jupiter_python_sdk.egg-info/SOURCES.txt -jupiter_python_sdk.egg-info/dependency_links.txt -jupiter_python_sdk.egg-info/requires.txt -jupiter_python_sdk.egg-info/top_level.txt \ No newline at end of file diff --git a/src/jupiter_python_sdk.egg-info/dependency_links.txt b/src/jupiter_python_sdk.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/src/jupiter_python_sdk.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/jupiter_python_sdk.egg-info/requires.txt b/src/jupiter_python_sdk.egg-info/requires.txt deleted file mode 100644 index 5c5a130..0000000 --- a/src/jupiter_python_sdk.egg-info/requires.txt +++ /dev/null @@ -1,42 +0,0 @@ -wheel -anchorpy -anchorpy-core -anyio -attrs -base58 -based58 -borsh-construct -cachetools -certifi -charset-normalizer -colorama -construct -construct-typing -h11 -httpcore -httpx -idna -iniconfig -jsonalias -jsonrpcclient -more-itertools -packaging -pluggy -psutil -py -pyheck -pytest -pytest-asyncio -pytest-xprocess -rfc3986 -sniffio -solana -solders -sumtypes -toml -toolz -types-cachetools -typing_extensions -urllib3 -websockets -zstandard diff --git a/src/jupiter_python_sdk.egg-info/top_level.txt b/src/jupiter_python_sdk.egg-info/top_level.txt deleted file mode 100644 index 6ec1073..0000000 --- a/src/jupiter_python_sdk.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -jupiter_python_sdk diff --git a/src/jupiter_python_sdk/jupiter.py b/src/jupiter_python_sdk/jupiter.py index e0de059..6b7f2cc 100644 --- a/src/jupiter_python_sdk/jupiter.py +++ b/src/jupiter_python_sdk/jupiter.py @@ -548,8 +548,8 @@ def __init__( async def quote( self, - input_mint: Pubkey, - output_mint: Pubkey, + input_mint: str, + output_mint: str, amount: int, slippage_bps: int=None, swap_mode: str="ExactIn", @@ -562,8 +562,8 @@ async def quote( Args: Required: - ``input_mint (Pubkey)``: Input token mint Pubkey\n - ``output_mint (Pubkey)``: Output token mint Pubkey\n + ``input_mint (str)``: Input token mint address\n + ``output_mint (str)``: Output token mint address\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 Optionals: ``slippage_bps (int)``: The slippage % in BPS. If the output token amount exceeds the slippage then the swap transaction will fail.\n @@ -582,8 +582,8 @@ async def quote( >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) >>> jupiter = Jupiter(async_client, private_key) - >>> input_mint = Pubkey.from_string("So11111111111111111111111111111111111111112") - >>> output_mint = Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") + >>> input_mint = "So11111111111111111111111111111111111111112" + >>> output_mint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" >>> amount = 5_000_000 >>> quote = await jupiter.quote(input_mint, output_mint, amount) { @@ -601,7 +601,7 @@ async def quote( 'timeTaken': 0.069434356} """ - quote_url = self.ENDPOINT_APIS_URL['QUOTE'] + "inputMint=" + input_mint.__str__() + "&outputMint=" + output_mint.__str__() + "&amount=" + str(amount) + "&swapMode=" + swap_mode + "&onlyDirectRoutes=" + str(only_direct_routes).lower() + "&asLegacyTransaction=" + str(as_legacy_transaction).lower() + 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() if slippage_bps: quote_url += "&slippageBps=" + str(slippage_bps) if exclude_dexes: @@ -629,8 +629,8 @@ async def swap( Args: Required: - ``input_mint (Pubkey)``: Input token mint Pubkey\n - ``output_mint (Pubkey)``: Output token mint Pubkey\n + ``input_mint (str)``: Input token mint str\n + ``output_mint (str)``: Output token mint str\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 Optionals: ``wrap_unwrap_sol (bool)``: Auto wrap and unwrap SOL. Default is True.\n @@ -650,8 +650,8 @@ async def swap( >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) >>> jupiter = Jupiter(async_client, private_key) - >>> input_mint = Pubkey.from_string("So11111111111111111111111111111111111111112") - >>> output_mint = Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") + >>> input_mint = "So11111111111111111111111111111111111111112" + >>> output_mint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" >>> amount = 5_000_000 >>> transaction_data = await jupiter.swap(user_public_key, input_mint, output_mint, amount) AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAJDpQzg6Gwmq0Gtgp4+LWUVz0yQOAuHGNJAGTs0dcqEMVCoh2aSWdVMvcatcojrWtwXATiOw7/o5hE7NFuy3p8vgLfsLhf7Ff9NofcPgIyAbMytm5ggTyKwmR+JqgXUXARVfefILshj4ZhFSjUfRpiSI47mVNFUq9v5NOOCWSEZJZM/GHGfBesEb9blQsf7DnKodziY279S/OPkZf0/OalnPEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABHnVW/IxwG7udMVuzmgVB/2xst6j9I5RArHNola8E48Gm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpT0tsDkEI/SpqJHjq4KzFnbIbtO31EcFiz2AtHgwJAfuMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WbQ/+if11/ZKdMCbHylYed5LCas238ndUUsyGqezjOXoxvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWHmraeknnR8/memFAZWZHeDMQG7C5ZFLxolWUniPl6SYgcGAAUCwFwVAAYACQNIDQAAAAAAAAsGAAMACAUJAQEFAgADDAIAAAAgTgAAAAAAAAkBAwERBx8JCgADAQIECA0HBwwHGREBAhUOFxMWDxIQFAoYCQcHJMEgmzNB1pyBBwEAAAATZAABIE4AAAAAAACHBQAAAAAAADIAAAkDAwAAAQkB1rO1s+JVEuIRoGsE8f2MlAkFWssCkimIonlHpLV2w4gKBwKRTE0SjIeLSwIICg== @@ -678,8 +678,8 @@ async def swap( async def open_order( self, - input_mint: Pubkey, - output_mint: Pubkey, + input_mint: str, + output_mint: str, in_amount: int=0, out_amount: int=0, expired_at: int=None @@ -688,8 +688,8 @@ async def open_order( Args: Required: - ``input_mint (Pubkey)``: Input token mint Pubkey\n - ``output_mint (Pubkey)``: Output token mint Pubkey\n + ``input_mint (str)``: Input token mint address\n + ``output_mint (str)``: Output token mint address\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 ``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 Optionals: @@ -703,11 +703,11 @@ async def open_order( >>> private_key_string = "tSg8j3pWQyx3TC2fpN9Ud1bS0NoAK0Pa3TC2fpNd1bS0NoASg83TC2fpN9Ud1bS0NoAK0P" >>> private_key = Keypair.from_bytes(base58.b58decode(private_key_string)) >>> jupiter = Jupiter(async_client, private_key) - >>> input_mint = Pubkey.from_string("So11111111111111111111111111111111111111112") - >>> output_mint = Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") + >>> input_mint = "So11111111111111111111111111111111111111112" + >>> output_mint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" >>> in_amount = 5_000_000 >>> out_amount = 100_000 - >>> transaction_data = await jupiter.swap(user_public_key, input_mint, output_mint, amount) + >>> transaction_data = await jupiter.open_order(user_public_key, input_mint, output_mint, in_amount, out_amount) { 'transaction_data': 'AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEGC5Qzg6Gwmq0Gtgp4+LWUVz0yQOAuHGNJAGTs0dcqEMVCBvqBKhFi2uRFEKYI4zPatxbdm7DylvnQUby9MexSmeAdsqhWUMQ86Ddz4+7pQFooE6wLglATS/YvzOVUNMOqnyAmC8Ioh9cSvEZniys4XY0OyEvxe39gSdHqlHWJQUPMn4prs0EwIc9JznmgzyMliG5PJTvaFYw75ssASGlB2gMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImg/TLoYktlelMGKAi4mA0icnTD92092qSZhd3wNABMCv4fVqQvV1OYZ3a3bH43JpI5pIln+UAHnO1fyDJwCfIGm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAQan1RcZLFxRIYzJTD1K8X9Y2u4Im6H9ROPb2YoAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKmr+pT0gdwb1ZeE73qr11921UvCtCB3MMpBcLaiY8+u7QEHDAEABAMCCAIHBgUKCRmFbkqvcJ/1nxAnAAAAAAAAECcAAAAAAAAA', 'signature2': Signature( diff --git a/src/setup.py b/src/setup.py index 583e69c..fe9b3ef 100644 --- a/src/setup.py +++ b/src/setup.py @@ -7,7 +7,7 @@ with codecs.open(os.path.join(here, "README.md"), encoding="utf-8") as fh: long_description = "\n" + fh.read() -VERSION = '0.0.1.4' +VERSION = '0.0.1.5' DESCRIPTION = 'Jupiter Python SDK' LONG_DESCRIPTION = 'This package allows the use of Jupiter decentralized exchange features on Solana using Python.' From c1e2b30c66dc9936fa9bc1f71dc9f47024b8dd1e Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Mon, 25 Dec 2023 21:06:38 +0100 Subject: [PATCH 07/36] [+] package --- src/dist/jupiter-python-sdk-0.0.1.5.tar.gz | Bin 0 -> 21354 bytes src/jupiter_python_sdk.egg-info/PKG-INFO | 154 ++++++++++++++++++ src/jupiter_python_sdk.egg-info/SOURCES.txt | 10 ++ .../dependency_links.txt | 1 + src/jupiter_python_sdk.egg-info/requires.txt | 42 +++++ src/jupiter_python_sdk.egg-info/top_level.txt | 1 + 6 files changed, 208 insertions(+) create mode 100644 src/dist/jupiter-python-sdk-0.0.1.5.tar.gz create mode 100644 src/jupiter_python_sdk.egg-info/PKG-INFO create mode 100644 src/jupiter_python_sdk.egg-info/SOURCES.txt create mode 100644 src/jupiter_python_sdk.egg-info/dependency_links.txt create mode 100644 src/jupiter_python_sdk.egg-info/requires.txt create mode 100644 src/jupiter_python_sdk.egg-info/top_level.txt diff --git a/src/dist/jupiter-python-sdk-0.0.1.5.tar.gz b/src/dist/jupiter-python-sdk-0.0.1.5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..8bfc70ef3aa357243bbdc379802d95a47a662428 GIT binary patch literal 21354 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 literal 0 HcmV?d00001 diff --git a/src/jupiter_python_sdk.egg-info/PKG-INFO b/src/jupiter_python_sdk.egg-info/PKG-INFO new file mode 100644 index 0000000..2b3ccd7 --- /dev/null +++ b/src/jupiter_python_sdk.egg-info/PKG-INFO @@ -0,0 +1,154 @@ +Metadata-Version: 2.1 +Name: jupiter-python-sdk +Version: 0.0.1.5 +Summary: Jupiter Python SDK +Author: TaoDev +Author-email: taodev3@proton.me +License: LICENSE.txt +Keywords: python,solana,jupiter,dex,trading,sdk +Classifier: Development Status :: 1 - Planning +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python :: 3 +Classifier: Operating System :: Unix +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Description-Content-Type: text/markdown +License-File: LICENSE.txt + + +
+

🐍 JUPITER PYTHON SDK 🪐

+ +
+ +--- + +

+ + +
+ + +
+ + +
+

+ +# 📖 Introduction +**Jupiter Python SDK** is a Python library that allows you to use most of **[Jupiter](https://jup.ag/) features**.
+It enables executing swaps, limit orders, DCA, swap pairs, tokens prices, fetching wallet infos, stats, data and more!
+This 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).
+There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs) for more information. + +# ⚠️ Disclaimer +**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.
+This 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.** + +# ✨ Quickstart + +### 🛠️ Installation + +```sh +pip install jupiter-python-sdk +``` + +### 📃 General Usage +**Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
+Otherwise, this is required, for instance, to open a DCA account or to close one.** + +If 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: +1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` +2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. + +```py +import base58 +from solders.pubkey import Pubkey +from solders.keypair import Keypair +from solana.rpc.async_api import AsyncClient +from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA + +async def main(): + private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE_KEY"))) # Private key as string + async_client = AsyncClient(os.getenv("RPC_API")) + jupiter = Jupiter(async_client, private_key) + + # EXECUTE A SWAP + swap = await jupiter.swap( + input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), + output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + amount=5_000_000, + slippage_bps=1, + ) + # Returns str: serialized transactions to execute the swap. + + # OPEN LIMIT ORDER + open_limit_order = await jupiter.open_order( + input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), + output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + in_amount=5_000_000, + out_amount=100_000, + ) + # Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened} + + # CREATE DCA ACCOUNT + create_dca_account = await jupiter.dca.create_dca( + input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), + output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + total_in_amount=5_000_000, + in_amount_per_cycle=100_000, + cycle_frequency=60, + min_out_amount_per_cycle=0, + max_out_amount_per_cycle=0, + start=0 + ) + # Returns DCA Account Pubkey and transaction hash. + + # CLOSE DCA ACCOUNT + close_dca_account = await jupiter.dca.close_dca( + dca_pubkey=Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") + ) + # Returns transaction hash. +``` +### 📜 All available features +```py +- quote +- swap +- open_order +- cancel_orders +- create_dca +- close_dca +- fetch_user_dca_accounts +- fetch_dca_account_fills_history +- get_available_dca_tokens +- fetch_dca_data +- query_open_orders +- query_orders_history +- query_trades_history +- get_jupiter_stats +- get_token_price +- get_indexed_route_map +- get_tokens_list +- get_all_tickers +- get_all_swap_pairs +- get_swap_pairs +- get_token_stats_by_date +- program_id_to_label +``` + +# 📝 TO-DO +- [ ] Bridge 🌉 +- [ ] Perpetual 💸 + +# 🤝 Contributions +If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
+Contact me for any inquiry, I will reach you as soon as possible.
+[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/H3QRapcC) +[![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) + +# 👑 Donations +This project doesn't include platform fees. If you find value in it and would like to support its development, your donations are greatly appreciated.
+**SOLANA ADDRESS** +```sh +AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX +``` diff --git a/src/jupiter_python_sdk.egg-info/SOURCES.txt b/src/jupiter_python_sdk.egg-info/SOURCES.txt new file mode 100644 index 0000000..abe1590 --- /dev/null +++ b/src/jupiter_python_sdk.egg-info/SOURCES.txt @@ -0,0 +1,10 @@ +LICENSE.txt +README.md +setup.py +jupiter_python_sdk/__init__.py +jupiter_python_sdk/jupiter.py +jupiter_python_sdk.egg-info/PKG-INFO +jupiter_python_sdk.egg-info/SOURCES.txt +jupiter_python_sdk.egg-info/dependency_links.txt +jupiter_python_sdk.egg-info/requires.txt +jupiter_python_sdk.egg-info/top_level.txt \ No newline at end of file diff --git a/src/jupiter_python_sdk.egg-info/dependency_links.txt b/src/jupiter_python_sdk.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/jupiter_python_sdk.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/jupiter_python_sdk.egg-info/requires.txt b/src/jupiter_python_sdk.egg-info/requires.txt new file mode 100644 index 0000000..5c5a130 --- /dev/null +++ b/src/jupiter_python_sdk.egg-info/requires.txt @@ -0,0 +1,42 @@ +wheel +anchorpy +anchorpy-core +anyio +attrs +base58 +based58 +borsh-construct +cachetools +certifi +charset-normalizer +colorama +construct +construct-typing +h11 +httpcore +httpx +idna +iniconfig +jsonalias +jsonrpcclient +more-itertools +packaging +pluggy +psutil +py +pyheck +pytest +pytest-asyncio +pytest-xprocess +rfc3986 +sniffio +solana +solders +sumtypes +toml +toolz +types-cachetools +typing_extensions +urllib3 +websockets +zstandard diff --git a/src/jupiter_python_sdk.egg-info/top_level.txt b/src/jupiter_python_sdk.egg-info/top_level.txt new file mode 100644 index 0000000..6ec1073 --- /dev/null +++ b/src/jupiter_python_sdk.egg-info/top_level.txt @@ -0,0 +1 @@ +jupiter_python_sdk From 179f3dddccda5d2909f862681dc0ee288601047a Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Tue, 26 Dec 2023 11:54:14 +0100 Subject: [PATCH 08/36] [+] fix: install_requires --- src/dist/jupiter-python-sdk-0.0.1.5.tar.gz | Bin 21354 -> 0 bytes src/dist/jupiter-python-sdk-0.0.1.6.tar.gz | Bin 0 -> 20961 bytes src/jupiter_python_sdk.egg-info/PKG-INFO | 4 +- src/jupiter_python_sdk.egg-info/requires.txt | 43 ++--------------- src/setup.py | 47 ++----------------- 5 files changed, 10 insertions(+), 84 deletions(-) delete mode 100644 src/dist/jupiter-python-sdk-0.0.1.5.tar.gz create mode 100644 src/dist/jupiter-python-sdk-0.0.1.6.tar.gz diff --git a/src/dist/jupiter-python-sdk-0.0.1.5.tar.gz b/src/dist/jupiter-python-sdk-0.0.1.5.tar.gz deleted file mode 100644 index 8bfc70ef3aa357243bbdc379802d95a47a662428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21354 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 diff --git a/src/dist/jupiter-python-sdk-0.0.1.6.tar.gz b/src/dist/jupiter-python-sdk-0.0.1.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..14c19fcb362237ae29d25ce7ed6bc16b6bfeaf9d GIT binary patch literal 20961 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 _w;$rxQY27kkip}<{v)iC-sNca-WT*hdXDb zFK||}HmSdg%i6+$E=m^uHUKI!p(4AFV4)IM#tf7;652Q@u+gC zVI7bn_6J`_15atkm*25&h(I?Q{xb0Xy@wjSI_0+;KmfD740XGX2XWng^mv7sw2c_F zPNaHo$;T3AeCIt_TJfJyU%AR^V!dc(BA2tm>K1ka&#zD5*SP`MUFK|#V5lf`w$rXC}ee2c&G>Jm-lGSncjPicN-byy#Ji2caw{1{%L&v_%Ims@&iF$3DUZ`0-dD|*(I4*0t=?REO{nz~Ws>aY6{RXAOPTl}nbZ~atgy&D9M@aPCi`$BW&6r`qL(f- zX7TI$^PAFZQW&M11F62U3v_Ek^Rd-4XI;jDJ&mnf@GVNaZ|&H0DeY@J_RY))%!=aJ z1fepY{R{oH{Q7gClS7cdgCEUB)z2IS$AiA527)3-tRh4})Q_-(C{~O9=q9;8VWB_M zwaNWR|NSWxCLVJzy}1_s_rQEk0u?(vjF9+!_mcYb?VS&PYcpTxg}w@VE+G2jac{-iuT@7_HZZ`kUns}?Vl`g1aKelx0aLOefu7`>?Z3%U5z zyS`61%g?u^r{2|BqI$NP1(4xP!-U*~W26Cb>El%LJ|CXx7daY7zb@KH}v(s)|yVbj)+jgy03Z2@PwwH;l^G@WRX6U;=ha4L> z)V$Bv*Ht5V?wyrt^-{G{YZOZjXH}yD)QyV5SkR->c$7+>q6x7dqw*a-uIkuX|bZ92h|KckN{4-|}T-+>7*R9TT#pt>}`N!pIqM#`3fbVn_ z%|AF6wm@erb3B2U3zhI@m5StCaSZzFa01>f)KQ@aJV3%526JAg5mxJn{DAE(Iu1Q& zKv{m?6DJ%H3x1C9kOKP!`P!LU&AzXcIq*b4C0>`;bTTxCbeJ3ptQiA~$Ve{nV>DUS zX-u5RsspTJ#Gx5Up=m^h>i`I(J{!70H29YZOeN>z!RU?#Hf0z&N`9z2pbM z6%1^Gs5u9<9>!7-Fia>AXGUj7yym#1&$!BFfEV;g9Eler7p34;W3cwJY6kgnd`}p| z`rDC|v@1C8vOF?Et(QuYU_DaO2&1J3YM93S;)QP+y8`wgPQM5mW2hONU7VT0p(H5K z?7d8yh0#U4b798SX}&Av+*j_IGQTi?k4>D_n-Qi$-A?>)3$_8h3ej1U#Ice$z z3)KbC5g|ZAYa&chpx2?%lH@S5m=Ho2j3`dT2w?YyvOz60Lh%Cn;7j9Hb_3H}^DKwX zM>K35V}GF%4Zt-)gy{s41)dm_L>qEBTlsg&MNF9kB&OcZkj+H&8>I(~?pATaNiEI} zpf>LwB2H4IoD~#pMuHkm(Hn}eA`%SjXtNWh=`s}3c_6{lwBxsmY z?SU{wl){661b^F+_f|zgn#$so=Zxtaqot1F@Cq{kp@|E+?AB@?!wZL z@Z|{EzR(s4cLuc9fbpgGFCuZlh+!i@zNa(WC(AN*Osb(4^Bhq@?(jP&wBJqm>Q=F; z>q1qxi%a!c(+#3g3E#8i-A0+)z~Bc8_;7tJ<$D^eT#B%Cunpp!^>A*5S~8tXB(whI zFrfl1*)sDa?4Lr7cq$wBt$~!|2GEprlOEvy<&1;&OhL75+RqZSuZXOU*9De|_RYhE zJKRrzNLI!Qv{movfySSGLeAvxVDy`EERo zkL%g9MDI@E6KB$>k(HJD@w7cmB=39bewf)8;V==g;tbCOD?lIhI)=wGtgjbn&Nz)R|!Py0lJv;Ud-o(Wm2l?%b6gZja@e`hZT`Rb%+ z_}R#5hM&-t#-JnQlern_M~eq0K!KH`j3DI$t@_K%=z;eh0V#U|fxVW;4%~U|ZiA4SZ z-pf#ccnoRFikbLtL@TotTT(YJqh-mkBHv6=0w2CeNfKCpryyCcAn|MhhlHG;08o5S zxwS@7s5;vBhmIKe;%sUgpnRT8!(xly2?{@-V?R@4361X^+)=^0Ruc&mQtEp*G7# z<@B(Wt(GT?q;fnRT=%u>VLw~$pH$_3uRf?O^4*(-K28q?t;N-B-1z?TW$@5`$T#l# ze7|z74WCm_!*cVv-ESyDvy#e=@2chY%gHodt0Y4jG+?-%++x-O2t=Z~Lj_t|;B z*JKy-;`mh|CC@ITyZdNmK0D7&xSPAl>v(W?7ER1GJ@b50NjLK9MHL9maVd3tK28lE zfYO}}>$==eRL{?E^6`Xrn@*moYAt^MDA$eVZ@b*d*eO;@$UQRte~`Fx>g*OD$%C$a(VImlDc{=OWjIWuO;K9URiie@we< z+=z?&dP`_t9(T2qQeo779wdr|xZE0ZYP3|jEj>%q$Hezi>b`p${a)zDY&^yoP z+l5(qc9+jT<_ovgO3}i14Zhs~rnWEhx21A^kS`YV75p%04a_p5v;3^oIGZ0|7T|mS zwo-ylT%65j7w3)AS$^2AmFGA2#d+nnoR=R9x4nzYo6=zXT0M&^i?g#C!Ijn%EN`Wh zGWW*Cnc0UTwl^x~XSi0QvpB4t_Wk8uX;Nv(=UVBwpSTh8qw>9`6-L6i0*u#%a($PW zr3P1Lv#Um{6l*?L`0M7ZQYj2_xy@8T4O@bDM4Ng29UPY<_y$-y?>6v{tTdECO9?le z!a>gY;3r(?tiM*u)w$(Y>%{Av@7o|jJLh@|khOEp2j4g|CrMW@`xdWbcHgCF*^q0c zLZ|MP^QZ?ycm&kR2>=Ig=rr&GAUI}y?(7Mnbk`;_9*B5Q-6I#Si&`|#CaMm?s6L_( z3Q{$q)7SpzFoQ~>od0~78l+D|Gwsms?SEcUDtSAytX3jfVu-8MJ1dvmnf6`!B|FQ@ z@;832pwh(3cE8qRrlugDFD>P^{*k> zOa&2@ZppSWb{#5PtYquFKyswx{zLUodxMpTaR$Rf$gBMc-K6L2RGDD4i6p1P-c zI~v(Zsyj*bmn5lfnD*L1y-2p}H;S~5!+LYU){$Y_?#2f03*O$4xTZn=*Yg{c&I{?y zW$d%*%h}biEF>n4a_Q=^l6tMP`n=1Hv&Drtm2TVJ#mNmnZ;tsqr@ajC+c&qznIiX^ z`aY}NmSwq=nOzUWe5)CKoW9oX+SQxdi?qm(3&$0Cc+zW5OHY!p&{7YNvD%_Eo%6|) zL6f_95ijm9Z`<`7DW#}dtTe0iPA*@i@!)lFBMRr~`ekd%mLF%?w5H{o=i*snaI^Uw zRK|m7>so#s=^`)QoL}XI)Hoj#dQz(hwCg1C(tH|n$yqgjc2k(9`gbq4)4O=>@hQnB zyBDeCrBX>N6;b-WoxhN3@&2NCIVBVARmIh5Bc{zVMz8fjyY--p{zrJJ}`J0UXa^B95`pHSZ zaHh@AAD+~9A$+)PeskNU-yr7)ZxOjj2I1|cC(BUx zA=9sgG#O9^k1_ZjJP=>Gj<_vY@`+FC@uivkv~N_%>-(Q!TJ7rZAuZbRH5KNsw zF=V?emcKXF9ud^oXLzv&)E|@d`BYs8G!tc3d`skekDo5DE;=?(tQ{PFX1-&Lord;m z$8LKAx9uhZ^q-s^r}#}wMZme_Z!2Q4R+PI1R=s5t1?f4ZKQ$iet;>9>km^0gM){}O zYa_mpZ|CjGNUU>3S(;b5^kuQnJ<1oQbcUN&&u-(*>*`6YUw)cT@5I+9^`uyzDg7?@ zeZJZ{OQxI6>BZySols0<+fR*j_E-k2V&|7Un_Zlwj|Y>*d3`u8-Cb21C+FkK%JcK& zsU5p(s)^_*mP%bdRT?94G}~fm>h~9Mc61%*TH|vrp(p0wR~Kxv#x^gXqGJ9m{i;74 z4;H<=v^Y~HmAhz09Xz(O?8V7*WB8n}a%!o@&DhMVemA}<8V#4ull|^6p12>5PNeHp zyIad7$J)hpvz)y<=~mOF%ya#|+@BujU+zzyo~x}z^0JwEd@Rdc;r>Oxzc`M4&tKQa z)s!%}P)Cm!6^*;?=Wp8=unhV9>=szaVSm6UXNBTLf0*CEtnjs2tUk}zF){uIH5qS< zG;sHHX^*^%F54AJ{8k2KwH|wAO#U)`*fi;!N8#=DAoOazy-MokKz|QP++xp`c>z}h zE~SA!Sz+F;*nU$|yVdH(ZFJ?4FISaEHcy3MGAhnlCal(4hQucE+iM%?ab}~OH!FhA zp|xG6JdUyuU(1v3 z`FX#3b>1u#uY)p*>>Ktx|71E=sWCeu>22RHFU~he2A4lCmsl>r>xrjJp?~tso-5pq zFu#47-lv7*ID5uTulQ{JqS}8=t_G_L6>l1wbrovPAdL9N$>TPJza4N}f(?wVvC1M3 zNwWS8hWVi~yc`W%*;M_Ze4Bqw-d??&-<{{PiO0mC&EH+Lv$u^|GTz(YIQ5L@)o1U% z3^eSUdyZ~7uh6hzJ__c0&#@732ij7Ufluoga1azr5_HGWrf?nF6n7L#5IOT9T6Xk; zUo&q_vEprLn`4|dzMR`_^-12FsG6+$Cyp2iith(BC;A$nm(TU3Bc0BlncC>rdaBb| zvki!KSs=GEgK*C>n!@*lJ`4iD5(isvu~p9MKw(B32UH zE!PoCplxruk@B)$R{vH9`76|b=cAFv%uvMI+v^1Bjtp~r>N0ZTBwPQ7G$S6A7K?q&5t$=p7?Uf=e0r6m-(p}yz`;~domnav+3`D*5RoQms- zyZd%;IF7e6!~2KC%T-eACr=(;>*wA1-HDdCe?EKabM1WbmTR035|8nD{z^&-gPY5C zeBP)RT7&jb8fRY0?fQMA7ub4Wj_34gI(-UfZYG|6S~GRNwG$_&$rQ~oy`J0Jl+SXJ zqK$YhXQnQUUEPr7G7fiNwrIH%$Qu2bR7ys$75Rc~U}6P3;1wR+@CZAx4Lq!1 z!NZ5c)r_0>d|2Y$mfHC;{>=q$3l@&#t=gW2dy6vW=i>nBAl)1wyHn%M zyxNTWbfzub&a_5$x_iS0aGsuB{cSnVSSFKBpCs1vO#uZAcgzi0q)aw_oQ-AD!MvYt zFbHXNoR2rtH^uxN*Lb|=?*{Gr$Fh=99w&?Rbf!Kkjm!2WH++`wrO9N-^Mm-~?Byy` zPhVsvDSdi!(reFdb-j7^IL?foo7IcU^HO!t-I7B{;u)VjIgO5tz8IAYH~01GZL!t3JL9g-x=)k4iark(jpJpF>*_UQ@Ho0uR-l-2~)zT=NFAMkO z%*osJT^n*>&TZdb&wja*n{L5=tyRGe*%Dmdz!? zADc0VzHlt=5dR2b44pN7I6@ELx3YuF$IFJ9vIPkPg*Y0E)EQfeO#(tZT&E>HT3K|G zCqRsN?=i+YW0F)+Bu6eBwVGfh!6w;KH4+Jc?(HNpy36Y`o|jy=BCPXZf1ftj2W1=W z9Fca8#?A=sO-}En`CU4@{a4{|ErIcaY-3kwt1-PfQ}3`nvRVXRewqD@o=xe6BP#8{#cSs+id$$TfY`9}9z5Xu<&0EQXn$EQ)MbR$&lR zK1{+RxP`=yf#anpMc6)IF;N9ZwjVkT$r95f4o=KiR*kET6_zlZB*230L#v3V=rc|O zQaIQ{BDAS$uJDo;$)fCA zT6^vFJb%F6?^mO4T4s!B@;Za|SNR!~z3}QG=e`zFHXY|$ku^D(F}W{P`C2za&*H+~ zwKYsPeDRK%4ozh4wr~k_8}}wchk{qKs~-%_xa{alT{+}bec&$I5vlY0mARU;uKrc# z(GEfU*c!b0Q-Qh}5zahL>?By^oml8JUO6HR0tdf0Zi~_QnOJgw^PIU#c-{U1bx(eE zsZ$YyJZ%8(lDt=nwQ8ymKat4h``qC0PiaNd)eo)odA=kU@r%-uB;*;;?S8NzKElCPY)zqbDpfdu(uHTU)DuAjo#EO529w`7Fuw=)$? zg6jP)CvBq$PGEIAACJbDi&FL|2-O^_nn$On@8dhiO`FnFtefG1f|6&t<|fIimD(v7 zFnjSheLK4R>u8Y~g$>-_wnTkIbtjYrnoHw|YkgB)06_bt;i%K7MU$qzOT>#QTqs+->2sW=Nu-ul1u^4AhG* zJ*iC3Q{GR3wO#E}E6O``ePG84sXaJFAGo#+T}T*J)mzCL@?Quy4bNojV+yA)>f262 z1^F+s3wLHLqVc7otLl|3;{rlNJm(t|5)xa~e5G+u4Z{~KG@f>BYgf!-Ho~qs8X4be{#fheUpsk_^73KjiZ*?LM+x z?JmHKZ5`13i~)fqE^3dE-n}co_6HJ=rJBD(c<5^O*!q%cFop|;jAv#mS36=?eYrUcqpq)qRT;(2Z~X+Oo)>B-?YSG1 zacQsPQ{|}MlPi~S>rEq`1Rp5pRbw@l2fyrkteJP$Hg~uLK?)i+p46%Z^TFwFZM zM8rna6^t>WzAqTk$c$%2kH6zhEVkL@{H?7)9@rn#&{yn_HXQkl zWbOy&9R13ICS|A|!P}~eZH*S%qBbq?6vQ1j_>DyKRQKzeNkV(6O0y`A)d1@J4N-u2 z`OC`?qu$8q!vtDX*6k`SFG;!}_HJC|N%(5HG%pJ!P5a`C(aUSspHp`Hqg@iEeY5XODNpdh>_ICJN`ipOx?4{*d8vv&5_a{s3yz-dwI)U-6T5(?67v z=1D(4E;>iH=#VqpO|yjJC0>N#yjcspU;+@Za*V@HWUK98Jsxvxd+vcjg(C-xL0@~6 zq9qJ4Ax3`kG0xH+0m)jq*0nV$l~t-xzB4LV(JV|Gq#7#=m@L;fGJrp1vC~sLSQ{oh zof~nK9SXVUs?>~$Sq%OQ36}bJ{FEIT%R`~>L)M9}yF&hb&049I=!(wPR;fU|dmcx0 zT+~%Dyiz-QC6$(|a zU-vV(A=|qHNq_!mJX%Rdy`?410-Y<)I9C{C{0J^eD%mP%;TdW>%EchVaBSN>VE6dO z#sK-4bd}ixEXnS0RIA*6paSy$$|A_;jFI#PW5^m~VFv(y zv{s`mjU~3l@^f0?oohyH29@sR_X%6gn?YK3WnckJnkdl8nisow3t9{rmETds@`O|Z zSqy?RGUFoP-Jr~}e&mD>^Bg;YBbXftVrT zzdDE8fOr8AV{^@lMqru$nrr_{U`TWP-f;4dDT0fU%hTW#VYy~aw z$MjgXwN2eaSBM?Ru{;D1_HpY7Y01S&$0~H0VWzVpsmN!wi)B-CY;yL@(=v6V%%OGdd zsn5|ALrd7}Anb{b9=8PzEec=tr9VVd9en?MrHFB-f6dnESllex0D_hO#b)DU8QT>ULP+n<;XGuGPm-X zWA?&(gl6mY(QJ%i@_R9#JHXuO7%%tN!7vkM7ozHlcOPdjFxyAPr{R+RF%+Ku9 z+dD(}KMxN0UoiWm2Zk^9hW@|ug7M9NlVFoo zc=m5~A+IS{sbn;zsCce7k#ep)cI21}P5U0cvK5fHXb|P6#=k$5L!r~7D7z0HkJ83a z8(c=>)-Qr&$3-`z6l8JCsP|MeYN#$grChN(pp`L>39Hdk0z;rqEs(=YyMj}=2tiMYDRt{J~{-rPBwwFN=vY4reR>Vm!hCk_V zUZFCZWu-QE>iVAbhniaCQ}~RreRl+F^C&`vqdQdsox+QD|GoT?&MRalzUNSqWyFq1GG*oO?vNQ4&%Q7hdQlEh><7<*LW?*njHl zO+>9@2Lao6T#ByY`Z+o8mtav+n4ly`Z??E4W3`uO&@arOIkxbg-2M~1MVNx@m9UQP zP~`b25CYj+2@f^Jx2cfdnzp#07$5Viscf!`1=W~TL zh1T6Eqfc(z%9aFr=mnDRe0sK!9Ez=I_JPok>Y?*4nn{!FnJ~rS&T4_!K0K#bdpkV1 z0RAIA*7Hz{7_%=Jveks?+7&lE!nB?!8LLkFtR)J6Q3!2uo@%YG=kvYw{+HcamNuzE zRCmx37SGu~PsEMwBfqd`JZ7Fvf=_ht);Suub2n^IzV8ZC>bla0=cF$6UB8XbBs+_XBU~we{HpSO@6BMGHnOYI(B?zKR^O_kvo2Gi zZF_GCdff+ZS4Z~QW)7NU3*G z;LS`{phU3rkRJ_L69UHB8=IVf7Qb*KT!A5V&0^4pHaBLdxCYGQRsxiuk{kKmZuir zQQW{K$Y;%^v)ObK5*@+pv6O1nCW=W}b19|B9!D_lMx$ghWge@PPwjkt?&-(MU%Kzp za$b}xc{_;G`p*}Lu=E$E?px% zIZP+Sit%A$u7+~T@x+%`x`M6~H!CEoc!I^)-rgKk0l$}qVu3w#2K~R~icm%S%ATS+ z<&p5r4#r*eKO&QLci-}X9Y5ZI6Oz-^(H5*LDA%de?}(Jt;?0Bf={Bo&k4;mBZ>DDs`$ z^k_1o@wj!DFay5`r3oL>2ksv_QH?I2Xd0LWH`g}87aC3+RM3+A3PlKVgB&07VM3rZ z=xuCm_ro~tbyrY8j&h+U#)nPv-`)U%k@d;j;3O9aT3z`aD#L?4;nTyYqW&!IaB+GI zJ;>`dmJ+9t%wcLKMm8CRaf>3OqyVIVRMNgnv<>f|drRn3|0Jmp&*|h` zA}kY32dv8Lw{CQbR;6y^?KfpxgLx}Gb!yDs7thWw@^*;7gNSb*g<_9x^Y5-uEK)_V z`Qk>0qjgJ8dVd6PZNes~EV^KCqw(-jz}oTZM(3Zd2bLAH5!8?OWaRKp#}VeHRCU=b z=$Hi)v~iXHylE8hOlCaSNy5tdq#Xmcqp8&v3txiBOGBB5Fj8rj#29^P)f$LuqU`)mGNR88F35yo&~gq z$E0AoqVKBB<2qb?ow7G{H2Bl(%7(#4wZ1JkvDe?_U+eN{Cg=7vt;mB)6FP_z=7L0A zqCn!IB*dsb&1Oes$e<70D!!()gsipEOh)_}{%PM+)he$UU z5~+ym?XgI&3ZbU-6sVU5<3Ci%s^*4PAGtX$h$A05Fi4hc2;0qbw(0O&*kX@iT~wO^ zkt#JTF*ZYf!u-~oaib_C2xMw-I4NtI^0)e4%&hoNQegcL1Z%bamA$8Fyp5#PuGqKs zS~D43)o;Jik}X=#S&&w-PjvO=%|_USNhSaKu Date: Tue, 26 Dec 2023 19:15:17 +0100 Subject: [PATCH 09/36] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4c9e1a1..ecd3d33 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ async def main(): # EXECUTE A SWAP swap = await jupiter.swap( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + input_mint="So11111111111111111111111111111111111111112", + output_mint="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", amount=5_000_000, slippage_bps=1, ) From cc0f8e8c90f6d6ef0bd61c7da426920729a8a5fe Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Thu, 4 Jan 2024 23:21:40 +0100 Subject: [PATCH 10/36] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ecd3d33..b26f40a 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ async def main(): # 🤝 Contributions If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
Contact me for any inquiry, I will reach you as soon as possible.
-[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/H3QRapcC) +[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/QxwPGcXDp7) [![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) # 👑 Donations From fa6c0e8374de53d1576faf209e13681be30dbfa6 Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Tue, 9 Jan 2024 11:43:50 +0100 Subject: [PATCH 11/36] add: instructions to send transaction --- README.md | 121 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 80 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index b26f40a..cf83398 100644 --- a/README.md +++ b/README.md @@ -45,53 +45,92 @@ If you encounter ```ImportError: cannot import name 'sync_native' from 'spl.toke ```py import base58 +import base64 +import json +import asyncio + +from solders import message from solders.pubkey import Pubkey from solders.keypair import Keypair +from solders.transaction import VersionedTransaction + +from solana.rpc.types import TxOpts from solana.rpc.async_api import AsyncClient +from solana.rpc.commitment import Processed + from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA -async def main(): - private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE_KEY"))) # Private key as string - async_client = AsyncClient(os.getenv("RPC_API")) - jupiter = Jupiter(async_client, private_key) - - # EXECUTE A SWAP - swap = await jupiter.swap( - input_mint="So11111111111111111111111111111111111111112", - output_mint="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - amount=5_000_000, - slippage_bps=1, - ) - # Returns str: serialized transactions to execute the swap. - - # OPEN LIMIT ORDER - open_limit_order = await jupiter.open_order( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - in_amount=5_000_000, - out_amount=100_000, - ) - # Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened} - - # CREATE DCA ACCOUNT - create_dca_account = await jupiter.dca.create_dca( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - total_in_amount=5_000_000, - in_amount_per_cycle=100_000, - cycle_frequency=60, - min_out_amount_per_cycle=0, - max_out_amount_per_cycle=0, - start=0 - ) - # Returns DCA Account Pubkey and transaction hash. - - # CLOSE DCA ACCOUNT - close_dca_account = await jupiter.dca.close_dca( - dca_pubkey=Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") - ) - # Returns transaction hash. + +private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # Private key as string +async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") +jupiter = Jupiter(async_client, private_key) + + +""" +EXECUTE A SWAP +""" +transaction_data = await jupiter.swap( + input_mint="So11111111111111111111111111111111111111112", + output_mint="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + amount=5_000_000, + slippage_bps=1, +) +# Returns str: serialized transactions to execute the swap. + +raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data)) +signature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message)) +signed_txn = VersionedTransaction.populate(raw_transaction.message, [signature]) +opts = TxOpts(skip_preflight=False, preflight_commitment=Processed) +result = await client.send_raw_transaction(txn=bytes(signed_txn), opts=opts) +transaction_id = json.loads(result.to_json())['result'] +print(f"Transaction sent: https://explorer.solana.com/tx/{transaction_id}") + + +""" +OPEN LIMIT ORDER +""" +transaction_data = await jupiter.open_order( + input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), + output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + in_amount=5_000_000, + out_amount=100_000, +) +# Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened} + +raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data)) +signature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message)) +signed_txn = VersionedTransaction.populate(raw_transaction.message, [signature, transaction_data['signature2']]) +opts = TxOpts(skip_preflight=False, preflight_commitment=Processed) +result = await client.send_raw_transaction(txn=bytes(signed_txn), opts=opts) +transaction_id = json.loads(result.to_json())['result'] +print(f"Transaction sent: https://explorer.solana.com/tx/{transaction_id}") + + +""" +CREATE DCA ACCOUNT +""" +create_dca_account = await jupiter.dca.create_dca( + input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), + output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + total_in_amount=5_000_000, + in_amount_per_cycle=100_000, + cycle_frequency=60, + min_out_amount_per_cycle=0, + max_out_amount_per_cycle=0, + start=0 +) +# Returns DCA Account Pubkey and transaction hash. + + +""" +CLOSE DCA ACCOUNT +""" +close_dca_account = await jupiter.dca.close_dca( + dca_pubkey=Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") +) +# Returns transaction hash. ``` + ### 📜 All available features ```py - quote From 2cfa2763132617ab019014101ce5a10259eb353e Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Tue, 9 Jan 2024 11:48:31 +0100 Subject: [PATCH 12/36] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cf83398..f4b7b01 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ If you encounter ```ImportError: cannot import name 'sync_native' from 'spl.toke 1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` 2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. +### Here is a code snippet on how to use SDK ```py import base58 import base64 @@ -97,7 +98,7 @@ transaction_data = await jupiter.open_order( ) # Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened} -raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data)) +raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data['transaction_data'])) signature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message)) signed_txn = VersionedTransaction.populate(raw_transaction.message, [signature, transaction_data['signature2']]) opts = TxOpts(skip_preflight=False, preflight_commitment=Processed) From d9f1b92e75e1300339a8a302b9322de3309c15a5 Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Tue, 9 Jan 2024 11:49:17 +0100 Subject: [PATCH 13/36] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f4b7b01..4726d46 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ If you encounter ```ImportError: cannot import name 'sync_native' from 'spl.toke 1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` 2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. -### Here is a code snippet on how to use SDK +### Here is a code snippet on how to use the SDK ```py import base58 import base64 From 5c0cb6fb2ad300572af514ebbcb904dc174787ed Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Tue, 9 Jan 2024 11:49:42 +0100 Subject: [PATCH 14/36] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 4726d46..05c3bd1 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,6 @@ If you encounter ```ImportError: cannot import name 'sync_native' from 'spl.toke import base58 import base64 import json -import asyncio from solders import message from solders.pubkey import Pubkey From d1ff999b70c91ca87b187f2b30c96c63bda2a8ae Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Fri, 19 Jan 2024 21:35:01 +0100 Subject: [PATCH 15/36] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 05c3bd1..b31ab6e 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_d signature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message)) signed_txn = VersionedTransaction.populate(raw_transaction.message, [signature]) opts = TxOpts(skip_preflight=False, preflight_commitment=Processed) -result = await client.send_raw_transaction(txn=bytes(signed_txn), opts=opts) +result = await async_client.send_raw_transaction(txn=bytes(signed_txn), opts=opts) transaction_id = json.loads(result.to_json())['result'] print(f"Transaction sent: https://explorer.solana.com/tx/{transaction_id}") @@ -101,7 +101,7 @@ raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_d signature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message)) signed_txn = VersionedTransaction.populate(raw_transaction.message, [signature, transaction_data['signature2']]) opts = TxOpts(skip_preflight=False, preflight_commitment=Processed) -result = await client.send_raw_transaction(txn=bytes(signed_txn), opts=opts) +result = await async_client.send_raw_transaction(txn=bytes(signed_txn), opts=opts) transaction_id = json.loads(result.to_json())['result'] print(f"Transaction sent: https://explorer.solana.com/tx/{transaction_id}") From 49c63cf65cde8feb15918f403fe6585a62b60763 Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Fri, 19 Jan 2024 21:43:23 +0100 Subject: [PATCH 16/36] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b31ab6e..713c0e8 100644 --- a/README.md +++ b/README.md @@ -90,8 +90,8 @@ print(f"Transaction sent: https://explorer.solana.com/tx/{transaction_id}") OPEN LIMIT ORDER """ transaction_data = await jupiter.open_order( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + input_mint=So11111111111111111111111111111111111111112", + output_mint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", in_amount=5_000_000, out_amount=100_000, ) From 46b1b1ef01134b6a37ccf643d2b3cb1cadc2a131 Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Fri, 19 Jan 2024 22:10:22 +0100 Subject: [PATCH 17/36] Create requirements.txt --- requirements.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a7b92e3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +base58 +solders +solana +httpx +anchorpy From 1e4dbff28d9f72efc4de29beee592d36b82bf389 Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Fri, 19 Jan 2024 22:11:38 +0100 Subject: [PATCH 18/36] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index a7b92e3..af6f0bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ solders solana httpx anchorpy +jupiter-python-sdk From 3ee4380ad097c52345cbac0b9036f84365309ca1 Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Wed, 24 Jan 2024 20:38:51 +0100 Subject: [PATCH 19/36] fix: wrapUnwrapSol --- .gitignore | 178 +++++++++++++++++++++++++++++- README.md | 4 +- src/README.md | 4 +- src/jupiter_python_sdk/jupiter.py | 2 +- src/setup.py | 1 - 5 files changed, 182 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 061ef89..8b319ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,179 @@ venv/ __pycache__/ -main.py \ No newline at end of file +main.py + +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ + +# Docs +docs/ + +# Dotenv file +.env + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ \ No newline at end of file diff --git a/README.md b/README.md index 4c9e1a1..ecd3d33 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ async def main(): # EXECUTE A SWAP swap = await jupiter.swap( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + input_mint="So11111111111111111111111111111111111111112", + output_mint="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", amount=5_000_000, slippage_bps=1, ) diff --git a/src/README.md b/src/README.md index 4c9e1a1..ecd3d33 100644 --- a/src/README.md +++ b/src/README.md @@ -57,8 +57,8 @@ async def main(): # EXECUTE A SWAP swap = await jupiter.swap( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + input_mint="So11111111111111111111111111111111111111112", + output_mint="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", amount=5_000_000, slippage_bps=1, ) diff --git a/src/jupiter_python_sdk/jupiter.py b/src/jupiter_python_sdk/jupiter.py index 6b7f2cc..144bb88 100644 --- a/src/jupiter_python_sdk/jupiter.py +++ b/src/jupiter_python_sdk/jupiter.py @@ -671,7 +671,7 @@ async def swap( transaction_parameters = { "quoteResponse": quoteResponse, "userPublicKey": self.keypair.pubkey().__str__(), - "wrapUnwrapSOL": wrap_unwrap_sol + "wrapUnwrapSol": wrap_unwrap_sol } transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['SWAP'], json=transaction_parameters).json()['swapTransaction'] return transaction_data diff --git a/src/setup.py b/src/setup.py index a4504c8..8c1c956 100644 --- a/src/setup.py +++ b/src/setup.py @@ -23,7 +23,6 @@ packages=find_packages(), license=('LICENSE.txt'), install_requires=[ - 'base58', 'solders', 'solana', 'httpx', From d1a4a33af4c3294c9e4ef6fef46f269712b540c0 Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Wed, 24 Jan 2024 20:48:00 +0100 Subject: [PATCH 20/36] test --- src/README.md | 123 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 81 insertions(+), 42 deletions(-) diff --git a/src/README.md b/src/README.md index ecd3d33..713c0e8 100644 --- a/src/README.md +++ b/src/README.md @@ -43,55 +43,94 @@ If you encounter ```ImportError: cannot import name 'sync_native' from 'spl.toke 1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` 2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. +### Here is a code snippet on how to use the SDK ```py import base58 +import base64 +import json + +from solders import message from solders.pubkey import Pubkey from solders.keypair import Keypair +from solders.transaction import VersionedTransaction + +from solana.rpc.types import TxOpts from solana.rpc.async_api import AsyncClient +from solana.rpc.commitment import Processed + from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA -async def main(): - private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE_KEY"))) # Private key as string - async_client = AsyncClient(os.getenv("RPC_API")) - jupiter = Jupiter(async_client, private_key) - - # EXECUTE A SWAP - swap = await jupiter.swap( - input_mint="So11111111111111111111111111111111111111112", - output_mint="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - amount=5_000_000, - slippage_bps=1, - ) - # Returns str: serialized transactions to execute the swap. - - # OPEN LIMIT ORDER - open_limit_order = await jupiter.open_order( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - in_amount=5_000_000, - out_amount=100_000, - ) - # Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened} - - # CREATE DCA ACCOUNT - create_dca_account = await jupiter.dca.create_dca( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - total_in_amount=5_000_000, - in_amount_per_cycle=100_000, - cycle_frequency=60, - min_out_amount_per_cycle=0, - max_out_amount_per_cycle=0, - start=0 - ) - # Returns DCA Account Pubkey and transaction hash. - - # CLOSE DCA ACCOUNT - close_dca_account = await jupiter.dca.close_dca( - dca_pubkey=Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") - ) - # Returns transaction hash. + +private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # Private key as string +async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") +jupiter = Jupiter(async_client, private_key) + + +""" +EXECUTE A SWAP +""" +transaction_data = await jupiter.swap( + input_mint="So11111111111111111111111111111111111111112", + output_mint="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + amount=5_000_000, + slippage_bps=1, +) +# Returns str: serialized transactions to execute the swap. + +raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data)) +signature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message)) +signed_txn = VersionedTransaction.populate(raw_transaction.message, [signature]) +opts = TxOpts(skip_preflight=False, preflight_commitment=Processed) +result = await async_client.send_raw_transaction(txn=bytes(signed_txn), opts=opts) +transaction_id = json.loads(result.to_json())['result'] +print(f"Transaction sent: https://explorer.solana.com/tx/{transaction_id}") + + +""" +OPEN LIMIT ORDER +""" +transaction_data = await jupiter.open_order( + input_mint=So11111111111111111111111111111111111111112", + output_mint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + in_amount=5_000_000, + out_amount=100_000, +) +# Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened} + +raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data['transaction_data'])) +signature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message)) +signed_txn = VersionedTransaction.populate(raw_transaction.message, [signature, transaction_data['signature2']]) +opts = TxOpts(skip_preflight=False, preflight_commitment=Processed) +result = await async_client.send_raw_transaction(txn=bytes(signed_txn), opts=opts) +transaction_id = json.loads(result.to_json())['result'] +print(f"Transaction sent: https://explorer.solana.com/tx/{transaction_id}") + + +""" +CREATE DCA ACCOUNT +""" +create_dca_account = await jupiter.dca.create_dca( + input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), + output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + total_in_amount=5_000_000, + in_amount_per_cycle=100_000, + cycle_frequency=60, + min_out_amount_per_cycle=0, + max_out_amount_per_cycle=0, + start=0 +) +# Returns DCA Account Pubkey and transaction hash. + + +""" +CLOSE DCA ACCOUNT +""" +close_dca_account = await jupiter.dca.close_dca( + dca_pubkey=Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") +) +# Returns transaction hash. ``` + ### 📜 All available features ```py - quote @@ -125,7 +164,7 @@ async def main(): # 🤝 Contributions If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
Contact me for any inquiry, I will reach you as soon as possible.
-[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/H3QRapcC) +[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/QxwPGcXDp7) [![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) # 👑 Donations From f538b35a6e30f858733b880b559ed04c61f2cbf2 Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Wed, 24 Jan 2024 20:49:13 +0100 Subject: [PATCH 21/36] fix: wrapAndUnwrapSol --- src/jupiter_python_sdk/jupiter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jupiter_python_sdk/jupiter.py b/src/jupiter_python_sdk/jupiter.py index 144bb88..56e8600 100644 --- a/src/jupiter_python_sdk/jupiter.py +++ b/src/jupiter_python_sdk/jupiter.py @@ -671,7 +671,7 @@ async def swap( transaction_parameters = { "quoteResponse": quoteResponse, "userPublicKey": self.keypair.pubkey().__str__(), - "wrapUnwrapSol": wrap_unwrap_sol + "wrapAndUnwrapSol": wrap_unwrap_sol } transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['SWAP'], json=transaction_parameters).json()['swapTransaction'] return transaction_data From 0daabec89ec91f26d5832d4db87aef2913f84e44 Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Wed, 24 Jan 2024 20:55:12 +0100 Subject: [PATCH 22/36] add: base58 requirements --- src/setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/setup.py b/src/setup.py index 8c1c956..a4504c8 100644 --- a/src/setup.py +++ b/src/setup.py @@ -23,6 +23,7 @@ packages=find_packages(), license=('LICENSE.txt'), install_requires=[ + 'base58', 'solders', 'solana', 'httpx', From 0f32f7e818a96709d8c0e96ca7362acf6571975b Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Wed, 24 Jan 2024 21:06:21 +0100 Subject: [PATCH 23/36] change package version --- src/dist/jupiter-python-sdk-0.0.1.6.tar.gz | Bin 20961 -> 21620 bytes src/jupiter_python_sdk.egg-info/PKG-INFO | 123 ++++++++++++++------- src/setup.py | 2 +- 3 files changed, 82 insertions(+), 43 deletions(-) diff --git a/src/dist/jupiter-python-sdk-0.0.1.6.tar.gz b/src/dist/jupiter-python-sdk-0.0.1.6.tar.gz index 14c19fcb362237ae29d25ce7ed6bc16b6bfeaf9d..2238cfebf56cab726b952aa9bc0280adefb22194 100644 GIT binary patch literal 21620 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 Sn2>(~%v@P5Fa|yr#=ih&I)!)u literal 20961 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 _w;$rxQY27kkip}<{v)iC-sNca-WT*hdXDb zFK||}HmSdg%i6+$E=m^uHUKI!p(4AFV4)IM#tf7;652Q@u+gC zVI7bn_6J`_15atkm*25&h(I?Q{xb0Xy@wjSI_0+;KmfD740XGX2XWng^mv7sw2c_F zPNaHo$;T3AeCIt_TJfJyU%AR^V!dc(BA2tm>K1ka&#zD5*SP`MUFK|#V5lf`w$rXC}ee2c&G>Jm-lGSncjPicN-byy#Ji2caw{1{%L&v_%Ims@&iF$3DUZ`0-dD|*(I4*0t=?REO{nz~Ws>aY6{RXAOPTl}nbZ~atgy&D9M@aPCi`$BW&6r`qL(f- zX7TI$^PAFZQW&M11F62U3v_Ek^Rd-4XI;jDJ&mnf@GVNaZ|&H0DeY@J_RY))%!=aJ z1fepY{R{oH{Q7gClS7cdgCEUB)z2IS$AiA527)3-tRh4})Q_-(C{~O9=q9;8VWB_M zwaNWR|NSWxCLVJzy}1_s_rQEk0u?(vjF9+!_mcYb?VS&PYcpTxg}w@VE+G2jac{-iuT@7_HZZ`kUns}?Vl`g1aKelx0aLOefu7`>?Z3%U5z zyS`61%g?u^r{2|BqI$NP1(4xP!-U*~W26Cb>El%LJ|CXx7daY7zb@KH}v(s)|yVbj)+jgy03Z2@PwwH;l^G@WRX6U;=ha4L> z)V$Bv*Ht5V?wyrt^-{G{YZOZjXH}yD)QyV5SkR->c$7+>q6x7dqw*a-uIkuX|bZ92h|KckN{4-|}T-+>7*R9TT#pt>}`N!pIqM#`3fbVn_ z%|AF6wm@erb3B2U3zhI@m5StCaSZzFa01>f)KQ@aJV3%526JAg5mxJn{DAE(Iu1Q& zKv{m?6DJ%H3x1C9kOKP!`P!LU&AzXcIq*b4C0>`;bTTxCbeJ3ptQiA~$Ve{nV>DUS zX-u5RsspTJ#Gx5Up=m^h>i`I(J{!70H29YZOeN>z!RU?#Hf0z&N`9z2pbM z6%1^Gs5u9<9>!7-Fia>AXGUj7yym#1&$!BFfEV;g9Eler7p34;W3cwJY6kgnd`}p| z`rDC|v@1C8vOF?Et(QuYU_DaO2&1J3YM93S;)QP+y8`wgPQM5mW2hONU7VT0p(H5K z?7d8yh0#U4b798SX}&Av+*j_IGQTi?k4>D_n-Qi$-A?>)3$_8h3ej1U#Ice$z z3)KbC5g|ZAYa&chpx2?%lH@S5m=Ho2j3`dT2w?YyvOz60Lh%Cn;7j9Hb_3H}^DKwX zM>K35V}GF%4Zt-)gy{s41)dm_L>qEBTlsg&MNF9kB&OcZkj+H&8>I(~?pATaNiEI} zpf>LwB2H4IoD~#pMuHkm(Hn}eA`%SjXtNWh=`s}3c_6{lwBxsmY z?SU{wl){661b^F+_f|zgn#$so=Zxtaqot1F@Cq{kp@|E+?AB@?!wZL z@Z|{EzR(s4cLuc9fbpgGFCuZlh+!i@zNa(WC(AN*Osb(4^Bhq@?(jP&wBJqm>Q=F; z>q1qxi%a!c(+#3g3E#8i-A0+)z~Bc8_;7tJ<$D^eT#B%Cunpp!^>A*5S~8tXB(whI zFrfl1*)sDa?4Lr7cq$wBt$~!|2GEprlOEvy<&1;&OhL75+RqZSuZXOU*9De|_RYhE zJKRrzNLI!Qv{movfySSGLeAvxVDy`EERo zkL%g9MDI@E6KB$>k(HJD@w7cmB=39bewf)8;V==g;tbCOD?lIhI)=wGtgjbn&Nz)R|!Py0lJv;Ud-o(Wm2l?%b6gZja@e`hZT`Rb%+ z_}R#5hM&-t#-JnQlern_M~eq0K!KH`j3DI$t@_K%=z;eh0V#U|fxVW;4%~U|ZiA4SZ z-pf#ccnoRFikbLtL@TotTT(YJqh-mkBHv6=0w2CeNfKCpryyCcAn|MhhlHG;08o5S zxwS@7s5;vBhmIKe;%sUgpnRT8!(xly2?{@-V?R@4361X^+)=^0Ruc&mQtEp*G7# z<@B(Wt(GT?q;fnRT=%u>VLw~$pH$_3uRf?O^4*(-K28q?t;N-B-1z?TW$@5`$T#l# ze7|z74WCm_!*cVv-ESyDvy#e=@2chY%gHodt0Y4jG+?-%++x-O2t=Z~Lj_t|;B z*JKy-;`mh|CC@ITyZdNmK0D7&xSPAl>v(W?7ER1GJ@b50NjLK9MHL9maVd3tK28lE zfYO}}>$==eRL{?E^6`Xrn@*moYAt^MDA$eVZ@b*d*eO;@$UQRte~`Fx>g*OD$%C$a(VImlDc{=OWjIWuO;K9URiie@we< z+=z?&dP`_t9(T2qQeo779wdr|xZE0ZYP3|jEj>%q$Hezi>b`p${a)zDY&^yoP z+l5(qc9+jT<_ovgO3}i14Zhs~rnWEhx21A^kS`YV75p%04a_p5v;3^oIGZ0|7T|mS zwo-ylT%65j7w3)AS$^2AmFGA2#d+nnoR=R9x4nzYo6=zXT0M&^i?g#C!Ijn%EN`Wh zGWW*Cnc0UTwl^x~XSi0QvpB4t_Wk8uX;Nv(=UVBwpSTh8qw>9`6-L6i0*u#%a($PW zr3P1Lv#Um{6l*?L`0M7ZQYj2_xy@8T4O@bDM4Ng29UPY<_y$-y?>6v{tTdECO9?le z!a>gY;3r(?tiM*u)w$(Y>%{Av@7o|jJLh@|khOEp2j4g|CrMW@`xdWbcHgCF*^q0c zLZ|MP^QZ?ycm&kR2>=Ig=rr&GAUI}y?(7Mnbk`;_9*B5Q-6I#Si&`|#CaMm?s6L_( z3Q{$q)7SpzFoQ~>od0~78l+D|Gwsms?SEcUDtSAytX3jfVu-8MJ1dvmnf6`!B|FQ@ z@;832pwh(3cE8qRrlugDFD>P^{*k> zOa&2@ZppSWb{#5PtYquFKyswx{zLUodxMpTaR$Rf$gBMc-K6L2RGDD4i6p1P-c zI~v(Zsyj*bmn5lfnD*L1y-2p}H;S~5!+LYU){$Y_?#2f03*O$4xTZn=*Yg{c&I{?y zW$d%*%h}biEF>n4a_Q=^l6tMP`n=1Hv&Drtm2TVJ#mNmnZ;tsqr@ajC+c&qznIiX^ z`aY}NmSwq=nOzUWe5)CKoW9oX+SQxdi?qm(3&$0Cc+zW5OHY!p&{7YNvD%_Eo%6|) zL6f_95ijm9Z`<`7DW#}dtTe0iPA*@i@!)lFBMRr~`ekd%mLF%?w5H{o=i*snaI^Uw zRK|m7>so#s=^`)QoL}XI)Hoj#dQz(hwCg1C(tH|n$yqgjc2k(9`gbq4)4O=>@hQnB zyBDeCrBX>N6;b-WoxhN3@&2NCIVBVARmIh5Bc{zVMz8fjyY--p{zrJJ}`J0UXa^B95`pHSZ zaHh@AAD+~9A$+)PeskNU-yr7)ZxOjj2I1|cC(BUx zA=9sgG#O9^k1_ZjJP=>Gj<_vY@`+FC@uivkv~N_%>-(Q!TJ7rZAuZbRH5KNsw zF=V?emcKXF9ud^oXLzv&)E|@d`BYs8G!tc3d`skekDo5DE;=?(tQ{PFX1-&Lord;m z$8LKAx9uhZ^q-s^r}#}wMZme_Z!2Q4R+PI1R=s5t1?f4ZKQ$iet;>9>km^0gM){}O zYa_mpZ|CjGNUU>3S(;b5^kuQnJ<1oQbcUN&&u-(*>*`6YUw)cT@5I+9^`uyzDg7?@ zeZJZ{OQxI6>BZySols0<+fR*j_E-k2V&|7Un_Zlwj|Y>*d3`u8-Cb21C+FkK%JcK& zsU5p(s)^_*mP%bdRT?94G}~fm>h~9Mc61%*TH|vrp(p0wR~Kxv#x^gXqGJ9m{i;74 z4;H<=v^Y~HmAhz09Xz(O?8V7*WB8n}a%!o@&DhMVemA}<8V#4ull|^6p12>5PNeHp zyIad7$J)hpvz)y<=~mOF%ya#|+@BujU+zzyo~x}z^0JwEd@Rdc;r>Oxzc`M4&tKQa z)s!%}P)Cm!6^*;?=Wp8=unhV9>=szaVSm6UXNBTLf0*CEtnjs2tUk}zF){uIH5qS< zG;sHHX^*^%F54AJ{8k2KwH|wAO#U)`*fi;!N8#=DAoOazy-MokKz|QP++xp`c>z}h zE~SA!Sz+F;*nU$|yVdH(ZFJ?4FISaEHcy3MGAhnlCal(4hQucE+iM%?ab}~OH!FhA zp|xG6JdUyuU(1v3 z`FX#3b>1u#uY)p*>>Ktx|71E=sWCeu>22RHFU~he2A4lCmsl>r>xrjJp?~tso-5pq zFu#47-lv7*ID5uTulQ{JqS}8=t_G_L6>l1wbrovPAdL9N$>TPJza4N}f(?wVvC1M3 zNwWS8hWVi~yc`W%*;M_Ze4Bqw-d??&-<{{PiO0mC&EH+Lv$u^|GTz(YIQ5L@)o1U% z3^eSUdyZ~7uh6hzJ__c0&#@732ij7Ufluoga1azr5_HGWrf?nF6n7L#5IOT9T6Xk; zUo&q_vEprLn`4|dzMR`_^-12FsG6+$Cyp2iith(BC;A$nm(TU3Bc0BlncC>rdaBb| zvki!KSs=GEgK*C>n!@*lJ`4iD5(isvu~p9MKw(B32UH zE!PoCplxruk@B)$R{vH9`76|b=cAFv%uvMI+v^1Bjtp~r>N0ZTBwPQ7G$S6A7K?q&5t$=p7?Uf=e0r6m-(p}yz`;~domnav+3`D*5RoQms- zyZd%;IF7e6!~2KC%T-eACr=(;>*wA1-HDdCe?EKabM1WbmTR035|8nD{z^&-gPY5C zeBP)RT7&jb8fRY0?fQMA7ub4Wj_34gI(-UfZYG|6S~GRNwG$_&$rQ~oy`J0Jl+SXJ zqK$YhXQnQUUEPr7G7fiNwrIH%$Qu2bR7ys$75Rc~U}6P3;1wR+@CZAx4Lq!1 z!NZ5c)r_0>d|2Y$mfHC;{>=q$3l@&#t=gW2dy6vW=i>nBAl)1wyHn%M zyxNTWbfzub&a_5$x_iS0aGsuB{cSnVSSFKBpCs1vO#uZAcgzi0q)aw_oQ-AD!MvYt zFbHXNoR2rtH^uxN*Lb|=?*{Gr$Fh=99w&?Rbf!Kkjm!2WH++`wrO9N-^Mm-~?Byy` zPhVsvDSdi!(reFdb-j7^IL?foo7IcU^HO!t-I7B{;u)VjIgO5tz8IAYH~01GZL!t3JL9g-x=)k4iark(jpJpF>*_UQ@Ho0uR-l-2~)zT=NFAMkO z%*osJT^n*>&TZdb&wja*n{L5=tyRGe*%Dmdz!? zADc0VzHlt=5dR2b44pN7I6@ELx3YuF$IFJ9vIPkPg*Y0E)EQfeO#(tZT&E>HT3K|G zCqRsN?=i+YW0F)+Bu6eBwVGfh!6w;KH4+Jc?(HNpy36Y`o|jy=BCPXZf1ftj2W1=W z9Fca8#?A=sO-}En`CU4@{a4{|ErIcaY-3kwt1-PfQ}3`nvRVXRewqD@o=xe6BP#8{#cSs+id$$TfY`9}9z5Xu<&0EQXn$EQ)MbR$&lR zK1{+RxP`=yf#anpMc6)IF;N9ZwjVkT$r95f4o=KiR*kET6_zlZB*230L#v3V=rc|O zQaIQ{BDAS$uJDo;$)fCA zT6^vFJb%F6?^mO4T4s!B@;Za|SNR!~z3}QG=e`zFHXY|$ku^D(F}W{P`C2za&*H+~ zwKYsPeDRK%4ozh4wr~k_8}}wchk{qKs~-%_xa{alT{+}bec&$I5vlY0mARU;uKrc# z(GEfU*c!b0Q-Qh}5zahL>?By^oml8JUO6HR0tdf0Zi~_QnOJgw^PIU#c-{U1bx(eE zsZ$YyJZ%8(lDt=nwQ8ymKat4h``qC0PiaNd)eo)odA=kU@r%-uB;*;;?S8NzKElCPY)zqbDpfdu(uHTU)DuAjo#EO529w`7Fuw=)$? zg6jP)CvBq$PGEIAACJbDi&FL|2-O^_nn$On@8dhiO`FnFtefG1f|6&t<|fIimD(v7 zFnjSheLK4R>u8Y~g$>-_wnTkIbtjYrnoHw|YkgB)06_bt;i%K7MU$qzOT>#QTqs+->2sW=Nu-ul1u^4AhG* zJ*iC3Q{GR3wO#E}E6O``ePG84sXaJFAGo#+T}T*J)mzCL@?Quy4bNojV+yA)>f262 z1^F+s3wLHLqVc7otLl|3;{rlNJm(t|5)xa~e5G+u4Z{~KG@f>BYgf!-Ho~qs8X4be{#fheUpsk_^73KjiZ*?LM+x z?JmHKZ5`13i~)fqE^3dE-n}co_6HJ=rJBD(c<5^O*!q%cFop|;jAv#mS36=?eYrUcqpq)qRT;(2Z~X+Oo)>B-?YSG1 zacQsPQ{|}MlPi~S>rEq`1Rp5pRbw@l2fyrkteJP$Hg~uLK?)i+p46%Z^TFwFZM zM8rna6^t>WzAqTk$c$%2kH6zhEVkL@{H?7)9@rn#&{yn_HXQkl zWbOy&9R13ICS|A|!P}~eZH*S%qBbq?6vQ1j_>DyKRQKzeNkV(6O0y`A)d1@J4N-u2 z`OC`?qu$8q!vtDX*6k`SFG;!}_HJC|N%(5HG%pJ!P5a`C(aUSspHp`Hqg@iEeY5XODNpdh>_ICJN`ipOx?4{*d8vv&5_a{s3yz-dwI)U-6T5(?67v z=1D(4E;>iH=#VqpO|yjJC0>N#yjcspU;+@Za*V@HWUK98Jsxvxd+vcjg(C-xL0@~6 zq9qJ4Ax3`kG0xH+0m)jq*0nV$l~t-xzB4LV(JV|Gq#7#=m@L;fGJrp1vC~sLSQ{oh zof~nK9SXVUs?>~$Sq%OQ36}bJ{FEIT%R`~>L)M9}yF&hb&049I=!(wPR;fU|dmcx0 zT+~%Dyiz-QC6$(|a zU-vV(A=|qHNq_!mJX%Rdy`?410-Y<)I9C{C{0J^eD%mP%;TdW>%EchVaBSN>VE6dO z#sK-4bd}ixEXnS0RIA*6paSy$$|A_;jFI#PW5^m~VFv(y zv{s`mjU~3l@^f0?oohyH29@sR_X%6gn?YK3WnckJnkdl8nisow3t9{rmETds@`O|Z zSqy?RGUFoP-Jr~}e&mD>^Bg;YBbXftVrT zzdDE8fOr8AV{^@lMqru$nrr_{U`TWP-f;4dDT0fU%hTW#VYy~aw z$MjgXwN2eaSBM?Ru{;D1_HpY7Y01S&$0~H0VWzVpsmN!wi)B-CY;yL@(=v6V%%OGdd zsn5|ALrd7}Anb{b9=8PzEec=tr9VVd9en?MrHFB-f6dnESllex0D_hO#b)DU8QT>ULP+n<;XGuGPm-X zWA?&(gl6mY(QJ%i@_R9#JHXuO7%%tN!7vkM7ozHlcOPdjFxyAPr{R+RF%+Ku9 z+dD(}KMxN0UoiWm2Zk^9hW@|ug7M9NlVFoo zc=m5~A+IS{sbn;zsCce7k#ep)cI21}P5U0cvK5fHXb|P6#=k$5L!r~7D7z0HkJ83a z8(c=>)-Qr&$3-`z6l8JCsP|MeYN#$grChN(pp`L>39Hdk0z;rqEs(=YyMj}=2tiMYDRt{J~{-rPBwwFN=vY4reR>Vm!hCk_V zUZFCZWu-QE>iVAbhniaCQ}~RreRl+F^C&`vqdQdsox+QD|GoT?&MRalzUNSqWyFq1GG*oO?vNQ4&%Q7hdQlEh><7<*LW?*njHl zO+>9@2Lao6T#ByY`Z+o8mtav+n4ly`Z??E4W3`uO&@arOIkxbg-2M~1MVNx@m9UQP zP~`b25CYj+2@f^Jx2cfdnzp#07$5Viscf!`1=W~TL zh1T6Eqfc(z%9aFr=mnDRe0sK!9Ez=I_JPok>Y?*4nn{!FnJ~rS&T4_!K0K#bdpkV1 z0RAIA*7Hz{7_%=Jveks?+7&lE!nB?!8LLkFtR)J6Q3!2uo@%YG=kvYw{+HcamNuzE zRCmx37SGu~PsEMwBfqd`JZ7Fvf=_ht);Suub2n^IzV8ZC>bla0=cF$6UB8XbBs+_XBU~we{HpSO@6BMGHnOYI(B?zKR^O_kvo2Gi zZF_GCdff+ZS4Z~QW)7NU3*G z;LS`{phU3rkRJ_L69UHB8=IVf7Qb*KT!A5V&0^4pHaBLdxCYGQRsxiuk{kKmZuir zQQW{K$Y;%^v)ObK5*@+pv6O1nCW=W}b19|B9!D_lMx$ghWge@PPwjkt?&-(MU%Kzp za$b}xc{_;G`p*}Lu=E$E?px% zIZP+Sit%A$u7+~T@x+%`x`M6~H!CEoc!I^)-rgKk0l$}qVu3w#2K~R~icm%S%ATS+ z<&p5r4#r*eKO&QLci-}X9Y5ZI6Oz-^(H5*LDA%de?}(Jt;?0Bf={Bo&k4;mBZ>DDs`$ z^k_1o@wj!DFay5`r3oL>2ksv_QH?I2Xd0LWH`g}87aC3+RM3+A3PlKVgB&07VM3rZ z=xuCm_ro~tbyrY8j&h+U#)nPv-`)U%k@d;j;3O9aT3z`aD#L?4;nTyYqW&!IaB+GI zJ;>`dmJ+9t%wcLKMm8CRaf>3OqyVIVRMNgnv<>f|drRn3|0Jmp&*|h` zA}kY32dv8Lw{CQbR;6y^?KfpxgLx}Gb!yDs7thWw@^*;7gNSb*g<_9x^Y5-uEK)_V z`Qk>0qjgJ8dVd6PZNes~EV^KCqw(-jz}oTZM(3Zd2bLAH5!8?OWaRKp#}VeHRCU=b z=$Hi)v~iXHylE8hOlCaSNy5tdq#Xmcqp8&v3txiBOGBB5Fj8rj#29^P)f$LuqU`)mGNR88F35yo&~gq z$E0AoqVKBB<2qb?ow7G{H2Bl(%7(#4wZ1JkvDe?_U+eN{Cg=7vt;mB)6FP_z=7L0A zqCn!IB*dsb&1Oes$e<70D!!()gsipEOh)_}{%PM+)he$UU z5~+ym?XgI&3ZbU-6sVU5<3Ci%s^*4PAGtX$h$A05Fi4hc2;0qbw(0O&*kX@iT~wO^ zkt#JTF*ZYf!u-~oaib_C2xMw-I4NtI^0)e4%&hoNQegcL1Z%bamA$8Fyp5#PuGqKs zS~D43)o;Jik}X=#S&&w-PjvO=%|_USNhSaKu Contact me for any inquiry, I will reach you as soon as possible.
-[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/H3QRapcC) +[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/QxwPGcXDp7) [![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) # 👑 Donations diff --git a/src/setup.py b/src/setup.py index a4504c8..3215723 100644 --- a/src/setup.py +++ b/src/setup.py @@ -7,7 +7,7 @@ with codecs.open(os.path.join(here, "README.md"), encoding="utf-8") as fh: long_description = "\n" + fh.read() -VERSION = '0.0.1.6' +VERSION = '0.0.1.7' DESCRIPTION = 'Jupiter Python SDK' LONG_DESCRIPTION = 'This package allows the use of Jupiter decentralized exchange features on Solana using Python.' From 707426720e232565081d184f75a7ef8817d2209f Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Wed, 24 Jan 2024 21:06:57 +0100 Subject: [PATCH 24/36] Delete src/jupiter_python_sdk.egg-info directory --- src/jupiter_python_sdk.egg-info/PKG-INFO | 154 ------------------ src/jupiter_python_sdk.egg-info/SOURCES.txt | 10 -- .../dependency_links.txt | 1 - src/jupiter_python_sdk.egg-info/requires.txt | 5 - src/jupiter_python_sdk.egg-info/top_level.txt | 1 - 5 files changed, 171 deletions(-) delete mode 100644 src/jupiter_python_sdk.egg-info/PKG-INFO delete mode 100644 src/jupiter_python_sdk.egg-info/SOURCES.txt delete mode 100644 src/jupiter_python_sdk.egg-info/dependency_links.txt delete mode 100644 src/jupiter_python_sdk.egg-info/requires.txt delete mode 100644 src/jupiter_python_sdk.egg-info/top_level.txt diff --git a/src/jupiter_python_sdk.egg-info/PKG-INFO b/src/jupiter_python_sdk.egg-info/PKG-INFO deleted file mode 100644 index 8b3d55d..0000000 --- a/src/jupiter_python_sdk.egg-info/PKG-INFO +++ /dev/null @@ -1,154 +0,0 @@ -Metadata-Version: 2.1 -Name: jupiter-python-sdk -Version: 0.0.1.6 -Summary: Jupiter Python SDK -Author: TaoDev -Author-email: taodev3@proton.me -License: LICENSE.txt -Keywords: python,solana,jupiter,dex,trading,sdk -Classifier: Development Status :: 3 - Alpha -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python :: 3 -Classifier: Operating System :: Unix -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows -Description-Content-Type: text/markdown -License-File: LICENSE.txt - - -
-

🐍 JUPITER PYTHON SDK 🪐

- -
- ---- - -

- - -
- - -
- - -
-

- -# 📖 Introduction -**Jupiter Python SDK** is a Python library that allows you to use most of **[Jupiter](https://jup.ag/) features**.
-It enables executing swaps, limit orders, DCA, swap pairs, tokens prices, fetching wallet infos, stats, data and more!
-This 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).
-There is documentation inside each function, however, you can access to the [official Jupiter API](https://docs.jup.ag/docs) for more information. - -# ⚠️ Disclaimer -**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.
-This 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.** - -# ✨ Quickstart - -### 🛠️ Installation - -```sh -pip install jupiter-python-sdk -``` - -### 📃 General Usage -**Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
-Otherwise, this is required, for instance, to open a DCA account or to close one.** - -If 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: -1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` -2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. - -```py -import base58 -from solders.pubkey import Pubkey -from solders.keypair import Keypair -from solana.rpc.async_api import AsyncClient -from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA - -async def main(): - private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE_KEY"))) # Private key as string - async_client = AsyncClient(os.getenv("RPC_API")) - jupiter = Jupiter(async_client, private_key) - - # EXECUTE A SWAP - swap = await jupiter.swap( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - amount=5_000_000, - slippage_bps=1, - ) - # Returns str: serialized transactions to execute the swap. - - # OPEN LIMIT ORDER - open_limit_order = await jupiter.open_order( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - in_amount=5_000_000, - out_amount=100_000, - ) - # Returns dict: {'transaction_data': serialized transactions to create the limit order, 'signature2': signature of the account that will be opened} - - # CREATE DCA ACCOUNT - create_dca_account = await jupiter.dca.create_dca( - input_mint=Pubkey.from_string("So11111111111111111111111111111111111111112"), - output_mint=Pubkey.from_string("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - total_in_amount=5_000_000, - in_amount_per_cycle=100_000, - cycle_frequency=60, - min_out_amount_per_cycle=0, - max_out_amount_per_cycle=0, - start=0 - ) - # Returns DCA Account Pubkey and transaction hash. - - # CLOSE DCA ACCOUNT - close_dca_account = await jupiter.dca.close_dca( - dca_pubkey=Pubkey.from_string("45iYdjmFUHSJCQHnNpWNFF9AjvzRcsQUP9FDBvJCiNS1") - ) - # Returns transaction hash. -``` -### 📜 All available features -```py -- quote -- swap -- open_order -- cancel_orders -- create_dca -- close_dca -- fetch_user_dca_accounts -- fetch_dca_account_fills_history -- get_available_dca_tokens -- fetch_dca_data -- query_open_orders -- query_orders_history -- query_trades_history -- get_jupiter_stats -- get_token_price -- get_indexed_route_map -- get_tokens_list -- get_all_tickers -- get_all_swap_pairs -- get_swap_pairs -- get_token_stats_by_date -- program_id_to_label -``` - -# 📝 TO-DO -- [ ] Bridge 🌉 -- [ ] Perpetual 💸 - -# 🤝 Contributions -If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
-Contact me for any inquiry, I will reach you as soon as possible.
-[![Discord](https://img.shields.io/badge/Discord-%237289DA.svg?logo=discord&logoColor=white)](https://discord.gg/H3QRapcC) -[![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/_TaoDev_) - -# 👑 Donations -This project doesn't include platform fees. If you find value in it and would like to support its development, your donations are greatly appreciated.
-**SOLANA ADDRESS** -```sh -AyWu89SjZBW1MzkxiREmgtyMKxSkS1zVy8Uo23RyLphX -``` diff --git a/src/jupiter_python_sdk.egg-info/SOURCES.txt b/src/jupiter_python_sdk.egg-info/SOURCES.txt deleted file mode 100644 index abe1590..0000000 --- a/src/jupiter_python_sdk.egg-info/SOURCES.txt +++ /dev/null @@ -1,10 +0,0 @@ -LICENSE.txt -README.md -setup.py -jupiter_python_sdk/__init__.py -jupiter_python_sdk/jupiter.py -jupiter_python_sdk.egg-info/PKG-INFO -jupiter_python_sdk.egg-info/SOURCES.txt -jupiter_python_sdk.egg-info/dependency_links.txt -jupiter_python_sdk.egg-info/requires.txt -jupiter_python_sdk.egg-info/top_level.txt \ No newline at end of file diff --git a/src/jupiter_python_sdk.egg-info/dependency_links.txt b/src/jupiter_python_sdk.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/src/jupiter_python_sdk.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/jupiter_python_sdk.egg-info/requires.txt b/src/jupiter_python_sdk.egg-info/requires.txt deleted file mode 100644 index a7b92e3..0000000 --- a/src/jupiter_python_sdk.egg-info/requires.txt +++ /dev/null @@ -1,5 +0,0 @@ -base58 -solders -solana -httpx -anchorpy diff --git a/src/jupiter_python_sdk.egg-info/top_level.txt b/src/jupiter_python_sdk.egg-info/top_level.txt deleted file mode 100644 index 6ec1073..0000000 --- a/src/jupiter_python_sdk.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -jupiter_python_sdk From eba7804abaa889523882730b2623eca48a5c593c Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Wed, 24 Jan 2024 21:07:04 +0100 Subject: [PATCH 25/36] Delete src/dist directory --- src/dist/jupiter-python-sdk-0.0.1.6.tar.gz | Bin 20961 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/dist/jupiter-python-sdk-0.0.1.6.tar.gz diff --git a/src/dist/jupiter-python-sdk-0.0.1.6.tar.gz b/src/dist/jupiter-python-sdk-0.0.1.6.tar.gz deleted file mode 100644 index 14c19fcb362237ae29d25ce7ed6bc16b6bfeaf9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20961 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 _w;$rxQY27kkip}<{v)iC-sNca-WT*hdXDb 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 Date: Sat, 10 Feb 2024 17:14:27 +0100 Subject: [PATCH 26/36] [+] Ability to change SWAP,QUOTE,... endpoints --- src/jupiter_python_sdk/jupiter.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/jupiter_python_sdk/jupiter.py b/src/jupiter_python_sdk/jupiter.py index 56e8600..ab1158b 100644 --- a/src/jupiter_python_sdk/jupiter.py +++ b/src/jupiter_python_sdk/jupiter.py @@ -540,11 +540,26 @@ class Jupiter(): def __init__( self, async_client: AsyncClient, - keypair: Keypair + keypair: Keypair, + quote_api_url: str="https://quote-api.jup.ag/v6/quote?", + swap_api_url: str="https://quote-api.jup.ag/v6/swap", + open_order_api_url: str="https://jup.ag/api/limit/v1/createOrder", + cancel_orders_api_url: str="https://jup.ag/api/limit/v1/cancelOrders", + query_open_orders_api_url: str="https://jup.ag/api/limit/v1/openOrders?wallet=", + query_order_history_api_url: str="https://jup.ag/api/limit/v1/orderHistory", + query_trade_history_api_url: str="https://jup.ag/api/limit/v1/tradeHistory", ): self.dca = Jupiter_DCA(async_client, keypair) self.rpc = async_client self.keypair = keypair + + self.ENDPOINT_APIS_URL["QUOTE"] = quote_api_url + self.ENDPOINT_APIS_URL["SWAP"] = swap_api_url + self.ENDPOINT_APIS_URL["OPEN_ORDER"] = open_order_api_url + self.ENDPOINT_APIS_URL["CANCEL_ORDERS"] = cancel_orders_api_url + self.ENDPOINT_APIS_URL["QUERY_OPEN_ORDERS"] = query_open_orders_api_url + self.ENDPOINT_APIS_URL["QUERY_ORDER_HISTORY"] = query_order_history_api_url + self.ENDPOINT_APIS_URL["QUERY_TRADE_HISTORY"] = query_trade_history_api_url async def quote( self, From 97f2699446d9b1b3e80e3a25090f34296de9264c Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Sat, 10 Feb 2024 18:14:14 +0100 Subject: [PATCH 27/36] [+] Display error when imposible to execute a swap --- src/jupiter_python_sdk/jupiter.py | 12 ++++++++---- src/setup.py | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/jupiter_python_sdk/jupiter.py b/src/jupiter_python_sdk/jupiter.py index ab1158b..3e61a07 100644 --- a/src/jupiter_python_sdk/jupiter.py +++ b/src/jupiter_python_sdk/jupiter.py @@ -623,9 +623,13 @@ async def quote( quote_url += "&excludeDexes=" + ','.join(exclude_dexes).lower() if max_accounts: quote_url += "&maxAccounts=" + str(max_accounts) - + quote_response = httpx.get(url=quote_url).json() - return quote_response + try: + quote_response['routePlan'] + return quote_response + except: + raise Exception(quote_response['error']) async def swap( self, @@ -688,8 +692,8 @@ async def swap( "userPublicKey": self.keypair.pubkey().__str__(), "wrapAndUnwrapSol": wrap_unwrap_sol } - transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['SWAP'], json=transaction_parameters).json()['swapTransaction'] - return transaction_data + transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['SWAP'], json=transaction_parameters).json() + return transaction_data['swapTransaction'] async def open_order( self, diff --git a/src/setup.py b/src/setup.py index 3215723..9f0540b 100644 --- a/src/setup.py +++ b/src/setup.py @@ -7,7 +7,7 @@ with codecs.open(os.path.join(here, "README.md"), encoding="utf-8") as fh: long_description = "\n" + fh.read() -VERSION = '0.0.1.7' +VERSION = '0.0.2.0' DESCRIPTION = 'Jupiter Python SDK' LONG_DESCRIPTION = 'This package allows the use of Jupiter decentralized exchange features on Solana using Python.' From 6a8a23586f64808ad12ebc8d16a9e6f93cf47dbe Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Wed, 14 Feb 2024 21:10:21 +0100 Subject: [PATCH 28/36] Update README.md --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 713c0e8..8164d06 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ pip install jupiter-python-sdk **Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
Otherwise, this is required, for instance, to open a DCA account or to close one.** +**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).** + If 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: 1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` 2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. @@ -63,7 +65,17 @@ from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # Private key as string async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") -jupiter = Jupiter(async_client, private_key) +jupiter = Jupiter( + async_client=async_client, + private_key=private_key, + quote_api_url="https://quote-api.jup.ag/v6/quote?", + swap_api_url="https://quote-api.jup.ag/v6/swap", + open_order_api_url="https://jup.ag/api/limit/v1/createOrder", + cancel_orders_api_url="https://jup.ag/api/limit/v1/cancelOrders", + query_open_orders_api_url="https://jup.ag/api/limit/v1/openOrders?wallet=", + query_order_history_api_url="https://jup.ag/api/limit/v1/orderHistory", + query_trade_history_api_url="https://jup.ag/api/limit/v1/tradeHistory" +) """ From e61764bff93a38468e239054ecb7cc7afe32753a Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Thu, 15 Feb 2024 11:12:30 +0100 Subject: [PATCH 29/36] test --- README.md | 14 +++++++++++++- src/README.md | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 713c0e8..8164d06 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ pip install jupiter-python-sdk **Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
Otherwise, this is required, for instance, to open a DCA account or to close one.** +**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).** + If 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: 1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` 2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. @@ -63,7 +65,17 @@ from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # Private key as string async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") -jupiter = Jupiter(async_client, private_key) +jupiter = Jupiter( + async_client=async_client, + private_key=private_key, + quote_api_url="https://quote-api.jup.ag/v6/quote?", + swap_api_url="https://quote-api.jup.ag/v6/swap", + open_order_api_url="https://jup.ag/api/limit/v1/createOrder", + cancel_orders_api_url="https://jup.ag/api/limit/v1/cancelOrders", + query_open_orders_api_url="https://jup.ag/api/limit/v1/openOrders?wallet=", + query_order_history_api_url="https://jup.ag/api/limit/v1/orderHistory", + query_trade_history_api_url="https://jup.ag/api/limit/v1/tradeHistory" +) """ diff --git a/src/README.md b/src/README.md index 713c0e8..8164d06 100644 --- a/src/README.md +++ b/src/README.md @@ -39,6 +39,8 @@ pip install jupiter-python-sdk **Providing the private key and RPC client is not mandatory if you only intend to execute functions for retrieving data.
Otherwise, this is required, for instance, to open a DCA account or to close one.** +**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).** + If 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: 1. Go to https://github.com/michaelhly/solana-py/tree/master/src/spl/token and download ```instructions.py``` 2. In your packages folder, replace ```spl/token/instructions.py``` with the one you just downloaded. @@ -63,7 +65,17 @@ from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # Private key as string async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") -jupiter = Jupiter(async_client, private_key) +jupiter = Jupiter( + async_client=async_client, + private_key=private_key, + quote_api_url="https://quote-api.jup.ag/v6/quote?", + swap_api_url="https://quote-api.jup.ag/v6/swap", + open_order_api_url="https://jup.ag/api/limit/v1/createOrder", + cancel_orders_api_url="https://jup.ag/api/limit/v1/cancelOrders", + query_open_orders_api_url="https://jup.ag/api/limit/v1/openOrders?wallet=", + query_order_history_api_url="https://jup.ag/api/limit/v1/orderHistory", + query_trade_history_api_url="https://jup.ag/api/limit/v1/tradeHistory" +) """ From efddb953ce12f45d3ae70666492a307351c9ed58 Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Fri, 16 Feb 2024 09:46:53 +0100 Subject: [PATCH 30/36] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8164d06..7184869 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,7 @@ close_dca_account = await jupiter.dca.close_dca( # 📝 TO-DO - [ ] Bridge 🌉 - [ ] Perpetual 💸 +- [ ] Price API # 🤝 Contributions If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
From b233ab38103beb05de8bf628c1f5c75bf41813c9 Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Sun, 18 Feb 2024 18:45:17 +0100 Subject: [PATCH 31/36] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7184869..94e2fe3 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,7 @@ close_dca_account = await jupiter.dca.close_dca( - [ ] Bridge 🌉 - [ ] Perpetual 💸 - [ ] Price API +- [ ] Wallet Transactions History # 🤝 Contributions If you are interesting in contributing, fork the repository and submit a pull request in order to merge your improvements into the main repository.
From 2eaba3f47d2c6d9a2d43c450e6b7b8d151f548e9 Mon Sep 17 00:00:00 2001 From: thoma Date: Sat, 9 Mar 2024 16:53:31 +0100 Subject: [PATCH 32/36] Update readme private_key to keypair --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 94e2fe3..df341a3 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # P async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") jupiter = Jupiter( async_client=async_client, - private_key=private_key, + keypair=private_key, quote_api_url="https://quote-api.jup.ag/v6/quote?", swap_api_url="https://quote-api.jup.ag/v6/swap", open_order_api_url="https://jup.ag/api/limit/v1/createOrder", From 6029df89dcbc618fe3e88e905d86adb3e91b2d7e Mon Sep 17 00:00:00 2001 From: TaoDev <152310566+0xTaoDev@users.noreply.github.com> Date: Sun, 10 Mar 2024 10:27:11 +0100 Subject: [PATCH 33/36] Update README.md --- src/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/README.md b/src/README.md index 8164d06..5601f73 100644 --- a/src/README.md +++ b/src/README.md @@ -67,7 +67,7 @@ private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # P async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") jupiter = Jupiter( async_client=async_client, - private_key=private_key, + keypair=private_key, quote_api_url="https://quote-api.jup.ag/v6/quote?", swap_api_url="https://quote-api.jup.ag/v6/swap", open_order_api_url="https://jup.ag/api/limit/v1/createOrder", From b3a4d113c15717c3a0409293e6159752531d796f Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Mon, 8 Apr 2024 17:21:09 +0200 Subject: [PATCH 34/36] [+] Priority fee --- src/jupiter_python_sdk/jupiter.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/jupiter_python_sdk/jupiter.py b/src/jupiter_python_sdk/jupiter.py index 3e61a07..ca3b466 100644 --- a/src/jupiter_python_sdk/jupiter.py +++ b/src/jupiter_python_sdk/jupiter.py @@ -639,6 +639,7 @@ async def swap( wrap_unwrap_sol: bool=True, slippage_bps: int=1, swap_mode: str="ExactIn", + prioritization_fee_lamports: int=None, only_direct_routes: bool=False, as_legacy_transaction: bool=False, exclude_dexes: list=None, @@ -652,6 +653,7 @@ async def swap( ``output_mint (str)``: Output token mint str\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 Optionals: + ``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 ``wrap_unwrap_sol (bool)``: Auto wrap and unwrap SOL. Default is True.\n ``slippage_bps (int)``: The slippage % in BPS. If the output token amount exceeds the slippage then the swap transaction will fail.\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 @@ -692,6 +694,8 @@ async def swap( "userPublicKey": self.keypair.pubkey().__str__(), "wrapAndUnwrapSol": wrap_unwrap_sol } + if prioritization_fee_lamports: + transaction_parameters['computeUnitPriceMicroLamports'] = prioritization_fee_lamports transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['SWAP'], json=transaction_parameters).json() return transaction_data['swapTransaction'] From 802ca4ee975a02b92cf356366c4315012c7d3a52 Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Mon, 8 Apr 2024 17:22:10 +0200 Subject: [PATCH 35/36] [+] Priority Fee --- src/jupiter_python_sdk/jupiter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jupiter_python_sdk/jupiter.py b/src/jupiter_python_sdk/jupiter.py index ca3b466..f58bdbe 100644 --- a/src/jupiter_python_sdk/jupiter.py +++ b/src/jupiter_python_sdk/jupiter.py @@ -695,7 +695,7 @@ async def swap( "wrapAndUnwrapSol": wrap_unwrap_sol } if prioritization_fee_lamports: - transaction_parameters['computeUnitPriceMicroLamports'] = prioritization_fee_lamports + transaction_parameters['prioritizationFeeLamports'] = prioritization_fee_lamports transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['SWAP'], json=transaction_parameters).json() return transaction_data['swapTransaction'] From 343f0037bc74fc3bd1a21c06bfb4c95eca0301cb Mon Sep 17 00:00:00 2001 From: _TaoDev_ Date: Mon, 8 Apr 2024 17:50:00 +0200 Subject: [PATCH 36/36] [+] Priority Fee, Platform Fee, Old Quote, Library Versions --- README.md | 4 +-- requirements.txt | 6 ++--- src/README.md | 4 +-- src/jupiter_python_sdk/jupiter.py | 43 +++++++++++++++++++------------ 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index df341a3..d2eaec0 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,8 @@ from solana.rpc.commitment import Processed from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA -private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # Private key as string -async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") +private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # Replace PRIVATE-KEY with your private key as string +async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") # Replace SOLANA-RPC-ENDPOINT-URL with your Solana RPC Endpoint URL jupiter = Jupiter( async_client=async_client, keypair=private_key, diff --git a/requirements.txt b/requirements.txt index af6f0bd..9c91e35 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ base58 -solders -solana +solders==0.18.1 +solana==0.30.2 httpx -anchorpy +anchorpy==0.18.0 jupiter-python-sdk diff --git a/src/README.md b/src/README.md index 5601f73..c29cce5 100644 --- a/src/README.md +++ b/src/README.md @@ -63,8 +63,8 @@ from solana.rpc.commitment import Processed from jupiter_python_sdk.jupiter import Jupiter, Jupiter_DCA -private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # Private key as string -async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") +private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PRIVATE-KEY"))) # Replace PRIVATE-KEY with your private key as string +async_client = AsyncClient("SOLANA-RPC-ENDPOINT-URL") # Replace SOLANA-RPC-ENDPOINT-URL with your Solana RPC Endpoint URL jupiter = Jupiter( async_client=async_client, keypair=private_key, diff --git a/src/jupiter_python_sdk/jupiter.py b/src/jupiter_python_sdk/jupiter.py index f58bdbe..918a686 100644 --- a/src/jupiter_python_sdk/jupiter.py +++ b/src/jupiter_python_sdk/jupiter.py @@ -571,7 +571,8 @@ async def quote( only_direct_routes: bool=False, as_legacy_transaction: bool=False, exclude_dexes: list=None, - max_accounts: int=None + max_accounts: int=None, + platform_fee_bps: int=None ) -> dict: """Get the best swap route for a token trade pair sorted by largest output token amount from https://quote-api.jup.ag/v6/quote @@ -586,7 +587,8 @@ async def quote( ``only_direct_routes (bool)``: Default is False. Direct Routes limits Jupiter routing to single hop routes only.\n ``as_legacy_transaction (bool)``: Default is False. Instead of using versioned transaction, this will use the legacy transaction.\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 - ``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. + ``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 + ``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. Returns: ``dict``: returns best swap route @@ -620,9 +622,11 @@ async def quote( if slippage_bps: quote_url += "&slippageBps=" + str(slippage_bps) if exclude_dexes: - quote_url += "&excludeDexes=" + ','.join(exclude_dexes).lower() + quote_url += "&excludeDexes=" + ','.join(exclude_dexes) if max_accounts: quote_url += "&maxAccounts=" + str(max_accounts) + if platform_fee_bps: + quote_url += "&plateformFeeBps=" + platform_fee_bps quote_response = httpx.get(url=quote_url).json() try: @@ -636,6 +640,7 @@ async def swap( input_mint: str, output_mint: str, amount: int=0, + quoteResponse: str=None, wrap_unwrap_sol: bool=True, slippage_bps: int=1, swap_mode: str="ExactIn", @@ -643,7 +648,8 @@ async def swap( only_direct_routes: bool=False, as_legacy_transaction: bool=False, exclude_dexes: list=None, - max_accounts: int=None + max_accounts: int=None, + platform_fee_bps: int=None ) -> str: """Perform a swap. @@ -660,7 +666,8 @@ async def swap( ``only_direct_routes (bool)``: Default is False. Direct Routes limits Jupiter routing to single hop routes only.\n ``as_legacy_transaction (bool)``: Default is False. Instead of using versioned transaction, this will use the legacy transaction.\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 - ``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. + ``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 + ``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. Returns: ``str``: returns serialized transactions to perform the swap from https://quote-api.jup.ag/v6/swap @@ -678,24 +685,26 @@ async def swap( AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAJDpQzg6Gwmq0Gtgp4+LWUVz0yQOAuHGNJAGTs0dcqEMVCoh2aSWdVMvcatcojrWtwXATiOw7/o5hE7NFuy3p8vgLfsLhf7Ff9NofcPgIyAbMytm5ggTyKwmR+JqgXUXARVfefILshj4ZhFSjUfRpiSI47mVNFUq9v5NOOCWSEZJZM/GHGfBesEb9blQsf7DnKodziY279S/OPkZf0/OalnPEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABHnVW/IxwG7udMVuzmgVB/2xst6j9I5RArHNola8E48Gm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpT0tsDkEI/SpqJHjq4KzFnbIbtO31EcFiz2AtHgwJAfuMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WbQ/+if11/ZKdMCbHylYed5LCas238ndUUsyGqezjOXoxvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWHmraeknnR8/memFAZWZHeDMQG7C5ZFLxolWUniPl6SYgcGAAUCwFwVAAYACQNIDQAAAAAAAAsGAAMACAUJAQEFAgADDAIAAAAgTgAAAAAAAAkBAwERBx8JCgADAQIECA0HBwwHGREBAhUOFxMWDxIQFAoYCQcHJMEgmzNB1pyBBwEAAAATZAABIE4AAAAAAACHBQAAAAAAADIAAAkDAwAAAQkB1rO1s+JVEuIRoGsE8f2MlAkFWssCkimIonlHpLV2w4gKBwKRTE0SjIeLSwIICg== """ - quoteResponse = await self.quote( - input_mint=input_mint, - output_mint=output_mint, - amount=amount, - slippage_bps=slippage_bps, - swap_mode=swap_mode, - only_direct_routes=only_direct_routes, - as_legacy_transaction=as_legacy_transaction, - exclude_dexes=exclude_dexes, - max_accounts=max_accounts - ) + if quoteResponse is None: + quoteResponse = await self.quote( + input_mint=input_mint, + output_mint=output_mint, + amount=amount, + slippage_bps=slippage_bps, + swap_mode=swap_mode, + only_direct_routes=only_direct_routes, + as_legacy_transaction=as_legacy_transaction, + exclude_dexes=exclude_dexes, + max_accounts=max_accounts, + platform_fee_bps=platform_fee_bps + ) transaction_parameters = { "quoteResponse": quoteResponse, "userPublicKey": self.keypair.pubkey().__str__(), "wrapAndUnwrapSol": wrap_unwrap_sol } if prioritization_fee_lamports: - transaction_parameters['prioritizationFeeLamports'] = prioritization_fee_lamports + transaction_parameters.update({"prioritizationFeeLamports": prioritization_fee_lamports}) transaction_data = httpx.post(url=self.ENDPOINT_APIS_URL['SWAP'], json=transaction_parameters).json() return transaction_data['swapTransaction']