From 2a10bab4bb832af8ae201fcfc58a3b64a93c1f61 Mon Sep 17 00:00:00 2001 From: Sarfaraz Nawaz Date: Fri, 20 Feb 2026 09:37:54 +0530 Subject: [PATCH 1/2] feat: Add ScheduleCommitFinalize along with CommitFinalizeTask --- Cargo.lock | 159 +++++----- Cargo.toml | 2 +- .../src/intent_executor/mod.rs | 3 + .../src/persist/commit_persister.rs | 14 + .../src/tasks/args_task.rs | 61 +++- .../src/tasks/buffer_task.rs | 70 ++++- magicblock-committor-service/src/tasks/mod.rs | 9 + .../src/tasks/task_builder.rs | 144 ++++++--- .../tasks/task_visitors/persistor_visitor.rs | 10 + .../tasks/task_visitors/utility_visitor.rs | 14 + magicblock-committor-service/src/types.rs | 42 +++ magicblock-validator/src/main.rs | 1 + .../src/magic_scheduled_base_intent.rs | 183 +++++++++++- .../magicblock/src/magicblock_processor.rs | 13 +- .../src/schedule_transactions/mod.rs | 2 + .../process_schedule_commit_finalize.rs | 281 ++++++++++++++++++ test-integration/Cargo.lock | 199 +++++++------ test-integration/Cargo.toml | 2 +- .../schedulecommit-security/src/lib.rs | 5 +- .../programs/schedulecommit/src/api.rs | 40 +-- .../programs/schedulecommit/src/lib.rs | 86 ++++-- test-integration/schedulecommit/elfs/dlp.so | Bin 348792 -> 374312 bytes .../test-scenarios/tests/01_commits.rs | 14 +- .../tests/02_commit_and_undelegate.rs | 64 +++- .../test-scenarios/tests/utils/mod.rs | 39 +++ .../test-security/tests/01_invocations.rs | 6 +- .../tests/test_ix_commit_local.rs | 227 +++++++++++--- .../tests/utils/transactions.rs | 4 +- 28 files changed, 1360 insertions(+), 334 deletions(-) create mode 100644 magicblock-committor-service/src/types.rs create mode 100644 programs/magicblock/src/schedule_transactions/process_schedule_commit_finalize.rs diff --git a/Cargo.lock b/Cargo.lock index 53c5b37cf..9d576d96e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2937,7 +2937,7 @@ dependencies = [ "magicblock-rpc-client", "rand 0.9.2", "solana-account", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-loader-v3-interface", "solana-loader-v4-interface", @@ -2963,7 +2963,7 @@ dependencies = [ "magicblock-committor-service", "magicblock-core", "magicblock-program", - "solana-hash", + "solana-hash 2.2.1", "solana-pubkey", "solana-transaction", "solana-transaction-error", @@ -3076,7 +3076,7 @@ dependencies = [ "solana-feature-set", "solana-fee-calculator", "solana-genesis-config", - "solana-hash", + "solana-hash 2.2.1", "solana-inline-spl", "solana-instruction", "solana-keypair", @@ -3086,7 +3086,7 @@ dependencies = [ "solana-pubkey", "solana-rent", "solana-rpc-client", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-signature", "solana-signer", "solana-system-program", @@ -3126,7 +3126,7 @@ dependencies = [ "solana-clock", "solana-commitment-config", "solana-feature-set", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-loader-v3-interface", @@ -3192,7 +3192,7 @@ dependencies = [ "solana-address-lookup-table-interface", "solana-commitment-config", "solana-compute-budget-interface", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-message", @@ -3245,7 +3245,7 @@ dependencies = [ "magicblock-magic-program-api", "solana-account", "solana-account-decoder", - "solana-hash", + "solana-hash 2.2.1", "solana-program", "solana-pubkey", "solana-signature", @@ -3264,7 +3264,7 @@ dependencies = [ [[package]] name = "magicblock-delegation-program" version = "1.1.3" -source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372#2cb491032f372faa4cfdb55e3f05cefd7e07351d" +source = "git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer#1347f31982a57762bd9321c91a021a3d32bebe05" dependencies = [ "bincode", "borsh 1.6.0", @@ -3279,6 +3279,7 @@ dependencies = [ "solana-curve25519", "solana-program", "solana-security-txt", + "solana-sha256-hasher 3.1.0", "static_assertions", "strum 0.27.2", "thiserror 2.0.17", @@ -3304,7 +3305,7 @@ dependencies = [ "serde", "solana-account-decoder", "solana-clock", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-measure", @@ -3411,7 +3412,7 @@ dependencies = [ "solana-account-info", "solana-clock", "solana-fee-calculator", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-log-collector", @@ -3437,7 +3438,7 @@ dependencies = [ "solana-address-lookup-table-interface", "solana-clock", "solana-commitment-config", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-pubkey", "solana-rpc-client", @@ -4351,7 +4352,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", - "heck 0.5.0", + "heck 0.4.1", "itertools 0.12.1", "log", "multimap", @@ -4371,7 +4372,7 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ - "heck 0.5.0", + "heck 0.4.1", "itertools 0.14.0", "log", "multimap", @@ -5641,7 +5642,7 @@ checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" dependencies = [ "num-bigint 0.4.6", "num-traits", - "solana-define-syscall", + "solana-define-syscall 2.2.1", ] [[package]] @@ -5662,8 +5663,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a0801e25a1b31a14494fc80882a036be0ffd290efc4c2d640bfcca120a4672" dependencies = [ "blake3", - "solana-define-syscall", - "solana-hash", + "solana-define-syscall 2.2.1", + "solana-hash 2.2.1", "solana-sanitize", ] @@ -5678,7 +5679,7 @@ dependencies = [ "ark-ff", "ark-serialize", "bytemuck", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "thiserror 2.0.17", ] @@ -5713,7 +5714,7 @@ dependencies = [ "solana-cpi", "solana-curve25519", "solana-feature-set", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keccak-hasher", "solana-loader-v3-interface", @@ -5730,7 +5731,7 @@ dependencies = [ "solana-sbpf", "solana-sdk-ids", "solana-secp256k1-recover", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-stable-layout", "solana-system-interface", "solana-sysvar", @@ -5773,7 +5774,7 @@ dependencies = [ "solana-account", "solana-commitment-config", "solana-epoch-info", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-message", @@ -5806,7 +5807,7 @@ checksum = "7ace9fea2daa28354d107ea879cff107181d85cd4e0f78a2bedb10e1a428c97e" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 2.2.1", ] [[package]] @@ -5904,7 +5905,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11" dependencies = [ "solana-account-info", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "solana-instruction", "solana-program-error", "solana-pubkey", @@ -5920,7 +5921,7 @@ dependencies = [ "bytemuck", "bytemuck_derive", "curve25519-dalek 4.1.3", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "subtle", "thiserror 2.0.17", ] @@ -5940,6 +5941,12 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf784bb2cb3e02cac9801813c30187344228d2ae952534902108f6150573a33d" +[[package]] +name = "solana-define-syscall" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e5b1c0bc1d4a4d10c88a4100499d954c09d3fecfae4912c1a074dff68b1738" + [[package]] name = "solana-derivation-path" version = "2.2.1" @@ -5984,7 +5991,7 @@ checksum = "86b575d3dd323b9ea10bb6fe89bf6bf93e249b215ba8ed7f68f1a3633f384db7" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 2.2.1", "solana-sdk-ids", "solana-sdk-macro", "solana-sysvar-id", @@ -5997,7 +6004,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c5fd2662ae7574810904585fd443545ed2b568dbd304b25a31e79ccc76e81b" dependencies = [ "siphasher", - "solana-hash", + "solana-hash 2.2.1", "solana-pubkey", ] @@ -6024,7 +6031,7 @@ dependencies = [ "serde_derive", "solana-address-lookup-table-interface", "solana-clock", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keccak-hasher", "solana-message", @@ -6063,9 +6070,9 @@ dependencies = [ "ahash 0.8.12", "lazy_static", "solana-epoch-schedule", - "solana-hash", + "solana-hash 2.2.1", "solana-pubkey", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", ] [[package]] @@ -6129,7 +6136,7 @@ dependencies = [ "solana-cluster-type", "solana-epoch-schedule", "solana-fee-calculator", - "solana-hash", + "solana-hash 2.2.1", "solana-inflation", "solana-keypair", "solana-logger", @@ -6138,7 +6145,7 @@ dependencies = [ "solana-pubkey", "solana-rent", "solana-sdk-ids", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-shred-version", "solana-signer", "solana-time-utils", @@ -6172,6 +6179,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "solana-hash" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a5d48a6ee7b91fc7b998944ab026ed7b3e2fc8ee3bc58452644a86c2648152f" + [[package]] name = "solana-inflation" version = "2.2.1" @@ -6205,7 +6218,7 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "solana-pubkey", "wasm-bindgen", ] @@ -6234,8 +6247,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" dependencies = [ "sha3", - "solana-define-syscall", - "solana-hash", + "solana-define-syscall 2.2.1", + "solana-hash 2.2.1", "solana-sanitize", ] @@ -6381,7 +6394,7 @@ dependencies = [ "serde", "serde_derive", "solana-bincode", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-pubkey", "solana-sanitize", @@ -6405,7 +6418,7 @@ dependencies = [ "reqwest", "solana-clock", "solana-cluster-type", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-time-utils", "thiserror 2.0.17", ] @@ -6416,7 +6429,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36a1a14399afaabc2781a1db09cb14ee4cc4ee5c7a5a3cfcc601811379a8092" dependencies = [ - "solana-define-syscall", + "solana-define-syscall 2.2.1", ] [[package]] @@ -6434,9 +6447,9 @@ dependencies = [ "serde", "serde_derive", "solana-fee-calculator", - "solana-hash", + "solana-hash 2.2.1", "solana-pubkey", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", ] [[package]] @@ -6446,7 +6459,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde971a20b8dbf60144d6a84439dda86b5466e00e2843091fe731083cda614da" dependencies = [ "solana-account", - "solana-hash", + "solana-hash 2.2.1", "solana-nonce", "solana-sdk-ids", ] @@ -6458,11 +6471,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b526398ade5dea37f1f147ce55dae49aa017a5d7326606359b0445ca8d946581" dependencies = [ "num_enum", - "solana-hash", + "solana-hash 2.2.1", "solana-packet", "solana-pubkey", "solana-sanitize", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-signature", "solana-signer", ] @@ -6499,7 +6512,7 @@ checksum = "8ad1ea160d08dc423c35021fa3e437a5783eb256f5ab8bc3024e27db913acf42" dependencies = [ "ark-bn254", "light-poseidon", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "thiserror 2.0.17", ] @@ -6576,13 +6589,13 @@ dependencies = [ "solana-clock", "solana-cpi", "solana-decode-error", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "solana-epoch-rewards", "solana-epoch-schedule", "solana-example-mocks", "solana-feature-gate-interface", "solana-fee-calculator", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-instructions-sysvar", "solana-keccak-hasher", @@ -6607,7 +6620,7 @@ dependencies = [ "solana-secp256k1-recover", "solana-serde-varint", "solana-serialize-utils", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-short-vec", "solana-slot-hashes", "solana-slot-history", @@ -6656,7 +6669,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b0268f6c89825fb634a34bd0c3b8fdaeaecfc3728be1d622a8ee6dd577b60d4" dependencies = [ "num-traits", - "solana-define-syscall", + "solana-define-syscall 2.2.1", ] [[package]] @@ -6694,7 +6707,7 @@ dependencies = [ "solana-epoch-rewards", "solana-epoch-schedule", "solana-feature-set", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-last-restart-slot", "solana-log-collector", @@ -6736,9 +6749,9 @@ dependencies = [ "serde_derive", "solana-atomic-u64", "solana-decode-error", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "solana-sanitize", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "wasm-bindgen", ] @@ -6865,7 +6878,7 @@ dependencies = [ "solana-epoch-info", "solana-epoch-schedule", "solana-feature-gate-interface", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-message", "solana-pubkey", @@ -7050,7 +7063,7 @@ checksum = "baa3120b6cdaa270f39444f5093a90a7b03d296d362878f7a6991d6de3bbe496" dependencies = [ "borsh 1.6.0", "libsecp256k1", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "thiserror 2.0.17", ] @@ -7133,8 +7146,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0037386961c0d633421f53560ad7c80675c0447cba4d1bb66d60974dd486c7ea" dependencies = [ "sha2 0.10.9", - "solana-define-syscall", - "solana-hash", + "solana-define-syscall 2.2.1", + "solana-hash 2.2.1", +] + +[[package]] +name = "solana-sha256-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" +dependencies = [ + "solana-define-syscall 4.0.1", + "solana-hash 4.0.1", ] [[package]] @@ -7153,8 +7176,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afd3db0461089d1ad1a78d9ba3f15b563899ca2386351d38428faa5350c60a98" dependencies = [ "solana-hard-forks", - "solana-hash", - "solana-sha256-hasher", + "solana-hash 2.2.1", + "solana-sha256-hasher 2.2.1", ] [[package]] @@ -7191,7 +7214,7 @@ checksum = "0c8691982114513763e88d04094c9caa0376b867a29577939011331134c301ce" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 2.2.1", "solana-sdk-ids", "solana-sysvar-id", ] @@ -7280,7 +7303,7 @@ dependencies = [ "protobuf-src", "serde", "solana-account-decoder", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-message", "solana-pubkey", @@ -7310,7 +7333,7 @@ dependencies = [ "solana-compute-budget-instruction", "solana-feature-set", "solana-fee-structure", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-instructions-sysvar", "solana-loader-v4-program", @@ -7352,7 +7375,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fc4392f0eed412141a376e99dfb052069b96f13697a9abb335504babe29387a" dependencies = [ - "solana-hash", + "solana-hash 2.2.1", "solana-message", "solana-pubkey", "solana-sdk-ids", @@ -7408,7 +7431,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bd98a25e5bcba8b6be8bcbb7b84b24c2a6a8178d7fb0e3077a916855ceba91a" dependencies = [ - "solana-hash", + "solana-hash 2.2.1", "solana-keypair", "solana-message", "solana-pubkey", @@ -7432,11 +7455,11 @@ dependencies = [ "serde_derive", "solana-account-info", "solana-clock", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "solana-epoch-rewards", "solana-epoch-schedule", "solana-fee-calculator", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-instructions-sysvar", "solana-last-restart-slot", @@ -7492,7 +7515,7 @@ dependencies = [ "serde_derive", "solana-bincode", "solana-feature-set", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-message", @@ -7555,7 +7578,7 @@ dependencies = [ "serde_json", "solana-account-decoder", "solana-clock", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-loader-v2-interface", "solana-message", @@ -7644,7 +7667,7 @@ dependencies = [ "serde_derive", "solana-clock", "solana-decode-error", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-pubkey", "solana-rent", @@ -7672,7 +7695,7 @@ dependencies = [ "solana-clock", "solana-epoch-schedule", "solana-feature-set", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-packet", @@ -7807,7 +7830,7 @@ checksum = "a7398da23554a31660f17718164e31d31900956054f54f52d5ec1be51cb4f4b3" dependencies = [ "bytemuck", "solana-program-error", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "spl-discriminator-derive", ] @@ -9677,7 +9700,7 @@ dependencies = [ "solana-account", "solana-account-decoder", "solana-clock", - "solana-hash", + "solana-hash 2.2.1", "solana-message", "solana-pubkey", "solana-signature", diff --git a/Cargo.toml b/Cargo.toml index 8d47b19ba..d3dc1392f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -102,7 +102,7 @@ magicblock-committor-program = { path = "./magicblock-committor-program", featur magicblock-committor-service = { path = "./magicblock-committor-service" } magicblock-config = { path = "./magicblock-config" } magicblock-core = { path = "./magicblock-core" } -magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "2cb491032f372", features = [ +magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", branch = "snawaz/commit-finalize-from-buffer", features = [ "no-entrypoint", ] } magicblock-ledger = { path = "./magicblock-ledger" } diff --git a/magicblock-committor-service/src/intent_executor/mod.rs b/magicblock-committor-service/src/intent_executor/mod.rs index fb1426705..e300c10ab 100644 --- a/magicblock-committor-service/src/intent_executor/mod.rs +++ b/magicblock-committor-service/src/intent_executor/mod.rs @@ -83,6 +83,7 @@ impl metrics::LabelValue for ExecutionOutput { } } +#[derive(Debug)] pub struct IntentExecutionResult { /// Final result of Intent Execution pub inner: IntentExecutorResult, @@ -161,6 +162,8 @@ where if all_committed_pubkeys.is_empty() { // Build tasks for commit stage + // TODO (snawaz): it's actually MagicBaseIntent::BaseActionse scenario, not Commit + // scenario. The related code needs little bit of refactoring. let commit_tasks = TaskBuilderImpl::commit_tasks( &self.task_info_fetcher, &intent_bundle, diff --git a/magicblock-committor-service/src/persist/commit_persister.rs b/magicblock-committor-service/src/persist/commit_persister.rs index c9399bff9..5a006d84b 100644 --- a/magicblock-committor-service/src/persist/commit_persister.rs +++ b/magicblock-committor-service/src/persist/commit_persister.rs @@ -136,6 +136,12 @@ impl IntentPersisterImpl { [ (false, intent_bundle.get_commit_intent_accounts()), (true, intent_bundle.get_undelegate_intent_accounts()), + (false, intent_bundle.get_commit_finalize_intent_accounts()), + ( + true, + intent_bundle + .get_commit_finalize_and_undelegate_intent_accounts(), + ), ] .into_iter() .filter_map(|(undelegate, accounts)| { @@ -494,6 +500,8 @@ mod tests { MagicIntentBundle { commit: Some(CommitType::Standalone(test_accounts())), commit_and_undelegate: None, + commit_finalize: None, + commit_finalize_and_undelegate: None, standalone_actions: vec![], } } @@ -505,6 +513,8 @@ mod tests { commit_action: CommitType::Standalone(test_accounts()), undelegate_action: UndelegateType::Standalone, }), + commit_finalize: None, + commit_finalize_and_undelegate: None, standalone_actions: vec![], } } @@ -516,6 +526,8 @@ mod tests { commit_action: CommitType::Standalone(test_accounts()), undelegate_action: UndelegateType::Standalone, }), + commit_finalize: None, + commit_finalize_and_undelegate: None, standalone_actions: vec![], } } @@ -524,6 +536,8 @@ mod tests { MagicIntentBundle { commit: None, commit_and_undelegate: None, + commit_finalize: None, + commit_finalize_and_undelegate: None, standalone_actions: vec![], } } diff --git a/magicblock-committor-service/src/tasks/args_task.rs b/magicblock-committor-service/src/tasks/args_task.rs index 3f883fbbf..7c8a06de0 100644 --- a/magicblock-committor-service/src/tasks/args_task.rs +++ b/magicblock-committor-service/src/tasks/args_task.rs @@ -1,10 +1,10 @@ use dlp::{ - args::{CommitDiffArgs, CommitStateArgs}, + args::{CommitDiffArgs, CommitFinalizeArgs, CommitStateArgs}, compute_diff, instruction_builder::{ call_handler_size_budget, call_handler_v2_size_budget, - commit_diff_size_budget, commit_size_budget, finalize_size_budget, - undelegate_size_budget, + commit_diff_size_budget, commit_finalize_size_budget, + commit_size_budget, finalize_size_budget, undelegate_size_budget, }, AccountSizeClass, }; @@ -19,8 +19,8 @@ use crate::tasks::{ buffer_task::{BufferTask, BufferTaskType}, visitor::Visitor, BaseActionTask, BaseActionV2Task, BaseTask, BaseTaskError, BaseTaskResult, - CommitDiffTask, CommitTask, FinalizeTask, PreparationState, TaskType, - UndelegateTask, + CommitDiffTask, CommitFinalizeTask, CommitTask, FinalizeTask, + PreparationState, TaskType, UndelegateTask, }; /// Task that will be executed on Base layer via arguments @@ -28,6 +28,7 @@ use crate::tasks::{ pub enum ArgsTaskType { Commit(CommitTask), CommitDiff(CommitDiffTask), + CommitFinalize(CommitFinalizeTask), Finalize(FinalizeTask), Undelegate(UndelegateTask), // Special action really BaseAction(BaseActionTask), @@ -95,6 +96,38 @@ impl BaseTask for ArgsTask { args, ) } + ArgsTaskType::CommitFinalize(task) => { + let (data, data_is_diff) = + if let Some(base_account) = &task.base_account { + ( + compute_diff( + base_account.data(), + task.committed_account.account.data(), + ) + .to_vec(), + true, + ) + } else { + (task.committed_account.account.data.clone(), false) + }; + + let mut args = CommitFinalizeArgs { + commit_id: task.commit_id, + lamports: task.committed_account.account.lamports, + data_is_diff: data_is_diff.into(), + allow_undelegation: task.allow_undelegation.into(), + bumps: Default::default(), + reserved_padding: Default::default(), + }; + + dlp::instruction_builder::commit_finalize( + *validator, + task.committed_account.pubkey, + &mut args, + &data, + ) + .0 + } ArgsTaskType::Finalize(value) => { dlp::instruction_builder::finalize( *validator, @@ -111,6 +144,8 @@ impl BaseTask for ArgsTask { } ArgsTaskType::BaseAction(value) => { let action = &value.action; + + #[allow(deprecated)] dlp::instruction_builder::call_handler( *validator, action.destination_program, @@ -147,6 +182,11 @@ impl BaseTask for ArgsTask { BufferTaskType::CommitDiff(value), ))) } + ArgsTaskType::CommitFinalize(value) => { + Ok(Box::new(BufferTask::new_preparation_required( + BufferTaskType::CommitFinalize(value), + ))) + } ArgsTaskType::BaseAction(_) | ArgsTaskType::BaseActionV2(_) | ArgsTaskType::Finalize(_) @@ -175,6 +215,7 @@ impl BaseTask for ArgsTask { match &self.task_type { ArgsTaskType::Commit(_) => 70_000, ArgsTaskType::CommitDiff(_) => 70_000, + ArgsTaskType::CommitFinalize(_) => 70_000, ArgsTaskType::BaseAction(task) => task.action.compute_units, ArgsTaskType::BaseActionV2(task) => task.action.compute_units, ArgsTaskType::Undelegate(_) => 70_000, @@ -194,6 +235,11 @@ impl BaseTask for ArgsTask { task.committed_account.account.data.len() as u32, )) } + ArgsTaskType::CommitFinalize(task) => { + commit_finalize_size_budget(AccountSizeClass::Dynamic( + task.committed_account.account.data.len() as u32, + )) + } ArgsTaskType::BaseAction(task) => { // assume all other accounts are Small accounts. let other_accounts_budget = @@ -235,6 +281,7 @@ impl BaseTask for ArgsTask { match &self.task_type { ArgsTaskType::Commit(_) => TaskType::Commit, ArgsTaskType::CommitDiff(_) => TaskType::Commit, + ArgsTaskType::CommitFinalize(_) => TaskType::CommitFinalize, ArgsTaskType::BaseAction(_) | ArgsTaskType::BaseActionV2(_) => { TaskType::Action } @@ -256,6 +303,9 @@ impl BaseTask for ArgsTask { ArgsTaskType::CommitDiff(task) => { task.commit_id = commit_id; } + ArgsTaskType::CommitFinalize(task) => { + task.commit_id = commit_id; + } ArgsTaskType::BaseAction(_) | ArgsTaskType::BaseActionV2(_) | ArgsTaskType::Finalize(_) @@ -269,6 +319,7 @@ impl LabelValue for ArgsTask { match self.task_type { ArgsTaskType::Commit(_) => "args_commit", ArgsTaskType::CommitDiff(_) => "args_commit_diff", + ArgsTaskType::CommitFinalize(_) => "args_commit_finalize", ArgsTaskType::BaseAction(_) => "args_action", ArgsTaskType::BaseActionV2(_) => "args_action_v2", ArgsTaskType::Finalize(_) => "args_finalize", diff --git a/magicblock-committor-service/src/tasks/buffer_task.rs b/magicblock-committor-service/src/tasks/buffer_task.rs index fc8440a1a..72d2264ac 100644 --- a/magicblock-committor-service/src/tasks/buffer_task.rs +++ b/magicblock-committor-service/src/tasks/buffer_task.rs @@ -1,11 +1,15 @@ use dlp::{ - args::CommitStateFromBufferArgs, + args::{CommitFinalizeArgs, CommitStateFromBufferArgs}, compute_diff, - instruction_builder::{commit_diff_size_budget, commit_size_budget}, + instruction_builder::{ + commit_diff_size_budget, commit_finalize_from_buffer_size_budget, + commit_size_budget, + }, AccountSizeClass, }; use magicblock_committor_program::Chunks; use magicblock_metrics::metrics::LabelValue; +use solana_account::ReadableAccount; use solana_instruction::Instruction; use solana_pubkey::Pubkey; @@ -17,8 +21,8 @@ use crate::{ consts::MAX_WRITE_CHUNK_SIZE, tasks::{ visitor::Visitor, BaseTask, BaseTaskError, BaseTaskResult, - CommitDiffTask, CommitTask, PreparationState, PreparationTask, - TaskType, + CommitDiffTask, CommitFinalizeTask, CommitTask, PreparationState, + PreparationTask, TaskType, }, }; @@ -27,6 +31,7 @@ use crate::{ pub enum BufferTaskType { Commit(CommitTask), CommitDiff(CommitDiffTask), + CommitFinalize(CommitFinalizeTask), // Action in the future } @@ -85,6 +90,28 @@ impl BufferTask { chunks, }) } + + BufferTaskType::CommitFinalize(task) => { + let data = if let Some(base_account) = &task.base_account { + compute_diff( + base_account.data(), + task.committed_account.account.data(), + ) + .to_vec() + } else { + task.committed_account.account.data.clone() + }; + + let chunks = + Chunks::from_data_length(data.len(), MAX_WRITE_CHUNK_SIZE); + + PreparationState::Required(PreparationTask { + commit_id: task.commit_id, + pubkey: task.committed_account.pubkey, + committed_data: data, + chunks, + }) + } } } } @@ -151,6 +178,32 @@ impl BaseTask for BufferTask { }, ) } + + BufferTaskType::CommitFinalize(task) => { + let (data_buffer_pubkey, _) = + magicblock_committor_program::pdas::buffer_pda( + validator, + &task.committed_account.pubkey, + &task.commit_id.to_le_bytes(), + ); + + let mut args = CommitFinalizeArgs { + commit_id: task.commit_id, + lamports: task.committed_account.account.lamports, + data_is_diff: task.base_account.is_some().into(), + allow_undelegation: task.allow_undelegation.into(), + bumps: Default::default(), + reserved_padding: Default::default(), + }; + + dlp::instruction_builder::commit_finalize_from_buffer( + *validator, + task.committed_account.pubkey, + data_buffer_pubkey, + &mut args, + ) + .0 + } } } @@ -181,6 +234,7 @@ impl BaseTask for BufferTask { match self.task_type { BufferTaskType::Commit(_) => 70_000, BufferTaskType::CommitDiff(_) => 70_000, + BufferTaskType::CommitFinalize(_) => 70_000, } } @@ -192,6 +246,9 @@ impl BaseTask for BufferTask { BufferTaskType::CommitDiff(_) => { commit_diff_size_budget(AccountSizeClass::Huge) } + BufferTaskType::CommitFinalize(_) => { + commit_finalize_from_buffer_size_budget(AccountSizeClass::Huge) + } } } @@ -204,6 +261,7 @@ impl BaseTask for BufferTask { match self.task_type { BufferTaskType::Commit(_) => TaskType::Commit, BufferTaskType::CommitDiff(_) => TaskType::Commit, + BufferTaskType::CommitFinalize(_) => TaskType::CommitFinalize, } } @@ -220,6 +278,9 @@ impl BaseTask for BufferTask { BufferTaskType::CommitDiff(task) => { task.commit_id = commit_id; } + BufferTaskType::CommitFinalize(task) => { + task.commit_id = commit_id; + } }; self.preparation_state = Self::preparation_required(&self.task_type) @@ -231,6 +292,7 @@ impl LabelValue for BufferTask { match self.task_type { BufferTaskType::Commit(_) => "buffer_commit", BufferTaskType::CommitDiff(_) => "buffer_commit_diff", + BufferTaskType::CommitFinalize(_) => "buffer_commit_finalize", } } } diff --git a/magicblock-committor-service/src/tasks/mod.rs b/magicblock-committor-service/src/tasks/mod.rs index b4af90c58..bb845ab65 100644 --- a/magicblock-committor-service/src/tasks/mod.rs +++ b/magicblock-committor-service/src/tasks/mod.rs @@ -35,6 +35,7 @@ pub use task_builder::TaskBuilderImpl; #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum TaskType { Commit, + CommitFinalize, Finalize, Undelegate, Action, @@ -123,6 +124,14 @@ pub struct CommitDiffTask { pub base_account: Account, } +#[derive(Clone, Debug)] +pub struct CommitFinalizeTask { + pub commit_id: u64, + pub allow_undelegation: bool, + pub base_account: Option, // None implies commit-full-bytes else commit-diff + pub committed_account: CommittedAccount, +} + #[derive(Clone, Debug)] pub struct UndelegateTask { pub delegated_account: Pubkey, diff --git a/magicblock-committor-service/src/tasks/task_builder.rs b/magicblock-committor-service/src/tasks/task_builder.rs index 507d7358b..f5032dad1 100644 --- a/magicblock-committor-service/src/tasks/task_builder.rs +++ b/magicblock-committor-service/src/tasks/task_builder.rs @@ -2,8 +2,8 @@ use std::{collections::HashMap, sync::Arc}; use async_trait::async_trait; use magicblock_program::magic_scheduled_base_intent::{ - BaseAction, CommitType, CommittedAccount, ScheduledIntentBundle, - UndelegateType, + BaseAction, CommitAndUndelegate, CommitType, CommittedAccount, + ScheduledIntentBundle, UndelegateType, }; use solana_account::Account; use solana_pubkey::Pubkey; @@ -18,8 +18,8 @@ use crate::{ persist::IntentPersister, tasks::{ args_task::{ArgsTask, ArgsTaskType}, - BaseActionTask, BaseActionV2Task, BaseTask, FinalizeTask, - UndelegateTask, + BaseActionTask, BaseActionV2Task, BaseTask, CommitFinalizeTask, + FinalizeTask, UndelegateTask, }, }; @@ -106,12 +106,12 @@ impl TaskBuilderImpl { async fn fetch_commit_nonces( task_info_fetcher: &Arc, - accounts: &[(bool, CommittedAccount)], + accounts: &[(bool, bool, CommittedAccount)], min_context_slot: u64, ) -> TaskInfoFetcherResult> { let committed_pubkeys = accounts .iter() - .map(|(_, account)| account.pubkey) + .map(|(_, _, account)| account.pubkey) .collect::>(); task_info_fetcher @@ -121,26 +121,48 @@ impl TaskBuilderImpl { async fn fetch_diffable_accounts( task_info_fetcher: &Arc, - accounts: &[(bool, CommittedAccount)], + accounts: &[(bool, bool, CommittedAccount)], min_context_slot: u64, ) -> TaskInfoFetcherResult> { let diffable_pubkeys = accounts .iter() - .filter(|(_, account)| { + .filter(|(_, _, account)| { account.account.data.len() > COMMIT_STATE_SIZE_THRESHOLD }) - .map(|(_, account)| account.pubkey) + .map(|(_, _, account)| account.pubkey) .collect::>(); task_info_fetcher .get_base_accounts(&diffable_pubkeys, min_context_slot) .await } + + pub fn create_commit_finalize_task( + commit_id: u64, + allow_undelegation: bool, + account: CommittedAccount, + base_account: Option, + ) -> ArgsTask { + let base_account = + if account.account.data.len() > COMMIT_STATE_SIZE_THRESHOLD { + base_account + } else { + None + }; + + ArgsTaskType::CommitFinalize(CommitFinalizeTask { + commit_id, + allow_undelegation, + committed_account: account, + base_account, + }) + .into() + } } #[async_trait] impl TasksBuilder for TaskBuilderImpl { - /// Returns [`Task`]s for Commit stage + /// Returns []s for Commit stage async fn commit_tasks( task_info_fetcher: &Arc, intent_bundle: &ScheduledIntentBundle, @@ -155,21 +177,31 @@ impl TasksBuilder for TaskBuilderImpl { intent_bundle.get_commit_intent_accounts().cloned(); let undelegated_accounts = intent_bundle.get_undelegate_intent_accounts().cloned(); - let flagged_accounts: Vec<_> = - [(false, committed_accounts), (true, undelegated_accounts)] + let commit_finalize_accounts = + intent_bundle.get_commit_finalize_intent_accounts().cloned(); + let commit_finalize_and_undelegate_accounts = intent_bundle + .get_commit_finalize_and_undelegate_intent_accounts() + .cloned(); + + let flagged_accounts: Vec<_> = [ + (false, false, committed_accounts), + (true, false, undelegated_accounts), + (false, true, commit_finalize_accounts), + (true, true, commit_finalize_and_undelegate_accounts), + ] + .into_iter() + .flat_map(|(allow_undelegation, finalize, accounts)| { + accounts .into_iter() - .flat_map(|(allow_undelegation, accounts)| { - accounts - .into_iter() - .flatten() - .map(move |account| (allow_undelegation, account)) - }) - .collect(); + .flatten() + .map(move |account| (allow_undelegation, finalize, account)) + }) + .collect(); // Get commit nonces and base accounts let min_context_slot = flagged_accounts .iter() - .map(|(_, account)| account.remote_slot) + .map(|(_, _, account)| account.remote_slot) .max() .unwrap_or(0); let (commit_ids, base_accounts) = tokio::join!( @@ -202,7 +234,7 @@ impl TasksBuilder for TaskBuilderImpl { // Create commit tasks let commit_tasks_iter = flagged_accounts.into_iter().map( - |(allow_undelegation, account)| { + |(allow_undelegation, finalize, account)| { let commit_id = commit_ids .get(&account.pubkey) .copied() @@ -215,16 +247,18 @@ impl TasksBuilder for TaskBuilderImpl { }); let base_account = base_accounts.remove(&account.pubkey); - Box::new(Self::create_commit_task( - commit_id, - allow_undelegation, - account.clone(), - base_account, - )) as Box + println!("commit_tasks: finalize = {}", finalize); + + let task = if finalize { + Self::create_commit_finalize_task(commit_id, allow_undelegation, account.clone(), base_account) + } else { + Self::create_commit_task(commit_id, allow_undelegation, account.clone(), base_account) + }; + + Box::new(task) as Box }, ); tasks.extend(commit_tasks_iter); - Ok(tasks) } @@ -255,7 +289,9 @@ impl TasksBuilder for TaskBuilderImpl { } // Helper to process commit types - fn process_commit(commit: &CommitType) -> Vec> { + fn create_finalize_tasks( + commit: &CommitType, + ) -> Vec> { match commit { CommitType::Standalone(accounts) => { accounts.iter().map(finalize_task).collect() @@ -276,18 +312,12 @@ impl TasksBuilder for TaskBuilderImpl { } } - let mut tasks = Vec::new(); - if let Some(ref value) = intent_bundle.intent_bundle.commit { - tasks.extend(process_commit(value)); - } - - if let Some(ref value) = - intent_bundle.intent_bundle.commit_and_undelegate - { - tasks.extend(process_commit(&value.commit_action)); - + async fn create_undelegate_tasks( + commit_and_undelegate: &CommitAndUndelegate, + info_fetcher: &Arc, + ) -> TaskBuilderResult>> { // Get rent reimbursments for undelegated accounts - let accounts = value.get_committed_accounts(); + let accounts = commit_and_undelegate.get_committed_accounts(); let mut min_context_slot = 0; let pubkeys = accounts .iter() @@ -302,17 +332,39 @@ impl TasksBuilder for TaskBuilderImpl { .await .map_err(TaskBuilderError::FinalizedTasksBuildError)?; - tasks.extend(accounts.iter().zip(rent_reimbursements).map( - |(account, rent_reimbursement)| { + let mut tasks = accounts + .iter() + .zip(rent_reimbursements) + .map(|(account, rent_reimbursement)| { undelegate_task(account, &rent_reimbursement) - }, - )); + }) + .collect::>(); if let UndelegateType::WithBaseActions(actions) = - &value.undelegate_action + &commit_and_undelegate.undelegate_action { - tasks.extend(Self::create_action_tasks(actions)); + tasks.extend(TaskBuilderImpl::create_action_tasks(actions)); } + Ok(tasks) + } + + let mut tasks = Vec::new(); + + if let Some(ref value) = intent_bundle.intent_bundle.commit { + tasks.extend(create_finalize_tasks(value)); + } + + if let Some(ref value) = + intent_bundle.intent_bundle.commit_and_undelegate + { + tasks.extend(create_finalize_tasks(&value.commit_action)); + tasks.extend(create_undelegate_tasks(value, info_fetcher).await?); + }; + + if let Some(ref value) = + intent_bundle.intent_bundle.commit_finalize_and_undelegate + { + tasks.extend(create_undelegate_tasks(value, info_fetcher).await?); }; Ok(tasks) diff --git a/magicblock-committor-service/src/tasks/task_visitors/persistor_visitor.rs b/magicblock-committor-service/src/tasks/task_visitors/persistor_visitor.rs index 3976395a0..875cc1646 100644 --- a/magicblock-committor-service/src/tasks/task_visitors/persistor_visitor.rs +++ b/magicblock-committor-service/src/tasks/task_visitors/persistor_visitor.rs @@ -52,6 +52,11 @@ where &task.committed_account.pubkey, commit_strategy(true), ), + ArgsTaskType::CommitFinalize(task) => ( + task.commit_id, + &task.committed_account.pubkey, + commit_strategy(task.base_account.is_some()), + ), _ => return, }; @@ -101,6 +106,11 @@ where &task.committed_account.pubkey, commit_strategy(true), ), + BufferTaskType::CommitFinalize(task) => ( + task.commit_id, + &task.committed_account.pubkey, + commit_strategy(task.base_account.is_some()), + ), }; if let Err(err) = self.persistor.set_commit_strategy( diff --git a/magicblock-committor-service/src/tasks/task_visitors/utility_visitor.rs b/magicblock-committor-service/src/tasks/task_visitors/utility_visitor.rs index c0c62b966..1658a24ed 100644 --- a/magicblock-committor-service/src/tasks/task_visitors/utility_visitor.rs +++ b/magicblock-committor-service/src/tasks/task_visitors/utility_visitor.rs @@ -55,6 +55,13 @@ impl Visitor for TaskVisitorUtils { remote_slot: task.committed_account.remote_slot, }) } + ArgsTaskType::CommitFinalize(task) => { + *commit_meta = Some(CommitMeta { + committed_pubkey: task.committed_account.pubkey, + commit_id: task.commit_id, + remote_slot: task.committed_account.remote_slot, + }) + } _ => *commit_meta = None, } } @@ -77,6 +84,13 @@ impl Visitor for TaskVisitorUtils { remote_slot: task.committed_account.remote_slot, }) } + BufferTaskType::CommitFinalize(task) => { + *commit_meta = Some(CommitMeta { + committed_pubkey: task.committed_account.pubkey, + commit_id: task.commit_id, + remote_slot: task.committed_account.remote_slot, + }) + } } } } diff --git a/magicblock-committor-service/src/types.rs b/magicblock-committor-service/src/types.rs new file mode 100644 index 000000000..4a72a2242 --- /dev/null +++ b/magicblock-committor-service/src/types.rs @@ -0,0 +1,42 @@ +use std::ops::Deref; + +use magicblock_metrics::metrics; +use magicblock_program::magic_scheduled_base_intent::{ + MagicBaseIntent, ScheduledBaseIntent, +}; + +// TODO: should be removed once cranks are supported +// Ideally even now OffChain/"Manual" commits should be triggered via Tx +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum TriggerType { + OnChain, + OffChain, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct ScheduledBaseIntentWrapper { + pub inner: ScheduledBaseIntent, + pub trigger_type: TriggerType, +} + +impl metrics::LabelValue for ScheduledBaseIntentWrapper { + fn value(&self) -> &str { + match &self.inner.base_intent { + MagicBaseIntent::BaseActions(_) => "actions", + MagicBaseIntent::Commit(_) => "commit", + MagicBaseIntent::CommitAndUndelegate(_) => "commit_and_undelegate", + MagicBaseIntent::CommitFinalize(_) => "commit_finalize", + MagicBaseIntent::CommitFinalizeAndUndelegate(_) => { + "commit_finalize_and_undelegate" + } + } + } +} + +impl Deref for ScheduledBaseIntentWrapper { + type Target = ScheduledBaseIntent; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} diff --git a/magicblock-validator/src/main.rs b/magicblock-validator/src/main.rs index cf1bf9790..ec47e9032 100644 --- a/magicblock-validator/src/main.rs +++ b/magicblock-validator/src/main.rs @@ -52,6 +52,7 @@ async fn run() { #[cfg(feature = "tokio-console")] console_subscriber::init(); let args = std::env::args_os(); + println!("cli args: {:?}", args); let config = match ValidatorParams::try_new(args) { Ok(c) => c, Err(err) => { diff --git a/programs/magicblock/src/magic_scheduled_base_intent.rs b/programs/magicblock/src/magic_scheduled_base_intent.rs index 08c63153e..ae2a0331f 100644 --- a/programs/magicblock/src/magic_scheduled_base_intent.rs +++ b/programs/magicblock/src/magic_scheduled_base_intent.rs @@ -125,6 +125,21 @@ impl ScheduledIntentBundle { self.intent_bundle.get_commit_intent_accounts() } + /// Returns `[CommitAndUndelegate]` intent's accounts + pub fn get_commit_finalize_and_undelegate_intent_accounts( + &self, + ) -> Option<&Vec> { + self.intent_bundle + .get_commit_finalize_and_undelegate_intent_accounts() + } + + /// Returns `Commit` intent's accounts + pub fn get_commit_finalize_intent_accounts( + &self, + ) -> Option<&Vec> { + self.intent_bundle.get_commit_finalize_intent_accounts() + } + /// Returns `Commit` intent's accounts pub fn get_commit_intent_accounts_mut( &mut self, @@ -144,6 +159,11 @@ impl ScheduledIntentBundle { self.intent_bundle.has_undelegate_intent() } + // pub fn is_commit_finalize(&self) -> bool { + // todo!("is_commit_finalize") + // // self.intent_bundle.is_commit_finalize() + // } + pub fn is_empty(&self) -> bool { self.intent_bundle.is_empty() } @@ -160,6 +180,8 @@ pub enum MagicBaseIntent { BaseActions(Vec), Commit(CommitType), CommitAndUndelegate(CommitAndUndelegate), + CommitFinalize(CommitType), + CommitFinalizeAndUndelegate(CommitAndUndelegate), } // Bundle of BaseIntents @@ -167,6 +189,8 @@ pub enum MagicBaseIntent { pub struct MagicIntentBundle { pub commit: Option, pub commit_and_undelegate: Option, + pub commit_finalize: Option, + pub commit_finalize_and_undelegate: Option, pub standalone_actions: Vec, } @@ -181,6 +205,12 @@ impl From for MagicIntentBundle { MagicBaseIntent::CommitAndUndelegate(value) => { this.commit_and_undelegate = Some(value) } + MagicBaseIntent::CommitFinalize(value) => { + this.commit_finalize = Some(value) + } + MagicBaseIntent::CommitFinalizeAndUndelegate(value) => { + this.commit_finalize_and_undelegate = Some(value) + } } this @@ -198,10 +228,22 @@ impl MagicIntentBundle { .commit .map(|value| CommitType::try_from_args(value, context)) .transpose()?; + let commit_and_undelegate = args .commit_and_undelegate .map(|value| CommitAndUndelegate::try_from_args(value, context)) .transpose()?; + + let commit_finalize = args + .commit_finalize + .map(|value| CommitType::try_from_args(value, context)) + .transpose()?; + + let commit_finalize_and_undelegate = args + .commit_finalize_and_undelegate + .map(|value| CommitAndUndelegate::try_from_args(value, context)) + .transpose()?; + let actions = args .standalone_actions .into_iter() @@ -211,6 +253,8 @@ impl MagicIntentBundle { let this = Self { commit, commit_and_undelegate, + commit_finalize, + commit_finalize_and_undelegate, standalone_actions: actions, }; this.post_validation(context)?; @@ -291,12 +335,24 @@ impl MagicIntentBundle { if let Some(cau) = &self.commit_and_undelegate { check(cau.get_committed_accounts())?; } + if let Some(commit_finalize) = &self.commit_finalize { + check(commit_finalize.get_committed_accounts())?; + } + if let Some(commit_finalize_and_undelegate) = + &self.commit_finalize_and_undelegate + { + check(commit_finalize_and_undelegate.get_committed_accounts())?; + } Ok(()) } pub fn has_undelegate_intent(&self) -> bool { self.commit_and_undelegate.is_some() + + // TODO (snawaz): we need to add this as well? + // || + // self.commit_finalize_and_undelegate.is_some() } pub fn has_committed_accounts(&self) -> bool { @@ -308,8 +364,19 @@ impl MagicIntentBundle { .get_undelegate_intent_accounts() .map(|el| !el.is_empty()) .unwrap_or(false); + let has_commit_finalize_intent_accounts = self + .get_commit_finalize_intent_accounts() + .map(|el| !el.is_empty()) + .unwrap_or(false); + let has_commit_finalize_and_undelegate_intent_accounts = self + .get_commit_finalize_and_undelegate_intent_accounts() + .map(|el| !el.is_empty()) + .unwrap_or(false); - has_commit_intent_accounts || has_undelegate_intent_accounts + has_commit_intent_accounts + || has_undelegate_intent_accounts + || has_commit_finalize_intent_accounts + || has_commit_finalize_and_undelegate_intent_accounts } /// Returns `[CommitAndUndelegate]` intent's accounts @@ -328,6 +395,24 @@ impl MagicIntentBundle { Some(self.commit.as_ref()?.get_committed_accounts()) } + /// Returns `[CommitAndUndelegate]` intent's accounts + pub fn get_commit_finalize_and_undelegate_intent_accounts( + &self, + ) -> Option<&Vec> { + Some( + self.commit_finalize_and_undelegate + .as_ref()? + .get_committed_accounts(), + ) + } + + /// Returns `Commit` intent's accounts + pub fn get_commit_finalize_intent_accounts( + &self, + ) -> Option<&Vec> { + Some(self.commit_finalize.as_ref()?.get_committed_accounts()) + } + /// Returns `Commit` intent's accounts pub fn get_commit_intent_accounts_mut( &mut self, @@ -340,18 +425,29 @@ impl MagicIntentBundle { pub fn get_all_committed_accounts(&self) -> Vec { let committed = self.get_commit_intent_accounts(); let undelegated = self.get_undelegate_intent_accounts(); - [committed, undelegated] - .into_iter() - .flatten() - .flatten() - .cloned() - .collect() + let commit_finalize = self.get_commit_finalize_intent_accounts(); + let commit_finalize_and_undelegate = + self.get_commit_finalize_and_undelegate_intent_accounts(); + + [ + committed, + undelegated, + commit_finalize, + commit_finalize_and_undelegate, + ] + .into_iter() + .flatten() + .flatten() + .cloned() + .collect() } pub fn get_all_committed_pubkeys(&self) -> Vec { [ self.get_commit_intent_pubkeys(), self.get_undelegate_intent_pubkeys(), + self.get_commit_finalize_intent_pubkeys(), + self.get_commit_finalize_and_undelegate_intent_pubkeys(), ] .into_iter() .flatten() @@ -371,17 +467,49 @@ impl MagicIntentBundle { .map(|value| value.get_committed_pubkeys()) } + pub fn get_commit_finalize_intent_pubkeys(&self) -> Option> { + self.commit_finalize + .as_ref() + .map(|value| value.get_committed_pubkeys()) + } + + pub fn get_commit_finalize_and_undelegate_intent_pubkeys( + &self, + ) -> Option> { + self.commit_finalize_and_undelegate + .as_ref() + .map(|value| value.get_committed_pubkeys()) + } + pub fn is_empty(&self) -> bool { let no_committed = self.commit.as_ref().map(|el| el.is_empty()).unwrap_or(true); + let no_committed_and_undelegated = self .commit_and_undelegate .as_ref() .map(|el| el.is_empty()) .unwrap_or(true); + + let no_commit_finalize = self + .commit_finalize + .as_ref() + .map(|el| el.is_empty()) + .unwrap_or(true); + + let no_commit_finalize_and_undelegate = self + .commit_finalize_and_undelegate + .as_ref() + .map(|el| el.is_empty()) + .unwrap_or(true); + let no_actions = self.standalone_actions.is_empty(); - no_committed && no_committed_and_undelegated && no_actions + no_committed + && no_committed_and_undelegated + && no_commit_finalize + && no_commit_finalize_and_undelegate + && no_actions } } @@ -407,8 +535,17 @@ impl MagicBaseIntent { CommitAndUndelegate::try_from_args(type_, context)?; Ok(MagicBaseIntent::CommitAndUndelegate(commit_and_undelegate)) } - MagicBaseIntentArgs::CommitFinalize(_) => todo!(), - MagicBaseIntentArgs::CommitFinalizeAndUndelegate(_) => todo!(), + MagicBaseIntentArgs::CommitFinalize(type_) => { + let commit = CommitType::try_from_args(type_, context)?; + Ok(MagicBaseIntent::CommitFinalize(commit)) + } + MagicBaseIntentArgs::CommitFinalizeAndUndelegate(type_) => { + let commit_and_undelegate = + CommitAndUndelegate::try_from_args(type_, context)?; + Ok(MagicBaseIntent::CommitFinalizeAndUndelegate( + commit_and_undelegate, + )) + } } } @@ -417,6 +554,18 @@ impl MagicBaseIntent { MagicBaseIntent::BaseActions(_) => false, MagicBaseIntent::Commit(_) => false, MagicBaseIntent::CommitAndUndelegate(_) => true, + MagicBaseIntent::CommitFinalize(_) => false, + MagicBaseIntent::CommitFinalizeAndUndelegate(_) => true, + } + } + + pub fn is_commit_finalize(&self) -> bool { + match &self { + MagicBaseIntent::BaseActions(_) => false, + MagicBaseIntent::Commit(_) => false, + MagicBaseIntent::CommitAndUndelegate(_) => false, + MagicBaseIntent::CommitFinalize(_) => true, + MagicBaseIntent::CommitFinalizeAndUndelegate(_) => true, } } @@ -427,6 +576,12 @@ impl MagicBaseIntent { MagicBaseIntent::CommitAndUndelegate(t) => { Some(t.get_committed_accounts()) } + MagicBaseIntent::CommitFinalize(t) => { + Some(t.get_committed_accounts()) + } + MagicBaseIntent::CommitFinalizeAndUndelegate(t) => { + Some(t.get_committed_accounts()) + } } } @@ -439,6 +594,12 @@ impl MagicBaseIntent { MagicBaseIntent::CommitAndUndelegate(t) => { Some(t.get_committed_accounts_mut()) } + MagicBaseIntent::CommitFinalize(t) => { + Some(t.get_committed_accounts_mut()) + } + MagicBaseIntent::CommitFinalizeAndUndelegate(t) => { + Some(t.get_committed_accounts_mut()) + } } } @@ -453,6 +614,8 @@ impl MagicBaseIntent { MagicBaseIntent::BaseActions(actions) => actions.is_empty(), MagicBaseIntent::Commit(t) => t.is_empty(), MagicBaseIntent::CommitAndUndelegate(t) => t.is_empty(), + MagicBaseIntent::CommitFinalize(t) => t.is_empty(), + MagicBaseIntent::CommitFinalizeAndUndelegate(t) => t.is_empty(), } } } diff --git a/programs/magicblock/src/magicblock_processor.rs b/programs/magicblock/src/magicblock_processor.rs index 7070aadc4..d6a71c969 100644 --- a/programs/magicblock/src/magicblock_processor.rs +++ b/programs/magicblock/src/magicblock_processor.rs @@ -11,7 +11,8 @@ use crate::{ schedule_task::{process_cancel_task, process_schedule_task}, schedule_transactions::{ process_accept_scheduled_commits, process_schedule_commit, - process_schedule_intent_bundle, ProcessScheduleCommitOptions, + process_schedule_commit_finalize, process_schedule_intent_bundle, + ProcessScheduleCommitOptions, }, toggle_executable_check::process_toggle_executable_check, }; @@ -64,8 +65,14 @@ declare_process_instruction!( }, ), ScheduleCommitFinalize { - request_undelegation: _, - } => todo!(), + request_undelegation, + } => process_schedule_commit_finalize( + signers, + invoke_context, + ProcessScheduleCommitOptions { + request_undelegation, + }, + ), AcceptScheduleCommits => { process_accept_scheduled_commits(signers, invoke_context) } diff --git a/programs/magicblock/src/schedule_transactions/mod.rs b/programs/magicblock/src/schedule_transactions/mod.rs index 942a5991c..a8d30df03 100644 --- a/programs/magicblock/src/schedule_transactions/mod.rs +++ b/programs/magicblock/src/schedule_transactions/mod.rs @@ -1,5 +1,6 @@ mod process_accept_scheduled_commits; mod process_schedule_commit; +mod process_schedule_commit_finalize; #[cfg(test)] mod process_schedule_commit_tests; mod process_schedule_intent_bundle; @@ -9,6 +10,7 @@ pub(crate) mod transaction_scheduler; use magicblock_magic_program_api::MAGIC_CONTEXT_PUBKEY; pub(crate) use process_accept_scheduled_commits::*; pub(crate) use process_schedule_commit::*; +pub(crate) use process_schedule_commit_finalize::*; pub(crate) use process_schedule_intent_bundle::process_schedule_intent_bundle; pub use process_scheduled_commit_sent::{ process_scheduled_commit_sent, register_scheduled_commit_sent, SentCommit, diff --git a/programs/magicblock/src/schedule_transactions/process_schedule_commit_finalize.rs b/programs/magicblock/src/schedule_transactions/process_schedule_commit_finalize.rs new file mode 100644 index 000000000..832cf63e3 --- /dev/null +++ b/programs/magicblock/src/schedule_transactions/process_schedule_commit_finalize.rs @@ -0,0 +1,281 @@ +use std::collections::HashSet; + +// no direct token remap helpers needed here; handled in CommittedAccount builder +use solana_account::{state_traits::StateMut, ReadableAccount}; +use solana_instruction::error::InstructionError; +use solana_log_collector::ic_msg; +use solana_program_runtime::invoke_context::InvokeContext; +use solana_pubkey::Pubkey; + +use crate::{ + magic_scheduled_base_intent::{ + validate_commit_schedule_permissions, CommitAndUndelegate, CommitType, + CommittedAccount, MagicBaseIntent, ScheduledIntentBundle, + UndelegateType, + }, + schedule_transactions::{self, ProcessScheduleCommitOptions}, + utils::{ + account_actions::mark_account_as_undelegated, + accounts::{ + get_instruction_account_with_idx, get_instruction_pubkey_with_idx, + get_writable_with_idx, + }, + instruction_utils::InstructionUtils, + }, + MagicContext, +}; + +pub(crate) fn process_schedule_commit_finalize( + signers: HashSet, + invoke_context: &mut InvokeContext, + opts: ProcessScheduleCommitOptions, +) -> Result<(), InstructionError> { + const PAYER_IDX: u16 = 0; + const MAGIC_CONTEXT_IDX: u16 = PAYER_IDX + 1; + + schedule_transactions::check_magic_context_id( + invoke_context, + MAGIC_CONTEXT_IDX, + )?; + + let transaction_context = &invoke_context.transaction_context.clone(); + let ix_ctx = transaction_context.get_current_instruction_context()?; + let ix_accs_len = ix_ctx.get_number_of_instruction_accounts() as usize; + const COMMITTEES_START: usize = MAGIC_CONTEXT_IDX as usize + 1; + + // Assert MagicBlock program + ix_ctx + .find_index_of_program_account(transaction_context, &crate::id()) + .ok_or_else(|| { + ic_msg!( + invoke_context, + "ScheduleCommit ERR: Magic program account not found" + ); + InstructionError::UnsupportedProgramId + })?; + + // Assert enough accounts + if ix_accs_len <= COMMITTEES_START { + ic_msg!( + invoke_context, + "ScheduleCommit ERR: not enough accounts to schedule commit ({}), need payer, signing program an account for each pubkey to be committed", + ix_accs_len + ); + return Err(InstructionError::NotEnoughAccountKeys); + } + + // Assert Payer is signer + let payer_pubkey = + get_instruction_pubkey_with_idx(transaction_context, PAYER_IDX)?; + if !signers.contains(payer_pubkey) { + ic_msg!( + invoke_context, + "ScheduleCommit ERR: payer pubkey {} not in signers", + payer_pubkey + ); + return Err(InstructionError::MissingRequiredSignature); + } + + // + // Get the program_id of the parent instruction that invoked this one via CPI + // + + // We cannot easily simulate the transaction being invoked via CPI + // from the owning program during unit tests + // Instead the integration tests ensure that this works as expected + #[cfg(not(test))] + let frames = crate::utils::instruction_context_frames::InstructionContextFrames::try_from(transaction_context)?; + + // During unit tests we assume the first committee has the correct program ID + #[cfg(test)] + let first_committee_owner = { + *get_instruction_account_with_idx( + transaction_context, + COMMITTEES_START as u16, + )? + .borrow() + .owner() + }; + + #[cfg(not(test))] + let parent_program_id = { + let parent_program_id = + frames.find_program_id_of_parent_of_current_instruction(); + + ic_msg!( + invoke_context, + "ScheduleCommit: parent program id: {}", + parent_program_id + .map_or_else(|| "None".to_string(), |id| id.to_string()) + ); + + parent_program_id + }; + + #[cfg(test)] + let parent_program_id = Some(&first_committee_owner); + + // Assert all accounts are delegated, owned by invoking program OR are signers + // Also works if the validator authority is a signer + // NOTE: we don't require PDAs to be signers as in our case verifying that the + // program owning the PDAs invoked us directly via CPI is sufficient + // Thus we can be `invoke`d unsigned and no seeds need to be provided + let mut committed_accounts: Vec = Vec::new(); + for idx in COMMITTEES_START..ix_accs_len { + let acc_pubkey = + get_instruction_pubkey_with_idx(transaction_context, idx as u16)?; + let acc = + get_instruction_account_with_idx(transaction_context, idx as u16)?; + + if acc.borrow().confined() { + ic_msg!( + invoke_context, + "ScheduleCommit ERR: account {} is confined and cannot be committed", + acc_pubkey + ); + return Err(InstructionError::InvalidAccountData); + } + + { + let is_delegated = acc.borrow().delegated(); + + if opts.request_undelegation { + // Must be writable and delegated to avoid double-undelegation + let is_writable = + get_writable_with_idx(transaction_context, idx as u16)?; + if !is_writable || !is_delegated { + ic_msg!( + invoke_context, + "ScheduleCommit ERR: account {} is required to be writable and delegated in order to be undelegated", + acc_pubkey + ); + return Err(InstructionError::ReadonlyDataModified); + } + } else if !is_delegated { + ic_msg!( + invoke_context, + "ScheduleCommit ERR: account {} is required to be delegated to the current validator, in order to be committed", + acc_pubkey + ); + return Err(InstructionError::IllegalOwner); + } + + // Validate committed account was scheduled by valid authority + let acc_owner = *acc.borrow().owner(); + validate_commit_schedule_permissions( + &invoke_context, + &acc_owner, + acc_pubkey, + parent_program_id, + &signers, + )?; + + let committed = CommittedAccount::from_account_shared( + *acc_pubkey, + &acc.borrow(), + parent_program_id.cloned(), + ); + + if &committed.pubkey != acc_pubkey { + ic_msg!( + invoke_context, + "ScheduleCommit: remapping ATA {} -> eATA {}", + acc_pubkey, + committed.pubkey + ); + } + + committed_accounts.push(committed); + } + + if opts.request_undelegation { + // If the account is scheduled to be undelegated then we need to lock it + // immediately in order to prevent the following actions: + // - writes to the account + // - scheduling further commits for this account + // + // Setting the owner will prevent both, since in both cases the _actual_ + // owner program needs to sign for the account which is not possible at + // that point + // NOTE: this owner change only takes effect if the transaction which + // includes this instruction succeeds. + // + // We also set the undelegating flag on the account in order to detect + // undelegations for which we miss updates + mark_account_as_undelegated(acc); + ic_msg!( + invoke_context, + "ScheduleCommit: Marking account {} as undelegating", + acc_pubkey + ); + } + } + + // NOTE: this is only protected by all the above checks however if the + // instruction fails for other reasons detected afterward then the commit + // stays scheduled + let context_acc = get_instruction_account_with_idx( + transaction_context, + MAGIC_CONTEXT_IDX, + )?; + let context_data = &mut context_acc.borrow_mut(); + let mut context = + MagicContext::deserialize(context_data).map_err(|err| { + ic_msg!( + invoke_context, + "Failed to deserialize MagicContext: {}", + err + ); + InstructionError::GenericError + })?; + + // Get next intent id + let intent_id = context.next_intent_id(); + + // It appears that in builtin programs `Clock::get` doesn't work as expected, thus + // we have to get it directly from the sysvar cache. + let clock = + invoke_context + .get_sysvar_cache() + .get_clock() + .map_err(|err| { + ic_msg!(invoke_context, "Failed to get clock sysvar: {}", err); + InstructionError::UnsupportedSysvar + })?; + let blockhash = invoke_context.environment_config.blockhash; + let action_sent_transaction = + InstructionUtils::scheduled_commit_sent(intent_id, blockhash); + let commit_sent_sig = action_sent_transaction.signatures[0]; + + let base_intent = if opts.request_undelegation { + MagicBaseIntent::CommitFinalizeAndUndelegate(CommitAndUndelegate { + commit_action: CommitType::Standalone(committed_accounts), + undelegate_action: UndelegateType::Standalone, + }) + } else { + MagicBaseIntent::CommitFinalize(CommitType::Standalone( + committed_accounts, + )) + }; + + let scheduled_base_intent = ScheduledIntentBundle { + id: intent_id, + slot: clock.slot, + blockhash, + sent_transaction: action_sent_transaction, + payer: *payer_pubkey, + intent_bundle: base_intent.into(), + }; + + context.add_scheduled_action(scheduled_base_intent); + context_data.set_state(&context)?; + + ic_msg!(invoke_context, "Scheduled commit with ID: {}", intent_id); + ic_msg!( + invoke_context, + "ScheduledCommitSent signature: {}", + commit_sent_sig, + ); + + Ok(()) +} diff --git a/test-integration/Cargo.lock b/test-integration/Cargo.lock index 2502ceb77..aa0ad21b8 100644 --- a/test-integration/Cargo.lock +++ b/test-integration/Cargo.lock @@ -83,7 +83,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aba2aec0682aa448f93db9b93df8fb331c119cb4d66fe9ba61d6b42dd3a91105" dependencies = [ - "solana-hash", + "solana-hash 2.2.1", "solana-message", "solana-packet", "solana-pubkey", @@ -2894,7 +2894,7 @@ dependencies = [ "color-backtrace", "magicblock-config", "magicblock-core", - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "random-port", "rayon", "serde", @@ -3288,7 +3288,7 @@ dependencies = [ "magicblock-rpc-client", "rand 0.9.2", "solana-account", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-loader-v3-interface 3.0.0", "solana-loader-v4-interface", @@ -3314,7 +3314,7 @@ dependencies = [ "magicblock-committor-service", "magicblock-core", "magicblock-program", - "solana-hash", + "solana-hash 2.2.1", "solana-pubkey", "solana-transaction", "solana-transaction-error", @@ -3420,7 +3420,7 @@ dependencies = [ "solana-feature-set", "solana-fee-calculator", "solana-genesis-config", - "solana-hash", + "solana-hash 2.2.1", "solana-inline-spl", "solana-instruction", "solana-keypair", @@ -3430,7 +3430,7 @@ dependencies = [ "solana-pubkey", "solana-rent", "solana-rpc-client", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-signature", "solana-signer", "solana-system-program", @@ -3456,7 +3456,7 @@ dependencies = [ "magicblock-accounts-db", "magicblock-config", "magicblock-core", - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "magicblock-magic-program-api 0.8.0", "magicblock-metrics", "parking_lot", @@ -3468,7 +3468,7 @@ dependencies = [ "solana-clock", "solana-commitment-config", "solana-feature-set", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-loader-v3-interface 3.0.0", @@ -3521,7 +3521,7 @@ dependencies = [ "futures-util", "lru", "magicblock-committor-program", - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "magicblock-metrics", "magicblock-program", "magicblock-rpc-client", @@ -3532,7 +3532,7 @@ dependencies = [ "solana-address-lookup-table-interface", "solana-commitment-config", "solana-compute-budget-interface", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-message", @@ -3579,7 +3579,7 @@ dependencies = [ "magicblock-magic-program-api 0.8.0", "solana-account", "solana-account-decoder", - "solana-hash", + "solana-hash 2.2.1", "solana-program", "solana-pubkey", "solana-signature", @@ -3611,7 +3611,7 @@ dependencies = [ [[package]] name = "magicblock-delegation-program" version = "1.1.3" -source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372#2cb491032f372faa4cfdb55e3f05cefd7e07351d" +source = "git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer#1347f31982a57762bd9321c91a021a3d32bebe05" dependencies = [ "bincode", "borsh 1.6.0", @@ -3626,6 +3626,7 @@ dependencies = [ "solana-curve25519", "solana-program", "solana-security-txt", + "solana-sha256-hasher 3.1.0", "static_assertions", "strum 0.27.2", "thiserror 2.0.17", @@ -3651,7 +3652,7 @@ dependencies = [ "serde", "solana-account-decoder", "solana-clock", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-measure", @@ -3756,7 +3757,7 @@ dependencies = [ "solana-account-info", "solana-clock", "solana-fee-calculator", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-log-collector", @@ -3781,7 +3782,7 @@ dependencies = [ "solana-address-lookup-table-interface", "solana-clock", "solana-commitment-config", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-pubkey", "solana-rpc-client", @@ -3850,7 +3851,7 @@ dependencies = [ name = "magicblock-validator-admin" version = "0.8.0" dependencies = [ - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "magicblock-program", "magicblock-rpc-client", "solana-commitment-config", @@ -4788,7 +4789,7 @@ version = "0.0.0" dependencies = [ "borsh 1.6.0", "ephemeral-rollups-sdk", - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "magicblock-magic-program-api 0.8.0", "rkyv 0.7.45", "solana-program", @@ -4879,7 +4880,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", - "heck 0.5.0", + "heck 0.4.1", "itertools 0.12.1", "log", "multimap", @@ -4899,7 +4900,7 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ - "heck 0.5.0", + "heck 0.4.1", "itertools 0.12.1", "log", "multimap", @@ -5780,7 +5781,7 @@ dependencies = [ "borsh 1.6.0", "integration-test-tools", "magicblock-core", - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "program-schedulecommit", "solana-program", "solana-rpc-client", @@ -5798,7 +5799,7 @@ dependencies = [ "futures", "magicblock-committor-program", "magicblock-committor-service", - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "magicblock-program", "magicblock-rpc-client", "magicblock-table-mania", @@ -6358,7 +6359,7 @@ dependencies = [ "smallvec", "solana-bucket-map", "solana-clock", - "solana-hash", + "solana-hash 2.2.1", "solana-inline-spl", "solana-lattice-hash", "solana-measure", @@ -6484,7 +6485,7 @@ checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" dependencies = [ "num-bigint 0.4.6", "num-traits", - "solana-define-syscall", + "solana-define-syscall 2.2.1", ] [[package]] @@ -6505,8 +6506,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a0801e25a1b31a14494fc80882a036be0ffd290efc4c2d640bfcca120a4672" dependencies = [ "blake3", - "solana-define-syscall", - "solana-hash", + "solana-define-syscall 2.2.1", + "solana-hash 2.2.1", "solana-sanitize", ] @@ -6521,7 +6522,7 @@ dependencies = [ "ark-ff", "ark-serialize", "bytemuck", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "thiserror 2.0.17", ] @@ -6556,7 +6557,7 @@ dependencies = [ "solana-cpi", "solana-curve25519", "solana-feature-set", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keccak-hasher", "solana-loader-v3-interface 3.0.0", @@ -6573,7 +6574,7 @@ dependencies = [ "solana-sbpf", "solana-sdk-ids", "solana-secp256k1-recover", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-stable-layout", "solana-system-interface", "solana-sysvar", @@ -6670,7 +6671,7 @@ dependencies = [ "solana-commitment-config", "solana-connection-cache", "solana-epoch-info", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-measure", @@ -6704,7 +6705,7 @@ dependencies = [ "solana-account", "solana-commitment-config", "solana-epoch-info", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-message", @@ -6737,7 +6738,7 @@ checksum = "7ace9fea2daa28354d107ea879cff107181d85cd4e0f78a2bedb10e1a428c97e" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 2.2.1", ] [[package]] @@ -6888,7 +6889,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11" dependencies = [ "solana-account-info", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "solana-instruction", "solana-program-error", "solana-pubkey", @@ -6904,7 +6905,7 @@ dependencies = [ "bytemuck", "bytemuck_derive", "curve25519-dalek 4.1.3", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "subtle", "thiserror 2.0.17", ] @@ -6924,6 +6925,12 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf784bb2cb3e02cac9801813c30187344228d2ae952534902108f6150573a33d" +[[package]] +name = "solana-define-syscall" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e5b1c0bc1d4a4d10c88a4100499d954c09d3fecfae4912c1a074dff68b1738" + [[package]] name = "solana-derivation-path" version = "2.2.1" @@ -6968,7 +6975,7 @@ checksum = "86b575d3dd323b9ea10bb6fe89bf6bf93e249b215ba8ed7f68f1a3633f384db7" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 2.2.1", "solana-sdk-ids", "solana-sdk-macro", "solana-sysvar-id", @@ -6981,7 +6988,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c5fd2662ae7574810904585fd443545ed2b568dbd304b25a31e79ccc76e81b" dependencies = [ "siphasher 0.3.11", - "solana-hash", + "solana-hash 2.2.1", "solana-pubkey", ] @@ -7008,7 +7015,7 @@ dependencies = [ "serde_derive", "solana-address-lookup-table-interface", "solana-clock", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keccak-hasher", "solana-message", @@ -7047,9 +7054,9 @@ dependencies = [ "ahash 0.8.12", "lazy_static", "solana-epoch-schedule", - "solana-hash", + "solana-hash 2.2.1", "solana-pubkey", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", ] [[package]] @@ -7113,7 +7120,7 @@ dependencies = [ "solana-cluster-type", "solana-epoch-schedule", "solana-fee-calculator", - "solana-hash", + "solana-hash 2.2.1", "solana-inflation", "solana-keypair", "solana-logger", @@ -7122,7 +7129,7 @@ dependencies = [ "solana-pubkey", "solana-rent", "solana-sdk-ids", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-shred-version", "solana-signer", "solana-time-utils", @@ -7156,6 +7163,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "solana-hash" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a5d48a6ee7b91fc7b998944ab026ed7b3e2fc8ee3bc58452644a86c2648152f" + [[package]] name = "solana-inflation" version = "2.2.1" @@ -7189,7 +7202,7 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "solana-pubkey", "wasm-bindgen", ] @@ -7218,8 +7231,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" dependencies = [ "sha3", - "solana-define-syscall", - "solana-hash", + "solana-define-syscall 2.2.1", + "solana-hash 2.2.1", "solana-sanitize", ] @@ -7389,7 +7402,7 @@ dependencies = [ "serde", "serde_derive", "solana-bincode", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-pubkey", "solana-sanitize", @@ -7413,7 +7426,7 @@ dependencies = [ "reqwest", "solana-clock", "solana-cluster-type", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-time-utils", "thiserror 2.0.17", ] @@ -7424,7 +7437,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36a1a14399afaabc2781a1db09cb14ee4cc4ee5c7a5a3cfcc601811379a8092" dependencies = [ - "solana-define-syscall", + "solana-define-syscall 2.2.1", ] [[package]] @@ -7470,9 +7483,9 @@ dependencies = [ "serde", "serde_derive", "solana-fee-calculator", - "solana-hash", + "solana-hash 2.2.1", "solana-pubkey", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", ] [[package]] @@ -7482,7 +7495,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde971a20b8dbf60144d6a84439dda86b5466e00e2843091fe731083cda614da" dependencies = [ "solana-account", - "solana-hash", + "solana-hash 2.2.1", "solana-nonce", "solana-sdk-ids", ] @@ -7494,11 +7507,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b526398ade5dea37f1f147ce55dae49aa017a5d7326606359b0445ca8d946581" dependencies = [ "num_enum", - "solana-hash", + "solana-hash 2.2.1", "solana-packet", "solana-pubkey", "solana-sanitize", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-signature", "solana-signer", ] @@ -7537,7 +7550,7 @@ dependencies = [ "rand 0.8.5", "rayon", "serde", - "solana-hash", + "solana-hash 2.2.1", "solana-message", "solana-metrics", "solana-packet", @@ -7567,7 +7580,7 @@ checksum = "8ad1ea160d08dc423c35021fa3e437a5783eb256f5ab8bc3024e27db913acf42" dependencies = [ "ark-bn254", "light-poseidon", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "thiserror 2.0.17", ] @@ -7644,13 +7657,13 @@ dependencies = [ "solana-clock", "solana-cpi", "solana-decode-error", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "solana-epoch-rewards", "solana-epoch-schedule", "solana-example-mocks", "solana-feature-gate-interface", "solana-fee-calculator", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-instructions-sysvar", "solana-keccak-hasher", @@ -7675,7 +7688,7 @@ dependencies = [ "solana-secp256k1-recover", "solana-serde-varint", "solana-serialize-utils", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "solana-short-vec", "solana-slot-hashes", "solana-slot-history", @@ -7724,7 +7737,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b0268f6c89825fb634a34bd0c3b8fdaeaecfc3728be1d622a8ee6dd577b60d4" dependencies = [ "num-traits", - "solana-define-syscall", + "solana-define-syscall 2.2.1", ] [[package]] @@ -7762,7 +7775,7 @@ dependencies = [ "solana-epoch-rewards", "solana-epoch-schedule", "solana-feature-set", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-last-restart-slot", "solana-log-collector", @@ -7841,9 +7854,9 @@ dependencies = [ "serde_derive", "solana-atomic-u64", "solana-decode-error", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "solana-sanitize", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "wasm-bindgen", ] @@ -8011,7 +8024,7 @@ dependencies = [ "solana-epoch-info", "solana-epoch-schedule", "solana-feature-gate-interface", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-message", "solana-pubkey", @@ -8063,7 +8076,7 @@ checksum = "0244e2bf439ec424179414173cdc8b43e34371608752799c5610bf17430eee18" dependencies = [ "solana-account", "solana-commitment-config", - "solana-hash", + "solana-hash 2.2.1", "solana-message", "solana-nonce", "solana-pubkey", @@ -8168,7 +8181,7 @@ dependencies = [ "log", "solana-compute-budget", "solana-compute-budget-instruction", - "solana-hash", + "solana-hash 2.2.1", "solana-message", "solana-pubkey", "solana-sdk-ids", @@ -8320,7 +8333,7 @@ checksum = "baa3120b6cdaa270f39444f5093a90a7b03d296d362878f7a6991d6de3bbe496" dependencies = [ "borsh 1.6.0", "libsecp256k1", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "thiserror 2.0.17", ] @@ -8422,8 +8435,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0037386961c0d633421f53560ad7c80675c0447cba4d1bb66d60974dd486c7ea" dependencies = [ "sha2 0.10.9", - "solana-define-syscall", - "solana-hash", + "solana-define-syscall 2.2.1", + "solana-hash 2.2.1", +] + +[[package]] +name = "solana-sha256-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" +dependencies = [ + "solana-define-syscall 4.0.1", + "solana-hash 4.0.1", ] [[package]] @@ -8442,8 +8465,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afd3db0461089d1ad1a78d9ba3f15b563899ca2386351d38428faa5350c60a98" dependencies = [ "solana-hard-forks", - "solana-hash", - "solana-sha256-hasher", + "solana-hash 2.2.1", + "solana-sha256-hasher 2.2.1", ] [[package]] @@ -8480,7 +8503,7 @@ checksum = "0c8691982114513763e88d04094c9caa0376b867a29577939011331134c301ce" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 2.2.1", "solana-sdk-ids", "solana-sysvar-id", ] @@ -8568,7 +8591,7 @@ dependencies = [ "protobuf-src", "serde", "solana-account-decoder", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-message", "solana-pubkey", @@ -8646,7 +8669,7 @@ dependencies = [ "solana-compute-budget-instruction", "solana-feature-set", "solana-fee-structure", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-instructions-sysvar", "solana-loader-v4-program", @@ -8690,7 +8713,7 @@ dependencies = [ "solana-compute-budget-instruction", "solana-feature-set", "solana-fee-structure", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-instructions-sysvar", "solana-loader-v4-program", @@ -8732,7 +8755,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fc4392f0eed412141a376e99dfb052069b96f13697a9abb335504babe29387a" dependencies = [ - "solana-hash", + "solana-hash 2.2.1", "solana-message", "solana-pubkey", "solana-sdk-ids", @@ -8788,7 +8811,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bd98a25e5bcba8b6be8bcbb7b84b24c2a6a8178d7fb0e3077a916855ceba91a" dependencies = [ - "solana-hash", + "solana-hash 2.2.1", "solana-keypair", "solana-message", "solana-pubkey", @@ -8812,11 +8835,11 @@ dependencies = [ "serde_derive", "solana-account-info", "solana-clock", - "solana-define-syscall", + "solana-define-syscall 2.2.1", "solana-epoch-rewards", "solana-epoch-schedule", "solana-fee-calculator", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-instructions-sysvar", "solana-last-restart-slot", @@ -8859,7 +8882,7 @@ dependencies = [ "solana-commitment-config", "solana-connection-cache", "solana-epoch-info", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-message", @@ -8948,7 +8971,7 @@ dependencies = [ "serde_derive", "solana-bincode", "solana-feature-set", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-message", @@ -9028,7 +9051,7 @@ dependencies = [ "serde_json", "solana-account-decoder", "solana-clock", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-loader-v2-interface", "solana-message", @@ -9146,7 +9169,7 @@ dependencies = [ "solana-account", "solana-bincode", "solana-clock", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-packet", "solana-pubkey", @@ -9171,7 +9194,7 @@ dependencies = [ "serde_derive", "solana-clock", "solana-decode-error", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-pubkey", "solana-rent", @@ -9199,7 +9222,7 @@ dependencies = [ "solana-clock", "solana-epoch-schedule", "solana-feature-set", - "solana-hash", + "solana-hash 2.2.1", "solana-instruction", "solana-keypair", "solana-packet", @@ -9412,7 +9435,7 @@ checksum = "a7398da23554a31660f17718164e31d31900956054f54f52d5ec1be51cb4f4b3" dependencies = [ "bytemuck", "solana-program-error", - "solana-sha256-hasher", + "solana-sha256-hasher 2.2.1", "spl-discriminator-derive", ] @@ -10008,7 +10031,7 @@ dependencies = [ "integration-test-tools", "magicblock-chainlink", "magicblock-config", - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "program-flexi-counter", "program-mini", "solana-account", @@ -10092,7 +10115,7 @@ dependencies = [ "integration-test-tools", "magicblock-accounts-db", "magicblock-config", - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "program-flexi-counter", "solana-rpc-client", "solana-sdk", @@ -10113,7 +10136,7 @@ dependencies = [ "magic-domain-program", "magicblock-api", "magicblock-config", - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "magicblock-program", "magicblock-validator-admin", "solana-rpc-client", @@ -10153,7 +10176,7 @@ name = "test-schedule-intent" version = "0.0.0" dependencies = [ "integration-test-tools", - "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?rev=2cb491032f372)", + "magicblock-delegation-program 1.1.3 (git+https://github.com/magicblock-labs/delegation-program.git?branch=snawaz%2Fcommit-finalize-from-buffer)", "program-flexi-counter", "solana-rpc-client-api", "solana-sdk", @@ -11622,7 +11645,7 @@ dependencies = [ "solana-account", "solana-account-decoder", "solana-clock", - "solana-hash", + "solana-hash 2.2.1", "solana-message", "solana-pubkey", "solana-signature", diff --git a/test-integration/Cargo.toml b/test-integration/Cargo.toml index 3aeaaf5ed..cfc5185cf 100644 --- a/test-integration/Cargo.toml +++ b/test-integration/Cargo.toml @@ -60,7 +60,7 @@ magic-domain-program = { git = "https://github.com/magicblock-labs/magic-domain- "modular-sdk", ] } magicblock_magic_program_api = { package = "magicblock-magic-program-api", path = "../magicblock-magic-program-api" } -magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "2cb491032f372", features = [ +magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", branch = "snawaz/commit-finalize-from-buffer", features = [ "no-entrypoint", ] } magicblock-program = { path = "../programs/magicblock" } diff --git a/test-integration/programs/schedulecommit-security/src/lib.rs b/test-integration/programs/schedulecommit-security/src/lib.rs index 8236b40a7..a1e65c869 100644 --- a/test-integration/programs/schedulecommit-security/src/lib.rs +++ b/test-integration/programs/schedulecommit-security/src/lib.rs @@ -2,7 +2,7 @@ use borsh::{BorshDeserialize, BorshSerialize}; use ephemeral_rollups_sdk::ephem::create_schedule_commit_ix; use program_schedulecommit::{ api::schedule_commit_cpi_instruction, process_schedulecommit_cpi, - ProcessSchedulecommitCpiArgs, + ProcessSchedulecommitCpiArgs, ScheduleCommitType, }; use solana_program::{ account_info::{next_account_info, AccountInfo}, @@ -82,9 +82,9 @@ pub fn process_instruction<'a>( &players, ProcessSchedulecommitCpiArgs { modify_accounts: false, - undelegate: false, commit_payer: false, }, + ScheduleCommitType::Commit, ), } } @@ -124,6 +124,7 @@ fn process_sibling_schedule_cpis( *magic_context.key, players, &pdas, + ScheduleCommitType::Commit, ); let mut account_infos = account_infos .clone() diff --git a/test-integration/programs/schedulecommit/src/api.rs b/test-integration/programs/schedulecommit/src/api.rs index 8f359a56c..606097b04 100644 --- a/test-integration/programs/schedulecommit/src/api.rs +++ b/test-integration/programs/schedulecommit/src/api.rs @@ -10,7 +10,7 @@ use solana_program::{ use crate::{ BookUpdate, DelegateCpiArgs, DelegateOrderBookArgs, ScheduleCommitCpiArgs, - ScheduleCommitInstruction, + ScheduleCommitInstruction, ScheduleCommitType, }; #[derive(Debug, PartialEq, Eq, Clone, Copy)] @@ -180,6 +180,7 @@ pub fn schedule_commit_cpi_instruction( magic_context_id: Pubkey, players: &[Pubkey], committees: &[Pubkey], + commit_type: ScheduleCommitType, ) -> Instruction { schedule_commit_cpi_instruction_impl( payer, @@ -187,10 +188,8 @@ pub fn schedule_commit_cpi_instruction( magic_context_id, players, committees, - ScheduleCommitCpiInstructionImplArgs { - undelegate: false, - commit_payer: false, - }, + false, + commit_type, ) } @@ -212,11 +211,12 @@ pub fn update_order_book_instruction( ) } -pub fn schedule_commit_diff_instruction_for_order_book( +pub fn schedule_commit_instruction_for_order_book( payer: Pubkey, order_book: Pubkey, magic_program_id: Pubkey, magic_context_id: Pubkey, + commit_type: ScheduleCommitType, ) -> Instruction { let program_id = crate::id(); let account_metas = vec![ @@ -228,7 +228,7 @@ pub fn schedule_commit_diff_instruction_for_order_book( Instruction::new_with_borsh( program_id, - &ScheduleCommitInstruction::ScheduleCommitForOrderBook, + &ScheduleCommitInstruction::ScheduleCommitForOrderBook(commit_type), account_metas, ) } @@ -246,10 +246,8 @@ pub fn schedule_commit_with_payer_cpi_instruction( magic_context_id, players, committees, - ScheduleCommitCpiInstructionImplArgs { - undelegate: false, - commit_payer: true, - }, + true, + ScheduleCommitType::Commit, ) } @@ -266,25 +264,19 @@ pub fn schedule_commit_and_undelegate_cpi_instruction( magic_context_id, players, committees, - ScheduleCommitCpiInstructionImplArgs { - undelegate: true, - commit_payer: false, - }, + false, + ScheduleCommitType::CommitAndUndelegate, ) } -struct ScheduleCommitCpiInstructionImplArgs { - undelegate: bool, - commit_payer: bool, -} - fn schedule_commit_cpi_instruction_impl( payer: Pubkey, magic_program_id: Pubkey, magic_context_id: Pubkey, players: &[Pubkey], committees: &[Pubkey], - args: ScheduleCommitCpiInstructionImplArgs, + commit_payer: bool, + commit_type: ScheduleCommitType, ) -> Instruction { let program_id = crate::id(); let mut account_metas = vec![ @@ -299,10 +291,10 @@ fn schedule_commit_cpi_instruction_impl( let cpi_args = ScheduleCommitCpiArgs { players: players.to_vec(), modify_accounts: true, - undelegate: args.undelegate, - commit_payer: args.commit_payer, + commit_payer, }; - let ix = ScheduleCommitInstruction::ScheduleCommitCpi(cpi_args); + let ix = + ScheduleCommitInstruction::ScheduleCommitCpi(cpi_args, commit_type); Instruction::new_with_borsh(program_id, &ix, account_metas) } diff --git a/test-integration/programs/schedulecommit/src/lib.rs b/test-integration/programs/schedulecommit/src/lib.rs index 32d2e39f5..72a71ea16 100644 --- a/test-integration/programs/schedulecommit/src/lib.rs +++ b/test-integration/programs/schedulecommit/src/lib.rs @@ -6,7 +6,10 @@ use ephemeral_rollups_sdk::{ cpi::{ delegate_account, undelegate_account, DelegateAccounts, DelegateConfig, }, - ephem::{commit_accounts, commit_and_undelegate_accounts}, + ephem::{ + commit_accounts, commit_and_undelegate_accounts, + commit_finalize_accounts, commit_finalize_and_undelegate_accounts, + }, }; use magicblock_magic_program_api::instruction::MagicBlockInstruction; use solana_program::{ @@ -66,8 +69,6 @@ pub struct ScheduleCommitCpiArgs { pub players: Vec, /// If true, the accounts will be modified after the commit pub modify_accounts: bool, - /// If true, the accounts will be undelegated after the commit - pub undelegate: bool, /// If true, also commit the payer account pub commit_payer: bool, } @@ -96,7 +97,7 @@ pub enum ScheduleCommitInstruction { /// - **1** `[]` MagicContext (used to record scheduled commit) /// - **2** `[]` MagicBlock Program (used to schedule commit) /// - **3..n** `[]` PDA accounts to be committed - ScheduleCommitCpi(ScheduleCommitCpiArgs), + ScheduleCommitCpi(ScheduleCommitCpiArgs, ScheduleCommitType), /// Same instruction input like [ScheduleCommitInstruction::ScheduleCommitCpi]. /// Behavior differs that it will modify the accounts after it @@ -157,7 +158,53 @@ pub enum ScheduleCommitInstruction { UpdateOrderBook(BookUpdate), /// ScheduleCommitDiffCpi - ScheduleCommitForOrderBook, + ScheduleCommitForOrderBook(ScheduleCommitType), +} + +#[derive(BorshSerialize, BorshDeserialize, Debug, Clone, Copy)] +pub enum ScheduleCommitType { + Commit, + CommitAndUndelegate, + CommitFinalize, + CommitFinalizeAndUndelegate, +} + +impl ScheduleCommitType { + fn invoke_commit<'a, 'info>( + self, + payer: &'a AccountInfo<'info>, + accounts: Vec<&'a AccountInfo<'info>>, + magic_context: &'a AccountInfo<'info>, + magic_program: &'a AccountInfo<'info>, + ) -> ProgramResult { + match self { + ScheduleCommitType::Commit => { + commit_accounts(payer, accounts, magic_context, magic_program) + } + ScheduleCommitType::CommitAndUndelegate => { + commit_and_undelegate_accounts( + payer, + accounts, + magic_context, + magic_program, + ) + } + ScheduleCommitType::CommitFinalize => commit_finalize_accounts( + payer, + accounts, + magic_context, + magic_program, + ), + ScheduleCommitType::CommitFinalizeAndUndelegate => { + commit_finalize_and_undelegate_accounts( + payer, + accounts, + magic_context, + magic_program, + ) + } + } + } } pub fn process_instruction<'a>( @@ -187,14 +234,14 @@ pub fn process_instruction<'a>( match ix { Init => process_init(program_id, accounts), DelegateCpi(args) => process_delegate_cpi(accounts, args), - ScheduleCommitCpi(args) => process_schedulecommit_cpi( + ScheduleCommitCpi(args, commit_type) => process_schedulecommit_cpi( accounts, &args.players, ProcessSchedulecommitCpiArgs { modify_accounts: args.modify_accounts, - undelegate: args.undelegate, commit_payer: args.commit_payer, }, + commit_type, ), ScheduleCommitAndUndelegateCpiModAfter(players) => { process_schedulecommit_and_undelegation_cpi_with_mod_after( @@ -214,8 +261,8 @@ pub fn process_instruction<'a>( } DelegateOrderBook(args) => process_delegate_order_book(accounts, args), UpdateOrderBook(args) => process_update_order_book(accounts, args), - ScheduleCommitForOrderBook => { - process_schedulecommit_for_orderbook(accounts) + ScheduleCommitForOrderBook(commit_type) => { + process_schedulecommit_for_orderbook(accounts, commit_type) } } } @@ -448,6 +495,7 @@ fn process_update_order_book<'a>( // ----------------- pub fn process_schedulecommit_for_orderbook( accounts: &[AccountInfo], + commit_type: ScheduleCommitType, ) -> Result<(), ProgramError> { msg!("Processing schedulecommit (for orderbook) instruction"); @@ -458,7 +506,7 @@ pub fn process_schedulecommit_for_orderbook( assert_is_signer(payer, "payer")?; - commit_and_undelegate_accounts( + commit_type.invoke_commit( payer, vec![order_book_account], magic_context, @@ -510,7 +558,6 @@ pub fn process_delegate_cpi( pub struct ProcessSchedulecommitCpiArgs { pub modify_accounts: bool, - pub undelegate: bool, pub commit_payer: bool, } @@ -521,6 +568,7 @@ pub fn process_schedulecommit_cpi( accounts: &[AccountInfo], player_pubkeys: &[Pubkey], args: ProcessSchedulecommitCpiArgs, + commit_type: ScheduleCommitType, ) -> Result<(), ProgramError> { msg!("Processing schedulecommit_cpi instruction"); @@ -573,16 +621,12 @@ pub fn process_schedulecommit_cpi( committees.iter().map(|x| x.key).collect::>() ); - if args.undelegate { - commit_and_undelegate_accounts( - payer, - committees, - magic_context, - magic_program, - )?; - } else { - commit_accounts(payer, committees, magic_context, magic_program)?; - } + commit_type.invoke_commit( + payer, + committees, + magic_context, + magic_program, + )?; Ok(()) } diff --git a/test-integration/schedulecommit/elfs/dlp.so b/test-integration/schedulecommit/elfs/dlp.so index 0a9abca45be04b0296cf358f3cb1723c93e820d5..82a0bcb6dc381ba4b558591010551a9afa9d8c94 100755 GIT binary patch literal 374312 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

VM$Va&kPQS3<*wm9iX`mNe59hVRNs>uJuf0eKA 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 I*F2pQfOT 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 Z?CxvBvF{c1|1>A>(), &committees.iter().map(|(_, pda)| *pda).collect::>(), + program_schedulecommit::ScheduleCommitType::Commit, ); let ephem_blockhash = ephem_client.get_latest_blockhash().unwrap(); @@ -123,6 +124,7 @@ fn test_committing_two_accounts() { .map(|(player, _)| player.pubkey()) .collect::>(), &committees.iter().map(|(_, pda)| *pda).collect::>(), + program_schedulecommit::ScheduleCommitType::Commit, ); let ephem_blockhash = ephem_client.get_latest_blockhash().unwrap(); @@ -319,9 +321,15 @@ fn schedule_commit_cpi_illegal_owner( let cpi_args = ScheduleCommitCpiArgs { players: players.to_vec(), modify_accounts: false, - undelegate: is_undelegate, commit_payer: true, }; - let ix = ScheduleCommitInstruction::ScheduleCommitCpi(cpi_args); + let ix = ScheduleCommitInstruction::ScheduleCommitCpi( + cpi_args, + if is_undelegate { + ScheduleCommitType::CommitAndUndelegate + } else { + ScheduleCommitType::Commit + }, + ); Instruction::new_with_borsh(program_id, &ix, account_metas) } diff --git a/test-integration/schedulecommit/test-scenarios/tests/02_commit_and_undelegate.rs b/test-integration/schedulecommit/test-scenarios/tests/02_commit_and_undelegate.rs index 5973b34a6..53231f5e7 100644 --- a/test-integration/schedulecommit/test-scenarios/tests/02_commit_and_undelegate.rs +++ b/test-integration/schedulecommit/test-scenarios/tests/02_commit_and_undelegate.rs @@ -9,10 +9,10 @@ use program_schedulecommit::{ schedule_commit_and_undelegate_cpi_instruction, schedule_commit_and_undelegate_cpi_twice, schedule_commit_and_undelegate_cpi_with_mod_after_instruction, - schedule_commit_diff_instruction_for_order_book, set_count_instruction, + schedule_commit_instruction_for_order_book, set_count_instruction, update_order_book_instruction, UserSeeds, }, - BookUpdate, OrderLevel, FAIL_UNDELEGATION_COUNT, + BookUpdate, OrderLevel, ScheduleCommitType, FAIL_UNDELEGATION_COUNT, }; use rand::{RngCore, SeedableRng}; use schedulecommit_client::{ @@ -42,7 +42,10 @@ use utils::{ get_context_with_delegated_committees, }; -use crate::utils::assert_is_one_of_instruction_errors; +use crate::utils::{ + assert_is_one_of_instruction_errors, + assert_one_committee_account_was_not_undelegated_on_chain, +}; mod utils; @@ -110,8 +113,9 @@ fn commit_and_undelegate_one_account( (ctx, *sig, tx_res) } -fn commit_and_undelegate_order_book_account( +fn commit_order_book_account( update: BookUpdate, + commit_type: ScheduleCommitType, ) -> ( ScheduleCommitTestContext, Signature, @@ -134,11 +138,12 @@ fn commit_and_undelegate_order_book_account( committees[0].1, update, ), - schedule_commit_diff_instruction_for_order_book( + schedule_commit_instruction_for_order_book( payer_ephem.pubkey(), committees[0].1, magicblock_magic_program_api::id(), magicblock_magic_program_api::MAGIC_CONTEXT_PUBKEY, + commit_type, ), ]; @@ -298,7 +303,34 @@ fn test_committing_and_undelegating_one_account() { } #[test] -fn test_committing_and_undelegating_huge_order_book_account() { +fn test_commit_huge_order_book_account() { + run_test_for_commit_huge_order_book_account(ScheduleCommitType::Commit); +} + +#[test] +fn test_commit_and_undelegate_huge_order_book_account() { + run_test_for_commit_huge_order_book_account( + ScheduleCommitType::CommitAndUndelegate, + ); +} + +#[test] +fn test_commit_finalize_huge_order_book_account() { + run_test_for_commit_huge_order_book_account( + ScheduleCommitType::CommitFinalize, + ); +} + +#[test] +fn test_commit_finalize_and_undelegate_huge_order_book_account() { + run_test_for_commit_huge_order_book_account( + ScheduleCommitType::CommitFinalizeAndUndelegate, + ); +} + +fn run_test_for_commit_huge_order_book_account( + commit_type: ScheduleCommitType, +) { run_test!({ let (rng_seed, update) = { use rand::{ @@ -324,8 +356,11 @@ fn test_committing_and_undelegating_huge_order_book_account() { (rng_seed, update) }; let (ctx, sig, tx_res) = - commit_and_undelegate_order_book_account(update.clone()); - info!("'{}' {:?}", sig, tx_res); + commit_order_book_account(update.clone(), commit_type); + println!( + "run_test_for_commit_huge_order_book_account: '{}' {:?}", + sig, tx_res + ); let res = verify::fetch_and_verify_order_book_commit_result_from_logs( &ctx, sig, @@ -357,7 +392,18 @@ fn test_committing_and_undelegating_huge_order_book_account() { ); assert_one_committee_was_committed(&ctx, &res, true); - assert_one_committee_account_was_undelegated_on_chain(&ctx); + match commit_type { + ScheduleCommitType::Commit => { + assert_one_committee_account_was_not_undelegated_on_chain(&ctx); + } + ScheduleCommitType::CommitFinalize => { + assert_one_committee_account_was_not_undelegated_on_chain(&ctx); + } + ScheduleCommitType::CommitAndUndelegate + | ScheduleCommitType::CommitFinalizeAndUndelegate => { + assert_one_committee_account_was_undelegated_on_chain(&ctx); + } + } }); } diff --git a/test-integration/schedulecommit/test-scenarios/tests/utils/mod.rs b/test-integration/schedulecommit/test-scenarios/tests/utils/mod.rs index 342f94ed2..d2a49417a 100644 --- a/test-integration/schedulecommit/test-scenarios/tests/utils/mod.rs +++ b/test-integration/schedulecommit/test-scenarios/tests/utils/mod.rs @@ -28,9 +28,13 @@ pub fn get_context_with_delegated_committees( let txhash = ctx.init_committees().unwrap(); println!("txhash (init_committees): {}", txhash); + ctx.dump_chain_logs(txhash); + let txhash = ctx.delegate_committees().unwrap(); println!("txhash (delegate_committees): {}", txhash); + ctx.dump_chain_logs(txhash); + ctx } @@ -53,6 +57,13 @@ pub fn assert_one_committee_was_committed( let commit = res.included.get(&pda); assert!(commit.is_some(), "should have committed pda"); + println!( + "PDA:{}, included: {:#?}, sigs: {:#?}", + pda, + res.included.keys(), + res.sigs + ); + // SingleStage Commit & Finalize result in 1 tx // TwoStage results in 2 signatures on base layer let sig_len = if is_single_stage { 1 } else { 2 }; @@ -195,6 +206,15 @@ pub fn assert_one_committee_account_was_undelegated_on_chain( assert_account_was_undelegated_on_chain(ctx, pda, id); } +#[allow(dead_code)] // used in 02_commit_and_undelegate.rs +pub fn assert_one_committee_account_was_not_undelegated_on_chain( + ctx: &ScheduleCommitTestContext, +) { + let pda = ctx.committees[0].1; + let id = program_schedulecommit::id(); + assert_account_was_not_undelegated_on_chain(ctx, pda, id); +} + #[allow(dead_code)] // used in 02_commit_and_undelegate.rs pub fn assert_two_committee_accounts_were_undelegated_on_chain( ctx: &ScheduleCommitTestContext, @@ -221,6 +241,25 @@ pub fn assert_account_was_undelegated_on_chain( assert_eq!(owner, new_owner, "{} has new owner", pda); } +#[allow(dead_code)] // used in 02_commit_and_undelegate.rs +pub fn assert_account_was_not_undelegated_on_chain( + ctx: &ScheduleCommitTestContext, + pda: Pubkey, + program_id: Pubkey, +) { + let owner = ctx.fetch_chain_account_owner(pda).unwrap(); + assert_ne!( + owner, program_id, + "{} should not be owned by {} as it is delegated", + pda, program_id + ); + assert_eq!( + owner, DELEGATION_PROGRAM_ID, + "{} should be owned by delegation program", + pda + ); +} + #[allow(dead_code)] // used in tests pub fn assert_is_instruction_error( tx_err: TransactionError, diff --git a/test-integration/schedulecommit/test-security/tests/01_invocations.rs b/test-integration/schedulecommit/test-security/tests/01_invocations.rs index 8fa8ed255..3b3babfb1 100644 --- a/test-integration/schedulecommit/test-security/tests/01_invocations.rs +++ b/test-integration/schedulecommit/test-security/tests/01_invocations.rs @@ -1,4 +1,7 @@ -use program_schedulecommit::api::{schedule_commit_cpi_instruction, UserSeeds}; +use program_schedulecommit::{ + api::{schedule_commit_cpi_instruction, UserSeeds}, + ScheduleCommitType, +}; use schedulecommit_client::{ ScheduleCommitTestContext, ScheduleCommitTestContextFields, }; @@ -296,6 +299,7 @@ fn test_schedule_commit_via_direct_and_from_other_program_indirect_cpi_including magicblock_magic_program_api::MAGIC_CONTEXT_PUBKEY, players, pdas, + ScheduleCommitType::Commit, ); let nested_cpi_ix = diff --git a/test-integration/test-committor-service/tests/test_ix_commit_local.rs b/test-integration/test-committor-service/tests/test_ix_commit_local.rs index 0a0417fce..f4276ec86 100644 --- a/test-integration/test-committor-service/tests/test_ix_commit_local.rs +++ b/test-integration/test-committor-service/tests/test_ix_commit_local.rs @@ -18,6 +18,7 @@ use magicblock_program::magic_scheduled_base_intent::{ }; use magicblock_rpc_client::MagicblockRpcClient; use program_flexi_counter::state::FlexiCounter; +use program_schedulecommit::ScheduleCommitType; use solana_account::{Account, ReadableAccount}; use solana_pubkey::Pubkey; use solana_rpc_client::nonblocking::rpc_client::RpcClient; @@ -66,62 +67,122 @@ fn expect_strategies( #[tokio::test] async fn test_ix_commit_single_account_100_bytes() { - commit_single_account(100, CommitStrategy::StateArgs, false).await; + commit_single_account( + 100, + CommitStrategy::StateArgs, + ScheduleCommitType::Commit, + ) + .await; } #[tokio::test] async fn test_ix_commit_single_account_100_bytes_and_undelegate() { - commit_single_account(100, CommitStrategy::StateArgs, true).await; + commit_single_account( + 100, + CommitStrategy::StateArgs, + ScheduleCommitType::CommitAndUndelegate, + ) + .await; } #[tokio::test] async fn test_ix_commit_single_account_256_bytes() { - commit_single_account(256, CommitStrategy::StateArgs, false).await; + commit_single_account( + 256, + CommitStrategy::StateArgs, + ScheduleCommitType::Commit, + ) + .await; } #[tokio::test] async fn test_ix_commit_single_account_257_bytes() { - commit_single_account(257, CommitStrategy::DiffArgs, false).await; + commit_single_account( + 257, + CommitStrategy::DiffArgs, + ScheduleCommitType::Commit, + ) + .await; } #[tokio::test] async fn test_ix_commit_single_account_256_bytes_and_undelegate() { - commit_single_account(256, CommitStrategy::StateArgs, true).await; + commit_single_account( + 256, + CommitStrategy::StateArgs, + ScheduleCommitType::CommitAndUndelegate, + ) + .await; } #[tokio::test] async fn test_ix_commit_single_account_257_bytes_and_undelegate() { - commit_single_account(257, CommitStrategy::DiffArgs, true).await; + commit_single_account( + 257, + CommitStrategy::DiffArgs, + ScheduleCommitType::CommitAndUndelegate, + ) + .await; } #[tokio::test] async fn test_ix_commit_single_account_800_bytes() { - commit_single_account(800, CommitStrategy::DiffArgs, false).await; + commit_single_account( + 800, + CommitStrategy::DiffArgs, + ScheduleCommitType::Commit, + ) + .await; } #[tokio::test] async fn test_ix_commit_single_account_800_bytes_and_undelegate() { - commit_single_account(800, CommitStrategy::DiffArgs, true).await; + commit_single_account( + 800, + CommitStrategy::DiffArgs, + ScheduleCommitType::CommitAndUndelegate, + ) + .await; } #[tokio::test] async fn test_ix_commit_single_account_one_kb() { - commit_single_account(1024, CommitStrategy::DiffArgs, false).await; + commit_single_account( + 1024, + CommitStrategy::DiffArgs, + ScheduleCommitType::Commit, + ) + .await; } #[tokio::test] async fn test_ix_commit_single_account_ten_kb() { - commit_single_account(10 * 1024, CommitStrategy::DiffArgs, false).await; + commit_single_account( + 10 * 1024, + CommitStrategy::DiffArgs, + ScheduleCommitType::Commit, + ) + .await; } #[tokio::test] async fn test_ix_commit_order_book_change_100_bytes() { - commit_book_order_account(100, CommitStrategy::DiffArgs, false).await; + commit_book_order_account( + 100, + CommitStrategy::DiffArgs, + ScheduleCommitType::Commit, + ) + .await; } #[tokio::test] async fn test_ix_commit_order_book_change_671_bytes() { - commit_book_order_account(671, CommitStrategy::DiffArgs, false).await; + commit_book_order_account( + 671, + CommitStrategy::DiffArgs, + ScheduleCommitType::Commit, + ) + .await; } #[tokio::test] @@ -130,19 +191,38 @@ async fn test_ix_commit_order_book_change_681_bytes() { // of size 1644 (which is the max limit), but while the size of raw bytes for 680 is within // 1232 limit, the size for 681 exceeds by 1 (1233). That is why we used // 681 as changed_len where CommitStrategy goes from Args to FromBuffer. - commit_book_order_account(681, CommitStrategy::DiffBuffer, false).await; + commit_book_order_account( + 681, + CommitStrategy::DiffBuffer, + ScheduleCommitType::Commit, + ) + .await; } #[tokio::test] async fn test_ix_commit_order_book_change_10k_bytes() { - commit_book_order_account(10 * 1024, CommitStrategy::DiffBuffer, false) - .await; + commit_book_order_account( + 10 * 1024, + CommitStrategy::DiffBuffer, + ScheduleCommitType::CommitAndUndelegate, + ) + .await; +} + +#[tokio::test] +async fn test_ix_commit_finalize_order_book_change_10k_bytes() { + commit_book_order_account( + 10 * 1024, + CommitStrategy::DiffBuffer, + ScheduleCommitType::CommitFinalize, + ) + .await; } async fn commit_single_account( bytes: usize, expected_strategy: CommitStrategy, - undelegate: bool, + commit_type: ScheduleCommitType, ) { init_logger!(); @@ -178,13 +258,27 @@ async fn commit_single_account( account, remote_slot: Default::default(), }; - let base_intent = if undelegate { - MagicBaseIntent::CommitAndUndelegate(CommitAndUndelegate { - commit_action: CommitType::Standalone(vec![account]), - undelegate_action: UndelegateType::Standalone, - }) - } else { - MagicBaseIntent::Commit(CommitType::Standalone(vec![account])) + let base_intent = match commit_type { + ScheduleCommitType::Commit => { + MagicBaseIntent::Commit(CommitType::Standalone(vec![account])) + } + ScheduleCommitType::CommitAndUndelegate => { + MagicBaseIntent::CommitAndUndelegate(CommitAndUndelegate { + commit_action: CommitType::Standalone(vec![account]), + undelegate_action: UndelegateType::Standalone, + }) + } + ScheduleCommitType::CommitFinalize => { + MagicBaseIntent::CommitFinalize(CommitType::Standalone(vec![ + account, + ])) + } + ScheduleCommitType::CommitFinalizeAndUndelegate => { + MagicBaseIntent::CommitFinalizeAndUndelegate(CommitAndUndelegate { + commit_action: CommitType::Standalone(vec![account]), + undelegate_action: UndelegateType::Standalone, + }) + } }; let intent = ScheduledIntentBundle { @@ -201,6 +295,7 @@ async fn commit_single_account( service, vec![intent], expect_strategies(&[(expected_strategy, 1)]), + program_flexi_counter::ID, ) .await; } @@ -208,7 +303,7 @@ async fn commit_single_account( async fn commit_book_order_account( changed_len: usize, expected_strategy: CommitStrategy, - undelegate: bool, + commit_type: ScheduleCommitType, ) { init_logger!(); @@ -242,13 +337,27 @@ async fn commit_book_order_account( account: order_book_ac, remote_slot: Default::default(), }; - let base_intent = if undelegate { - MagicBaseIntent::CommitAndUndelegate(CommitAndUndelegate { - commit_action: CommitType::Standalone(vec![account]), - undelegate_action: UndelegateType::Standalone, - }) - } else { - MagicBaseIntent::Commit(CommitType::Standalone(vec![account])) + let base_intent = match commit_type { + ScheduleCommitType::Commit => { + MagicBaseIntent::Commit(CommitType::Standalone(vec![account])) + } + ScheduleCommitType::CommitAndUndelegate => { + MagicBaseIntent::CommitAndUndelegate(CommitAndUndelegate { + commit_action: CommitType::Standalone(vec![account]), + undelegate_action: UndelegateType::Standalone, + }) + } + ScheduleCommitType::CommitFinalize => { + MagicBaseIntent::CommitFinalize(CommitType::Standalone(vec![ + account, + ])) + } + ScheduleCommitType::CommitFinalizeAndUndelegate => { + MagicBaseIntent::CommitFinalizeAndUndelegate(CommitAndUndelegate { + commit_action: CommitType::Standalone(vec![account]), + undelegate_action: UndelegateType::Standalone, + }) + } }; let intent = ScheduledIntentBundle { @@ -264,6 +373,7 @@ async fn commit_book_order_account( service, vec![intent], expect_strategies(&[(expected_strategy, 1)]), + program_schedulecommit::ID, ) .await; } @@ -621,7 +731,13 @@ async fn commit_multiple_accounts( }) .collect::>(); - ix_commit_local(service, intents, expected_strategies).await; + ix_commit_local( + service, + intents, + expected_strategies, + program_flexi_counter::ID, + ) + .await; } async fn execute_intent_bundle( @@ -667,7 +783,13 @@ async fn execute_intent_bundle( payer: Pubkey::new_unique(), intent_bundle, }; - ix_commit_local(service, vec![intent_bundle], expected_strategies).await; + ix_commit_local( + service, + vec![intent_bundle], + expected_strategies, + program_flexi_counter::id(), + ) + .await; } // TODO(thlorenz/snawaz): once delegation program supports larger commits add the following @@ -701,6 +823,7 @@ async fn ix_commit_local( service: CommittorServiceExt, intent_bundles: Vec, expected_strategies: ExpectedStrategies, + program_id: Pubkey, ) { let execution_outputs = service .schedule_intent_bundles_waiting(intent_bundles.clone()) @@ -751,16 +874,28 @@ async fn ix_commit_local( } let committed_accounts = base_intent.get_commit_intent_accounts(); + + let committed_finalize_accounts = + base_intent.get_commit_finalize_intent_accounts(); + let undelegated_accounts = base_intent.get_undelegate_intent_accounts(); - let mut committed_accounts: HashMap = - [(false, committed_accounts), (true, undelegated_accounts)] - .into_iter() - .flat_map(|(allow_undelegation, accounts)| { - accounts.into_iter().flatten().map(move |account| { - (account.pubkey, (allow_undelegation, account)) - }) - }) - .collect(); + + let commit_finalized_and_undelegated_accounts = + base_intent.get_commit_finalize_and_undelegate_intent_accounts(); + + let mut committed_accounts: HashMap = [ + (false, committed_accounts), + (true, undelegated_accounts), + (false, committed_finalize_accounts), + (true, commit_finalized_and_undelegated_accounts), + ] + .into_iter() + .flat_map(|(allow_undelegation, accounts)| { + accounts.into_iter().flatten().map(move |account| { + (account.pubkey, (allow_undelegation, account)) + }) + }) + .collect(); let statuses = service .get_commit_statuses(base_intent.id) @@ -777,17 +912,15 @@ async fn ix_commit_local( ); assert_eq!(statuses.len(), committed_accounts.len()); + for commit_status in statuses { let (is_undelegate, account) = committed_accounts .remove(&commit_status.pubkey) .expect("Account should be persisted"); // When we finalize it is possible to also undelegate the account - let expected_owner = if is_undelegate { - program_flexi_counter::id() - } else { - dlp::id() - }; + let expected_owner = + if is_undelegate { program_id } else { dlp::id() }; let lamports = account.account.lamports; get_account!( diff --git a/test-integration/test-committor-service/tests/utils/transactions.rs b/test-integration/test-committor-service/tests/utils/transactions.rs index b1f44e209..886c6ca8f 100644 --- a/test-integration/test-committor-service/tests/utils/transactions.rs +++ b/test-integration/test-committor-service/tests/utils/transactions.rs @@ -141,7 +141,9 @@ pub async fn tx_logs_contain( // in the logs when needle == CommitState. It's easier to make this little adjustment here than computing // the decision and passing either CommitState or CommitDiff from the tests themselves. if needle == "CommitState" { - log.contains(needle) || log.contains("CommitDiff") + log.contains(needle) + || log.contains("CommitDiff") + || log.contains("CommitFinalize") } else { log.contains(needle) } From a281d23937ac6b95e6b6ab4ef6af7089946b002e Mon Sep 17 00:00:00 2001 From: Sarfaraz Nawaz Date: Fri, 20 Feb 2026 16:00:25 +0530 Subject: [PATCH 2/2] fix rabbit issues and cleanup --- .../src/intent_executor/mod.rs | 4 ++-- .../src/tasks/task_builder.rs | 2 -- magicblock-validator/src/main.rs | 1 - .../src/magic_scheduled_base_intent.rs | 9 ++------- test-integration/Cargo.lock | 14 +++++++------- test-integration/Cargo.toml | 2 +- test-integration/schedulecommit/elfs/dlp.so | Bin 374312 -> 374304 bytes .../tests/02_commit_and_undelegate.rs | 5 +---- 8 files changed, 13 insertions(+), 24 deletions(-) diff --git a/magicblock-committor-service/src/intent_executor/mod.rs b/magicblock-committor-service/src/intent_executor/mod.rs index e300c10ab..972ee0f13 100644 --- a/magicblock-committor-service/src/intent_executor/mod.rs +++ b/magicblock-committor-service/src/intent_executor/mod.rs @@ -162,8 +162,8 @@ where if all_committed_pubkeys.is_empty() { // Build tasks for commit stage - // TODO (snawaz): it's actually MagicBaseIntent::BaseActionse scenario, not Commit - // scenario. The related code needs little bit of refactoring. + // TODO (snawaz): it's actually MagicBaseIntent::BaseActions scenario, not Commit + // scenario, so the related code needs little bit of refactoring and proper renaming. let commit_tasks = TaskBuilderImpl::commit_tasks( &self.task_info_fetcher, &intent_bundle, diff --git a/magicblock-committor-service/src/tasks/task_builder.rs b/magicblock-committor-service/src/tasks/task_builder.rs index f5032dad1..c42c28adc 100644 --- a/magicblock-committor-service/src/tasks/task_builder.rs +++ b/magicblock-committor-service/src/tasks/task_builder.rs @@ -247,8 +247,6 @@ impl TasksBuilder for TaskBuilderImpl { }); let base_account = base_accounts.remove(&account.pubkey); - println!("commit_tasks: finalize = {}", finalize); - let task = if finalize { Self::create_commit_finalize_task(commit_id, allow_undelegation, account.clone(), base_account) } else { diff --git a/magicblock-validator/src/main.rs b/magicblock-validator/src/main.rs index ec47e9032..cf1bf9790 100644 --- a/magicblock-validator/src/main.rs +++ b/magicblock-validator/src/main.rs @@ -52,7 +52,6 @@ async fn run() { #[cfg(feature = "tokio-console")] console_subscriber::init(); let args = std::env::args_os(); - println!("cli args: {:?}", args); let config = match ValidatorParams::try_new(args) { Ok(c) => c, Err(err) => { diff --git a/programs/magicblock/src/magic_scheduled_base_intent.rs b/programs/magicblock/src/magic_scheduled_base_intent.rs index ae2a0331f..2f90c6b4e 100644 --- a/programs/magicblock/src/magic_scheduled_base_intent.rs +++ b/programs/magicblock/src/magic_scheduled_base_intent.rs @@ -125,7 +125,7 @@ impl ScheduledIntentBundle { self.intent_bundle.get_commit_intent_accounts() } - /// Returns `[CommitAndUndelegate]` intent's accounts + /// Returns `[CommitFinalizeAndUndelegate]` intent's accounts pub fn get_commit_finalize_and_undelegate_intent_accounts( &self, ) -> Option<&Vec> { @@ -133,7 +133,7 @@ impl ScheduledIntentBundle { .get_commit_finalize_and_undelegate_intent_accounts() } - /// Returns `Commit` intent's accounts + /// Returns `CommitFinalize` intent's accounts pub fn get_commit_finalize_intent_accounts( &self, ) -> Option<&Vec> { @@ -159,11 +159,6 @@ impl ScheduledIntentBundle { self.intent_bundle.has_undelegate_intent() } - // pub fn is_commit_finalize(&self) -> bool { - // todo!("is_commit_finalize") - // // self.intent_bundle.is_commit_finalize() - // } - pub fn is_empty(&self) -> bool { self.intent_bundle.is_empty() } diff --git a/test-integration/Cargo.lock b/test-integration/Cargo.lock index aa0ad21b8..d703a03b6 100644 --- a/test-integration/Cargo.lock +++ b/test-integration/Cargo.lock @@ -1700,7 +1700,7 @@ dependencies = [ [[package]] name = "ephemeral-rollups-sdk" version = "0.8.5" -source = "git+https://github.com/magicblock-labs/ephemeral-rollups-sdk.git?rev=d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6#d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6" +source = "git+https://github.com/magicblock-labs/ephemeral-rollups-sdk.git?rev=95bb6373a0f7c741a84030c8d0fdcb3e0359afb1#95bb6373a0f7c741a84030c8d0fdcb3e0359afb1" dependencies = [ "base64ct", "borsh 0.10.4", @@ -1710,7 +1710,7 @@ dependencies = [ "ephemeral-rollups-sdk-attribute-ephemeral", "getrandom 0.2.16", "magicblock-delegation-program 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "magicblock-magic-program-api 0.8.0 (git+https://github.com/magicblock-labs/magicblock-validator.git?branch=snawaz%2Fschedule-commit-finalize)", + "magicblock-magic-program-api 0.8.0 (git+https://github.com/magicblock-labs/magicblock-validator.git?rev=34585f091d1debbe19232d07d332afbeb5f93872)", "solana-account", "solana-account-info", "solana-cpi", @@ -1725,7 +1725,7 @@ dependencies = [ [[package]] name = "ephemeral-rollups-sdk-attribute-action" version = "0.8.5" -source = "git+https://github.com/magicblock-labs/ephemeral-rollups-sdk.git?rev=d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6#d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6" +source = "git+https://github.com/magicblock-labs/ephemeral-rollups-sdk.git?rev=95bb6373a0f7c741a84030c8d0fdcb3e0359afb1#95bb6373a0f7c741a84030c8d0fdcb3e0359afb1" dependencies = [ "quote", "syn 1.0.109", @@ -1734,7 +1734,7 @@ dependencies = [ [[package]] name = "ephemeral-rollups-sdk-attribute-commit" version = "0.8.5" -source = "git+https://github.com/magicblock-labs/ephemeral-rollups-sdk.git?rev=d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6#d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6" +source = "git+https://github.com/magicblock-labs/ephemeral-rollups-sdk.git?rev=95bb6373a0f7c741a84030c8d0fdcb3e0359afb1#95bb6373a0f7c741a84030c8d0fdcb3e0359afb1" dependencies = [ "quote", "syn 1.0.109", @@ -1743,7 +1743,7 @@ dependencies = [ [[package]] name = "ephemeral-rollups-sdk-attribute-delegate" version = "0.8.5" -source = "git+https://github.com/magicblock-labs/ephemeral-rollups-sdk.git?rev=d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6#d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6" +source = "git+https://github.com/magicblock-labs/ephemeral-rollups-sdk.git?rev=95bb6373a0f7c741a84030c8d0fdcb3e0359afb1#95bb6373a0f7c741a84030c8d0fdcb3e0359afb1" dependencies = [ "proc-macro2", "quote", @@ -1753,7 +1753,7 @@ dependencies = [ [[package]] name = "ephemeral-rollups-sdk-attribute-ephemeral" version = "0.8.5" -source = "git+https://github.com/magicblock-labs/ephemeral-rollups-sdk.git?rev=d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6#d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6" +source = "git+https://github.com/magicblock-labs/ephemeral-rollups-sdk.git?rev=95bb6373a0f7c741a84030c8d0fdcb3e0359afb1#95bb6373a0f7c741a84030c8d0fdcb3e0359afb1" dependencies = [ "proc-macro2", "quote", @@ -3684,7 +3684,7 @@ dependencies = [ [[package]] name = "magicblock-magic-program-api" version = "0.8.0" -source = "git+https://github.com/magicblock-labs/magicblock-validator.git?branch=snawaz%2Fschedule-commit-finalize#33f3097e3ceb40538b2983ff89623c788469620e" +source = "git+https://github.com/magicblock-labs/magicblock-validator.git?rev=34585f091d1debbe19232d07d332afbeb5f93872#34585f091d1debbe19232d07d332afbeb5f93872" dependencies = [ "bincode", "serde", diff --git a/test-integration/Cargo.toml b/test-integration/Cargo.toml index cfc5185cf..eec04baab 100644 --- a/test-integration/Cargo.toml +++ b/test-integration/Cargo.toml @@ -36,7 +36,7 @@ chrono = "0.4" cleanass = "0.0.1" color-backtrace = { version = "0.7" } ctrlc = "3.4.7" -ephemeral-rollups-sdk = { git = "https://github.com/magicblock-labs/ephemeral-rollups-sdk.git", rev = "d6a81e25a80d78fea9adf3fb1342df9bc9b87ba6", default-features = false, features = [ +ephemeral-rollups-sdk = { git = "https://github.com/magicblock-labs/ephemeral-rollups-sdk.git", rev = "95bb6373a0f7c741a84030c8d0fdcb3e0359afb1", default-features = false, features = [ "modular-sdk", ] } futures = "0.3.31" diff --git a/test-integration/schedulecommit/elfs/dlp.so b/test-integration/schedulecommit/elfs/dlp.so index 82a0bcb6dc381ba4b558591010551a9afa9d8c94..b085aa10f28061f4203ab18d0c041e13d7527e19 100755 GIT binary patch delta 51273 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 diff --git a/test-integration/schedulecommit/test-scenarios/tests/02_commit_and_undelegate.rs b/test-integration/schedulecommit/test-scenarios/tests/02_commit_and_undelegate.rs index 53231f5e7..8e330d5bd 100644 --- a/test-integration/schedulecommit/test-scenarios/tests/02_commit_and_undelegate.rs +++ b/test-integration/schedulecommit/test-scenarios/tests/02_commit_and_undelegate.rs @@ -393,10 +393,7 @@ fn run_test_for_commit_huge_order_book_account( assert_one_committee_was_committed(&ctx, &res, true); match commit_type { - ScheduleCommitType::Commit => { - assert_one_committee_account_was_not_undelegated_on_chain(&ctx); - } - ScheduleCommitType::CommitFinalize => { + ScheduleCommitType::Commit | ScheduleCommitType::CommitFinalize => { assert_one_committee_account_was_not_undelegated_on_chain(&ctx); } ScheduleCommitType::CommitAndUndelegate