SAP DOCv0.20.0
SDK Reference

Network Normalization

Normalize Solana network identifiers for x402 header interoperability. SDK v0.20.0 aligned.

Network Normalization

SDK Version: v0.20.0

Added in v0.6.0. Different x402 providers use different formats for the same Solana network. Coinbase accepts solana:mainnet-beta, while Kamiyo requires the genesis-hash form solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp. This module ensures both clients and agents canonicalize before comparing.


Network Constants

import { SapNetwork } from "@oobe-protocol-labs/synapse-sap-sdk";
import type { SapNetworkId } from "@oobe-protocol-labs/synapse-sap-sdk";
ConstantValueUsed By
SapNetwork.SOLANA_MAINNET"solana:mainnet-beta"Coinbase, Phantom
SapNetwork.SOLANA_MAINNET_GENESIS"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"Kamiyo, x402 facilitators
SapNetwork.SOLANA_DEVNET"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"Devnet providers
SapNetwork.SOLANA_DEVNET_NAMED"solana:devnet"Local / test flows

Functions

import {
  normalizeNetworkId,
  isNetworkEquivalent,
  getNetworkGenesisHash,
  getNetworkClusterName,
  isKnownNetwork,
} from "@oobe-protocol-labs/synapse-sap-sdk";

normalizeNetworkId(raw)

Normalize a raw network identifier to its canonical form. Case-insensitive, strips whitespace, resolves aliases.

normalizeNetworkId("solana:mainnet-beta");
// → "solana:mainnet-beta"

normalizeNetworkId("  MAINNET  ");
// → "solana:mainnet-beta"

normalizeNetworkId("5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp");
// → "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"

normalizeNetworkId("unknown-chain");
// → "unknown-chain" (passthrough for unrecognized identifiers)

isNetworkEquivalent(a, b)

Check if two identifiers refer to the same network, even if they use different formats.

isNetworkEquivalent("solana:mainnet-beta", "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp");
// → true (both are mainnet)

isNetworkEquivalent("solana:devnet", "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1");
// → true (both are devnet)

isNetworkEquivalent("solana:mainnet-beta", "solana:devnet");
// → false (different networks)

getNetworkGenesisHash(networkId)

Get the genesis-hash form (CAIP-2). Required by Kamiyo and most x402 facilitators.

getNetworkGenesisHash("mainnet");
// → "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"

getNetworkGenesisHash("devnet");
// → "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"

getNetworkClusterName(networkId)

Get the human-readable cluster-name form. Accepted by Coinbase, Phantom.

getNetworkClusterName("5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp");
// → "solana:mainnet-beta"

getNetworkClusterName("EtWTRABZaYq6iMfeYKouRu166VU2xqa1");
// → "solana:devnet"

isKnownNetwork(networkId)

Check if the identifier is recognized by the SDK.

isKnownNetwork("solana:mainnet-beta"); // → true
isKnownNetwork("solana:devnet");       // → true
isKnownNetwork("ethereum:mainnet");    // → false

Alias Resolution Table

InputResolved To
"solana:mainnet-beta""solana:mainnet-beta"
"solana:mainnet""solana:mainnet-beta"
"mainnet-beta""solana:mainnet-beta"
"mainnet""solana:mainnet-beta"
"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp""solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
"solana:devnet""solana:devnet"
"devnet""solana:devnet"
"EtWTRABZaYq6iMfeYKouRu166VU2xqa1""solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"

Usage in x402 Headers

When building payment headers, specify the network format the provider expects:

// Use the genesis-hash form for Kamiyo-compatible providers
const ctx = await client.x402.preparePayment(agentWallet, {
  pricePerCall: 1_000,
  deposit: 100_000,
  networkIdentifier: SapNetwork.SOLANA_MAINNET_GENESIS,
});

Cross-Network Validation

Before making a paid call, verify that your network matches the agent's:

const clientNetwork = normalizeNetworkId(process.env.NETWORK ?? "mainnet");
const agentNetwork = normalizeNetworkId(agentManifest.supportedNetworks[0]);

if (!isNetworkEquivalent(clientNetwork, agentNetwork)) {
  throw new Error(`Network mismatch: client=${clientNetwork}, agent=${agentNetwork}`);
}

Next Steps


Last Updated: June 2026
SDK Version: 0.20.0