diff --git a/packages/components/src/locale/ar.json b/packages/components/src/locale/ar.json index 558acf7dba0..093349c414a 100644 --- a/packages/components/src/locale/ar.json +++ b/packages/components/src/locale/ar.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "سعر", "form__price_volatility": "تقلب الأسعار", "form__price_volatility_desc": "تلقي إخطار تقلب أسعار الرموز الخاصة بك", + "form__prioritization_fee_sol": "رسوم الأولوية", "form__priority_fee": "رسوم الأولوية", "form__priority_fee_booster": "🚀 أولوية دفع الرسوم", "form__priority_fee_gwei": "رسوم الأولوية (Gwei)", diff --git a/packages/components/src/locale/bn.json b/packages/components/src/locale/bn.json index 75692c84cc5..c1654f2052d 100644 --- a/packages/components/src/locale/bn.json +++ b/packages/components/src/locale/bn.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "PRICE", "form__price_volatility": "মূল্য অবিশ্বাস", "form__price_volatility_desc": "আপনার টোকেনগুলির জন্য মূল্যের অস্থিরতার বিজ্ঞপ্তি পান", + "form__prioritization_fee_sol": "অগ্রাধিকার ফি", "form__priority_fee": "অগ্রাধিকার ফি", "form__priority_fee_booster": "🚀 অগ্রাধিকার ফি বুস্টার", "form__priority_fee_gwei": "অগ্রাধিকার ফি (Gwei)", diff --git a/packages/components/src/locale/de.json b/packages/components/src/locale/de.json index cb71c859441..542093d2687 100644 --- a/packages/components/src/locale/de.json +++ b/packages/components/src/locale/de.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "PREIS", "form__price_volatility": "Preisvolatilität", "form__price_volatility_desc": "Erhalten Sie Benachrichtigungen zur Preisvolatilität für Ihre Token", + "form__prioritization_fee_sol": "Gebühr für die Priorisierung", "form__priority_fee": "Prioritätsgebühr", "form__priority_fee_booster": "🚀 Priority Fee Booster", "form__priority_fee_gwei": "Prioritätsgebühr (Gwei)", diff --git a/packages/components/src/locale/en-US.json b/packages/components/src/locale/en-US.json index 0f82999d149..14e42b59803 100644 --- a/packages/components/src/locale/en-US.json +++ b/packages/components/src/locale/en-US.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "PRICE", "form__price_volatility": "Price Volatility", "form__price_volatility_desc": "Receive price volatility notification for your tokens", + "form__prioritization_fee_sol": "Prioritization Fee", "form__priority_fee": "Priority Fee", "form__priority_fee_booster": "🚀 Priority Fee Booster", "form__priority_fee_gwei": "Priority Fee (Gwei)", diff --git a/packages/components/src/locale/es.json b/packages/components/src/locale/es.json index fc5a468d5b2..2e7071a041c 100644 --- a/packages/components/src/locale/es.json +++ b/packages/components/src/locale/es.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "PRECIO", "form__price_volatility": "Volatilidad de los precios", "form__price_volatility_desc": "Recibe notificaciones de la volatilidad de los precios para tus tokens", + "form__prioritization_fee_sol": "Tarifa de priorización", "form__priority_fee": "Tarifa de prioridad", "form__priority_fee_booster": "🚀 Refuerzo de tarifa prioritaria", "form__priority_fee_gwei": "Tarifa de prioridad (Gwei)", diff --git a/packages/components/src/locale/fil.json b/packages/components/src/locale/fil.json index d333d12aaad..0687c38cb28 100644 --- a/packages/components/src/locale/fil.json +++ b/packages/components/src/locale/fil.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "PRICE", "form__price_volatility": "Pagkasumpungin ng Presyo", "form__price_volatility_desc": "Makatanggap ng abiso sa pagbabago ng presyo para sa iyong mga token", + "form__prioritization_fee_sol": "Bayarin sa Priyoridad", "form__priority_fee": "Priority Fee", "form__priority_fee_booster": "🚀 Priority Fee Booster", "form__priority_fee_gwei": "Priority Fee (Gwei)", diff --git a/packages/components/src/locale/fr_FR.json b/packages/components/src/locale/fr_FR.json index c6a592ede69..61926dbffcc 100644 --- a/packages/components/src/locale/fr_FR.json +++ b/packages/components/src/locale/fr_FR.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "LE PRIX", "form__price_volatility": "Volatilité des prix", "form__price_volatility_desc": "Recevez une notification de volatilité des prix pour vos jetons", + "form__prioritization_fee_sol": "Frais de priorisation", "form__priority_fee": "Frais de priorité", "form__priority_fee_booster": "🚀 Booster de frais de priorité", "form__priority_fee_gwei": "Frais de priorité (Gwei)", diff --git a/packages/components/src/locale/hi_IN.json b/packages/components/src/locale/hi_IN.json index 10f3c3cf4a3..8146fee9866 100644 --- a/packages/components/src/locale/hi_IN.json +++ b/packages/components/src/locale/hi_IN.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "कीमत", "form__price_volatility": "कीमतो में अस्थिरता", "form__price_volatility_desc": "अपने टोकन के लिए मूल्य अस्थिरता सूचना प्राप्त करें", + "form__prioritization_fee_sol": "प्राथमिकता शुल्क", "form__priority_fee": "प्राथमिकता शुल्क", "form__priority_fee_booster": "🚀 प्राथमिकता शुल्क बूस्टर", "form__priority_fee_gwei": "प्राथमिकता शुल्क (Gwei)", diff --git a/packages/components/src/locale/id.json b/packages/components/src/locale/id.json index 9663195d2eb..f0334bb3070 100644 --- a/packages/components/src/locale/id.json +++ b/packages/components/src/locale/id.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "HARGA", "form__price_volatility": "Volatilitas Harga", "form__price_volatility_desc": "Terima pemberitahuan volatilitas harga untuk token Anda", + "form__prioritization_fee_sol": "Biaya Prioritas", "form__priority_fee": "Biaya Prioritas", "form__priority_fee_booster": "🚀 Penguat Biaya Prioritas", "form__priority_fee_gwei": "Biaya Prioritas (Gwei)", diff --git a/packages/components/src/locale/it_IT.json b/packages/components/src/locale/it_IT.json index 8ed113c2f74..39818b30e8b 100644 --- a/packages/components/src/locale/it_IT.json +++ b/packages/components/src/locale/it_IT.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "PREZZO", "form__price_volatility": "Volatilità del prezzo", "form__price_volatility_desc": "Ricevi una notifica sulla volatilità dei prezzi per i tuoi token", + "form__prioritization_fee_sol": "Commissione di priorità", "form__priority_fee": "Commissione prioritaria", "form__priority_fee_booster": "🚀 Amplificatore tariffa prioritaria", "form__priority_fee_gwei": "Commissione prioritaria (Gwei)", diff --git a/packages/components/src/locale/ja_JP.json b/packages/components/src/locale/ja_JP.json index d43fa2a1685..21facd96fd2 100644 --- a/packages/components/src/locale/ja_JP.json +++ b/packages/components/src/locale/ja_JP.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "価格", "form__price_volatility": "価格変動性", "form__price_volatility_desc": "トークンの価格ボラティリティ通知を受け取る", + "form__prioritization_fee_sol": "優先料", "form__priority_fee": "優先料金", "form__priority_fee_booster": "🚀 優先料金ブースター", "form__priority_fee_gwei": "優先料金 (Gwei)", diff --git a/packages/components/src/locale/ko_KR.json b/packages/components/src/locale/ko_KR.json index cc06394ab1a..52d613bff18 100644 --- a/packages/components/src/locale/ko_KR.json +++ b/packages/components/src/locale/ko_KR.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "가격", "form__price_volatility": "가격 변동성", "form__price_volatility_desc": "토큰에 대한 가격 변동성 알림 수신", + "form__prioritization_fee_sol": "우선 수수료", "form__priority_fee": "우선 수수료", "form__priority_fee_booster": "🚀 우선 수수료 부스터", "form__priority_fee_gwei": "우선 수수료(Gwei)", diff --git a/packages/components/src/locale/mn_MN.json b/packages/components/src/locale/mn_MN.json index 79fe46398c1..4b0c4fee564 100644 --- a/packages/components/src/locale/mn_MN.json +++ b/packages/components/src/locale/mn_MN.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "ҮНЭ", "form__price_volatility": "Үнийн хэлбэлзэл", "form__price_volatility_desc": "Токенуудын үнийн хэлбэлзлийн мэдэгдлийг хүлээн авна уу", + "form__prioritization_fee_sol": "Тэргүүлэх хураамж", "form__priority_fee": "Тэргүүлэх хураамж", "form__priority_fee_booster": "🚀 Тэргүүлэх хураамжийн нэмэгдэл", "form__priority_fee_gwei": "Тэргүүлэх хураамж (Gwei)", diff --git a/packages/components/src/locale/pt.json b/packages/components/src/locale/pt.json index 3fdee5dea5a..1bcf5f81a8c 100644 --- a/packages/components/src/locale/pt.json +++ b/packages/components/src/locale/pt.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "PREÇO", "form__price_volatility": "Volatilidade dos preços", "form__price_volatility_desc": "Receba notificações de volatilidade de preços para seus tokens", + "form__prioritization_fee_sol": "Taxa de priorização", "form__priority_fee": "Taxa prioritária", "form__priority_fee_booster": "🚀 Reforço de taxa prioritária", "form__priority_fee_gwei": "Taxa prioritária (Gwei)", diff --git a/packages/components/src/locale/pt_BR.json b/packages/components/src/locale/pt_BR.json index 92e6ce31957..efd0296a0c0 100644 --- a/packages/components/src/locale/pt_BR.json +++ b/packages/components/src/locale/pt_BR.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "PREÇO", "form__price_volatility": "Volatilidade de preços", "form__price_volatility_desc": "Receba notificações de volatilidade de preço para seus tokens.", + "form__prioritization_fee_sol": "Taxa de priorização", "form__priority_fee": "Taxa de prioridade", "form__priority_fee_booster": "Aumento da taxa de prioridade", "form__priority_fee_gwei": "Taxa de prioridade (Gwei)", diff --git a/packages/components/src/locale/ru.json b/packages/components/src/locale/ru.json index cfc897964cb..a13b18b1d4d 100644 --- a/packages/components/src/locale/ru.json +++ b/packages/components/src/locale/ru.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "ЦЕНА", "form__price_volatility": "Волатильность цен", "form__price_volatility_desc": "Получайте уведомления о волатильности цен на ваши токены", + "form__prioritization_fee_sol": "Плата за определение приоритета", "form__priority_fee": "Плата за приоритет", "form__priority_fee_booster": "🚀 Усилитель приоритетного платежа", "form__priority_fee_gwei": "Плата за приоритет (Gwei)", diff --git a/packages/components/src/locale/th_TH.json b/packages/components/src/locale/th_TH.json index d93c0093510..6c39fbbd94a 100644 --- a/packages/components/src/locale/th_TH.json +++ b/packages/components/src/locale/th_TH.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "ราคา", "form__price_volatility": "ความผันผวนของราคา", "form__price_volatility_desc": "รับการแจ้งเตือนความผันผวนของราคาสำหรับโทเค็นของคุณ", + "form__prioritization_fee_sol": "ค่าธรรมเนียมการจัดลำดับความสำคัญ", "form__priority_fee": "ค่าธรรมเนียมการจัดลำดับความสำคัญ", "form__priority_fee_booster": "🚀 ผู้สนับสนุนค่าธรรมเนียมลำดับความสำคัญ", "form__priority_fee_gwei": "ค่าธรรมเนียมสิทธิพิเศษ (Gwei)", diff --git a/packages/components/src/locale/uk_UA.json b/packages/components/src/locale/uk_UA.json index 2a6a637b8a2..823c51d17b5 100644 --- a/packages/components/src/locale/uk_UA.json +++ b/packages/components/src/locale/uk_UA.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "ЦІНА", "form__price_volatility": "Волатильність цін", "form__price_volatility_desc": "Отримуйте сповіщення про нестабільність цін на ваші токени", + "form__prioritization_fee_sol": "Комісія за пріоритетність", "form__priority_fee": "Плата за пріоритет", "form__priority_fee_booster": "🚀 Підвищення плати за пріоритет", "form__priority_fee_gwei": "Плата за пріоритет (Gwei)", diff --git a/packages/components/src/locale/vi.json b/packages/components/src/locale/vi.json index ae69041b511..b248d2660ce 100644 --- a/packages/components/src/locale/vi.json +++ b/packages/components/src/locale/vi.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "GIÁ BÁN", "form__price_volatility": "Biến động giá", "form__price_volatility_desc": "Nhận thông báo biến động giá cho các mã thông báo của bạn", + "form__prioritization_fee_sol": "Phí ưu tiên", "form__priority_fee": "Phí ưu tiên", "form__priority_fee_booster": "🚀 Tăng phí ưu tiên", "form__priority_fee_gwei": "Phí ưu tiên (Gwei)", diff --git a/packages/components/src/locale/zh-CN.json b/packages/components/src/locale/zh-CN.json index a73d3fcae6a..94bdd27eb11 100644 --- a/packages/components/src/locale/zh-CN.json +++ b/packages/components/src/locale/zh-CN.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "价格", "form__price_volatility": "价格波动", "form__price_volatility_desc": "接收代币的价格波动通知", + "form__prioritization_fee_sol": "优先费用", "form__priority_fee": "矿工小费", "form__priority_fee_booster": "🚀 矿工费推进器", "form__priority_fee_gwei": "矿工小费(Gwei)", diff --git a/packages/components/src/locale/zh_HK.json b/packages/components/src/locale/zh_HK.json index 446498a804c..9f6c0fdcd43 100644 --- a/packages/components/src/locale/zh_HK.json +++ b/packages/components/src/locale/zh_HK.json @@ -1686,6 +1686,7 @@ "form__price_uppercase": "價格", "form__price_volatility": "價格波動", "form__price_volatility_desc": "接收代幣價格波動通知", + "form__prioritization_fee_sol": "優先費用", "form__priority_fee": "礦工小費", "form__priority_fee_booster": "🚀 礦工費推進器", "form__priority_fee_gwei": "礦工小費(Gwei)", diff --git a/packages/engine/src/vaults/impl/sol/Vault.ts b/packages/engine/src/vaults/impl/sol/Vault.ts index 0b32a424c32..8261ce070ab 100644 --- a/packages/engine/src/vaults/impl/sol/Vault.ts +++ b/packages/engine/src/vaults/impl/sol/Vault.ts @@ -29,7 +29,6 @@ import { import { ComputeBudgetInstruction, ComputeBudgetProgram, - MessageAccountKeys, PublicKey, SYSVAR_INSTRUCTIONS_PUBKEY, SystemInstruction, @@ -434,7 +433,8 @@ export default class Vault extends VaultBase { const publicKey = new PublicKey(address); if ( PublicKey.isOnCurve(address) || - PublicKey.isOnCurve(publicKey.encode()) + PublicKey.isOnCurve(publicKey.encode()) || + bs58.decode(address).length === 32 ) { return Promise.resolve(address); } @@ -487,12 +487,45 @@ export default class Vault extends VaultBase { } // Account related methods - - override attachFeeInfoToEncodedTx(params: { + override async attachFeeInfoToEncodedTx(params: { encodedTx: IEncodedTx; feeInfoValue: IFeeInfoUnit; }): Promise { - return Promise.resolve(params.encodedTx); + const { encodedTx, feeInfoValue } = params; + const { computeUnitPrice } = feeInfoValue; + + if (isNil(computeUnitPrice)) { + return Promise.resolve(encodedTx); + } + + let isComputeUnitPriceExist = false; + const nativeTx: Transaction = await this.helper.parseToNativeTx(encodedTx); + const prioritizationFeeInstruction = + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: Number(computeUnitPrice), + }); + + for (let i = 0; i < nativeTx.instructions.length; i += 1) { + const instruction = nativeTx.instructions[i]; + if ( + instruction.programId.toString() === + ComputeBudgetProgram.programId.toString() + ) { + const { microLamports } = + ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction); + if (!isNil(microLamports)) { + nativeTx.instructions[i] = prioritizationFeeInstruction; + isComputeUnitPriceExist = true; + break; + } + } + } + + if (!isComputeUnitPriceExist) { + nativeTx.add(prioritizationFeeInstruction); + } + + return bs58.encode(nativeTx.serialize({ requireAllSignatures: false })); } override async decodeTx( @@ -1042,65 +1075,6 @@ export default class Vault extends VaultBase { const nativeTx = await this.helper.parseToNativeTx(encodedTx); - // add priority fees to DApp tx by default - try { - if (options.type === IEncodedTxUpdateType.priorityFees) { - const isVersionedTransaction = nativeTx instanceof VersionedTransaction; - let instructions: TransactionInstruction[] = []; - let unitPrice; - let transactionMessage; - if (isVersionedTransaction) { - transactionMessage = TransactionMessage.decompile(nativeTx.message); - instructions = transactionMessage.instructions; - } else { - instructions = nativeTx.instructions; - } - - // try to find if the transaction has already set the compute unit price(priority fee) - try { - for (const instruction of instructions) { - unitPrice = - ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction); - } - } catch { - // pass - } - - // if not set, add the compute unit price(priority fee) to the transaction - if (isNil(unitPrice)) { - const client = await this.getClient(); - const accountAddress = await this.getAccountAddress(); - const prioritizationFee = await client.getRecentMaxPrioritizationFees( - [accountAddress], - ); - - const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: Math.max(MIN_PRIORITY_FEE, prioritizationFee), - }); - - if (isVersionedTransaction) { - transactionMessage?.instructions.push(addPriorityFee); - } else { - (nativeTx as Transaction).add(addPriorityFee); - } - } - - if (isVersionedTransaction) { - return bs58.encode( - new VersionedTransaction( - (transactionMessage as TransactionMessage).compileToV0Message(), - ).serialize(), - ); - } - - return bs58.encode( - (nativeTx as Transaction).serialize({ requireAllSignatures: false }), - ); - } - } catch (e) { - return encodedTx; - } - const nativeTxForUpdateTransfer = nativeTx as Transaction; const [instruction] = nativeTxForUpdateTransfer.instructions; // max native token transfer update @@ -1258,7 +1232,6 @@ export default class Vault extends VaultBase { const nativeTx = (await this.helper.parseToNativeTx( encodedTx, )) as Transaction; - const client = await this.getClient(); return { inputs: [], @@ -1317,19 +1290,58 @@ export default class Vault extends VaultBase { return client.getFeePricePerUnit(); } - override async fetchFeeInfo(encodedTx: IEncodedTxSol): Promise { + override async fetchFeeInfo( + encodedTx: IEncodedTxSol, + _: boolean | undefined, + specifiedFeeRate: string, + ): Promise { const client = await this.getClient(); - const nativeTx = await this.helper.parseToNativeTx(encodedTx); + let nativeTx: INativeTxSol = await this.helper.parseToNativeTx(encodedTx); const isVersionedTransaction = nativeTx instanceof VersionedTransaction; let message = ''; - if (isVersionedTransaction) { - message = Buffer.from(nativeTx.message.serialize()).toString('base64'); + let instructions: TransactionInstruction[] = []; + let transactionMessage; + let computeUnitPrice = '0'; + if (isNil(specifiedFeeRate)) { + try { + if (isVersionedTransaction) { + nativeTx = nativeTx as VersionedTransaction; + message = Buffer.from(nativeTx.message.serialize()).toString( + 'base64', + ); + transactionMessage = TransactionMessage.decompile(nativeTx.message); + instructions = transactionMessage.instructions; + } else { + nativeTx = nativeTx as Transaction; + message = nativeTx.compileMessage().serialize().toString('base64'); + instructions = nativeTx.instructions; + } + + for (const instruction of instructions) { + if ( + instruction.programId.toString() === + ComputeBudgetProgram.programId.toString() + ) { + const { microLamports } = + ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction); + computeUnitPrice = microLamports.toString(); + break; + } + } + } catch { + // pass + } } else { - message = (nativeTx as Transaction) - .compileMessage() - .serialize() - .toString('base64'); + const encodedTxWithFee = await this.attachFeeInfoToEncodedTx({ + encodedTx, + feeInfoValue: { computeUnitPrice: specifiedFeeRate }, + }); + nativeTx = (await this.helper.parseToNativeTx( + encodedTxWithFee, + )) as Transaction; + message = nativeTx.compileMessage().serialize().toString('base64'); } + const [network, feePerSig] = await Promise.all([ this.getNetwork(), client.getFeesForMessage(message), @@ -1340,6 +1352,7 @@ export default class Vault extends VaultBase { ]; return { + isSolChain: true, nativeSymbol: network.symbol, nativeDecimals: network.decimals, feeSymbol: network.feeSymbol, @@ -1349,7 +1362,7 @@ export default class Vault extends VaultBase { limit: (nativeTx as Transaction).signatures.length.toString(), prices, defaultPresetIndex: '0', - + computeUnitPrice, tx: null, // Must be null if network not support feeInTx }; } diff --git a/packages/engine/src/vaults/impl/sol/settings.ts b/packages/engine/src/vaults/impl/sol/settings.ts index 9766a160439..ba71614c35a 100644 --- a/packages/engine/src/vaults/impl/sol/settings.ts +++ b/packages/engine/src/vaults/impl/sol/settings.ts @@ -9,7 +9,7 @@ import type { AccountNameInfo } from '../../../types/network'; import type { IVaultSettings } from '../../types'; const settings: IVaultSettings = Object.freeze({ - feeInfoEditable: false, + feeInfoEditable: true, privateKeyExportEnabled: true, tokenEnabled: true, txCanBeReplaced: false, diff --git a/packages/engine/src/vaults/impl/sol/utils.ts b/packages/engine/src/vaults/impl/sol/utils.ts index 1fd674942b5..4699712c452 100644 --- a/packages/engine/src/vaults/impl/sol/utils.ts +++ b/packages/engine/src/vaults/impl/sol/utils.ts @@ -14,7 +14,7 @@ export const TOKEN_AUTH_RULES_ID = new PublicKey( 'auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg', ); -export const MIN_PRIORITY_FEE = 1000; +export const MIN_PRIORITY_FEE = 100000; export function metadataAddress(mint: PublicKey): PublicKey { return PublicKey.findProgramAddressSync( diff --git a/packages/engine/src/vaults/types.ts b/packages/engine/src/vaults/types.ts index 7fb586c9c17..eaf136fb6ce 100644 --- a/packages/engine/src/vaults/types.ts +++ b/packages/engine/src/vaults/types.ts @@ -318,7 +318,7 @@ export enum IEncodedTxUpdateType { cancel = 'cancel', advancedSettings = 'advancedSettings', customData = 'customData', - priorityFees = 'priorityFees', + prioritizationFee = 'prioritizationFee', } export type IEncodedTxUpdateOptions = { @@ -349,6 +349,9 @@ export type IFeeInfoUnit = { isBtcForkChain?: boolean; btcFee?: number; feeRate?: string; + // sol prioritization fees + computeUnitPrice?: string; + isSolChain?: boolean; }; // TODO rename to IFeeInfoMeta export type IFeeInfo = { @@ -378,6 +381,9 @@ export type IFeeInfo = { } | null; isBtcForkChain?: boolean; feeList?: number[]; + // for sol prioritization fees + isSolChain?: boolean; + computeUnitPrice?: string; }; export type IFeeInfoSelectedType = 'preset' | 'custom'; export type IFeeInfoSelected = { diff --git a/packages/engine/src/vaults/utils/feeInfoUtils.ts b/packages/engine/src/vaults/utils/feeInfoUtils.ts index 18ce32e6ac4..2aff5659940 100644 --- a/packages/engine/src/vaults/utils/feeInfoUtils.ts +++ b/packages/engine/src/vaults/utils/feeInfoUtils.ts @@ -38,6 +38,17 @@ export const getSelectedFeeInfoUnit = ({ }; } + if (info.isSolChain) { + return { + eip1559: false, + isSolChain: true, + computeUnitPrice: info.computeUnitPrice, + price: priceInfo as string, + limit: info.limit, + limitForDisplay: info.limitForDisplay ?? info.limit, + }; + } + return { eip1559: false, price: priceInfo as string, diff --git a/packages/kit/src/views/Send/modals/SendConfirmFromDapp.tsx b/packages/kit/src/views/Send/modals/SendConfirmFromDapp.tsx index 6d727ca3728..7d1cd3eacc3 100644 --- a/packages/kit/src/views/Send/modals/SendConfirmFromDapp.tsx +++ b/packages/kit/src/views/Send/modals/SendConfirmFromDapp.tsx @@ -4,10 +4,8 @@ import { StackActions, useNavigation } from '@react-navigation/native'; import { AppState } from 'react-native'; import type { IEncodedTxBtc } from '@onekeyhq/engine/src/vaults/impl/btc/types'; -import { IEncodedTxUpdateType } from '@onekeyhq/engine/src/vaults/types'; import { IMPL_SOL } from '@onekeyhq/shared/src/engine/engineConsts'; -import backgroundApiProxy from '../../../background/instance/backgroundApiProxy'; import { getActiveWalletAccount } from '../../../hooks'; import useDappParams from '../../../hooks/useDappParams'; import { useReduxReady } from '../../../hooks/useReduxReady'; @@ -39,7 +37,7 @@ export function SendConfirmFromDapp() { networkId: dappNetworkId, } = useDappParams(); - const navigateToSendConfirm = useCallback(async () => { + const navigateToSendConfirm = useCallback(() => { let action: any; // TODO get network and account from dapp connections const { networkId, accountId, networkImpl } = getActiveWalletAccount(); @@ -47,27 +45,14 @@ export function SendConfirmFromDapp() { // alert(JSON.stringify({ networkId, accountId, isReady })); // TODO providerName if (encodedTx) { - let newEncodedTx = encodedTx; - const isPsbt = (newEncodedTx as IEncodedTxBtc).psbtHex; - - if (networkImpl === IMPL_SOL) { - newEncodedTx = await backgroundApiProxy.engine.updateEncodedTx({ - accountId, - networkId, - encodedTx, - payload: {}, - options: { - type: IEncodedTxUpdateType.priorityFees, - }, - }); - } + const isPsbt = (encodedTx as IEncodedTxBtc).psbtHex; const params: SendConfirmParams = { networkId: dappNetworkId ?? networkId, accountId, sourceInfo, - encodedTx: newEncodedTx, - feeInfoEditable: !isPsbt, + encodedTx, + feeInfoEditable: !(isPsbt || networkImpl === IMPL_SOL), feeInfoUseFeeInTx: true, ignoreFetchFeeCalling: !!isPsbt, signOnly, diff --git a/packages/kit/src/views/Send/modals/SendEditFee/SendEditFee.tsx b/packages/kit/src/views/Send/modals/SendEditFee/SendEditFee.tsx index e61f110e1ab..32d53eab73d 100644 --- a/packages/kit/src/views/Send/modals/SendEditFee/SendEditFee.tsx +++ b/packages/kit/src/views/Send/modals/SendEditFee/SendEditFee.tsx @@ -47,6 +47,7 @@ import { import { useBtcCustomFee } from '../../utils/useBtcCustomFee'; import { useCustomFee } from '../../utils/useCustomFee'; import { useFeeInfoPayload } from '../../utils/useFeeInfoPayload'; +import { useSolCustomFee } from '../../utils/useSolCustomFee'; import { SendEditFeeCustomForm } from './SendEditFeeCustomForm'; import { SendEditFeeStandardForm } from './SendEditFeeStandardForm'; @@ -151,6 +152,7 @@ function ScreenSendEditFee({ ...rest }) { const isEIP1559Fee = feeInfoPayload?.info?.eip1559; const isBtcForkChain = feeInfoPayload?.info?.isBtcForkChain; + const isSolChain = feeInfoPayload?.info?.isSolChain; useEffect(() => { debugLogger.sendTx.info('SendEditFee >>>> ', feeInfoPayload, encodedTx); @@ -193,6 +195,7 @@ function ScreenSendEditFee({ ...rest }) { ); const watchBtcFeeRate = watch('feeRate'); + const watchComputeUnitPrice = watch('computeUnitPrice'); const { btcTxFee } = useBtcCustomFee({ networkId, accountId, @@ -200,6 +203,13 @@ function ScreenSendEditFee({ ...rest }) { feeRate: watchBtcFeeRate, feeType: currentFeeType, }); + const { solLimit, solPrice } = useSolCustomFee({ + networkId, + accountId, + computeUnitPrice: watchComputeUnitPrice, + feeType: currentFeeType, + encodedTx, + }); const { customFee, updateCustomFee } = useCustomFee(networkId); const onSubmit = handleSubmit(async (data) => { @@ -231,6 +241,7 @@ function ScreenSendEditFee({ ...rest }) { ? { price1559: priceInfo as EIP1559Fee } : { price: priceInfo as string }), ...(isBtcForkChain ? { feeRate: data.feeRate } : {}), + ...(isSolChain ? { computeUnitPrice: data.computeUnitPrice } : {}), }; if (type === 'custom') { @@ -254,11 +265,26 @@ function ScreenSendEditFee({ ...rest }) { } } + if (isSolChain) { + feeInfoSelected.custom.isSolChain = isSolChain; + feeInfoSelected.custom.limit = solLimit; + feeInfoSelected.custom.limitForDisplay = solLimit; + feeInfoSelected.custom.price = solPrice; + } + setCurrentCustom(feeInfoSelected.custom); } if (feeType === ESendEditFeeTypes.advanced) { - updateCustomFee(saveCustom ? feeInfoSelected.custom : null); + if (saveCustom) { + const customFeeToUpdate = { + ...custom, + feeRate: isSolChain ? custom.computeUnitPrice : custom.feeRate, + }; + updateCustomFee(customFeeToUpdate); + } else { + updateCustomFee(null); + } } debugLogger.sendTx.info('SendEditFee Confirm >>>> ', feeInfoSelected); @@ -372,11 +398,21 @@ function ScreenSendEditFee({ ...rest }) { ); } } + if (isSolChain) { + if (feeInfoValue.computeUnitPrice || feeInfoValue.feeRate) { + setValue( + 'computeUnitPrice', + feeInfoValue.computeUnitPrice || feeInfoValue.feeRate || '0', + ); + } + } + setValue('gasLimit', new BigNumber(limit ?? 0).toFixed()); }, [ isEIP1559Fee, isBtcForkChain, + isSolChain, setValue, autoConfirmAfterFeeSaved, feeInfoPayload?.info.feeDecimals, @@ -396,13 +432,23 @@ function ScreenSendEditFee({ ...rest }) { if (radioValue === 'custom' && currentCustom) { setFormValuesFromFeeInfo(currentCustom); } else { - const { limit, price, price1559 } = getSelectedFeeInfoUnit({ - info: feeInfoPayload.info, - index: radioValue, - }); + const { limit, price, price1559, eip1559, feeRate, computeUnitPrice } = + getSelectedFeeInfoUnit({ + info: feeInfoPayload.info, + index: radioValue, + }); if (!currentCustom) { - setFormValuesFromFeeInfo({ price, price1559, limit }); + setFormValuesFromFeeInfo({ + price, + price1559, + limit, + isBtcForkChain, + isSolChain, + eip1559, + feeRate, + computeUnitPrice, + }); } } }, [ @@ -411,7 +457,9 @@ function ScreenSendEditFee({ ...rest }) { feeInfoPayload, feeType, getSelectedFeeInfoUnit, + isBtcForkChain, isEIP1559Fee, + isSolChain, radioValue, setFormValuesFromFeeInfo, setValue, diff --git a/packages/kit/src/views/Send/modals/SendEditFee/SendEditFeeCustomForm.tsx b/packages/kit/src/views/Send/modals/SendEditFee/SendEditFeeCustomForm.tsx index 4ef4704ac0e..ddedbbc6a96 100644 --- a/packages/kit/src/views/Send/modals/SendEditFee/SendEditFeeCustomForm.tsx +++ b/packages/kit/src/views/Send/modals/SendEditFee/SendEditFeeCustomForm.tsx @@ -51,6 +51,7 @@ import { useBtcCustomFee, useBtcCustomFeeForm, } from '../../utils/useBtcCustomFee'; +import { useSolCustomFee } from '../../utils/useSolCustomFee'; import type { ISendEditFeeValues } from '../../types'; import type { UseFormReturn } from 'react-hook-form'; @@ -121,6 +122,7 @@ export function SendEditFeeCustomForm(props: ICustomFeeFormProps) { const nativeSymbol = feeInfoPayload?.info?.nativeSymbol || ''; const isEIP1559Fee = feeInfoPayload?.info?.eip1559; const isBtcForkChain = feeInfoPayload?.info.isBtcForkChain; + const isSolChain = feeInfoPayload?.info.isSolChain; const isSmallScreen = useIsVerticalLayout(); const [lastPresetFeeInfo, setLastPresetFeeInfo] = useState( @@ -165,6 +167,13 @@ export function SendEditFeeCustomForm(props: ICustomFeeFormProps) { feeRate: watchFeeRate, feeType: 'custom', }); + const { solLimit, solPrice } = useSolCustomFee({ + networkId, + accountId, + computeUnitPrice: watch('computeUnitPrice'), + feeType: 'custom', + encodedTx, + }); const handleBoosterOnChange = useCallback( (value) => { @@ -192,7 +201,7 @@ export function SendEditFeeCustomForm(props: ICustomFeeFormProps) { const customFeeOverview = useMemo(() => { if (!formValues) return null; - const limit = formValues.gasLimit; + let limit = formValues.gasLimit; let price = null; if (isEIP1559Fee) { price = { @@ -200,6 +209,9 @@ export function SendEditFeeCustomForm(props: ICustomFeeFormProps) { maxFeePerGas: formValues?.maxFeePerGas, maxPriorityFeePerGas: formValues?.maxPriorityFeePerGas, }; + } else if (isSolChain && solPrice && solLimit) { + price = solPrice; + limit = solLimit; } else { price = formValues?.gasPrice; } @@ -214,11 +226,14 @@ export function SendEditFeeCustomForm(props: ICustomFeeFormProps) { /> ); }, [ - accountId, - feeInfoPayload?.info, formValues, isEIP1559Fee, + isSolChain, + solPrice, + solLimit, + accountId, networkId, + feeInfoPayload?.info, btcTxFee, ]); @@ -299,6 +314,26 @@ export function SendEditFeeCustomForm(props: ICustomFeeFormProps) { ); } + if (isSolChain) { + return ( +
+ + + +
+ ); + } + return (
{isEIP1559Fee && ( @@ -676,6 +711,7 @@ export function SendEditFeeCustomForm(props: ICustomFeeFormProps) { feeInfoPayload?.info.feeDecimals, feeInfoPayload?.info?.limit, isBtcForkChain, + isSolChain, isEIP1559Fee, feeSymbol, control, diff --git a/packages/kit/src/views/Send/types.ts b/packages/kit/src/views/Send/types.ts index 6e787fb8fdb..20c6b7820c3 100644 --- a/packages/kit/src/views/Send/types.ts +++ b/packages/kit/src/views/Send/types.ts @@ -354,6 +354,7 @@ export type ISendEditFeeValues = { baseFee: string; totalFee: string; feeRate: string; + computeUnitPrice: string; }; export type BatchSendConfirmPayloadInfo = { diff --git a/packages/kit/src/views/Send/utils/useFeeInfoPayload.tsx b/packages/kit/src/views/Send/utils/useFeeInfoPayload.tsx index 87264449f93..fa6fd6d5cea 100644 --- a/packages/kit/src/views/Send/utils/useFeeInfoPayload.tsx +++ b/packages/kit/src/views/Send/utils/useFeeInfoPayload.tsx @@ -22,6 +22,7 @@ import { calculateTotalFeeRange, getSelectedFeeInfoUnit, } from '@onekeyhq/engine/src/vaults/utils/feeInfoUtils'; +import { IMPL_SOL } from '@onekeyhq/shared/src/engine/engineConsts'; import debugLogger from '@onekeyhq/shared/src/logger/debugLogger'; // eslint-disable-next-line @typescript-eslint/no-unused-vars import platformEnv from '@onekeyhq/shared/src/platformEnv'; @@ -117,7 +118,10 @@ export function useFeeInfoPayload({ let shouldFetch = !ignoreFetchFeeCalling && (!feeInfoSelected || feeInfoSelected?.type === 'preset'); - if (fetchAnyway && !ignoreFetchFeeCalling) { + if ( + (fetchAnyway && !ignoreFetchFeeCalling) || + network?.impl === IMPL_SOL + ) { shouldFetch = true; } @@ -181,17 +185,19 @@ export function useFeeInfoPayload({ info.prices = [price1559]; info.tx = { eip1559: true, - limit, + limit: limit || info.limit, price1559, }; } else if (gasPrice) { + info.eip1559 = false; const price = new BigNumber(gasPrice ?? 0) .shiftedBy(-(feeDecimals ?? 0)) .toFixed(); info.limit = limit || info.limit; info.prices = [price]; info.tx = { - limit, + eip1559: false, + limit: limit || info.limit, price, }; } else if (limit) { diff --git a/packages/kit/src/views/Send/utils/useSolCustomFee.ts b/packages/kit/src/views/Send/utils/useSolCustomFee.ts new file mode 100644 index 00000000000..dcf8a55a1aa --- /dev/null +++ b/packages/kit/src/views/Send/utils/useSolCustomFee.ts @@ -0,0 +1,48 @@ +import { useEffect, useState } from 'react'; + +import type { + IEncodedTx, + IFeeInfoSelectedType, +} from '@onekeyhq/engine/src/vaults/types'; + +import backgroundApiProxy from '../../../background/instance/backgroundApiProxy'; +import { useDebounce } from '../../../hooks'; + +export function useSolCustomFee({ + networkId, + accountId, + computeUnitPrice, + feeType, + encodedTx, +}: { + networkId: string; + accountId: string; + computeUnitPrice: string; + feeType: IFeeInfoSelectedType; + encodedTx?: IEncodedTx; +}) { + const [solLimit, setSolLimit] = useState(); + const [solPrice, setSolPrice] = useState(); + const debounceComputeUnitPrice = useDebounce(computeUnitPrice, 300); + + useEffect(() => { + if (encodedTx && debounceComputeUnitPrice && feeType === 'custom') { + backgroundApiProxy.engine + .fetchFeeInfo({ + networkId, + accountId, + encodedTx, + specifiedFeeRate: debounceComputeUnitPrice, + }) + .then((feeInfo) => { + setSolLimit(feeInfo.limit); + setSolPrice((feeInfo.prices as string[])[0]); + }); + } + }, [feeType, networkId, accountId, encodedTx, debounceComputeUnitPrice]); + + return { + solLimit, + solPrice, + }; +}