Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.peaq.xyz/llms.txt

Use this file to discover all available pages before exploring further.

peaq_ros2_peaqos exposes the LayerZero V2 ONFT bridge as two services:
ServiceTypePurpose
/peaqos_node/bridge/nftpeaq_ros2_interfaces/srv/PeaqosBridgeNftSend a Machine NFT between peaq and Base
/peaqos_node/bridge/wait_arrivalpeaq_ros2_interfaces/srv/PeaqosWaitForBridgeArrivalPoll the destination chain until the bridged NFT arrives
Bridging is mainnet only. LayerZero V2 has no DVN routes between agung and Base, so bridge calls on testnet won’t relay end-to-end. Test the round trip on peaq mainnet ↔ Base mainnet.

Required configuration

Both directions need the LayerZero ONFT contracts wired into peaq_robot.yaml:
peaq_os:
  contracts:
    machine_nft_adapter: "0x9AD5408702EC204441A88589B99ADfC2514AFAE6"   # peaq mainnet
    # Pass the Base counterpart per call (see base_nft_address below) or
    # leave it blank to fall back to the SDK default.
Equivalent env override: MACHINE_NFT_ADAPTER_ADDRESS. Base side reference contract: 0xee8A521eA434b11F956E2402beC5eBfa753Babfa (MachineNFTBase).

peaq → Base

The signer must own the Machine NFT on peaq and hold enough peaq for gas plus the LayerZero fee.
ros2 service call /peaqos_node/bridge/nft \
  peaq_ros2_interfaces/srv/PeaqosBridgeNft \
  "{signer_address: '<OWNER_EVM_ADDRESS>', token_id: 1, source: 'peaq', destination: 'base', recipient: '<RECIPIENT_EVM_ADDRESS>', base_rpc_url: '', base_nft_address: '', options_hex: ''}"
Then poll the destination:
ros2 service call /peaqos_node/bridge/wait_arrival \
  peaq_ros2_interfaces/srv/PeaqosWaitForBridgeArrival \
  "{dst_rpc_url: 'https://mainnet.base.org', dst_nft_address: '0xee8A521eA434b11F956E2402beC5eBfa753Babfa', token_id: 1, timeout: 900}"
timeout is in seconds. The service returns once ownerOf(token_id) matches the recipient on the destination chain or the deadline is hit.

Base → peaq

Same service shape, swapped source / destination. The signer must hold the Machine NFT on Base and enough Base ETH to cover gas plus the LayerZero fee — the bridge can’t bootstrap funding for you.
ros2 service call /peaqos_node/bridge/nft \
  peaq_ros2_interfaces/srv/PeaqosBridgeNft \
  "{signer_address: '<OWNER_EVM_ADDRESS>', token_id: 1, source: 'base', destination: 'peaq', recipient: '<RECIPIENT_EVM_ADDRESS>', base_rpc_url: 'https://mainnet.base.org', base_nft_address: '0xee8A521eA434b11F956E2402beC5eBfa753Babfa', options_hex: ''}"
Wait for arrival on peaq:
ros2 service call /peaqos_node/bridge/wait_arrival \
  peaq_ros2_interfaces/srv/PeaqosWaitForBridgeArrival \
  "{dst_rpc_url: 'https://quicknode1.peaq.xyz', dst_nft_address: '0x2943F80e9DdB11B9Dd275499C661Df78F5F691F9', token_id: 1, timeout: 900}"

Field reference

PeaqosBridgeNft:
FieldDescription
signer_addressLocal wallet address that owns the NFT on the source chain
token_idMachine NFT token id
sourcepeaq or base
destinationpeaq or base
recipientAddress that receives the NFT on the destination chain
base_rpc_urlBase JSON-RPC URL. Required when source: 'base'; unused when source: 'peaq'
base_nft_addressBase MachineNFTBase address. Required when source: 'base'; unused when source: 'peaq'
options_hexRaw LayerZero extraOptions payload hex. Leave blank for contract defaults
PeaqosWaitForBridgeArrival:
FieldDescription
dst_rpc_urlRPC for the destination chain
dst_nft_addressNFT contract on the destination chain
token_idMachine NFT token id
timeoutSeconds to poll before returning arrived: false

Operational notes

  • Record pre/post balances on both chains for any production bridge test.
  • The reverse direction (Base → peaq) is the failure mode most people hit: a fresh Base wallet has no ETH, so the bridge tx reverts on insufficient funds. Fund Base first.
  • For a deeper protocol view (LayerZero peers, ONFT contracts, supported chains) see the Activate function and the SDK JS / SDK Python bridge methods, which this node mirrors 1:1.