import flatMap from "lodash/flatMap"; import { Transaction, Transaction as VechainTransaction } from "../types"; import type { Account, AccountLike } from "@ledgerhq/types-live"; import { MustBeVechain } from "../errors"; import { ABIContract, VIP180_ABI, VTHO_ADDRESS } from "@vechain/sdk-core"; type CliTools = { options: Array<{ name: string; type: any; desc: string; }>; inferTransactions: ( transactions: Array<{ account: AccountLike; transaction: Transaction; mainAccount: Account; }>, opts: Record, ) => Transaction[]; }; type Clauses = { to: string; data: string; value: string | number; }; const options = [ { name: "vechainCurrency", type: String, desc: 'select between sending VET or VTHO using "VET" or "VTHO" strings', }, ]; function inferTransactions( transactions: Array<{ account: AccountLike; transaction: Transaction; mainAccount: Account; }>, opts: Record, ): Transaction[] { return flatMap(transactions, ({ transaction, account }) => { let subAccountId = account.type === "Account" && account.subAccounts ? account.subAccounts[0].id : ""; if (account.type === "TokenAccount") { subAccountId = account.id; } const clauses: Array = []; if (opts.vechainCurrency === "VET") { clauses.push({ to: transaction.recipient, value: "0x" + transaction.amount.toString(16), data: "0x", }); } else if (opts.vechainCurrency === "VTHO") { clauses.push({ value: 0, to: VTHO_ADDRESS, data: ABIContract.ofAbi(VIP180_ABI) .encodeFunctionInput("transfer", [transaction.recipient, transaction.amount.toFixed()]) .toString(), }); } else { throw new MustBeVechain(); } return { ...transaction, family: "vechain", subAccountId: opts.vechainCurrency === "VTHO" ? subAccountId : "", body: { ...(transaction as VechainTransaction).body, clauses }, } as VechainTransaction; }); } export default function makeCliTools(): CliTools { return { options, inferTransactions, }; }