@shogun-sdk/money-legos
Version:
Shogun Money Legos: clients and types for quotes, memes, prices, balances, fees, validations, etc.
79 lines • 3.65 kB
JavaScript
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