Skip to main content

The TFM SDK package allows easy access to the TFM API, providing functionality for interacting with pricing, dex aggregator and ibc transfer and swap.

Project description

TFM SDK

Asynchronous usage

Preferred way to use the SDK is to use it as an asynchronous context manager. This way the SDK will be closed properly and all resources will be released.

SDK usage examples

See also examples folder for more.

Get chain(s)

from tfm_sdk import TfmSdk
from tfm_sdk.types import Chain, Token, NetworkType, RouteOperationSwap, SwapPair

async with TfmSdk() as sdk:  # chains loads automatically
    # list of chains
    chains: list[Chain] = sdk.chains.get_list()

    # get chain by name or id
    terra: Chain = sdk.chains.find("phoenix-1")

    # mainnet chains
    mainnet_chains: list[Chain] = sdk.chains.mainnet_only()

    # reachable chains for swap from terra
    terra_swap_chains: list[Chain] = await sdk.chains.get_reachable(terra)

Get tokens

async with TfmSdk() as sdk:  # chains loads automatically
    # get chain by name or id
    terra: Chain = sdk.chains.find("phoenix-1")
    assert terra.network_type == NetworkType.MAINNET

    # get all chain tokens
    tokens: list[Token] = await terra.get_tokens()

    # get token price
    uluna: Token = await terra.get_token_by_denom("uluna")
    price: float = await uluna.get_price()

Transfer token from one chain to another

async with TfmSdk() as sdk:
    from_chain = sdk.chains.find("phoenix-1")
    to_chain = sdk.chains.find("osmosis-1")
    sdk.set_source_chain(from_chain)
    sdk.set_destination_chain(to_chain)
    # call sdk.reverse() to swap chains

    # tokens transferable from terra to osmo
    transferable_tokens: list[SwapPair] = await sdk.transfer.get_transferable_tokens()

    # route and msg to transfer token from phoenix-1 to osmosis-1
    route = await sdk.transfer.get_route(transferable_tokens[0], 1000)
    msg = await sdk.transfer.get_msg(transferable_tokens[0], 1000)
    combined_msg = await sdk.transfer.get_route_swap(transferable_tokens[0], 1000)

Dex operations

async with TfmSdk() as sdk:
    chain = sdk.chains.find("phoenix-1")
    token0 = await chain.get_token_by_denom("uluna")
    token1 = await chain.get_token_by_denom("terra1vzd98s9kqdkatahxs7rsd8m474lf2f8ct39zdgd6shj4nh5e6kuskaz2gy")

    route = await sdk.dex.get_route(chain, token0, token1, amount=10000)
    msg = await sdk.dex.get_msg(chain, token0, token1, amount=10000, slippage=0.01)

Swap operations

async with TfmSdk() as sdk:
    chain_from = sdk.chains.find("Terra")
    chain_to = sdk.chains.find("juno-1")

    sdk.set_source_chain(chain_from)
    sdk.set_destination_chain(chain_to)

    token0 = await chain_from.get_token_by_denom("uluna")
    token1 = await chain_to.get_token_by_denom("ujuno")

    pair = SwapPair(
        source_token=token0,
        destination_token=token1,
    )

    route = await sdk.swap.get_route(pair, 1000000)

    msgs = await sdk.swap.get_msg(pair, 1000000, slippage=0.01)

    route_and_msgs = await sdk.swap.get_route_swap(pair, 1000000, slippage=0.01)

Check API health

async with TfmSdk() as sdk:
    is_online: bool = await sdk.is_api_online()

Low level api

from tfm_sdk.api import TfmApi

async with TfmApi() as api:
    chain = api.chains.get_chains()
    ...

# or

api = TfmApi()
...
await api.close()

Low level api usage examples

Get chain(s)

all_chains = await api.chains.get_chains()
mainnet_chains = await api.chains.get_chains(network_type='mainnet', is_trading=True)

Get chain tokens

tokens = await api.chains.get_tokens(chain_id='phoenix-1')
native_tokens = await api.chains.get_tokens(chain_id='phoenix-1', token_type='native')

Dex methods

route = await api.dex.get_route(chain_id='phoenix-1', token0='uluna', token1='uusd', amount=1000000)

msg = await api.dex.get_msg(chain_id='phoenix-1', token0='uluna', token1='uusd', amount=1000000, slippage=0.01)

Get price

price = await api.price.get_price('phoenix-1', 'uluna')
price_at_timestamp = await api.price.get_price('phoenix-1', 'uluna', timestamp=1620000000)

