@reown/appkit-controllers
Version:
The full stack toolkit to build onchain app UX.
239 lines • 6.45 kB
JavaScript
import { ParseUtil } from '@reown/appkit-common';
import { OptionsController } from '../controllers/OptionsController.js';
const CHAIN_ASSET_INFO_MAP = {
eip155: {
native: { assetNamespace: 'slip44', assetReference: '60' },
defaultTokenNamespace: 'erc20'
},
solana: {
native: { assetNamespace: 'slip44', assetReference: '501' },
defaultTokenNamespace: 'token'
}
};
const EVM_NATIVE_SLIP44_OVERRIDES = {
// BNB on Binance Smart Chain
'56': '714',
// BNB on opBNB
'204': '714'
};
class JsonRpcError extends Error {
}
export function getApiUrl() {
const { sdkType, sdkVersion, projectId } = OptionsController.getSnapshot();
const url = new URL('https://rpc.walletconnect.org/v1/json-rpc');
url.searchParams.set('projectId', projectId);
url.searchParams.set('st', sdkType);
url.searchParams.set('sv', sdkVersion);
url.searchParams.set('source', 'fund-wallet');
return url.toString();
}
async function sendRequest(method, params) {
const url = getApiUrl();
const { projectId } = OptionsController.getSnapshot();
const requestBody = {
jsonrpc: '2.0',
id: 1,
method,
params: {
...(params || {}),
projectId
}
};
const response = await fetch(url, {
method: 'POST',
body: JSON.stringify(requestBody),
headers: { 'Content-Type': 'application/json' }
});
const json = await response.json();
if (json.error) {
throw new JsonRpcError(json.error.message);
}
return json;
}
export async function getExchanges(params) {
const response = await sendRequest('reown_getExchanges', params);
return response.result;
}
export async function getPayUrl(params) {
const response = await sendRequest('reown_getExchangePayUrl', params);
return response.result;
}
export async function getBuyStatus(params) {
const response = await sendRequest('reown_getExchangeBuyStatus', params);
return response.result;
}
export function formatCaip19Asset(caipNetworkId, asset) {
const { chainNamespace, chainId } = ParseUtil.parseCaipNetworkId(caipNetworkId);
const chainInfo = CHAIN_ASSET_INFO_MAP[chainNamespace];
if (!chainInfo) {
throw new Error(`Unsupported chain namespace for CAIP-19 formatting: ${chainNamespace}`);
}
let assetNamespace = chainInfo.native.assetNamespace;
let assetReference = chainInfo.native.assetReference;
if (asset !== 'native') {
assetNamespace = chainInfo.defaultTokenNamespace;
assetReference = asset;
}
else if (chainNamespace === 'eip155' && EVM_NATIVE_SLIP44_OVERRIDES[chainId]) {
// Use chain-specific SLIP-44 coin type for native tokens
assetReference = EVM_NATIVE_SLIP44_OVERRIDES[chainId];
}
const networkPart = `${chainNamespace}:${chainId}`;
return `${networkPart}/${assetNamespace}:${assetReference}`;
}
// -- Assets ------------------------------------------------------------------ //
const ethereumETH = {
network: 'eip155:1',
asset: 'native',
metadata: {
name: 'Ethereum',
symbol: 'ETH',
decimals: 18
}
};
const baseETH = {
network: 'eip155:8453',
asset: 'native',
metadata: {
name: 'Ethereum',
symbol: 'ETH',
decimals: 18
}
};
export const baseUSDC = {
network: 'eip155:8453',
asset: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
metadata: {
name: 'USD Coin',
symbol: 'USDC',
decimals: 6
}
};
export const baseSepoliaUSDC = {
network: 'eip155:84532',
asset: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',
metadata: {
name: 'USD Coin',
symbol: 'USDC',
decimals: 6
}
};
const baseSepoliaETH = {
network: 'eip155:84532',
asset: 'native',
metadata: {
name: 'Ethereum',
symbol: 'ETH',
decimals: 18
}
};
const ethereumUSDC = {
network: 'eip155:1',
asset: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
metadata: {
name: 'USD Coin',
symbol: 'USDC',
decimals: 6
}
};
const arbitrumUSDC = {
network: 'eip155:42161',
asset: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
metadata: {
name: 'USD Coin',
symbol: 'USDC',
decimals: 6
}
};
const polygonUSDC = {
network: 'eip155:137',
asset: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',
metadata: {
name: 'USD Coin',
symbol: 'USDC',
decimals: 6
}
};
const solanaUSDC = {
network: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
asset: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
metadata: {
name: 'USD Coin',
symbol: 'USDC',
decimals: 6
}
};
const ethereumUSDT = {
network: 'eip155:1',
asset: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
metadata: {
name: 'Tether USD',
symbol: 'USDT',
decimals: 6
}
};
const optimismUSDT = {
network: 'eip155:10',
asset: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',
metadata: {
name: 'Tether USD',
symbol: 'USDT',
decimals: 6
}
};
const arbitrumUSDT = {
network: 'eip155:42161',
asset: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',
metadata: {
name: 'Tether USD',
symbol: 'USDT',
decimals: 6
}
};
const polygonUSDT = {
network: 'eip155:137',
asset: '0xc2132d05d31c914a87c6611c10748aeb04b58e8f',
metadata: {
name: 'Tether USD',
symbol: 'USDT',
decimals: 6
}
};
const solanaUSDT = {
network: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
asset: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',
metadata: {
name: 'Tether USD',
symbol: 'USDT',
decimals: 6
}
};
const solanaSOL = {
network: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
asset: 'native',
metadata: {
name: 'Solana',
symbol: 'SOL',
decimals: 9
}
};
export const assets = {
ethereumETH,
baseETH,
baseUSDC,
baseSepoliaETH,
ethereumUSDC,
arbitrumUSDC,
polygonUSDC,
solanaUSDC,
ethereumUSDT,
optimismUSDT,
arbitrumUSDT,
polygonUSDT,
solanaUSDT,
solanaSOL
};
export function getPaymentAssetsForNetwork(network) {
return Object.values(assets).filter(asset => asset.network === network);
}
//# sourceMappingURL=ExchangeUtil.js.map