wallet

Multi-chain wallet operations - balance, transfers, signing, and transaction history via Privy Server Wallets (EVM + Solana)

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "wallet" with this command: npx skills add starchild-ai-agent/official-skills/starchild-ai-agent-official-skills-wallet

Wallet

Interact with this agent's on-chain wallets. Each agent has one wallet per chain (EVM + Solana). Supports balance queries, transfers (policy-gated), message signing, and transaction history.

Authentication is automatic via Fly OIDC token — no API keys or wallet addresses needed. Wallets are bound to this machine at deploy time.

Available Tools (13)

Multi-Chain Tools

ToolDescription
wallet_infoGet all wallet addresses and chain types
wallet_get_all_balancesPRIMARY TOOL - Get complete portfolio across ALL chains (EVM + Solana) with USD values

EVM Tools

ToolDescription
wallet_balanceGet ETH/token balances on a specific chain (requires chain parameter)
wallet_transactionsGet recent EVM transaction history
wallet_transferSign and broadcast a transaction on-chain (policy-gated). Funds leave the wallet.
wallet_sign_transactionSign a transaction WITHOUT broadcasting (returns RLP-encoded signed tx, nothing sent on-chain)
wallet_signSign a message (EIP-191 personal_sign)
wallet_sign_typed_dataSign EIP-712 structured data (permits, orders, etc.)

Solana Tools

ToolDescription
wallet_sol_balanceGet SOL/SPL token balances with USD values
wallet_sol_transactionsGet recent Solana transaction history
wallet_sol_transferSign and broadcast a Solana transaction on-chain (policy-gated). Funds leave the wallet.
wallet_sol_sign_transactionSign a Solana transaction WITHOUT broadcasting (returns base64 signed tx, nothing sent on-chain)
wallet_sol_signSign a message with the Solana wallet

Tool Usage Examples

Check Wallet Info (All Chains)

wallet_info()

Returns: list of wallets with wallet_address and chain_type for each active wallet.

Use this first to see all available wallets before any operations.

EVM — Check Balance

IMPORTANT: Always specify the chain parameter! To check all chains at once, use wallet_get_all_balances instead.

wallet_balance(chain="ethereum")  # Get ALL tokens on Ethereum
wallet_balance(chain="base", asset="usdc")  # Check specific asset on Base
wallet_balance(chain="polygon", asset="pol")  # Polygon requires explicit asset

chain parameter is REQUIRED. Valid chains: ethereum, base, arbitrum, optimism, polygon, linea

Asset naming:

  • For Polygon native token, use "pol" NOT "matic"
  • Use lowercase symbolic names like "usdc", "weth", "usdt"
  • DO NOT pass contract addresses (e.g., "0x..."), use symbols only
  • Omit asset parameter to discover ALL tokens on the specified chain

Known Limitation - Polygon: The Polygon chain requires explicit asset parameters. Instead of:

wallet_balance(chain="polygon")  # ❌ May fail with "eth not supported"

Use:

wallet_balance(chain="polygon", asset="pol")  # ✅ Check POL balance
wallet_balance(chain="polygon", asset="usdc")  # ✅ Check USDC balance

For complete Polygon portfolio, use wallet_get_all_balances() which handles this correctly.

For checking balances across ALL chains in one call, use wallet_get_all_balances() instead.

Multi-Chain — Get All Balances

wallet_get_all_balances()

This is the PRIMARY tool for comprehensive balance checks.

Automatically checks ALL supported chains (Ethereum, Base, Arbitrum, Optimism, Polygon, Linea, Solana) and returns complete portfolio with USD values.

Use this instead of calling wallet_balance() multiple times for different chains.

EVM — Query Transaction History

wallet_transactions()
wallet_transactions(chain="ethereum", asset="eth", limit=10)
wallet_transactions(limit=50)

Defaults: chain="ethereum", asset="eth", limit=20 (max 100).

