@coinbase/cdp-sdk
Version:
SDK for interacting with the Coinbase Developer Platform Wallet API
219 lines (211 loc) • 6.38 kB
text/typescript
/**
* Centralized configuration for network capabilities.
* This defines which methods are available on which networks.
*/
/**
* Network capabilities configuration.
* Each network has a set of boolean flags indicating which methods are supported.
*/
export const NETWORK_CAPABILITIES = {
base: {
listTokenBalances: true,
requestFaucet: false,
quoteFund: true,
fund: true,
waitForFundOperationReceipt: true,
transfer: true,
sendTransaction: true,
quoteSwap: true,
swap: true,
useSpendPermission: true,
},
"base-sepolia": {
listTokenBalances: true,
requestFaucet: true,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: true,
sendTransaction: true,
quoteSwap: false,
swap: false,
useSpendPermission: true,
},
ethereum: {
listTokenBalances: true,
requestFaucet: false,
quoteFund: false, // Only base is supported for quoteFund
fund: false, // Only base is supported for fund
waitForFundOperationReceipt: false,
transfer: true,
sendTransaction: true,
quoteSwap: true,
swap: true,
useSpendPermission: true,
},
"ethereum-sepolia": {
listTokenBalances: false,
requestFaucet: true,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: true,
sendTransaction: true,
quoteSwap: false,
swap: false,
useSpendPermission: true,
},
"ethereum-hoodi": {
listTokenBalances: false,
requestFaucet: true,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: false,
sendTransaction: true, // Always available (uses wallet client for non-base networks)
quoteSwap: false,
swap: false,
useSpendPermission: false,
},
optimism: {
listTokenBalances: false,
requestFaucet: false,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: false,
sendTransaction: true, // Always available (uses wallet client for non-base networks)
quoteSwap: true,
swap: true,
useSpendPermission: true,
},
"optimism-sepolia": {
listTokenBalances: false,
requestFaucet: true,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: false,
sendTransaction: true, // Always available (uses wallet client for non-base networks)
quoteSwap: false,
swap: false,
useSpendPermission: true,
},
arbitrum: {
listTokenBalances: false,
requestFaucet: true,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: false,
sendTransaction: true, // Always available (uses wallet client for non-base networks)
quoteSwap: true,
swap: true,
useSpendPermission: true,
},
"arbitrum-sepolia": {
listTokenBalances: false,
requestFaucet: true,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: false,
sendTransaction: true, // Always available (uses wallet client for non-base networks)
quoteSwap: false,
swap: false,
useSpendPermission: true,
},
avalanche: {
listTokenBalances: false,
requestFaucet: false,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: false,
sendTransaction: true, // Always available (uses wallet client for non-base networks)
quoteSwap: false,
swap: false,
useSpendPermission: true,
},
binance: {
listTokenBalances: false,
requestFaucet: false,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: false,
sendTransaction: true, // Always available (uses wallet client for non-base networks)
quoteSwap: false,
swap: false,
useSpendPermission: true,
},
polygon: {
listTokenBalances: false,
requestFaucet: false,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: false,
sendTransaction: true, // Always available (uses wallet client for non-base networks)
quoteSwap: false,
swap: false,
useSpendPermission: true,
},
zora: {
listTokenBalances: false,
requestFaucet: false,
quoteFund: false,
fund: false,
waitForFundOperationReceipt: false,
transfer: false,
sendTransaction: true, // Always available (uses wallet client for non-base networks)
quoteSwap: false,
swap: false,
useSpendPermission: true,
},
} as const;
/**
* Type for a network name from the capabilities configuration
*/
export type NetworkName = keyof typeof NETWORK_CAPABILITIES;
/**
* Type for method names
*/
export type MethodName = keyof (typeof NETWORK_CAPABILITIES)[NetworkName];
/**
* Helper to get networks that support a specific method
*
* @param method - The method name to check support for
* @returns An array of network names that support the method
*/
export function getNetworksSupportingMethod(method: MethodName): NetworkName[] {
return (Object.keys(NETWORK_CAPABILITIES) as NetworkName[]).filter(
network => NETWORK_CAPABILITIES[network][method],
);
}
/**
* Helper to check if a network supports a method
*
* @param method - The method name to check
* @param network - The network name to check
* @returns True if the network supports the method, false otherwise
*/
export function isMethodSupportedOnNetwork(method: MethodName, network: string): boolean {
const networkConfig = NETWORK_CAPABILITIES[network as NetworkName];
return networkConfig ? networkConfig[method] : false;
}
/**
* Type helper to extract networks supporting a specific method
*/
export type NetworksSupporting<M extends MethodName> = {
[N in NetworkName]: (typeof NETWORK_CAPABILITIES)[N][M] extends true ? N : never;
}[NetworkName];
// Export specific network types for each method
export type ListTokenBalancesNetworks = NetworksSupporting<"listTokenBalances">;
export type RequestFaucetNetworks = NetworksSupporting<"requestFaucet">;
export type QuoteFundNetworks = NetworksSupporting<"quoteFund">;
export type FundNetworks = NetworksSupporting<"fund">;
export type TransferNetworks = NetworksSupporting<"transfer">;
export type SendTransactionNetworks = NetworksSupporting<"sendTransaction">;
export type QuoteSwapNetworks = NetworksSupporting<"quoteSwap">;
export type SwapNetworks = NetworksSupporting<"swap">;