From 0ed3598cb99fad9adfff5eeedd969c7b7305d583 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 11 Jan 2024 16:39:43 +0300 Subject: [PATCH] feat: add burn operation for solana tokens --- .../OperationsList/ConfirmationCheck.tsx | 1 + .../static/i18n/en/app.json | 3 ++- libs/coin-framework/src/operation.ts | 1 + .../solana/api/chain/program/constants.ts | 1 + .../solana/api/chain/program/parser.ts | 18 +++++++++++++++++- .../src/families/solana/js-synchronization.ts | 15 ++++++++++++++- .../packages/types-live/src/operation.ts | 4 +++- 7 files changed, 39 insertions(+), 4 deletions(-) diff --git a/apps/ledger-live-desktop/src/renderer/components/OperationsList/ConfirmationCheck.tsx b/apps/ledger-live-desktop/src/renderer/components/OperationsList/ConfirmationCheck.tsx index 1f339b85c8bf..f4577603f250 100644 --- a/apps/ledger-live-desktop/src/renderer/components/OperationsList/ConfirmationCheck.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/OperationsList/ConfirmationCheck.tsx @@ -120,6 +120,7 @@ const iconsComponent = { STAKE: IconDelegate, UNSTAKE: IconUndelegate, WITHDRAW_UNSTAKED: IconCoins, + BURN: IconTrash, }; class ConfirmationCheck extends PureComponent<{ marketColor: string; diff --git a/apps/ledger-live-desktop/static/i18n/en/app.json b/apps/ledger-live-desktop/static/i18n/en/app.json index bbbd8bd2cb3d..d0271257be44 100644 --- a/apps/ledger-live-desktop/static/i18n/en/app.json +++ b/apps/ledger-live-desktop/static/i18n/en/app.json @@ -192,7 +192,8 @@ "STAKE": "Staked", "UNSTAKE": "Unstaked", "WITHDRAW_UNSTAKED": "Withdrawn", - "SENDING": "Sending" + "SENDING": "Sending", + "BURN": "Burned" }, "edit": { "title": "Speed up or Cancel", diff --git a/libs/coin-framework/src/operation.ts b/libs/coin-framework/src/operation.ts index ca27a99a5b01..889cff983ff0 100644 --- a/libs/coin-framework/src/operation.ts +++ b/libs/coin-framework/src/operation.ts @@ -173,6 +173,7 @@ export function getOperationAmountNumber(op: Operation): BigNumber { case "OPT_OUT": case "SLASH": case "LOCK": + case "BURN": return op.value.negated(); case "FREEZE": diff --git a/libs/ledger-live-common/src/families/solana/api/chain/program/constants.ts b/libs/ledger-live-common/src/families/solana/api/chain/program/constants.ts index 445ceddaf97c..7a4ed2b2452e 100644 --- a/libs/ledger-live-common/src/families/solana/api/chain/program/constants.ts +++ b/libs/ledger-live-common/src/families/solana/api/chain/program/constants.ts @@ -6,5 +6,6 @@ export const PARSED_PROGRAMS = { STAKE: "stake", SYSTEM: "system", SPL_TOKEN: "spl-token", + COMPUTE_BUDGET: "compute-budget", VOTE: "vote", } as const; diff --git a/libs/ledger-live-common/src/families/solana/api/chain/program/parser.ts b/libs/ledger-live-common/src/families/solana/api/chain/program/parser.ts index b6029b8b17cc..94c12ade5256 100644 --- a/libs/ledger-live-common/src/families/solana/api/chain/program/parser.ts +++ b/libs/ledger-live-common/src/families/solana/api/chain/program/parser.ts @@ -1,4 +1,8 @@ -import { ParsedInstruction, PartiallyDecodedInstruction } from "@solana/web3.js"; +import { + ParsedInstruction, + PartiallyDecodedInstruction, + ComputeBudgetProgram, +} from "@solana/web3.js"; import { parseSplTokenInstruction, TokenInstructionDescriptor } from "../instruction/token"; import { PARSED_PROGRAMS } from "./constants"; import { @@ -35,6 +39,11 @@ type ParsedProgram = title: string; instruction: TokenInstructionDescriptor; } + | { + program: "compute-budget"; + title: string; + instruction: undefined; + } | { program: "unknown"; title: "Unknown"; @@ -96,6 +105,13 @@ export const parse = (ix: ParsedInstruction | PartiallyDecodedInstruction): Pars } } + if (ComputeBudgetProgram.programId.equals(ix.programId)) { + return { + program: PARSED_PROGRAMS["COMPUTE_BUDGET"], + title: "Compute Budget", + instruction: undefined, // system instruction, doesn't make sense to parse in LL + }; + } return unknown(); }; diff --git a/libs/ledger-live-common/src/families/solana/js-synchronization.ts b/libs/ledger-live-common/src/families/solana/js-synchronization.ts index 55238bebbff3..9600c588faa4 100644 --- a/libs/ledger-live-common/src/families/solana/js-synchronization.ts +++ b/libs/ledger-live-common/src/families/solana/js-synchronization.ts @@ -609,7 +609,20 @@ function getTokenAccOperationType({ tx: ParsedTransaction; delta: BigNumber; }): OperationType { - const [mainIx, ...otherIxs] = parseTxInstructions(tx); + const parsedIxs = parseTxInstructions(tx); + const [mainIx, ...otherIxs] = parsedIxs; + + if (parsedIxs.length === 3) { + const [first, second, third] = parsedIxs; + if ( + first.program === "compute-budget" && + second.program === "compute-budget" && + third.program === "spl-token" && + third.instruction.type === "burn" + ) { + return "BURN"; + } + } if (mainIx !== undefined && otherIxs.length === 0) { switch (mainIx.program) { diff --git a/libs/ledgerjs/packages/types-live/src/operation.ts b/libs/ledgerjs/packages/types-live/src/operation.ts index 3d43b7ec68a0..4075c5440728 100644 --- a/libs/ledgerjs/packages/types-live/src/operation.ts +++ b/libs/ledgerjs/packages/types-live/src/operation.ts @@ -51,7 +51,9 @@ export type OperationType = // NEAR | "STAKE" | "UNSTAKE" - | "WITHDRAW_UNSTAKED"; + | "WITHDRAW_UNSTAKED" + // SOLANA + | "BURN"; /** * An Operation is the Ledger Live abstraction of a transaction for any blockchain