From a89e611e1fdfd9470d43620610d587e96a7dbcde Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Mon, 11 Mar 2024 15:52:11 +0000 Subject: [PATCH 1/7] Make room for compute ixs --- governance/xc_admin/packages/xc_admin_common/src/propose.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/governance/xc_admin/packages/xc_admin_common/src/propose.ts b/governance/xc_admin/packages/xc_admin_common/src/propose.ts index bc1bd1bed8..ae2c5587d8 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/propose.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/propose.ts @@ -373,10 +373,7 @@ export class MultisigVault { } } - const txToSend = TransactionBuilder.batchIntoLegacyTransactions( - ixToSend, - priorityFeeConfig - ); + const txToSend = TransactionBuilder.batchIntoLegacyTransactions(ixToSend, priorityFeeConfig); await this.sendAllTransactions(txToSend); return newProposals; From 0255336d180d09767a2b5d6125010dff6109547e Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Mon, 11 Mar 2024 16:51:40 +0000 Subject: [PATCH 2/7] Continue --- governance/xc_admin/packages/xc_admin_common/src/propose.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/governance/xc_admin/packages/xc_admin_common/src/propose.ts b/governance/xc_admin/packages/xc_admin_common/src/propose.ts index ae2c5587d8..4ea15d9de0 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/propose.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/propose.ts @@ -25,10 +25,15 @@ import { MultisigAccount } from "@sqds/mesh/lib/types"; import { mapKey } from "./remote_executor"; import { WORMHOLE_ADDRESS } from "./wormhole"; import { TransactionBuilder } from "@pythnetwork/solana-utils"; +<<<<<<< HEAD import { PACKET_DATA_SIZE_WITH_ROOM_FOR_COMPUTE_BUDGET, PriorityFeeConfig, } from "@pythnetwork/solana-utils"; +======= +import { PACKET_DATA_SIZE_WITH_ROOM_FOR_COMPUTE_BUDGET } from "@pythnetwork/solana-utils"; +import { PriorityFeeConfig } from "@pythnetwork/solana-utils/lib/transaction"; +>>>>>>> 563d0473 (Continue) export const MAX_EXECUTOR_PAYLOAD_SIZE = PACKET_DATA_SIZE_WITH_ROOM_FOR_COMPUTE_BUDGET - 687; // Bigger payloads won't fit in one addInstruction call when adding to the proposal From fac427164181bd55806facf069e7d36a1accae4f Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Mon, 11 Mar 2024 17:55:06 +0000 Subject: [PATCH 3/7] Fix syntax --- governance/xc_admin/packages/xc_admin_common/src/propose.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/governance/xc_admin/packages/xc_admin_common/src/propose.ts b/governance/xc_admin/packages/xc_admin_common/src/propose.ts index 4ea15d9de0..ae2c5587d8 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/propose.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/propose.ts @@ -25,15 +25,10 @@ import { MultisigAccount } from "@sqds/mesh/lib/types"; import { mapKey } from "./remote_executor"; import { WORMHOLE_ADDRESS } from "./wormhole"; import { TransactionBuilder } from "@pythnetwork/solana-utils"; -<<<<<<< HEAD import { PACKET_DATA_SIZE_WITH_ROOM_FOR_COMPUTE_BUDGET, PriorityFeeConfig, } from "@pythnetwork/solana-utils"; -======= -import { PACKET_DATA_SIZE_WITH_ROOM_FOR_COMPUTE_BUDGET } from "@pythnetwork/solana-utils"; -import { PriorityFeeConfig } from "@pythnetwork/solana-utils/lib/transaction"; ->>>>>>> 563d0473 (Continue) export const MAX_EXECUTOR_PAYLOAD_SIZE = PACKET_DATA_SIZE_WITH_ROOM_FOR_COMPUTE_BUDGET - 687; // Bigger payloads won't fit in one addInstruction call when adding to the proposal From cdeb1358ccbc531cc80c7e89c5a8d202478ed87f Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Mar 2024 12:27:22 +0000 Subject: [PATCH 4/7] Checkpoint --- .../components/tabs/Proposals.tsx | 80 +++++++++++++++---- package-lock.json | 2 + .../solana/sdk/js/solana_utils/package.json | 1 + .../solana/sdk/js/solana_utils/src/index.ts | 1 + .../sdk/js/solana_utils/src/transaction.ts | 19 +++++ 5 files changed, 89 insertions(+), 14 deletions(-) diff --git a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx index fb1efcb6d8..5a02402485 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx +++ b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx @@ -40,6 +40,8 @@ import { import { getMappingCluster, isPubkey } from '../InstructionViews/utils' import { getPythProgramKeyForCluster, PythCluster } from '@pythnetwork/client' +import { TransactionBuilder, sendTransactions } from '@pythnetwork/solana-utils' +import { Wallet } from '@coral-xyz/anchor' const ProposalRow = ({ proposal, multisig, @@ -369,13 +371,35 @@ const Proposal = ({ }, [cluster, proposal, squads, connection]) const handleClick = async ( - handler: (squad: SquadsMesh, proposalKey: PublicKey) => any, + instructionGenerator: ( + squad: SquadsMesh, + vaultKey: PublicKey, + proposalKey: PublicKey + ) => any, msg: string ) => { if (proposal && squads) { try { setIsTransactionLoading(true) - await handler(squads, proposal.publicKey) + const instruction = await instructionGenerator( + squads, + proposal.ms, + proposal.publicKey + ) + const builder = new TransactionBuilder( + squads.wallet.publicKey, + squads.connection + ) + builder.addInstruction(instruction) + const versionedTxs = await builder.getVersionedTransactions({ + computeUnitPriceMicroLamports: 50000, + }) + await sendTransactions( + versionedTxs, + squads.connection, + squads.wallet as Wallet + ) + if (refreshData) await refreshData().fetchData() toast.success(msg) } catch (e: any) { @@ -387,27 +411,55 @@ const Proposal = ({ } const handleClickApprove = async () => { - await handleClick(async (squad: SquadsMesh, proposalKey: PublicKey) => { - await squad.approveTransaction(proposalKey) - }, `Approved proposal ${proposal?.publicKey.toBase58()}`) + await handleClick( + async ( + squad: SquadsMesh, + vaultKey: PublicKey, + proposalKey: PublicKey + ) => { + await squad.buildApproveTransaction(vaultKey, proposalKey) + }, + `Approved proposal ${proposal?.publicKey.toBase58()}` + ) } const handleClickReject = async () => { - await handleClick(async (squad: SquadsMesh, proposalKey: PublicKey) => { - await squad.rejectTransaction(proposalKey) - }, `Rejected proposal ${proposal?.publicKey.toBase58()}`) + await handleClick( + async ( + squad: SquadsMesh, + vaultKey: PublicKey, + proposalKey: PublicKey + ) => { + await squad.buildRejectTransaction(vaultKey, proposalKey) + }, + `Rejected proposal ${proposal?.publicKey.toBase58()}` + ) } const handleClickExecute = async () => { - await handleClick(async (squad: SquadsMesh, proposalKey: PublicKey) => { - await squad.executeTransaction(proposalKey) - }, `Executed proposal ${proposal?.publicKey.toBase58()}`) + await handleClick( + async ( + squad: SquadsMesh, + vaultKey: PublicKey, + proposalKey: PublicKey + ) => { + await squad.buildExecuteTransaction(proposalKey) + }, + `Executed proposal ${proposal?.publicKey.toBase58()}` + ) } const handleClickCancel = async () => { - await handleClick(async (squad: SquadsMesh, proposalKey: PublicKey) => { - await squad.cancelTransaction(proposalKey) - }, `Cancelled proposal ${proposal?.publicKey.toBase58()}`) + await handleClick( + async ( + squad: SquadsMesh, + vaultKey: PublicKey, + proposalKey: PublicKey + ) => { + await squad.buildCancelTransaction(vaultKey, proposalKey) + }, + `Cancelled proposal ${proposal?.publicKey.toBase58()}` + ) } return proposal !== undefined && diff --git a/package-lock.json b/package-lock.json index 10e4401f76..99d42ab6db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59319,6 +59319,7 @@ "version": "0.1.0", "license": "Apache-2.0", "dependencies": { + "@coral-xyz/anchor": "^0.29.0", "@solana/web3.js": "^1.90.0" }, "devDependencies": { @@ -71207,6 +71208,7 @@ "@pythnetwork/solana-utils": { "version": "file:target_chains/solana/sdk/js/solana_utils", "requires": { + "@coral-xyz/anchor": "*", "@solana/web3.js": "^1.90.0", "@types/jest": "^29.4.0", "@typescript-eslint/eslint-plugin": "^5.20.0", diff --git a/target_chains/solana/sdk/js/solana_utils/package.json b/target_chains/solana/sdk/js/solana_utils/package.json index 36e9a532cd..e24fdff8f4 100644 --- a/target_chains/solana/sdk/js/solana_utils/package.json +++ b/target_chains/solana/sdk/js/solana_utils/package.json @@ -42,6 +42,7 @@ "typescript": "^4.6.3" }, "dependencies": { + "@coral-xyz/anchor": "^0.29.0", "@solana/web3.js": "^1.90.0" } } diff --git a/target_chains/solana/sdk/js/solana_utils/src/index.ts b/target_chains/solana/sdk/js/solana_utils/src/index.ts index 734c3ad3d8..0c5b6612f3 100644 --- a/target_chains/solana/sdk/js/solana_utils/src/index.ts +++ b/target_chains/solana/sdk/js/solana_utils/src/index.ts @@ -5,4 +5,5 @@ export { InstructionWithEphemeralSigners, PACKET_DATA_SIZE_WITH_ROOM_FOR_COMPUTE_BUDGET, PriorityFeeConfig, + sendTransactions, } from "./transaction"; diff --git a/target_chains/solana/sdk/js/solana_utils/src/transaction.ts b/target_chains/solana/sdk/js/solana_utils/src/transaction.ts index 1c4a07654d..40ecfbdf79 100644 --- a/target_chains/solana/sdk/js/solana_utils/src/transaction.ts +++ b/target_chains/solana/sdk/js/solana_utils/src/transaction.ts @@ -1,5 +1,7 @@ +import { AnchorProvider, Wallet } from "@coral-xyz/anchor"; import { ComputeBudgetProgram, + ConfirmOptions, Connection, PACKET_DATA_SIZE, PublicKey, @@ -240,3 +242,20 @@ export class TransactionBuilder { } } } + +export async function sendTransactions( + transactions: { + tx: VersionedTransaction | Transaction; + signers?: Signer[] | undefined; + }[], + connection: Connection, + wallet: Wallet, + opts?: ConfirmOptions +) { + if (opts === undefined) { + opts = AnchorProvider.defaultOptions(); + } + + const provider = new AnchorProvider(connection, wallet, opts); + provider.sendAll(transactions); +} From a5bd354d2e50097c05add66e07a9072c4018df47 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Mar 2024 12:37:56 +0000 Subject: [PATCH 5/7] Cleanup --- .../components/tabs/Proposals.tsx | 28 +++++++++++-------- .../sdk/js/solana_utils/src/transaction.ts | 2 +- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx index 5a02402485..eb4650f180 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx +++ b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx @@ -1,6 +1,12 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { useWallet } from '@solana/wallet-adapter-react' -import { AccountMeta, Keypair, PublicKey, SystemProgram } from '@solana/web3.js' +import { + AccountMeta, + Keypair, + PublicKey, + SystemProgram, + TransactionInstruction, +} from '@solana/web3.js' import { MultisigAccount, TransactionAccount } from '@sqds/mesh/lib/types' import { useRouter } from 'next/router' import { Fragment, useCallback, useContext, useEffect, useState } from 'react' @@ -375,7 +381,7 @@ const Proposal = ({ squad: SquadsMesh, vaultKey: PublicKey, proposalKey: PublicKey - ) => any, + ) => Promise, msg: string ) => { if (proposal && squads) { @@ -390,7 +396,7 @@ const Proposal = ({ squads.wallet.publicKey, squads.connection ) - builder.addInstruction(instruction) + builder.addInstruction({ instruction, signers: [] }) const versionedTxs = await builder.getVersionedTransactions({ computeUnitPriceMicroLamports: 50000, }) @@ -416,8 +422,8 @@ const Proposal = ({ squad: SquadsMesh, vaultKey: PublicKey, proposalKey: PublicKey - ) => { - await squad.buildApproveTransaction(vaultKey, proposalKey) + ): Promise => { + return await squad.buildApproveTransaction(vaultKey, proposalKey) }, `Approved proposal ${proposal?.publicKey.toBase58()}` ) @@ -429,8 +435,8 @@ const Proposal = ({ squad: SquadsMesh, vaultKey: PublicKey, proposalKey: PublicKey - ) => { - await squad.buildRejectTransaction(vaultKey, proposalKey) + ): Promise => { + return await squad.buildRejectTransaction(vaultKey, proposalKey) }, `Rejected proposal ${proposal?.publicKey.toBase58()}` ) @@ -442,8 +448,8 @@ const Proposal = ({ squad: SquadsMesh, vaultKey: PublicKey, proposalKey: PublicKey - ) => { - await squad.buildExecuteTransaction(proposalKey) + ): Promise => { + return await squad.buildExecuteTransaction(proposalKey) }, `Executed proposal ${proposal?.publicKey.toBase58()}` ) @@ -455,8 +461,8 @@ const Proposal = ({ squad: SquadsMesh, vaultKey: PublicKey, proposalKey: PublicKey - ) => { - await squad.buildCancelTransaction(vaultKey, proposalKey) + ): Promise => { + return await squad.buildCancelTransaction(vaultKey, proposalKey) }, `Cancelled proposal ${proposal?.publicKey.toBase58()}` ) diff --git a/target_chains/solana/sdk/js/solana_utils/src/transaction.ts b/target_chains/solana/sdk/js/solana_utils/src/transaction.ts index 40ecfbdf79..2b22a4a088 100644 --- a/target_chains/solana/sdk/js/solana_utils/src/transaction.ts +++ b/target_chains/solana/sdk/js/solana_utils/src/transaction.ts @@ -257,5 +257,5 @@ export async function sendTransactions( } const provider = new AnchorProvider(connection, wallet, opts); - provider.sendAll(transactions); + await provider.sendAll(transactions); } From 3f85ea74c37e1431f8d2fda751a2c006ac7dcc0d Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Mar 2024 12:55:33 +0000 Subject: [PATCH 6/7] Cleanup --- governance/xc_admin/packages/xc_admin_common/src/propose.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/governance/xc_admin/packages/xc_admin_common/src/propose.ts b/governance/xc_admin/packages/xc_admin_common/src/propose.ts index ae2c5587d8..bc1bd1bed8 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/propose.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/propose.ts @@ -373,7 +373,10 @@ export class MultisigVault { } } - const txToSend = TransactionBuilder.batchIntoLegacyTransactions(ixToSend, priorityFeeConfig); + const txToSend = TransactionBuilder.batchIntoLegacyTransactions( + ixToSend, + priorityFeeConfig + ); await this.sendAllTransactions(txToSend); return newProposals; From a21edb66787292b803bb6393907144f57537462b Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Mar 2024 13:00:02 +0000 Subject: [PATCH 7/7] Go --- .../xc_admin_frontend/components/tabs/Proposals.tsx | 12 ++++++++---- .../solana/sdk/js/solana_utils/src/index.ts | 1 + .../solana/sdk/js/solana_utils/src/transaction.ts | 4 ++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx index eb4650f180..9efc3b61fa 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx +++ b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals.tsx @@ -46,7 +46,11 @@ import { import { getMappingCluster, isPubkey } from '../InstructionViews/utils' import { getPythProgramKeyForCluster, PythCluster } from '@pythnetwork/client' -import { TransactionBuilder, sendTransactions } from '@pythnetwork/solana-utils' +import { + DEFAULT_PRIORITY_FEE_CONFIG, + TransactionBuilder, + sendTransactions, +} from '@pythnetwork/solana-utils' import { Wallet } from '@coral-xyz/anchor' const ProposalRow = ({ proposal, @@ -397,9 +401,9 @@ const Proposal = ({ squads.connection ) builder.addInstruction({ instruction, signers: [] }) - const versionedTxs = await builder.getVersionedTransactions({ - computeUnitPriceMicroLamports: 50000, - }) + const versionedTxs = await builder.getVersionedTransactions( + DEFAULT_PRIORITY_FEE_CONFIG + ) await sendTransactions( versionedTxs, squads.connection, diff --git a/target_chains/solana/sdk/js/solana_utils/src/index.ts b/target_chains/solana/sdk/js/solana_utils/src/index.ts index 0c5b6612f3..59df31d682 100644 --- a/target_chains/solana/sdk/js/solana_utils/src/index.ts +++ b/target_chains/solana/sdk/js/solana_utils/src/index.ts @@ -6,4 +6,5 @@ export { PACKET_DATA_SIZE_WITH_ROOM_FOR_COMPUTE_BUDGET, PriorityFeeConfig, sendTransactions, + DEFAULT_PRIORITY_FEE_CONFIG, } from "./transaction"; diff --git a/target_chains/solana/sdk/js/solana_utils/src/transaction.ts b/target_chains/solana/sdk/js/solana_utils/src/transaction.ts index 2b22a4a088..bd8f82c0ba 100644 --- a/target_chains/solana/sdk/js/solana_utils/src/transaction.ts +++ b/target_chains/solana/sdk/js/solana_utils/src/transaction.ts @@ -26,6 +26,10 @@ export type PriorityFeeConfig = { computeUnitPriceMicroLamports?: number; }; +export const DEFAULT_PRIORITY_FEE_CONFIG: PriorityFeeConfig = { + computeUnitPriceMicroLamports: 50000, +}; + /** * Get the size of a transaction that would contain the provided array of instructions */