From 935b5bc5c4d6099af2543d578e164566b3756002 Mon Sep 17 00:00:00 2001 From: LukasDeco Date: Tue, 25 Jun 2024 08:08:34 -0600 Subject: [PATCH 1/3] feat: create proposal tx method --- scripts/initializeDao.ts | 2 + sdk/src/AutocratClient.ts | 128 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) diff --git a/scripts/initializeDao.ts b/scripts/initializeDao.ts index d180af11..34883964 100644 --- a/scripts/initializeDao.ts +++ b/scripts/initializeDao.ts @@ -10,7 +10,9 @@ import { FUTURE_DEVNET, META, } from "./consts"; +import { Keypair, PublicKey } from '@solana/web3.js'; +const provider = anchor.AnchorProvider.env(); let autocratClient: AutocratClient = AutocratClient.createClient({ provider: anchor.AnchorProvider.env(), }); diff --git a/sdk/src/AutocratClient.ts b/sdk/src/AutocratClient.ts index a455a75d..1329310e 100644 --- a/sdk/src/AutocratClient.ts +++ b/sdk/src/AutocratClient.ts @@ -365,6 +365,134 @@ export class AutocratClient { return proposal; } + async createProposalTxAndPDAs( + dao: PublicKey, + descriptionUrl: string, + instruction: ProposalInstruction, + baseTokensToLP: BN, + quoteTokensToLP: BN + ): Promise< + [ + Transaction, + { + proposalAcct: PublicKey; + baseCondVaultAcct: PublicKey; + quoteCondVaultAcct: PublicKey; + passMarketAcct: PublicKey; + failMarketAcct: PublicKey; + } + ] + > { + const storedDao = await this.getDao(dao); + + const nonce = new BN(Math.random() * 2 ** 50); + + let [proposal] = getProposalAddr( + this.autocrat.programId, + this.provider.publicKey, + nonce + ); + + const { + baseVault, + quoteVault, + passAmm, + failAmm, + passBaseMint, + passQuoteMint, + failBaseMint, + failQuoteMint, + } = this.getProposalPdas( + proposal, + storedDao.tokenMint, + storedDao.usdcMint, + dao + ); + + // it's important that these happen in a single atomic transaction + await this.vaultClient + .initializeVaultIx(proposal, storedDao.tokenMint) + .postInstructions( + await InstructionUtils.getInstructions( + this.vaultClient.initializeVaultIx(proposal, storedDao.usdcMint), + this.ammClient.createAmmIx( + passBaseMint, + passQuoteMint, + storedDao.twapInitialObservation, + storedDao.twapMaxObservationChangePerUpdate + ), + this.ammClient.createAmmIx( + failBaseMint, + failQuoteMint, + storedDao.twapInitialObservation, + storedDao.twapMaxObservationChangePerUpdate + ) + ) + ) + .rpc(); + + await this.vaultClient + .mintConditionalTokensIx(baseVault, storedDao.tokenMint, baseTokensToLP) + .postInstructions( + await InstructionUtils.getInstructions( + this.vaultClient.mintConditionalTokensIx( + quoteVault, + storedDao.usdcMint, + quoteTokensToLP + ) + ) + ) + .rpc(); + + await this.ammClient + .addLiquidityIx( + passAmm, + passBaseMint, + passQuoteMint, + quoteTokensToLP, + baseTokensToLP, + new BN(0) + ) + .postInstructions( + await InstructionUtils.getInstructions( + this.ammClient.addLiquidityIx( + failAmm, + failBaseMint, + failQuoteMint, + quoteTokensToLP, + baseTokensToLP, + new BN(0) + ) + ) + ) + .rpc(); + + // this is how many original tokens are created + const lpTokens = quoteTokensToLP; + + const tx = await this.initializeProposalIx( + descriptionUrl, + instruction, + dao, + storedDao.tokenMint, + storedDao.usdcMint, + lpTokens, + lpTokens, + nonce + ).transaction(); + + return [ + tx, + { + baseCondVaultAcct: baseVault, + quoteCondVaultAcct: quoteVault, + failMarketAcct: failAmm, + passMarketAcct: passAmm, + proposalAcct: proposal, + }, + ]; + } + initializeProposalIx( descriptionUrl: string, instruction: ProposalInstruction, From e1de63c13b8a535d2f22e5bc71046b32854e8399 Mon Sep 17 00:00:00 2001 From: LukasDeco Date: Tue, 25 Jun 2024 17:56:09 -0600 Subject: [PATCH 2/3] fix: undo useless change --- scripts/initializeDao.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/initializeDao.ts b/scripts/initializeDao.ts index 34883964..264d0d1b 100644 --- a/scripts/initializeDao.ts +++ b/scripts/initializeDao.ts @@ -10,9 +10,6 @@ import { FUTURE_DEVNET, META, } from "./consts"; -import { Keypair, PublicKey } from '@solana/web3.js'; - -const provider = anchor.AnchorProvider.env(); let autocratClient: AutocratClient = AutocratClient.createClient({ provider: anchor.AnchorProvider.env(), }); From 03d94141f77953e92854e539a309e49fbe88b06e Mon Sep 17 00:00:00 2001 From: LukasDeco Date: Thu, 27 Jun 2024 18:54:45 -0600 Subject: [PATCH 3/3] feat: create prop returns txs no rpc() --- sdk/src/AutocratClient.ts | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/sdk/src/AutocratClient.ts b/sdk/src/AutocratClient.ts index 1329310e..6f704670 100644 --- a/sdk/src/AutocratClient.ts +++ b/sdk/src/AutocratClient.ts @@ -373,7 +373,7 @@ export class AutocratClient { quoteTokensToLP: BN ): Promise< [ - Transaction, + Transaction[], { proposalAcct: PublicKey; baseCondVaultAcct: PublicKey; @@ -410,7 +410,7 @@ export class AutocratClient { ); // it's important that these happen in a single atomic transaction - await this.vaultClient + const initVaultTx = await this.vaultClient .initializeVaultIx(proposal, storedDao.tokenMint) .postInstructions( await InstructionUtils.getInstructions( @@ -429,9 +429,9 @@ export class AutocratClient { ) ) ) - .rpc(); + .transaction(); - await this.vaultClient + const mintConditionalTokensTx = await this.vaultClient .mintConditionalTokensIx(baseVault, storedDao.tokenMint, baseTokensToLP) .postInstructions( await InstructionUtils.getInstructions( @@ -442,9 +442,9 @@ export class AutocratClient { ) ) ) - .rpc(); + .transaction(); - await this.ammClient + const addLiquidityTx = await this.ammClient .addLiquidityIx( passAmm, passBaseMint, @@ -465,12 +465,12 @@ export class AutocratClient { ) ) ) - .rpc(); + .transaction(); // this is how many original tokens are created const lpTokens = quoteTokensToLP; - const tx = await this.initializeProposalIx( + const initTx = await this.initializeProposalIx( descriptionUrl, instruction, dao, @@ -482,7 +482,12 @@ export class AutocratClient { ).transaction(); return [ - tx, + [ + initVaultTx, + mintConditionalTokensTx, + addLiquidityTx, + initTx + ], { baseCondVaultAcct: baseVault, quoteCondVaultAcct: quoteVault,