Returns: list of transactions with tx_hash, from, to, amount, status, timestamp.

EVM — Transfer Funds / Contract Calls

wallet_transfer(to="0xRecipientAddress", amount="1000000000000000000")
wallet_transfer(to="0xRecipientAddress", amount="1000000000000000000", chain_id=8453)
wallet_transfer(to="0xContractAddress", amount="0", data="0xa9059cbb000000...", chain_id=8453)
  • to: Target wallet or contract address (0x...)
  • amount: Amount in wei (not ETH). "1000000000000000000" = 1 ETH. Use "0" for contract calls that don't send ETH.
  • chain_id: Chain ID (default: 1 = Ethereum mainnet, 8453 = Base, 10 = Optimism)
  • data: Hex-encoded calldata for contract calls (e.g. ERC-20 transfer, swap). Optional — omit for simple ETH transfers.
  • gas_limit: Gas limit (decimal string). Optional — Privy estimates if omitted.
  • gas_price: Gas price in wei (decimal string, for legacy transactions). Optional.
  • max_fee_per_gas: Max fee per gas in wei (decimal string, for EIP-1559 transactions). Optional.
  • max_priority_fee_per_gas: Max priority fee in wei (decimal string, for EIP-1559 transactions). Optional.
  • nonce: Transaction nonce (decimal string). Optional — auto-determined if omitted.
  • tx_type: Transaction type integer. 0=legacy, 1=EIP-2930, 2=EIP-1559, 4=EIP-7702. Optional.

Policy enforcement: Transfers are gated by Privy TEE policy. The target address must be on the whitelist and the amount must be within daily limits. Policy violations return an error.

EVM — Sign Transaction (without broadcasting)

wallet_sign_transaction(to="0xRecipientAddress", amount="1000000000000000000")
wallet_sign_transaction(to="0xRecipientAddress", amount="1000000000000000000", chain_id=8453)
wallet_sign_transaction(to="0xContractAddress", amount="0", data="0xa9059cbb000000...", chain_id=8453, tx_type=2, max_fee_per_gas="30000000000", max_priority_fee_per_gas="2000000000")

Same parameters as wallet_transfer, plus max_fee_per_gas and max_priority_fee_per_gas for EIP-1559.

Returns: signed_transaction (RLP-encoded hex), encoding ("rlp")

Use cases: pre-sign transactions for later submission, multi-step flows, external broadcast.

EVM — Sign a Message

wallet_sign(message="Hello World")
wallet_sign(message="Verify ownership of this wallet")

Returns: signature (EIP-191 personal_sign format)

Use cases: prove wallet ownership, sign off-chain messages, create verifiable attestations.

EVM — Sign EIP-712 Typed Data

wallet_sign_typed_data(
  domain={"name": "MyDApp", "version": "1", "chainId": 1, "verifyingContract": "0x..."},
  types={"Person": [{"name": "name", "type": "string"}, {"name": "wallet", "type": "address"}]},
  primaryType="Person",
  message={"name": "Alice", "wallet": "0x..."}
)
  • domain: EIP-712 domain separator (name, version, chainId, verifyingContract)
  • types: Type definitions — mapping of type name to array of {name, type} fields
  • primaryType: The primary type being signed (must exist in types)
  • message: The structured data to sign (must match primaryType schema)

Returns: signature (hex)

Use cases: EIP-2612 permit approvals, off-chain order signing (Seaport, 0x), gasless approvals, structured attestations.

Solana — Check Balance

wallet_sol_balance()
wallet_sol_balance(chain="solana", asset="sol")

All parameters are optional. Returns balances with USD-equivalent values.

Solana — Query Transaction History

wallet_sol_transactions()
wallet_sol_transactions(chain="solana", asset="sol", limit=10)

Defaults: chain="solana", asset="sol", limit=20 (max 100).

Solana — Sign and Send Transaction

