diff --git a/ts/sdk/cli/cli.ts b/ts/sdk/cli/cli.ts index 2ad29d99..648b50b4 100644 --- a/ts/sdk/cli/cli.ts +++ b/ts/sdk/cli/cli.ts @@ -15,7 +15,8 @@ import { withdraw, forceWithdraw, listDepositorsForVault, - managerUpdateMarginTradingEnabled + managerUpdateMarginTradingEnabled, + decodeLogs, } from "./commands"; import { Command, Option } from 'commander'; @@ -141,6 +142,11 @@ program .description("Forces the vault to send out a withdraw after the redeem period has passed") .addOption(new Option("--vault-depositor-address ", "VaultDepositor address").makeOptionMandatory(false)) .action((opts) => forceWithdraw(program, opts)); +program + .command("decode-logs") + .description("Decode program logs from a txid") + .addOption(new Option("--tx ", "Transaction hash").makeOptionMandatory(true)) + .action((opts) => decodeLogs(program, opts)); program.parseAsync().then(() => { process.exit(0); diff --git a/ts/sdk/cli/commands/decodeLogs.ts b/ts/sdk/cli/commands/decodeLogs.ts new file mode 100644 index 00000000..fc77fc6b --- /dev/null +++ b/ts/sdk/cli/commands/decodeLogs.ts @@ -0,0 +1,68 @@ +import { PublicKey } from "@solana/web3.js"; +import { + OptionValues, + Command +} from "commander"; +import { getCommandContext } from "../utils"; +import { VaultDepositorRecord } from "../../src"; +import { BN, TEN, convertToNumber, getVariant } from "@drift-labs/sdk"; +import { conversationContext } from "@slack/bolt/dist/conversation-store"; + +export const decodeLogs = async (program: Command, cmdOpts: OptionValues) => { + + let txId: string; + try { + txId = cmdOpts.tx as string; + } catch (err) { + console.error("Invalid transaction hash"); + process.exit(1); + } + if (!txId) { + console.error("Invalid transaction hash"); + process.exit(1); + } + + const { + driftVault, + driftClient, + } = await getCommandContext(program, false); + + const tx = await driftClient.connection.getParsedTransaction(txId, { + commitment: "confirmed", + maxSupportedTransactionVersion: 0, + }); + + // @ts-ignore + for (const event of driftVault.program._events._eventParser.parseLogs( + tx!.meta!.logMessages + )) { + switch (event.name) { + case "VaultDepositorRecord": + const data: VaultDepositorRecord = event.data; + + // const vault = await driftVault.getVault(data.vault); + const spotMarket = driftClient.getSpotMarketAccount(data.spotMarketIndex); + const spotPrecision = TEN.pow(new BN(spotMarket!.decimals)); + + console.log(event.name); + const date = new Date(data.ts.toNumber() * 1000); + console.log(` ts: ${date.toISOString()} (${data.ts.toNumber()})`); + console.log(` vault: ${data.vault.toBase58()}`); + console.log(` depositorAuthority: ${data.depositorAuthority.toBase58()}`); + console.log(` action: ${getVariant(data.action)}`); + console.log(` amount: ${convertToNumber(data.amount, spotPrecision)}`); + console.log(` vaultSharesBefore: ${data.vaultSharesBefore.toNumber()}`); + console.log(` vaultSharesAfter: ${data.vaultSharesAfter.toNumber()} (${data.vaultSharesAfter.toNumber() - data.vaultSharesBefore.toNumber()})`); + console.log(` vaultEquityBefore: ${convertToNumber(data.vaultEquityBefore, spotPrecision)}`); + console.log(` userVaultSharesBefore: ${data.userVaultSharesBefore.toNumber()}`); + console.log(` userVaultSharesAfter: ${data.userVaultSharesAfter.toNumber()} (${data.userVaultSharesAfter.toNumber() - data.userVaultSharesBefore.toNumber()})`); + console.log(` totalVaultSharesBefore: ${data.totalVaultSharesBefore.toNumber()}`); + console.log(` totalVaultSharesAfter: ${data.totalVaultSharesAfter.toNumber()} (${data.totalVaultSharesAfter.toNumber() - data.totalVaultSharesBefore.toNumber()})`); + console.log(` profitShare: ${data.profitShare.toNumber()}`); + console.log(` managementFee: ${data.managementFee.toNumber()}`); + console.log(` managementFeeShares: ${data.managementFeeShares.toNumber()}`); + break; + } + } + +}; \ No newline at end of file diff --git a/ts/sdk/cli/commands/deposit.ts b/ts/sdk/cli/commands/deposit.ts index 2fe7a2fd..31e7efc1 100644 --- a/ts/sdk/cli/commands/deposit.ts +++ b/ts/sdk/cli/commands/deposit.ts @@ -21,7 +21,11 @@ export const deposit = async (program: Command, cmdOpts: OptionValues) => { driftVault } = await getCommandContext(program, true); - const spotMarket = driftClient.getSpotMarketAccount(0); // takes USDC deposits + const vaultDepositorAccount = + await driftVault.program.account.vaultDepositor.fetch(vaultDepositorAddress); + const vaultAddress = vaultDepositorAccount.vault; + const vaultAccount = await driftVault.program.account.vault.fetch(vaultAddress); + const spotMarket = driftClient.getSpotMarketAccount(vaultAccount.spotMarketIndex); if (!spotMarket) { throw new Error("No spot market found"); } diff --git a/ts/sdk/cli/commands/index.ts b/ts/sdk/cli/commands/index.ts index f658c693..02059b57 100644 --- a/ts/sdk/cli/commands/index.ts +++ b/ts/sdk/cli/commands/index.ts @@ -14,4 +14,5 @@ export * from './requestWithdraw'; export * from './forceWithdraw'; export * from './withdraw'; export * from './listDepositorsForVault'; -export * from './managerUpdateMarginTradingEnabled'; \ No newline at end of file +export * from './managerUpdateMarginTradingEnabled'; +export * from './decodeLogs'; \ No newline at end of file diff --git a/ts/sdk/cli/commands/initVault.ts b/ts/sdk/cli/commands/initVault.ts index 0d0edb5b..e56e7e3a 100644 --- a/ts/sdk/cli/commands/initVault.ts +++ b/ts/sdk/cli/commands/initVault.ts @@ -34,7 +34,7 @@ export const initVault = async (program: Command, cmdOpts: OptionValues) => { spotMarketIndex = "0"; } spotMarketIndex = parseInt(spotMarketIndex); - const spotMarket = driftClient.getSpotMarketAccount(spotMarketIndex); // takes USDC deposits + const spotMarket = driftClient.getSpotMarketAccount(spotMarketIndex); if (!spotMarket) { throw new Error("No spot market found"); } @@ -77,8 +77,8 @@ export const initVault = async (program: Command, cmdOpts: OptionValues) => { if (!minDepositAmount) { minDepositAmount = "0"; } - minDepositAmount = parseInt(minDepositAmount); - const minDepositAmountBN = new BN(minDepositAmount).mul(spotPrecision); + minDepositAmount = parseFloat(minDepositAmount); + const minDepositAmountBN = new BN(spotPrecision.toNumber() * minDepositAmount); let delegate = cmdOpts.delegate; if (!delegate) { diff --git a/ts/sdk/cli/commands/managerDeposit.ts b/ts/sdk/cli/commands/managerDeposit.ts index cb9d813e..88493f0e 100644 --- a/ts/sdk/cli/commands/managerDeposit.ts +++ b/ts/sdk/cli/commands/managerDeposit.ts @@ -21,7 +21,8 @@ export const managerDeposit = async (program: Command, cmdOpts: OptionValues) => driftVault } = await getCommandContext(program, true); - const spotMarket = driftClient.getSpotMarketAccount(0); // takes USDC deposits + const vaultAccount = await driftVault.program.account.vault.fetch(vaultAddress); + const spotMarket = driftClient.getSpotMarketAccount(vaultAccount.spotMarketIndex); if (!spotMarket) { throw new Error("No spot market found"); } diff --git a/ts/sdk/cli/utils.ts b/ts/sdk/cli/utils.ts index 8564e01a..02bdad90 100644 --- a/ts/sdk/cli/utils.ts +++ b/ts/sdk/cli/utils.ts @@ -91,7 +91,9 @@ export async function getCommandContext(program: Command, needToSign: boolean): } const wallet = new Wallet(keypair); - console.log(`Signing wallet address (need to sign: ${needToSign}): `, wallet.publicKey.toBase58()); + if (needToSign) { + console.log(`Signing wallet address: `, wallet.publicKey.toBase58()); + } const connection = new Connection(opts.url, { commitment: opts.commitment,