Grant a hot agent key permission to sign XRPL escrow transactions on behalf of your buyer wallet — without ever sharing your seed phrase. Live on XRPL mainnet since 8 October 2026.
Every time an agent creates an XRPL escrow, it signs an EscrowCreate transaction. Signing requires the buyer's private key — which until now had to live in the agent's environment, exposed to logs, memory, and anyone with access to that runtime.
For high-value buyer wallets that's an unacceptable risk. XLS-75 fixes it: one DelegateSet from your cold wallet, and a scoped hot key handles all the runtime signing.
XLS-75 introduces a DelegateSet transaction that grants a named address permission to sign specific transaction types on your behalf. The buyer submits this once from their cold wallet. After that, the delegated agent signs those transaction types — the Delegate field names the signer, but Account stays as the buyer, so ownership and cancellation rights stay where they belong.
Grant EscrowCreate and nothing else. Max 10 permissions per DelegateSet.
The on-chain Account field stays as the buyer's address. The escrow belongs to the buyer — cancellation and audit trail are theirs.
Submit a DelegateSet with an empty permissions list from the buyer wallet. The grant is removed immediately.
Generate a fresh agent keypair per deployment. Compromise one key, rotate it — your buyer wallet is untouched.
XLS-75 supports delegation for these transaction types on XRPL mainnet (live 8 October 2026):
# Run once — store the agent seed in your deployment environment from xrpl.wallet import Wallet agent_wallet = Wallet.create() print("Agent address:", agent_wallet.address) # share this with the buyer print("Agent seed: ", agent_wallet.seed) # store in .env — never commit
from xrpl.wallet import Wallet from xrpl.models.transactions import DelegateSet from xrpl.asyncio.clients import AsyncJsonRpcClient from xrpl.asyncio.transaction import submit_and_wait buyer_wallet = Wallet.from_seed("sBuyerSeedHere") # cold wallet agent_address = "rAgentAddressHere" tx = DelegateSet( account = buyer_wallet.address, authorize = agent_address, permissions = [{"Permission": {"PermissionValue": "EscrowCreate"}}], ) client = AsyncJsonRpcClient("wss://xrplcluster.com") result = await submit_and_wait(tx, client, buyer_wallet) print(result.result["meta"]["TransactionResult"]) # tesSUCCESS
# Agent has: buyer_address (public), agent_wallet (hot key) # Buyer has: submitted DelegateSet granting agent EscrowCreate permission result = await hire_and_pay( task = "Translate the product spec into Spanish", buyer_address = "rBuyerAddressHere", # buyer's cold wallet amount_xrp = 10.0, worker_address = "rWorkerAddressHere", escrow_id = "job-translate-001", delegate_address = agent_wallet.address, # XLS-75: agent signs ) # result["transaction"] carries Delegate = agent_wallet.address # Account = buyer_address (ownership stays with buyer) tx_blob = agent_wallet.sign(result["transaction"]).tx_blob submit_escrow_transaction("job-translate-001", tx_blob)
# Revoke: empty permissions list removes the delegation immediately tx = DelegateSet( account = buyer_wallet.address, authorize = agent_address, permissions = [], ) result = await submit_and_wait(tx, client, buyer_wallet)
To rotate to a new agent key: revoke the old delegation, generate a new keypair, and submit a fresh DelegateSet authorising the new address.
The AgentTrust Pro dashboard handles the full delegation flow for every linked wallet — no terminal required.
Enter the agent wallet address, tick the transaction types to permit (EscrowCreate, Payment, NFToken* etc.), and click Grant delegation.
Each wallet card lists which agent addresses hold grants and what permissions they carry — read directly from the XRPL ledger in real time. Revoking on-chain is reflected immediately, no sync delay.