Skip to main content
peaq_ros2_peaqos exposes the LayerZero V2 ONFT 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 must own the on peaq and hold enough peaq for 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 has no ETH, so the bridge tx 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.