Skip to content

Commit

Permalink
Add wallet api (#10)
Browse files Browse the repository at this point in the history
* feat: add new wallet api [#2]

* test: add wallet api tests [#2]

* chore: clean up [#2]
  • Loading branch information
nickatnight authored Nov 25, 2024
1 parent 44bb4ce commit 93f8aa8
Show file tree
Hide file tree
Showing 6 changed files with 289 additions and 59 deletions.
109 changes: 109 additions & 0 deletions birdeyepy/resources/wallet.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
from typing import Optional, cast

from birdeyepy.utils import BirdEyeApiUrls, BirdEyeRequestParams, IHttp


class Wallet:
"""The api is still in beta and may change in the future."""

def __init__(self, http: IHttp) -> None:
self.http = http

def supported_networks(self) -> dict:
"""Get supported networks."""
response = self.http.send(path=BirdEyeApiUrls.WALLET_SUPPORTED_NETWORKS)

return cast(dict, response)

def portfolio(self, wallet: str) -> dict:
"""Get portfolio of a wallet.
:param address: The address of the wallet.
"""
params = {"wallet": wallet}

request: BirdEyeRequestParams = {"params": params}
response = self.http.send(path=BirdEyeApiUrls.WALLET_PORTFOLIO, **request)

return cast(dict, response)

def portfolio_multichain(self, wallet: str) -> dict:
"""Get portfolio of a wallet across multiple chains.
:param address: The address of the wallet.
"""
params = {"wallet": wallet}

request: BirdEyeRequestParams = {"params": params}
response = self.http.send(
path=BirdEyeApiUrls.WALLET_PORTFOLIO_MULTICHAIN, **request
)

return cast(dict, response)

def token_balance(self, wallet: str, token_address: str) -> dict:
"""Get token balance of a wallet.
:param wallet: The address of the wallet.
:param token_address: The address of the token.
"""
params = {"wallet": wallet, "address": token_address}

request: BirdEyeRequestParams = {"params": params}
response = self.http.send(path=BirdEyeApiUrls.WALLET_TOKEN_BALANCE, **request)

return cast(dict, response)

def transaction_history(
self, wallet: str, limit: Optional[int] = 100, before: Optional[str] = None
) -> dict:
"""Get transaction history of a wallet.
:param wallet: The address of the wallet.
:param limit: The number of results to return.
:param before: A transaction hash to traverse starting from. Only works with Solana
"""
params = {"wallet": wallet, "limit": limit}

if before is not None:
params["before"] = before

request: BirdEyeRequestParams = {"params": params}
response = self.http.send(
path=BirdEyeApiUrls.WALLET_TRANSACTION_HISTORY, **request
)

return cast(dict, response)

def transaction_history_multichain(self, wallet: str) -> dict:
"""Get transaction history of a wallet across multiple chains.
:param wallet: The address of the wallet.
"""
params = {"wallet": wallet}

request: BirdEyeRequestParams = {"params": params}
response = self.http.send(
path=BirdEyeApiUrls.WALLET_TRANSACTION_HISTORY_MULTICHAIN, **request
)

return cast(dict, response)

def transaction_simulation(
self, from_address: str, to_address: str, value: str, data: str
) -> dict:
"""Simulate a transaction.
:param from_address: The address of the sender.
:param to_address: The address of the receiver.
:param value: The value to send.
:param data: The data to send.
"""
params = {"from": from_address, "to": to_address, "value": value, "data": data}

request: BirdEyeRequestParams = {"params": params}
response = self.http.send(
method="POST", path=BirdEyeApiUrls.WALLET_TRANSACTION_SIMULATION, **request
)

return cast(dict, response)
9 changes: 9 additions & 0 deletions birdeyepy/utils/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,15 @@ class BirdEyeApiUrls:
TOKEN_TRADE_DATA_SINGLE = "defi/v3/token/trade-data/single"
TOKEN_TRADE_DATA_MULTIPLE = "defi/v3/token/trade-data/multiple"

# WALLET (Beta)
WALLET_SUPPORTED_NETWORKS = "v1/wallet/list_supported_chain"
WALLET_PORTFOLIO = "v1/wallet/token_list"
WALLET_PORTFOLIO_MULTICHAIN = "v1/wallet/multichain_token_list"
WALLET_TOKEN_BALANCE = "v1/wallet/token_balance"
WALLET_TRANSACTION_HISTORY = "v1/wallet/tx_list"
WALLET_TRANSACTION_HISTORY_MULTICHAIN = "v1/wallet/multichain_tx_list"
WALLET_TRANSACTION_SIMULATION = "v1/wallet/simulate"


class BirdEyeChainEnum(SimpleEnum):
# Solana
Expand Down
60 changes: 51 additions & 9 deletions docs/source/code_overview/client.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ BirdEye Client
resources/defi
resources/token
resources/trader
resources/wallet


.. note::
Expand All @@ -25,19 +26,19 @@ APIs
from birdeyepy import BirdEye
client = BirdEye(api_key="your-api-key")
client = BirdEye(api_key="your-api-key") # 'x-chain' header defaults to solana
# DEFI
# https://public-api.birdeye.so/defi/price
# https://docs.birdeye.so/reference/get_defi-price
client.defi.price() # defaults to So11111111111111111111111111111111111111112
client.defi.price(
address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ",
include_liquidity=True, # can also use strings 'true' or 'false'
)
# https://public-api.birdeye.so/defi/history_price
# https://docs.birdeye.so/reference/get_defi-history-price
client.defi.history(time_from=1732398942, time_to=1732398961) # defaults to So11111111111111111111111111111111111111112
client.defi.history(
Expand All @@ -50,13 +51,54 @@ APIs
# TOKEN
# https://public-api.birdeye.so/defi/tokenlist
# https://docs.birdeye.so/reference/get_defi-tokenlist
client.token.list_all()
# TRADER
# https://docs.birdeye.so/reference/get_defi-token-security
client.token.security(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_trader-gainers-losers
client.trader.gainers_losers()
# https://docs.birdeye.so/reference/get_defi-token-overview
client.token.overview(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://public-api.birdeye.so/trader/txs/seek_by_time
client.trader.seek_by_time(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-token-creation-info
client.token.creation_info(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-token-trending
client.token.trending()
# https://docs.birdeye.so/reference/post_defi-v2-tokens-all
client.token.list_all_v2()
# https://docs.birdeye.so/reference/get_defi-v2-tokens-new-listing
client.token.new_listing(
time_to=1732398961,
meme_platform_enabled=True, # can also use strings 'true' or 'false'
)
# https://docs.birdeye.so/reference/get_defi-v2-tokens-top-traders
client.token.top_traders(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-v2-markets
client.token.all_markets(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-v3-token-meta-data-single
client.token.market_metadata_single(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-v3-token-meta-data-multiple
client.token.market_metadata_multiple(
addresses=["Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ", "AGQZRtz7hZtz3VJ1CoXRMNMyh2ZMZ1g6pv4aGMUSpump"],
) # can also use comma separated strings 'Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ,AGQZRtz7hZtz3VJ1CoXRMNMyh2ZMZ1g6pv4aGMUSpump'
# https://docs.birdeye.so/reference/get_defi-v3-token-market-data
client.token.market_data(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-v3-token-trade-data-single
client.token.trade_data_single(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-v3-token-trade-data-multiple
client.token.trade_data_multiple(
addresses=["Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ", "AGQZRtz7hZtz3VJ1CoXRMNMyh2ZMZ1g6pv4aGMUSpump"],
) # can also use comma separated strings 'Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ,AGQZRtz7hZtz3VJ1CoXRMNMyh2ZMZ1g6pv4aGMUSpump'
# https://docs.birdeye.so/reference/get_defi-v3-token-holder
client.token.holder(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
8 changes: 8 additions & 0 deletions docs/source/code_overview/resources/wallet.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Wallet (Beta)
=============

.. note::
This API is still in beta according to the BirdEye API documentation. It is not available on the BirdEye client, so you will have to import it manually.

.. autoclass:: birdeyepy.resources.wallet.Wallet
:members:
51 changes: 1 addition & 50 deletions docs/source/getting_started/quick_start.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Get the price of a token on the Solana blockchain
from birdeyepy import BirdEye
client = BirdEye(api_key="your-api-key") # 'x-chain' header defaults to solana
client = BirdEye(api_key="your-api-key") # 'x-chain' header defaults to solana
# DEFI
Expand Down Expand Up @@ -35,55 +35,6 @@ Get the price of a token on the Solana blockchain
# https://docs.birdeye.so/reference/get_defi-tokenlist
client.token.list_all()
# https://docs.birdeye.so/reference/get_defi-token-security
client.token.security(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-token-overview
client.token.overview(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-token-creation-info
client.token.creation_info(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-token-trending
client.token.trending()
# https://docs.birdeye.so/reference/post_defi-v2-tokens-all
client.token.list_all_v2()
# https://docs.birdeye.so/reference/get_defi-v2-tokens-new-listing
client.token.new_listing(
time_to=1732398961,
meme_platform_enabled=True, # can also use strings 'true' or 'false'
)
# https://docs.birdeye.so/reference/get_defi-v2-tokens-top-traders
client.token.top_traders(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-v2-markets
client.token.all_markets(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-v3-token-meta-data-single
client.token.market_metadata_single(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-v3-token-meta-data-multiple
client.token.market_metadata_multiple(
addresses=["Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ", "AGQZRtz7hZtz3VJ1CoXRMNMyh2ZMZ1g6pv4aGMUSpump"],
) # can also use comma separated strings 'Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ,AGQZRtz7hZtz3VJ1CoXRMNMyh2ZMZ1g6pv4aGMUSpump'
# https://docs.birdeye.so/reference/get_defi-v3-token-market-data
client.token.market_data(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-v3-token-trade-data-single
client.token.trade_data_single(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
# https://docs.birdeye.so/reference/get_defi-v3-token-trade-data-multiple
client.token.trade_data_multiple(
addresses=["Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ", "AGQZRtz7hZtz3VJ1CoXRMNMyh2ZMZ1g6pv4aGMUSpump"],
) # can also use comma separated strings 'Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ,AGQZRtz7hZtz3VJ1CoXRMNMyh2ZMZ1g6pv4aGMUSpump'
# https://docs.birdeye.so/reference/get_defi-v3-token-holder
client.token.holder(address="Gr11mosZNZjwpqnemXNnWs9E2Bnv7R6vzaKwJTdjo8zQ")
Get the price of a token on the Ethereum blockchain

.. code-block:: python
Expand Down
Loading

0 comments on commit 93f8aa8

Please sign in to comment.