diff --git a/Cargo.lock b/Cargo.lock index 785203f..9ff6f03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -126,8 +126,7 @@ dependencies = [ [[package]] name = "aligned-sized" version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48a526ec4434d531d488af59fe866f36b310fe8906691c75dffa664450a3800a" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "proc-macro2", "quote", @@ -935,9 +934,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.53" +version = "1.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" +checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583" dependencies = [ "find-msvc-tools", "jobserver", @@ -2085,7 +2084,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.6.2", "system-configuration 0.6.1", "tokio", "tower-service", @@ -2095,9 +2094,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2442,16 +2441,37 @@ dependencies = [ "libsecp256k1-core", ] +[[package]] +name = "light-account" +version = "0.1.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" +dependencies = [ + "anchor-lang", + "light-account-checks", + "light-compressed-account", + "light-compressible", + "light-hasher", + "light-macros", + "light-sdk-macros", + "light-sdk-types", + "light-token-interface", + "solana-account-info", + "solana-instruction", + "solana-pubkey", +] + [[package]] name = "light-account-checks" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0785da22cd4a7667583141ca56c790a5c8afa2b22ad2a08204d78881035524e8" +version = "0.7.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "solana-account-info", + "solana-cpi", + "solana-instruction", "solana-msg", "solana-program-error", "solana-pubkey", + "solana-system-interface", "solana-sysvar", "thiserror 2.0.18", ] @@ -2474,29 +2494,27 @@ dependencies = [ [[package]] name = "light-array-map" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859dc5b406a8bf0b114f686e6f2e36d0e939bad6f579492a520d309b52fde1f8" +version = "0.2.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "tinyvec", ] [[package]] name = "light-batched-merkle-tree" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13cb8bc778065ee71d1990fdc94112e35dc63a5e387a323284a49f40d123d8e0" +version = "0.9.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "aligned-sized", "borsh 0.10.4", "light-account-checks", "light-bloom-filter", - "light-compressed-account 0.8.0", + "light-compressed-account", "light-hasher", "light-macros", "light-merkle-tree-metadata", "light-verifier", - "light-zero-copy 0.6.0", + "light-zero-copy", "solana-account-info", "solana-msg", "solana-program-error", @@ -2508,9 +2526,8 @@ dependencies = [ [[package]] name = "light-bloom-filter" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a609e3c9179f0ae8488cc70c5413c86dfd97dad7ad85fee2ad8da2d0a11e61" +version = "0.6.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "bitvec", "num-bigint 0.4.6", @@ -2533,9 +2550,8 @@ dependencies = [ [[package]] name = "light-client" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1f3cd013364dbe5c45a9e9a8faee1af30dccb600cd56a41e296ed8d5684768" +version = "0.19.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "anchor-lang", "async-trait", @@ -2544,7 +2560,9 @@ dependencies = [ "bs58", "futures", "lazy_static", - "light-compressed-account 0.8.0", + "light-account", + "light-compressed-account", + "light-compressed-token-sdk", "light-compressible", "light-concurrent-merkle-tree", "light-event", @@ -2553,6 +2571,7 @@ dependencies = [ "light-merkle-tree-metadata", "light-prover-client", "light-sdk", + "light-sdk-types", "light-token", "light-token-interface", "litesvm", @@ -2588,61 +2607,69 @@ dependencies = [ [[package]] name = "light-compressed-account" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058df2733fa6a3e4bda6f162a6c5d41f10fc8c6f6ddb992af1de76b60214e4a6" +version = "0.9.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ + "anchor-lang", "borsh 0.10.4", + "bytemuck", "light-hasher", "light-macros", + "light-poseidon 0.3.0", "light-program-profiler", - "light-zero-copy 0.5.0", + "light-zero-copy", + "solana-msg", + "solana-program-error", + "solana-pubkey", "thiserror 2.0.18", "tinyvec", "zerocopy", ] [[package]] -name = "light-compressed-account" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "768ae5a56d8c9cf315d132b3faa5b067f95b3d6a294c579e82f8f0e0bf29c7cc" +name = "light-compressed-token-sdk" +version = "0.1.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "anchor-lang", + "arrayvec", "borsh 0.10.4", - "bytemuck", - "light-hasher", - "light-macros", - "light-poseidon 0.3.0", + "light-account", + "light-account-checks", + "light-compressed-account", "light-program-profiler", - "light-zero-copy 0.6.0", + "light-sdk", + "light-sdk-types", + "light-token-interface", + "light-token-types", + "light-zero-copy", + "solana-account-info", + "solana-cpi", + "solana-instruction", "solana-msg", "solana-program-error", "solana-pubkey", "thiserror 2.0.18", - "tinyvec", - "zerocopy", ] [[package]] name = "light-compressible" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff0f0065beb8d16df587b3ea17082e11dea3f67c98813b4bcc061eecd94561f" +version = "0.4.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "aligned-sized", "anchor-lang", "borsh 0.10.4", "bytemuck", "light-account-checks", - "light-compressed-account 0.8.0", + "light-compressed-account", "light-hasher", "light-macros", "light-program-profiler", - "light-sdk-types", - "light-zero-copy 0.6.0", + "light-zero-copy", "pinocchio-pubkey", "solana-pubkey", + "solana-rent", "thiserror 2.0.18", "zerocopy", ] @@ -2650,8 +2677,7 @@ dependencies = [ [[package]] name = "light-concurrent-merkle-tree" version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db96f47253a0907aaa46dac15cecb27b5510130e48da0b36690dcd2e99a6d558" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "borsh 0.10.4", "light-bounded-vec", @@ -2663,22 +2689,20 @@ dependencies = [ [[package]] name = "light-event" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1674c9d85b32a9e8abb90cccdee18e35ae29daa1126fdb81a8a28c0a54802096" +version = "0.4.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "borsh 0.10.4", - "light-compressed-account 0.8.0", + "light-compressed-account", "light-hasher", - "light-zero-copy 0.6.0", + "light-zero-copy", "thiserror 2.0.18", ] [[package]] name = "light-hasher" version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c822662e6e109bac0e132a43fd52a4ef684811245a794e048cf9cda001e934c8" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", @@ -2695,8 +2719,7 @@ dependencies = [ [[package]] name = "light-indexed-array" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f14f984030d86b6f07bd8f5ae04e2c40fcd0c3bdfcc7a291fff1ed59c9e6554" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "light-hasher", "num-bigint 0.4.6", @@ -2707,8 +2730,7 @@ dependencies = [ [[package]] name = "light-indexed-merkle-tree" version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0824755289075f28de2820fc7d4ec4e6b9e99d404e033c07338b91cce8c71fb8" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "light-bounded-vec", "light-concurrent-merkle-tree", @@ -2720,11 +2742,42 @@ dependencies = [ "thiserror 2.0.18", ] +[[package]] +name = "light-instruction-decoder" +version = "0.2.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" +dependencies = [ + "borsh 0.10.4", + "bs58", + "light-compressed-account", + "light-instruction-decoder-derive", + "light-sdk-types", + "light-token-interface", + "serde", + "solana-instruction", + "solana-pubkey", + "solana-signature", + "tabled", +] + +[[package]] +name = "light-instruction-decoder-derive" +version = "0.2.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" +dependencies = [ + "bs58", + "darling", + "heck 0.5.0", + "proc-macro2", + "quote", + "sha2 0.10.9", + "syn 2.0.114", +] + [[package]] name = "light-macros" version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "179ac51cadc1d0ca047b4d6265a7cc245ca3affc16a20a2749585aa6464d39c2" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "bs58", "proc-macro2", @@ -2735,14 +2788,13 @@ dependencies = [ [[package]] name = "light-merkle-tree-metadata" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d08edcc194eef61b0f499934ce398122d54ac57505d44480e5f079a4220566" +version = "0.9.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "anchor-lang", "borsh 0.10.4", "bytemuck", - "light-compressed-account 0.8.0", + "light-compressed-account", "solana-msg", "solana-program-error", "solana-sysvar", @@ -2753,8 +2805,7 @@ dependencies = [ [[package]] name = "light-merkle-tree-reference" version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8d480f62ca32b38a6231bbc5310d693f91d6b5bdcc18bb13c2d9aab7a1c90e8" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "light-hasher", "light-indexed-array", @@ -2809,9 +2860,8 @@ dependencies = [ [[package]] name = "light-program-test" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a981dfbc19c529543ab1dd8d100319b89aac053b81415a681d1474c986218307" +version = "0.19.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "anchor-lang", "async-trait", @@ -2820,13 +2870,17 @@ dependencies = [ "bs58", "bytemuck", "chrono", + "light-account", + "light-account-checks", "light-client", - "light-compressed-account 0.8.0", + "light-compressed-account", + "light-compressed-token-sdk", "light-compressible", "light-event", "light-hasher", "light-indexed-array", "light-indexed-merkle-tree", + "light-instruction-decoder", "light-merkle-tree-metadata", "light-merkle-tree-reference", "light-prover-client", @@ -2834,7 +2888,7 @@ dependencies = [ "light-sdk-types", "light-token", "light-token-interface", - "light-zero-copy 0.6.0", + "light-zero-copy", "litesvm", "log", "num-bigint 0.4.6", @@ -2861,14 +2915,13 @@ dependencies = [ [[package]] name = "light-prover-client" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75d8c9b8b6e9d445b9ef27467da592ee231e614282c3c0bd2f30f567eb904845" +version = "6.0.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "ark-bn254 0.5.0", "ark-serialize 0.5.0", "ark-std 0.5.0", - "light-compressed-account 0.7.0", + "light-compressed-account", "light-hasher", "light-indexed-array", "light-sparse-merkle-tree", @@ -2885,21 +2938,22 @@ dependencies = [ [[package]] name = "light-sdk" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dece106ebd0897bd23a12bad040e0999d93b54447d0473739f91b1f83b1d331" +version = "0.19.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "anchor-lang", "bincode", "borsh 0.10.4", + "bytemuck", "light-account-checks", - "light-compressed-account 0.8.0", - "light-compressible", + "light-compressed-account", "light-hasher", "light-macros", + "light-program-profiler", "light-sdk-macros", "light-sdk-types", - "light-zero-copy 0.6.0", + "light-token-interface", + "light-zero-copy", "num-bigint 0.4.6", "solana-account-info", "solana-clock", @@ -2917,9 +2971,8 @@ dependencies = [ [[package]] name = "light-sdk-macros" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45d91992fa08093b1a274b3baed1d8368de794cc2645f9942718e5fe47a27dc2" +version = "0.19.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "darling", "light-hasher", @@ -2932,25 +2985,27 @@ dependencies = [ [[package]] name = "light-sdk-types" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b765f0a39428a137b8d449fa60ba147194cdbff08aa0add598c6047fff2cb7d2" +version = "0.19.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "anchor-lang", "borsh 0.10.4", + "bytemuck", "light-account-checks", - "light-compressed-account 0.8.0", + "light-compressed-account", + "light-compressible", "light-hasher", "light-macros", + "light-token-interface", "solana-msg", + "solana-program-error", "thiserror 2.0.18", ] [[package]] name = "light-sparse-merkle-tree" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4251e79b6c63f4946572dcfd7623680ad0f9e0efe1a761a944733333c5645063" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "light-hasher", "light-indexed-array", @@ -2961,16 +3016,17 @@ dependencies = [ [[package]] name = "light-token" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62907a12a9801200e5f4c03bb7f2dbdd9aa679223a959167c456a06005291d79" +version = "0.4.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "anchor-lang", "arrayvec", "borsh 0.10.4", + "light-account", "light-account-checks", "light-batched-merkle-tree", - "light-compressed-account 0.8.0", + "light-compressed-account", + "light-compressed-token-sdk", "light-compressible", "light-macros", "light-program-profiler", @@ -2979,7 +3035,7 @@ dependencies = [ "light-sdk-types", "light-token-interface", "light-token-types", - "light-zero-copy 0.6.0", + "light-zero-copy", "solana-account-info", "solana-cpi", "solana-instruction", @@ -2992,21 +3048,20 @@ dependencies = [ [[package]] name = "light-token-interface" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fb19b8e268a0154a8e13b3a8f6f43fa4928643e2de102d98a90b2af21f482ba" +version = "0.3.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "aligned-sized", "anchor-lang", "borsh 0.10.4", "bytemuck", "light-array-map", - "light-compressed-account 0.8.0", + "light-compressed-account", "light-compressible", "light-hasher", "light-macros", "light-program-profiler", - "light-zero-copy 0.6.0", + "light-zero-copy", "pinocchio", "pinocchio-pubkey", "solana-account-info", @@ -3020,14 +3075,13 @@ dependencies = [ [[package]] name = "light-token-types" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "278dddbf18d104f1225c480ca6d7b8710e1f9ff4104f24be70c522ecb6ed1dfc" +version = "0.4.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "anchor-lang", "borsh 0.10.4", "light-account-checks", - "light-compressed-account 0.8.0", + "light-compressed-account", "light-macros", "light-sdk-types", "solana-msg", @@ -3036,53 +3090,28 @@ dependencies = [ [[package]] name = "light-verifier" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f35f47736be493b60d8b56ef0c8e94afd6a99efafebb257f62b0b545e9aacab" +version = "8.0.0" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "groth16-solana", - "light-compressed-account 0.8.0", + "light-compressed-account", "thiserror 2.0.18", ] -[[package]] -name = "light-zero-copy" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8862f463792fd60ae8f5dc418150c16213e302e19d54fba0694cf8515be5ff" -dependencies = [ - "light-zero-copy-derive 0.5.0", - "zerocopy", -] - [[package]] name = "light-zero-copy" version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5621fb515e14af46148699c0b65334aabe230a1d2cbd06736ccc7a408c8a4af" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ - "light-zero-copy-derive 0.6.0", + "light-zero-copy-derive", "solana-program-error", "zerocopy", ] -[[package]] -name = "light-zero-copy-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8af086d52100b3cab1f2993b146adc7a69fa6aaa878ae4c19514c77c50304379" -dependencies = [ - "lazy_static", - "proc-macro2", - "quote", - "syn 2.0.114", -] - [[package]] name = "light-zero-copy-derive" version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c46425e5c7ab5203ff5c86ae2615b169cca55f9283f5f60f5dd74143be6934" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "lazy_static", "proc-macro2", @@ -3324,9 +3353,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-derive" @@ -3454,9 +3483,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.5.4+3.5.4" +version = "300.5.5+3.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72" +checksum = "3f1787d533e03597a7934fd0a765f0d28e94ecc5fb7789f8053b1e699a56f709" dependencies = [ "cc", ] @@ -3560,8 +3589,7 @@ dependencies = [ [[package]] name = "photon-api" version = "0.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e572dba0c255f5b8176f15b9e849330d915a8927804f7f9702d5bbbc70e4a1ad" +source = "git+https://github.com/Lightprotocol/light-protocol?rev=9876c8558b66753f29c58c0a995a88b2a70d9bda#9876c8558b66753f29c58c0a995a88b2a70d9bda" dependencies = [ "reqwest 0.12.28", "serde", @@ -3711,9 +3739,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -3787,7 +3815,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls 0.23.36", - "socket2 0.6.1", + "socket2 0.6.2", "thiserror 2.0.18", "tokio", "tracing", @@ -3824,16 +3852,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.6.2", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -3968,6 +3996,7 @@ dependencies = [ "bincode", "blake3", "bytemuck", + "light-account", "light-anchor-spl", "light-client", "light-hasher", @@ -4626,9 +4655,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -7871,9 +7900,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.45" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" +checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5" dependencies = [ "deranged", "itoa", @@ -7886,15 +7915,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" +checksum = "78cc610bac2dcee56805c99642447d4c5dbde4d01f752ffea0199aee1f601dc4" dependencies = [ "num-conv", "time-core", @@ -7937,7 +7966,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2 0.6.2", "tokio-macros", "windows-sys 0.61.2", ] @@ -8323,9 +8352,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "getrandom 0.3.4", "js-sys", @@ -8887,18 +8916,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "dafd85c832c1b68bbb4ec0c72c7f6f4fc5179627d2bc7c26b30e4c0cc11e76cc" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "7cb7e4e8436d9db52fbd6625dbf2f45243ab84994a72882ec8227b99e72b439a" dependencies = [ "proc-macro2", "quote", @@ -8981,9 +9010,9 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65" +checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439" [[package]] name = "zstd" diff --git a/programs/cp-swap/Cargo.toml b/programs/cp-swap/Cargo.toml index 7ba71c3..91595c6 100644 --- a/programs/cp-swap/Cargo.toml +++ b/programs/cp-swap/Cargo.toml @@ -19,11 +19,11 @@ enable-log = [] devnet = [] client = [] anchor-debug = [] -idl-build = ["anchor-lang/idl-build", "light-sdk/idl-build", "light-token/idl-build", "light-anchor-spl/idl-build"] +idl-build = ["anchor-lang/idl-build", "light-sdk/idl-build", "light-token/idl-build", "light-anchor-spl/idl-build", "light-anchor-spl/token_2022"] test-sbf = [] [dependencies] -anchor-lang = { version = "=0.31.1", features = ["init-if-needed", "idl-build"] } +anchor-lang = { version = "=0.31.1", features = ["init-if-needed"] } spl-token-2022 = { version = "7.0.0", features = ["no-entrypoint"] } spl-math = { version = "0.3", features = ["no-entrypoint"] } uint = "0.10.0" @@ -32,13 +32,14 @@ bytemuck = { version = "1.4.0", features = ["derive", "min_const_generics"] } arrayref = { version = "0.3.6" } blake3 = { workspace = true } -light-sdk = { version = "0.18.0", features = ["anchor", "anchor-discriminator", "idl-build", "cpi-context"] } -light-token = { version = "0.3.0", features = ["anchor", "idl-build"] } -light-hasher = "5" -light-anchor-spl = { version = "0.31.1", features = ["idl-build", "memo"] } -solana-account-info = "2.3" -solana-program = "2.2" -solana-pubkey = "2.2" +light-sdk = { git = "https://github.com/Lightprotocol/light-protocol", rev = "9876c8558b66753f29c58c0a995a88b2a70d9bda", features = ["anchor", "anchor-discriminator", "cpi-context"] } +light-token = { git = "https://github.com/Lightprotocol/light-protocol", rev = "9876c8558b66753f29c58c0a995a88b2a70d9bda", features = ["anchor"] } +light-hasher = { git = "https://github.com/Lightprotocol/light-protocol", rev = "9876c8558b66753f29c58c0a995a88b2a70d9bda" } +light-account = { git = "https://github.com/Lightprotocol/light-protocol", rev = "9876c8558b66753f29c58c0a995a88b2a70d9bda", features = ["token", "anchor", "sha256"] } +light-anchor-spl = { version = "0.31.1", features = ["memo", "token_2022"] } +solana-account-info = "2.2" +solana-program = "2.3" +solana-pubkey = "2.4" solana-program-error = "2.2" solana-cpi = { version = "2.2" } solana-msg = "2.2" @@ -48,13 +49,13 @@ quickcheck = "1.0.3" proptest = "1.0" rand = "0.9.0" -light-program-test = { version = "0.18.0" } -light-client = { version = "0.18.0" } +light-program-test = { git = "https://github.com/Lightprotocol/light-protocol", rev = "9876c8558b66753f29c58c0a995a88b2a70d9bda" } +light-client = { git = "https://github.com/Lightprotocol/light-protocol", rev = "9876c8558b66753f29c58c0a995a88b2a70d9bda" } tokio = { version = "1", features = ["full"] } spl-token = "7.0.0" solana-keypair = { version = "2.2" } solana-signer = { version = "2.2" } -solana-instruction = { version = "2.2" } +solana-instruction = { version = "2.3" } solana-sdk = { version = "2.3" } bincode = "1.3" diff --git a/programs/cp-swap/src/instructions/admin/collect_fund_fee.rs b/programs/cp-swap/src/instructions/admin/collect_fund_fee.rs index 068d806..da5780d 100644 --- a/programs/cp-swap/src/instructions/admin/collect_fund_fee.rs +++ b/programs/cp-swap/src/instructions/admin/collect_fund_fee.rs @@ -1,7 +1,7 @@ use crate::error::ErrorCode; use crate::states::*; use crate::utils::token::*; -use anchor_lang::prelude::*; +use anchor_lang::{accounts::account_loader::AccountLoader, prelude::*}; use light_anchor_spl::token::Token; use light_anchor_spl::token_interface::Mint; use light_anchor_spl::token_interface::Token2022; @@ -23,24 +23,17 @@ pub struct CollectFundFee<'info> { /// Pool state stores accumulated protocol fee amount #[account(mut)] - pub pool_state: Account<'info, PoolState>, + pub pool_state: AccountLoader<'info, PoolState>, /// Amm config account stores fund_owner - #[account(address = pool_state.amm_config)] pub amm_config: Account<'info, AmmConfig>, /// The address that holds pool tokens for token_0 - #[account( - mut, - constraint = token_0_vault.key() == pool_state.token_0_vault - )] + #[account(mut)] pub token_0_vault: Box>, /// The address that holds pool tokens for token_1 - #[account( - mut, - constraint = token_1_vault.key() == pool_state.token_1_vault - )] + #[account(mut)] pub token_1_vault: Box>, /// The mint of token_0 vault @@ -84,7 +77,25 @@ pub fn collect_fund_fee( let amount_1: u64; let auth_bump: u8; { - let pool_state = &mut ctx.accounts.pool_state; + let pool_state = &mut ctx.accounts.pool_state.load_mut()?; + + // Validate addresses + require_keys_eq!( + ctx.accounts.amm_config.key(), + pool_state.amm_config, + ErrorCode::InvalidOwner + ); + require_keys_eq!( + ctx.accounts.token_0_vault.key(), + pool_state.token_0_vault, + ErrorCode::InvalidVault + ); + require_keys_eq!( + ctx.accounts.token_1_vault.key(), + pool_state.token_1_vault, + ErrorCode::InvalidVault + ); + amount_0 = amount_0_requested.min(pool_state.fund_fees_token_0); amount_1 = amount_1_requested.min(pool_state.fund_fees_token_1); diff --git a/programs/cp-swap/src/instructions/admin/collect_protocol_fee.rs b/programs/cp-swap/src/instructions/admin/collect_protocol_fee.rs index 830be27..72134e6 100644 --- a/programs/cp-swap/src/instructions/admin/collect_protocol_fee.rs +++ b/programs/cp-swap/src/instructions/admin/collect_protocol_fee.rs @@ -1,7 +1,7 @@ use crate::error::ErrorCode; use crate::states::*; use crate::utils::*; -use anchor_lang::prelude::*; +use anchor_lang::{accounts::account_loader::AccountLoader, prelude::*}; use light_anchor_spl::token::Token; use light_anchor_spl::token_interface::Mint; use light_anchor_spl::token_interface::Token2022; @@ -24,24 +24,17 @@ pub struct CollectProtocolFee<'info> { /// Pool state stores accumulated protocol fee amount #[account(mut)] - pub pool_state: Account<'info, PoolState>, + pub pool_state: AccountLoader<'info, PoolState>, /// Amm config account stores owner - #[account(address = pool_state.amm_config)] pub amm_config: Account<'info, AmmConfig>, /// The address that holds pool tokens for token_0 - #[account( - mut, - constraint = token_0_vault.key() == pool_state.token_0_vault - )] + #[account(mut)] pub token_0_vault: Box>, /// The address that holds pool tokens for token_1 - #[account( - mut, - constraint = token_1_vault.key() == pool_state.token_1_vault - )] + #[account(mut)] pub token_1_vault: Box>, /// The mint of token_0 vault @@ -85,7 +78,24 @@ pub fn collect_protocol_fee( let amount_1: u64; let auth_bump: u8; { - let pool_state = &mut ctx.accounts.pool_state; + let pool_state = &mut ctx.accounts.pool_state.load_mut()?; + + // Validate addresses + require_keys_eq!( + ctx.accounts.amm_config.key(), + pool_state.amm_config, + ErrorCode::InvalidOwner + ); + require_keys_eq!( + ctx.accounts.token_0_vault.key(), + pool_state.token_0_vault, + ErrorCode::InvalidVault + ); + require_keys_eq!( + ctx.accounts.token_1_vault.key(), + pool_state.token_1_vault, + ErrorCode::InvalidVault + ); amount_0 = amount_0_requested.min(pool_state.protocol_fees_token_0); amount_1 = amount_1_requested.min(pool_state.protocol_fees_token_1); diff --git a/programs/cp-swap/src/instructions/admin/update_pool_status.rs b/programs/cp-swap/src/instructions/admin/update_pool_status.rs index d7a20c9..6ff8938 100644 --- a/programs/cp-swap/src/instructions/admin/update_pool_status.rs +++ b/programs/cp-swap/src/instructions/admin/update_pool_status.rs @@ -1,5 +1,5 @@ use crate::states::*; -use anchor_lang::prelude::*; +use anchor_lang::{accounts::account_loader::AccountLoader, prelude::*}; #[derive(Accounts)] pub struct UpdatePoolStatus<'info> { @@ -9,12 +9,12 @@ pub struct UpdatePoolStatus<'info> { pub authority: Signer<'info>, #[account(mut)] - pub pool_state: Account<'info, PoolState>, + pub pool_state: AccountLoader<'info, PoolState>, } pub fn update_pool_status(ctx: Context, status: u8) -> Result<()> { require_gte!(255, status); - let pool_state = &mut ctx.accounts.pool_state; + let pool_state = &mut ctx.accounts.pool_state.load_mut()?; pool_state.set_status(status); pool_state.recent_epoch = Clock::get()?.epoch; Ok(()) diff --git a/programs/cp-swap/src/instructions/deposit.rs b/programs/cp-swap/src/instructions/deposit.rs index 814038b..fcee22a 100644 --- a/programs/cp-swap/src/instructions/deposit.rs +++ b/programs/cp-swap/src/instructions/deposit.rs @@ -3,7 +3,7 @@ use crate::curve::RoundDirection; use crate::error::ErrorCode; use crate::states::*; use crate::utils::token::*; -use anchor_lang::prelude::*; +use anchor_lang::{accounts::account_loader::AccountLoader, prelude::*}; use light_anchor_spl::token::Token; use light_anchor_spl::token_interface::Token2022; use light_token::instruction::MintToCpi; @@ -25,7 +25,7 @@ pub struct Deposit<'info> { pub authority: UncheckedAccount<'info>, #[account(mut)] - pub pool_state: Account<'info, PoolState>, + pub pool_state: AccountLoader<'info, PoolState>, /// Owner lp token account #[account(mut, token::authority = owner)] @@ -48,17 +48,11 @@ pub struct Deposit<'info> { pub token_1_account: Box>, /// The address that holds pool tokens for token_0 - #[account( - mut, - constraint = token_0_vault.key() == pool_state.token_0_vault - )] + #[account(mut)] pub token_0_vault: Box>, /// The address that holds pool tokens for token_1 - #[account( - mut, - constraint = token_1_vault.key() == pool_state.token_1_vault - )] + #[account(mut)] pub token_1_vault: Box>, /// token Program @@ -83,10 +77,7 @@ pub struct Deposit<'info> { pub vault_1_mint: Box>, /// Lp mint - #[account( - mut, - address = pool_state.lp_mint @ ErrorCode::IncorrectLpMint - )] + #[account(mut)] pub lp_mint: Box>, pub system_program: Program<'info, System>, @@ -103,7 +94,25 @@ pub fn deposit( ) -> Result<()> { require_gt!(lp_token_amount, 0); let pool_id = ctx.accounts.pool_state.key(); - let pool_state = &mut ctx.accounts.pool_state; + let pool_state = &mut ctx.accounts.pool_state.load_mut()?; + + // Validate vault and lp_mint addresses + require_keys_eq!( + ctx.accounts.token_0_vault.key(), + pool_state.token_0_vault, + ErrorCode::InvalidVault + ); + require_keys_eq!( + ctx.accounts.token_1_vault.key(), + pool_state.token_1_vault, + ErrorCode::InvalidVault + ); + require_keys_eq!( + ctx.accounts.lp_mint.key(), + pool_state.lp_mint, + ErrorCode::IncorrectLpMint + ); + if !pool_state.get_status_by_bit(PoolStatusBitIndex::Deposit) { return err!(ErrorCode::NotApproved); } @@ -213,6 +222,7 @@ pub fn deposit( authority: ctx.accounts.authority.to_account_info(), system_program: ctx.accounts.system_program.to_account_info(), max_top_up: None, + fee_payer: None, } .invoke_signed(&[&[crate::AUTH_SEED.as_bytes(), &[pool_state.auth_bump]]])?; pool_state.recent_epoch = Clock::get()?.epoch; diff --git a/programs/cp-swap/src/instructions/initialize.rs b/programs/cp-swap/src/instructions/initialize.rs index 111bfbc..852df07 100644 --- a/programs/cp-swap/src/instructions/initialize.rs +++ b/programs/cp-swap/src/instructions/initialize.rs @@ -3,7 +3,7 @@ use crate::error::ErrorCode; use crate::states::*; use crate::utils::*; use anchor_lang::{ - accounts::interface_account::InterfaceAccount, + accounts::{account_loader::AccountLoader, interface_account::InterfaceAccount}, prelude::*, solana_program::{clock, program::invoke, system_instruction}, }; @@ -13,12 +13,11 @@ use light_anchor_spl::{ token::Token, token_interface::{Mint, TokenAccount, TokenInterface}, }; -use light_sdk::interface::CreateAccountsProof; -use light_token::anchor::LightAccounts; +use light_account::{CreateAccountsProof, LightAccounts}; use light_token::{ instruction::{ - CreateTokenAccountCpi, CreateTokenAtaCpi, MintToCpi, COMPRESSIBLE_CONFIG_V1, - RENT_SPONSOR as LIGHT_TOKEN_RENT_SPONSOR, + CreateTokenAccountCpi, CreateTokenAtaCpi, MintToCpi, LIGHT_TOKEN_CONFIG, + LIGHT_TOKEN_RENT_SPONSOR, }, utils::get_token_account_balance, }; @@ -63,8 +62,8 @@ pub struct Initialize<'info> { payer = creator, space = 8 + PoolState::INIT_SPACE )] - #[light_account(init)] - pub pool_state: Box>, + #[light_account(init, zero_copy)] + pub pool_state: AccountLoader<'info, PoolState>, #[account( constraint = token_0_mint.key() < token_1_mint.key(), @@ -82,12 +81,14 @@ pub struct Initialize<'info> { pub lp_mint_signer: UncheckedAccount<'info>, #[account(mut)] - #[light_account(init, mint, - mint_signer = lp_mint_signer, - authority = authority, - decimals = 9, - mint_seeds = &[LP_MINT_SIGNER_SEED, self.pool_state.to_account_info().key.as_ref(), &[params.lp_mint_signer_bump]], - authority_seeds = &[crate::AUTH_SEED.as_bytes(), &[params.authority_bump]] + #[light_account(init, + mint::signer = lp_mint_signer, + mint::authority = authority, + mint::decimals = 9, + mint::seeds = &[LP_MINT_SIGNER_SEED, self.pool_state.to_account_info().key.as_ref()], + mint::bump = params.lp_mint_signer_bump, + mint::authority_seeds = &[crate::AUTH_SEED.as_bytes()], + mint::authority_bump = params.authority_bump )] pub lp_mint: UncheckedAccount<'info>, @@ -117,7 +118,10 @@ pub struct Initialize<'info> { ], bump, )] - #[light_account(token, authority = [crate::AUTH_SEED.as_bytes()])] + #[light_account( + token::seeds = [POOL_VAULT_SEED.as_bytes(), self.pool_state.key().as_ref(), self.token_0_mint.key().as_ref()], + token::owner_seeds = [crate::AUTH_SEED.as_bytes()] + )] pub token_0_vault: UncheckedAccount<'info>, #[account( @@ -129,7 +133,10 @@ pub struct Initialize<'info> { ], bump, )] - #[light_account(token, authority = [crate::AUTH_SEED.as_bytes()])] + #[light_account( + token::seeds = [POOL_VAULT_SEED.as_bytes(), self.pool_state.key().as_ref(), self.token_1_mint.key().as_ref()], + token::owner_seeds = [crate::AUTH_SEED.as_bytes()] + )] pub token_1_vault: UncheckedAccount<'info>, #[account( @@ -154,8 +161,12 @@ pub struct Initialize<'info> { pub compression_config: AccountInfo<'info>, - #[account(address = COMPRESSIBLE_CONFIG_V1)] - pub light_token_compressible_config: AccountInfo<'info>, + #[account(address = LIGHT_TOKEN_CONFIG)] + pub light_token_config: AccountInfo<'info>, + + /// CHECK: PDA rent sponsor for reimbursement + #[account(mut)] + pub pda_rent_sponsor: AccountInfo<'info>, #[account(mut, address = LIGHT_TOKEN_RENT_SPONSOR)] pub light_token_rent_sponsor: AccountInfo<'info>, @@ -199,7 +210,7 @@ pub fn initialize<'info>( owner: ctx.accounts.authority.key(), } .rent_free( - ctx.accounts.light_token_compressible_config.to_account_info(), + ctx.accounts.light_token_config.to_account_info(), ctx.accounts.light_token_rent_sponsor.to_account_info(), ctx.accounts.system_program.to_account_info(), &crate::ID, @@ -219,7 +230,7 @@ pub fn initialize<'info>( owner: ctx.accounts.authority.key(), } .rent_free( - ctx.accounts.light_token_compressible_config.to_account_info(), + ctx.accounts.light_token_config.to_account_info(), ctx.accounts.light_token_rent_sponsor.to_account_info(), ctx.accounts.system_program.to_account_info(), &crate::ID, @@ -303,7 +314,7 @@ pub fn initialize<'info>( .checked_sub(lock_lp_amount) .ok_or(ErrorCode::InitLpAmountTooLess)?; - let pool_state = &mut ctx.accounts.pool_state; + let pool_state = &mut ctx.accounts.pool_state.load_init()?; let observation_state = &mut ctx.accounts.observation_state; let observation_state_key = observation_state.key(); observation_state.pool_id = pool_state_key; @@ -332,7 +343,7 @@ pub fn initialize<'info>( } .idempotent() .rent_free( - ctx.accounts.light_token_compressible_config.to_account_info(), + ctx.accounts.light_token_config.to_account_info(), ctx.accounts.light_token_rent_sponsor.to_account_info(), ctx.accounts.system_program.to_account_info(), ) @@ -346,6 +357,7 @@ pub fn initialize<'info>( authority: ctx.accounts.authority.to_account_info(), system_program: ctx.accounts.system_program.to_account_info(), max_top_up: None, + fee_payer: None, } .invoke_signed(&[&[crate::AUTH_SEED.as_bytes(), &[ctx.bumps.authority]]])?; diff --git a/programs/cp-swap/src/instructions/swap_base_input.rs b/programs/cp-swap/src/instructions/swap_base_input.rs index 1c686a0..590b1d6 100644 --- a/programs/cp-swap/src/instructions/swap_base_input.rs +++ b/programs/cp-swap/src/instructions/swap_base_input.rs @@ -3,7 +3,7 @@ use crate::curve::TradeDirection; use crate::error::ErrorCode; use crate::states::*; use crate::utils::token::*; -use anchor_lang::prelude::*; +use anchor_lang::{accounts::account_loader::AccountLoader, prelude::*}; use anchor_lang::solana_program; use light_anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; @@ -22,12 +22,11 @@ pub struct Swap<'info> { pub authority: UncheckedAccount<'info>, /// The factory state to read protocol fees - #[account(address = pool_state.amm_config)] pub amm_config: Box>, /// The program account of the pool in which the swap will be performed #[account(mut)] - pub pool_state: Box>, + pub pool_state: AccountLoader<'info, PoolState>, /// The user token account for input token #[account(mut)] @@ -38,17 +37,11 @@ pub struct Swap<'info> { pub output_token_account: Box>, /// The vault token account for input token - #[account( - mut, - constraint = input_vault.key() == pool_state.token_0_vault || input_vault.key() == pool_state.token_1_vault - )] + #[account(mut)] pub input_vault: Box>, /// The vault token account for output token - #[account( - mut, - constraint = output_vault.key() == pool_state.token_0_vault || output_vault.key() == pool_state.token_1_vault - )] + #[account(mut)] pub output_vault: Box>, /// SPL program for input token transfers @@ -69,7 +62,7 @@ pub struct Swap<'info> { )] pub output_token_mint: Box>, /// The program account for the most recent oracle observation - #[account(mut, address = pool_state.observation_key)] + #[account(mut)] pub observation_state: Account<'info, ObservationState>, /// Light Token program for CPI @@ -84,7 +77,22 @@ pub struct Swap<'info> { pub fn swap_base_input(ctx: Context, amount_in: u64, minimum_amount_out: u64) -> Result<()> { let block_timestamp = solana_program::clock::Clock::get()?.unix_timestamp as u64; let pool_id = ctx.accounts.pool_state.key(); - let pool_state = &mut ctx.accounts.pool_state; + let pool_state = &mut ctx.accounts.pool_state.load_mut()?; + + // Validate amm_config matches pool_state + require_keys_eq!( + ctx.accounts.amm_config.key(), + pool_state.amm_config, + ErrorCode::InvalidOwner + ); + + // Validate observation_state matches pool_state + require_keys_eq!( + ctx.accounts.observation_state.key(), + pool_state.observation_key, + ErrorCode::InvalidOwner + ); + if !pool_state.get_status_by_bit(PoolStatusBitIndex::Swap) || block_timestamp < pool_state.open_time { diff --git a/programs/cp-swap/src/instructions/swap_base_output.rs b/programs/cp-swap/src/instructions/swap_base_output.rs index 853e460..929075d 100644 --- a/programs/cp-swap/src/instructions/swap_base_output.rs +++ b/programs/cp-swap/src/instructions/swap_base_output.rs @@ -14,7 +14,22 @@ pub fn swap_base_output( require_gt!(amount_out_less_fee, 0); let block_timestamp = solana_program::clock::Clock::get()?.unix_timestamp as u64; let pool_id = ctx.accounts.pool_state.key(); - let pool_state = &mut ctx.accounts.pool_state; + let pool_state = &mut ctx.accounts.pool_state.load_mut()?; + + // Validate amm_config matches pool_state + require_keys_eq!( + ctx.accounts.amm_config.key(), + pool_state.amm_config, + ErrorCode::InvalidOwner + ); + + // Validate observation_state matches pool_state + require_keys_eq!( + ctx.accounts.observation_state.key(), + pool_state.observation_key, + ErrorCode::InvalidOwner + ); + if !pool_state.get_status_by_bit(PoolStatusBitIndex::Swap) || block_timestamp < pool_state.open_time { diff --git a/programs/cp-swap/src/instructions/withdraw.rs b/programs/cp-swap/src/instructions/withdraw.rs index 484d08b..dab6e31 100644 --- a/programs/cp-swap/src/instructions/withdraw.rs +++ b/programs/cp-swap/src/instructions/withdraw.rs @@ -3,7 +3,7 @@ use crate::curve::RoundDirection; use crate::error::ErrorCode; use crate::states::*; use crate::utils::token::*; -use anchor_lang::prelude::*; +use anchor_lang::{accounts::account_loader::AccountLoader, prelude::*}; use light_anchor_spl::{ memo::spl_memo, token::Token, @@ -27,7 +27,7 @@ pub struct Withdraw<'info> { /// Pool state account #[account(mut)] - pub pool_state: Box>, + pub pool_state: AccountLoader<'info, PoolState>, #[account( mut, @@ -50,17 +50,11 @@ pub struct Withdraw<'info> { pub token_1_account: Box>, /// The address that holds pool tokens for token_0 - #[account( - mut, - constraint = token_0_vault.key() == pool_state.token_0_vault - )] + #[account(mut)] pub token_0_vault: Box>, /// The address that holds pool tokens for token_1 - #[account( - mut, - constraint = token_1_vault.key() == pool_state.token_1_vault - )] + #[account(mut)] pub token_1_vault: Box>, /// token Program @@ -82,10 +76,7 @@ pub struct Withdraw<'info> { pub vault_1_mint: Box>, /// Lp mint - #[account( - mut, - address = pool_state.lp_mint @ ErrorCode::IncorrectLpMint - )] + #[account(mut)] pub lp_mint: Box>, /// memo program @@ -112,7 +103,25 @@ pub fn withdraw( ) -> Result<()> { require_gt!(lp_token_amount, 0); let pool_id = ctx.accounts.pool_state.key(); - let pool_state = &mut ctx.accounts.pool_state; + let pool_state = &mut ctx.accounts.pool_state.load_mut()?; + + // Validate vault and lp_mint addresses + require_keys_eq!( + ctx.accounts.token_0_vault.key(), + pool_state.token_0_vault, + ErrorCode::InvalidVault + ); + require_keys_eq!( + ctx.accounts.token_1_vault.key(), + pool_state.token_1_vault, + ErrorCode::InvalidVault + ); + require_keys_eq!( + ctx.accounts.lp_mint.key(), + pool_state.lp_mint, + ErrorCode::IncorrectLpMint + ); + if !pool_state.get_status_by_bit(PoolStatusBitIndex::Withdraw) { return err!(ErrorCode::NotApproved); } @@ -187,7 +196,9 @@ pub fn withdraw( mint: ctx.accounts.lp_mint.to_account_info(), amount: lp_token_amount, authority: ctx.accounts.owner.to_account_info(), + system_program: ctx.accounts.system_program.to_account_info(), max_top_up: None, + fee_payer: None, } .invoke()?; diff --git a/programs/cp-swap/src/lib.rs b/programs/cp-swap/src/lib.rs index 2d80571..b3d1f85 100644 --- a/programs/cp-swap/src/lib.rs +++ b/programs/cp-swap/src/lib.rs @@ -14,9 +14,7 @@ pub use crate::states::{ }; use anchor_lang::prelude::*; use instructions::*; -use light_token::anchor::{ - derive_light_cpi_signer, derive_light_rent_sponsor_pda, light_program, CpiSigner, -}; +use light_account::{derive_light_cpi_signer, derive_light_rent_sponsor_pda, light_program, CpiSigner}; #[cfg(not(feature = "no-entrypoint"))] solana_security_txt::security_txt! { diff --git a/programs/cp-swap/src/states/oracle.rs b/programs/cp-swap/src/states/oracle.rs index 2b4e798..e521213 100644 --- a/programs/cp-swap/src/states/oracle.rs +++ b/programs/cp-swap/src/states/oracle.rs @@ -1,6 +1,5 @@ use anchor_lang::prelude::*; -use light_sdk::LightDiscriminator; -use light_token::anchor::{CompressionInfo, LightAccount}; +use light_account::{CompressionInfo, LightAccount, LightDiscriminator}; #[cfg(test)] use std::time::{SystemTime, UNIX_EPOCH}; @@ -19,7 +18,7 @@ pub struct Observation { #[derive(Default, Debug, InitSpace, LightAccount)] #[account] pub struct ObservationState { - pub compression_info: Option, + pub compression_info: CompressionInfo, pub initialized: bool, pub observation_index: u16, pub pool_id: Pubkey, diff --git a/programs/cp-swap/src/states/pool.rs b/programs/cp-swap/src/states/pool.rs index b23db7b..68c457f 100644 --- a/programs/cp-swap/src/states/pool.rs +++ b/programs/cp-swap/src/states/pool.rs @@ -1,7 +1,6 @@ use anchor_lang::prelude::*; use light_anchor_spl::token_interface::Mint; -use light_sdk::LightDiscriminator; -use light_token::anchor::{CompressionInfo, LightAccount}; +use light_account::{CompressionInfo, LightAccount, LightDiscriminator}; use std::ops::{BitAnd, BitOr, BitXor}; pub const POOL_SEED: &str = "pool"; @@ -23,10 +22,10 @@ pub enum PoolStatusBitFlag { } #[derive(Default, Debug, InitSpace, LightAccount)] -#[account] +#[account(zero_copy)] #[repr(C)] pub struct PoolState { - pub compression_info: Option, + pub compression_info: CompressionInfo, pub amm_config: Pubkey, pub pool_creator: Pubkey, pub token_0_vault: Pubkey, @@ -42,6 +41,7 @@ pub struct PoolState { pub lp_mint_decimals: u8, pub mint_0_decimals: u8, pub mint_1_decimals: u8, + pub _padding0: [u8; 3], pub lp_supply: u64, pub protocol_fees_token_0: u64, pub protocol_fees_token_1: u64, @@ -81,6 +81,7 @@ impl PoolState { self.lp_mint_decimals = 9; self.mint_0_decimals = token_0_mint.decimals; self.mint_1_decimals = token_1_mint.decimals; + self._padding0 = [0u8; 3]; self.lp_supply = lp_supply; self.protocol_fees_token_0 = 0; self.protocol_fees_token_1 = 0; diff --git a/programs/cp-swap/tests/helpers.rs b/programs/cp-swap/tests/helpers.rs index b0e4b32..ebe2622 100644 --- a/programs/cp-swap/tests/helpers.rs +++ b/programs/cp-swap/tests/helpers.rs @@ -2,46 +2,44 @@ /// Functional integration test for cp-swap program. /// Tests pool initialization with light-program-test framework. - use anchor_lang::{InstructionData, ToAccountMetas}; +use light_anchor_spl::memo::spl_memo; use light_client::interface::{ get_create_accounts_proof, CreateAccountsProofInput, CreateAccountsProofResult, InitializeRentFreeConfig, }; -use solana_pubkey::pubkey; use light_program_test::{ program_test::{setup_mock_program_data, LightProgramTest, TestRpc}, Indexer, ProgramTestConfig, Rpc, }; use light_token::{ constants::CPI_AUTHORITY_PDA, + constants::LIGHT_TOKEN_PROGRAM_ID, instruction::{ find_mint_address, get_associated_token_address_and_bump, CreateAssociatedTokenAccount, - CreateMint, CreateMintParams, MintTo, COMPRESSIBLE_CONFIG_V1, - RENT_SPONSOR as LIGHT_TOKEN_RENT_SPONSOR, + CreateMint, CreateMintParams, MintTo, LIGHT_TOKEN_CONFIG, LIGHT_TOKEN_RENT_SPONSOR, }, - constants::LIGHT_TOKEN_PROGRAM_ID, }; use raydium_cp_swap::{ instructions::initialize::LP_MINT_SIGNER_SEED, + program_rent_sponsor, states::{AMM_CONFIG_SEED, OBSERVATION_SEED, POOL_SEED, POOL_VAULT_SEED}, InitializeParams, AUTH_SEED, }; use solana_instruction::Instruction; use solana_keypair::Keypair; use solana_pubkey::Pubkey; -use solana_signer::Signer; use solana_sdk::{program_pack::Pack, signature::SeedDerivable}; -use light_anchor_spl::memo::spl_memo; +use solana_signer::Signer; use spl_token_2022; - - // ============================================================================ // Constants // ============================================================================ -const RENT_SPONSOR: Pubkey = pubkey!("CLEuMG7pzJX9xAuKCFzBP154uiG1GaNo4Fq7x6KAcAfG"); +fn rent_sponsor() -> Pubkey { + program_rent_sponsor() +} pub fn light_token_program_id() -> Pubkey { Pubkey::from(LIGHT_TOKEN_PROGRAM_ID) @@ -88,8 +86,7 @@ pub struct TokenSetup { /// Initialize the test environment with LightProgramTest and compression config. pub async fn setup_test_environment(program_id: Pubkey) -> TestEnv { - let mut config = - ProgramTestConfig::new_v2(true, Some(vec![("raydium_cp_swap", program_id)])); + let mut config = ProgramTestConfig::new_v2(true, Some(vec![("raydium_cp_swap", program_id)])); config = config.with_light_protocol_events(); let mut rpc = LightProgramTest::new(config).await.unwrap(); @@ -101,7 +98,7 @@ pub async fn setup_test_environment(program_id: Pubkey) -> TestEnv { &program_id, &payer.pubkey(), &program_data_pda, - RENT_SPONSOR, + rent_sponsor(), payer.pubkey(), ) .build(); @@ -110,6 +107,11 @@ pub async fn setup_test_environment(program_id: Pubkey) -> TestEnv { .await .expect("Initialize config should succeed"); + // Fund the rent sponsor PDA so it can pay for rent reimbursements + rpc.airdrop_lamports(&rent_sponsor(), 1_000_000_000) + .await + .expect("Airdrop to rent sponsor should succeed"); + TestEnv { rpc, payer, @@ -202,6 +204,7 @@ pub async fn setup_create_mint( amount: *amount, authority: mint_authority, max_top_up: None, + fee_payer: None, } .instruction() .unwrap(); @@ -632,7 +635,8 @@ pub fn build_initialize_instruction( system_program: solana_sdk::system_program::ID, rent: solana_sdk::sysvar::rent::ID, compression_config: config_pda, - light_token_compressible_config: Pubkey::from(COMPRESSIBLE_CONFIG_V1), + light_token_config: Pubkey::from(LIGHT_TOKEN_CONFIG), + pda_rent_sponsor: raydium_cp_swap::program_rent_sponsor(), light_token_rent_sponsor: Pubkey::from(LIGHT_TOKEN_RENT_SPONSOR), light_token_program: light_token_program_id(), light_token_cpi_authority: CPI_AUTHORITY_PDA, @@ -696,7 +700,11 @@ pub async fn assert_onchain_closed(rpc: &mut LightProgramTest, pda: &Pubkey) { } /// Assert all pool accounts exist on-chain (hot or decompressed state). -pub async fn assert_pool_accounts_exist(rpc: &mut LightProgramTest, pdas: &AmmPdas, tokens: &TokenSetup) { +pub async fn assert_pool_accounts_exist( + rpc: &mut LightProgramTest, + pdas: &AmmPdas, + tokens: &TokenSetup, +) { assert_onchain_exists(rpc, &pdas.pool_state).await; assert_onchain_exists(rpc, &pdas.observation_state).await; assert_onchain_exists(rpc, &pdas.lp_mint).await; @@ -708,7 +716,11 @@ pub async fn assert_pool_accounts_exist(rpc: &mut LightProgramTest, pdas: &AmmPd } /// Assert all pool accounts are compressed (closed on-chain). -pub async fn assert_pool_accounts_compressed(rpc: &mut LightProgramTest, pdas: &AmmPdas, tokens: &TokenSetup) { +pub async fn assert_pool_accounts_compressed( + rpc: &mut LightProgramTest, + pdas: &AmmPdas, + tokens: &TokenSetup, +) { assert_onchain_closed(rpc, &pdas.pool_state).await; assert_onchain_closed(rpc, &pdas.observation_state).await; assert_onchain_closed(rpc, &pdas.lp_mint).await; @@ -834,9 +846,17 @@ pub async fn setup_pool_environment(program_id: Pubkey, amm_config_index: u16) - .unwrap(); let initial_balance = 1_000_000; - let tokens = setup_token_mints(&mut env.rpc, &env.payer, &creator.pubkey(), initial_balance).await; + let tokens = + setup_token_mints(&mut env.rpc, &env.payer, &creator.pubkey(), initial_balance).await; - let amm_config = create_amm_config(&mut env.rpc, &env.payer, &admin, program_id, amm_config_index).await; + let amm_config = create_amm_config( + &mut env.rpc, + &env.payer, + &admin, + program_id, + amm_config_index, + ) + .await; setup_create_pool_fee_account(&mut env.rpc, &env.payer.pubkey()); let pdas = derive_amm_pdas( diff --git a/programs/cp-swap/tests/program.rs b/programs/cp-swap/tests/program.rs index 3af4711..5f7fe58 100644 --- a/programs/cp-swap/tests/program.rs +++ b/programs/cp-swap/tests/program.rs @@ -6,17 +6,17 @@ /// - Parsing pool accounts from AccountInterface /// - Tracking account state (hot/cold) /// - Building AccountSpec for load instructions - use anchor_lang::AnchorDeserialize; use light_client::interface::{ AccountInterface, AccountSpec, AccountToFetch, ColdContext, LightProgramInterface, PdaSpec, TokenAccountInterface, }; -use light_sdk::LightDiscriminator; -use light_token::compat::{CTokenData, TokenData}; +use light_account::token::{Token, TokenDataWithSeeds}; +use light_account::LightDiscriminator; use raydium_cp_swap::instructions::initialize::LP_MINT_SIGNER_SEED; +use raydium_cp_swap::raydium_cp_swap::{LightAccountVariant, Token0VaultSeeds, Token1VaultSeeds}; +use raydium_cp_swap::raydium_cp_swap::{ObservationStateSeeds, PoolStateSeeds}; use raydium_cp_swap::{ - raydium_cp_swap::{LightAccountVariant, TokenAccountVariant}, states::{ObservationState, PoolState}, AUTH_SEED, }; @@ -144,10 +144,12 @@ impl CpSwapSdk { // Create PdaSpec with variant let variant = LightAccountVariant::PoolState { + seeds: PoolStateSeeds { + amm_config: pool_state.amm_config, + token_0_mint: pool_state.token_0_mint, + token_1_mint: pool_state.token_1_mint, + }, data: pool_state.clone(), - amm_config: pool_state.amm_config, - token_0_mint: pool_state.token_0_mint, - token_1_mint: pool_state.token_1_mint, }; let spec = PdaSpec::new(interface, variant, PROGRAM_ID); self.pda_specs.insert(pool_pubkey, spec); @@ -156,7 +158,10 @@ impl CpSwapSdk { } /// Parse observation state from AccountInterface. - fn parse_observation_state(&mut self, interface: AccountInterface) -> Result<(), CpSwapSdkError> { + fn parse_observation_state( + &mut self, + interface: AccountInterface, + ) -> Result<(), CpSwapSdkError> { let pool_state = self .pool_state_pubkey .ok_or(CpSwapSdkError::PoolStateNotParsed)?; @@ -173,8 +178,8 @@ impl CpSwapSdk { .map_err(|e| CpSwapSdkError::ParseError(e.to_string()))?; let variant = LightAccountVariant::ObservationState { + seeds: ObservationStateSeeds { pool_state }, data: obs_state, - pool_state, }; let spec = PdaSpec::new(interface, variant, PROGRAM_ID); self.pda_specs.insert(obs_pubkey, spec); @@ -182,72 +187,60 @@ impl CpSwapSdk { Ok(()) } - /// Store token vault interface. - /// Vaults are program-owned PDAs, so we convert them to PdaSpec with CTokenData variant. - pub fn set_token_vault(&mut self, interface: TokenAccountInterface, is_vault_0: bool) { + /// Store token vault interface and create PdaSpec with token vault variant. + pub fn set_token_vault( + &mut self, + interface: TokenAccountInterface, + is_vault_0: bool, + ) -> Result<(), CpSwapSdkError> { + let pool_state = self + .pool_state_pubkey + .ok_or(CpSwapSdkError::PoolStateNotParsed)?; + let key = interface.key; - let pool_state = self.pool_state_pubkey.expect("pool_state must be set before vaults"); - let mint = if is_vault_0 { - self.token_0_mint.expect("token_0_mint must be set") + if is_vault_0 { + self.token_0_vault = Some(key); } else { - self.token_1_mint.expect("token_1_mint must be set") - }; + self.token_1_vault = Some(key); + } - // Build TokenData from TokenAccountInterface - let token_data = TokenData { - mint: interface.mint(), - owner: interface.owner(), - amount: interface.amount(), - delegate: if interface.parsed.delegate.option == [1, 0, 0, 0] { - Some(Pubkey::from(interface.parsed.delegate.value)) - } else { - None - }, - state: light_token::compat::AccountState::Initialized, - tlv: None, - }; + let token: Token = Token::deserialize(&mut &interface.account.data[..]) + .map_err(|e| CpSwapSdkError::ParseError(e.to_string()))?; - // Build variant based on which vault this is let variant = if is_vault_0 { - LightAccountVariant::CTokenData(CTokenData { - variant: TokenAccountVariant::Token0Vault { + let token_0_mint = self + .token_0_mint + .ok_or(CpSwapSdkError::MissingField("token_0_mint"))?; + LightAccountVariant::Token0Vault(TokenDataWithSeeds { + seeds: Token0VaultSeeds { pool_state, - token_0_mint: mint, + token_0_mint, }, - token_data, + token_data: token, }) } else { - LightAccountVariant::CTokenData(CTokenData { - variant: TokenAccountVariant::Token1Vault { + let token_1_mint = self + .token_1_mint + .ok_or(CpSwapSdkError::MissingField("token_1_mint"))?; + LightAccountVariant::Token1Vault(TokenDataWithSeeds { + seeds: Token1VaultSeeds { pool_state, - token_1_mint: mint, + token_1_mint, }, - token_data, + token_data: token, }) }; - // Convert TokenAccountInterface to AccountInterface for PdaSpec - // For cold vaults, we need to convert ColdContext::Token to ColdContext::Account - let cold = if let Some(ColdContext::Token(ct)) = &interface.cold { - Some(ColdContext::Account(ct.account.clone())) - } else { - None - }; - let account_interface = AccountInterface { - key, - account: interface.account.clone(), - cold, + key: interface.key, + account: interface.account, + cold: interface.cold, }; let spec = PdaSpec::new(account_interface, variant, PROGRAM_ID); - self.pda_specs.insert(key, spec); - if is_vault_0 { - self.token_0_vault = Some(key); - } else { - self.token_1_vault = Some(key); - } + + Ok(()) } /// Store LP mint interface. @@ -267,32 +260,30 @@ impl CpSwapSdk { .pool_state_pubkey .ok_or(CpSwapSdkError::PoolStateNotParsed)?; - // Deserialize token data properly - let token_data = TokenData::deserialize(&mut &account.data()[..]) + let token: Token = Token::deserialize(&mut &account.data()[..]) .map_err(|e| CpSwapSdkError::ParseError(e.to_string()))?; - // Build variant based on which vault this is let variant = if is_vault_0 { let token_0_mint = self .token_0_mint .ok_or(CpSwapSdkError::MissingField("token_0_mint"))?; - LightAccountVariant::CTokenData(CTokenData { - variant: TokenAccountVariant::Token0Vault { + LightAccountVariant::Token0Vault(TokenDataWithSeeds { + seeds: Token0VaultSeeds { pool_state, token_0_mint, }, - token_data, + token_data: token, }) } else { let token_1_mint = self .token_1_mint .ok_or(CpSwapSdkError::MissingField("token_1_mint"))?; - LightAccountVariant::CTokenData(CTokenData { - variant: TokenAccountVariant::Token1Vault { + LightAccountVariant::Token1Vault(TokenDataWithSeeds { + seeds: Token1VaultSeeds { pool_state, token_1_mint, }, - token_data, + token_data: token, }) }; @@ -313,6 +304,7 @@ impl CpSwapSdk { account.clone() }; + // Decompression goes to PROGRAM_ID (cp-swap), not interface.account.owner (SPL/Light Token) let spec = PdaSpec::new(interface, variant, PROGRAM_ID); self.pda_specs.insert(account.key, spec); diff --git a/programs/cp-swap/tests/program_test.rs b/programs/cp-swap/tests/program_test.rs index 78a5fda..eb4cfc5 100644 --- a/programs/cp-swap/tests/program_test.rs +++ b/programs/cp-swap/tests/program_test.rs @@ -1,6 +1,5 @@ /// Clean integration test for cp-swap using CpSwapSdk. /// Tests the full lifecycle: Initialize -> Warp -> Compress -> Load -> Execute Operations - use light_client::interface::{ create_load_instructions, AccountInterfaceExt, AccountSpec, LightProgramInterface, }; @@ -19,7 +18,12 @@ use program::{CpSwapInstruction, CpSwapSdk}; fn log_transaction_size(name: &str, ixs: &[Instruction]) { let tx = Transaction::new_with_payer(ixs, None); let serialized = bincode::serialize(&tx).expect("Failed to serialize transaction"); - println!("{}: {} bytes ({} instructions)", name, serialized.len(), ixs.len()); + println!( + "{}: {} bytes ({} instructions)", + name, + serialized.len(), + ixs.len() + ); } #[tokio::test] @@ -55,12 +59,7 @@ async fn test_sdk_lifecycle() { assert_pool_accounts_exist(&mut setup.env.rpc, &setup.pdas, &setup.tokens).await; // ==================== PHASE 3: Warp to Trigger Compression ==================== - setup - .env - .rpc - .warp_epoch_forward(30) - .await - .unwrap(); + setup.env.rpc.warp_epoch_forward(30).await.unwrap(); // ==================== PHASE 4: Assert All Accounts Are Compressed ==================== assert_pool_accounts_compressed(&mut setup.env.rpc, &setup.pdas, &setup.tokens).await; @@ -125,7 +124,6 @@ async fn test_sdk_lifecycle() { &all_specs, setup.env.payer.pubkey(), setup.env.config_pda, - setup.env.payer.pubkey(), &setup.env.rpc, ) .await