Skip to content

Commit

Permalink
Upgrade idl and program at the same time
Browse files Browse the repository at this point in the history
  • Loading branch information
ChewingGlass committed Apr 23, 2023
1 parent b13af39 commit 63a3dca
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 88 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
"dependencies": {
"@actions/core": "^1.10.0",
"@project-serum/anchor": "^0.26.0",
"@solana/web3.js": "1.53.0"
"@solana/web3.js": "1.53.0",
"@sqds/sdk": "^2.0.4"
},
"devDependencies": {
"@types/node": "^16.10.5",
Expand Down
111 changes: 47 additions & 64 deletions src/createProgramUpgrade.ts
Original file line number Diff line number Diff line change
@@ -1,91 +1,74 @@
import {AnchorProvider, BN, Program, Wallet} from '@project-serum/anchor'
import {ProgramManager} from './idl/program_manager'
import programManager from './idl/program_manager.json'
import {Connection, Keypair, PublicKey, SystemProgram} from '@solana/web3.js'
// eslint-disable-next-line filenames/match-regex
import {
getManagedProgramPDA,
getProgramManagerPDA,
getProgramUpgradePDA
} from './pda'
import {programManagerProgramId} from './constants'
Connection,
Keypair,
PublicKey,
Transaction,
sendAndConfirmTransaction
} from '@solana/web3.js'
import Squads from '@sqds/sdk'
import {createIdlUpgradeInstruction} from './createIdlUpgradeInstruction'
import {createProgramUpgradeInstruction} from './createProgramUpgradeInstruction'
import NodeWallet from '@project-serum/anchor/dist/cjs/nodewallet'
import {getTxPDA} from './pda'
import {BN} from '@project-serum/anchor'

