From bfa2c53d28a1a47e6ffc590a237ded2641270c4a Mon Sep 17 00:00:00 2001 From: metaproph3t Date: Mon, 29 Sep 2025 17:47:46 -0700 Subject: [PATCH 01/11] Add spending limit instruction to v0.5 autocrat --- programs/autocrat/src/error.rs | 2 + .../execute_spending_limit_change.rs | 91 +++++++++++++++++++ programs/autocrat/src/instructions/mod.rs | 2 + programs/autocrat/src/lib.rs | 7 ++ 4 files changed, 102 insertions(+) create mode 100644 programs/autocrat/src/instructions/execute_spending_limit_change.rs diff --git a/programs/autocrat/src/error.rs b/programs/autocrat/src/error.rs index f0a8be96..d9944bb0 100644 --- a/programs/autocrat/src/error.rs +++ b/programs/autocrat/src/error.rs @@ -34,4 +34,6 @@ pub enum AutocratError { QuestionMustBeBinary, #[msg("Squads proposal must be in Draft status")] InvalidSquadsProposalStatus, + #[msg("This Squads transaction should only contain calls to update spending limits")] + InvalidTransaction, } diff --git a/programs/autocrat/src/instructions/execute_spending_limit_change.rs b/programs/autocrat/src/instructions/execute_spending_limit_change.rs new file mode 100644 index 00000000..58adf293 --- /dev/null +++ b/programs/autocrat/src/instructions/execute_spending_limit_change.rs @@ -0,0 +1,91 @@ +use super::*; + +use anchor_lang::Discriminator; +use squads_multisig_program::program::SquadsMultisigProgram; + +#[derive(Accounts)] +#[event_cpi] +pub struct ExecuteSpendingLimitChange<'info> { + #[account( + mut, has_one = dao, has_one = squads_proposal, + )] + pub proposal: Box>, + #[account(mut, has_one = squads_multisig)] + pub dao: Box>, + /// CHECK: checked by squads multisig program + #[account(mut)] + pub squads_proposal: Account<'info, squads_multisig_program::Proposal>, + #[account(address = vault_transaction.multisig)] + pub squads_multisig: Account<'info, squads_multisig_program::Multisig>, + pub squads_multisig_program: Program<'info, SquadsMultisigProgram>, + pub vault_transaction: Account<'info, squads_multisig_program::VaultTransaction>, +} + +impl<'info, 'c: 'info> ExecuteSpendingLimitChange<'info> { + pub fn validate(&self) -> Result<()> { + require_eq!(self.proposal.state, ProposalState::Passed); + + Ok(()) + } + + pub fn handle(ctx: Context<'_, '_, 'c, 'info, Self>) -> Result<()> { + let Self { + proposal: _, + dao, + squads_proposal, + squads_multisig, + squads_multisig_program, + vault_transaction, + event_authority: _, + program: _, + } = ctx.accounts; + + let message = &vault_transaction.message; + + // it would be bad if we signed with the Dao and then they ran off and did something else + // with it. so we verify that the only instructions are calls to update spending limits on + // the squads program + let squads_program_key_index: u8 = message + .account_keys + .iter() + .position(|key| key == &squads_multisig_program.key()) + .ok_or(error!(AutocratError::InvalidTransaction))? + .try_into() + .or_else(|_| Err(error!(AutocratError::InvalidTransaction)))?; + + for instruction in message.instructions.iter() { + require_eq!( + instruction.program_id_index, + squads_program_key_index, + AutocratError::InvalidTransaction + ); + + let discriminator: [u8; 8] = instruction.data[0..8].try_into().unwrap(); + if discriminator != squads_multisig_program::instruction::MultisigAddSpendingLimit::DISCRIMINATOR && + discriminator != squads_multisig_program::instruction::MultisigRemoveSpendingLimit::DISCRIMINATOR { + return Err(error!(AutocratError::InvalidTransaction)); + } + } + + let dao_nonce = &dao.nonce.to_le_bytes(); + let dao_creator_key = &dao.dao_creator.as_ref(); + let dao_seeds = &[b"dao".as_ref(), dao_creator_key, dao_nonce, &[dao.pda_bump]]; + let dao_signer = &[&dao_seeds[..]]; + + squads_multisig_program::cpi::vault_transaction_execute( + CpiContext::new_with_signer( + squads_multisig_program.to_account_info(), + squads_multisig_program::cpi::accounts::VaultTransactionExecute { + multisig: squads_multisig.to_account_info(), + proposal: squads_proposal.to_account_info(), + transaction: vault_transaction.to_account_info(), + member: dao.to_account_info(), + }, + dao_signer, + ) + .with_remaining_accounts((&ctx.remaining_accounts).to_vec()), + )?; + + Ok(()) + } +} diff --git a/programs/autocrat/src/instructions/mod.rs b/programs/autocrat/src/instructions/mod.rs index ea7c06b4..cf6cabf0 100644 --- a/programs/autocrat/src/instructions/mod.rs +++ b/programs/autocrat/src/instructions/mod.rs @@ -4,8 +4,10 @@ pub mod finalize_proposal; pub mod initialize_dao; pub mod initialize_proposal; pub mod update_dao; +pub mod execute_spending_limit_change; pub use finalize_proposal::*; pub use initialize_dao::*; pub use initialize_proposal::*; pub use update_dao::*; +pub use execute_spending_limit_change::*; \ No newline at end of file diff --git a/programs/autocrat/src/lib.rs b/programs/autocrat/src/lib.rs index 09fc11b0..30d9c52d 100644 --- a/programs/autocrat/src/lib.rs +++ b/programs/autocrat/src/lib.rs @@ -100,4 +100,11 @@ pub mod autocrat { pub fn update_dao(ctx: Context, dao_params: UpdateDaoParams) -> Result<()> { UpdateDao::handle(ctx, dao_params) } + + #[access_control(ctx.accounts.validate())] + pub fn execute_spending_limit_change<'c: 'info, 'info>( + ctx: Context<'_, '_, 'c, 'info, ExecuteSpendingLimitChange<'info>>, + ) -> Result<()> { + ExecuteSpendingLimitChange::handle(ctx) + } } From 3392e95f5335b3dd8452c852e5f578b303e9cc7d Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 00:57:30 +0000 Subject: [PATCH 02/11] Update autocrat verifiable build --- verifiable-builds/autocrat.so | Bin 476216 -> 527288 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/verifiable-builds/autocrat.so b/verifiable-builds/autocrat.so index ca4b7f1941560251f7404b19c19a5eebf4027d9b..706f875f2616f751a6cb6e947894149ad1b08eb4 100755 GIT binary patch delta 110751 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 he#geXTQi+AKgFff`*&i70 delta 75102 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%0D;#_4yA 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 YK9kaavZs5>9?|1OH7UxRw(nm52j8;PzW@LL From bbaece599d17474d3a4db1234dbca0ea529b90bd Mon Sep 17 00:00:00 2001 From: Kollan House Date: Fri, 3 Oct 2025 00:25:22 +0800 Subject: [PATCH 03/11] adds sdk and script for working with the intermediary v0.5 change --- Anchor.toml | 1 + scripts/executeSpendingLimit.ts | 152 +++++ sdk/src/v0.5/AmmClient.ts | 56 +- sdk/src/v0.5/AutocratClient.ts | 96 +-- sdk/src/v0.5/ConditionalVaultClient.ts | 102 ++-- sdk/src/v0.5/LaunchpadClient.ts | 74 +-- sdk/src/v0.5/SharedLiquidityManagerClient.ts | 4 +- sdk/src/v0.5/constants.ts | 42 +- sdk/src/v0.5/types/amm.ts | 62 +- sdk/src/v0.5/types/autocrat.ts | 158 ++++- sdk/src/v0.5/types/autocrat_migrator.ts | 6 +- sdk/src/v0.5/types/conditional_vault.ts | 64 +- sdk/src/v0.5/types/futarchy_amm.ts | 62 +- sdk/src/v0.5/types/launchpad.ts | 70 +-- sdk/src/v0.5/types/optimistic_timelock.ts | 62 +- sdk/src/v0.5/types/redemption.ts | 343 +++++++++++ .../v0.5/types/shared_liquidity_manager.ts | 2 +- sdk/src/v0.5/types/token_converter.ts | 553 ++++++++++++++++++ sdk/src/v0.5/utils/filters.ts | 4 +- sdk/src/v0.5/utils/index.ts | 2 +- sdk/src/v0.5/utils/metadata.ts | 2 +- sdk/src/v0.5/utils/pda.ts | 88 +-- sdk/src/v0.5/utils/priceMath.ts | 16 +- 23 files changed, 1586 insertions(+), 435 deletions(-) create mode 100644 scripts/executeSpendingLimit.ts create mode 100644 sdk/src/v0.5/types/redemption.ts create mode 100644 sdk/src/v0.5/types/token_converter.ts diff --git a/Anchor.toml b/Anchor.toml index e69f6f9f..b9b4ce3a 100644 --- a/Anchor.toml +++ b/Anchor.toml @@ -29,6 +29,7 @@ assign-permissionless-account = "yarn run tsx scripts/assignPermissionlessAccoun create-v04-proposal = "yarn run tsx scripts/createV04Proposal.ts" initialize-launch = "yarn run tsx scripts/initializeLaunch.ts" test = "npx mocha --import=tsx --bail tests/main.test.ts" +execute-spending-limit = "yarn run tsx scripts/executeSpendingLimit.ts" [test] startup_wait = 5000 diff --git a/scripts/executeSpendingLimit.ts b/scripts/executeSpendingLimit.ts new file mode 100644 index 00000000..8c17fe41 --- /dev/null +++ b/scripts/executeSpendingLimit.ts @@ -0,0 +1,152 @@ +import { PublicKey, Transaction } from "@solana/web3.js"; +import * as anchor from "@coral-xyz/anchor"; +import * as multisig from "@sqds/multisig"; +import { AutocratClient } from "../sdk/dist/v0.5/AutocratClient.js"; +import { getProposalAddr } from "../sdk/dist/v0.5/utils/index.js"; +import { AUTOCRAT_PROGRAM_ID } from "../sdk/dist/v0.5/constants.js"; +import { PERMISSIONLESS_ACCOUNT } from "@metadaoproject/futarchy/v0.5"; + +const provider = anchor.AnchorProvider.env(); +const payer = provider.wallet["payer"]; + +const DAO_ADDRESS = new PublicKey("7QbVKbEuqqrEANBaViB1XxoH34hqiroDqf2twkcusnWk"); +// const PROPOSAL_PDA = new PublicKey("Hh11b76gUQTfpuJLJqANxnm73zAHhQcj1MeKU44MJ93f"); + + +// Returns the multisig, spending limit and 0th vault pda for a given dao address +export const getSquadsPdasFromDao = async ( + daoAddress: string | PublicKey, +): Promise<{ + multisigPda: PublicKey; + spendingLimitPda: PublicKey; + vaultPda: PublicKey; +}> => { + const dao = + typeof daoAddress === "string" ? new PublicKey(daoAddress) : daoAddress; + const [multisigPda] = multisig.getMultisigPda({ + createKey: dao, + }); + + const [spendingLimitPda] = multisig.getSpendingLimitPda({ + multisigPda: multisigPda, + createKey: dao, + }); + + const [vaultPda] = multisig.getVaultPda({ + multisigPda: multisigPda, + index: 0, + }); + + return { + multisigPda, + spendingLimitPda, + vaultPda, + }; +}; + +const SQUADS_PROPOSAL_PDA = new PublicKey( + "Hh11b76gUQTfpuJLJqANxnm73zAHhQcj1MeKU44MJ93f", +); + +export default async function main() { + const autocrat = AutocratClient.createClient({ provider }); + + const dao = await autocrat.getDao(DAO_ADDRESS); + + const { multisigPda } = await getSquadsPdasFromDao(DAO_ADDRESS); + + console.log("multisigPda", multisigPda); + + const [metaDaoProposal] = getProposalAddr( + AUTOCRAT_PROGRAM_ID, + SQUADS_PROPOSAL_PDA, + ); + + console.log("metaDaoProposal", metaDaoProposal); + + + const multisigAccountInfo = + await multisig.accounts.Multisig.fromAccountAddress( + provider.connection, + multisigPda, + ); + + const currentTransactionIndex = Number(multisigAccountInfo.transactionIndex); + + console.log("currentTransactionIndex", currentTransactionIndex); + + const [proposalKey, proposalBump] = multisig.getProposalPda({ + multisigPda, + transactionIndex: BigInt(currentTransactionIndex - 2), + }); + + console.log("proposalKey", proposalKey); + + const metaDAOProposal = new PublicKey("AgzgRxxUU2Xniw2bEp8boBcz56kZmM1Sa7y9qESk5vnV"); + + const storedProposal = await autocrat.getProposal(metaDAOProposal); + + const [vaultTransactionPda] = multisig.getTransactionPda({ + multisigPda: multisigPda, + index: BigInt(currentTransactionIndex - 2), + }); + + console.log("vaultTransactionPda", vaultTransactionPda.toBase58()); + + const transactionAccount = + await multisig.accounts.VaultTransaction.fromAccountAddress( + provider.connection, + vaultTransactionPda, + ); + + console.log("transactionAccount", transactionAccount.vaultIndex); + const [vaultPda] = multisig.getVaultPda({ + multisigPda, + index: transactionAccount.vaultIndex, + programId: multisig.PROGRAM_ID, + }); + + console.log("vaultPda", vaultPda.toBase58()); + + const { accountMetas } = await multisig.utils.accountsForTransactionExecute( + { + connection: provider.connection, + message: transactionAccount.message, + ephemeralSignerBumps: [...transactionAccount.ephemeralSignerBumps], + vaultPda, + transactionPda: vaultTransactionPda, + programId: multisig.PROGRAM_ID, + }, + ); + + console.log("accountMetas", accountMetas); + + const tx = await autocrat.autocrat.methods + .executeSpendingLimitChange() + .accounts({ + squadsMultisig: multisigPda, + proposal: metaDAOProposal, + dao: DAO_ADDRESS, + squadsProposal: SQUADS_PROPOSAL_PDA, + squadsMultisigProgram: multisig.PROGRAM_ID, + vaultTransaction: vaultTransactionPda, + }) + .remainingAccounts( + accountMetas.map((meta) => + meta.pubkey.equals(DAO_ADDRESS) ? { ...meta, isSigner: false } : meta, + ), + ) + .transaction(); + + tx.feePayer = payer.publicKey; + tx.recentBlockhash = ( + await provider.connection.getLatestBlockhash() + ).blockhash; + tx.partialSign(payer); + const txHash = await provider.connection.sendRawTransaction(tx.serialize()); + console.log(`executeSpendingLimitChange transaction sent:`, txHash); + // const tx = await provider.sendAndConfirmTransaction(transaction); + +} + +main(); \ No newline at end of file diff --git a/sdk/src/v0.5/AmmClient.ts b/sdk/src/v0.5/AmmClient.ts index 2dca891d..62b540cb 100644 --- a/sdk/src/v0.5/AmmClient.ts +++ b/sdk/src/v0.5/AmmClient.ts @@ -36,7 +36,7 @@ export class AmmClient { constructor( provider: AnchorProvider, ammProgramId: PublicKey, - luts: AddressLookupTableAccount[] + luts: AddressLookupTableAccount[], ) { this.provider = provider; this.program = new Program(AmmIDL, ammProgramId, provider); @@ -44,7 +44,7 @@ export class AmmClient { } public static createClient( - createAutocratClientParams: CreateAmmClientParams + createAutocratClientParams: CreateAmmClientParams, ): AmmClient { let { provider, ammProgramId: programId } = createAutocratClientParams; @@ -75,7 +75,7 @@ export class AmmClient { quoteMint: PublicKey, twapStartDelaySlots: BN, twapInitialObservation: number, - twapMaxObservationChangePerUpdate?: number + twapMaxObservationChangePerUpdate?: number, ): Promise { if (!twapMaxObservationChangePerUpdate) { twapMaxObservationChangePerUpdate = twapInitialObservation * 0.02; @@ -84,11 +84,11 @@ export class AmmClient { let baseDecimals = unpackMint( baseMint, - await this.provider.connection.getAccountInfo(baseMint) + await this.provider.connection.getAccountInfo(baseMint), ).decimals; let quoteDecimals = unpackMint( quoteMint, - await this.provider.connection.getAccountInfo(quoteMint) + await this.provider.connection.getAccountInfo(quoteMint), ).decimals; let [twapFirstObservationScaled, twapMaxObservationChangePerUpdateScaled] = @@ -96,7 +96,7 @@ export class AmmClient { baseDecimals, quoteDecimals, twapInitialObservation, - twapMaxObservationChangePerUpdate + twapMaxObservationChangePerUpdate, ); await this.initializeAmmIx( @@ -104,7 +104,7 @@ export class AmmClient { quoteMint, twapStartDelaySlots, twapFirstObservationScaled, - twapMaxObservationChangePerUpdateScaled + twapMaxObservationChangePerUpdateScaled, ).rpc(); return amm; @@ -116,7 +116,7 @@ export class AmmClient { quoteMint: PublicKey, twapStartDelaySlots: BN, twapInitialObservation: BN, - twapMaxObservationChangePerUpdate: BN + twapMaxObservationChangePerUpdate: BN, ) { let [amm] = getAmmAddr(this.getProgramId(), baseMint, quoteMint); let [lpMint] = getAmmLpMintAddr(this.getProgramId(), amm); @@ -144,13 +144,13 @@ export class AmmClient { async addLiquidity( amm: PublicKey, quoteAmount?: number, - baseAmount?: number + baseAmount?: number, ) { let storedAmm = await this.getAmm(amm); let lpMintSupply = unpackMint( storedAmm.lpMint, - await this.provider.connection.getAccountInfo(storedAmm.lpMint) + await this.provider.connection.getAccountInfo(storedAmm.lpMint), ).supply; let quoteAmountCasted: BN | undefined; @@ -159,27 +159,27 @@ export class AmmClient { if (quoteAmount != undefined) { let quoteDecimals = unpackMint( storedAmm.quoteMint, - await this.provider.connection.getAccountInfo(storedAmm.quoteMint) + await this.provider.connection.getAccountInfo(storedAmm.quoteMint), ).decimals; quoteAmountCasted = new BN(quoteAmount).mul( - new BN(10).pow(new BN(quoteDecimals)) + new BN(10).pow(new BN(quoteDecimals)), ); } if (baseAmount != undefined) { let baseDecimals = unpackMint( storedAmm.baseMint, - await this.provider.connection.getAccountInfo(storedAmm.baseMint) + await this.provider.connection.getAccountInfo(storedAmm.baseMint), ).decimals; baseAmountCasted = new BN(baseAmount).mul( - new BN(10).pow(new BN(baseDecimals)) + new BN(10).pow(new BN(baseDecimals)), ); } if (lpMintSupply == 0n) { if (quoteAmount == undefined || baseAmount == undefined) { throw new Error( - "No pool created yet, you need to specify both base and quote" + "No pool created yet, you need to specify both base and quote", ); } @@ -192,7 +192,7 @@ export class AmmClient { storedAmm.quoteMint, quoteAmountCasted as BN, baseAmountCasted as BN, - new BN(0) + new BN(0), ).rpc(); } @@ -205,7 +205,7 @@ export class AmmClient { storedAmm.quoteAmount, Number(lpMintSupply), baseAmountCasted, - quoteAmountCasted + quoteAmountCasted, ); await this.addLiquidityIx( @@ -214,7 +214,7 @@ export class AmmClient { storedAmm.quoteMint, sim.quoteAmount, sim.baseAmount, - sim.expectedLpTokens + sim.expectedLpTokens, ).rpc(); } @@ -225,7 +225,7 @@ export class AmmClient { quoteAmount: BN, maxBaseAmount: BN, minLpTokens: BN, - user: PublicKey = this.provider.publicKey + user: PublicKey = this.provider.publicKey, ) { const [lpMint] = getAmmLpMintAddr(this.program.programId, amm); @@ -252,7 +252,7 @@ export class AmmClient { user, userLpAccount, user, - lpMint + lpMint, ), ]); } @@ -263,7 +263,7 @@ export class AmmClient { quoteMint: PublicKey, lpTokensToBurn: BN, minBaseAmount: BN, - minQuoteAmount: BN + minQuoteAmount: BN, ) { const [lpMint] = getAmmLpMintAddr(this.program.programId, ammAddr); @@ -280,17 +280,17 @@ export class AmmClient { userLpAccount: getAssociatedTokenAddressSync( lpMint, this.provider.publicKey, - true + true, ), userBaseAccount: getAssociatedTokenAddressSync( baseMint, this.provider.publicKey, - true + true, ), userQuoteAccount: getAssociatedTokenAddressSync( quoteMint, this.provider.publicKey, - true + true, ), vaultAtaBase: getAssociatedTokenAddressSync(baseMint, ammAddr, true), vaultAtaQuote: getAssociatedTokenAddressSync(quoteMint, ammAddr, true), @@ -301,7 +301,7 @@ export class AmmClient { amm: PublicKey, swapType: SwapType, inputAmount: number, - outputAmountMin: number + outputAmountMin: number, ) { const storedAmm = await this.getAmm(amm); @@ -324,7 +324,7 @@ export class AmmClient { storedAmm.quoteMint, swapType, inputAmountScaled, - outputAmountMinScaled + outputAmountMinScaled, ).rpc(); } @@ -335,7 +335,7 @@ export class AmmClient { swapType: SwapType, inputAmount: BN, outputAmountMin: BN, - user: PublicKey = this.provider.publicKey + user: PublicKey = this.provider.publicKey, ) { const receivingToken = swapType.buy ? baseMint : quoteMint; @@ -359,7 +359,7 @@ export class AmmClient { user, getAssociatedTokenAddressSync(receivingToken, user, true), user, - receivingToken + receivingToken, ), ]); } diff --git a/sdk/src/v0.5/AutocratClient.ts b/sdk/src/v0.5/AutocratClient.ts index 23a703a6..f05795e1 100644 --- a/sdk/src/v0.5/AutocratClient.ts +++ b/sdk/src/v0.5/AutocratClient.ts @@ -79,13 +79,13 @@ export class AutocratClient { autocratProgramId: PublicKey, conditionalVaultProgramId: PublicKey, ammProgramId: PublicKey, - luts: AddressLookupTableAccount[] + luts: AddressLookupTableAccount[], ) { this.provider = provider; this.autocrat = new Program( AutocratIDL, autocratProgramId, - provider + provider, ); this.vaultClient = ConditionalVaultClient.createClient({ provider, @@ -96,7 +96,7 @@ export class AutocratClient { } public static createClient( - createAutocratClientParams: CreateClientParams + createAutocratClientParams: CreateClientParams, ): AutocratClient { let { provider, @@ -112,7 +112,7 @@ export class AutocratClient { autocratProgramId || AUTOCRAT_PROGRAM_ID, conditionalVaultProgramId || CONDITIONAL_VAULT_PROGRAM_ID, ammProgramId || AMM_PROGRAM_ID, - luts + luts, ); } @@ -137,7 +137,7 @@ export class AutocratClient { } async deserializeProposal( - accountInfo: AccountInfo + accountInfo: AccountInfo, ): Promise { return this.autocrat.coder.accounts.decode("proposal", accountInfo.data); } @@ -150,7 +150,7 @@ export class AutocratClient { proposal: PublicKey, baseMint: PublicKey, quoteMint: PublicKey, - dao: PublicKey + dao: PublicKey, ): { question: PublicKey; baseVault: PublicKey; @@ -169,60 +169,60 @@ export class AutocratClient { vaultProgramId, sha256(`Will ${proposal} pass?/FAIL/PASS`), proposal, - 2 + 2, ); const [daoTreasury] = getDaoTreasuryAddr(this.autocrat.programId, dao); const [baseVault] = getVaultAddr( this.vaultClient.vaultProgram.programId, question, - baseMint + baseMint, ); const [quoteVault] = getVaultAddr( this.vaultClient.vaultProgram.programId, question, - quoteMint + quoteMint, ); const [failBaseMint] = getConditionalTokenMintAddr( vaultProgramId, baseVault, - 0 + 0, ); const [failQuoteMint] = getConditionalTokenMintAddr( vaultProgramId, quoteVault, - 0 + 0, ); const [passBaseMint] = getConditionalTokenMintAddr( vaultProgramId, baseVault, - 1 + 1, ); const [passQuoteMint] = getConditionalTokenMintAddr( vaultProgramId, quoteVault, - 1 + 1, ); const [passAmm] = getAmmAddr( this.ammClient.program.programId, passBaseMint, - passQuoteMint + passQuoteMint, ); const [failAmm] = getAmmAddr( this.ammClient.program.programId, failBaseMint, - failQuoteMint + failQuoteMint, ); const [passLp] = getAmmLpMintAddr( this.ammClient.program.programId, - passAmm + passAmm, ); const [failLp] = getAmmLpMintAddr( this.ammClient.program.programId, - failAmm + failAmm, ); return { @@ -339,7 +339,7 @@ export class AutocratClient { descriptionUrl: string, squadsProposal: PublicKey, baseTokensToLP: BN, - quoteTokensToLP: BN + quoteTokensToLP: BN, ): Promise { const storedDao = await this.getDao(dao); @@ -348,7 +348,7 @@ export class AutocratClient { await this.vaultClient.initializeQuestion( sha256(`Will ${proposal} pass?/FAIL/PASS`), proposal, - 2 + 2, ); const { @@ -365,7 +365,7 @@ export class AutocratClient { proposal, storedDao.baseMint, storedDao.quoteMint, - dao + dao, ); // it's important that these happen in a single atomic transaction @@ -379,16 +379,16 @@ export class AutocratClient { passQuoteMint, storedDao.twapStartDelaySlots, storedDao.twapInitialObservation, - storedDao.twapMaxObservationChangePerUpdate + storedDao.twapMaxObservationChangePerUpdate, ), this.ammClient.initializeAmmIx( failBaseMint, failQuoteMint, storedDao.twapStartDelaySlots, storedDao.twapInitialObservation, - storedDao.twapMaxObservationChangePerUpdate - ) - ) + storedDao.twapMaxObservationChangePerUpdate, + ), + ), ) .rpc(); @@ -402,9 +402,9 @@ export class AutocratClient { quoteVault, storedDao.quoteMint, quoteTokensToLP, - 2 - ) - ) + 2, + ), + ), ) .rpc(); @@ -415,7 +415,7 @@ export class AutocratClient { passQuoteMint, quoteTokensToLP, baseTokensToLP, - new BN(0) + new BN(0), ) .postInstructions( await InstructionUtils.getInstructions( @@ -425,9 +425,9 @@ export class AutocratClient { failQuoteMint, quoteTokensToLP, baseTokensToLP, - new BN(0) - ) - ) + new BN(0), + ), + ), ) .rpc(); @@ -442,7 +442,7 @@ export class AutocratClient { storedDao.quoteMint, lpTokens, lpTokens, - question + question, ).rpc(); return proposal; @@ -457,34 +457,34 @@ export class AutocratClient { passLpTokensToLock: BN, failLpTokensToLock: BN, question: PublicKey, - proposer: PublicKey = this.provider.publicKey + proposer: PublicKey = this.provider.publicKey, ) { let [proposal] = getProposalAddr(this.autocrat.programId, squadsProposal); const { baseVault, quoteVault, passAmm, failAmm } = this.getProposalPdas( proposal, baseMint, quoteMint, - dao + dao, ); const [passLp] = getAmmLpMintAddr( this.ammClient.program.programId, - passAmm + passAmm, ); const [failLp] = getAmmLpMintAddr( this.ammClient.program.programId, - failAmm + failAmm, ); const passLpVaultAccount = getAssociatedTokenAddressSync( passLp, proposal, - true + true, ); const failLpVaultAccount = getAssociatedTokenAddressSync( failLp, proposal, - true + true, ); return this.autocrat.methods @@ -507,12 +507,12 @@ export class AutocratClient { passLpUserAccount: getAssociatedTokenAddressSync( passLp, proposer, - true + true, ), failLpUserAccount: getAssociatedTokenAddressSync( failLp, proposer, - true + true, ), passLpVaultAccount, failLpVaultAccount, @@ -530,7 +530,7 @@ export class AutocratClient { storedProposal.dao, storedDao.baseMint, storedDao.quoteMint, - storedProposal.proposer + storedProposal.proposer, ).rpc(); } @@ -540,7 +540,7 @@ export class AutocratClient { dao: PublicKey, daoToken: PublicKey, usdc: PublicKey, - proposer: PublicKey + proposer: PublicKey, ) { let vaultProgramId = this.vaultClient.vaultProgram.programId; const multisigPda = multisig.getMultisigPda({ createKey: dao })[0]; @@ -550,16 +550,16 @@ export class AutocratClient { proposal, daoToken, usdc, - dao + dao, ); const [passLp] = getAmmLpMintAddr( this.ammClient.program.programId, - passAmm + passAmm, ); const [failLp] = getAmmLpMintAddr( this.ammClient.program.programId, - failAmm + failAmm, ); const [vaultEventAuthority] = getEventAuthorityAddr(vaultProgramId); @@ -636,7 +636,7 @@ export class AutocratClient { // there aren't enough proposals on devnet async crankProposalMarkets( proposals: PublicKey[], - priorityFeeMicroLamports: number + priorityFeeMicroLamports: number, ) { const amms: PublicKey[] = []; @@ -655,12 +655,12 @@ export class AutocratClient { let tx = new Transaction(); tx.add( - ComputeBudgetProgram.setComputeUnitLimit({ units: 4_000 * ixs.length }) + ComputeBudgetProgram.setComputeUnitLimit({ units: 4_000 * ixs.length }), ); tx.add( ComputeBudgetProgram.setComputeUnitPrice({ microLamports: priorityFeeMicroLamports, - }) + }), ); tx.add(...ixs); try { diff --git a/sdk/src/v0.5/ConditionalVaultClient.ts b/sdk/src/v0.5/ConditionalVaultClient.ts index ee3f0a36..047e0a46 100644 --- a/sdk/src/v0.5/ConditionalVaultClient.ts +++ b/sdk/src/v0.5/ConditionalVaultClient.ts @@ -42,18 +42,18 @@ export class ConditionalVaultClient { this.vaultProgram = new Program( ConditionalVaultIDL, conditionalVaultProgramId, - provider + provider, ); } public static createClient( - createVaultClientParams: CreateVaultClientParams + createVaultClientParams: CreateVaultClientParams, ): ConditionalVaultClient { let { provider, conditionalVaultProgramId } = createVaultClientParams; return new ConditionalVaultClient( provider, - conditionalVaultProgramId || CONDITIONAL_VAULT_PROGRAM_ID + conditionalVaultProgramId || CONDITIONAL_VAULT_PROGRAM_ID, ); } @@ -66,33 +66,33 @@ export class ConditionalVaultClient { } async deserializeQuestion( - accountInfo: AccountInfo + accountInfo: AccountInfo, ): Promise { return this.vaultProgram.coder.accounts.decode( "question", - accountInfo.data + accountInfo.data, ); } async deserializeVault( - accountInfo: AccountInfo + accountInfo: AccountInfo, ): Promise { return this.vaultProgram.coder.accounts.decode( "conditionalVault", - accountInfo.data + accountInfo.data, ); } initializeQuestionIx( questionId: Uint8Array, oracle: PublicKey, - numOutcomes: number + numOutcomes: number, ) { const [question] = getQuestionAddr( this.vaultProgram.programId, questionId, oracle, - numOutcomes + numOutcomes, ); return this.vaultProgram.methods @@ -109,13 +109,13 @@ export class ConditionalVaultClient { async initializeQuestion( questionId: Uint8Array, oracle: PublicKey, - numOutcomes: number + numOutcomes: number, ): Promise { const [question] = getQuestionAddr( this.vaultProgram.programId, questionId, oracle, - numOutcomes + numOutcomes, ); await this.initializeQuestionIx(questionId, oracle, numOutcomes).rpc(); @@ -127,12 +127,12 @@ export class ConditionalVaultClient { question: PublicKey, underlyingTokenMint: PublicKey, numOutcomes: number, - payer: PublicKey = this.provider.publicKey + payer: PublicKey = this.provider.publicKey, ) { const [vault] = getVaultAddr( this.vaultProgram.programId, question, - underlyingTokenMint + underlyingTokenMint, ); let conditionalTokenMintAddrs = []; @@ -140,7 +140,7 @@ export class ConditionalVaultClient { const [conditionalTokenMint] = getConditionalTokenMintAddr( this.vaultProgram.programId, vault, - i + i, ); conditionalTokenMintAddrs.push(conditionalTokenMint); } @@ -148,7 +148,7 @@ export class ConditionalVaultClient { const vaultUnderlyingTokenAccount = getAssociatedTokenAddressSync( underlyingTokenMint, vault, - true + true, ); return this.vaultProgram.methods @@ -164,7 +164,7 @@ export class ConditionalVaultClient { payer, vaultUnderlyingTokenAccount, vault, - underlyingTokenMint + underlyingTokenMint, ), ]) .remainingAccounts( @@ -174,7 +174,7 @@ export class ConditionalVaultClient { isWritable: true, isSigner: false, }; - }) + }), ); } @@ -183,18 +183,18 @@ export class ConditionalVaultClient { async initializeVault( question: PublicKey, underlyingTokenMint: PublicKey, - numOutcomes: number + numOutcomes: number, ): Promise { const [vault] = getVaultAddr( this.vaultProgram.programId, question, - underlyingTokenMint + underlyingTokenMint, ); await this.initializeVaultIx( question, underlyingTokenMint, - numOutcomes + numOutcomes, ).rpc(); return vault; @@ -203,7 +203,7 @@ export class ConditionalVaultClient { resolveQuestionIx( question: PublicKey, oracle: Keypair, - payoutNumerators: number[] + payoutNumerators: number[], ) { return this.vaultProgram.methods .resolveQuestion({ @@ -222,7 +222,7 @@ export class ConditionalVaultClient { const [conditionalTokenMint] = getConditionalTokenMintAddr( this.vaultProgram.programId, vault, - i + i, ); conditionalTokenMintAddrs.push(conditionalTokenMint); } @@ -231,7 +231,7 @@ export class ConditionalVaultClient { getRemainingAccounts( conditionalTokenMints: PublicKey[], - userConditionalAccounts: PublicKey[] + userConditionalAccounts: PublicKey[], ) { return conditionalTokenMints .concat(userConditionalAccounts) @@ -247,14 +247,14 @@ export class ConditionalVaultClient { vault: PublicKey, numOutcomes: number, user: PublicKey = this.provider.publicKey, - payer: PublicKey = this.provider.publicKey + payer: PublicKey = this.provider.publicKey, ) { const conditionalTokenMintAddrs = this.getConditionalTokenMints( vault, - numOutcomes + numOutcomes, ); const userConditionalAccounts = conditionalTokenMintAddrs.map((mint) => - getAssociatedTokenAddressSync(mint, user, true) + getAssociatedTokenAddressSync(mint, user, true), ); const preInstructions = conditionalTokenMintAddrs.map((mint) => @@ -262,13 +262,13 @@ export class ConditionalVaultClient { payer, getAssociatedTokenAddressSync(mint, user, true), user, - mint - ) + mint, + ), ); const remainingAccounts = this.getRemainingAccounts( conditionalTokenMintAddrs, - userConditionalAccounts + userConditionalAccounts, ); return { userConditionalAccounts, preInstructions, remainingAccounts }; @@ -281,14 +281,14 @@ export class ConditionalVaultClient { amount: BN, numOutcomes: number, user: PublicKey = this.provider.publicKey, - payer: PublicKey = this.provider.publicKey + payer: PublicKey = this.provider.publicKey, ) { const { preInstructions, remainingAccounts } = this.getConditionalTokenAccountsAndInstructions( vault, numOutcomes, user, - payer + payer, ); return this.vaultProgram.methods @@ -300,12 +300,12 @@ export class ConditionalVaultClient { vaultUnderlyingTokenAccount: getAssociatedTokenAddressSync( underlyingTokenMint, vault, - true + true, ), userUnderlyingTokenAccount: getAssociatedTokenAddressSync( underlyingTokenMint, user, - true + true, ), }) .preInstructions(preInstructions) @@ -319,17 +319,17 @@ export class ConditionalVaultClient { amount: BN, numOutcomes: number, user: PublicKey = this.provider.publicKey, - payer: PublicKey = this.provider.publicKey + payer: PublicKey = this.provider.publicKey, ) { let conditionalTokenMintAddrs = this.getConditionalTokenMints( vault, - numOutcomes + numOutcomes, ); let userConditionalAccounts = []; for (let conditionalTokenMint of conditionalTokenMintAddrs) { userConditionalAccounts.push( - getAssociatedTokenAddressSync(conditionalTokenMint, user, true) + getAssociatedTokenAddressSync(conditionalTokenMint, user, true), ); } @@ -342,12 +342,12 @@ export class ConditionalVaultClient { vaultUnderlyingTokenAccount: getAssociatedTokenAddressSync( underlyingTokenMint, vault, - true + true, ), userUnderlyingTokenAccount: getAssociatedTokenAddressSync( underlyingTokenMint, user, - true + true, ), }) .preInstructions( @@ -356,9 +356,9 @@ export class ConditionalVaultClient { payer, getAssociatedTokenAddressSync(conditionalTokenMint, user, true), user, - conditionalTokenMint + conditionalTokenMint, ); - }) + }), ) .remainingAccounts( conditionalTokenMintAddrs @@ -369,7 +369,7 @@ export class ConditionalVaultClient { isWritable: true, isSigner: false, }; - }) + }), ); return ix; @@ -381,14 +381,14 @@ export class ConditionalVaultClient { underlyingTokenMint: PublicKey, numOutcomes: number, user: PublicKey = this.provider.publicKey, - payer: PublicKey = this.provider.publicKey + payer: PublicKey = this.provider.publicKey, ) { let conditionalTokenMintAddrs = []; for (let i = 0; i < numOutcomes; i++) { const [conditionalTokenMint] = getConditionalTokenMintAddr( this.vaultProgram.programId, vault, - i + i, ); conditionalTokenMintAddrs.push(conditionalTokenMint); } @@ -396,7 +396,7 @@ export class ConditionalVaultClient { let userConditionalAccounts = []; for (let conditionalTokenMint of conditionalTokenMintAddrs) { userConditionalAccounts.push( - getAssociatedTokenAddressSync(conditionalTokenMint, user, true) + getAssociatedTokenAddressSync(conditionalTokenMint, user, true), ); } @@ -409,12 +409,12 @@ export class ConditionalVaultClient { vaultUnderlyingTokenAccount: getAssociatedTokenAddressSync( underlyingTokenMint, vault, - true + true, ), userUnderlyingTokenAccount: getAssociatedTokenAddressSync( underlyingTokenMint, user, - true + true, ), }) .preInstructions( @@ -423,9 +423,9 @@ export class ConditionalVaultClient { payer, getAssociatedTokenAddressSync(conditionalTokenMint, user, true), user, - conditionalTokenMint + conditionalTokenMint, ); - }) + }), ) .remainingAccounts( conditionalTokenMintAddrs @@ -436,7 +436,7 @@ export class ConditionalVaultClient { isWritable: true, isSigner: false, }; - }) + }), ); return ix; @@ -448,12 +448,12 @@ export class ConditionalVaultClient { name: string, symbol: string, uri: string, - payer: PublicKey = this.provider.publicKey + payer: PublicKey = this.provider.publicKey, ) { const [conditionalTokenMint] = getConditionalTokenMintAddr( this.vaultProgram.programId, vault, - index + index, ); const [conditionalTokenMetadata] = getMetadataAddr(conditionalTokenMint); diff --git a/sdk/src/v0.5/LaunchpadClient.ts b/sdk/src/v0.5/LaunchpadClient.ts index 5bf90b90..ab1be0db 100644 --- a/sdk/src/v0.5/LaunchpadClient.ts +++ b/sdk/src/v0.5/LaunchpadClient.ts @@ -62,7 +62,7 @@ export class LaunchpadClient { this.launchpad = new Program( LaunchpadIDL, params.launchpadProgramId || LAUNCHPAD_PROGRAM_ID, - this.provider + this.provider, ); this.autocratClient = AutocratClient.createClient({ provider: this.provider, @@ -97,19 +97,19 @@ export class LaunchpadClient { } async fetchFundingRecord( - fundingRecord: PublicKey + fundingRecord: PublicKey, ): Promise { return await this.launchpad.account.fundingRecord.fetchNullable( - fundingRecord + fundingRecord, ); } async deserializeFundingRecord( - accountInfo: AccountInfo + accountInfo: AccountInfo, ): Promise { return this.launchpad.coder.accounts.decode( "fundingRecord", - accountInfo.data + accountInfo.data, ); } @@ -125,23 +125,23 @@ export class LaunchpadClient { monthlySpendingLimitMembers: PublicKey[], launchAuthority: PublicKey = this.provider.publicKey, isDevnet: boolean = false, - payer: PublicKey = this.provider.publicKey + payer: PublicKey = this.provider.publicKey, ) { const [launch] = getLaunchAddr(this.launchpad.programId, baseMint); const [launchSigner] = getLaunchSignerAddr( this.launchpad.programId, - launch + launch, ); const quoteVault = getAssociatedTokenAddressSync( quoteMint, launchSigner, - true + true, ); const baseVault = getAssociatedTokenAddressSync( baseMint, launchSigner, - true + true, ); const [tokenMetadata] = getMetadataAddr(baseMint); @@ -172,7 +172,7 @@ export class LaunchpadClient { payer, getAssociatedTokenAddressSync(quoteMint, launchSigner, true), launchSigner, - quoteMint + quoteMint, ), ]); // .signers([tokenMintKp]); @@ -180,7 +180,7 @@ export class LaunchpadClient { startLaunchIx( launch: PublicKey, - launchAuthority: PublicKey = this.provider.publicKey + launchAuthority: PublicKey = this.provider.publicKey, ) { return this.launchpad.methods.startLaunch().accounts({ launch, @@ -193,28 +193,28 @@ export class LaunchpadClient { amount: BN, funder: PublicKey = this.provider.publicKey, quoteMint: PublicKey, - isDevnet: boolean = false + isDevnet: boolean = false, ) { const USDC = isDevnet ? DEVNET_USDC : MAINNET_USDC; const [launchSigner] = getLaunchSignerAddr( this.launchpad.programId, - launch + launch, ); const launchQuoteVault = getAssociatedTokenAddressSync( quoteMint, launchSigner, - true + true, ); const funderQuoteAccount = getAssociatedTokenAddressSync( quoteMint, funder, - true + true, ); const [fundingRecord] = getFundingRecordAddr( this.launchpad.programId, launch, - funder + funder, ); return this.launchpad.methods.fund(amount).accounts({ @@ -231,23 +231,23 @@ export class LaunchpadClient { launch: PublicKey, quoteMint: PublicKey, baseMint: PublicKey, - isDevnet: boolean = false + isDevnet: boolean = false, ) { const USDC = isDevnet ? DEVNET_USDC : MAINNET_USDC; const [launchSigner] = getLaunchSignerAddr( this.launchpad.programId, - launch + launch, ); const launchQuoteVault = getAssociatedTokenAddressSync( quoteMint, launchSigner, - true + true, ); const launchBaseVault = getAssociatedTokenAddressSync( baseMint, launchSigner, - true + true, ); // const daoKp = Keypair.generate(); @@ -272,7 +272,7 @@ export class LaunchpadClient { poolState.toBuffer(), baseMint.toBuffer(), ], - cpSwapProgramId + cpSwapProgramId, ); const [poolUsdcVault] = PublicKey.findProgramAddressSync( @@ -281,16 +281,16 @@ export class LaunchpadClient { poolState.toBuffer(), USDC.toBuffer(), ], - cpSwapProgramId + cpSwapProgramId, ); const [observationState] = PublicKey.findProgramAddressSync( [anchor.utils.bytes.utf8.encode("observation"), poolState.toBuffer()], - cpSwapProgramId + cpSwapProgramId, ); const [autocratEventAuthority] = getEventAuthorityAddr( - this.autocratClient.getProgramId() + this.autocratClient.getProgramId(), ); const [tokenMetadata] = getMetadataAddr(baseMint); @@ -309,7 +309,7 @@ export class LaunchpadClient { const treasuryQuoteAccount = getAssociatedTokenAddressSync( quoteMint, multisigVault, - true + true, ); return this.launchpad.methods.completeLaunch().accounts({ @@ -322,7 +322,7 @@ export class LaunchpadClient { treasuryLpAccount: getAssociatedTokenAddressSync( lpMint, multisigVault, - true + true, ), quoteMint, baseMint, @@ -367,28 +367,28 @@ export class LaunchpadClient { launch: PublicKey, funder: PublicKey = this.provider.publicKey, quoteMint: PublicKey, - isDevnet: boolean = false + isDevnet: boolean = false, ) { const [launchSigner] = getLaunchSignerAddr( this.launchpad.programId, - launch + launch, ); const [fundingRecord] = getFundingRecordAddr( this.launchpad.programId, launch, - funder + funder, ); const launchQuoteVault = getAssociatedTokenAddressSync( quoteMint, launchSigner, - true + true, ); const funderQuoteAccount = getAssociatedTokenAddressSync( quoteMint, funder, - true + true, ); return this.launchpad.methods.refund().accounts({ @@ -404,16 +404,16 @@ export class LaunchpadClient { claimIx( launch: PublicKey, baseMint: PublicKey, - funder: PublicKey = this.provider.publicKey + funder: PublicKey = this.provider.publicKey, ) { const [launchSigner] = getLaunchSignerAddr( this.launchpad.programId, - launch + launch, ); const [fundingRecord] = getFundingRecordAddr( this.launchpad.programId, launch, - funder + funder, ); return this.launchpad.methods @@ -426,13 +426,13 @@ export class LaunchpadClient { funderTokenAccount: getAssociatedTokenAddressSync( baseMint, funder, - true + true, ), baseMint, launchBaseVault: getAssociatedTokenAddressSync( baseMint, launchSigner, - true + true, ), }) .preInstructions([ @@ -440,7 +440,7 @@ export class LaunchpadClient { this.provider.publicKey, getAssociatedTokenAddressSync(baseMint, funder, true), funder, - baseMint + baseMint, ), ]); } diff --git a/sdk/src/v0.5/SharedLiquidityManagerClient.ts b/sdk/src/v0.5/SharedLiquidityManagerClient.ts index 3602494c..5b44571e 100644 --- a/sdk/src/v0.5/SharedLiquidityManagerClient.ts +++ b/sdk/src/v0.5/SharedLiquidityManagerClient.ts @@ -78,7 +78,7 @@ export class SharedLiquidityManagerClient { SharedLiquidityManagerIDL, params.sharedLiquidityManagerProgramId || SHARED_LIQUIDITY_MANAGER_PROGRAM_ID, - this.provider + this.provider, ); this.autocratClient = AutocratClient.createClient({ provider: this.provider, @@ -89,7 +89,7 @@ export class SharedLiquidityManagerClient { } public static createClient( - params: CreateSharedLiquidityManagerClientParams + params: CreateSharedLiquidityManagerClientParams, ): SharedLiquidityManagerClient { return new SharedLiquidityManagerClient(params); } diff --git a/sdk/src/v0.5/constants.ts b/sdk/src/v0.5/constants.ts index e1b0d3bc..38fd5c39 100644 --- a/sdk/src/v0.5/constants.ts +++ b/sdk/src/v0.5/constants.ts @@ -3,42 +3,42 @@ import * as anchor from "@coral-xyz/anchor"; import { BN } from "bn.js"; export const AUTOCRAT_PROGRAM_ID = new PublicKey( - "auToUr3CQza3D4qreT6Std2MTomfzvrEeCC5qh7ivW5" + "auToUr3CQza3D4qreT6Std2MTomfzvrEeCC5qh7ivW5", ); export const AMM_PROGRAM_ID = new PublicKey( - "AMMJdEiCCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ" + "AMMJdEiCCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ", ); export const CONDITIONAL_VAULT_PROGRAM_ID = new PublicKey( - "VLTX1ishMBbcX3rdBWGssxawAo1Q2X2qxYFYqiGodVg" + "VLTX1ishMBbcX3rdBWGssxawAo1Q2X2qxYFYqiGodVg", ); export const LAUNCHPAD_PROGRAM_ID = new PublicKey( - "mooNhciQJi1LqHDmse2JPic2NqG2PXCanbE3ZYzP3qA" + "mooNhciQJi1LqHDmse2JPic2NqG2PXCanbE3ZYzP3qA", ); export const SHARED_LIQUIDITY_MANAGER_PROGRAM_ID = new PublicKey( - "EoJc1PYxZbnCjszampLcwJGYcB5Md47jM4oSQacRtD4d" + "EoJc1PYxZbnCjszampLcwJGYcB5Md47jM4oSQacRtD4d", ); export const MPL_TOKEN_METADATA_PROGRAM_ID = new PublicKey( - "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", ); export const RAYDIUM_CP_SWAP_PROGRAM_ID = new PublicKey( - "CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C" + "CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C", ); export const DEVNET_RAYDIUM_CP_SWAP_PROGRAM_ID = new PublicKey( - "CPMDWBwJDtYax9qW7AyRuVC19Cc4L4Vcy4n2BHAbHkCW" + "CPMDWBwJDtYax9qW7AyRuVC19Cc4L4Vcy4n2BHAbHkCW", ); export const META_MINT = new PublicKey( - "3gN1WVEJwSHNWjo7hr87DgZp6zkf8kWgAJD29DmfE2Gr" + "3gN1WVEJwSHNWjo7hr87DgZp6zkf8kWgAJD29DmfE2Gr", ); export const MAINNET_USDC = new PublicKey( - "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" + "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", ); export const DEVNET_USDC = new PublicKey( - "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU" + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", ); export const USDC_DECIMALS = 6; @@ -47,16 +47,16 @@ export const AUTOCRAT_LUTS: PublicKey[] = []; export const RAYDIUM_AUTHORITY = PublicKey.findProgramAddressSync( [anchor.utils.bytes.utf8.encode("vault_and_lp_mint_auth_seed")], - RAYDIUM_CP_SWAP_PROGRAM_ID + RAYDIUM_CP_SWAP_PROGRAM_ID, )[0]; export const DEVNET_RAYDIUM_AUTHORITY = PublicKey.findProgramAddressSync( [anchor.utils.bytes.utf8.encode("vault_and_lp_mint_auth_seed")], - DEVNET_RAYDIUM_CP_SWAP_PROGRAM_ID + DEVNET_RAYDIUM_CP_SWAP_PROGRAM_ID, )[0]; export const LOW_FEE_RAYDIUM_CONFIG = new PublicKey( - "D4FPEruKEHrG5TenZ2mpDGEfu1iUvTiqBxvpU8HLBvC2" + "D4FPEruKEHrG5TenZ2mpDGEfu1iUvTiqBxvpU8HLBvC2", ); export const DEVNET_LOW_FEE_RAYDIUM_CONFIG = PublicKey.findProgramAddressSync( @@ -64,27 +64,27 @@ export const DEVNET_LOW_FEE_RAYDIUM_CONFIG = PublicKey.findProgramAddressSync( anchor.utils.bytes.utf8.encode("amm_config"), new BN(0).toArrayLike(Buffer, "be", 2), ], - DEVNET_RAYDIUM_CP_SWAP_PROGRAM_ID + DEVNET_RAYDIUM_CP_SWAP_PROGRAM_ID, )[0]; export const RAYDIUM_CREATE_POOL_FEE_RECEIVE = new PublicKey( - "DNXgeM9EiiaAbaWvwjHj9fQQLAX5ZsfHyvmYUNRAdNC8" + "DNXgeM9EiiaAbaWvwjHj9fQQLAX5ZsfHyvmYUNRAdNC8", ); export const DEVNET_RAYDIUM_CREATE_POOL_FEE_RECEIVE = new PublicKey( - "G11FKBRaAkHAKuLCgLM6K6NUc9rTjPAznRCjZifrTQe2" + "G11FKBRaAkHAKuLCgLM6K6NUc9rTjPAznRCjZifrTQe2", ); export const SQUADS_PROGRAM_CONFIG = new PublicKey( - "BSTq9w3kZwNwpBXJEvTZz2G9ZTNyKBvoSeXMvwb4cNZr" + "BSTq9w3kZwNwpBXJEvTZz2G9ZTNyKBvoSeXMvwb4cNZr", ); export const SQUADS_PROGRAM_ID = new PublicKey( - "SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf" + "SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf", ); export const SQUADS_PROGRAM_CONFIG_TREASURY = new PublicKey( - "5DH2e3cJmFpyi6mk65EGFediunm4ui6BiKNUNrhWtD1b" + "5DH2e3cJmFpyi6mk65EGFediunm4ui6BiKNUNrhWtD1b", ); export const PERMISSIONLESS_ACCOUNT = Keypair.fromSecretKey( @@ -93,5 +93,5 @@ export const PERMISSIONLESS_ACCOUNT = Keypair.fromSecretKey( 161, 209, 65, 217, 199, 121, 0, 250, 3, 203, 133, 138, 141, 112, 243, 38, 198, 205, 120, 222, 160, 224, 151, 190, 84, 254, 127, 178, 224, 195, 130, 243, 145, 73, 20, 91, 9, 69, 222, 184, 23, 1, 2, 196, 202, 206, 153, 192, - ]) + ]), ); diff --git a/sdk/src/v0.5/types/amm.ts b/sdk/src/v0.5/types/amm.ts index 82a44b23..6d36be8d 100644 --- a/sdk/src/v0.5/types/amm.ts +++ b/sdk/src/v0.5/types/amm.ts @@ -64,7 +64,7 @@ export type Amm = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -72,7 +72,7 @@ export type Amm = { type: { defined: "CreateAmmArgs"; }; - } + }, ]; }, { @@ -132,7 +132,7 @@ export type Amm = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -140,7 +140,7 @@ export type Amm = { type: { defined: "AddLiquidityArgs"; }; - } + }, ]; }, { @@ -200,7 +200,7 @@ export type Amm = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -208,7 +208,7 @@ export type Amm = { type: { defined: "RemoveLiquidityArgs"; }; - } + }, ]; }, { @@ -258,7 +258,7 @@ export type Amm = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -266,7 +266,7 @@ export type Amm = { type: { defined: "SwapArgs"; }; - } + }, ]; }, { @@ -286,10 +286,10 @@ export type Amm = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: []; - } + }, ]; accounts: [ { @@ -350,10 +350,10 @@ export type Amm = { { name: "vaultAtaQuote"; type: "publicKey"; - } + }, ]; }; - } + }, ]; types: [ { @@ -400,7 +400,7 @@ export type Amm = { { name: "seqNum"; type: "u64"; - } + }, ]; }; }, @@ -423,7 +423,7 @@ export type Amm = { name: "minLpTokens"; docs: ["The minimum LP token you will get back"]; type: "u64"; - } + }, ]; }; }, @@ -443,7 +443,7 @@ export type Amm = { { name: "twapStartDelaySlots"; type: "u64"; - } + }, ]; }; }, @@ -463,7 +463,7 @@ export type Amm = { { name: "minBaseAmount"; type: "u64"; - } + }, ]; }; }, @@ -485,7 +485,7 @@ export type Amm = { { name: "outputAmountMin"; type: "u64"; - } + }, ]; }; }, @@ -504,7 +504,7 @@ export type Amm = { "A price is the number of quote units per base unit multiplied by 1e12.", "You cannot simply divide by 1e12 to get a price you can display in the UI", "because the base and quote decimals may be different. Instead, do:", - "ui_price = (price * (10**(base_decimals - quote_decimals))) / 1e12" + "ui_price = (price * (10**(base_decimals - quote_decimals))) / 1e12", ]; type: "u128"; }, @@ -513,7 +513,7 @@ export type Amm = { docs: [ "If we did a raw TWAP over prices, someone could push the TWAP heavily with", "a few extremely large outliers. So we use observations, which can only move", - "by `max_observation_change_per_update` per update." + "by `max_observation_change_per_update` per update.", ]; type: "u128"; }, @@ -533,7 +533,7 @@ export type Amm = { "", "So in the case of an overflow, the aggregator rolls back to 0. It's the", "client's responsibility to sanity check the assets or to handle an", - "aggregator at T2 being smaller than an aggregator at T1." + "aggregator at T2 being smaller than an aggregator at T1.", ]; type: "u128"; }, @@ -550,10 +550,10 @@ export type Amm = { { name: "startDelaySlots"; docs: [ - "Number of slots after amm.created_at_slot to start recording TWAP" + "Number of slots after amm.created_at_slot to start recording TWAP", ]; type: "u64"; - } + }, ]; }; }, @@ -567,10 +567,10 @@ export type Amm = { }, { name: "Sell"; - } + }, ]; }; - } + }, ]; events: [ { @@ -599,7 +599,7 @@ export type Amm = { defined: "SwapType"; }; index: false; - } + }, ]; }, { @@ -636,7 +636,7 @@ export type Amm = { name: "lpTokensMinted"; type: "u64"; index: false; - } + }, ]; }, { @@ -673,7 +673,7 @@ export type Amm = { name: "quoteAmount"; type: "u64"; index: false; - } + }, ]; }, { @@ -720,7 +720,7 @@ export type Amm = { name: "vaultAtaQuote"; type: "publicKey"; index: false; - } + }, ]; }, { @@ -732,9 +732,9 @@ export type Amm = { defined: "CommonFields"; }; index: false; - } + }, ]; - } + }, ]; errors: [ { @@ -826,7 +826,7 @@ export type Amm = { code: 6017; name: "CastingOverflow"; msg: "Casting has caused an overflow"; - } + }, ]; }; diff --git a/sdk/src/v0.5/types/autocrat.ts b/sdk/src/v0.5/types/autocrat.ts index 506bc301..118da2fb 100644 --- a/sdk/src/v0.5/types/autocrat.ts +++ b/sdk/src/v0.5/types/autocrat.ts @@ -74,7 +74,7 @@ export type Autocrat = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -82,7 +82,7 @@ export type Autocrat = { type: { defined: "InitializeDaoParams"; }; - } + }, ]; }, { @@ -192,7 +192,7 @@ export type Autocrat = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -200,7 +200,7 @@ export type Autocrat = { type: { defined: "InitializeProposalParams"; }; - } + }, ]; }, { @@ -290,7 +290,7 @@ export type Autocrat = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: []; }, @@ -316,7 +316,7 @@ export type Autocrat = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -324,9 +324,55 @@ export type Autocrat = { type: { defined: "UpdateDaoParams"; }; - } + }, + ]; + }, + { + name: "executeSpendingLimitChange"; + accounts: [ + { + name: "proposal"; + isMut: true; + isSigner: false; + }, + { + name: "dao"; + isMut: true; + isSigner: false; + }, + { + name: "squadsProposal"; + isMut: true; + isSigner: false; + }, + { + name: "squadsMultisig"; + isMut: false; + isSigner: false; + }, + { + name: "squadsMultisigProgram"; + isMut: false; + isSigner: false; + }, + { + name: "vaultTransaction"; + isMut: false; + isSigner: false; + }, + { + name: "eventAuthority"; + isMut: false; + isSigner: false; + }, + { + name: "program"; + isMut: false; + isSigner: false; + }, ]; - } + args: []; + }, ]; accounts: [ { @@ -391,7 +437,7 @@ export type Autocrat = { "observation of 400 (converted into the AMM prices) and a max observation change per", "update of 8 (also converted into the AMM prices). Observations can be updated once", "a minute, so 2% allows the proposal market to reach double the spot price or 0", - "in 50 minutes." + "in 50 minutes.", ]; type: "u128"; }, @@ -402,7 +448,7 @@ export type Autocrat = { { name: "twapStartDelaySlots"; docs: [ - "Forces TWAP calculation to start after amm.created_at_slot + twap_start_delay_slots" + "Forces TWAP calculation to start after amm.created_at_slot + twap_start_delay_slots", ]; type: "u64"; }, @@ -414,7 +460,7 @@ export type Autocrat = { "", "For example, for META, we can use a `min_quote_futarchic_liquidity` of", "5000 * 1_000_000 (5000 USDC) and a `min_base_futarchic_liquidity` of", - "10 * 1_000_000_000 (10 META)." + "10 * 1_000_000_000 (10 META).", ]; type: "u64"; }, @@ -433,7 +479,7 @@ export type Autocrat = { defined: "InitialSpendingLimit"; }; }; - } + }, ]; }; }, @@ -507,10 +553,10 @@ export type Autocrat = { { name: "squadsProposal"; type: "publicKey"; - } + }, ]; }; - } + }, ]; types: [ { @@ -525,7 +571,7 @@ export type Autocrat = { { name: "unixTimestamp"; type: "i64"; - } + }, ]; }; }, @@ -573,7 +619,7 @@ export type Autocrat = { defined: "InitialSpendingLimit"; }; }; - } + }, ]; }; }, @@ -593,7 +639,7 @@ export type Autocrat = { { name: "failLpTokensToLock"; type: "u64"; - } + }, ]; }; }, @@ -637,7 +683,7 @@ export type Autocrat = { type: { option: "u64"; }; - } + }, ]; }; }, @@ -655,7 +701,7 @@ export type Autocrat = { type: { vec: "publicKey"; }; - } + }, ]; }; }, @@ -672,10 +718,10 @@ export type Autocrat = { }, { name: "Failed"; - } + }, ]; }; - } + }, ]; events: [ { @@ -751,7 +797,7 @@ export type Autocrat = { name: "squadsMultisigVault"; type: "publicKey"; index: false; - } + }, ]; }, { @@ -798,7 +844,7 @@ export type Autocrat = { name: "minBaseFutarchicLiquidity"; type: "u64"; index: false; - } + }, ]; }, { @@ -900,7 +946,7 @@ export type Autocrat = { name: "squadsMultisigVault"; type: "publicKey"; index: false; - } + }, ]; }, { @@ -954,7 +1000,7 @@ export type Autocrat = { name: "squadsMultisig"; type: "publicKey"; index: false; - } + }, ]; }, { @@ -976,9 +1022,9 @@ export type Autocrat = { name: "dao"; type: "publicKey"; index: false; - } + }, ]; - } + }, ]; errors: [ { @@ -1055,7 +1101,12 @@ export type Autocrat = { code: 6014; name: "InvalidSquadsProposalStatus"; msg: "Squads proposal must be in Draft status"; - } + }, + { + code: 6015; + name: "InvalidTransaction"; + msg: "This Squads transaction should only contain calls to update spending limits"; + }, ]; }; @@ -1388,6 +1439,52 @@ export const IDL: Autocrat = { }, ], }, + { + name: "executeSpendingLimitChange", + accounts: [ + { + name: "proposal", + isMut: true, + isSigner: false, + }, + { + name: "dao", + isMut: true, + isSigner: false, + }, + { + name: "squadsProposal", + isMut: true, + isSigner: false, + }, + { + name: "squadsMultisig", + isMut: false, + isSigner: false, + }, + { + name: "squadsMultisigProgram", + isMut: false, + isSigner: false, + }, + { + name: "vaultTransaction", + isMut: false, + isSigner: false, + }, + { + name: "eventAuthority", + isMut: false, + isSigner: false, + }, + { + name: "program", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, ], accounts: [ { @@ -2117,5 +2214,10 @@ export const IDL: Autocrat = { name: "InvalidSquadsProposalStatus", msg: "Squads proposal must be in Draft status", }, + { + code: 6015, + name: "InvalidTransaction", + msg: "This Squads transaction should only contain calls to update spending limits", + }, ], }; diff --git a/sdk/src/v0.5/types/autocrat_migrator.ts b/sdk/src/v0.5/types/autocrat_migrator.ts index 05f5d3fc..676d2df3 100644 --- a/sdk/src/v0.5/types/autocrat_migrator.ts +++ b/sdk/src/v0.5/types/autocrat_migrator.ts @@ -44,7 +44,7 @@ export type AutocratMigrator = { name: "lamportReceiver"; isMut: true; isSigner: false; - } + }, ]; args: []; }, @@ -110,10 +110,10 @@ export type AutocratMigrator = { name: "lamportReceiver"; isMut: true; isSigner: false; - } + }, ]; args: []; - } + }, ]; }; diff --git a/sdk/src/v0.5/types/conditional_vault.ts b/sdk/src/v0.5/types/conditional_vault.ts index fd83c4bf..27c245b7 100644 --- a/sdk/src/v0.5/types/conditional_vault.ts +++ b/sdk/src/v0.5/types/conditional_vault.ts @@ -29,7 +29,7 @@ export type ConditionalVault = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -37,7 +37,7 @@ export type ConditionalVault = { type: { defined: "InitializeQuestionArgs"; }; - } + }, ]; }, { @@ -62,7 +62,7 @@ export type ConditionalVault = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -70,7 +70,7 @@ export type ConditionalVault = { type: { defined: "ResolveQuestionArgs"; }; - } + }, ]; }, { @@ -125,7 +125,7 @@ export type ConditionalVault = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: []; }, @@ -171,13 +171,13 @@ export type ConditionalVault = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { name: "amount"; type: "u64"; - } + }, ]; }, { @@ -222,13 +222,13 @@ export type ConditionalVault = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { name: "amount"; type: "u64"; - } + }, ]; }, { @@ -273,7 +273,7 @@ export type ConditionalVault = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: []; }, @@ -324,7 +324,7 @@ export type ConditionalVault = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -332,9 +332,9 @@ export type ConditionalVault = { type: { defined: "AddMetadataToConditionalTokensArgs"; }; - } + }, ]; - } + }, ]; accounts: [ { @@ -371,7 +371,7 @@ export type ConditionalVault = { { name: "seqNum"; type: "u64"; - } + }, ]; }; }, @@ -397,7 +397,7 @@ export type ConditionalVault = { 'effective, the "effective" outcome would resolve to 0.7 and the "ineffective"', "outcome would resolve to 0.3.", "", - "Once resolved, the sum of all outcome resolutions is exactly 1." + "Once resolved, the sum of all outcome resolutions is exactly 1.", ]; type: { kind: "struct"; @@ -421,10 +421,10 @@ export type ConditionalVault = { { name: "payoutDenominator"; type: "u32"; - } + }, ]; }; - } + }, ]; types: [ { @@ -439,7 +439,7 @@ export type ConditionalVault = { { name: "unixTimestamp"; type: "i64"; - } + }, ]; }; }, @@ -459,7 +459,7 @@ export type ConditionalVault = { { name: "uri"; type: "string"; - } + }, ]; }; }, @@ -481,7 +481,7 @@ export type ConditionalVault = { { name: "numOutcomes"; type: "u8"; - } + }, ]; }; }, @@ -495,7 +495,7 @@ export type ConditionalVault = { type: { vec: "u32"; }; - } + }, ]; }; }, @@ -512,10 +512,10 @@ export type ConditionalVault = { }, { name: "Reverted"; - } + }, ]; }; - } + }, ]; events: [ { @@ -562,7 +562,7 @@ export type ConditionalVault = { name: "seqNum"; type: "u64"; index: false; - } + }, ]; }, { @@ -611,7 +611,7 @@ export type ConditionalVault = { name: "seqNum"; type: "u64"; index: false; - } + }, ]; }, { @@ -645,7 +645,7 @@ export type ConditionalVault = { name: "question"; type: "publicKey"; index: false; - } + }, ]; }, { @@ -701,7 +701,7 @@ export type ConditionalVault = { name: "seqNum"; type: "u64"; index: false; - } + }, ]; }, { @@ -750,7 +750,7 @@ export type ConditionalVault = { name: "seqNum"; type: "u64"; index: false; - } + }, ]; }, { @@ -774,7 +774,7 @@ export type ConditionalVault = { vec: "u32"; }; index: false; - } + }, ]; }, { @@ -830,9 +830,9 @@ export type ConditionalVault = { name: "seqNum"; type: "u64"; index: false; - } + }, ]; - } + }, ]; errors: [ { @@ -919,7 +919,7 @@ export type ConditionalVault = { code: 6016; name: "UnauthorizedConditionalTokenAccount"; msg: "Conditional token account is not owned by the authority"; - } + }, ]; }; diff --git a/sdk/src/v0.5/types/futarchy_amm.ts b/sdk/src/v0.5/types/futarchy_amm.ts index 01c21519..c1aef0d1 100644 --- a/sdk/src/v0.5/types/futarchy_amm.ts +++ b/sdk/src/v0.5/types/futarchy_amm.ts @@ -64,7 +64,7 @@ export type FutarchyAmm = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -72,7 +72,7 @@ export type FutarchyAmm = { type: { defined: "CreateAmmArgs"; }; - } + }, ]; }, { @@ -132,7 +132,7 @@ export type FutarchyAmm = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -140,7 +140,7 @@ export type FutarchyAmm = { type: { defined: "AddLiquidityArgs"; }; - } + }, ]; }, { @@ -200,7 +200,7 @@ export type FutarchyAmm = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -208,7 +208,7 @@ export type FutarchyAmm = { type: { defined: "RemoveLiquidityArgs"; }; - } + }, ]; }, { @@ -258,7 +258,7 @@ export type FutarchyAmm = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -266,7 +266,7 @@ export type FutarchyAmm = { type: { defined: "SwapArgs"; }; - } + }, ]; }, { @@ -286,10 +286,10 @@ export type FutarchyAmm = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: []; - } + }, ]; accounts: [ { @@ -350,10 +350,10 @@ export type FutarchyAmm = { { name: "vaultAtaQuote"; type: "publicKey"; - } + }, ]; }; - } + }, ]; types: [ { @@ -400,7 +400,7 @@ export type FutarchyAmm = { { name: "seqNum"; type: "u64"; - } + }, ]; }; }, @@ -423,7 +423,7 @@ export type FutarchyAmm = { name: "minLpTokens"; docs: ["The minimum LP token you will get back"]; type: "u64"; - } + }, ]; }; }, @@ -443,7 +443,7 @@ export type FutarchyAmm = { { name: "twapStartDelaySlots"; type: "u64"; - } + }, ]; }; }, @@ -463,7 +463,7 @@ export type FutarchyAmm = { { name: "minBaseAmount"; type: "u64"; - } + }, ]; }; }, @@ -485,7 +485,7 @@ export type FutarchyAmm = { { name: "outputAmountMin"; type: "u64"; - } + }, ]; }; }, @@ -504,7 +504,7 @@ export type FutarchyAmm = { "A price is the number of quote units per base unit multiplied by 1e12.", "You cannot simply divide by 1e12 to get a price you can display in the UI", "because the base and quote decimals may be different. Instead, do:", - "ui_price = (price * (10**(base_decimals - quote_decimals))) / 1e12" + "ui_price = (price * (10**(base_decimals - quote_decimals))) / 1e12", ]; type: "u128"; }, @@ -513,7 +513,7 @@ export type FutarchyAmm = { docs: [ "If we did a raw TWAP over prices, someone could push the TWAP heavily with", "a few extremely large outliers. So we use observations, which can only move", - "by `max_observation_change_per_update` per update." + "by `max_observation_change_per_update` per update.", ]; type: "u128"; }, @@ -533,7 +533,7 @@ export type FutarchyAmm = { "", "So in the case of an overflow, the aggregator rolls back to 0. It's the", "client's responsibility to sanity check the assets or to handle an", - "aggregator at T2 being smaller than an aggregator at T1." + "aggregator at T2 being smaller than an aggregator at T1.", ]; type: "u128"; }, @@ -550,10 +550,10 @@ export type FutarchyAmm = { { name: "startDelaySlots"; docs: [ - "Number of slots after amm.created_at_slot to start recording TWAP" + "Number of slots after amm.created_at_slot to start recording TWAP", ]; type: "u64"; - } + }, ]; }; }, @@ -567,10 +567,10 @@ export type FutarchyAmm = { }, { name: "Sell"; - } + }, ]; }; - } + }, ]; events: [ { @@ -599,7 +599,7 @@ export type FutarchyAmm = { defined: "SwapType"; }; index: false; - } + }, ]; }, { @@ -636,7 +636,7 @@ export type FutarchyAmm = { name: "lpTokensMinted"; type: "u64"; index: false; - } + }, ]; }, { @@ -673,7 +673,7 @@ export type FutarchyAmm = { name: "quoteAmount"; type: "u64"; index: false; - } + }, ]; }, { @@ -720,7 +720,7 @@ export type FutarchyAmm = { name: "vaultAtaQuote"; type: "publicKey"; index: false; - } + }, ]; }, { @@ -732,9 +732,9 @@ export type FutarchyAmm = { defined: "CommonFields"; }; index: false; - } + }, ]; - } + }, ]; errors: [ { @@ -826,7 +826,7 @@ export type FutarchyAmm = { code: 6017; name: "CastingOverflow"; msg: "Casting has caused an overflow"; - } + }, ]; }; diff --git a/sdk/src/v0.5/types/launchpad.ts b/sdk/src/v0.5/types/launchpad.ts index caddccc2..0af6abd3 100644 --- a/sdk/src/v0.5/types/launchpad.ts +++ b/sdk/src/v0.5/types/launchpad.ts @@ -84,7 +84,7 @@ export type Launchpad = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -92,7 +92,7 @@ export type Launchpad = { type: { defined: "InitializeLaunchArgs"; }; - } + }, ]; }, { @@ -117,7 +117,7 @@ export type Launchpad = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: []; }, @@ -178,13 +178,13 @@ export type Launchpad = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: [ { name: "amount"; type: "u64"; - } + }, ]; }, { @@ -318,7 +318,7 @@ export type Launchpad = { isMut: true; isSigner: false; docs: [ - "Use the lowest fee pool, can see fees at https://api-v3.raydium.io/main/cpmm-config" + "Use the lowest fee pool, can see fees at https://api-v3.raydium.io/main/cpmm-config", ]; }, { @@ -366,7 +366,7 @@ export type Launchpad = { name: "squadsProgramConfigTreasury"; isMut: true; isSigner: false; - } + }, ]; }, { @@ -378,7 +378,7 @@ export type Launchpad = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: []; }, @@ -434,7 +434,7 @@ export type Launchpad = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: []; }, @@ -500,10 +500,10 @@ export type Launchpad = { name: "program"; isMut: false; isSigner: false; - } + }, ]; args: []; - } + }, ]; accounts: [ { @@ -534,10 +534,10 @@ export type Launchpad = { { name: "seqNum"; docs: [ - "The sequence number of this funding record. Useful for sorting events." + "The sequence number of this funding record. Useful for sorting events.", ]; type: "u64"; - } + }, ]; }; }, @@ -555,7 +555,7 @@ export type Launchpad = { name: "minimumRaiseAmount"; docs: [ "The minimum amount of USDC that must be raised, otherwise", - "everyone can get their USDC back." + "everyone can get their USDC back.", ]; type: "u64"; }, @@ -563,14 +563,14 @@ export type Launchpad = { name: "monthlySpendingLimitAmount"; docs: [ "The monthly spending limit the DAO allocates to the team. Must be", - "less than 1/6th of the minimum raise amount (so 6 months of burn)." + "less than 1/6th of the minimum raise amount (so 6 months of burn).", ]; type: "u64"; }, { name: "monthlySpendingLimitMembers"; docs: [ - "The wallets that have access to the monthly spending limit." + "The wallets that have access to the monthly spending limit.", ]; type: { vec: "publicKey"; @@ -584,7 +584,7 @@ export type Launchpad = { { name: "launchSigner"; docs: [ - "The launch signer address. Needed because Raydium pools need a SOL payer and this PDA can't hold SOL." + "The launch signer address. Needed because Raydium pools need a SOL payer and this PDA can't hold SOL.", ]; type: "publicKey"; }, @@ -596,7 +596,7 @@ export type Launchpad = { { name: "launchQuoteVault"; docs: [ - "The USDC vault that will hold the USDC raised until the launch is over." + "The USDC vault that will hold the USDC raised until the launch is over.", ]; type: "publicKey"; }, @@ -608,7 +608,7 @@ export type Launchpad = { { name: "baseMint"; docs: [ - "The token that will be minted to funders and that will control the DAO." + "The token that will be minted to funders and that will control the DAO.", ]; type: "publicKey"; }, @@ -637,7 +637,7 @@ export type Launchpad = { { name: "seqNum"; docs: [ - "The sequence number of this launch. Useful for sorting events." + "The sequence number of this launch. Useful for sorting events.", ]; type: "u64"; }, @@ -656,15 +656,15 @@ export type Launchpad = { { name: "daoVault"; docs: [ - "The DAO treasury that USDC / LP is sent to, if the launch is complete." + "The DAO treasury that USDC / LP is sent to, if the launch is complete.", ]; type: { option: "publicKey"; }; - } + }, ]; }; - } + }, ]; types: [ { @@ -683,7 +683,7 @@ export type Launchpad = { { name: "launchSeqNum"; type: "u64"; - } + }, ]; }; }, @@ -721,7 +721,7 @@ export type Launchpad = { { name: "tokenUri"; type: "string"; - } + }, ]; }; }, @@ -741,10 +741,10 @@ export type Launchpad = { }, { name: "Refunding"; - } + }, ]; }; - } + }, ]; events: [ { @@ -811,7 +811,7 @@ export type Launchpad = { name: "secondsForLaunch"; type: "u32"; index: false; - } + }, ]; }, { @@ -838,7 +838,7 @@ export type Launchpad = { name: "slotStarted"; type: "u64"; index: false; - } + }, ]; }, { @@ -885,7 +885,7 @@ export type Launchpad = { name: "fundingRecordSeqNum"; type: "u64"; index: false; - } + }, ]; }, { @@ -928,7 +928,7 @@ export type Launchpad = { option: "publicKey"; }; index: false; - } + }, ]; }, { @@ -960,7 +960,7 @@ export type Launchpad = { name: "fundingRecord"; type: "publicKey"; index: false; - } + }, ]; }, { @@ -992,9 +992,9 @@ export type Launchpad = { name: "fundingRecord"; type: "publicKey"; index: false; - } + }, ]; - } + }, ]; errors: [ { @@ -1056,7 +1056,7 @@ export type Launchpad = { code: 6011; name: "InvalidMonthlySpendingLimit"; msg: "Monthly spending limit must be less than 1/6th of the minimum raise amount"; - } + }, ]; }; diff --git a/sdk/src/v0.5/types/optimistic_timelock.ts b/sdk/src/v0.5/types/optimistic_timelock.ts index dda1fa46..fa1f4313 100644 --- a/sdk/src/v0.5/types/optimistic_timelock.ts +++ b/sdk/src/v0.5/types/optimistic_timelock.ts @@ -14,7 +14,7 @@ export type OptimisticTimelock = { name: "timelock"; isMut: true; isSigner: true; - } + }, ]; args: [ { @@ -34,7 +34,7 @@ export type OptimisticTimelock = { { name: "enqueuerCooldownSlots"; type: "u64"; - } + }, ]; }, { @@ -49,13 +49,13 @@ export type OptimisticTimelock = { name: "timelock"; isMut: true; isSigner: false; - } + }, ]; args: [ { name: "delayInSlots"; type: "u64"; - } + }, ]; }, { @@ -70,13 +70,13 @@ export type OptimisticTimelock = { name: "timelock"; isMut: true; isSigner: false; - } + }, ]; args: [ { name: "authority"; type: "publicKey"; - } + }, ]; }, { @@ -91,13 +91,13 @@ export type OptimisticTimelock = { name: "timelock"; isMut: true; isSigner: false; - } + }, ]; args: [ { name: "cooldownSlots"; type: "u64"; - } + }, ]; }, { @@ -112,13 +112,13 @@ export type OptimisticTimelock = { name: "timelock"; isMut: true; isSigner: false; - } + }, ]; args: [ { name: "enqueuer"; type: "publicKey"; - } + }, ]; }, { @@ -133,13 +133,13 @@ export type OptimisticTimelock = { name: "timelock"; isMut: true; isSigner: false; - } + }, ]; args: [ { name: "optimisticProposer"; type: "publicKey"; - } + }, ]; }, { @@ -159,7 +159,7 @@ export type OptimisticTimelock = { name: "transactionBatch"; isMut: true; isSigner: true; - } + }, ]; args: []; }, @@ -175,7 +175,7 @@ export type OptimisticTimelock = { name: "transactionBatch"; isMut: true; isSigner: false; - } + }, ]; args: [ { @@ -193,7 +193,7 @@ export type OptimisticTimelock = { { name: "data"; type: "bytes"; - } + }, ]; }, { @@ -208,7 +208,7 @@ export type OptimisticTimelock = { name: "transactionBatch"; isMut: true; isSigner: false; - } + }, ]; args: []; }, @@ -229,7 +229,7 @@ export type OptimisticTimelock = { name: "transactionBatch"; isMut: true; isSigner: false; - } + }, ]; args: []; }, @@ -250,7 +250,7 @@ export type OptimisticTimelock = { name: "transactionBatch"; isMut: true; isSigner: false; - } + }, ]; args: []; }, @@ -271,10 +271,10 @@ export type OptimisticTimelock = { name: "transactionBatch"; isMut: true; isSigner: false; - } + }, ]; args: []; - } + }, ]; accounts: [ { @@ -305,10 +305,10 @@ export type OptimisticTimelock = { { name: "optimisticProposerCooldownSlots"; docs: [ - "The cooldown period for enqueuers to prevent spamming the timelock." + "The cooldown period for enqueuers to prevent spamming the timelock.", ]; type: "u64"; - } + }, ]; }; }, @@ -348,10 +348,10 @@ export type OptimisticTimelock = { type: { defined: "AuthorityType"; }; - } + }, ]; }; - } + }, ]; types: [ { @@ -366,7 +366,7 @@ export type OptimisticTimelock = { { name: "lastSlotEnqueued"; type: "u64"; - } + }, ]; }; }, @@ -394,7 +394,7 @@ export type OptimisticTimelock = { { name: "didExecute"; type: "bool"; - } + }, ]; }; }, @@ -414,7 +414,7 @@ export type OptimisticTimelock = { { name: "isWritable"; type: "bool"; - } + }, ]; }; }, @@ -428,7 +428,7 @@ export type OptimisticTimelock = { }, { name: "TimelockAuthority"; - } + }, ]; }; }, @@ -451,10 +451,10 @@ export type OptimisticTimelock = { }, { name: "Executed"; - } + }, ]; }; - } + }, ]; errors: [ { @@ -506,7 +506,7 @@ export type OptimisticTimelock = { code: 6009; name: "OptimisticProposerCooldown"; msg: "This optimistic proposer is still in its cooldown period"; - } + }, ]; }; diff --git a/sdk/src/v0.5/types/redemption.ts b/sdk/src/v0.5/types/redemption.ts new file mode 100644 index 00000000..bf2146e6 --- /dev/null +++ b/sdk/src/v0.5/types/redemption.ts @@ -0,0 +1,343 @@ +export type Redemption = { + version: "0.1.0"; + name: "redemption"; + instructions: [ + { + name: "initRedemptionConfig"; + accounts: [ + { + name: "authority"; + isMut: true; + isSigner: true; + }, + { + name: "redeemConfig"; + isMut: true; + isSigner: false; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "associatedTokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "maxRedeemAmount"; + type: "u64"; + }, + { + name: "burnToken"; + type: "bool"; + }, + ]; + }, + { + name: "triggerRedemption"; + accounts: [ + { + name: "redemption"; + isMut: true; + isSigner: false; + }, + { + name: "redeemConfig"; + isMut: true; + isSigner: false; + }, + { + name: "incomingMint"; + isMut: false; + isSigner: false; + }, + { + name: "vault"; + isMut: true; + isSigner: false; + }, + { + name: "user"; + isMut: false; + isSigner: true; + }, + { + name: "userIncomingTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "userOutgoingTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "amount"; + type: "u64"; + }, + ]; + }, + ]; + accounts: [ + { + name: "redemption"; + type: { + kind: "struct"; + fields: [ + { + name: "authority"; + type: "publicKey"; + }, + { + name: "maxRedeemAmount"; + type: "u64"; + }, + { + name: "incomingMint"; + type: "publicKey"; + }, + { + name: "vault"; + type: "publicKey"; + }, + { + name: "burnToken"; + type: "bool"; + }, + { + name: "redeemedAmount"; + type: "u64"; + }, + { + name: "bump"; + type: "u8"; + }, + ]; + }; + }, + { + name: "redeemConfig"; + type: { + kind: "struct"; + fields: [ + { + name: "authority"; + type: "publicKey"; + }, + { + name: "maxRedeemAmount"; + type: "u64"; + }, + { + name: "burnToken"; + type: "bool"; + }, + { + name: "bump"; + type: "u8"; + }, + ]; + }; + }, + ]; + errors: [ + { + code: 6000; + name: "RedeemAmountExceedsMaxRedeemAmount"; + msg: "Redeem amount exceeds max redeem amount"; + }, + { + code: 6001; + name: "Overflow"; + msg: "Overflow"; + }, + ]; +}; + +export const IDL: Redemption = { + version: "0.1.0", + name: "redemption", + instructions: [ + { + name: "initRedemptionConfig", + accounts: [ + { + name: "authority", + isMut: true, + isSigner: true, + }, + { + name: "redeemConfig", + isMut: true, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "associatedTokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "maxRedeemAmount", + type: "u64", + }, + { + name: "burnToken", + type: "bool", + }, + ], + }, + { + name: "triggerRedemption", + accounts: [ + { + name: "redemption", + isMut: true, + isSigner: false, + }, + { + name: "redeemConfig", + isMut: true, + isSigner: false, + }, + { + name: "incomingMint", + isMut: false, + isSigner: false, + }, + { + name: "vault", + isMut: true, + isSigner: false, + }, + { + name: "user", + isMut: false, + isSigner: true, + }, + { + name: "userIncomingTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "userOutgoingTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + ], + }, + ], + accounts: [ + { + name: "redemption", + type: { + kind: "struct", + fields: [ + { + name: "authority", + type: "publicKey", + }, + { + name: "maxRedeemAmount", + type: "u64", + }, + { + name: "incomingMint", + type: "publicKey", + }, + { + name: "vault", + type: "publicKey", + }, + { + name: "burnToken", + type: "bool", + }, + { + name: "redeemedAmount", + type: "u64", + }, + { + name: "bump", + type: "u8", + }, + ], + }, + }, + { + name: "redeemConfig", + type: { + kind: "struct", + fields: [ + { + name: "authority", + type: "publicKey", + }, + { + name: "maxRedeemAmount", + type: "u64", + }, + { + name: "burnToken", + type: "bool", + }, + { + name: "bump", + type: "u8", + }, + ], + }, + }, + ], + errors: [ + { + code: 6000, + name: "RedeemAmountExceedsMaxRedeemAmount", + msg: "Redeem amount exceeds max redeem amount", + }, + { + code: 6001, + name: "Overflow", + msg: "Overflow", + }, + ], +}; diff --git a/sdk/src/v0.5/types/shared_liquidity_manager.ts b/sdk/src/v0.5/types/shared_liquidity_manager.ts index 1502ffa8..124942da 100644 --- a/sdk/src/v0.5/types/shared_liquidity_manager.ts +++ b/sdk/src/v0.5/types/shared_liquidity_manager.ts @@ -83,7 +83,7 @@ export type SharedLiquidityManager = { code: 6015; name: "QuestionAlreadyResolved"; msg: "Question already resolved"; - } + }, ]; }; diff --git a/sdk/src/v0.5/types/token_converter.ts b/sdk/src/v0.5/types/token_converter.ts new file mode 100644 index 00000000..80fc5e1b --- /dev/null +++ b/sdk/src/v0.5/types/token_converter.ts @@ -0,0 +1,553 @@ +export type TokenConverter = { + version: "0.1.0"; + name: "token_converter"; + instructions: [ + { + name: "initializeTokenConverter"; + accounts: [ + { + name: "tokenConverter"; + isMut: true; + isSigner: false; + }, + { + name: "inboundTokenVault"; + isMut: true; + isSigner: false; + }, + { + name: "outboundTokenVault"; + isMut: true; + isSigner: false; + }, + { + name: "inboundTokenMint"; + isMut: false; + isSigner: false; + }, + { + name: "outboundTokenMint"; + isMut: false; + isSigner: false; + }, + { + name: "authority"; + isMut: true; + isSigner: true; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "associatedTokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "conversionRatio"; + type: "u64"; + }, + { + name: "nonce"; + type: "u64"; + }, + ]; + }, + { + name: "convert"; + accounts: [ + { + name: "tokenConverter"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: true; + isSigner: true; + }, + { + name: "from"; + isMut: true; + isSigner: false; + }, + { + name: "to"; + isMut: true; + isSigner: false; + }, + { + name: "inboundTokenVault"; + isMut: true; + isSigner: false; + }, + { + name: "outboundTokenVault"; + isMut: true; + isSigner: false; + }, + { + name: "inboundTokenMint"; + isMut: false; + isSigner: false; + }, + { + name: "outboundTokenMint"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "amount"; + type: "u64"; + }, + ]; + }, + ]; + accounts: [ + { + name: "tokenConverter"; + type: { + kind: "struct"; + fields: [ + { + name: "authority"; + type: "publicKey"; + }, + { + name: "inboundTokenMint"; + type: "publicKey"; + }, + { + name: "outboundTokenMint"; + type: "publicKey"; + }, + { + name: "inboundTokenVault"; + type: "publicKey"; + }, + { + name: "outboundTokenVault"; + type: "publicKey"; + }, + { + name: "inboundTokenDecimals"; + type: "u8"; + }, + { + name: "outboundTokenDecimals"; + type: "u8"; + }, + { + name: "conversionRatio"; + type: "u64"; + }, + { + name: "nonce"; + type: "u64"; + }, + { + name: "bump"; + type: "u8"; + }, + ]; + }; + }, + ]; + events: [ + { + name: "TokensConverted"; + fields: [ + { + name: "user"; + type: "publicKey"; + index: false; + }, + { + name: "tokenConverter"; + type: "publicKey"; + index: false; + }, + { + name: "inboundTokenMint"; + type: "publicKey"; + index: false; + }, + { + name: "outboundTokenMint"; + type: "publicKey"; + index: false; + }, + { + name: "inboundAmount"; + type: "u64"; + index: false; + }, + { + name: "outboundAmount"; + type: "u64"; + index: false; + }, + { + name: "timestamp"; + type: "i64"; + index: false; + }, + ]; + }, + ]; + errors: [ + { + code: 6000; + name: "InvalidAmount"; + msg: "Invalid amount - must be greater than 0"; + }, + { + code: 6001; + name: "InvalidInboundToken"; + msg: "Invalid inbound token mint"; + }, + { + code: 6002; + name: "InvalidOutboundToken"; + msg: "Invalid outbound token mint"; + }, + { + code: 6003; + name: "InvalidConverterInboundTokenAccount"; + msg: "Invalid converter inbound token account"; + }, + { + code: 6004; + name: "InvalidConverterOutboundTokenAccount"; + msg: "Invalid converter outbound token account"; + }, + { + code: 6005; + name: "InvalidAuthority"; + msg: "Invalid authority"; + }, + { + code: 6006; + name: "InsufficientBalance"; + msg: "Insufficient balance"; + }, + { + code: 6007; + name: "InsufficientConverterBalance"; + msg: "Insufficient converter balance"; + }, + { + code: 6008; + name: "ConverterNotActive"; + msg: "Converter not active"; + }, + { + code: 6009; + name: "Overflow"; + msg: "Arithmetic overflow"; + }, + { + code: 6010; + name: "AssertFailed"; + msg: "Assertion failed"; + }, + { + code: 6011; + name: "SameMint"; + msg: "Inbound and outbound mints cannot be the same"; + }, + ]; +}; + +export const IDL: TokenConverter = { + version: "0.1.0", + name: "token_converter", + instructions: [ + { + name: "initializeTokenConverter", + accounts: [ + { + name: "tokenConverter", + isMut: true, + isSigner: false, + }, + { + name: "inboundTokenVault", + isMut: true, + isSigner: false, + }, + { + name: "outboundTokenVault", + isMut: true, + isSigner: false, + }, + { + name: "inboundTokenMint", + isMut: false, + isSigner: false, + }, + { + name: "outboundTokenMint", + isMut: false, + isSigner: false, + }, + { + name: "authority", + isMut: true, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "associatedTokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "conversionRatio", + type: "u64", + }, + { + name: "nonce", + type: "u64", + }, + ], + }, + { + name: "convert", + accounts: [ + { + name: "tokenConverter", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: true, + isSigner: true, + }, + { + name: "from", + isMut: true, + isSigner: false, + }, + { + name: "to", + isMut: true, + isSigner: false, + }, + { + name: "inboundTokenVault", + isMut: true, + isSigner: false, + }, + { + name: "outboundTokenVault", + isMut: true, + isSigner: false, + }, + { + name: "inboundTokenMint", + isMut: false, + isSigner: false, + }, + { + name: "outboundTokenMint", + isMut: false, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + ], + }, + ], + accounts: [ + { + name: "tokenConverter", + type: { + kind: "struct", + fields: [ + { + name: "authority", + type: "publicKey", + }, + { + name: "inboundTokenMint", + type: "publicKey", + }, + { + name: "outboundTokenMint", + type: "publicKey", + }, + { + name: "inboundTokenVault", + type: "publicKey", + }, + { + name: "outboundTokenVault", + type: "publicKey", + }, + { + name: "inboundTokenDecimals", + type: "u8", + }, + { + name: "outboundTokenDecimals", + type: "u8", + }, + { + name: "conversionRatio", + type: "u64", + }, + { + name: "nonce", + type: "u64", + }, + { + name: "bump", + type: "u8", + }, + ], + }, + }, + ], + events: [ + { + name: "TokensConverted", + fields: [ + { + name: "user", + type: "publicKey", + index: false, + }, + { + name: "tokenConverter", + type: "publicKey", + index: false, + }, + { + name: "inboundTokenMint", + type: "publicKey", + index: false, + }, + { + name: "outboundTokenMint", + type: "publicKey", + index: false, + }, + { + name: "inboundAmount", + type: "u64", + index: false, + }, + { + name: "outboundAmount", + type: "u64", + index: false, + }, + { + name: "timestamp", + type: "i64", + index: false, + }, + ], + }, + ], + errors: [ + { + code: 6000, + name: "InvalidAmount", + msg: "Invalid amount - must be greater than 0", + }, + { + code: 6001, + name: "InvalidInboundToken", + msg: "Invalid inbound token mint", + }, + { + code: 6002, + name: "InvalidOutboundToken", + msg: "Invalid outbound token mint", + }, + { + code: 6003, + name: "InvalidConverterInboundTokenAccount", + msg: "Invalid converter inbound token account", + }, + { + code: 6004, + name: "InvalidConverterOutboundTokenAccount", + msg: "Invalid converter outbound token account", + }, + { + code: 6005, + name: "InvalidAuthority", + msg: "Invalid authority", + }, + { + code: 6006, + name: "InsufficientBalance", + msg: "Insufficient balance", + }, + { + code: 6007, + name: "InsufficientConverterBalance", + msg: "Insufficient converter balance", + }, + { + code: 6008, + name: "ConverterNotActive", + msg: "Converter not active", + }, + { + code: 6009, + name: "Overflow", + msg: "Arithmetic overflow", + }, + { + code: 6010, + name: "AssertFailed", + msg: "Assertion failed", + }, + { + code: 6011, + name: "SameMint", + msg: "Inbound and outbound mints cannot be the same", + }, + ], +}; diff --git a/sdk/src/v0.5/utils/filters.ts b/sdk/src/v0.5/utils/filters.ts index 945f7731..aee93f61 100644 --- a/sdk/src/v0.5/utils/filters.ts +++ b/sdk/src/v0.5/utils/filters.ts @@ -1,7 +1,7 @@ import { GetProgramAccountsFilter, PublicKey } from "@solana/web3.js"; export const filterPositionsByUser = ( - userAddr: PublicKey + userAddr: PublicKey, ): GetProgramAccountsFilter => ({ memcmp: { offset: 8, // discriminator @@ -10,7 +10,7 @@ export const filterPositionsByUser = ( }); export const filterPositionsByAmm = ( - ammAddr: PublicKey + ammAddr: PublicKey, ): GetProgramAccountsFilter => ({ memcmp: { offset: diff --git a/sdk/src/v0.5/utils/index.ts b/sdk/src/v0.5/utils/index.ts index cb5d012e..ee7438b0 100644 --- a/sdk/src/v0.5/utils/index.ts +++ b/sdk/src/v0.5/utils/index.ts @@ -26,7 +26,7 @@ export const addPriorityFee = (pf: number) => export const pubkeyToAccountInfo = ( pubkey: PublicKey, isWritable: boolean, - isSigner = false + isSigner = false, ): AccountMeta => { return { pubkey: pubkey, diff --git a/sdk/src/v0.5/utils/metadata.ts b/sdk/src/v0.5/utils/metadata.ts index 922a89f3..ef17bbdb 100644 --- a/sdk/src/v0.5/utils/metadata.ts +++ b/sdk/src/v0.5/utils/metadata.ts @@ -16,7 +16,7 @@ export const uploadConditionalTokenMetadataJson = async ( connection: Connection, identityPlugin: UmiPlugin, proposalNumber: number, - symbol: string + symbol: string, // proposal: BN, // conditionalToken: string, // image: string diff --git a/sdk/src/v0.5/utils/pda.ts b/sdk/src/v0.5/utils/pda.ts index 18478c47..ba9fe728 100644 --- a/sdk/src/v0.5/utils/pda.ts +++ b/sdk/src/v0.5/utils/pda.ts @@ -20,7 +20,7 @@ import { LAUNCHPAD_PROGRAM_ID, AUTOCRAT_PROGRAM_ID } from "../constants.js"; export const getEventAuthorityAddr = (programId: PublicKey) => { return PublicKey.findProgramAddressSync( [Buffer.from("__event_authority")], - programId + programId, ); }; @@ -28,7 +28,7 @@ export const getQuestionAddr = ( programId: PublicKey, questionId: Uint8Array, oracle: PublicKey, - numOutcomes: number + numOutcomes: number, ) => { if (questionId.length != 32) { throw new Error("questionId must be 32 bytes"); @@ -41,14 +41,14 @@ export const getQuestionAddr = ( oracle.toBuffer(), new BN(numOutcomes).toArrayLike(Buffer, "le", 1), ], - programId + programId, ); }; export const getVaultAddr = ( programId: PublicKey, question: PublicKey, - underlyingTokenMint: PublicKey + underlyingTokenMint: PublicKey, ) => { return PublicKey.findProgramAddressSync( [ @@ -56,14 +56,14 @@ export const getVaultAddr = ( question.toBuffer(), underlyingTokenMint.toBuffer(), ], - programId + programId, ); }; export const getConditionalTokenMintAddr = ( programId: PublicKey, vault: PublicKey, - index: number + index: number, ) => { return PublicKey.findProgramAddressSync( [ @@ -71,13 +71,13 @@ export const getConditionalTokenMintAddr = ( vault.toBuffer(), new BN(index).toArrayLike(Buffer, "le", 1), ], - programId + programId, ); }; export const getDownAndUpMintAddrs = ( programId: PublicKey, - vault: PublicKey + vault: PublicKey, ): { down: PublicKey; up: PublicKey } => { return { down: getConditionalTokenMintAddr(programId, vault, 0)[0], @@ -87,7 +87,7 @@ export const getDownAndUpMintAddrs = ( export const getFailAndPassMintAddrs = ( programId: PublicKey, - vault: PublicKey + vault: PublicKey, ): { fail: PublicKey; pass: PublicKey } => { return { fail: getConditionalTokenMintAddr(programId, vault, 0)[0], @@ -102,7 +102,7 @@ export const getMetadataAddr = (mint: PublicKey) => { MPL_TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer(), ], - MPL_TOKEN_METADATA_PROGRAM_ID + MPL_TOKEN_METADATA_PROGRAM_ID, ); }; @@ -121,31 +121,31 @@ export const getDaoAddr = ({ daoCreator.toBuffer(), nonce.toArrayLike(Buffer, "le", 8), ], - programId + programId, ); }; export const getDaoTreasuryAddr = ( programId: PublicKey, - dao: PublicKey + dao: PublicKey, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync([dao.toBuffer()], programId); }; export const getProposalAddr = ( programId: PublicKey, - squadsProposal: PublicKey + squadsProposal: PublicKey, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("proposal"), squadsProposal.toBuffer()], - programId + programId, ); }; export const getAmmAddr = ( programId: PublicKey, baseMint: PublicKey, - quoteMint: PublicKey + quoteMint: PublicKey, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [ @@ -153,58 +153,58 @@ export const getAmmAddr = ( baseMint.toBuffer(), quoteMint.toBuffer(), ], - programId + programId, ); }; export const getAmmLpMintAddr = ( programId: PublicKey, - amm: PublicKey + amm: PublicKey, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("amm_lp_mint"), amm.toBuffer()], - programId + programId, ); }; export function getLaunchAddr( programId: PublicKey = LAUNCHPAD_PROGRAM_ID, - tokenMint: PublicKey + tokenMint: PublicKey, ): [PublicKey, number] { return PublicKey.findProgramAddressSync( [Buffer.from("launch"), tokenMint.toBuffer()], - programId + programId, ); } export const getLaunchSignerAddr = ( programId: PublicKey = LAUNCHPAD_PROGRAM_ID, - launch: PublicKey + launch: PublicKey, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [Buffer.from("launch_signer"), launch.toBuffer()], - programId + programId, ); }; export const getFundingRecordAddr = ( programId: PublicKey = LAUNCHPAD_PROGRAM_ID, launch: PublicKey, - funder: PublicKey + funder: PublicKey, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [Buffer.from("funding_record"), launch.toBuffer(), funder.toBuffer()], - programId + programId, ); }; export const getLiquidityPoolAddr = ( programId: PublicKey = LAUNCHPAD_PROGRAM_ID, - dao: PublicKey + dao: PublicKey, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [Buffer.from("pool_state"), dao.toBuffer()], - programId + programId, ); }; @@ -212,7 +212,7 @@ export const getSharedLiquidityPoolAddr = ( programId: PublicKey = SHARED_LIQUIDITY_MANAGER_PROGRAM_ID, dao: PublicKey, creator: PublicKey, - proposalStakeRateThresholdBps: number + proposalStakeRateThresholdBps: number, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [ @@ -221,38 +221,38 @@ export const getSharedLiquidityPoolAddr = ( creator.toBuffer(), new BN(proposalStakeRateThresholdBps).toArrayLike(Buffer, "le", 2), ], - programId + programId, ); }; export const getSlPoolPositionAddr = ( programId: PublicKey = SHARED_LIQUIDITY_MANAGER_PROGRAM_ID, slPool: PublicKey, - user: PublicKey + user: PublicKey, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [Buffer.from("sl_pool_position"), slPool.toBuffer(), user.toBuffer()], - programId + programId, ); }; export const getRaydiumCpmmLpMintAddr = ( poolState: PublicKey, - isDevnet: boolean + isDevnet: boolean, ): [PublicKey, number] => { const programId = isDevnet ? DEVNET_RAYDIUM_CP_SWAP_PROGRAM_ID : RAYDIUM_CP_SWAP_PROGRAM_ID; return PublicKey.findProgramAddressSync( [Buffer.from("pool_lp_mint"), poolState.toBuffer()], - programId + programId, ); }; export const getRaydiumCpmmPoolVaultAddr = ( poolState: PublicKey, token: PublicKey, - isDevnet: boolean + isDevnet: boolean, ): [PublicKey, number] => { const programId = isDevnet ? DEVNET_RAYDIUM_CP_SWAP_PROGRAM_ID @@ -263,37 +263,37 @@ export const getRaydiumCpmmPoolVaultAddr = ( poolState.toBuffer(), token.toBuffer(), ], - programId + programId, ); }; export const getRaydiumCpmmObservationStateAddr = ( poolState: PublicKey, - isDevnet: boolean + isDevnet: boolean, ): [PublicKey, number] => { const programId = isDevnet ? DEVNET_RAYDIUM_CP_SWAP_PROGRAM_ID : RAYDIUM_CP_SWAP_PROGRAM_ID; return PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("observation"), poolState.toBuffer()], - programId + programId, ); }; export const getSharedLiquidityPoolSignerAddr = ( programId: PublicKey = SHARED_LIQUIDITY_MANAGER_PROGRAM_ID, - slPool: PublicKey + slPool: PublicKey, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [Buffer.from("sl_pool_signer"), slPool.toBuffer()], - programId + programId, ); }; export const getSpotPoolAddr = ( programId: PublicKey = SHARED_LIQUIDITY_MANAGER_PROGRAM_ID, slPool: PublicKey, - index: number + index: number, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [ @@ -301,27 +301,27 @@ export const getSpotPoolAddr = ( slPool.toBuffer(), new BN(index).toArrayLike(Buffer, "le", 4), ], - programId + programId, ); }; export const getDraftProposalAddr = ( programId: PublicKey = SHARED_LIQUIDITY_MANAGER_PROGRAM_ID, - nonce: BN + nonce: BN, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [Buffer.from("draft_proposal"), nonce.toArrayLike(Buffer, "le", 8)], - programId + programId, ); }; export const getStakeRecordAddr = ( programId: PublicKey = SHARED_LIQUIDITY_MANAGER_PROGRAM_ID, draftProposal: PublicKey, - staker: PublicKey + staker: PublicKey, ): [PublicKey, number] => { return PublicKey.findProgramAddressSync( [Buffer.from("stake_record"), draftProposal.toBuffer(), staker.toBuffer()], - programId + programId, ); }; diff --git a/sdk/src/v0.5/utils/priceMath.ts b/sdk/src/v0.5/utils/priceMath.ts index cebf00c3..ee861520 100644 --- a/sdk/src/v0.5/utils/priceMath.ts +++ b/sdk/src/v0.5/utils/priceMath.ts @@ -46,10 +46,10 @@ export class AmmMath { public static getHumanPrice( ammPrice: BN, baseDecimals: number, - quoteDecimals: number + quoteDecimals: number, ): number { const decimalScalar = BN_TEN.pow( - new BN(quoteDecimals - baseDecimals).abs() + new BN(quoteDecimals - baseDecimals).abs(), ); const price1e12 = quoteDecimals > baseDecimals @@ -67,14 +67,14 @@ export class AmmMath { public static getTwap(amm: Amm): BN { return amm.oracle.aggregator.div( - amm.oracle.lastUpdatedSlot.sub(amm.createdAtSlot) + amm.oracle.lastUpdatedSlot.sub(amm.createdAtSlot), ); } public static simulateSwapInner( inputAmount: BN, inputReserves: BN, - outputReserves: BN + outputReserves: BN, ): BN { if (inputReserves.eqn(0) || outputReserves.eqn(0)) { throw new Error("reserves must be non-zero"); @@ -93,7 +93,7 @@ export class AmmMath { swapType: SwapType, baseReserves: BN, quoteReserves: BN, - slippageBps?: BN + slippageBps?: BN, ): SwapSimulation { let inputReserves: BN, outputReserves: BN; if (swapType.buy) { @@ -107,7 +107,7 @@ export class AmmMath { let expectedOut = this.simulateSwapInner( inputAmount, inputReserves, - outputReserves + outputReserves, ); let minExpectedOut; @@ -144,7 +144,7 @@ export class AmmMath { userBalanceIn: BN, ammReserveIn: BN, ammReserveOut: BN, - slippageBps: BN + slippageBps: BN, ): { optimalSwapAmount: BN; userInAfterSwap: BN; @@ -181,7 +181,7 @@ export class AmmMath { let expectedOut = this.simulateSwapInner( new BN(swapAmount), ammReserveIn, - ammReserveOut + ammReserveOut, ); let minimumExpectedOut = Number(expectedOut) - (Number(expectedOut) * Number(slippageBps)) / 10000; From 49b4a0cdbcc7a0078facaf2149af19e6cde5b4f3 Mon Sep 17 00:00:00 2001 From: metaproph3t Date: Thu, 2 Oct 2025 11:00:30 -0700 Subject: [PATCH 04/11] Add instruction for upgrading the multisig to contain DAO as signer --- programs/autocrat/src/instructions/mod.rs | 4 +- .../src/instructions/upgrade_multisig_dao.rs | 122 +++++ programs/autocrat/src/lib.rs | 5 + tests/autocrat/main.test.ts | 2 + .../autocrat/unit/spendingLimitChange.test.ts | 447 ++++++++++++++++++ 5 files changed, 579 insertions(+), 1 deletion(-) create mode 100644 programs/autocrat/src/instructions/upgrade_multisig_dao.rs create mode 100644 tests/autocrat/unit/spendingLimitChange.test.ts diff --git a/programs/autocrat/src/instructions/mod.rs b/programs/autocrat/src/instructions/mod.rs index cf6cabf0..e65cee5a 100644 --- a/programs/autocrat/src/instructions/mod.rs +++ b/programs/autocrat/src/instructions/mod.rs @@ -5,9 +5,11 @@ pub mod initialize_dao; pub mod initialize_proposal; pub mod update_dao; pub mod execute_spending_limit_change; +pub mod upgrade_multisig_dao; pub use finalize_proposal::*; pub use initialize_dao::*; pub use initialize_proposal::*; pub use update_dao::*; -pub use execute_spending_limit_change::*; \ No newline at end of file +pub use execute_spending_limit_change::*; +pub use upgrade_multisig_dao::*; \ No newline at end of file diff --git a/programs/autocrat/src/instructions/upgrade_multisig_dao.rs b/programs/autocrat/src/instructions/upgrade_multisig_dao.rs new file mode 100644 index 00000000..10868a35 --- /dev/null +++ b/programs/autocrat/src/instructions/upgrade_multisig_dao.rs @@ -0,0 +1,122 @@ +use super::*; + +use squads_multisig_program::{program::SquadsMultisigProgram, Member, MultisigAddMemberArgs, MultisigRemoveMemberArgs, Permission, Permissions, Multisig}; + +pub mod metadao_multisig { + use anchor_lang::prelude::declare_id; + declare_id!("6awyHMshBGVjJ3ozdSJdyyDE1CTAXUwrpNMaRGMsb4sf"); +} + +#[derive(Accounts)] +pub struct UpgradeMultisigDao<'info> { + #[account(mut, has_one = squads_multisig)] + pub dao: Box>, + #[account(mut)] + pub squads_multisig: Account<'info, Multisig>, + pub squads_multisig_program: Program<'info, SquadsMultisigProgram>, + #[account(mut)] + pub rent_payer: Signer<'info>, + pub system_program: Program<'info, System>, + pub metadao_multisig: Signer<'info>, +} + +impl UpgradeMultisigDao<'_> { + pub fn validate(&self) -> Result<()> { + // #[cfg(feature = "production")] + require_eq!(self.metadao_multisig.key(), metadao_multisig::id()); + + Ok(()) + } + + pub fn handle(ctx: Context) -> Result<()> { + let Self { + dao, + squads_multisig, + squads_multisig_program, + rent_payer, + system_program, + metadao_multisig: _, + } = ctx.accounts; + + let dao_nonce = &dao.nonce.to_le_bytes(); + let dao_creator_key = &dao.dao_creator.as_ref(); + let dao_seeds = &[b"dao".as_ref(), dao_creator_key, dao_nonce, &[dao.pda_bump]]; + let dao_signer = &[&dao_seeds[..]]; + + squads_multisig_program::cpi::multisig_add_member( + CpiContext::new_with_signer( + squads_multisig_program.to_account_info(), + squads_multisig_program::cpi::accounts::MultisigConfig { + multisig: squads_multisig.to_account_info(), + config_authority: dao.to_account_info(), + rent_payer: Some(rent_payer.to_account_info()), + system_program: Some(system_program.to_account_info()), + }, + dao_signer, + ), + MultisigAddMemberArgs { + new_member: Member { + key: system_program.key(), + permissions: Permissions::from_vec(&[Permission::Vote, Permission::Execute]), + }, + memo: None, + } + )?; + + squads_multisig_program::cpi::multisig_remove_member( + CpiContext::new_with_signer( + squads_multisig_program.to_account_info(), + squads_multisig_program::cpi::accounts::MultisigConfig { + multisig: squads_multisig.to_account_info(), + config_authority: dao.to_account_info(), + rent_payer: Some(rent_payer.to_account_info()), + system_program: Some(system_program.to_account_info()), + }, + dao_signer, + ), + MultisigRemoveMemberArgs { + old_member: dao.key(), + memo: None, + } + )?; + + squads_multisig_program::cpi::multisig_add_member( + CpiContext::new_with_signer( + squads_multisig_program.to_account_info(), + squads_multisig_program::cpi::accounts::MultisigConfig { + multisig: squads_multisig.to_account_info(), + config_authority: dao.to_account_info(), + rent_payer: Some(rent_payer.to_account_info()), + system_program: Some(system_program.to_account_info()), + }, + dao_signer, + ), + MultisigAddMemberArgs { + new_member: Member { + key: dao.key(), + permissions: Permissions::from_vec(&[Permission::Vote, Permission::Execute]), + }, + memo: None, + } + )?; + + squads_multisig_program::cpi::multisig_remove_member( + CpiContext::new_with_signer( + squads_multisig_program.to_account_info(), + squads_multisig_program::cpi::accounts::MultisigConfig { + multisig: squads_multisig.to_account_info(), + config_authority: dao.to_account_info(), + rent_payer: Some(rent_payer.to_account_info()), + system_program: Some(system_program.to_account_info()), + }, + dao_signer, + ), + MultisigRemoveMemberArgs { + old_member: system_program.key(), + memo: None, + } + )?; + + Ok(()) + } +} diff --git a/programs/autocrat/src/lib.rs b/programs/autocrat/src/lib.rs index 30d9c52d..cb4a95c1 100644 --- a/programs/autocrat/src/lib.rs +++ b/programs/autocrat/src/lib.rs @@ -107,4 +107,9 @@ pub mod autocrat { ) -> Result<()> { ExecuteSpendingLimitChange::handle(ctx) } + + #[access_control(ctx.accounts.validate())] + pub fn upgrade_multisig_dao(ctx: Context) -> Result<()> { + UpgradeMultisigDao::handle(ctx) + } } diff --git a/tests/autocrat/main.test.ts b/tests/autocrat/main.test.ts index 2cd4df41..3a60a135 100644 --- a/tests/autocrat/main.test.ts +++ b/tests/autocrat/main.test.ts @@ -4,11 +4,13 @@ import proposalBatchTx from "./integration/proposalBatchTx.test.js"; import initializeDao from "./unit/initializeDao.test.js"; import initializeProposal from "./unit/initializeProposal.test.js"; import finalizeProposal from "./unit/finalizeProposal.test.js"; +import spendingLimitChange from "./unit/spendingLimitChange.test.js"; export default function suite() { describe("#initialize_dao", initializeDao); describe("#initialize_proposal", initializeProposal); describe("#finalize_proposal", finalizeProposal); + describe.only("#upgrade_multisig_dao", spendingLimitChange); // describe("autocrat", autocrat); describe("full proposal", fullProposal); diff --git a/tests/autocrat/unit/spendingLimitChange.test.ts b/tests/autocrat/unit/spendingLimitChange.test.ts new file mode 100644 index 00000000..dd8a3a65 --- /dev/null +++ b/tests/autocrat/unit/spendingLimitChange.test.ts @@ -0,0 +1,447 @@ +import { + getDaoAddr, + PERMISSIONLESS_ACCOUNT, + PriceMath, +} from "@metadaoproject/futarchy/v0.5"; +import { + ComputeBudgetProgram, + PublicKey, + Transaction, + TransactionMessage, +} from "@solana/web3.js"; +import BN from "bn.js"; +import { expectError, ONE_MINUTE_IN_SLOTS } from "../../utils.js"; +import { assert } from "chai"; +import * as multisig from "@sqds/multisig"; +import { MEMO_PROGRAM_ID } from "@solana/spl-memo"; +const { Permissions, Permission } = multisig.types; + +const THOUSAND_BUCK_PRICE = PriceMath.getAmmPrice(1000, 9, 6); + +// TODO: abstract away these tests to make code cleaner + +export default function suite() { + let META: PublicKey, + USDC: PublicKey, + dao: PublicKey, + proposal: PublicKey, + multisigPda: PublicKey, + squadsProposal: PublicKey; + + beforeEach(async function () { + META = await this.createMint(this.payer.publicKey, 9); + USDC = await this.createMint(this.payer.publicKey, 6); + + await this.createTokenAccount(META, this.payer.publicKey); + await this.createTokenAccount(USDC, this.payer.publicKey); + + await this.mintTo(META, this.payer.publicKey, this.payer, 100 * 10 ** 9); + await this.mintTo( + USDC, + this.payer.publicKey, + this.payer, + 100_000 * 1_000_000 + ); + + const nonce = new BN(Math.floor(Math.random() * 1000000)); + + await this.autocratClient + .initializeDaoIx({ + baseMint: META, + quoteMint: USDC, + params: { + slotsPerProposal: new BN(ONE_MINUTE_IN_SLOTS).muln(60 * 24 * 3), + twapStartDelaySlots: new BN(ONE_MINUTE_IN_SLOTS).muln(60 * 24), + twapInitialObservation: THOUSAND_BUCK_PRICE, + twapMaxObservationChangePerUpdate: THOUSAND_BUCK_PRICE.divn(100), + minQuoteFutarchicLiquidity: new BN(1), + minBaseFutarchicLiquidity: new BN(1000), + passThresholdBps: 300, + nonce, + initialSpendingLimit: null, + }, + }) + .rpc(); + + [dao] = getDaoAddr({ + nonce, + daoCreator: this.payer.publicKey, + }); + + multisigPda = multisig.getMultisigPda({ createKey: dao })[0]; + }); + + it.only("executes spending limit change proposal", async function () { + + await this.autocratClient.autocrat.methods.upgradeMultisigDao().accounts({ + dao, + squadsMultisig: multisigPda, + squadsMultisigProgram: multisig.PROGRAM_ID, + }).rpc(); + + const storedMultisig = await multisig.accounts.Multisig.fromAccountAddress( + this.squadsConnection, + multisigPda + ); + console.log(storedMultisig); + + return; + + const newSpendingLimitPda = multisig.getSpendingLimitPda({ + multisigPda, + createKey: dao, + })[0]; + + const addSpendingLimitIx = multisig.instructions.multisigAddSpendingLimit({ + multisigPda, + spendingLimit: newSpendingLimitPda, + configAuthority: dao, + rentPayer: this.payer.publicKey, + createKey: dao, + vaultIndex: 0, + mint: USDC, + amount: new BN(50_000 * 10 ** 6), // 50,000 USDC + period: multisig.types.Period.Month, + members: [this.payer.publicKey], // Only the DAO can use this spending limit + destinations: [], // No specific destinations + memo: "", + }); + + const proposalResult = await this.initializeAndLaunchProposal({ + dao, + instructions: [addSpendingLimitIx], + }); + + proposal = proposalResult.proposal; + squadsProposal = proposalResult.squadsProposal; + + const { question, quoteVault } = this.futarchy.getProposalPdas( + proposal, + META, + USDC, + dao, + ); + + await this.conditionalVault + .splitTokensIx(question, quoteVault, USDC, new BN(11_000 * 1_000_000), 2) + .rpc(); + + // Trade heavily on pass market to make it pass + await this.futarchy + .conditionalSwapIx({ + dao, + baseMint: META, + quoteMint: USDC, + proposal, + market: "pass", + swapType: "buy", + inputAmount: new BN(10_000 * 1_000_000), + }) + .rpc(); + + // Crank TWAP to build up price history + for (let i = 0; i < 100; i++) { + this.advanceBySeconds(10_000); + + await this.futarchy + .conditionalSwapIx({ + dao, + baseMint: META, + quoteMint: USDC, + proposal, + market: "pass", + swapType: "buy", + inputAmount: new BN(10), + }) + .preInstructions([ + ComputeBudgetProgram.setComputeUnitPrice({ microLamports: i }), + ]) + .rpc(); + } + + // Finalize the proposal + await this.futarchy.finalizeProposal(proposal); + + const storedProposal = await this.futarchy.getProposal(proposal); + assert.exists(storedProposal.state.passed); + + const [vaultTransactionPda] = multisig.getTransactionPda({ + multisigPda: multisigPda, + index: 1n, + }); + + const transactionAccount = + await multisig.accounts.VaultTransaction.fromAccountAddress( + this.squadsConnection, + vaultTransactionPda, + ); + + const [vaultPda] = multisig.getVaultPda({ + multisigPda, + index: transactionAccount.vaultIndex, + programId: multisig.PROGRAM_ID, + }); + + const { accountMetas } = await multisig.utils.accountsForTransactionExecute( + { + connection: this.squadsConnection, + message: transactionAccount.message, + ephemeralSignerBumps: [...transactionAccount.ephemeralSignerBumps], + vaultPda, + transactionPda: vaultTransactionPda, + programId: multisig.PROGRAM_ID, + }, + ); + + await this.futarchy.autocrat.methods + .executeSpendingLimitChange() + .accounts({ + squadsMultisig: multisigPda, + proposal, + dao, + squadsProposal, + squadsMultisigProgram: multisig.PROGRAM_ID, + vaultTransaction: vaultTransactionPda, + }) + .remainingAccounts( + accountMetas.map((meta) => + meta.pubkey.equals(dao) ? { ...meta, isSigner: false } : meta, + ), + ) + .rpc(); + }); + + it("throws if the transaction is to remove the DAO as a member", async function () { + const removeMemberIx = multisig.instructions.multisigRemoveMember({ + multisigPda, + configAuthority: dao, + oldMember: dao, + }); + + const proposalResult = await this.initializeAndLaunchProposal({ + dao, + instructions: [removeMemberIx], + }); + + proposal = proposalResult.proposal; + squadsProposal = proposalResult.squadsProposal; + + const { question, quoteVault } = this.futarchy.getProposalPdas( + proposal, + META, + USDC, + dao, + ); + + await this.conditionalVault + .splitTokensIx(question, quoteVault, USDC, new BN(11_000 * 1_000_000), 2) + .rpc(); + + // Trade heavily on pass market to make it pass + await this.futarchy + .conditionalSwapIx({ + dao, + baseMint: META, + quoteMint: USDC, + proposal, + market: "pass", + swapType: "buy", + inputAmount: new BN(10_000 * 1_000_000), + }) + .rpc(); + + // Crank TWAP to build up price history + for (let i = 0; i < 100; i++) { + this.advanceBySeconds(10_000); + + await this.futarchy + .conditionalSwapIx({ + dao, + baseMint: META, + quoteMint: USDC, + proposal, + market: "pass", + swapType: "buy", + inputAmount: new BN(10), + }) + .preInstructions([ + ComputeBudgetProgram.setComputeUnitPrice({ microLamports: i }), + ]) + .rpc(); + } + + // Finalize the proposal + await this.futarchy.finalizeProposal(proposal); + + const storedProposal = await this.futarchy.getProposal(proposal); + assert.exists(storedProposal.state.passed); + + const [vaultTransactionPda] = multisig.getTransactionPda({ + multisigPda: multisigPda, + index: 1n, + }); + + const transactionAccount = + await multisig.accounts.VaultTransaction.fromAccountAddress( + this.squadsConnection, + vaultTransactionPda, + ); + + const [vaultPda] = multisig.getVaultPda({ + multisigPda, + index: transactionAccount.vaultIndex, + programId: multisig.PROGRAM_ID, + }); + + const { accountMetas } = await multisig.utils.accountsForTransactionExecute( + { + connection: this.squadsConnection, + message: transactionAccount.message, + ephemeralSignerBumps: [...transactionAccount.ephemeralSignerBumps], + vaultPda, + transactionPda: vaultTransactionPda, + programId: multisig.PROGRAM_ID, + }, + ); + + const callbacks = expectError( + "InvalidTransaction", + "The transaction should not be executed because it contains a call to remove the DAO as a member", + ); + + await this.futarchy.autocrat.methods + .executeSpendingLimitChange() + .accounts({ + squadsMultisig: multisigPda, + proposal, + dao, + squadsProposal, + squadsMultisigProgram: multisig.PROGRAM_ID, + vaultTransaction: vaultTransactionPda, + }) + .remainingAccounts( + accountMetas.map((meta) => + meta.pubkey.equals(dao) ? { ...meta, isSigner: false } : meta, + ), + ) + .rpc() + .then(callbacks[0], callbacks[1]); + }); + + it("throws if the vault transaction is a memo instruction", async function () { + const proposalResult = await this.initializeAndLaunchProposal({ + dao, + instructions: [ + { + programId: MEMO_PROGRAM_ID, + keys: [], + data: Buffer.from("Hello, world!"), + }, + ], + }); + + proposal = proposalResult.proposal; + squadsProposal = proposalResult.squadsProposal; + + const { question, quoteVault } = this.futarchy.getProposalPdas( + proposal, + META, + USDC, + dao, + ); + + await this.conditionalVault + .splitTokensIx(question, quoteVault, USDC, new BN(11_000 * 1_000_000), 2) + .rpc(); + + // Trade heavily on pass market to make it pass + await this.futarchy + .conditionalSwapIx({ + dao, + baseMint: META, + quoteMint: USDC, + proposal, + market: "pass", + swapType: "buy", + inputAmount: new BN(10_000 * 1_000_000), + }) + .rpc(); + + // Crank TWAP to build up price history + for (let i = 0; i < 100; i++) { + this.advanceBySeconds(10_000); + + await this.futarchy + .conditionalSwapIx({ + dao, + baseMint: META, + quoteMint: USDC, + proposal, + market: "pass", + swapType: "buy", + inputAmount: new BN(10), + }) + .preInstructions([ + ComputeBudgetProgram.setComputeUnitPrice({ microLamports: i }), + ]) + .rpc(); + } + + // Finalize the proposal + await this.futarchy.finalizeProposal(proposal); + + const storedProposal = await this.futarchy.getProposal(proposal); + assert.exists(storedProposal.state.passed); + + const [vaultTransactionPda] = multisig.getTransactionPda({ + multisigPda: multisigPda, + index: 1n, + }); + + const transactionAccount = + await multisig.accounts.VaultTransaction.fromAccountAddress( + this.squadsConnection, + vaultTransactionPda, + ); + + const [vaultPda] = multisig.getVaultPda({ + multisigPda, + index: transactionAccount.vaultIndex, + programId: multisig.PROGRAM_ID, + }); + + const { accountMetas } = await multisig.utils.accountsForTransactionExecute( + { + connection: this.squadsConnection, + message: transactionAccount.message, + ephemeralSignerBumps: [...transactionAccount.ephemeralSignerBumps], + vaultPda, + transactionPda: vaultTransactionPda, + programId: multisig.PROGRAM_ID, + }, + ); + + const callbacks = expectError( + "InvalidTransaction", + "The transaction should not be executed because it contains a call to remove the DAO as a member", + ); + + await this.futarchy.autocrat.methods + .executeSpendingLimitChange() + .accounts({ + squadsMultisig: multisigPda, + proposal, + dao, + squadsProposal, + squadsMultisigProgram: multisig.PROGRAM_ID, + vaultTransaction: vaultTransactionPda, + }) + .remainingAccounts( + accountMetas.map((meta) => + meta.pubkey.equals(dao) ? { ...meta, isSigner: false } : meta, + ), + ) + .rpc() + .then(callbacks[0], callbacks[1]); + }); +} From aaa34ac75fe91d0bfd0320f450ccc6941bc6c724 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:09:17 +0000 Subject: [PATCH 05/11] Update autocrat verifiable build --- verifiable-builds/autocrat.so | Bin 527288 -> 560680 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/verifiable-builds/autocrat.so b/verifiable-builds/autocrat.so index 706f875f2616f751a6cb6e947894149ad1b08eb4..8d05fed75e3975a687f4171dc7b6c3015e18349a 100755 GIT binary patch delta 102072 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

~pn|hGn>qz+;%)`D853A6}V{}Ci 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

!cEHU3OO`k|0B5~x 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 HeeC}OjIAzr delta 80911 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 NbZGO*^SXU|{(m43JQ4r^ From f48bf511e96c786d2d10c1bbacba257b55bd45ac Mon Sep 17 00:00:00 2001 From: Kollan House Date: Fri, 3 Oct 2025 12:59:21 +0800 Subject: [PATCH 06/11] script for generating multisig instruction for upgrade --- Anchor.toml | 2 + scripts/upgradeDao.ts | 91 ++++++++++++++++++++++++++++++++++ sdk/src/v0.5/types/autocrat.ts | 72 +++++++++++++++++++++++++++ 3 files changed, 165 insertions(+) create mode 100644 scripts/upgradeDao.ts diff --git a/Anchor.toml b/Anchor.toml index b9b4ce3a..4d612b9a 100644 --- a/Anchor.toml +++ b/Anchor.toml @@ -30,6 +30,8 @@ create-v04-proposal = "yarn run tsx scripts/createV04Proposal.ts" initialize-launch = "yarn run tsx scripts/initializeLaunch.ts" test = "npx mocha --import=tsx --bail tests/main.test.ts" execute-spending-limit = "yarn run tsx scripts/executeSpendingLimit.ts" +upgrade-dao = "yarn run tsx scripts/upgradeDao.ts" +convert = "yarn run tsx scripts/convertpk.ts" [test] startup_wait = 5000 diff --git a/scripts/upgradeDao.ts b/scripts/upgradeDao.ts new file mode 100644 index 00000000..929dd0f5 --- /dev/null +++ b/scripts/upgradeDao.ts @@ -0,0 +1,91 @@ +import { PublicKey, Transaction, TransactionMessage } from "@solana/web3.js"; +import * as multisig from "@sqds/multisig"; +import * as anchor from "@coral-xyz/anchor"; +import { AutocratClient } from "../sdk/dist/v0.5/AutocratClient.js"; +import { Keypair } from "@solana/web3.js"; +import fs from 'fs'; + +const provider = anchor.AnchorProvider.env(); +const payer = provider.wallet["payer"]; + +const bytes = JSON.parse(fs.readFileSync('./prop.json', 'utf8')); +const keypair = Keypair.fromSecretKey(new Uint8Array(bytes)); + +const proposer = keypair; + +const autocratClient = AutocratClient.createClient({ provider }); +const daoAddress = new PublicKey('7QbVKbEuqqrEANBaViB1XxoH34hqiroDqf2twkcusnWk') +const squadsPayer = new PublicKey("6awyHMshBGVjJ3ozdSJdyyDE1CTAXUwrpNMaRGMsb4sf") + +const daoUpgrade = async () => { + const dao = + typeof daoAddress === "string" ? new PublicKey(daoAddress) : daoAddress; + const [multisigPda] = multisig.getMultisigPda({ + createKey: dao, + }); + + + const metaDaoUpgradeTxn = await autocratClient.autocrat.methods + .upgradeMultisigDao() + .accounts({ + dao, + squadsMultisig: multisigPda, + squadsMultisigProgram: multisig.PROGRAM_ID, + rentPayer: squadsPayer, + metadaoMultisig: new PublicKey("6awyHMshBGVjJ3ozdSJdyyDE1CTAXUwrpNMaRGMsb4sf") + }).transaction(); + + return metaDaoUpgradeTxn; +} + +const main = async () => { + + const metaDaoUpgradeTxn = await daoUpgrade(); + + + const transactionMessage = new TransactionMessage({ + payerKey: squadsPayer, + recentBlockhash: (await provider.connection.getLatestBlockhash()).blockhash, + instructions: metaDaoUpgradeTxn.instructions, + }); + + const metaDaoUpgradeMultisigPda = new PublicKey("8N3Tvc6B1wEVKVC6iD4s6eyaCNqX2ovj2xze2q3Q9DWH") + + const multisigAccountInfo = + await multisig.accounts.Multisig.fromAccountAddress( + provider.connection, + metaDaoUpgradeMultisigPda, + ); + + const currentTransactionIndex = Number(multisigAccountInfo.transactionIndex); + + const upgradeViaMultisigTxn = multisig.instructions.vaultTransactionCreate({ + multisigPda: metaDaoUpgradeMultisigPda, + transactionIndex: BigInt(currentTransactionIndex + 1), + creator: proposer.publicKey, + rentPayer: payer.publicKey, + vaultIndex: 0, + ephemeralSigners: 0, + transactionMessage + }); + + const proposalCreateIx = multisig.instructions.proposalCreate({ + multisigPda: metaDaoUpgradeMultisigPda, + transactionIndex: BigInt(currentTransactionIndex + 1), + creator: proposer.publicKey, + rentPayer: payer.publicKey, + isDraft: false, + }); + + const tx = new Transaction().add(upgradeViaMultisigTxn, proposalCreateIx) + + tx.feePayer = payer.publicKey; + tx.recentBlockhash = ( + await provider.connection.getLatestBlockhash() + ).blockhash; + tx.partialSign(payer, proposer); + const txHash = await provider.connection.sendRawTransaction(tx.serialize()); + console.log(`upgradeDao transaction sent:`, txHash); +} + +main(); \ No newline at end of file diff --git a/sdk/src/v0.5/types/autocrat.ts b/sdk/src/v0.5/types/autocrat.ts index 118da2fb..c6c7696a 100644 --- a/sdk/src/v0.5/types/autocrat.ts +++ b/sdk/src/v0.5/types/autocrat.ts @@ -373,6 +373,42 @@ export type Autocrat = { ]; args: []; }, + { + name: "upgradeMultisigDao"; + accounts: [ + { + name: "dao"; + isMut: true; + isSigner: false; + }, + { + name: "squadsMultisig"; + isMut: true; + isSigner: false; + }, + { + name: "squadsMultisigProgram"; + isMut: false; + isSigner: false; + }, + { + name: "rentPayer"; + isMut: true; + isSigner: true; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "metadaoMultisig"; + isMut: false; + isSigner: true; + }, + ]; + args: []; + }, ]; accounts: [ { @@ -1485,6 +1521,42 @@ export const IDL: Autocrat = { ], args: [], }, + { + name: "upgradeMultisigDao", + accounts: [ + { + name: "dao", + isMut: true, + isSigner: false, + }, + { + name: "squadsMultisig", + isMut: true, + isSigner: false, + }, + { + name: "squadsMultisigProgram", + isMut: false, + isSigner: false, + }, + { + name: "rentPayer", + isMut: true, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "metadaoMultisig", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, ], accounts: [ { From 9edd5c7e22f79289e2802dcbf493d94f5569ab3e Mon Sep 17 00:00:00 2001 From: metaproph3t Date: Thu, 2 Oct 2025 22:06:46 -0700 Subject: [PATCH 07/11] Change metadao multisig to kollan address --- .../autocrat/src/instructions/upgrade_multisig_dao.rs | 10 +++++----- sdk/src/v0.5/types/autocrat.ts | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/programs/autocrat/src/instructions/upgrade_multisig_dao.rs b/programs/autocrat/src/instructions/upgrade_multisig_dao.rs index 10868a35..7b15ffa4 100644 --- a/programs/autocrat/src/instructions/upgrade_multisig_dao.rs +++ b/programs/autocrat/src/instructions/upgrade_multisig_dao.rs @@ -2,9 +2,9 @@ use super::*; use squads_multisig_program::{program::SquadsMultisigProgram, Member, MultisigAddMemberArgs, MultisigRemoveMemberArgs, Permission, Permissions, Multisig}; -pub mod metadao_multisig { +pub mod kollan_address { use anchor_lang::prelude::declare_id; - declare_id!("6awyHMshBGVjJ3ozdSJdyyDE1CTAXUwrpNMaRGMsb4sf"); + declare_id!("tSTp6B6kE9o6ZaTmHm2ZwnJBBtgd3x112tapxFhmBEQ"); } #[derive(Accounts)] @@ -17,13 +17,13 @@ pub struct UpgradeMultisigDao<'info> { #[account(mut)] pub rent_payer: Signer<'info>, pub system_program: Program<'info, System>, - pub metadao_multisig: Signer<'info>, + pub kollan: Signer<'info>, } impl UpgradeMultisigDao<'_> { pub fn validate(&self) -> Result<()> { // #[cfg(feature = "production")] - require_eq!(self.metadao_multisig.key(), metadao_multisig::id()); + require_eq!(self.kollan.key(), kollan_address::id()); Ok(()) } @@ -35,7 +35,7 @@ impl UpgradeMultisigDao<'_> { squads_multisig_program, rent_payer, system_program, - metadao_multisig: _, + kollan: _, } = ctx.accounts; let dao_nonce = &dao.nonce.to_le_bytes(); diff --git a/sdk/src/v0.5/types/autocrat.ts b/sdk/src/v0.5/types/autocrat.ts index c6c7696a..9250f0e0 100644 --- a/sdk/src/v0.5/types/autocrat.ts +++ b/sdk/src/v0.5/types/autocrat.ts @@ -402,7 +402,7 @@ export type Autocrat = { isSigner: false; }, { - name: "metadaoMultisig"; + name: "kollan"; isMut: false; isSigner: true; }, @@ -1550,7 +1550,7 @@ export const IDL: Autocrat = { isSigner: false, }, { - name: "metadaoMultisig", + name: "kollan", isMut: false, isSigner: true, }, From fd6a82fef678d75ad1a0f1cbf07890cc15ee6713 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 05:15:18 +0000 Subject: [PATCH 08/11] Update autocrat verifiable build --- verifiable-builds/autocrat.so | Bin 560680 -> 560664 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/verifiable-builds/autocrat.so b/verifiable-builds/autocrat.so index 8d05fed75e3975a687f4171dc7b6c3015e18349a..9799396f78744df258f77da3f59331ceb26899f2 100755 GIT binary patch delta 16556 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 Kax={`;eP;*rT4A? From 423e82af54454e8be83c7a1f16f89ff57d06a6b5 Mon Sep 17 00:00:00 2001 From: Kollan House Date: Fri, 3 Oct 2025 12:02:18 -0700 Subject: [PATCH 09/11] upgrade dao from local permissions --- scripts/upgradeDao.ts | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/scripts/upgradeDao.ts b/scripts/upgradeDao.ts index 929dd0f5..65057b45 100644 --- a/scripts/upgradeDao.ts +++ b/scripts/upgradeDao.ts @@ -14,16 +14,16 @@ const keypair = Keypair.fromSecretKey(new Uint8Array(bytes)); const proposer = keypair; const autocratClient = AutocratClient.createClient({ provider }); -const daoAddress = new PublicKey('7QbVKbEuqqrEANBaViB1XxoH34hqiroDqf2twkcusnWk') +const daoAddress = new PublicKey('B3AufDZCDtQN8JxZgJ5bSDZaiKCF4vtw7ynN9tuR9pXN') const squadsPayer = new PublicKey("6awyHMshBGVjJ3ozdSJdyyDE1CTAXUwrpNMaRGMsb4sf") const daoUpgrade = async () => { const dao = typeof daoAddress === "string" ? new PublicKey(daoAddress) : daoAddress; - const [multisigPda] = multisig.getMultisigPda({ + + const [multisigPda] = multisig.getMultisigPda({ createKey: dao, }); - const metaDaoUpgradeTxn = await autocratClient.autocrat.methods .upgradeMultisigDao() @@ -31,13 +31,28 @@ const daoUpgrade = async () => { dao, squadsMultisig: multisigPda, squadsMultisigProgram: multisig.PROGRAM_ID, - rentPayer: squadsPayer, - metadaoMultisig: new PublicKey("6awyHMshBGVjJ3ozdSJdyyDE1CTAXUwrpNMaRGMsb4sf") + rentPayer: payer.pubkey, + kollan: payer.pubkey }).transaction(); return metaDaoUpgradeTxn; } +const mainWoSquads = async () => { + const metaDaoUpgradeTxn = await daoUpgrade(); + + // const tx = new Transaction().add(metaDaoUpgradeTxn) + + metaDaoUpgradeTxn.feePayer = payer.publicKey; + metaDaoUpgradeTxn.recentBlockhash = ( + await provider.connection.getLatestBlockhash() + ).blockhash; + metaDaoUpgradeTxn.partialSign(payer); + const txHash = await provider.connection.sendRawTransaction(metaDaoUpgradeTxn.serialize()); + console.log(`upgradeDao transaction sent:`, txHash); + +} + const main = async () => { const metaDaoUpgradeTxn = await daoUpgrade(); @@ -88,4 +103,4 @@ const main = async () => { console.log(`upgradeDao transaction sent:`, txHash); } -main(); \ No newline at end of file +mainWoSquads(); \ No newline at end of file From 4993df8604304fd76527eb7f62c3ca01dbecd0c5 Mon Sep 17 00:00:00 2001 From: metaproph3t Date: Mon, 6 Oct 2025 12:48:19 -0700 Subject: [PATCH 10/11] Add an instruction to fix omnipair spending limit --- .../fix_omnipair_spending_limit.rs | 109 ++++++++++++++++++ programs/autocrat/src/instructions/mod.rs | 4 +- programs/autocrat/src/lib.rs | 5 + 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 programs/autocrat/src/instructions/fix_omnipair_spending_limit.rs diff --git a/programs/autocrat/src/instructions/fix_omnipair_spending_limit.rs b/programs/autocrat/src/instructions/fix_omnipair_spending_limit.rs new file mode 100644 index 00000000..58ff16cc --- /dev/null +++ b/programs/autocrat/src/instructions/fix_omnipair_spending_limit.rs @@ -0,0 +1,109 @@ +use super::*; + +use squads_multisig_program::{program::SquadsMultisigProgram, Member, Multisig, MultisigAddSpendingLimitArgs, MultisigRemoveSpendingLimitArgs, Period, Permission, Permissions, SpendingLimit}; + +pub mod kollan_address { + use anchor_lang::prelude::declare_id; + declare_id!("tSTp6B6kE9o6ZaTmHm2ZwnJBBtgd3x112tapxFhmBEQ"); +} + +pub mod omnpair_dao { + use anchor_lang::prelude::declare_id; + + declare_id!("B3AufDZCDtQN8JxZgJ5bSDZaiKCF4vtw7ynN9tuR9pXN"); +} + +pub mod omnipair_spending_limit { + use anchor_lang::prelude::declare_id; + + declare_id!("5gn6mBnPqp4AQUXyanadwcse8eVqUNFxnc2zrKJV8kCn"); +} + +pub mod rakka_address { + use anchor_lang::prelude::declare_id; + + declare_id!("5jRqFejxKHWMfR69dbYF2A9TnpnBPjz7iaRQS44imcMi"); +} + +#[derive(Accounts)] +pub struct FixOmnipairSpendingLimit<'info> { + #[account(mut, has_one = squads_multisig, address = omnpair_dao::id())] + pub dao: Box>, + #[account(mut)] + pub squads_multisig: Account<'info, Multisig>, + pub squads_multisig_program: Program<'info, SquadsMultisigProgram>, + #[account(mut)] + pub rent_payer: Signer<'info>, + pub kollan: Signer<'info>, + #[account(mut, address = omnipair_spending_limit::id())] + pub omnipair_spending_limit: Account<'info, SpendingLimit>, + pub system_program: Program<'info, System>, +} + +impl FixOmnipairSpendingLimit<'_> { + pub fn validate(&self) -> Result<()> { + // #[cfg(feature = "production")] + require_eq!(self.kollan.key(), kollan_address::id()); + + Ok(()) + } + + pub fn handle(ctx: Context) -> Result<()> { + let Self { + dao, + squads_multisig, + squads_multisig_program, + rent_payer, + kollan: _, + system_program, + omnipair_spending_limit, + } = ctx.accounts; + + let dao_nonce = &dao.nonce.to_le_bytes(); + let dao_creator_key = &dao.dao_creator.as_ref(); + let dao_seeds = &[b"dao".as_ref(), dao_creator_key, dao_nonce, &[dao.pda_bump]]; + let dao_signer = &[&dao_seeds[..]]; + + squads_multisig_program::cpi::multisig_remove_spending_limit( + CpiContext::new_with_signer( + squads_multisig_program.to_account_info(), + squads_multisig_program::cpi::accounts::MultisigRemoveSpendingLimit { + multisig: squads_multisig.to_account_info(), + config_authority: dao.to_account_info(), + spending_limit: omnipair_spending_limit.to_account_info(), + rent_collector: rent_payer.to_account_info(), + }, + dao_signer, + ), + MultisigRemoveSpendingLimitArgs { + memo: None, + } + )?; + + squads_multisig_program::cpi::multisig_add_spending_limit( + CpiContext::new_with_signer( + squads_multisig_program.to_account_info(), + squads_multisig_program::cpi::accounts::MultisigAddSpendingLimit { + multisig: squads_multisig.to_account_info(), + config_authority: dao.to_account_info(), + spending_limit: omnipair_spending_limit.to_account_info(), + rent_payer: rent_payer.to_account_info(), + system_program: system_program.to_account_info(), + }, + dao_signer, + ), + MultisigAddSpendingLimitArgs { + memo: None, + create_key: dao.key(), + vault_index: 0, + mint: dao.quote_mint, + amount: 50_000 * 1_000_000, + period: Period::Month, + members: vec![rakka_address::id()], + destinations: vec![], + } + )?; + + Ok(()) + } +} diff --git a/programs/autocrat/src/instructions/mod.rs b/programs/autocrat/src/instructions/mod.rs index e65cee5a..2abbbf2a 100644 --- a/programs/autocrat/src/instructions/mod.rs +++ b/programs/autocrat/src/instructions/mod.rs @@ -6,10 +6,12 @@ pub mod initialize_proposal; pub mod update_dao; pub mod execute_spending_limit_change; pub mod upgrade_multisig_dao; +pub mod fix_omnipair_spending_limit; pub use finalize_proposal::*; pub use initialize_dao::*; pub use initialize_proposal::*; pub use update_dao::*; pub use execute_spending_limit_change::*; -pub use upgrade_multisig_dao::*; \ No newline at end of file +pub use upgrade_multisig_dao::*; +pub use fix_omnipair_spending_limit::*; diff --git a/programs/autocrat/src/lib.rs b/programs/autocrat/src/lib.rs index cb4a95c1..a999cc28 100644 --- a/programs/autocrat/src/lib.rs +++ b/programs/autocrat/src/lib.rs @@ -112,4 +112,9 @@ pub mod autocrat { pub fn upgrade_multisig_dao(ctx: Context) -> Result<()> { UpgradeMultisigDao::handle(ctx) } + + #[access_control(ctx.accounts.validate())] + pub fn fix_omnipair_spending_limit(ctx: Context) -> Result<()> { + FixOmnipairSpendingLimit::handle(ctx) + } } From 8449627b67ab66ba541863a34c2260ff78b13337 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 19:59:19 +0000 Subject: [PATCH 11/11] Update autocrat verifiable build --- verifiable-builds/autocrat.so | Bin 560664 -> 586720 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/verifiable-builds/autocrat.so b/verifiable-builds/autocrat.so index 9799396f78744df258f77da3f59331ceb26899f2..fe6c36bcf89ebb82b14257e2a30ad902f921ebbc 100755 GIT binary patch delta 101531 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 GRsRniJ{iFP delta 86765 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¨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 z zR9|_`7?-lIAtH=R&Xo|JS@e2Mrq?)k#HsH3S7yO@_ezI)^}od6bKFbSng0^&&T-Fh z1b5(XZRffVSKIXq>aOm@dj#jY?^Js{yLdr!H%AM&^Lg&mj_zvzU4^F|(7p8+vHd%% zeO?akF$8El&wb1PIY2W444LSju5L(*g%jO#)E{5Ps@lCr{p?k-XA-B-o<$vD69 zs#qz{FTN@|h25Lf`(O{dm#EFJW^SG0-cjQ`>s4HQ$bFO=d{r!&=APjkDHSniznWL^ zDPMQ1BmS^kY(C$8s9L-jJ4a}}#Uaz(UbSth=sz7r5iR20$;Ix|#G2{uCKr6oW+lC6 z&2SIy(Y6#S^RR!yy+DH>uH=9w3|@9a7X7MJo;CB2qs(PJ(|Z+aBMqRWubc^A3Es?7aG$bIlj z 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