tfm-sdk


Nametfm-sdk JSON
Version 0.2.1 PyPI version JSON
download
home_pagehttps://tfm.com
SummaryThe TFM SDK package allows easy access to the TFM API, providing functionality for interacting with pricing, dex aggregator and ibc transfer and swap.
upload_time2023-08-08 09:17:51
maintainer
docs_urlNone
authorTFM
requires_python>=3.10,<4.0
licenseMIT
keywords tfm sdk bridge swap route ibc
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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](examples) folder for more.

### Get chain(s)

```python
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

```python
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

```python

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

```python
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

```python
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

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

## Low level api

```python
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)

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

### Get chain tokens

```python
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
```python
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

```python
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
```python
# 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
```python
# 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](examples/sync_api.py) folder for more.

```python
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
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://tfm.com",
    "name": "tfm-sdk",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.10,<4.0",
    "maintainer_email": "",
    "keywords": "tfm,sdk,bridge,swap,route,ibc",
    "author": "TFM",
    "author_email": "info@tfm.com",
    "download_url": "https://files.pythonhosted.org/packages/ae/a0/d0f4133c77776096534cb4ce2f15c690269db3c8ba5c3fcfdf33c7f8eaa0/tfm_sdk-0.2.1.tar.gz",
    "platform": null,
    "description": "# TFM SDK\n\n\n## Asynchronous usage\n\nPreferred 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.\n\n## SDK usage examples\n\nSee also [examples](examples) folder for more.\n\n### Get chain(s)\n\n```python\nfrom tfm_sdk import TfmSdk\nfrom tfm_sdk.types import Chain, Token, NetworkType, RouteOperationSwap, SwapPair\n\nasync with TfmSdk() as sdk:  # chains loads automatically\n    # list of chains\n    chains: list[Chain] = sdk.chains.get_list()\n\n    # get chain by name or id\n    terra: Chain = sdk.chains.find(\"phoenix-1\")\n\n    # mainnet chains\n    mainnet_chains: list[Chain] = sdk.chains.mainnet_only()\n\n    # reachable chains for swap from terra\n    terra_swap_chains: list[Chain] = await sdk.chains.get_reachable(terra)\n```\n\n### Get tokens\n\n```python\nasync with TfmSdk() as sdk:  # chains loads automatically\n    # get chain by name or id\n    terra: Chain = sdk.chains.find(\"phoenix-1\")\n    assert terra.network_type == NetworkType.MAINNET\n\n    # get all chain tokens\n    tokens: list[Token] = await terra.get_tokens()\n\n    # get token price\n    uluna: Token = await terra.get_token_by_denom(\"uluna\")\n    price: float = await uluna.get_price()\n```\n\n### Transfer token from one chain to another\n\n```python\n\nasync with TfmSdk() as sdk:\n    from_chain = sdk.chains.find(\"phoenix-1\")\n    to_chain = sdk.chains.find(\"osmosis-1\")\n    sdk.set_source_chain(from_chain)\n    sdk.set_destination_chain(to_chain)\n    # call sdk.reverse() to swap chains\n\n    # tokens transferable from terra to osmo\n    transferable_tokens: list[SwapPair] = await sdk.transfer.get_transferable_tokens()\n\n    # route and msg to transfer token from phoenix-1 to osmosis-1\n    route = await sdk.transfer.get_route(transferable_tokens[0], 1000)\n    msg = await sdk.transfer.get_msg(transferable_tokens[0], 1000)\n    combined_msg = await sdk.transfer.get_route_swap(transferable_tokens[0], 1000)\n```\n\n### Dex operations\n\n```python\nasync with TfmSdk() as sdk:\n    chain = sdk.chains.find(\"phoenix-1\")\n    token0 = await chain.get_token_by_denom(\"uluna\")\n    token1 = await chain.get_token_by_denom(\"terra1vzd98s9kqdkatahxs7rsd8m474lf2f8ct39zdgd6shj4nh5e6kuskaz2gy\")\n\n    route = await sdk.dex.get_route(chain, token0, token1, amount=10000)\n    msg = await sdk.dex.get_msg(chain, token0, token1, amount=10000, slippage=0.01)\n```\n\n### Swap operations\n\n```python\nasync with TfmSdk() as sdk:\n    chain_from = sdk.chains.find(\"Terra\")\n    chain_to = sdk.chains.find(\"juno-1\")\n\n    sdk.set_source_chain(chain_from)\n    sdk.set_destination_chain(chain_to)\n\n    token0 = await chain_from.get_token_by_denom(\"uluna\")\n    token1 = await chain_to.get_token_by_denom(\"ujuno\")\n\n    pair = SwapPair(\n        source_token=token0,\n        destination_token=token1,\n    )\n\n    route = await sdk.swap.get_route(pair, 1000000)\n\n    msgs = await sdk.swap.get_msg(pair, 1000000, slippage=0.01)\n\n    route_and_msgs = await sdk.swap.get_route_swap(pair, 1000000, slippage=0.01)\n```\n\n### Check API health\n\n```python\nasync with TfmSdk() as sdk:\n    is_online: bool = await sdk.is_api_online()\n```\n\n## Low level api\n\n```python\nfrom tfm_sdk.api import TfmApi\n\nasync with TfmApi() as api:\n    chain = api.chains.get_chains()\n    ...\n\n# or\n\napi = TfmApi()\n...\nawait api.close()\n```\n\n## Low level api usage examples\n### Get chain(s)\n\n```python\nall_chains = await api.chains.get_chains()\nmainnet_chains = await api.chains.get_chains(network_type='mainnet', is_trading=True)\n```\n\n### Get chain tokens\n\n```python\ntokens = await api.chains.get_tokens(chain_id='phoenix-1')\nnative_tokens = await api.chains.get_tokens(chain_id='phoenix-1', token_type='native')\n```\n\n### Dex methods\n```python\nroute = await api.dex.get_route(chain_id='phoenix-1', token0='uluna', token1='uusd', amount=1000000)\n\nmsg = await api.dex.get_msg(chain_id='phoenix-1', token0='uluna', token1='uusd', amount=1000000, slippage=0.01)\n```\n\n### Get price\n\n```python\nprice = await api.price.get_price('phoenix-1', 'uluna')\nprice_at_timestamp = await api.price.get_price('phoenix-1', 'uluna', timestamp=1620000000)\n```\n\n### IBC methods to transfer tokens\n```python\n# where we can send tokens from phoenix-1\nreachable_chains = await api.ibc.chain.get_reachable('phoenix-1')\n\n# can we send uluna from phoenix-1 to osmosis-1\nis_reachable = await api.ibc.chain.is_reachable('phoenix-1', 'osmosis-1', 'uluna')\n\n# get list of tokens we can transfer from phoenix-1 to osmosis-1\ntransferable_tokens = await api.ibc.chain.get_transferable_tokens('phoenix-1', 'osmosis-1')\n\n# can we transfer uluna from phoenix-1 to osmosis-1\nis_token_transferable = await api.ibc.chain.is_token_transferable('phoenix-1', 'osmosis-1', 'uluna')\n\n# get route to transfer uluna from phoenix-1 to osmosis-1\nroute = await api.ibc.transfer.get_route(\n    'uluna',\n    'phoenix-1',\n    'ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9',  # uluna ibc address in osmosis-1\n    'osmosis-1',\n    amount=1000000\n)\n\n# msg to send to blockchain\nmsg = await api.ibc.transfer.get_msg(\n    'uluna',\n    'phoenix-1',\n    'ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9',  # uluna ibc address in osmosis-1\n    'osmosis-1',\n    amount=1000000,\n    slippage=0.01\n)\n\n# combined method returns both route and msg\nmsg_and_route = await api.ibc.transfer.get_route_msg_combined(\n    'uluna',\n    'phoenix-1',\n    'ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9',  # uluna ibc address in osmosis-1\n    'osmosis-1',\n    amount=1000000,\n    slippage=0.01\n)\n```\n\n### IBC methods to swap token for token cross chain\n```python\n# get route to transfer uluna from phoenix-1 to osmosis-1\nroute = await api.ibc.swap.get_route(\n    'uluna',\n    'phoenix-1',\n    'ibc/9F9B07EF9AD291167CF5700628145DE1DEB777C2CFC7907553B24446515F6D0E',  # USDC\n    'osmosis-1',\n    amount=1000000,\n    swap_mode=\"Turbo\", # or Savings\n)\n\n# msg to send to blockchain\nmsg = await api.ibc.swap.get_msg(\n    'uluna',\n    'phoenix-1',\n    'ibc/9F9B07EF9AD291167CF5700628145DE1DEB777C2CFC7907553B24446515F6D0E',  # USDC\n    'osmosis-1',\n    amount=1000000,\n    slippage=0.01,\n    swap_mode=\"Turbo\", # or Savings\n)\n\n# combined method returns both route and msg\nmsg_and_route = await api.ibc.swap.get_route_msg_combined(\n    'uluna',\n    'phoenix-1',\n    'ibc/9F9B07EF9AD291167CF5700628145DE1DEB777C2CFC7907553B24446515F6D0E', # USDC\n    'osmosis-1',\n    amount=1000000,\n    slippage=0.01,\n    swap_mode=\"Turbo\", # or Savings\n)\n```\n\n## Sync version of api client\n\nSee [examples](examples/sync_api.py) folder for more.\n\n```python\nfrom tfm_sdk.api import TfmApiSync\n\napi = TfmApiSync()\n\nis_api_healthty = api.health()\n\n# get list of chains\nchains = api.chain.get_chains(network_type=\"mainnet\")\n```\n\n# Run tests\n\n```\npoetry install\npoe test_unit\n```\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "The TFM SDK package allows easy access to the TFM API, providing functionality for interacting with pricing, dex aggregator and ibc transfer and swap.",
    "version": "0.2.1",
    "project_urls": {
        "Documentation": "https://docs.tfm.com/dev-docs/sdk",
        "Homepage": "https://tfm.com"
    },
    "split_keywords": [
        "tfm",
        "sdk",
        "bridge",
        "swap",
        "route",
        "ibc"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "42c1b7a7f383af6621b586378c3d490bbd08a08eae04a88ebe6f804ce7ce67d2",
                "md5": "fcc44d16d3ac3fbfbac7c9c891d7b38e",
                "sha256": "772d3eb379ae4630fa851b2fca277a6030e97faccc3c671ec7e49f42aae483e0"
            },
            "downloads": -1,
            "filename": "tfm_sdk-0.2.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "fcc44d16d3ac3fbfbac7c9c891d7b38e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10,<4.0",
            "size": 19387,
            "upload_time": "2023-08-08T09:17:49",
            "upload_time_iso_8601": "2023-08-08T09:17:49.815242Z",
            "url": "https://files.pythonhosted.org/packages/42/c1/b7a7f383af6621b586378c3d490bbd08a08eae04a88ebe6f804ce7ce67d2/tfm_sdk-0.2.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "aea0d0f4133c77776096534cb4ce2f15c690269db3c8ba5c3fcfdf33c7f8eaa0",
                "md5": "b086b684d0a5c2e0e30642d8c417844b",
                "sha256": "4cc0f1f0f1f35266ac57f3c203afc958724cba1e177ad845ae3203b1298d399a"
            },
            "downloads": -1,
            "filename": "tfm_sdk-0.2.1.tar.gz",
            "has_sig": false,
            "md5_digest": "b086b684d0a5c2e0e30642d8c417844b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10,<4.0",
            "size": 13712,
            "upload_time": "2023-08-08T09:17:51",
            "upload_time_iso_8601": "2023-08-08T09:17:51.823367Z",
            "url": "https://files.pythonhosted.org/packages/ae/a0/d0f4133c77776096534cb4ce2f15c690269db3c8ba5c3fcfdf33c7f8eaa0/tfm_sdk-0.2.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-08-08 09:17:51",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "tfm-sdk"
}
        
TFM
Elapsed time: 0.10150s