IBC methods to transfer tokens

# where we can send tokens from phoenix-1
reachable_chains = await api.ibc.chain.get_reachable('phoenix-1')

# can we send uluna from phoenix-1 to osmosis-1
is_reachable = await api.ibc.chain.is_reachable('phoenix-1', 'osmosis-1', 'uluna')

# get list of tokens we can transfer from phoenix-1 to osmosis-1
transferable_tokens = await api.ibc.chain.get_transferable_tokens('phoenix-1', 'osmosis-1')

# can we transfer uluna from phoenix-1 to osmosis-1
is_token_transferable = await api.ibc.chain.is_token_transferable('phoenix-1', 'osmosis-1', 'uluna')

# get route to transfer uluna from phoenix-1 to osmosis-1
route = await api.ibc.transfer.get_route(
    'uluna',
    'phoenix-1',
    'ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9',  # uluna ibc address in osmosis-1
    'osmosis-1',
    amount=1000000
)

# msg to send to blockchain
msg = await api.ibc.transfer.get_msg(
    'uluna',
    'phoenix-1',
    'ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9',  # uluna ibc address in osmosis-1
    'osmosis-1',
    amount=1000000,
    slippage=0.01
)

# combined method returns both route and msg
msg_and_route = await api.ibc.transfer.get_route_msg_combined(
    'uluna',
    'phoenix-1',
    'ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9',  # uluna ibc address in osmosis-1
    'osmosis-1',
    amount=1000000,
    slippage=0.01
)

IBC methods to swap token for token cross chain

# get route to transfer uluna from phoenix-1 to osmosis-1
route = await api.ibc.swap.get_route(
    'uluna',
    'phoenix-1',
    'ibc/9F9B07EF9AD291167CF5700628145DE1DEB777C2CFC7907553B24446515F6D0E',  # USDC
    'osmosis-1',
    amount=1000000,
    swap_mode="Turbo", # or Savings
)

# msg to send to blockchain
msg = await api.ibc.swap.get_msg(
    'uluna',
    'phoenix-1',
    'ibc/9F9B07EF9AD291167CF5700628145DE1DEB777C2CFC7907553B24446515F6D0E',  # USDC
    'osmosis-1',
    amount=1000000,
    slippage=0.01,
    swap_mode="Turbo", # or Savings
)

# combined method returns both route and msg
msg_and_route = await api.ibc.swap.get_route_msg_combined(
    'uluna',
    'phoenix-1',
    'ibc/9F9B07EF9AD291167CF5700628145DE1DEB777C2CFC7907553B24446515F6D0E', # USDC
    'osmosis-1',
    amount=1000000,
    slippage=0.01,
    swap_mode="Turbo", # or Savings
)

Sync version of api client

See examples folder for more.

from tfm_sdk.api import TfmApiSync

api = TfmApiSync()

is_api_healthty = api.health()

# get list of chains
chains = api.chain.get_chains(network_type="mainnet")

Run tests

poetry install
poe test_unit

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

tfm_sdk-0.2.1.tar.gz (13.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tfm_sdk-0.2.1-py3-none-any.whl (19.4 kB view details)

Uploaded Python 3

File details

Details for the file tfm_sdk-0.2.1.tar.gz.

File metadata

  • Download URL: tfm_sdk-0.2.1.tar.gz
  • Upload date:
  • Size: 13.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.7.6 Darwin/22.6.0

File hashes

Hashes for tfm_sdk-0.2.1.tar.gz
Algorithm Hash digest
SHA256 4cc0f1f0f1f35266ac57f3c203afc958724cba1e177ad845ae3203b1298d399a
MD5 b086b684d0a5c2e0e30642d8c417844b
BLAKE2b-256 aea0d0f4133c77776096534cb4ce2f15c690269db3c8ba5c3fcfdf33c7f8eaa0

See more details on using hashes here.

File details

Details for the file tfm_sdk-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: tfm_sdk-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 19.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.7.6 Darwin/22.6.0

File hashes

Hashes for tfm_sdk-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 772d3eb379ae4630fa851b2fca277a6030e97faccc3c671ec7e49f42aae483e0
MD5 fcc44d16d3ac3fbfbac7c9c891d7b38e
BLAKE2b-256 42c1b7a7f383af6621b586378c3d490bbd08a08eae04a88ebe6f804ce7ce67d2

See more details on using hashes here.

Supported by

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