Skip to content

Account Management Examples

This page provides examples of account management operations with the Ethereal Python SDK.

Managing subaccounts

from ethereal import RESTClient

# Initialize client with your private key
client = RESTClient({
    "base_url": "https://api.etherealtest.net",
    "chain_config": {
        "rpc_url": "https://rpc.etherealtest.net",
        "private_key": "your_private_key"
    }
})

# Subaccounts are fetched from the API and stored in the client
subaccounts = client.subaccounts

for subaccount in subaccounts:
    print(subaccount.model_dump())

# Get a specific subaccount
if subaccounts:
    subaccount_id = subaccounts[0].id
    subaccount = client.get_subaccount(id=subaccount_id)
    print(subaccount.model_dump())

Creating Accounts

Subaccounts are created when a token is deposited, specifying a name for that account. The SDK provides a method to prepare and submit these deposit transactions to an RPC. In order to use this feature, you must have provided a private key when initializing the client.

# Step 1: Approve USDe tokens for the exchange
# Get the exchange contract address from the RPC config
exchange_proxy_address = client.rpc_config.domain.verifying_contract

# Create approval transaction parameters
approve_params = client.chain._get_tx()
# Approve 100 USDe tokens
approve_params = client.chain.usde.functions.approve(
    exchange_proxy_address,
    client.chain.provider.to_wei(100, "ether")
).build_transaction(approve_params)

# Submit the approval transaction
approve_tx_hash = client.chain.submit_tx(approve_params)
print(f"Approval transaction hash: {approve_tx_hash}")

# Wait for the approval transaction to be mined
client.chain.provider.eth.wait_for_transaction_receipt(approve_tx_hash)

# Step 2: Deposit USDe to create/fund a subaccount
# Option 1: Quick deposit with default parameters
deposit_tx_hash = client.chain.deposit_usde(
    amount=100,                   # Amount in USDe
    account_name='trading',       # Name for the subaccount
    submit=True                   # Automatically submit the transaction
)
print(f"Deposit transaction hash: {deposit_tx_hash}")

Checking balances

# Get balances for a subaccount
subaccount_id = client.subaccounts[0].id
balances = client.get_subaccount_balances(subaccount_id=subaccount_id)

for balance in balances:
    print(balance.model_dump())

Managing positions

# Get all positions
subaccount_id = client.subaccounts[0].id
positions = client.list_positions(subaccount_id=subaccount_id)

for position in positions:
    print(position.model_dump())

# Get a specific position
if positions:
    position_id = positions[0].id
    position = client.get_position(id=position_id)
    print(position.model_dump())

Token operations

# List all tokens
tokens = client.list_tokens()

for token in tokens:
    print(token.model_dump())

# List token withdrawals
subaccount_id = client.subaccounts[0].id
withdrawals = client.list_token_withdraws(subaccount_id=subaccount_id)
for withdrawal in withdrawals:
    print(withdrawal.model_dump())

# List token transfers
transfers = client.list_token_transfers(subaccount_id=subaccount_id)
for transfer in transfers:
    print(transfer.model_dump())

Withdrawals

Withdrawals are carried out in two steps. First, a withdrawal is submitted to the API using a POST request signed by the user's private key. When the delay period is over, the user can submit a finalizeWithdraw transaction to the exchange to complete the withdrawal.

subaccount = client.subaccounts[0]
usde_address = client.chain.usde.address

# Get the USDe token id
tokens = client.list_tokens(withdrawEnabled=True)
usde_token = next((token for token in tokens if token.address == usde_address), None)

# Step 1: Submit a withdrawal request
withdrawal = client.withdraw_token(
    subaccount=subaccount.name,
    token_id=usde_token.id,
    token=usde_token.address,
    amount=100,
    account=client.chain.address,
)

# Step 2: Check the withdrawal status
withdrawal_status = client.list_token_withdraws(
    subaccount_id=subaccount.id,
)
# if `is_ready` is True, the withdrawal is ready to be finalized...

# Step 3: Finalize the withdrawal
clean_account_name = client.chain.provider.to_text(subaccount.name).strip('\x00')
finalize_tx_hash = client.chain.finalize_withdraw(
    account_name=clean_account_name,
    submit=True
)