export const createProgramUpgrade = async ({
multisig,
programId,
buffer,
spill,
authority,
name,
wallet,
networkUrl
networkUrl,
idlBuffer
}: {
multisig: PublicKey
programId: PublicKey
buffer: PublicKey
spill: PublicKey
authority: PublicKey
name: string
idlBuffer: PublicKey
wallet: Keypair
networkUrl: string
}) => {
const connection = new Connection(networkUrl)
const program = new Program<ProgramManager>(
programManager as ProgramManager,
programManagerProgramId,
new AnchorProvider(
connection,
new Wallet(wallet),
AnchorProvider.defaultOptions()
)
const squads = Squads.endpoint(
connection.rpcEndpoint,
new NodeWallet(wallet),
{
commitmentOrConfig: 'finalized'
}
)
const programs = await program.account.managedProgram.all()
const programIndex = programs.find(
p => p.account.programAddress.toString() === programId.toString() && p.account.multisig.toString() === multisig.toString()
)?.account.managedProgramIndex

if (typeof programIndex === undefined) {
throw new Error(
`Program ${programId.toString()} not managed by this squad}`
)
}
const instructions = [
await createIdlUpgradeInstruction(programId, idlBuffer, authority),
await createProgramUpgradeInstruction(programId, buffer, authority, spill)
]

const [programManagerPDA] = await getProgramManagerPDA(
const nextTransactionIndex = await squads.getNextTransactionIndex(multisig)
const [transactionPDA] = getTxPDA(
multisig,
programManagerProgramId
new BN(nextTransactionIndex, 10),
squads.multisigProgramId
)
const [managedProgramPDA] = await getManagedProgramPDA(
programManagerPDA,
new BN(programIndex),
programManagerProgramId
)
const managedProgram = await program.account.managedProgram.fetch(
managedProgramPDA
)
if (managedProgram.programAddress.toString() !== programId.toString()) {
throw new Error('Mismatched program index')
}
const [programUpgradePDA] = getProgramUpgradePDA(
managedProgramPDA,
new BN(managedProgram.upgradeIndex + 1),
programManagerProgramId
)
console.log(`Creating program upgrade with
multisig: ${multisig.toString()},
programManager: ${programManagerPDA.toString()},
managedProgram: ${managedProgramPDA.toString()},
programUpgrade: ${programUpgradePDA.toString()}
`)
const methods = program.methods
.createProgramUpgrade(buffer, spill, authority, name)
.accountsStrict({
creator: wallet.publicKey,
multisig: multisig,
programManager: programManagerPDA,
managedProgram: managedProgramPDA,
programUpgrade: programUpgradePDA,
systemProgram: SystemProgram.programId
})
const txid = await methods.rpc()

const realIxns = [
await squads.buildCreateTransaction(multisig, 1, nextTransactionIndex),
...(await Promise.all(
instructions.map((ix, idx) =>
squads.buildAddInstruction(multisig, transactionPDA, ix, idx)
)
)),
await squads.buildActivateTransaction(multisig, transactionPDA)
]

const tx = new Transaction()
tx.feePayer = wallet.publicKey
tx.recentBlockhash = (await connection.getRecentBlockhash()).blockhash
tx.add(...realIxns)
const txid = await sendAndConfirmTransaction(connection, tx, [wallet])

console.log(
`Successfully created program upgrade for MS_PDA ${multisig.toString()} https://explorer.solana.com/tx/${txid}`
)
Expand Down
26 changes: 5 additions & 21 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import * as core from '@actions/core'
import {createProgramUpgrade} from './createProgramUpgrade'
import {keypairFrom, publicKeyFrom} from './utils'
import {createIdlUpgrade} from './createIdlUpgrade'
import { createProgramUpgrade } from './createProgramUpgrade'
import { keypairFrom, publicKeyFrom } from './utils'

async function run(): Promise<void> {
try {
Expand All @@ -15,7 +14,7 @@ async function run(): Promise<void> {
const keypair: string = core.getInput('keypair')
const idlBuffer: string = core.getInput('idl-buffer')
const authorityIndex: string = core.getInput('authority-index')

core.debug(`start: ${new Date().toLocaleString()}`)
core.debug(`networkUrl: ${networkUrl}`)
core.debug(`programMultisig: ${programMultisig}`)
Expand All @@ -32,27 +31,12 @@ async function run(): Promise<void> {
multisig: publicKeyFrom(programMultisig, 'programMultisig'),
programId: publicKeyFrom(programId, 'programId'),
buffer: publicKeyFrom(buffer, 'buffer'),
idlBuffer: publicKeyFrom(buffer, 'idl-buffer'),
spill: publicKeyFrom(spillAddress, 'spillAddress'),
authority: publicKeyFrom(authority, 'authority'),
name: name,
wallet: keypairFrom(keypair, 'keypair'),
networkUrl: networkUrl
networkUrl
})

if (idlBuffer && idlBuffer.length > 0) {
await createIdlUpgrade({
multisig: publicKeyFrom(programMultisig, 'programMultisig'),
programId: publicKeyFrom(programId, 'programId'),
buffer: publicKeyFrom(buffer, 'idl-buffer'),
authority: publicKeyFrom(authority, 'authority'),
wallet: keypairFrom(keypair, 'keypair'),
networkUrl: networkUrl,
authorityIndex:
authorityIndex && authorityIndex.length > 0
? parseInt(authorityIndex)
: 1
})
}
} catch (error) {
console.log(error)
core.debug(`error: ${error}`)
Expand Down
34 changes: 32 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,27 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==

"@coral-xyz/anchor@^0.26.0":
version "0.26.0"
resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.26.0.tgz#c8e4f7177e93441afd030f22d777d54d0194d7d1"
integrity sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==
dependencies:
"@coral-xyz/borsh" "^0.26.0"
"@solana/web3.js" "^1.68.0"
base64-js "^1.5.1"
bn.js "^5.1.2"
bs58 "^4.0.1"
buffer-layout "^1.2.2"
camelcase "^6.3.0"
cross-fetch "^3.1.5"
crypto-hash "^1.3.0"
eventemitter3 "^4.0.7"
js-sha256 "^0.9.0"
pako "^2.0.3"
snake-case "^3.0.4"
superstruct "^0.15.4"
toml "^3.0.0"

"@coral-xyz/borsh@^0.26.0":
version "0.26.0"
resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.26.0.tgz#d054f64536d824634969e74138f9f7c52bbbc0d5"
Expand Down Expand Up @@ -716,7 +737,7 @@
superstruct "^0.14.2"
tweetnacl "^1.0.3"

"@solana/web3.js@^1.68.0":
"@solana/web3.js@^1.68.0", "@solana/web3.js@^1.73.2":
version "1.75.0"
resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.75.0.tgz#824c6f78865007bca758ca18f268d6f7363b42e5"
integrity sha512-rHQgdo1EWfb+nPUpHe4O7i8qJPELHKNR5PAZRK+a7XxiykqOfbaAlPt5boDWAGPnYbSv0ziWZv5mq9DlFaQCxg==
Expand All @@ -738,6 +759,15 @@
rpc-websockets "^7.5.1"
superstruct "^0.14.2"

"@sqds/sdk@^2.0.4":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@sqds/sdk/-/sdk-2.0.4.tgz#c5b1e78ee32227369f61c6b27c30876383f4e889"
integrity sha512-SmwqL55GW9teIPRqYBVUp1tNp3Tfd8olPShas/+5L48XaUHBDEFNuDA9E8KKbIZoB34WSLdgyq0tIJLlhMMHnA==
dependencies:
"@coral-xyz/anchor" "^0.26.0"
"@solana/web3.js" "^1.73.2"
bn.js "^5.2.1"

"@tootallnate/once@1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
Expand Down Expand Up @@ -1289,7 +1319,7 @@ bn.js@^4.11.9:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==

bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.2.0:
bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
Expand Down

0 comments on commit 63a3dca

Please sign in to comment.