diff --git a/.changeset/odd-crews-slide.md b/.changeset/odd-crews-slide.md new file mode 100644 index 00000000..f8defc8d --- /dev/null +++ b/.changeset/odd-crews-slide.md @@ -0,0 +1,5 @@ +--- +"@macalinao/clients-quarry": patch +--- + +Add defaults for merge miner operations diff --git a/clients/quarry/coda.config.mjs b/clients/quarry/coda.config.mjs index baf9d732..2cd458b9 100644 --- a/clients/quarry/coda.config.mjs +++ b/clients/quarry/coda.config.mjs @@ -290,7 +290,12 @@ export default defineConfig({ }, ]), - ...["stakePrimaryMiner", "stakeReplicaMiner"].flatMap((instruction) => [ + ...[ + "stakePrimaryMiner", + "stakeReplicaMiner", + "unstakePrimaryMiner", + "unstakeAllReplicaMiner", + ].flatMap((instruction) => [ { account: "mm", instruction, @@ -350,6 +355,50 @@ export default defineConfig({ }, ]), + ...[ + "newPool", + "newPoolV2", + "stakeReplicaMiner", + "unstakeAllReplicaMiner", + ].flatMap((instruction) => [ + { + account: "replicaMint", + instruction, + defaultValue: pdaValueNode(pdaLinkNode("replicaMint"), [ + pdaSeedValueNode("pool", accountValueNode("pool")), + ]), + }, + ]), + + ...["stakeReplicaMiner", "unstakeAllReplicaMiner"].flatMap( + (instruction) => [ + { + account: "replicaMintTokenAccount", + instruction, + defaultValue: associatedTokenAccountValueNode({ + owner: accountValueNode("mm"), + mint: accountValueNode("replicaMint"), + }), + }, + { + account: "quarry", + instruction, + defaultValue: pdaValueNode(pdaLinkNode("quarry"), [ + pdaSeedValueNode("rewarder", accountValueNode("rewarder")), + pdaSeedValueNode("tokenMint", accountValueNode("replicaMint")), + ]), + }, + { + account: "minerVault", + instruction, + defaultValue: associatedTokenAccountValueNode({ + owner: accountValueNode("miner"), + mint: accountValueNode("replicaMint"), + }), + }, + ], + ), + ...["newMinter", "newMinterV2"].flatMap((instruction) => [ { account: "minter", diff --git a/clients/quarry/src/generated/instructions/newPool.ts b/clients/quarry/src/generated/instructions/newPool.ts index e4c5537c..49077280 100644 --- a/clients/quarry/src/generated/instructions/newPool.ts +++ b/clients/quarry/src/generated/instructions/newPool.ts @@ -37,6 +37,7 @@ import { getU8Encoder, transformEncoder, } from "@solana/kit"; +import { findReplicaMintPda } from "../pdas/index.js"; import { QUARRY_MERGE_MINE_PROGRAM_ADDRESS } from "../programs/index.js"; import { expectAddress, getAccountMetaFactory } from "../shared/index.js"; @@ -221,16 +222,8 @@ export async function getNewPoolInstructionAsync< }); } if (!accounts.replicaMint.value) { - accounts.replicaMint.value = await getProgramDerivedAddress({ - programAddress, - seeds: [ - getBytesEncoder().encode( - new Uint8Array([ - 34, 82, 101, 112, 108, 105, 99, 97, 77, 105, 110, 116, 34, - ]), - ), - getAddressEncoder().encode(expectAddress(accounts.pool.value)), - ], + accounts.replicaMint.value = await findReplicaMintPda({ + pool: expectAddress(accounts.pool.value), }); } if (!accounts.tokenProgram.value) { diff --git a/clients/quarry/src/generated/instructions/newPoolV2.ts b/clients/quarry/src/generated/instructions/newPoolV2.ts index 919a3a78..d6d300b3 100644 --- a/clients/quarry/src/generated/instructions/newPoolV2.ts +++ b/clients/quarry/src/generated/instructions/newPoolV2.ts @@ -35,6 +35,7 @@ import { getStructEncoder, transformEncoder, } from "@solana/kit"; +import { findReplicaMintPda } from "../pdas/index.js"; import { QUARRY_MERGE_MINE_PROGRAM_ADDRESS } from "../programs/index.js"; import { expectAddress, getAccountMetaFactory } from "../shared/index.js"; @@ -203,16 +204,8 @@ export async function getNewPoolV2InstructionAsync< }); } if (!accounts.replicaMint.value) { - accounts.replicaMint.value = await getProgramDerivedAddress({ - programAddress, - seeds: [ - getBytesEncoder().encode( - new Uint8Array([ - 34, 82, 101, 112, 108, 105, 99, 97, 77, 105, 110, 116, 34, - ]), - ), - getAddressEncoder().encode(expectAddress(accounts.pool.value)), - ], + accounts.replicaMint.value = await findReplicaMintPda({ + pool: expectAddress(accounts.pool.value), }); } if (!accounts.tokenProgram.value) { diff --git a/clients/quarry/src/generated/instructions/stakeReplicaMiner.ts b/clients/quarry/src/generated/instructions/stakeReplicaMiner.ts index 02678ce3..b897913b 100644 --- a/clients/quarry/src/generated/instructions/stakeReplicaMiner.ts +++ b/clients/quarry/src/generated/instructions/stakeReplicaMiner.ts @@ -24,16 +24,24 @@ import type { } from "@solana/kit"; import type { ResolvedAccount } from "../shared/index.js"; import { + address, combineCodec, fixDecoderSize, fixEncoderSize, + getAddressEncoder, getBytesDecoder, getBytesEncoder, + getProgramDerivedAddress, getStructDecoder, getStructEncoder, transformEncoder, } from "@solana/kit"; -import { findMergeMinerPda, findMinerPda } from "../pdas/index.js"; +import { + findMergeMinerPda, + findMinerPda, + findQuarryPda, + findReplicaMintPda, +} from "../pdas/index.js"; import { QUARRY_MERGE_MINE_PROGRAM_ADDRESS } from "../programs/index.js"; import { expectAddress, getAccountMetaFactory } from "../shared/index.js"; @@ -147,14 +155,14 @@ export interface StakeReplicaMinerAsyncInput< TAccountMineProgram extends string = string, > { mmOwner: TransactionSigner; - replicaMint: Address; - replicaMintTokenAccount: Address; + replicaMint?: Address; + replicaMintTokenAccount?: Address; pool: Address; mm?: Address; rewarder: Address; - quarry: Address; + quarry?: Address; miner?: Address; - minerVault: Address; + minerVault?: Address; tokenProgram?: Address; mineProgram?: Address; } @@ -230,18 +238,55 @@ export async function getStakeReplicaMinerInstructionAsync< >; // Resolve default values. + if (!accounts.replicaMint.value) { + accounts.replicaMint.value = await findReplicaMintPda({ + pool: expectAddress(accounts.pool.value), + }); + } if (!accounts.mm.value) { accounts.mm.value = await findMergeMinerPda({ pool: expectAddress(accounts.pool.value), owner: expectAddress(accounts.mmOwner.value), }); } + if (!accounts.replicaMintTokenAccount.value) { + accounts.replicaMintTokenAccount.value = await getProgramDerivedAddress({ + programAddress: + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">, + seeds: [ + getAddressEncoder().encode(expectAddress(accounts.mm.value)), + getAddressEncoder().encode( + address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), + ), + getAddressEncoder().encode(expectAddress(accounts.replicaMint.value)), + ], + }); + } + if (!accounts.quarry.value) { + accounts.quarry.value = await findQuarryPda({ + rewarder: expectAddress(accounts.rewarder.value), + tokenMint: expectAddress(accounts.replicaMint.value), + }); + } if (!accounts.miner.value) { accounts.miner.value = await findMinerPda({ quarry: expectAddress(accounts.quarry.value), authority: expectAddress(accounts.mm.value), }); } + if (!accounts.minerVault.value) { + accounts.minerVault.value = await getProgramDerivedAddress({ + programAddress: + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">, + seeds: [ + getAddressEncoder().encode(expectAddress(accounts.miner.value)), + getAddressEncoder().encode( + address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), + ), + getAddressEncoder().encode(expectAddress(accounts.replicaMint.value)), + ], + }); + } if (!accounts.tokenProgram.value) { accounts.tokenProgram.value = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">; diff --git a/clients/quarry/src/generated/instructions/unstakeAllReplicaMiner.ts b/clients/quarry/src/generated/instructions/unstakeAllReplicaMiner.ts index e5dc75bf..5ff5a11b 100644 --- a/clients/quarry/src/generated/instructions/unstakeAllReplicaMiner.ts +++ b/clients/quarry/src/generated/instructions/unstakeAllReplicaMiner.ts @@ -24,17 +24,25 @@ import type { } from "@solana/kit"; import type { ResolvedAccount } from "../shared/index.js"; import { + address, combineCodec, fixDecoderSize, fixEncoderSize, + getAddressEncoder, getBytesDecoder, getBytesEncoder, + getProgramDerivedAddress, getStructDecoder, getStructEncoder, transformEncoder, } from "@solana/kit"; +import { + findMergeMinerPda, + findQuarryPda, + findReplicaMintPda, +} from "../pdas/index.js"; import { QUARRY_MERGE_MINE_PROGRAM_ADDRESS } from "../programs/index.js"; -import { getAccountMetaFactory } from "../shared/index.js"; +import { expectAddress, getAccountMetaFactory } from "../shared/index.js"; export const UNSTAKE_ALL_REPLICA_MINER_DISCRIMINATOR: ReadonlyUint8Array = new Uint8Array([250, 4, 3, 209, 154, 125, 71, 168]); @@ -135,6 +143,188 @@ export function getUnstakeAllReplicaMinerInstructionDataCodec(): FixedSizeCodec< ); } +export interface UnstakeAllReplicaMinerAsyncInput< + TAccountMmOwner extends string = string, + TAccountReplicaMint extends string = string, + TAccountReplicaMintTokenAccount extends string = string, + TAccountPool extends string = string, + TAccountMm extends string = string, + TAccountRewarder extends string = string, + TAccountQuarry extends string = string, + TAccountMiner extends string = string, + TAccountMinerVault extends string = string, + TAccountTokenProgram extends string = string, + TAccountMineProgram extends string = string, +> { + mmOwner: TransactionSigner; + replicaMint?: Address; + replicaMintTokenAccount?: Address; + pool: Address; + mm?: Address; + rewarder: Address; + quarry?: Address; + miner: Address; + minerVault?: Address; + tokenProgram?: Address; + mineProgram?: Address; +} + +export async function getUnstakeAllReplicaMinerInstructionAsync< + TAccountMmOwner extends string, + TAccountReplicaMint extends string, + TAccountReplicaMintTokenAccount extends string, + TAccountPool extends string, + TAccountMm extends string, + TAccountRewarder extends string, + TAccountQuarry extends string, + TAccountMiner extends string, + TAccountMinerVault extends string, + TAccountTokenProgram extends string, + TAccountMineProgram extends string, + TProgramAddress extends Address = typeof QUARRY_MERGE_MINE_PROGRAM_ADDRESS, +>( + input: UnstakeAllReplicaMinerAsyncInput< + TAccountMmOwner, + TAccountReplicaMint, + TAccountReplicaMintTokenAccount, + TAccountPool, + TAccountMm, + TAccountRewarder, + TAccountQuarry, + TAccountMiner, + TAccountMinerVault, + TAccountTokenProgram, + TAccountMineProgram + >, + config?: { programAddress?: TProgramAddress }, +): Promise< + UnstakeAllReplicaMinerInstruction< + TProgramAddress, + TAccountMmOwner, + TAccountReplicaMint, + TAccountReplicaMintTokenAccount, + TAccountPool, + TAccountMm, + TAccountRewarder, + TAccountQuarry, + TAccountMiner, + TAccountMinerVault, + TAccountTokenProgram, + TAccountMineProgram + > +> { + // Program address. + const programAddress = + config?.programAddress ?? QUARRY_MERGE_MINE_PROGRAM_ADDRESS; + + // Original accounts. + const originalAccounts = { + mmOwner: { value: input.mmOwner ?? null, isWritable: false }, + replicaMint: { value: input.replicaMint ?? null, isWritable: true }, + replicaMintTokenAccount: { + value: input.replicaMintTokenAccount ?? null, + isWritable: true, + }, + pool: { value: input.pool ?? null, isWritable: true }, + mm: { value: input.mm ?? null, isWritable: true }, + rewarder: { value: input.rewarder ?? null, isWritable: false }, + quarry: { value: input.quarry ?? null, isWritable: true }, + miner: { value: input.miner ?? null, isWritable: true }, + minerVault: { value: input.minerVault ?? null, isWritable: true }, + tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, + mineProgram: { value: input.mineProgram ?? null, isWritable: false }, + }; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedAccount + >; + + // Resolve default values. + if (!accounts.replicaMint.value) { + accounts.replicaMint.value = await findReplicaMintPda({ + pool: expectAddress(accounts.pool.value), + }); + } + if (!accounts.mm.value) { + accounts.mm.value = await findMergeMinerPda({ + pool: expectAddress(accounts.pool.value), + owner: expectAddress(accounts.mmOwner.value), + }); + } + if (!accounts.replicaMintTokenAccount.value) { + accounts.replicaMintTokenAccount.value = await getProgramDerivedAddress({ + programAddress: + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">, + seeds: [ + getAddressEncoder().encode(expectAddress(accounts.mm.value)), + getAddressEncoder().encode( + address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), + ), + getAddressEncoder().encode(expectAddress(accounts.replicaMint.value)), + ], + }); + } + if (!accounts.quarry.value) { + accounts.quarry.value = await findQuarryPda({ + rewarder: expectAddress(accounts.rewarder.value), + tokenMint: expectAddress(accounts.replicaMint.value), + }); + } + if (!accounts.minerVault.value) { + accounts.minerVault.value = await getProgramDerivedAddress({ + programAddress: + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">, + seeds: [ + getAddressEncoder().encode(expectAddress(accounts.miner.value)), + getAddressEncoder().encode( + address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), + ), + getAddressEncoder().encode(expectAddress(accounts.replicaMint.value)), + ], + }); + } + if (!accounts.tokenProgram.value) { + accounts.tokenProgram.value = + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">; + } + if (!accounts.mineProgram.value) { + accounts.mineProgram.value = + "QMNeHCGYnLVDn1icRAfQZpjPLBNkfGbSKRB83G5d8KB" as Address<"QMNeHCGYnLVDn1icRAfQZpjPLBNkfGbSKRB83G5d8KB">; + } + + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); + return Object.freeze({ + accounts: [ + getAccountMeta(accounts.mmOwner), + getAccountMeta(accounts.replicaMint), + getAccountMeta(accounts.replicaMintTokenAccount), + getAccountMeta(accounts.pool), + getAccountMeta(accounts.mm), + getAccountMeta(accounts.rewarder), + getAccountMeta(accounts.quarry), + getAccountMeta(accounts.miner), + getAccountMeta(accounts.minerVault), + getAccountMeta(accounts.tokenProgram), + getAccountMeta(accounts.mineProgram), + ], + data: getUnstakeAllReplicaMinerInstructionDataEncoder().encode({}), + programAddress, + } as UnstakeAllReplicaMinerInstruction< + TProgramAddress, + TAccountMmOwner, + TAccountReplicaMint, + TAccountReplicaMintTokenAccount, + TAccountPool, + TAccountMm, + TAccountRewarder, + TAccountQuarry, + TAccountMiner, + TAccountMinerVault, + TAccountTokenProgram, + TAccountMineProgram + >); +} + export interface UnstakeAllReplicaMinerInput< TAccountMmOwner extends string = string, TAccountReplicaMint extends string = string, diff --git a/clients/quarry/src/generated/instructions/unstakePrimaryMiner.ts b/clients/quarry/src/generated/instructions/unstakePrimaryMiner.ts index 8f8dd057..ffdc307d 100644 --- a/clients/quarry/src/generated/instructions/unstakePrimaryMiner.ts +++ b/clients/quarry/src/generated/instructions/unstakePrimaryMiner.ts @@ -35,8 +35,9 @@ import { getU64Encoder, transformEncoder, } from "@solana/kit"; +import { findMergeMinerPda } from "../pdas/index.js"; import { QUARRY_MERGE_MINE_PROGRAM_ADDRESS } from "../programs/index.js"; -import { getAccountMetaFactory } from "../shared/index.js"; +import { expectAddress, getAccountMetaFactory } from "../shared/index.js"; export const UNSTAKE_PRIMARY_MINER_DISCRIMINATOR: ReadonlyUint8Array = new Uint8Array([45, 62, 3, 33, 114, 156, 186, 26]); @@ -140,6 +141,149 @@ export function getUnstakePrimaryMinerInstructionDataCodec(): FixedSizeCodec< ); } +export interface UnstakePrimaryMinerAsyncInput< + TAccountMmOwner extends string = string, + TAccountMmPrimaryTokenAccount extends string = string, + TAccountPool extends string = string, + TAccountMm extends string = string, + TAccountRewarder extends string = string, + TAccountQuarry extends string = string, + TAccountMiner extends string = string, + TAccountMinerVault extends string = string, + TAccountTokenProgram extends string = string, + TAccountMineProgram extends string = string, +> { + mmOwner: TransactionSigner; + mmPrimaryTokenAccount: Address; + pool: Address; + mm?: Address; + rewarder: Address; + quarry: Address; + miner: Address; + minerVault: Address; + tokenProgram?: Address; + mineProgram?: Address; + amount: UnstakePrimaryMinerInstructionDataArgs["amount"]; +} + +export async function getUnstakePrimaryMinerInstructionAsync< + TAccountMmOwner extends string, + TAccountMmPrimaryTokenAccount extends string, + TAccountPool extends string, + TAccountMm extends string, + TAccountRewarder extends string, + TAccountQuarry extends string, + TAccountMiner extends string, + TAccountMinerVault extends string, + TAccountTokenProgram extends string, + TAccountMineProgram extends string, + TProgramAddress extends Address = typeof QUARRY_MERGE_MINE_PROGRAM_ADDRESS, +>( + input: UnstakePrimaryMinerAsyncInput< + TAccountMmOwner, + TAccountMmPrimaryTokenAccount, + TAccountPool, + TAccountMm, + TAccountRewarder, + TAccountQuarry, + TAccountMiner, + TAccountMinerVault, + TAccountTokenProgram, + TAccountMineProgram + >, + config?: { programAddress?: TProgramAddress }, +): Promise< + UnstakePrimaryMinerInstruction< + TProgramAddress, + TAccountMmOwner, + TAccountMmPrimaryTokenAccount, + TAccountPool, + TAccountMm, + TAccountRewarder, + TAccountQuarry, + TAccountMiner, + TAccountMinerVault, + TAccountTokenProgram, + TAccountMineProgram + > +> { + // Program address. + const programAddress = + config?.programAddress ?? QUARRY_MERGE_MINE_PROGRAM_ADDRESS; + + // Original accounts. + const originalAccounts = { + mmOwner: { value: input.mmOwner ?? null, isWritable: false }, + mmPrimaryTokenAccount: { + value: input.mmPrimaryTokenAccount ?? null, + isWritable: true, + }, + pool: { value: input.pool ?? null, isWritable: true }, + mm: { value: input.mm ?? null, isWritable: true }, + rewarder: { value: input.rewarder ?? null, isWritable: false }, + quarry: { value: input.quarry ?? null, isWritable: true }, + miner: { value: input.miner ?? null, isWritable: true }, + minerVault: { value: input.minerVault ?? null, isWritable: true }, + tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, + mineProgram: { value: input.mineProgram ?? null, isWritable: false }, + }; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedAccount + >; + + // Original args. + const args = { ...input }; + + // Resolve default values. + if (!accounts.mm.value) { + accounts.mm.value = await findMergeMinerPda({ + pool: expectAddress(accounts.pool.value), + owner: expectAddress(accounts.mmOwner.value), + }); + } + if (!accounts.tokenProgram.value) { + accounts.tokenProgram.value = + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">; + } + if (!accounts.mineProgram.value) { + accounts.mineProgram.value = + "QMNeHCGYnLVDn1icRAfQZpjPLBNkfGbSKRB83G5d8KB" as Address<"QMNeHCGYnLVDn1icRAfQZpjPLBNkfGbSKRB83G5d8KB">; + } + + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); + return Object.freeze({ + accounts: [ + getAccountMeta(accounts.mmOwner), + getAccountMeta(accounts.mmPrimaryTokenAccount), + getAccountMeta(accounts.pool), + getAccountMeta(accounts.mm), + getAccountMeta(accounts.rewarder), + getAccountMeta(accounts.quarry), + getAccountMeta(accounts.miner), + getAccountMeta(accounts.minerVault), + getAccountMeta(accounts.tokenProgram), + getAccountMeta(accounts.mineProgram), + ], + data: getUnstakePrimaryMinerInstructionDataEncoder().encode( + args as UnstakePrimaryMinerInstructionDataArgs, + ), + programAddress, + } as UnstakePrimaryMinerInstruction< + TProgramAddress, + TAccountMmOwner, + TAccountMmPrimaryTokenAccount, + TAccountPool, + TAccountMm, + TAccountRewarder, + TAccountQuarry, + TAccountMiner, + TAccountMinerVault, + TAccountTokenProgram, + TAccountMineProgram + >); +} + export interface UnstakePrimaryMinerInput< TAccountMmOwner extends string = string, TAccountMmPrimaryTokenAccount extends string = string,