four-flap-meme-sdk
Version:
SDK for Flap bonding curve and four.meme TokenManager
115 lines (114 loc) • 4.4 kB
JavaScript
/**
* 解析 Flap Protocol 错误信息
*
* @param error - 捕获的错误对象
* @returns 错误代码或 null(无法识别的错误)
*
* @example
* ```typescript
* try {
* await portal.swapExactInput(...);
* } catch (err) {
* const errorCode = parseFlapError(err);
* if (errorCode === 'SLIPPAGE_EXCEEDED') {
* console.log('滑点过大,请调整参数');
* }
* }
* ```
*/
export function parseFlapError(error) {
const msg = error?.message || error?.data?.message || String(error);
const msgLower = msg.toLowerCase();
// Token 状态相关错误
if (msgLower.includes('token already exists') || msgLower.includes('already created')) {
return 'TOKEN_ALREADY_EXISTS';
}
if (msgLower.includes('token not found') || msgLower.includes('invalid token')) {
return 'TOKEN_NOT_FOUND';
}
if (msgLower.includes('not tradable') || msgLower.includes('trading disabled')) {
return 'TOKEN_NOT_TRADABLE';
}
if (msgLower.includes('already on dex') || msgLower.includes('already migrated')) {
return 'ALREADY_ON_DEX';
}
// 余额相关错误
if (msgLower.includes('insufficient balance') || msgLower.includes('insufficient funds')) {
return 'INSUFFICIENT_BALANCE';
}
// 滑点错误
if (msgLower.includes('slippage') || msgLower.includes('min output')) {
return 'SLIPPAGE_EXCEEDED';
}
// 参数验证错误
if (msgLower.includes('invalid amount') || msgLower.includes('amount too small')) {
return 'INVALID_AMOUNT';
}
if (msgLower.includes('invalid quote token') || msgLower.includes('quote token not supported')) {
return 'INVALID_QUOTE_TOKEN';
}
if (msgLower.includes('tax rate') && msgLower.includes('too high')) {
return 'TAX_RATE_TOO_HIGH';
}
// Permit 相关错误
if (msgLower.includes('permit expired') || msgLower.includes('deadline')) {
return 'PERMIT_EXPIRED';
}
if (msgLower.includes('permit') && (msgLower.includes('invalid') || msgLower.includes('signature'))) {
return 'PERMIT_INVALID';
}
// 无法识别的错误
return null;
}
/**
* 获取错误的友好提示信息(中文)
*
* @param errorCode - 错误代码
* @returns 友好的错误提示
*/
export function getFlapErrorMessage(errorCode) {
if (!errorCode)
return '未知错误,请检查交易参数';
const messages = {
TOKEN_ALREADY_EXISTS: '代币已存在,请使用不同的参数创建',
TOKEN_NOT_FOUND: '代币不存在或地址无效',
TOKEN_NOT_TRADABLE: '代币当前不可交易',
ALREADY_ON_DEX: '代币已迁移到 DEX,无法在联合曲线上交易',
INSUFFICIENT_BALANCE: '余额不足',
SLIPPAGE_EXCEEDED: '滑点过大,请调整最小输出数量或重试',
INVALID_TOKEN: '无效的代币地址',
INVALID_QUOTE_TOKEN: '不支持的 quote token',
INVALID_AMOUNT: '无效的交易数量',
TAX_RATE_TOO_HIGH: '税率设置过高(最大 10%)',
PERMIT_EXPIRED: 'Permit 签名已过期',
PERMIT_INVALID: 'Permit 签名无效',
UNKNOWN_ERROR: '未知错误',
};
return messages[errorCode];
}
/**
* 获取错误的友好提示信息(英文)
*
* @param errorCode - 错误代码
* @returns 友好的错误提示
*/
export function getFlapErrorMessageEn(errorCode) {
if (!errorCode)
return 'Unknown error, please check transaction parameters';
const messages = {
TOKEN_ALREADY_EXISTS: 'Token already exists, please use different parameters',
TOKEN_NOT_FOUND: 'Token not found or invalid address',
TOKEN_NOT_TRADABLE: 'Token is not tradable at the moment',
ALREADY_ON_DEX: 'Token has been migrated to DEX, cannot trade on bonding curve',
INSUFFICIENT_BALANCE: 'Insufficient balance',
SLIPPAGE_EXCEEDED: 'Slippage tolerance exceeded, please adjust parameters or retry',
INVALID_TOKEN: 'Invalid token address',
INVALID_QUOTE_TOKEN: 'Quote token not supported',
INVALID_AMOUNT: 'Invalid trade amount',
TAX_RATE_TOO_HIGH: 'Tax rate too high (maximum 10%)',
PERMIT_EXPIRED: 'Permit signature expired',
PERMIT_INVALID: 'Invalid permit signature',
UNKNOWN_ERROR: 'Unknown error',
};
return messages[errorCode];
}