@luffalab/luffa-evm-sdk
Version:
luffa evm ts sdk
140 lines (127 loc) • 3.16 kB
text/typescript
export const isLuffa = () => {
return (
(window && window?._evmWallet !== undefined) || window?.webkit?.messageHandlers?._evmWallet !== undefined || false
);
};
export const isLuffaMiniProgramWebview = () => {
const userAgent = (window && window?.navigator?.userAgent) || '';
return userAgent.includes('miniProgram');
};
export const isLuffaMiniProgram = () => {
return Boolean(window?.wx && window?.wx?.getSystemInfoSync);
};
export const networkMap: Partial<Record<string, string>> = {
['mainnet']: 'endless',
['testnet']: 'eds',
};
export const getChain = (chainId: string) => {
const chainIdNumber = parseInt(chainId, 16);
let chain = '';
switch (chainIdNumber) {
case 728126428:
chain = 'tron';
break;
case 3448148188:
chain = 'tron_nile';
break;
case 1:
chain = 'eth';
break;
case 11155111:
chain = 'eth_sepolia';
break;
case 56:
chain = 'bsc';
break;
case 97:
chain = 'bsc_test';
break;
case 220:
chain = 'endless';
break;
case 221:
chain = 'eds';
break;
}
return chain;
};
export const getChainIdByName = (chainName: string) => {
let chainId;
switch (chainName) {
case 'eth':
chainId = 1;
break;
case 'eth_sepolia':
chainId = 11155111;
break;
case 'bsc':
chainId = 56;
break;
case 'bsc_test':
chainId = 97;
break;
case 'tron':
chainId = 728126428;
break;
case 'tron_nile':
chainId = 3448148188;
break;
case 'endless':
chainId = 220;
break;
case 'eds':
chainId = 221;
break;
}
return chainId;
};
export const isApproveTx = (data: string) => {
console.log('data: ', data);
if (!data || !data.startsWith('0x095ea7b3'))
return {
isApprove: false,
spender: null,
amount: null,
};
try {
const methodData = data.slice(10);
const spenderHex = methodData.slice(0, 64);
const amountHex = methodData.slice(64, 128);
const spender = '0x' + spenderHex.slice(24);
const amount = BigInt('0x' + amountHex);
return {
isApprove: true,
spender,
amount,
};
} catch (e) {
return {
isApprove: false,
spender: null,
amount: null,
};
}
};
export const isHexString = (value: string): boolean => {
return (
typeof value === 'string' &&
value.startsWith('0x') &&
value.length % 2 === 0 &&
/^[0-9a-fA-F]+$/.test(value.slice(2))
);
}
export const hexToUtf8 = (hex: string): string => {
const clean = hex.slice(2);
const bytes = new Uint8Array(clean.length / 2);
for (let i = 0; i < clean.length; i += 2) {
bytes[i / 2] = parseInt(clean.slice(i, i + 2), 16);
}
const decoder = new TextDecoder('utf-8');
return decoder.decode(bytes);
}
export const normalizeMessageForDisplay = (message: string): string => {
if (isHexString(message)) {
return hexToUtf8(message);
}
return message;
}