UNPKG

@shogun-sdk/money-legos

Version:

Shogun Money Legos: clients and types for quotes, memes, prices, balances, fees, validations, etc.

79 lines 3.65 kB
import { mainnet } from 'viem/chains'; import { BSC_CHAIN_ID, CHAIN_MAP, getWrappedNativeTokenByChainId, isSolanaChain } from '../config/chains.js'; import { NATIVE_TOKEN } from '../config/addresses.js'; /** * Truncates an Ethereum or Sui address for better readability. * @param address - The address to truncate. * @param length - Number of characters to preserve at the start and end. Default is 6. * @returns A truncated address string. */ export function truncateAddress(address, length = 6) { if (address.length <= 2 * length) { return address; // No truncation needed if the address is short enough. } const start = address.slice(0, length); const end = address.slice(-length); return `${start}...${end}`; } // Sometimes `11111111111111111111111111111111` is SOLANA_NATIVE_TOKEN export const isMatchingTokens = (tokenA, tokenB) => { return !!tokenA && !!tokenB && tokenA.toLowerCase().endsWith(tokenB.toLowerCase()); }; export const normalizeNativeAddresses = (tokenAddress, networkId) => { const nativeAddresses = [ '0x0000000000000000000000000000000000000000', '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', 'So11111111111111111111111111111111111111111', ]; if (nativeAddresses.some((nativeAddress) => compareAddresses(nativeAddress, tokenAddress))) { return getWrappedNativeTokenByChainId(networkId); } return tokenAddress; }; export function isNativeToken(address) { const normalizedAddress = address.toLowerCase(); return Object.values(NATIVE_TOKEN).some((token) => token.toLowerCase() === normalizedAddress); } export const isValidEVMAddress = (address) => { return /^0x[a-fA-F0-9]{40}$/.test(address); }; export const isValidSolanaOrEVMAddress = (address) => { const evmAddressRegex = /^0x[a-fA-F0-9]{40}$/; const solanaAddressRegex = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/; return evmAddressRegex.test(address) || solanaAddressRegex.test(address); }; export const compareAddresses = (firstAddress, secondAddress) => { return !!firstAddress && !!secondAddress && firstAddress.toLowerCase() === secondAddress.toLowerCase(); }; export const compareChains = (firstChain, secondChain) => { return !!firstChain && !!secondChain && firstChain.toString() === secondChain.toString(); }; export const dummyAddressForQuote = { EVM: '0x9917487EE9646802be9cDCC009C0Ee21f7F76376', SOL: 'HW6a4ahNZh6JtQ513VMQPfnNJaGkLXA1hf1BikR3ERFZ', }; export const getDummyAddress = (chainId) => isSolanaChain(chainId) ? dummyAddressForQuote.SOL : dummyAddressForQuote.EVM; export function isMatchingDummyAddress(address) { // Convert input address to lowercase const normalizedAddress = address.toLowerCase(); // Check against normalized dummy addresses return Object.values(dummyAddressForQuote).some((dummyAddress) => dummyAddress.toLowerCase() === normalizedAddress); } export const areTokensEqual = (tokenA, tokenB) => { const normalize = (token) => `${token.address}_${token.chainId}`.toLowerCase(); return normalize(tokenA) === normalize(tokenB); }; const chains = Object.keys(CHAIN_MAP).map((chain) => parseInt(chain)); export const WRAPPED_ADDRESSES = chains.map((chain) => { if (chain === mainnet.id) { return NATIVE_TOKEN.ETH; } return CHAIN_MAP[chain]?.wrapped?.toLowerCase() ?? ''; }); export const isWrappedAddress = (tokenAddress) => { return !!tokenAddress && WRAPPED_ADDRESSES.includes(tokenAddress.toLowerCase()); }; export const isBscSwap = (params) => { return params.srcChain === BSC_CHAIN_ID || params.destChain === BSC_CHAIN_ID; }; //# sourceMappingURL=address.js.map