Async Python wrapper for the NEAR Intents 1Click Swap API
Project description
intents.py
An async Python wrapper for the NEAR Intents 1Click Swap API.
pip install intents-py
Requirements
- Python 3.10+
httpxpydantic
Quickstart
import asyncio
from intents import IntentsClient, find_token
async def main():
async with IntentsClient() as client:
tokens = await client.get_tokens()
eth = find_token(tokens, "eth", "ETH")
print(eth.asset_id) # nep141:eth.omft.near
asyncio.run(main())
Swap flow
import asyncio
from datetime import datetime, timedelta, timezone
from intents import (
IntentsClient,
QuoteRequest,
SwapType,
DepositType,
RecipientType,
RefundType,
SwapStatus,
find_token,
token_to_atomic,
)
async def main():
async with IntentsClient(jwt_token="your-jwt-token") as client:
tokens = await client.get_tokens()
eth = find_token(tokens, "eth", "ETH")
usdc = find_token(tokens, "arb", "USDC")
# 1. Get a quote
response = await client.get_quote(QuoteRequest(
dry=False,
swap_type=SwapType.EXACT_INPUT,
slippage_tolerance=100, # 1% — use pct_to_bps(1) for clarity
origin_asset=eth.asset_id,
destination_asset=usdc.asset_id,
deposit_type=DepositType.ORIGIN_CHAIN,
amount=token_to_atomic("0.01", eth),
refund_to="0xYourAddress",
refund_type=RefundType.ORIGIN_CHAIN,
recipient="0xYourAddress",
recipient_type=RecipientType.DESTINATION_CHAIN,
deadline=datetime.now(timezone.utc) + timedelta(hours=1),
))
quote = response.quote
print(f"Send {quote.amount_in_formatted} ETH to {quote.deposit_address}")
if quote.deposit_memo:
print(f"Memo (required): {quote.deposit_memo}")
# 2. Send funds to quote.deposit_address, then poll for status
while True:
status = await client.get_status(quote.deposit_address, quote.deposit_memo)
print(status.status)
if status.status in {SwapStatus.SUCCESS, SwapStatus.REFUNDED, SwapStatus.FAILED}:
break
await asyncio.sleep(10)
asyncio.run(main())
Authentication
Most endpoints require a JWT token. Pass it when constructing the client:
client = IntentsClient(jwt_token="your-jwt-token")
API reference
Full API reference is on Read the Docs.
IntentsClient
| Method | Description |
|---|---|
get_tokens() |
List all supported tokens |
get_quote(request) |
Request a swap quote |
get_status(deposit_address, deposit_memo?) |
Check swap status |
get_any_input_withdrawals(deposit_address, ...) |
Get withdrawals for an ANY_INPUT quote |
submit_deposit(request) |
Notify the service a deposit has been sent |
Utilities
| Function | Description |
|---|---|
find_token(tokens, blockchain, symbol) |
Look up a token by chain and symbol |
to_atomic(amount, decimals) |
Convert 0.1 → "100000000000000000" |
from_atomic(amount, decimals) |
Convert "100000000000000000" → Decimal("0.1") |
token_to_atomic(amount, token) |
to_atomic using a TokenResponse |
token_from_atomic(amount, token) |
from_atomic using a TokenResponse |
pct_to_bps(percent) |
Convert 1 (%) → 100 (bps) |
bps_to_pct(bps) |
Convert 100 (bps) → Decimal("1") (%) |
Swap types
| Value | Behaviour |
|---|---|
EXACT_INPUT |
Specify input amount, receive calculated output |
EXACT_OUTPUT |
Specify output amount, deposit calculated input |
FLEX_INPUT |
Variable input with slippage bounds |
ANY_INPUT |
Multiple partial deposits over time |
Swap statuses
KNOWN_DEPOSIT_TX → PENDING_DEPOSIT → PROCESSING → SUCCESS
Terminal states: SUCCESS, REFUNDED, FAILED
Examples
See the examples/ directory:
list_tokens.py— fetch and display all supported tokensdry_quote.py— preview a swap without creating a deposit addressswap.py— full swap lifecycle with status pollingsubmit_deposit.py— notify the service after sending fundsany_input_withdrawals.py— fetchANY_INPUTwithdrawals
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file intents_py-0.1.1.tar.gz.
File metadata
- Download URL: intents_py-0.1.1.tar.gz
- Upload date:
- Size: 22.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ccaa1a687cd7e21932428340d6aa2a1c935bca096eb014d7ffb176a9bf219da5
|
|
| MD5 |
94cfd0620aed5915cb481a0621d992fd
|
|
| BLAKE2b-256 |
ac7fede7007e5db9436e0e1adeec88e49b2937f4dbbed56cafe0d7022bd11194
|
File details
Details for the file intents_py-0.1.1-py3-none-any.whl.
File metadata
- Download URL: intents_py-0.1.1-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7df01245af8c1a46d6ab2d6d62e118443ef614a59078bada3d2f8ba5bea35a57
|
|
| MD5 |
972206f456a1432dad58e9c4014c0b0a
|
|
| BLAKE2b-256 |
bf70ba6c9d37c657aff6356fa0cd41b71b15e72138c30d0dd7c621d507b1b663
|