Преглед на файлове

feat: add rust litesvm test for checking account (#434)

Perelyn преди 3 седмици
родител
ревизия
f3e8e8d4cc
променени са 3 файла, в които са добавени 207 реда и са изтрити 1 реда
  1. 137 0
      Cargo.lock
  2. 8 1
      basics/checking-accounts/native/program/Cargo.toml
  3. 62 0
      basics/checking-accounts/native/program/tests/test.rs

+ 137 - 0
Cargo.lock

@@ -847,8 +847,14 @@ dependencies = [
 name = "checking-accounts-native-program"
 version = "0.1.0"
 dependencies = [
+ "litesvm",
+ "solana-keypair",
+ "solana-native-token 3.0.0",
  "solana-program 3.0.0",
+ "solana-pubkey 3.0.0",
+ "solana-sdk",
  "solana-system-interface 2.0.0",
+ "solana-transaction",
 ]
 
 [[package]]
@@ -1222,6 +1228,18 @@ dependencies = [
  "zeroize",
 ]
 
+[[package]]
+name = "ed25519-dalek-bip32"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b49a684b133c4980d7ee783936af771516011c8cd15f429dbda77245e282f03"
+dependencies = [
+ "derivation-path",
+ "ed25519-dalek 2.2.0",
+ "hmac 0.12.1",
+ "sha2 0.10.9",
+]
+
 [[package]]
 name = "either"
 version = "1.15.0"
@@ -2591,6 +2609,12 @@ dependencies = [
  "rand_core 0.6.4",
 ]
 
+[[package]]
+name = "siphasher"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+
 [[package]]
 name = "smallvec"
 version = "1.15.0"
@@ -2666,6 +2690,7 @@ dependencies = [
  "curve25519-dalek 4.1.3",
  "five8",
  "five8_const",
+ "rand 0.8.5",
  "serde",
  "serde_derive",
  "solana-atomic-u64 3.0.0",
@@ -3101,6 +3126,16 @@ dependencies = [
  "solana-sdk-ids 3.0.0",
 ]
 
+[[package]]
+name = "solana-epoch-info"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8a6b69bd71386f61344f2bcf0f527f5fd6dd3b22add5880e2e1bf1dd1fa8059"
+dependencies = [
+ "serde",
+ "serde_derive",
+]
+
 [[package]]
 name = "solana-epoch-rewards"
 version = "2.2.1"
@@ -3129,6 +3164,17 @@ dependencies = [
  "solana-sysvar-id 3.0.0",
 ]
 
+[[package]]
+name = "solana-epoch-rewards-hasher"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e507099d0c2c5d7870c9b1848281ea67bbeee80d171ca85003ee5767994c9c38"
+dependencies = [
+ "siphasher",
+ "solana-hash 3.0.0",
+ "solana-pubkey 3.0.0",
+]
+
 [[package]]
 name = "solana-epoch-schedule"
 version = "2.2.1"
@@ -3264,6 +3310,10 @@ name = "solana-fee-structure"
 version = "3.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5e2abdb1223eea8ec64136f39cb1ffcf257e00f915c957c35c0dd9e3f4e700b0"
+dependencies = [
+ "serde",
+ "serde_derive",
+]
 
 [[package]]
 name = "solana-genesis-config"
@@ -3337,6 +3387,10 @@ name = "solana-inflation"
 version = "3.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e92f37a14e7c660628752833250dd3dcd8e95309876aee751d7f8769a27947c6"
+dependencies = [
+ "serde",
+ "serde_derive",
+]
 
 [[package]]
 name = "solana-instruction"
@@ -3378,6 +3432,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b1f0d483b8ae387178d9210e0575b666b05cdd4bd0f2f188128249f6e454d39d"
 dependencies = [
  "num-traits",
+ "serde",
+ "serde_derive",
  "solana-program-error 3.0.0",
 ]
 
@@ -3459,9 +3515,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "952ed9074c12edd2060cb09c2a8c664303f4ab7f7056a407ac37dd1da7bdaa3e"
 dependencies = [
  "ed25519-dalek 2.2.0",
+ "ed25519-dalek-bip32",
  "five8",
  "rand 0.8.5",
+ "solana-derivation-path",
  "solana-pubkey 3.0.0",
+ "solana-seed-derivable",
  "solana-seed-phrase",
  "solana-signature",
  "solana-signer",
@@ -3719,6 +3778,22 @@ dependencies = [
  "solana-sdk-ids 3.0.0",
 ]
 
+[[package]]
+name = "solana-offchain-message"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6e2a1141a673f72a05cf406b99e4b2b8a457792b7c01afa07b3f00d4e2de393"
+dependencies = [
+ "num_enum",
+ "solana-hash 3.0.0",
+ "solana-packet",
+ "solana-pubkey 3.0.0",
+ "solana-sanitize 3.0.1",
+ "solana-sha256-hasher 3.0.0",
+ "solana-signature",
+ "solana-signer",
+]
+
 [[package]]
 name = "solana-packet"
 version = "3.0.0"
@@ -3755,6 +3830,17 @@ dependencies = [
  "num-traits",
 ]
 
+[[package]]
+name = "solana-presigner"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f704eaf825be3180832445b9e4983b875340696e8e7239bf2d535b0f86c14a2"
+dependencies = [
+ "solana-pubkey 3.0.0",
+ "solana-signature",
+ "solana-signer",
+]
+
 [[package]]
 name = "solana-program"
 version = "2.3.0"
@@ -4055,6 +4141,7 @@ version = "3.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941"
 dependencies = [
+ "rand 0.8.5",
  "solana-address",
 ]
 
@@ -4113,6 +4200,44 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "solana-sdk"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f03df7969f5e723ad31b6c9eadccc209037ac4caa34d8dc259316b05c11e82b"
+dependencies = [
+ "bincode",
+ "bs58",
+ "serde",
+ "solana-account 3.1.0",
+ "solana-epoch-info",
+ "solana-epoch-rewards-hasher",
+ "solana-fee-structure",
+ "solana-inflation",
+ "solana-keypair",
+ "solana-message 3.0.1",
+ "solana-offchain-message",
+ "solana-presigner",
+ "solana-program 3.0.0",
+ "solana-program-memory 3.0.0",
+ "solana-pubkey 3.0.0",
+ "solana-sanitize 3.0.1",
+ "solana-sdk-ids 3.0.0",
+ "solana-sdk-macro 3.0.0",
+ "solana-seed-derivable",
+ "solana-seed-phrase",
+ "solana-serde",
+ "solana-serde-varint 3.0.0",
+ "solana-short-vec 3.0.0",
+ "solana-shred-version",
+ "solana-signature",
+ "solana-signer",
+ "solana-time-utils",
+ "solana-transaction",
+ "solana-transaction-error 3.0.0",
+ "thiserror 2.0.17",
+]
+
 [[package]]
 name = "solana-sdk-ids"
 version = "2.2.1"
@@ -4223,6 +4348,15 @@ dependencies = [
  "sha2 0.10.9",
 ]
 
+[[package]]
+name = "solana-serde"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "709a93cab694c70f40b279d497639788fc2ccbcf9b4aa32273d4b361322c02dd"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "solana-serde-varint"
 version = "2.2.2"
@@ -4322,6 +4456,7 @@ checksum = "4bb8057cc0e9f7b5e89883d49de6f407df655bb6f3a71d0b7baf9986a2218fd9"
 dependencies = [
  "ed25519-dalek 2.2.0",
  "five8",
+ "rand 0.8.5",
  "serde",
  "serde-big-array",
  "serde_derive",
@@ -4758,6 +4893,8 @@ version = "3.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4222065402340d7e6aec9dc3e54d22992ddcf923d91edcd815443c2bfca3144a"
 dependencies = [
+ "serde",
+ "serde_derive",
  "solana-instruction-error",
  "solana-sanitize 3.0.1",
 ]

+ 8 - 1
basics/checking-accounts/native/program/Cargo.toml

@@ -11,10 +11,17 @@ solana-system-interface.workspace = true
 crate-type = ["cdylib", "lib"]
 
 [features]
-anchor-debug = []
 custom-heap = []
 custom-panic = []
 
 
 [lints.rust]
 unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] }
+
+[dev-dependencies]
+litesvm = "0.8.1"
+solana-keypair = "3.0.1"
+solana-native-token = "3.0.0"
+solana-pubkey = "3.0.0"
+solana-sdk = "3.0.0"
+solana-transaction = "3.0.1"

+ 62 - 0
basics/checking-accounts/native/program/tests/test.rs

@@ -0,0 +1,62 @@
+use litesvm::LiteSVM;
+use solana_keypair::{Keypair, Signer};
+use solana_native_token::LAMPORTS_PER_SOL;
+use solana_pubkey::Pubkey;
+use solana_system_interface::instruction::create_account;
+use solana_transaction::{AccountMeta, Instruction, Transaction};
+
+#[test]
+fn test_checking_accounts() {
+    let mut svm = LiteSVM::new();
+
+    let payer = Keypair::new();
+    let account_to_change = Keypair::new();
+    let account_to_create = Keypair::new();
+
+    svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap();
+
+    let program_id = Pubkey::new_unique();
+    let program_bytes =
+        include_bytes!("../../../../../target/deploy/checking_accounts_native_program.so");
+
+    svm.add_program(program_id, program_bytes).unwrap();
+
+    let create_account_ix = create_account(
+        &payer.pubkey(),
+        &account_to_change.pubkey(),
+        LAMPORTS_PER_SOL,
+        0,
+        &program_id,
+    );
+
+    let tx = Transaction::new_signed_with_payer(
+        &[create_account_ix],
+        Some(&payer.pubkey()),
+        &[&payer, &account_to_change],
+        svm.latest_blockhash(),
+    );
+
+    // verify tx was sent successfully
+    let _ = svm.send_transaction(tx).is_ok();
+
+    let ix = Instruction {
+        program_id,
+        accounts: vec![
+            AccountMeta::new(payer.pubkey(), true),
+            AccountMeta::new(account_to_create.pubkey(), true),
+            AccountMeta::new(account_to_change.pubkey(), true),
+            AccountMeta::new(solana_system_interface::program::ID, false),
+        ],
+        data: vec![0],
+    };
+
+    let tx = Transaction::new_signed_with_payer(
+        &[ix],
+        Some(&payer.pubkey()),
+        &[payer, account_to_change, account_to_create],
+        svm.latest_blockhash(),
+    );
+
+    // verify tx was sent successfully
+    let _ = svm.send_transaction(tx).is_ok();
+}