Interfaces
All interfaces live in robopay_interfaces. Service names below are relative,
so they pick up the node’s namespace. Addresses, amounts, and hashes are
strings. Definitions are included straight from the source, so they are
always current.
Services
transfer/send
Send USDC. Returns once broadcast.
Type: robopay_interfaces/srv/Transfer
# Send USDC from one wallet to another.
string from_address
string to_address
string amount # decimal string, e.g. "2.50", never a float
string asset # "USDC"
string memo # optional context
string idempotency_key # unique ID for this payment intent; makes retries safe
---
bool success
string tx_hash # blockchain receipt
string error # reason on failure, empty on success
transfer/preview
Dry run of a transfer: balances, fee estimate, caps. Spends nothing.
Type: robopay_interfaces/srv/TransferPreview
# Dry run a transfer: check whether it would
# succeed : enough USDC, enough gas, valid destination(for free, no chain write). Sends no money.
string from_address
string to_address
string amount # decimal string
string asset # "USDC"
---
bool ok # true if the transfer would likely succeed
string reason # human-readable explanation when ok is false
string usdc_balance # sender's current USDC
string gas_balance # sender's current gas
string gas_estimate # estimated gas this transfer would cost
wallet/create
Create a wallet inside the node.
Type: robopay_interfaces/srv/WalletCreate
string label
---
bool success
string address # only the public address is returned over ROS
string label
string error
wallet/balance
USDC and gas balance of an address.
Type: robopay_interfaces/srv/WalletBalance
string address
---
bool success
string usdc # decimal string
string gas # native gas-token balance, decimal string. example: ETH on Base
string error # gives reason if error, empty if success
escrow/sign
Sign the release of an escrow as payer or payee. Publishes the signature when exchange is on.
Type: robopay_interfaces/srv/EscrowSign
# Produce this robot's EIP-712 signature authorizing release of an escrow.
# Local and free. no chain write, no gas.
string escrow_id # hex, e.g. "0x9f8b27..."
string signer_address # which wallet signs
string role # "payer" | "payee"
---
bool success
string signature # hex-encoded 65-byte signature
string signer # the address that signed (for the receiver's convenience)
string error
escrow/submit_signature
Hand the node a signature received out of band. Verified before it is stored.
Type: robopay_interfaces/srv/EscrowSubmitSignature
# Hand a signature (ours or a counterparty's) to the node, so a waiting
# Escrow action can collect it. The signature may have arrived over any channel the developer chose.
string escrow_id # hex
string role # "payer" | "payee"
string signature # hex-encoded 65-byte signature
---
bool accepted
string error
Actions
escrow
Open an escrow, wait for both signatures, release, or refund at the deadline.
Feedback reports the escrow_id as soon as the deposit confirms, then state
changes. The result reports whether funds were released and the final
transaction hash.
Type: robopay_interfaces/action/Escrow
# Open and manage a trustless escrow: lock the payer's USDC in the shared
# RobopayEscrow contract, then release it to the payee when a valid proof
# (signatures over terms_hash, per trust_level) arrives, or refund it to the
# payer if the timeout passes first.
# GOAL
string escrow_id # caller-supplied unique id; prevents a retry double-locking funds
string from_address # payer
string to_address # payee
string amount # decimal string
string asset # "USDC"
string terms_hash # SAME fingerprint both parties sign (links to ProofSign)
uint8 trust_level # strength of proof required to release (0/1/2)
float64 timeout_seconds # auto-refund to payer if not released within this window
---
# RESULT
bool released # true = paid to payee, false = refunded to payer
string escrow_id
string status # "released" | "refunded_timeout" | "refunded_dispute" | "failed"
string tx_hash # on-chain receipt of the final release/refund
string error
---
# FEEDBACK
string escrow_id # hex id, populated once the escrow is open
string state # "opening"|"locked"|"awaiting_proof"|"proof_partial"|"releasing"|"timed_out"|"refunding"
string detail # human-readable nuance
Topics
Topic |
Type |
Direction |
|---|---|---|
|
|
Published on sign, consumed by peers when |
|
|
Invoices. Logged on receipt; never pays automatically |
EscrowSignature
# A release signature broadcast for peer-to-peer exchange.
string escrow_id # hex 32 bytes
string role # "payer" | "payee"
string signature # hex, 65 bytes
string signer # claimed signer address
PaymentRequest
# An invoice: one robot asking another to pay for a service.
string request_id # unique id for this invoice, so duplicates are recognisable
string payee_address # who to pay
string amount # decimal string, e.g. "2.50"
string asset # "USDC"
string memo # what the charge is for
string settlement # "direct" | "escrow"
string terms_hash # optional: hash of the agreed terms