Exchange Nodes
An exchange node is a DRS node that converts between value type / transfer type pairs. It accepts value on one pair and delivers on another. The sender funds crypto. The exchange converts and originates fiat. Bank credentials never appear in any routing contract.
Why Exchange Nodes Exist
Crypto transfer types are permissionless — a routing contract returns a wallet address and the sender transfers directly. Fiat transfer types are different. ACH requires a routing number and account number. SEPA requires an IBAN. These are sensitive credentials that cannot appear in a routing contract.
Exchange nodes solve this by sitting between the sender and the recipient’s fiat rail.
Pathways
An exchange node declares pathways — direct pair-to-pair mappings:
{ "pathways": [ { "from": { "value_type": "USDC", "transfer_type": "ethereum" }, "to": { "value_type": "USD", "transfer_type": "ach" } }, { "from": { "value_type": "USDC", "transfer_type": "base" }, "to": { "value_type": "USD", "transfer_type": "ach" } }, { "from": { "value_type": "USDC", "transfer_type": "ethereum" }, "to": { "value_type": "MXN", "transfer_type": "spei" } } ]}Each pathway reads: fund me with the from pair, I will deliver the to pair.
Manifest
Pathways appear in the exchange node’s capability manifest alongside the accepts list:
{ "protocol": "directory-v1", "domain": "bridge.money", "node_type": "exchange", "accepts": [ { "value_type": "USDC", "transfer_type": "ethereum", "reference": "0xA0b86991...", "sponsor": "circle.com" }, { "value_type": "USDC", "transfer_type": "base", "reference": "0x833589f...", "sponsor": "circle.com" } ], "pathways": [ { "from": { "value_type": "USDC", "transfer_type": "ethereum" }, "to": { "value_type": "USD", "transfer_type": "ach" } }, { "from": { "value_type": "USDC", "transfer_type": "ethereum" }, "to": { "value_type": "MXN", "transfer_type": "spei" } } ]}The accepts list declares what the node receives directly. The pathways list declares what it can convert between.
Transaction Flow
Sender has USDC on Ethereum. Recipient wants USD via ACH.
1. Sender queries exchange: POST /resolve { "address": "alice@gmail.com", "pathway_to": { "value_type": "USD", "transfer_type": "ach" } }
2. Exchange returns a routing contract with a crypto deposit address: { destination: "0xEXCHANGE...", value_type: "USDC", transfer_type: "ethereum" }
3. Sender sends USDC to 0xEXCHANGE... on Ethereum
4. Exchange receives USDC, converts to USD, originates ACH to recipient
5. Recipient receives dollars in their bank accountFrom the sender: send crypto to a wallet address. From the recipient: receive fiat via their local rail. The exchange bridges the two. Bank credentials never appear in any routing contract.
Setting Up an Exchange Node
# Initialize with exchange node typedrs init --domain bridge.money --cf-token <token> --node-type exchange
# Configure pathways and accepted pairsdrs update-config \ --node-type exchange \ --accepts '[...]' \ --pathways '[ {"from":{"value_type":"USDC","transfer_type":"ethereum"}, "to":{"value_type":"USD","transfer_type":"ach"}} ]' \ --cf-token <token> --account-id <id> --kv-namespace <id>
# Add the exchange deposit addressdrs add-address exchange --routes '[ {"value_type":"USDC","transfer_type":"ethereum","destination":"0xDEPOSIT..."}]' --cf-token <token> --account-id <id> --kv-namespace <id>Licensing
Listing pathways that involve fiat origination implies the operator holds the necessary licenses in the relevant jurisdictions. The protocol does not enforce licensing — it cannot — but the operational requirement is inherent in the transfer types the node claims to deliver. Multiple exchange nodes may offer the same pathway. The sender chooses based on trust, cost, speed, or any other criteria.