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

/escrow/signatures

EscrowSignature

Published on sign, consumed by peers when signature_exchange is on

/payment_requests

PaymentRequest

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