Skip to content

Commit

Permalink
Add a script for merging conditional tokens (#233)
Browse files Browse the repository at this point in the history
  • Loading branch information
metaproph3t authored Jun 14, 2024
1 parent 216c640 commit 7471ea6
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 0 deletions.
1 change: 1 addition & 0 deletions Anchor.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ send-tokens = "yarn run ts-node scripts/sendTokens.ts"
crank = "yarn run ts-node scripts/crankTwap.ts"
attach-metadata = "yarn run ts-node scripts/attachMetadata.ts"
reclaim-tokens = "yarn run ts-node scripts/reclaimTokens.ts"
merge-tokens = "yarn run ts-node scripts/mergeTokens.ts"
test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/*.ts"

[test]
Expand Down
70 changes: 70 additions & 0 deletions scripts/mergeTokens.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import * as anchor from "@coral-xyz/anchor";
import { MEMO_PROGRAM_ID } from "@solana/spl-memo";
import * as token from "@solana/spl-token";
import { ComputeBudgetProgram, LAMPORTS_PER_SOL } from "@solana/web3.js";
import {
AmmClient,
AutocratClient,
ConditionalVaultClient,
} from "@metadaoproject/futarchy";
import { InstructionUtils } from "@metadaoproject/futarchy";

const { PublicKey, Keypair, SystemProgram } = anchor.web3;
const { BN, Program } = anchor;

const provider = anchor.AnchorProvider.env();
anchor.setProvider(provider);

let autocratClient: AutocratClient = AutocratClient.createClient({
provider: anchor.AnchorProvider.env(),
});

let ammClient: AmmClient = AmmClient.createClient({
provider: anchor.AnchorProvider.env(),
});

let vaultClient: ConditionalVaultClient = ConditionalVaultClient.createClient({
provider: anchor.AnchorProvider.env(),
});

const payer = provider.wallet["payer"];

const PROPOSAL = new PublicKey("MW1dKeDYgewceWuaSmDytdpwNzZDwABf1FuwJix923C");

async function main() {
const DAO = new PublicKey("ofvb3CPvEyRfD5az8PAqW6ATpPqVBeiB5zBnpPR5cgm");

const storedDao = await autocratClient.getDao(DAO);
console.log(storedDao);

const {
passAmm,
failAmm,
baseVault,
quoteVault,
passBaseMint,
passQuoteMint,
failBaseMint,
failQuoteMint,
passLp,
failLp,
} = autocratClient.getProposalPdas(
PROPOSAL,
storedDao.tokenMint,
storedDao.usdcMint,
DAO
);

const basePassBalance = (await token.getOrCreateAssociatedTokenAccount(provider.connection, payer, passBaseMint, payer.publicKey)).amount;
const quotePassBalance = (await token.getOrCreateAssociatedTokenAccount(provider.connection, payer, passQuoteMint, payer.publicKey)).amount;

await vaultClient.mergeConditionalTokensIx(baseVault, storedDao.tokenMint, new BN(basePassBalance.toString()))
.preInstructions([
ComputeBudgetProgram.setComputeUnitLimit({ units: 150_000 }),
ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 100 }),
await vaultClient.mergeConditionalTokensIx(quoteVault, storedDao.usdcMint, new BN(quotePassBalance.toString())).instruction(),
])
.rpc();
}

main();
42 changes: 42 additions & 0 deletions sdk/src/ConditionalVaultClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,48 @@ export class ConditionalVaultClient {
});
}

mergeConditionalTokensIx(
vault: PublicKey,
underlyingTokenMint: PublicKey,
amount: BN
) {
const [conditionalOnFinalizeTokenMint] = getVaultFinalizeMintAddr(
this.vaultProgram.programId,
vault
);
const [conditionalOnRevertTokenMint] = getVaultRevertMintAddr(
this.vaultProgram.programId,
vault
);

return this.vaultProgram.methods
.mergeConditionalTokensForUnderlyingTokens(amount)
.accounts({
authority: this.provider.publicKey,
vault,
vaultUnderlyingTokenAccount: getAssociatedTokenAddressSync(
underlyingTokenMint,
vault,
true
),
userUnderlyingTokenAccount: getAssociatedTokenAddressSync(
underlyingTokenMint,
this.provider.publicKey,
true
),
conditionalOnFinalizeTokenMint,
userConditionalOnFinalizeTokenAccount: getAssociatedTokenAddressSync(
conditionalOnFinalizeTokenMint,
this.provider.publicKey
),
conditionalOnRevertTokenMint,
userConditionalOnRevertTokenAccount: getAssociatedTokenAddressSync(
conditionalOnRevertTokenMint,
this.provider.publicKey
),
});
}

async initializeVault(
settlementAuthority: PublicKey,
underlyingTokenMint: PublicKey
Expand Down

0 comments on commit 7471ea6

Please sign in to comment.