Skip to main content

A core library to interact with Orca Whirlpool

Project description

DALL·E 2023-12-31 02 44 53 - A cute manga-style illustration in a 16_9 aspect ratio, featuring a whirlpool and an orca, representing the Python programming language  The whirlpool

Whirlpool Essentials

Whirlpool Essentials is a core library to interacting with Orca Whirlpool Program in Python.

Documentation

Dependencies

This library have been tested in the following environment.

  • Python: 3.10.6
  • solders: 0.21.0
  • solana: 0.35.1
  • anchorpy: 0.20.1

Installation

pip install solana solders anchorpy
pip install whirlpool-essentials

Important Notes

V2 instructions and TokenExtensions

Whirlpool Essentials can handle v2 instructions with WhirlpoolIx. HOWEVER the quote functions cannot handle TransferFee extension yet. So please ensure that input and output token don't use TransferFee extension. If its fee rate is zero, it can be ignored. (e.g. PYUSD)

General topics

  • Whirlpool Essentials is NOT included in Orca's official SDK list, so the update may be delayed.
  • Please use this package at your own risk.

Sample

Get SOL/USDC Whirlpool Price

import asyncio

from solana.rpc.async_api import AsyncClient
from solders.pubkey import Pubkey
from solders.keypair import Keypair

from orca_whirlpool.constants import ORCA_WHIRLPOOL_PROGRAM_ID
from orca_whirlpool.context import WhirlpoolContext
from orca_whirlpool.utils import PriceMath, DecimalUtil

SOL_USDC_8_WHIRLPOOL_PUBKEY = Pubkey.from_string("7qbRF6YsyGuLUVs6Y1q64bdVrfe4ZcUUz1JRdoVNUJnm")

async def main():
    connection = AsyncClient(RPC_ENDPOINT_URL)
    ctx = WhirlpoolContext(ORCA_WHIRLPOOL_PROGRAM_ID, connection, Keypair())

    # get SOL/USDC(ts=8) whirlpool
    whirlpool_pubkey = SOL_USDC_8_WHIRLPOOL_PUBKEY
    whirlpool = await ctx.fetcher.get_whirlpool(whirlpool_pubkey)
    decimals_a = (await ctx.fetcher.get_token_mint(whirlpool.token_mint_a)).decimals  # SOL_DECIMAL
    decimals_b = (await ctx.fetcher.get_token_mint(whirlpool.token_mint_b)).decimals  # USDC_DECIMAL

    print("whirlpool token_mint_a", whirlpool.token_mint_a)
    print("whirlpool token_mint_b", whirlpool.token_mint_b)
    print("whirlpool tick_spacing", whirlpool.tick_spacing)
    print("whirlpool tick_current_index", whirlpool.tick_current_index)
    print("whirlpool sqrt_price", whirlpool.sqrt_price)
    price = PriceMath.sqrt_price_x64_to_price(whirlpool.sqrt_price, decimals_a, decimals_b)
    print("whirlpool price", DecimalUtil.to_fixed(price, decimals_b))

asyncio.run(main())

Get Liquidity Distribution of SOL/USDC Whirlpool

import asyncio
import os

from dotenv import load_dotenv
from solders.pubkey import Pubkey
from solana.rpc.async_api import AsyncClient

from orca_whirlpool.accounts import AccountFinder, AccountFetcher
from orca_whirlpool.constants import ORCA_WHIRLPOOL_PROGRAM_ID
from orca_whirlpool.utils import PoolUtil

async def main():
    connection = AsyncClient(RPC_ENDPOINT_URL)
    whirlpool_pubkey = Pubkey.from_string("HJPjoWUrhoZzkNfRpHuieeFk9WcZWjwy6PBjZ81ngndJ")

    # get liquidity distribution
    fetcher = AccountFetcher(connection)
    whirlpool = await fetcher.get_whirlpool(whirlpool_pubkey)
    finder = AccountFinder(connection)
    tick_arrays = await finder.find_tick_arrays_by_whirlpool(
        ORCA_WHIRLPOOL_PROGRAM_ID,
        whirlpool_pubkey,
    )

    liquidity_distribution = PoolUtil.get_liquidity_distribution(whirlpool, tick_arrays)

    for ld in liquidity_distribution:
        print(ld.tick_lower_index, ld.tick_upper_index, ld.liquidity)

asyncio.run(main())

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

whirlpool_essentials-0.1.0.tar.gz (61.4 kB view details)

Uploaded Source

Built Distribution

whirlpool_essentials-0.1.0-py3-none-any.whl (128.6 kB view details)

Uploaded Python 3

File details

Details for the file whirlpool_essentials-0.1.0.tar.gz.

File metadata

  • Download URL: whirlpool_essentials-0.1.0.tar.gz
  • Upload date:
  • Size: 61.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.10.6

File hashes

Hashes for whirlpool_essentials-0.1.0.tar.gz
Algorithm Hash digest
SHA256 c197e195b4a32daa9c985ce08ac56a03c0215a8b8248975742b6d294a6a5533b
MD5 25bb2960f21fca6aa30f9e5741363fc7
BLAKE2b-256 fa98907d55f322017f79f0caf5b8bce3b9f34aa69e24496641f21336af61dfdb

See more details on using hashes here.

File details

Details for the file whirlpool_essentials-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for whirlpool_essentials-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2c62962098dc3424f27a9fbccf69b63b3e0dd04d17931e1141a434149f5eae12
MD5 aba9171d98b12d7039be06a6ef23e56a
BLAKE2b-256 9c6de2fe476523ae6226055d072871b72ca90007fb649f65a6562b51149dfa48

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page