From 335a1437bb83201be4e959123d6c648c5fba9e0c Mon Sep 17 00:00:00 2001 From: adpthegreat Date: Mon, 21 Oct 2024 23:28:28 +0100 Subject: [PATCH] refactored codebase, added poseidon_cross_program_invocation logic --- .../cross_program_invocation/Anchor.toml | 5 +- .../migrations/deploy.ts | 4 +- .../cross_program_invocation/package.json | 1 + .../cross_program_invocation/pnpm-lock.yaml | 7 ++- .../Cargo.toml | 4 +- .../Xargo.toml | 0 .../programs/hand/src/lib.rs | 29 +++++++++++ .../programs/lever/Cargo.toml | 20 ++++++++ .../programs/lever/Xargo.toml | 2 + .../src/lib.rs | 29 +++-------- .../tests/bankrun.test.ts | 51 +++++++++++++++++++ .../tests/cross_program_invocation.ts | 16 ------ .../src/cross_program_invocation.ts | 34 ------------- .../ts-programs/src/hand.ts | 20 ++++++++ .../ts-programs/src/lever.ts | 19 +++++++ 15 files changed, 161 insertions(+), 80 deletions(-) rename basics/cross-program-invocation/poseidon/cross_program_invocation/programs/{cross_program_invocation => hand}/Cargo.toml (81%) rename basics/cross-program-invocation/poseidon/cross_program_invocation/programs/{cross_program_invocation => hand}/Xargo.toml (100%) create mode 100644 basics/cross-program-invocation/poseidon/cross_program_invocation/programs/hand/src/lib.rs create mode 100644 basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/Cargo.toml create mode 100644 basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/Xargo.toml rename basics/cross-program-invocation/poseidon/cross_program_invocation/programs/{cross_program_invocation => lever}/src/lib.rs (55%) delete mode 100644 basics/cross-program-invocation/poseidon/cross_program_invocation/tests/cross_program_invocation.ts delete mode 100644 basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/cross_program_invocation.ts create mode 100644 basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/hand.ts create mode 100644 basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/lever.ts diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/Anchor.toml b/basics/cross-program-invocation/poseidon/cross_program_invocation/Anchor.toml index f72a05825..9a8efe200 100644 --- a/basics/cross-program-invocation/poseidon/cross_program_invocation/Anchor.toml +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/Anchor.toml @@ -5,7 +5,8 @@ resolution = true skip-lint = false [programs.localnet] -cross_program_invocation = "D4aA71us8bTcdXeZQpXyXidW2xPugVwUuoXx3b1bnvXa" +hand = "Cd86dtBUzQKYTFtcB8zDxPRUPCtKPocyetWZSnq6PNxv" +lever = "9aM9w7ozrZwXx9bQHbBx6QjWc6F46tdN9ayt86vt9uLL" [registry] url = "https://api.apr.dev" @@ -15,4 +16,4 @@ cluster = "Localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "pnpm run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/migrations/deploy.ts b/basics/cross-program-invocation/poseidon/cross_program_invocation/migrations/deploy.ts index 82fb175fa..64a1c3599 100644 --- a/basics/cross-program-invocation/poseidon/cross_program_invocation/migrations/deploy.ts +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/migrations/deploy.ts @@ -2,9 +2,9 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require("@coral-xyz/anchor"); +const anchor = require('@coral-xyz/anchor'); -module.exports = async function (provider) { +module.exports = async (provider) => { // Configure client to use the provider. anchor.setProvider(provider); diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/package.json b/basics/cross-program-invocation/poseidon/cross_program_invocation/package.json index 151ba4340..2d882c98c 100644 --- a/basics/cross-program-invocation/poseidon/cross_program_invocation/package.json +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/package.json @@ -7,6 +7,7 @@ }, "dependencies": { "@coral-xyz/anchor": "^0.30.1", + "@solana/web3.js": "^1.95.4", "anchor-bankrun": "^0.5.0", "solana-bankrun": "^0.4.0" }, diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/pnpm-lock.yaml b/basics/cross-program-invocation/poseidon/cross_program_invocation/pnpm-lock.yaml index 9b79b8317..9c99347b3 100644 --- a/basics/cross-program-invocation/poseidon/cross_program_invocation/pnpm-lock.yaml +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@coral-xyz/anchor': specifier: ^0.30.1 version: 0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/web3.js': + specifier: ^1.95.4 + version: 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) anchor-bankrun: specifier: ^0.5.0 version: 0.5.0(@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) @@ -833,7 +836,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.7.7 '@types/json5@0.0.29': optional: true @@ -850,7 +853,7 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.7.7 '@types/ws@8.5.12': dependencies: diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/cross_program_invocation/Cargo.toml b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/hand/Cargo.toml similarity index 81% rename from basics/cross-program-invocation/poseidon/cross_program_invocation/programs/cross_program_invocation/Cargo.toml rename to basics/cross-program-invocation/poseidon/cross_program_invocation/programs/hand/Cargo.toml index be3e6a133..814b4b9d6 100644 --- a/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/cross_program_invocation/Cargo.toml +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/hand/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "cross_program_invocation" +name = "hand" version = "0.1.0" description = "Created with Anchor" edition = "2021" [lib] crate-type = ["cdylib", "lib"] -name = "cross_program_invocation" +name = "hand" [features] default = [] diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/cross_program_invocation/Xargo.toml b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/hand/Xargo.toml similarity index 100% rename from basics/cross-program-invocation/poseidon/cross_program_invocation/programs/cross_program_invocation/Xargo.toml rename to basics/cross-program-invocation/poseidon/cross_program_invocation/programs/hand/Xargo.toml diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/hand/src/lib.rs b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/hand/src/lib.rs new file mode 100644 index 000000000..950afb26f --- /dev/null +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/hand/src/lib.rs @@ -0,0 +1,29 @@ +use anchor_lang::prelude::*; +declare_id!("Cd86dtBUzQKYTFtcB8zDxPRUPCtKPocyetWZSnq6PNxv"); +#[program] +pub mod hand { + use super::*; + pub fn initialize(ctx: Context) -> Result<()> { + Ok(()) + } + pub fn pull_lever(ctx: Context) -> Result<()> { + Ok(()) + } +} +#[derive(Accounts)] +pub struct InitializeContext<'info> { + #[account(mut)] + pub power: Signer<'info>, + #[account(mut)] + pub user: Signer<'info>, +} +#[derive(Accounts)] +pub struct PullLeverContext<'info> { + #[account(init, payer = user, space = 8, seeds = [b"hand"], bump)] + pub power: Account<'info, PowerStatus>, + #[account(mut)] + pub user: Signer<'info>, + pub system_program: Program<'info, System>, +} +#[account] +pub struct PowerStatus {} diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/Cargo.toml b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/Cargo.toml new file mode 100644 index 000000000..2f9b351f7 --- /dev/null +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "lever" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "lever" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] + +[dependencies] +anchor-lang = "0.30.1" diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/Xargo.toml b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/cross_program_invocation/src/lib.rs b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/src/lib.rs similarity index 55% rename from basics/cross-program-invocation/poseidon/cross_program_invocation/programs/cross_program_invocation/src/lib.rs rename to basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/src/lib.rs index 503ef03d3..03c6d2ff1 100644 --- a/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/cross_program_invocation/src/lib.rs +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/programs/lever/src/lib.rs @@ -1,17 +1,11 @@ use anchor_lang::prelude::*; -declare_id!("D4aA71us8bTcdXeZQpXyXidW2xPugVwUuoXx3b1bnvXa"); +declare_id!("9aM9w7ozrZwXx9bQHbBx6QjWc6F46tdN9ayt86vt9uLL"); #[program] -pub mod cross_program_invocation { +pub mod lever { use super::*; pub fn initialize(ctx: Context) -> Result<()> { Ok(()) } - pub fn switch_power(ctx: Context, name: String) -> Result<()> { - Ok(()) - } - pub fn pull_lever(ctx: Context, name: String) -> Result<()> { - Ok(()) - } pub fn initialize_lever(ctx: Context) -> Result<()> { Ok(()) } @@ -20,25 +14,18 @@ pub mod cross_program_invocation { } } #[derive(Accounts)] -pub struct InitializeContext<'info> {} -#[derive(Accounts)] -pub struct SwitchPowerContext<'info> {} -#[derive(Accounts)] -pub struct PullLeverContext<'info> { - #[account()] - pub lever_program: Account<'info, Lever>, +pub struct InitializeContext<'info> { + #[account(mut)] + pub power: Signer<'info>, #[account(mut)] pub user: Signer<'info>, - #[account()] - pub power: Account<'info, PowerStatus>, - pub system_program: Program<'info, System>, } #[derive(Accounts)] pub struct InitializeLeverContext<'info> { - #[account(init, payer = user, space = 8, seeds = [b"power"], bump)] - pub power: Account<'info, PowerStatus>, #[account(mut)] pub user: Signer<'info>, + #[account(init, payer = user, space = 8, seeds = [b"lever"], bump)] + pub power: Account<'info, PowerStatus>, pub system_program: Program<'info, System>, } #[derive(Accounts)] @@ -51,5 +38,3 @@ pub struct SetPowerStatusContext<'info> { } #[account] pub struct PowerStatus {} -#[account] -pub struct Lever {} diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/tests/bankrun.test.ts b/basics/cross-program-invocation/poseidon/cross_program_invocation/tests/bankrun.test.ts index e69de29bb..013359161 100644 --- a/basics/cross-program-invocation/poseidon/cross_program_invocation/tests/bankrun.test.ts +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/tests/bankrun.test.ts @@ -0,0 +1,51 @@ +import { describe, it } from 'node:test'; +import * as anchor from '@coral-xyz/anchor'; +import { Keypair, PublicKey } from '@solana/web3.js'; +import { BankrunProvider } from 'anchor-bankrun'; +import { startAnchor } from 'solana-bankrun'; +import type { Hand } from '../target/types/hand'; +import type { Lever } from '../target/types/lever'; + +const HAND_IDL = require('../target/idl/hand.json'); +const LEVER_IDL = require('../target/idl/lever.json'); +const HAND_PROGRAM_ID = new PublicKey(HAND_IDL.address); +const LEVER_PROGRAM_ID = new PublicKey(LEVER_IDL.address); + +describe('cpi', async () => { + const context = await startAnchor( + '', + [ + { + name: 'hand', + programId: HAND_PROGRAM_ID, + }, + { + name: 'lever', + programId: LEVER_PROGRAM_ID, + }, + ], + [], + ); + const provider = new BankrunProvider(context); + + const hand = new anchor.Program(HAND_IDL, provider); + const lever = new anchor.Program(LEVER_IDL, provider); + + // Generate a new keypair for the power account + const powerAccount = new anchor.web3.Keypair(); + + it('Initialize the lever!', async () => { + await lever.methods + .initialize() + .accounts({ + power: powerAccount.publicKey, + user: provider.wallet.publicKey, + }) + .signers([powerAccount]) + .rpc(); + }); + + it('Pull the lever!', async () => { + await hand.methods.pullLever().accounts({}).rpc(); + }); +}); diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/tests/cross_program_invocation.ts b/basics/cross-program-invocation/poseidon/cross_program_invocation/tests/cross_program_invocation.ts deleted file mode 100644 index d5363628c..000000000 --- a/basics/cross-program-invocation/poseidon/cross_program_invocation/tests/cross_program_invocation.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as anchor from "@coral-xyz/anchor"; -import { Program } from "@coral-xyz/anchor"; -import { CrossProgramInvocation } from "../target/types/cross_program_invocation"; - -describe("cross_program_invocation", () => { - // Configure the client to use the local cluster. - anchor.setProvider(anchor.AnchorProvider.env()); - - const program = anchor.workspace.CrossProgramInvocation as Program; - - it("Is initialized!", async () => { - // Add your test here. - const tx = await program.methods.initialize().rpc(); - console.log("Your transaction signature", tx); - }); -}); diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/cross_program_invocation.ts b/basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/cross_program_invocation.ts deleted file mode 100644 index 1435c18f3..000000000 --- a/basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/cross_program_invocation.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - Account, - Pubkey, - Result, - Signer, -} from "@solanaturbine/poseidon"; - -export default class CrossProgramInvocation { - static PROGRAM_ID = new Pubkey( - "D4aA71us8bTcdXeZQpXyXidW2xPugVwUuoXx3b1bnvXa" - ); - - initialize() {} - - switchPower(name:String) {} - pullLever( - user: Signer, - power: PowerStatus, - lever_program: Lever, - name: String - ): Result {} - - initializeLever(user: Signer, power: PowerStatus): Result { - power.derive(["power"]).init(); - } - - setPowerStatus(user: Signer, power: PowerStatus): Result {} -} - -export interface PowerStatus extends Account { - // is_on: bool -} - -export interface Lever extends Account {} diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/hand.ts b/basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/hand.ts new file mode 100644 index 000000000..cb0c5c47e --- /dev/null +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/hand.ts @@ -0,0 +1,20 @@ +import { Account, Pubkey, Result, Signer } from '@solanaturbine/poseidon'; + +export default class Hand { + static PROGRAM_ID = new Pubkey('Cd86dtBUzQKYTFtcB8zDxPRUPCtKPocyetWZSnq6PNxv'); + + initialize(user: Signer, power: Signer) {} + + pullLever( + user: Signer, + power: PowerStatus, + // name: String + ): Result { + power.derive(['hand']).init(); + } + // switchPower(name: String) {} +} + +export interface PowerStatus extends Account { + // is_on: bool +} diff --git a/basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/lever.ts b/basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/lever.ts new file mode 100644 index 000000000..a66e7e0cf --- /dev/null +++ b/basics/cross-program-invocation/poseidon/cross_program_invocation/ts-programs/src/lever.ts @@ -0,0 +1,19 @@ +import { Account, Pubkey, Result, Signer } from '@solanaturbine/poseidon'; + +export default class Lever { + static PROGRAM_ID = new Pubkey('9aM9w7ozrZwXx9bQHbBx6QjWc6F46tdN9ayt86vt9uLL'); + + initialize(user: Signer, power: Signer) {} + + // switchPower(name: String) {} + + initializeLever(user: Signer, power: PowerStatus): Result { + power.derive(['lever']).init(); + } + + setPowerStatus(user: Signer, power: PowerStatus): Result {} +} + +export interface PowerStatus extends Account { + // is_on: bool +}