wallet_sol_transfer(transaction="<base64-encoded-transaction>")
wallet_sol_transfer(transaction="<base64-encoded-transaction>", caip2="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1")
  • transaction: Base64-encoded serialized Solana transaction
  • caip2: CAIP-2 chain identifier (default: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" for mainnet, use "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" for devnet)

Policy enforcement: Same as EVM — transfers are gated by Privy TEE policy.

Solana — Sign Transaction (without broadcasting)

wallet_sol_sign_transaction(transaction="<base64-encoded-transaction>")
  • transaction: Base64-encoded serialized Solana transaction

Returns: signed_transaction (base64), encoding ("base64")

Use cases: pre-sign transactions for later submission, multi-step flows, external broadcast.

Solana — Sign a Message

wallet_sol_sign(message="<base64-encoded-message>")

Returns: signature (base64)


Common Workflows

Pre-Transfer Check (EVM)

  1. wallet_info() — Confirm wallets are active
  2. wallet_balance(chain="ethereum") — Check available funds on specific chain (or use wallet_get_all_balances())
  3. wallet_transfer(to="0x...", amount="...") — Execute transfer
  4. wallet_transactions(limit=1) — Confirm transaction status

Pre-Transfer Check (Solana)

  1. wallet_info() — Confirm wallets are active
  2. wallet_sol_balance() — Check available SOL funds
  3. wallet_sol_transfer(transaction="...") — Sign and send transaction
  4. wallet_sol_transactions(limit=1) — Confirm transaction status

Monitor All Wallet Activity

  1. wallet_info() — See all wallets
  2. wallet_get_all_balances() — Complete portfolio across ALL chains (EVM + Solana)
  3. wallet_transactions(limit=20) — Recent EVM activity
  4. wallet_sol_transactions(limit=20) — Recent Solana activity

Prove Wallet Ownership

  1. wallet_info() — Get all wallet addresses
  2. wallet_sign(message="I am the owner of this wallet at timestamp 1234567890") — EVM proof
  3. wallet_sol_sign(message="<base64-encoded-message>") — Solana proof

Wei Conversion Reference (EVM)

Amounts are always in wei (smallest unit). Conversion table:

AmountWei String
0.001 ETH"1000000000000000"
0.01 ETH"10000000000000000"
0.1 ETH"100000000000000000"
1 ETH"1000000000000000000"
10 ETH"10000000000000000000"

Formula: wei = eth_amount * 10^18

Chain ID Reference (EVM)

ChainIDCAIP-2Native Asset
Ethereum Mainnet1eip155:1eth
Ethereum Sepolia11155111eip155:11155111eth
Base8453eip155:8453eth
Optimism10eip155:10eth
Arbitrum One42161eip155:42161eth
Polygon137eip155:137pol (NOT "matic")
Linea59144eip155:59144eth

Solana CAIP-2 Reference

NetworkCAIP-2
Solana Mainnetsolana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
Solana Devnetsolana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1

Policy & Security

  • Privy TEE enforced: Even if the agent is compromised, transfers that violate policy are rejected at the Privy TEE layer
  • Per-wallet policy: Each chain's wallet has its own independent policy
  • Flexible rules: Policy rules are configured via Privy's rule system (address allowlists, value limits, method restrictions, etc.)
  • Deny-all default: New wallets have no allowed transfers until policy is configured by the user via the backend
  • Pass-through: Policy rules are managed directly via Privy (source of truth), no local cache

Policy is managed by the user through the main backend API, not by the agent.

Error Handling

ErrorMeaningAction
"Not running on a Fly Machine"Wallet requires Fly deploymentCannot use wallet locally
"Policy violation: ..."Transfer rejected by Privy policyCheck whitelist and daily limits
"HTTP 404"Wallet not found for this machineWallet may not be created yet
"HTTP 403"OIDC token invalid or expiredToken will auto-refresh, retry

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Web3

wallet-policy

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

coingecko

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

coder

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

browser-preview

No summary provided by upstream source.

Repository SourceNeeds Review