UNPKG

@ledgerhq/coin-ton

Version:
281 lines 10.6 kB
import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; import { formatTransactionStatus } from "@ledgerhq/coin-framework/formatters"; import { fromTransactionCommonRaw, fromTransactionStatusRawCommon as fromTransactionStatusRaw, toTransactionCommonRaw, toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import BigNumber from "bignumber.js"; import { Address, Cell } from "@ton/core"; export const formatTransaction = ({ recipient, useAllAmount, amount }, account) => ` SEND ${useAllAmount ? "MAX" : amount.isZero() ? "" : " " + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, })} TO ${recipient}`; const getCellOrBuffer = (customPayload) => { if (!customPayload) return null; try { return Cell.fromBase64(customPayload); } catch { return Buffer.from(customPayload, "hex"); } }; const safeToBigInt = (value) => { return value ? BigInt(value) : null; }; const safeCellFromBase64 = (value) => { return value ? Cell.fromBase64(value) : null; }; const fromRecordRaw = (record) => { if (record.type === "wallet") { return { type: record.type, value: record.value ? { address: Address.parse(record.value.address), capabilities: record.value.capabilities, } : null, }; } return { type: record.type, key: Buffer.from(record.key, "hex"), value: safeCellFromBase64(record.value), }; }; const fromTransactionPayloadRaw = (payload) => { switch (payload.type) { case "unsafe": return { type: payload.type, message: Cell.fromBase64(payload.message), }; case "jetton-transfer": return { type: payload.type, queryId: safeToBigInt(payload.queryId), amount: BigInt(payload.amount), destination: Address.parse(payload.destination), responseDestination: Address.parse(payload.responseDestination), customPayload: safeCellFromBase64(payload.customPayload), forwardAmount: BigInt(payload.forwardAmount), forwardPayload: safeCellFromBase64(payload.forwardPayload), knownJetton: payload.knownJetton, }; case "nft-transfer": return { type: payload.type, queryId: safeToBigInt(payload.queryId), newOwner: Address.parse(payload.newOwner), responseDestination: Address.parse(payload.responseDestination), customPayload: safeCellFromBase64(payload.customPayload), forwardAmount: BigInt(payload.forwardAmount), forwardPayload: safeCellFromBase64(payload.forwardPayload), }; case "jetton-burn": return { type: payload.type, queryId: safeToBigInt(payload.queryId), amount: BigInt(payload.amount), responseDestination: Address.parse(payload.responseDestination), customPayload: getCellOrBuffer(payload.customPayload), }; case "add-whitelist": case "single-nominator-change-validator": return { type: payload.type, queryId: safeToBigInt(payload.queryId), address: Address.parse(payload.address), }; case "single-nominator-withdraw": return { type: payload.type, queryId: safeToBigInt(payload.queryId), amount: BigInt(payload.amount), }; case "tonstakers-deposit": return { type: payload.type, queryId: safeToBigInt(payload.queryId), appId: safeToBigInt(payload.appId), }; case "vote-for-proposal": return { type: payload.type, queryId: safeToBigInt(payload.queryId), votingAddress: Address.parse(payload.votingAddress), expirationDate: payload.expirationDate, vote: payload.vote, needConfirmation: payload.needConfirmation, }; case "change-dns-record": return { type: payload.type, queryId: safeToBigInt(payload.queryId), record: fromRecordRaw(payload.record), }; case "token-bridge-pay-swap": return { type: payload.type, queryId: safeToBigInt(payload.queryId), swapId: Buffer.from(payload.swapId, "hex"), }; case "comment": return payload; default: { const exhaustiveCheck = payload; // https://www.typescriptlang.org/docs/handbook/2/narrowing.html#exhaustiveness-checking return exhaustiveCheck; } } }; export const fromTransactionRaw = (tr) => { const common = fromTransactionCommonRaw(tr); return { ...common, family: tr.family, fees: new BigNumber(tr.fees), comment: tr.comment, payload: tr.payload ? fromTransactionPayloadRaw(tr.payload) : undefined, }; }; const safeFromBigInt = (value) => { return typeof value === "bigint" ? value.toString() : null; }; const safeBocToString = (value) => { return value ? value.toBoc().toString("base64") : null; }; const safeBocOrBufferToString = (value) => { if (value && "toBoc" in value) { return value.toBoc().toString("base64"); } return value ? value.toString("hex") : null; }; const fromRecord = (record) => { if (record.type === "wallet") { return { type: record.type, value: record.value ? { address: record.value.address.toRawString(), capabilities: record.value.capabilities, } : null, }; } return { type: record.type, key: record.key.toString("hex"), value: safeBocToString(record.value), }; }; const toTransactionPayloadRaw = (payload) => { switch (payload.type) { case "unsafe": return { type: payload.type, message: payload.message.toBoc().toString("base64"), }; case "jetton-transfer": return { type: payload.type, queryId: safeFromBigInt(payload.queryId), amount: payload.amount.toString(), destination: payload.destination.toRawString(), responseDestination: payload.responseDestination.toRawString(), customPayload: safeBocToString(payload.customPayload), forwardAmount: payload.forwardAmount.toString(), forwardPayload: safeBocToString(payload.forwardPayload), knownJetton: payload.knownJetton, }; case "nft-transfer": return { type: payload.type, queryId: safeFromBigInt(payload.queryId), newOwner: payload.newOwner.toRawString(), responseDestination: payload.responseDestination.toRawString(), customPayload: safeBocToString(payload.customPayload), forwardAmount: payload.forwardAmount.toString(), forwardPayload: safeBocToString(payload.forwardPayload), }; case "jetton-burn": return { type: payload.type, queryId: safeFromBigInt(payload.queryId), amount: payload.amount.toString(), responseDestination: payload.responseDestination.toRawString(), customPayload: safeBocOrBufferToString(payload.customPayload), }; case "add-whitelist": case "single-nominator-change-validator": return { type: payload.type, queryId: safeFromBigInt(payload.queryId), address: payload.address.toRawString(), }; case "single-nominator-withdraw": return { type: payload.type, queryId: safeFromBigInt(payload.queryId), amount: payload.amount.toString(), }; case "tonstakers-deposit": return { type: payload.type, queryId: safeFromBigInt(payload.queryId), appId: safeFromBigInt(payload.appId), }; case "vote-for-proposal": return { type: payload.type, queryId: safeFromBigInt(payload.queryId), votingAddress: payload.votingAddress.toRawString(), expirationDate: payload.expirationDate, vote: payload.vote, needConfirmation: payload.needConfirmation, }; case "change-dns-record": return { type: payload.type, queryId: safeFromBigInt(payload.queryId), record: fromRecord(payload.record), }; case "token-bridge-pay-swap": return { type: payload.type, queryId: safeFromBigInt(payload.queryId), swapId: payload.swapId.toString("hex"), }; case "comment": return payload; default: { const exhaustiveCheck = payload; // https://www.typescriptlang.org/docs/handbook/2/narrowing.html#exhaustiveness-checking return exhaustiveCheck; } } }; export const toTransactionRaw = (transaction) => { const common = toTransactionCommonRaw(transaction); return { ...common, family: transaction.family, amount: transaction.amount.toFixed(), fees: transaction.fees.toFixed(), comment: transaction.comment, payload: transaction.payload ? toTransactionPayloadRaw(transaction.payload) : undefined, }; }; export default { formatTransaction, fromTransactionRaw, toTransactionRaw, fromTransactionStatusRaw, toTransactionStatusRaw, formatTransactionStatus, }; //# sourceMappingURL=transaction.js.map