From 6a0ed45715ea9baa44ec08ac6179c606b0309936 Mon Sep 17 00:00:00 2001 From: hirokisan Date: Tue, 29 Oct 2024 13:32:47 +0900 Subject: [PATCH] chore: add example --- .gitignore | 1 - Cargo.lock | 66 +++++++++++++++++++++++++++++++ Cargo.toml | 2 +- examples/solprofile/.gitignore | 1 + examples/solprofile/Cargo.toml | 21 ++++++++++ examples/solprofile/README.md | 37 +++++++++++++++++ examples/solprofile/idls/.gitkeep | 0 examples/solprofile/src/create.rs | 46 +++++++++++++++++++++ examples/solprofile/src/get.rs | 30 ++++++++++++++ examples/solprofile/src/update.rs | 51 ++++++++++++++++++++++++ examples/solprofile/src/util.rs | 10 +++++ 11 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 examples/solprofile/.gitignore create mode 100644 examples/solprofile/Cargo.toml create mode 100644 examples/solprofile/README.md create mode 100644 examples/solprofile/idls/.gitkeep create mode 100644 examples/solprofile/src/create.rs create mode 100644 examples/solprofile/src/get.rs create mode 100644 examples/solprofile/src/update.rs create mode 100644 examples/solprofile/src/util.rs diff --git a/.gitignore b/.gitignore index e049cd2..b242d8d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,3 @@ target .DS_Store test-ledger/ .anchor -target diff --git a/Cargo.lock b/Cargo.lock index 83d7e7c..f086a7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1318,6 +1318,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -2033,6 +2054,16 @@ version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + [[package]] name = "libsecp256k1" version = "0.6.0" @@ -2424,6 +2455,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "os_str_bytes" version = "6.6.1" @@ -2827,6 +2864,17 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.11.0" @@ -3269,6 +3317,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +[[package]] +name = "shellexpand" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" +dependencies = [ + "dirs", +] + [[package]] name = "shlex" version = "1.3.0" @@ -4070,6 +4127,15 @@ dependencies = [ "anchor-lang", ] +[[package]] +name = "solprofile-example" +version = "0.1.0" +dependencies = [ + "anchor-client", + "anchor-lang", + "shellexpand", +] + [[package]] name = "spin" version = "0.5.2" diff --git a/Cargo.toml b/Cargo.toml index 1a140e0..ecc4a60 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["programs/*", "tests"] +members = ["programs/*", "tests", "examples/*"] resolver = "2" [profile.release] diff --git a/examples/solprofile/.gitignore b/examples/solprofile/.gitignore new file mode 100644 index 0000000..13eeac4 --- /dev/null +++ b/examples/solprofile/.gitignore @@ -0,0 +1 @@ +idls/solprofile.json diff --git a/examples/solprofile/Cargo.toml b/examples/solprofile/Cargo.toml new file mode 100644 index 0000000..b329d93 --- /dev/null +++ b/examples/solprofile/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "solprofile-example" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "create" +path = "src/create.rs" + +[[bin]] +name = "get" +path = "src/get.rs" + +[[bin]] +name = "update" +path = "src/update.rs" + +[dependencies] +anchor-lang = "0.30.1" +anchor-client = "0.30.1" +shellexpand = "3.1.0" diff --git a/examples/solprofile/README.md b/examples/solprofile/README.md new file mode 100644 index 0000000..3dc276d --- /dev/null +++ b/examples/solprofile/README.md @@ -0,0 +1,37 @@ +# Examples + +## Run on localnet + +### Setup + +#### Deploy Program + +See [Run on localnet](https://github.com/hirokisan/solprofile?tab=readme-ov-file#run-on-localnet). + +#### Copy IDL + +Copy `../../target/idl/solprofile.json` to `idls/solprofile.json`. + +### Create a profile + +```console +$ cargo run --quiet --bin create +``` + +### Get a profile + +```console +$ cargo run --quiet --bin get +``` + +Tips. + +```console +$ anchor account solprofile.Profile {ADDRESS} --idl=idls/solprofile.json +``` + +### Update a profile + +```console +$ cargo run --quiet --bin update +``` diff --git a/examples/solprofile/idls/.gitkeep b/examples/solprofile/idls/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/solprofile/src/create.rs b/examples/solprofile/src/create.rs new file mode 100644 index 0000000..728460c --- /dev/null +++ b/examples/solprofile/src/create.rs @@ -0,0 +1,46 @@ +use anchor_lang::prelude::*; + +use anchor_client::{ + solana_sdk::{ + signature::{read_keypair_file, Signer}, + system_program, + }, + Client, Cluster, +}; + +use crate::util::{get_default_signer_keypair_path, get_profile_account}; +use std::rc::Rc; + +declare_program!(solprofile); + +use solprofile::client::{accounts, args}; + +mod util; + +fn main() { + let program_id = solprofile::ID; + let system_program_key = system_program::id(); + + let signer_keypair_path = get_default_signer_keypair_path(); + let signer = read_keypair_file(&signer_keypair_path).unwrap(); + let signer_key = Signer::pubkey(&signer); + + let client = Client::new(Cluster::Localnet, Rc::new(&signer)); + let program = client.program(program_id).unwrap(); + + let (profile_key, _) = get_profile_account(&signer_key, &program_id); + + let tx = program + .request() + .accounts(accounts::Create { + profile: profile_key, + owner: signer_key, + system_program: system_program_key, + }) + .args(args::Create) + .signer(&signer) + .send() + .unwrap(); + + println!("tx: {}", tx); +} diff --git a/examples/solprofile/src/get.rs b/examples/solprofile/src/get.rs new file mode 100644 index 0000000..13d5890 --- /dev/null +++ b/examples/solprofile/src/get.rs @@ -0,0 +1,30 @@ +use anchor_lang::prelude::*; + +use anchor_client::{ + solana_sdk::signature::{read_keypair_file, Signer}, + Client, Cluster, +}; + +use crate::util::{get_default_signer_keypair_path, get_profile_account}; +use std::rc::Rc; + +declare_program!(solprofile); + +mod util; + +fn main() { + let program_id = solprofile::ID; + + let signer_keypair_path = get_default_signer_keypair_path(); + let signer = read_keypair_file(signer_keypair_path).unwrap(); + let signer_key = Signer::pubkey(&signer); + + let client = Client::new(Cluster::Localnet, Rc::new(&signer)); + let program = client.program(program_id).unwrap(); + + let (profile_key, _) = get_profile_account(&signer_key, &program_id); + + let data: solprofile::accounts::Profile = program.account(profile_key).unwrap(); + + println!("data: {data:#?}"); +} diff --git a/examples/solprofile/src/update.rs b/examples/solprofile/src/update.rs new file mode 100644 index 0000000..b10839c --- /dev/null +++ b/examples/solprofile/src/update.rs @@ -0,0 +1,51 @@ +use anchor_lang::prelude::*; + +use anchor_client::{ + solana_sdk::{ + signature::{read_keypair_file, Signer}, + system_program, + }, + Client, Cluster, +}; + +use crate::util::{get_default_signer_keypair_path, get_profile_account}; +use std::rc::Rc; + +declare_program!(solprofile); + +use solprofile::client::{accounts, args}; +use solprofile::types; + +mod util; + +fn main() { + let program_id = solprofile::ID; + let system_program_key = system_program::id(); + + let signer_keypair_path = get_default_signer_keypair_path(); + let signer = read_keypair_file(signer_keypair_path).unwrap(); + let signer_key = Signer::pubkey(&signer); + + let client = Client::new(Cluster::Localnet, Rc::new(&signer)); + let program = client.program(program_id).unwrap(); + + let (profile_key, _) = get_profile_account(&signer_key, &program_id); + + let tx = program + .request() + .accounts(accounts::Update { + profile: profile_key, + owner: signer_key, + system_program: system_program_key, + }) + .args(args::Update { + args: types::UpdateArgs { + name: Some("updated_name".to_string()), + }, + }) + .signer(&signer) + .send() + .unwrap(); + + println!("tx: {}", tx); +} diff --git a/examples/solprofile/src/util.rs b/examples/solprofile/src/util.rs new file mode 100644 index 0000000..ab24789 --- /dev/null +++ b/examples/solprofile/src/util.rs @@ -0,0 +1,10 @@ +use anchor_lang::prelude::*; + +pub fn get_default_signer_keypair_path() -> String { + shellexpand::tilde("~/.config/solana/id.json").to_string() +} + +pub fn get_profile_account(owner: &Pubkey, program_id: &Pubkey) -> (Pubkey, u8) { + pub const PROFILE_SEED: &'static [u8] = b"profile"; + Pubkey::find_program_address(&[PROFILE_SEED, owner.to_bytes().as_ref()], program_id) +}