From 3266411ccfa0d0c2891f5cef40eda23d76f7211e Mon Sep 17 00:00:00 2001 From: taco-paco Date: Fri, 5 Dec 2025 11:43:21 +0700 Subject: [PATCH 1/9] feat: update dlp, introduce UnfinalizedAccountError --- Cargo.lock | 176 ++++++++++++-- Cargo.toml | 4 +- .../src/intent_executor/error.rs | 51 +++- .../intent_executor/single_stage_executor.rs | 6 + .../src/intent_executor/two_stage_executor.rs | 12 + test-integration/Cargo.lock | 218 ++++++++++++++++-- test-integration/schedulecommit/elfs/dlp.so | Bin 341272 -> 346384 bytes .../tests/test_intent_executor.rs | 59 ++++- 8 files changed, 474 insertions(+), 52 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index de42c505d..9df813c8a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -708,6 +708,18 @@ dependencies = [ "typenum", ] +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake3" version = "1.8.2" @@ -864,6 +876,28 @@ dependencies = [ "serde", ] +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta 0.1.4", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytemuck" version = "1.23.1" @@ -1861,7 +1895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6503af7917fea18ffef8f7e8553fb8dff89e2e6837e94e09dd7fb069c82d62c" dependencies = [ "bytes", - "rkyv", + "rkyv 0.8.11", "serde", "simdutf8", ] @@ -2035,6 +2069,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.1.31" @@ -3842,21 +3882,23 @@ dependencies = [ [[package]] name = "magicblock-delegation-program" -version = "1.1.0" -source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=aa1de56d90c#aa1de56d90c8a242377accd59899f272f0131f8c" +version = "1.1.3" +source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=a56deac#a56deaca2fac5fb422565fdf6369baf893266d19" dependencies = [ "bincode", "borsh 1.5.7", "bytemuck", "num_enum", - "paste", "pinocchio", "pinocchio-log", "pinocchio-pubkey", "pinocchio-system", + "rkyv 0.7.45", "solana-curve25519", "solana-program", "solana-security-txt", + "static_assertions", + "strum 0.27.2", "thiserror 1.0.69", ] @@ -5140,13 +5182,33 @@ dependencies = [ "autotools", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive 0.1.4", +] + [[package]] name = "ptr_meta" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe9e76f66d3f9606f44e45598d155cb13ecf09f4a28199e48daf8c8fc937ea90" dependencies = [ - "ptr_meta_derive", + "ptr_meta_derive 0.3.0", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -5273,13 +5335,19 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rancor" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caf5f7161924b9d1cea0e4cabc97c372cea92b5f927fc13c6bca67157a0ad947" dependencies = [ - "ptr_meta", + "ptr_meta 0.3.0", ] [[package]] @@ -5549,6 +5617,15 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "rend" version = "0.5.2" @@ -5631,6 +5708,24 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta 0.1.4", + "rend 0.4.2", + "rkyv_derive 0.7.45", + "seahash", + "tinyvec", + "uuid", +] + [[package]] name = "rkyv" version = "0.8.11" @@ -5641,14 +5736,25 @@ dependencies = [ "hashbrown 0.15.4", "indexmap 2.10.0", "munge", - "ptr_meta", + "ptr_meta 0.3.0", "rancor", - "rend", - "rkyv_derive", + "rend 0.5.2", + "rkyv_derive 0.8.11", "tinyvec", "uuid", ] +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rkyv_derive" version = "0.8.11" @@ -5978,6 +6084,12 @@ version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "security-framework" version = "2.11.1" @@ -7645,8 +7757,8 @@ dependencies = [ "spl-token", "spl-token-2022 7.0.0", "static_assertions", - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", "tar", "tempfile", "thiserror 2.0.12", @@ -8643,8 +8755,8 @@ dependencies = [ "solana-vote", "solana-vote-program", "static_assertions", - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", "symlink", "tar", "tempfile", @@ -10308,7 +10420,16 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", ] [[package]] @@ -10324,6 +10445,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "subtle" version = "2.6.1" @@ -10423,6 +10556,12 @@ dependencies = [ "unicode-width 0.1.14", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tar" version = "0.4.44" @@ -11956,6 +12095,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "x509-parser" version = "0.14.0" diff --git a/Cargo.toml b/Cargo.toml index f67438bed..f4c8c7f8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -107,9 +107,7 @@ magicblock-config = { path = "./magicblock-config" } magicblock-config-helpers = { path = "./magicblock-config-helpers" } magicblock-config-macro = { path = "./magicblock-config-macro" } magicblock-core = { path = "./magicblock-core" } -magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "aa1de56d90c", features = [ - "no-entrypoint", -] } +magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "a56deac" } magicblock-aperture = { path = "./magicblock-aperture" } magicblock-geyser-plugin = { path = "./magicblock-geyser-plugin" } magicblock-ledger = { path = "./magicblock-ledger" } diff --git a/magicblock-committor-service/src/intent_executor/error.rs b/magicblock-committor-service/src/intent_executor/error.rs index 7db2e5132..eb639c00b 100644 --- a/magicblock-committor-service/src/intent_executor/error.rs +++ b/magicblock-committor-service/src/intent_executor/error.rs @@ -144,6 +144,8 @@ pub enum TransactionStrategyExecutionError { CommitIDError(#[source] TransactionError, Option), #[error("Max instruction trace length exceeded: {0}. {:?}", .1)] CpiLimitError(#[source] TransactionError, Option), + #[error("Unfinalized account error: {0}, {:?}", .1)] + UnfinalizedAccountError(#[source] TransactionError, Option), #[error("InternalError: {0}")] InternalError(#[from] InternalError), } @@ -165,6 +167,7 @@ impl TransactionStrategyExecutionError { Self::CommitIDError(_, signature) | Self::ActionsError(_, signature) | Self::UndelegationError(_, signature) + | Self::UnfinalizedAccountError(_, signature) | Self::CpiLimitError(_, signature) => *signature, } } @@ -179,8 +182,18 @@ impl TransactionStrategyExecutionError { ) -> Result { // There's always 2 budget instructions in front const OFFSET: u8 = 2; + // Commit Nonce order error const NONCE_OUT_OF_ORDER: u32 = dlp::error::DlpError::NonceOutOfOrder as u32; + // Errors when commit state already exists + const COMMIT_STATE_INVALID_ACCOUNT_OWNER: u32 = + dlp::error::DlpError::CommitStateInvalidAccountOwner as u32; + const COMMIT_STATE_ALREADY_INITIALIZED: u32 = + dlp::error::DlpError::CommitStateAlreadyInitialized as u32; + const COMMIT_RECORD_INVALID_ACCOUNT_OWNER: u32 = + dlp::error::DlpError::CommitRecordInvalidAccountOwner as u32; + const COMMIT_RECORD_ALREADY_INITIALIZED: u32 = + dlp::error::DlpError::CommitRecordAlreadyInitialized as u32; match err { // Some tx may use too much CPIs and we can handle it in certain cases @@ -208,15 +221,35 @@ impl TransactionStrategyExecutionError { }; match (task_type, instruction_err) { - ( - TaskType::Commit, - InstructionError::Custom(NONCE_OUT_OF_ORDER), - ) => Ok(TransactionStrategyExecutionError::CommitIDError( - tx_err_helper(InstructionError::Custom( - NONCE_OUT_OF_ORDER, - )), - signature, - )), + (TaskType::Commit, instruction_err) => match instruction_err + { + InstructionError::Custom(NONCE_OUT_OF_ORDER) => Ok( + TransactionStrategyExecutionError::CommitIDError( + tx_err_helper(InstructionError::Custom( + NONCE_OUT_OF_ORDER, + )), + signature, + ), + ), + instruction_err @ (InstructionError::Custom( + COMMIT_STATE_INVALID_ACCOUNT_OWNER, + ) + | InstructionError::Custom( + COMMIT_STATE_ALREADY_INITIALIZED, + ) + | InstructionError::Custom( + COMMIT_RECORD_INVALID_ACCOUNT_OWNER, + ) + | InstructionError::Custom( + COMMIT_RECORD_ALREADY_INITIALIZED, + )) => { + Ok(TransactionStrategyExecutionError::UnfinalizedAccountError( + tx_err_helper(instruction_err), + signature + )) + } + err => Err(tx_err_helper(err)), + }, (TaskType::Action, instruction_err) => { Ok(TransactionStrategyExecutionError::ActionsError( tx_err_helper(instruction_err), diff --git a/magicblock-committor-service/src/intent_executor/single_stage_executor.rs b/magicblock-committor-service/src/intent_executor/single_stage_executor.rs index 44edac30f..d760aa50e 100644 --- a/magicblock-committor-service/src/intent_executor/single_stage_executor.rs +++ b/magicblock-committor-service/src/intent_executor/single_stage_executor.rs @@ -139,6 +139,12 @@ where .await?; Ok(ControlFlow::Continue(to_cleanup)) } + TransactionStrategyExecutionError::UnfinalizedAccountError( + _, + _, + ) => { + todo!() + } TransactionStrategyExecutionError::UndelegationError(_, _) => { // Here we patch strategy for it to be retried in next iteration // & we also record data that has to be cleaned up after patch diff --git a/magicblock-committor-service/src/intent_executor/two_stage_executor.rs b/magicblock-committor-service/src/intent_executor/two_stage_executor.rs index b1c6e496b..032ce1fca 100644 --- a/magicblock-committor-service/src/intent_executor/two_stage_executor.rs +++ b/magicblock-committor-service/src/intent_executor/two_stage_executor.rs @@ -150,6 +150,12 @@ where .await?; Ok(ControlFlow::Continue(to_cleanup)) } + TransactionStrategyExecutionError::UnfinalizedAccountError( + _, + _, + ) => { + todo!() + } TransactionStrategyExecutionError::ActionsError(_, _) => { // Unexpected in Two Stage commit // That would mean that Two Stage executes Standalone commit @@ -272,6 +278,12 @@ where let to_cleanup = inner.handle_actions_error(finalize_strategy); Ok(ControlFlow::Continue(to_cleanup)) } + TransactionStrategyExecutionError::UnfinalizedAccountError( + _, + _, + ) => { + todo!() + } TransactionStrategyExecutionError::UndelegationError(_, _) => { // Here we patch strategy for it to be retried in next iteration // & we also record data that has to be cleaned up after patch diff --git a/test-integration/Cargo.lock b/test-integration/Cargo.lock index 223f7f9e6..3268d0962 100644 --- a/test-integration/Cargo.lock +++ b/test-integration/Cargo.lock @@ -689,6 +689,18 @@ dependencies = [ "typenum", ] +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake3" version = "1.8.2" @@ -845,6 +857,28 @@ dependencies = [ "serde", ] +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta 0.1.4", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytemuck" version = "1.23.1" @@ -1748,7 +1782,7 @@ dependencies = [ "ephemeral-rollups-sdk-attribute-commit", "ephemeral-rollups-sdk-attribute-delegate", "ephemeral-rollups-sdk-attribute-ephemeral", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.0", "magicblock-magic-program-api 0.2.1", "solana-program", ] @@ -1871,7 +1905,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6503af7917fea18ffef8f7e8553fb8dff89e2e6837e94e09dd7fb069c82d62c" dependencies = [ "bytes", - "rkyv", + "rkyv 0.8.11", "serde", "simdutf8", ] @@ -2055,6 +2089,12 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.1.31" @@ -2984,7 +3024,7 @@ dependencies = [ "log", "magicblock-config", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.0", "random-port", "rayon", "serde", @@ -3548,7 +3588,7 @@ dependencies = [ "magicblock-chainlink", "magicblock-committor-service", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-ledger", "magicblock-magic-program-api 0.4.1", "magicblock-metrics", @@ -3650,7 +3690,7 @@ dependencies = [ "magicblock-committor-service", "magicblock-config", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-ledger", "magicblock-magic-program-api 0.4.1", "magicblock-metrics", @@ -3686,7 +3726,7 @@ dependencies = [ "lru 0.16.0", "magicblock-config", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-magic-program-api 0.4.1", "magicblock-metrics", "serde_json", @@ -3737,7 +3777,7 @@ dependencies = [ "log", "lru 0.16.0", "magicblock-committor-program", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-metrics", "magicblock-program", "magicblock-rpc-client", @@ -3816,6 +3856,28 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "magicblock-delegation-program" +version = "1.1.3" +source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=a56deac#a56deaca2fac5fb422565fdf6369baf893266d19" +dependencies = [ + "bincode", + "borsh 1.5.7", + "bytemuck", + "num_enum", + "pinocchio", + "pinocchio-log", + "pinocchio-pubkey", + "pinocchio-system", + "rkyv 0.7.45", + "solana-curve25519", + "solana-program", + "solana-security-txt", + "static_assertions", + "strum 0.27.2", + "thiserror 1.0.69", +] + [[package]] name = "magicblock-ledger" version = "0.4.1" @@ -3996,7 +4058,7 @@ version = "0.4.1" dependencies = [ "anyhow", "log", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-program", "magicblock-rpc-client", "solana-rpc-client", @@ -4957,7 +5019,7 @@ version = "0.0.0" dependencies = [ "borsh 1.5.7", "ephemeral-rollups-sdk", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.0", "magicblock-magic-program-api 0.4.1", "solana-program", ] @@ -5076,13 +5138,33 @@ dependencies = [ "autotools", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive 0.1.4", +] + [[package]] name = "ptr_meta" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe9e76f66d3f9606f44e45598d155cb13ecf09f4a28199e48daf8c8fc937ea90" dependencies = [ - "ptr_meta_derive", + "ptr_meta_derive 0.3.0", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -5209,13 +5291,19 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rancor" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caf5f7161924b9d1cea0e4cabc97c372cea92b5f927fc13c6bca67157a0ad947" dependencies = [ - "ptr_meta", + "ptr_meta 0.3.0", ] [[package]] @@ -5481,6 +5569,15 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "rend" version = "0.5.2" @@ -5563,6 +5660,24 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta 0.1.4", + "rend 0.4.2", + "rkyv_derive 0.7.45", + "seahash", + "tinyvec", + "uuid", +] + [[package]] name = "rkyv" version = "0.8.11" @@ -5573,14 +5688,25 @@ dependencies = [ "hashbrown 0.15.4", "indexmap 2.10.0", "munge", - "ptr_meta", + "ptr_meta 0.3.0", "rancor", - "rend", - "rkyv_derive", + "rend 0.5.2", + "rkyv_derive 0.8.11", "tinyvec", "uuid", ] +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rkyv_derive" version = "0.8.11" @@ -5874,7 +6000,7 @@ dependencies = [ "integration-test-tools", "log", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.0", "program-schedulecommit", "solana-program", "solana-rpc-client", @@ -5892,7 +6018,7 @@ dependencies = [ "log", "magicblock-committor-program", "magicblock-committor-service", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.0", "magicblock-program", "magicblock-rpc-client", "magicblock-table-mania", @@ -5985,6 +6111,12 @@ version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "security-framework" version = "2.11.1" @@ -7643,8 +7775,8 @@ dependencies = [ "spl-token", "spl-token-2022 7.0.0", "static_assertions", - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", "tar", "tempfile", "thiserror 2.0.12", @@ -8655,8 +8787,8 @@ dependencies = [ "solana-vote", "solana-vote-program", "static_assertions", - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", "symlink", "tar", "tempfile", @@ -10350,7 +10482,16 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", ] [[package]] @@ -10366,6 +10507,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "subtle" version = "2.6.1" @@ -10457,6 +10610,12 @@ dependencies = [ "solana-program", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tar" version = "0.4.44" @@ -10556,7 +10715,7 @@ dependencies = [ "log", "magicblock-chainlink", "magicblock-config", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.0", "program-flexi-counter", "program-mini", "solana-account", @@ -10638,7 +10797,7 @@ dependencies = [ "log", "magicblock-accounts-db", "magicblock-config", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.0", "program-flexi-counter", "solana-rpc-client", "solana-sdk", @@ -10659,7 +10818,7 @@ dependencies = [ "magic-domain-program", "magicblock-api", "magicblock-config", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.0", "magicblock-program", "magicblock-validator-admin", "solana-rpc-client", @@ -10699,7 +10858,7 @@ version = "0.0.0" dependencies = [ "integration-test-tools", "log", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.0", "program-flexi-counter", "solana-rpc-client-api", "solana-sdk", @@ -12120,6 +12279,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "x509-parser" version = "0.14.0" diff --git a/test-integration/schedulecommit/elfs/dlp.so b/test-integration/schedulecommit/elfs/dlp.so index f07df31f3e7ba6d920d4d2284d76d1d52047a724..740d769832ae0184c53f081558ec2895cea29880 100755 GIT binary patch delta 88097 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.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 Rr;UGt_EH}uBWBz7{{eI>-8KLK delta 84288 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 diff --git a/test-integration/test-committor-service/tests/test_intent_executor.rs b/test-integration/test-committor-service/tests/test_intent_executor.rs index 912668019..e4a0f302a 100644 --- a/test-integration/test-committor-service/tests/test_intent_executor.rs +++ b/test-integration/test-committor-service/tests/test_intent_executor.rs @@ -10,6 +10,7 @@ use std::{ }; use borsh::to_vec; +use dlp::args::CommitStateArgs; use dlp::pda::ephemeral_balance_pda_from_payer; use futures::future::join_all; use magicblock_committor_program::pdas; @@ -51,7 +52,7 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::Transaction, }; - +use magicblock_rpc_client::MagicBlockSendTransactionConfig; use crate::{ common::TestFixture, utils::{ @@ -824,6 +825,62 @@ async fn test_commit_id_actions_cpi_limit_errors_recovery() { .await; } +#[tokio::test] +async fn test_commit_unfinalized_account_recovery() { + let TestEnv { + fixture, + mut intent_executor, + task_info_fetcher, + pre_test_tablemania_state, + } = TestEnv::setup().await; + + // Prepare multiple counters; each needs an escrow (payer) to be able to execute base actions. + // We also craft unique on-chain data so we can verify post-commit state exactly. + let (counter_auth, account) = setup_counter(40, None).await; + setup_payer_with_keypair(&counter_auth, fixture.rpc_client.get_inner()) + .await; + let pda = FlexiCounter::pda(&counter_auth.pubkey()).0; + + // Commit account without finalization + // This simulates finalization stage failure + { + let commit_allow_undelegation_ix = dlp::instruction_builder::commit_state( + fixture.authority.pubkey(), + pda, + account.owner, + CommitStateArgs { + nonce: 1, + lamports: account.lamports, + allow_undelegation: false, + data: account.data.clone(), + } + ); + + let blockhash = fixture.rpc_client.get_latest_blockhash().await.unwrap(); + let tx = Transaction::new_signed_with_payer( + &[commit_allow_undelegation_ix], + Some(&fixture.authority.pubkey()), + &[&fixture.authority], + blockhash + ); + + let result = fixture.rpc_client.send_transaction(&tx, &MagicBlockSendTransactionConfig::ensure_committed()).await; + assert!(result.is_ok()); + } + + // Now simulate user sending new intent + let committed_account = CommittedAccount { + pubkey: pda, + account + }; + let intent = create_intent(vec![committed_account], false); + let result = intent_executor.execute(intent, None::).await; + assert!(result.inner.is_err()); + println!("{:?}", result.inner.unwrap_err()); + + assert!(result.patched_errors.is_empty()); +} + fn failing_undelegate_action( escrow_authority: Pubkey, undelegated_account: Pubkey, From bb8e0d08d848e9e72c74b2c7a2267c4f363b0c14 Mon Sep 17 00:00:00 2001 From: taco-paco Date: Fri, 5 Dec 2025 14:35:01 +0700 Subject: [PATCH 2/9] feat: recovery in SingleStage --- Cargo.toml | 4 +- .../src/intent_executor/error.rs | 33 ++++++++- .../src/intent_executor/mod.rs | 8 ++- .../intent_executor/single_stage_executor.rs | 67 +++++++++++++++++-- test-integration/Cargo.lock | 16 ++--- test-integration/Cargo.toml | 2 +- .../tests/test_intent_executor.rs | 61 ++++++++++------- 7 files changed, 148 insertions(+), 43 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f4c8c7f8b..b517088dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -107,7 +107,9 @@ magicblock-config = { path = "./magicblock-config" } magicblock-config-helpers = { path = "./magicblock-config-helpers" } magicblock-config-macro = { path = "./magicblock-config-macro" } magicblock-core = { path = "./magicblock-core" } -magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "a56deac" } +magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "a56deac", features = [ + "no-entrypoint", +] } magicblock-aperture = { path = "./magicblock-aperture" } magicblock-geyser-plugin = { path = "./magicblock-geyser-plugin" } magicblock-ledger = { path = "./magicblock-ledger" } diff --git a/magicblock-committor-service/src/intent_executor/error.rs b/magicblock-committor-service/src/intent_executor/error.rs index eb639c00b..02f8e4971 100644 --- a/magicblock-committor-service/src/intent_executor/error.rs +++ b/magicblock-committor-service/src/intent_executor/error.rs @@ -157,10 +157,39 @@ impl From for TransactionStrategyExecutionError { } impl TransactionStrategyExecutionError { + // There's always 2 budget instructions in front + const OFFSET: u8 = 2; + pub fn is_cpi_limit_error(&self) -> bool { matches!(self, Self::CpiLimitError(_, _)) } + pub fn task_index(&self) -> Option { + match self { + Self::CommitIDError( + TransactionError::InstructionError(index, _), + _, + ) + | Self::ActionsError( + TransactionError::InstructionError(index, _), + _, + ) + | Self::UndelegationError( + TransactionError::InstructionError(index, _), + _, + ) + | Self::UnfinalizedAccountError( + TransactionError::InstructionError(index, _), + _, + ) + | Self::CpiLimitError( + TransactionError::InstructionError(index, _), + _, + ) => index.checked_sub(Self::OFFSET), + _ => None, + } + } + pub fn signature(&self) -> Option { match self { Self::InternalError(err) => err.signature(), @@ -180,8 +209,6 @@ impl TransactionStrategyExecutionError { signature: Option, tasks: &[Box], ) -> Result { - // There's always 2 budget instructions in front - const OFFSET: u8 = 2; // Commit Nonce order error const NONCE_OUT_OF_ORDER: u32 = dlp::error::DlpError::NonceOutOfOrder as u32; @@ -209,7 +236,7 @@ impl TransactionStrategyExecutionError { let tx_err_helper = |instruction_err| -> TransactionError { TransactionError::InstructionError(index, instruction_err) }; - let Some(action_index) = index.checked_sub(OFFSET) else { + let Some(action_index) = index.checked_sub(Self::OFFSET) else { return Err(tx_err_helper(instruction_err)); }; diff --git a/magicblock-committor-service/src/intent_executor/mod.rs b/magicblock-committor-service/src/intent_executor/mod.rs index 3afbecf48..c1439b307 100644 --- a/magicblock-committor-service/src/intent_executor/mod.rs +++ b/magicblock-committor-service/src/intent_executor/mod.rs @@ -41,14 +41,18 @@ use crate::{ task_info_fetcher::{ResetType, TaskInfoFetcher}, two_stage_executor::TwoStageExecutor, }, - persist::{CommitStatus, CommitStatusSignatures, IntentPersister}, + persist::{ + CommitStatus, CommitStatusSignatures, IntentPersister, + IntentPersisterImpl, + }, tasks::{ + args_task::{ArgsTask, ArgsTaskType}, task_builder::{TaskBuilderError, TaskBuilderImpl, TasksBuilder}, task_strategist::{ StrategyExecutionMode, TaskStrategist, TransactionStrategy, }, task_visitors::utility_visitor::TaskVisitorUtils, - BaseTask, TaskType, + BaseTask, FinalizeTask, TaskType, }, transaction_preparator::{ delivery_preparator::BufferExecutionError, diff --git a/magicblock-committor-service/src/intent_executor/single_stage_executor.rs b/magicblock-committor-service/src/intent_executor/single_stage_executor.rs index d760aa50e..d466e9f10 100644 --- a/magicblock-committor-service/src/intent_executor/single_stage_executor.rs +++ b/magicblock-committor-service/src/intent_executor/single_stage_executor.rs @@ -2,6 +2,7 @@ use std::ops::ControlFlow; use log::error; use solana_pubkey::Pubkey; +use solana_sdk::{signature::Signature, transaction::TransactionError}; use crate::{ intent_executor::{ @@ -12,8 +13,13 @@ use crate::{ task_info_fetcher::TaskInfoFetcher, ExecutionOutput, IntentExecutorImpl, }, - persist::IntentPersister, - tasks::task_strategist::TransactionStrategy, + persist::{IntentPersister, IntentPersisterImpl}, + tasks::{ + args_task::{ArgsTask, ArgsTaskType}, + task_strategist::TransactionStrategy, + task_visitors::utility_visitor::TaskVisitorUtils, + BaseTask, FinalizeTask, + }, transaction_preparator::TransactionPreparator, }; @@ -139,11 +145,26 @@ where .await?; Ok(ControlFlow::Continue(to_cleanup)) } - TransactionStrategyExecutionError::UnfinalizedAccountError( - _, + err + @ TransactionStrategyExecutionError::UnfinalizedAccountError( _, + signature, ) => { - todo!() + if let Some(task) = err.task_index().and_then(|index| { + transaction_strategy + .optimized_tasks + .as_slice() + .get(index as usize) + }) { + Self::handle_unfinalized_account_error( + inner, + signature, + task.as_ref(), + ) + .await + } else { + Ok(ControlFlow::Break(())) + } } TransactionStrategyExecutionError::UndelegationError(_, _) => { // Here we patch strategy for it to be retried in next iteration @@ -163,4 +184,40 @@ where } } } + + async fn handle_unfinalized_account_error( + inner: &IntentExecutorImpl, + failed_signature: &Option, + task: &dyn BaseTask, + ) -> IntentExecutorResult> { + let mut visitor = TaskVisitorUtils::GetCommitMeta(None); + task.visit(&mut visitor); + + let TaskVisitorUtils::GetCommitMeta(Some(commit_meta)) = visitor else { + return Ok(ControlFlow::Break(())); + }; + let finalize_task = + Box::new(ArgsTask::new(ArgsTaskType::Finalize(FinalizeTask { + delegated_account: commit_meta.committed_pubkey, + }))) as Box; + inner + .prepare_and_execute_strategy( + &mut TransactionStrategy { + optimized_tasks: vec![finalize_task], + lookup_tables_keys: vec![], + }, + &None::, + ) + .await + .map_err(IntentExecutorError::FailedFinalizePreparationError)? + .map_err(|err| IntentExecutorError::FailedToFinalizeError { + err, + commit_signature: None, + finalize_signature: *failed_signature, + })?; + Ok(ControlFlow::Continue(TransactionStrategy { + optimized_tasks: vec![], + lookup_tables_keys: vec![], + })) + } } diff --git a/test-integration/Cargo.lock b/test-integration/Cargo.lock index 3268d0962..5aad03295 100644 --- a/test-integration/Cargo.lock +++ b/test-integration/Cargo.lock @@ -3024,7 +3024,7 @@ dependencies = [ "log", "magicblock-config", "magicblock-core", - "magicblock-delegation-program 1.1.0", + "magicblock-delegation-program 1.1.3", "random-port", "rayon", "serde", @@ -5019,7 +5019,7 @@ version = "0.0.0" dependencies = [ "borsh 1.5.7", "ephemeral-rollups-sdk", - "magicblock-delegation-program 1.1.0", + "magicblock-delegation-program 1.1.3", "magicblock-magic-program-api 0.4.1", "solana-program", ] @@ -6000,7 +6000,7 @@ dependencies = [ "integration-test-tools", "log", "magicblock-core", - "magicblock-delegation-program 1.1.0", + "magicblock-delegation-program 1.1.3", "program-schedulecommit", "solana-program", "solana-rpc-client", @@ -6018,7 +6018,7 @@ dependencies = [ "log", "magicblock-committor-program", "magicblock-committor-service", - "magicblock-delegation-program 1.1.0", + "magicblock-delegation-program 1.1.3", "magicblock-program", "magicblock-rpc-client", "magicblock-table-mania", @@ -10715,7 +10715,7 @@ dependencies = [ "log", "magicblock-chainlink", "magicblock-config", - "magicblock-delegation-program 1.1.0", + "magicblock-delegation-program 1.1.3", "program-flexi-counter", "program-mini", "solana-account", @@ -10797,7 +10797,7 @@ dependencies = [ "log", "magicblock-accounts-db", "magicblock-config", - "magicblock-delegation-program 1.1.0", + "magicblock-delegation-program 1.1.3", "program-flexi-counter", "solana-rpc-client", "solana-sdk", @@ -10818,7 +10818,7 @@ dependencies = [ "magic-domain-program", "magicblock-api", "magicblock-config", - "magicblock-delegation-program 1.1.0", + "magicblock-delegation-program 1.1.3", "magicblock-program", "magicblock-validator-admin", "solana-rpc-client", @@ -10858,7 +10858,7 @@ version = "0.0.0" dependencies = [ "integration-test-tools", "log", - "magicblock-delegation-program 1.1.0", + "magicblock-delegation-program 1.1.3", "program-flexi-counter", "solana-rpc-client-api", "solana-sdk", diff --git a/test-integration/Cargo.toml b/test-integration/Cargo.toml index 0bcb42cc3..18914e6ee 100644 --- a/test-integration/Cargo.toml +++ b/test-integration/Cargo.toml @@ -57,7 +57,7 @@ magicblock-config = { path = "../magicblock-config" } magicblock-core = { path = "../magicblock-core" } magic-domain-program = { git = "https://github.com/magicblock-labs/magic-domain-program.git", rev = "ea04d46", default-features = false } 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 = "aa1de56d90c", features = [ +magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "a56deac", features = [ "no-entrypoint", ] } magicblock-program = { path = "../programs/magicblock" } diff --git a/test-integration/test-committor-service/tests/test_intent_executor.rs b/test-integration/test-committor-service/tests/test_intent_executor.rs index e4a0f302a..67a34b760 100644 --- a/test-integration/test-committor-service/tests/test_intent_executor.rs +++ b/test-integration/test-committor-service/tests/test_intent_executor.rs @@ -10,8 +10,7 @@ use std::{ }; use borsh::to_vec; -use dlp::args::CommitStateArgs; -use dlp::pda::ephemeral_balance_pda_from_payer; +use dlp::{args::CommitStateArgs, pda::ephemeral_balance_pda_from_payer}; use futures::future::join_all; use magicblock_committor_program::pdas; use magicblock_committor_service::{ @@ -36,6 +35,7 @@ use magicblock_program::{ }, validator::validator_authority_id, }; +use magicblock_rpc_client::MagicBlockSendTransactionConfig; use magicblock_table_mania::TableMania; use program_flexi_counter::{ instruction::FlexiCounterInstruction, @@ -52,7 +52,7 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::Transaction, }; -use magicblock_rpc_client::MagicBlockSendTransactionConfig; + use crate::{ common::TestFixture, utils::{ @@ -844,41 +844,56 @@ async fn test_commit_unfinalized_account_recovery() { // Commit account without finalization // This simulates finalization stage failure { - let commit_allow_undelegation_ix = dlp::instruction_builder::commit_state( - fixture.authority.pubkey(), - pda, - account.owner, - CommitStateArgs { - nonce: 1, - lamports: account.lamports, - allow_undelegation: false, - data: account.data.clone(), - } - ); - - let blockhash = fixture.rpc_client.get_latest_blockhash().await.unwrap(); + let commit_allow_undelegation_ix = + dlp::instruction_builder::commit_state( + fixture.authority.pubkey(), + pda, + account.owner, + CommitStateArgs { + nonce: 1, + lamports: account.lamports, + allow_undelegation: false, + data: account.data.clone(), + }, + ); + + let blockhash = + fixture.rpc_client.get_latest_blockhash().await.unwrap(); let tx = Transaction::new_signed_with_payer( &[commit_allow_undelegation_ix], Some(&fixture.authority.pubkey()), &[&fixture.authority], - blockhash + blockhash, ); - let result = fixture.rpc_client.send_transaction(&tx, &MagicBlockSendTransactionConfig::ensure_committed()).await; + let result = fixture + .rpc_client + .send_transaction( + &tx, + &MagicBlockSendTransactionConfig::ensure_committed(), + ) + .await; assert!(result.is_ok()); } // Now simulate user sending new intent let committed_account = CommittedAccount { pubkey: pda, - account + account, }; let intent = create_intent(vec![committed_account], false); - let result = intent_executor.execute(intent, None::).await; - assert!(result.inner.is_err()); - println!("{:?}", result.inner.unwrap_err()); + let result = intent_executor + .execute(intent, None::) + .await; + assert!(result.inner.is_ok()); + assert!(matches!( + result.inner.unwrap(), + ExecutionOutput::SingleStage(_) + )); - assert!(result.patched_errors.is_empty()); + assert_eq!(result.patched_errors.len(), 2); + assert!(matches!(result.patched_errors[0], TransactionStrategyExecutionError::UnfinalizedAccountError(_, _))); + assert!(matches!(result.patched_errors[1], TransactionStrategyExecutionError::CommitIDError(_, _))) } fn failing_undelegate_action( From b41205d35fe27bee28d69ee6643b3a27ed3a4c99 Mon Sep 17 00:00:00 2001 From: taco-paco Date: Fri, 5 Dec 2025 16:59:44 +0700 Subject: [PATCH 3/9] feat: added unfinalized acc recovery to two stage --- .../src/intent_executor/mod.rs | 8 +- .../intent_executor/single_stage_executor.rs | 2 +- .../src/intent_executor/two_stage_executor.rs | 77 +++++++++++-- .../tests/test_intent_executor.rs | 104 +++++++++++++++++- 4 files changed, 168 insertions(+), 23 deletions(-) diff --git a/magicblock-committor-service/src/intent_executor/mod.rs b/magicblock-committor-service/src/intent_executor/mod.rs index c1439b307..3afbecf48 100644 --- a/magicblock-committor-service/src/intent_executor/mod.rs +++ b/magicblock-committor-service/src/intent_executor/mod.rs @@ -41,18 +41,14 @@ use crate::{ task_info_fetcher::{ResetType, TaskInfoFetcher}, two_stage_executor::TwoStageExecutor, }, - persist::{ - CommitStatus, CommitStatusSignatures, IntentPersister, - IntentPersisterImpl, - }, + persist::{CommitStatus, CommitStatusSignatures, IntentPersister}, tasks::{ - args_task::{ArgsTask, ArgsTaskType}, task_builder::{TaskBuilderError, TaskBuilderImpl, TasksBuilder}, task_strategist::{ StrategyExecutionMode, TaskStrategist, TransactionStrategy, }, task_visitors::utility_visitor::TaskVisitorUtils, - BaseTask, FinalizeTask, TaskType, + BaseTask, TaskType, }, transaction_preparator::{ delivery_preparator::BufferExecutionError, diff --git a/magicblock-committor-service/src/intent_executor/single_stage_executor.rs b/magicblock-committor-service/src/intent_executor/single_stage_executor.rs index d466e9f10..828b22f1f 100644 --- a/magicblock-committor-service/src/intent_executor/single_stage_executor.rs +++ b/magicblock-committor-service/src/intent_executor/single_stage_executor.rs @@ -2,7 +2,7 @@ use std::ops::ControlFlow; use log::error; use solana_pubkey::Pubkey; -use solana_sdk::{signature::Signature, transaction::TransactionError}; +use solana_sdk::signature::Signature; use crate::{ intent_executor::{ diff --git a/magicblock-committor-service/src/intent_executor/two_stage_executor.rs b/magicblock-committor-service/src/intent_executor/two_stage_executor.rs index 032ce1fca..9ce1fbf0f 100644 --- a/magicblock-committor-service/src/intent_executor/two_stage_executor.rs +++ b/magicblock-committor-service/src/intent_executor/two_stage_executor.rs @@ -14,8 +14,13 @@ use crate::{ two_stage_executor::sealed::Sealed, IntentExecutorImpl, }, - persist::IntentPersister, - tasks::task_strategist::TransactionStrategy, + persist::{IntentPersister, IntentPersisterImpl}, + tasks::{ + args_task::{ArgsTask, ArgsTaskType}, + task_strategist::TransactionStrategy, + task_visitors::utility_visitor::TaskVisitorUtils, + BaseTask, FinalizeTask, + }, transaction_preparator::TransactionPreparator, }; @@ -150,11 +155,26 @@ where .await?; Ok(ControlFlow::Continue(to_cleanup)) } - TransactionStrategyExecutionError::UnfinalizedAccountError( - _, + err + @ TransactionStrategyExecutionError::UnfinalizedAccountError( _, + signature, ) => { - todo!() + if let Some(task) = err.task_index().and_then(|index| { + commit_strategy + .optimized_tasks + .as_slice() + .get(index as usize) + }) { + Self::handle_unfinalized_account_error( + inner, + signature, + task.as_ref(), + ) + .await + } else { + Ok(ControlFlow::Break(())) + } } TransactionStrategyExecutionError::ActionsError(_, _) => { // Unexpected in Two Stage commit @@ -179,6 +199,41 @@ where } } } + + async fn handle_unfinalized_account_error( + inner: &IntentExecutorImpl, + failed_signature: &Option, + task: &dyn BaseTask, + ) -> IntentExecutorResult> { + let mut visitor = TaskVisitorUtils::GetCommitMeta(None); + task.visit(&mut visitor); + + let TaskVisitorUtils::GetCommitMeta(Some(commit_meta)) = visitor else { + return Ok(ControlFlow::Break(())); + }; + let finalize_task = + Box::new(ArgsTask::new(ArgsTaskType::Finalize(FinalizeTask { + delegated_account: commit_meta.committed_pubkey, + }))) as Box; + inner + .prepare_and_execute_strategy( + &mut TransactionStrategy { + optimized_tasks: vec![finalize_task], + lookup_tables_keys: vec![], + }, + &None::, + ) + .await + .map_err(IntentExecutorError::FailedCommitPreparationError)? + .map_err(|err| IntentExecutorError::FailedToCommitError { + err, + signature: *failed_signature, + })?; + Ok(ControlFlow::Continue(TransactionStrategy { + optimized_tasks: vec![], + lookup_tables_keys: vec![], + })) + } } impl<'a, T, F> TwoStageExecutor<'a, T, F, Committed> @@ -267,7 +322,11 @@ where finalize_strategy: &mut TransactionStrategy, ) -> IntentExecutorResult> { match err { - TransactionStrategyExecutionError::CommitIDError(_, _) => { + TransactionStrategyExecutionError::CommitIDError(_, _) + | TransactionStrategyExecutionError::UnfinalizedAccountError( + _, + _, + ) => { // Unexpected error in Two Stage commit error!("Unexpected error in two stage finalize flow: {}", err); Ok(ControlFlow::Break(())) @@ -278,12 +337,6 @@ where let to_cleanup = inner.handle_actions_error(finalize_strategy); Ok(ControlFlow::Continue(to_cleanup)) } - TransactionStrategyExecutionError::UnfinalizedAccountError( - _, - _, - ) => { - todo!() - } TransactionStrategyExecutionError::UndelegationError(_, _) => { // Here we patch strategy for it to be retried in next iteration // & we also record data that has to be cleaned up after patch diff --git a/test-integration/test-committor-service/tests/test_intent_executor.rs b/test-integration/test-committor-service/tests/test_intent_executor.rs index 67a34b760..fc144f753 100644 --- a/test-integration/test-committor-service/tests/test_intent_executor.rs +++ b/test-integration/test-committor-service/tests/test_intent_executor.rs @@ -830,8 +830,8 @@ async fn test_commit_unfinalized_account_recovery() { let TestEnv { fixture, mut intent_executor, - task_info_fetcher, - pre_test_tablemania_state, + task_info_fetcher: _, + pre_test_tablemania_state: _, } = TestEnv::setup().await; // Prepare multiple counters; each needs an escrow (payer) to be able to execute base actions. @@ -892,8 +892,104 @@ async fn test_commit_unfinalized_account_recovery() { )); assert_eq!(result.patched_errors.len(), 2); - assert!(matches!(result.patched_errors[0], TransactionStrategyExecutionError::UnfinalizedAccountError(_, _))); - assert!(matches!(result.patched_errors[1], TransactionStrategyExecutionError::CommitIDError(_, _))) + assert!(matches!( + result.patched_errors[0], + TransactionStrategyExecutionError::UnfinalizedAccountError(_, _) + )); + assert!(matches!( + result.patched_errors[1], + TransactionStrategyExecutionError::CommitIDError(_, _) + )) +} + +#[tokio::test] +async fn test_commit_unfinalized_account_recovery_two_stage() { + let TestEnv { + fixture, + mut intent_executor, + task_info_fetcher, + pre_test_tablemania_state, + } = TestEnv::setup().await; + + // Prepare multiple counters; each needs an escrow (payer) to be able to execute base actions. + // We also craft unique on-chain data so we can verify post-commit state exactly. + let counters = (0..8).map(async |_| { + let (counter_auth, account) = setup_counter(40, None).await; + setup_payer_with_keypair(&counter_auth, fixture.rpc_client.get_inner()) + .await; + let pda = FlexiCounter::pda(&counter_auth.pubkey()).0; + (counter_auth, pda, account) + }); + let counters: Vec<(_, _, _)> = join_all(counters).await; + + // Commit account without finalization + // This simulates finalization stage failure + { + let commit_allow_undelegation_ix = + dlp::instruction_builder::commit_state( + fixture.authority.pubkey(), + counters[0].1, + counters[0].2.owner, + CommitStateArgs { + nonce: 1, + lamports: counters[0].2.lamports, + allow_undelegation: false, + data: counters[0].2.data.clone(), + }, + ); + + let blockhash = + fixture.rpc_client.get_latest_blockhash().await.unwrap(); + let tx = Transaction::new_signed_with_payer( + &[commit_allow_undelegation_ix], + Some(&fixture.authority.pubkey()), + &[&fixture.authority], + blockhash, + ); + + let result = fixture + .rpc_client + .send_transaction( + &tx, + &MagicBlockSendTransactionConfig::ensure_committed(), + ) + .await; + assert!(result.is_ok()); + } + + // Now simulate user sending new intent + let committed_accounts = counters + .into_iter() + .map(|el| CommittedAccount { + pubkey: el.1, + account: el.2, + }) + .collect(); + let intent = create_intent(committed_accounts, true); + + let instant = std::time::Instant::now(); + let result = intent_executor + .execute(intent, None::) + .await; + println!("elapsed: {}", instant.elapsed().as_secs()); + assert!(result.inner.is_ok()); + assert!(matches!( + result.inner.unwrap(), + ExecutionOutput::TwoStage { + commit_signature: _, + finalize_signature: _ + } + )); + + assert_eq!(result.patched_errors.len(), 2); + assert!(matches!( + result.patched_errors[0], + TransactionStrategyExecutionError::UnfinalizedAccountError(_, _) + )); + assert!(matches!( + result.patched_errors[1], + TransactionStrategyExecutionError::CommitIDError(_, _) + )) } fn failing_undelegate_action( From 30e353e82984acab70ba521bdfd17b58b9ea5f56 Mon Sep 17 00:00:00 2001 From: taco-paco Date: Fri, 5 Dec 2025 17:15:17 +0700 Subject: [PATCH 4/9] refactor: added docs --- .../src/intent_executor/single_stage_executor.rs | 4 ++++ .../src/intent_executor/two_stage_executor.rs | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/magicblock-committor-service/src/intent_executor/single_stage_executor.rs b/magicblock-committor-service/src/intent_executor/single_stage_executor.rs index 828b22f1f..50b1b4960 100644 --- a/magicblock-committor-service/src/intent_executor/single_stage_executor.rs +++ b/magicblock-committor-service/src/intent_executor/single_stage_executor.rs @@ -185,6 +185,8 @@ where } } + /// Handles unfinalized account error + /// Sends a separate tx to finalize account and then continues execution async fn handle_unfinalized_account_error( inner: &IntentExecutorImpl, failed_signature: &Option, @@ -194,6 +196,7 @@ where task.visit(&mut visitor); let TaskVisitorUtils::GetCommitMeta(Some(commit_meta)) = visitor else { + // Can't recover - break execution return Ok(ControlFlow::Break(())); }; let finalize_task = @@ -215,6 +218,7 @@ where commit_signature: None, finalize_signature: *failed_signature, })?; + Ok(ControlFlow::Continue(TransactionStrategy { optimized_tasks: vec![], lookup_tables_keys: vec![], diff --git a/magicblock-committor-service/src/intent_executor/two_stage_executor.rs b/magicblock-committor-service/src/intent_executor/two_stage_executor.rs index 9ce1fbf0f..b7e51d9bf 100644 --- a/magicblock-committor-service/src/intent_executor/two_stage_executor.rs +++ b/magicblock-committor-service/src/intent_executor/two_stage_executor.rs @@ -200,6 +200,8 @@ where } } + /// Handles unfinalized account error + /// Sends a separate tx to finalize account and then continues execution async fn handle_unfinalized_account_error( inner: &IntentExecutorImpl, failed_signature: &Option, @@ -209,6 +211,7 @@ where task.visit(&mut visitor); let TaskVisitorUtils::GetCommitMeta(Some(commit_meta)) = visitor else { + // Can't recover - break execution return Ok(ControlFlow::Break(())); }; let finalize_task = @@ -229,6 +232,7 @@ where err, signature: *failed_signature, })?; + Ok(ControlFlow::Continue(TransactionStrategy { optimized_tasks: vec![], lookup_tables_keys: vec![], From 1353d60ec8c3f15e9c04f043bd0165108e5b61ba Mon Sep 17 00:00:00 2001 From: taco-paco Date: Fri, 5 Dec 2025 17:48:59 +0700 Subject: [PATCH 5/9] fix: clippy --- .../test-committor-service/tests/test_intent_executor.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test-integration/test-committor-service/tests/test_intent_executor.rs b/test-integration/test-committor-service/tests/test_intent_executor.rs index fc144f753..33741ddff 100644 --- a/test-integration/test-committor-service/tests/test_intent_executor.rs +++ b/test-integration/test-committor-service/tests/test_intent_executor.rs @@ -907,8 +907,8 @@ async fn test_commit_unfinalized_account_recovery_two_stage() { let TestEnv { fixture, mut intent_executor, - task_info_fetcher, - pre_test_tablemania_state, + task_info_fetcher: _, + pre_test_tablemania_state: _, } = TestEnv::setup().await; // Prepare multiple counters; each needs an escrow (payer) to be able to execute base actions. @@ -967,11 +967,9 @@ async fn test_commit_unfinalized_account_recovery_two_stage() { .collect(); let intent = create_intent(committed_accounts, true); - let instant = std::time::Instant::now(); let result = intent_executor .execute(intent, None::) .await; - println!("elapsed: {}", instant.elapsed().as_secs()); assert!(result.inner.is_ok()); assert!(matches!( result.inner.unwrap(), From d4fd058188661f61d8b852f48e1205db1012fd20 Mon Sep 17 00:00:00 2001 From: taco-paco Date: Mon, 8 Dec 2025 12:20:32 +0700 Subject: [PATCH 6/9] fix: post merge --- test-integration/Cargo.lock | 248 +++++++++++++++++++++++++++++++----- 1 file changed, 215 insertions(+), 33 deletions(-) diff --git a/test-integration/Cargo.lock b/test-integration/Cargo.lock index 814747e74..fbd50dfe1 100644 --- a/test-integration/Cargo.lock +++ b/test-integration/Cargo.lock @@ -79,6 +79,17 @@ dependencies = [ "solana-svm-transaction", ] +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.12" @@ -573,6 +584,18 @@ dependencies = [ "typenum", ] +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake3" version = "1.8.2" @@ -719,6 +742,28 @@ dependencies = [ "serde", ] +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta 0.1.4", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytemuck" version = "1.23.1" @@ -1524,7 +1569,7 @@ dependencies = [ "ephemeral-rollups-sdk-attribute-commit", "ephemeral-rollups-sdk-attribute-delegate", "ephemeral-rollups-sdk-attribute-ephemeral", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.0", "magicblock-magic-program-api 0.2.1", "solana-program", ] @@ -1638,7 +1683,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6503af7917fea18ffef8f7e8553fb8dff89e2e6837e94e09dd7fb069c82d62c" dependencies = [ "bytes", - "rkyv", + "rkyv 0.8.11", "serde", "simdutf8", ] @@ -1822,6 +1867,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.31" @@ -2091,6 +2142,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] [[package]] name = "hashbrown" @@ -2098,7 +2152,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash", + "ahash 0.8.12", ] [[package]] @@ -2601,7 +2655,7 @@ dependencies = [ "log", "magicblock-config", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "random-port", "rayon", "serde", @@ -3139,7 +3193,7 @@ dependencies = [ "lru", "magicblock-config", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-magic-program-api 0.4.1", "magicblock-metrics", "solana-account", @@ -3187,7 +3241,7 @@ dependencies = [ "log", "lru", "magicblock-committor-program", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-metrics", "magicblock-program", "magicblock-rpc-client", @@ -3262,6 +3316,28 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "magicblock-delegation-program" +version = "1.1.3" +source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=a56deac#a56deaca2fac5fb422565fdf6369baf893266d19" +dependencies = [ + "bincode", + "borsh 1.5.7", + "bytemuck", + "num_enum", + "pinocchio", + "pinocchio-log", + "pinocchio-pubkey", + "pinocchio-system", + "rkyv 0.7.45", + "solana-curve25519", + "solana-program", + "solana-security-txt", + "static_assertions", + "strum 0.27.2", + "thiserror 1.0.69", +] + [[package]] name = "magicblock-ledger" version = "0.4.1" @@ -3350,7 +3426,7 @@ dependencies = [ "solana-pubkey", "solana-rent-collector", "solana-sdk-ids", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=48787597)", + "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=3e9456ec4)", "solana-svm-transaction", "solana-system-program", "solana-transaction", @@ -3432,7 +3508,7 @@ name = "magicblock-validator-admin" version = "0.4.1" dependencies = [ "log", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-program", "magicblock-rpc-client", "solana-rpc-client", @@ -4301,7 +4377,7 @@ version = "0.0.0" dependencies = [ "borsh 1.5.7", "ephemeral-rollups-sdk", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-magic-program-api 0.4.1", "solana-program", ] @@ -4400,13 +4476,33 @@ dependencies = [ "autotools", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive 0.1.4", +] + [[package]] name = "ptr_meta" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe9e76f66d3f9606f44e45598d155cb13ecf09f4a28199e48daf8c8fc937ea90" dependencies = [ - "ptr_meta_derive", + "ptr_meta_derive 0.3.0", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -4527,13 +4623,19 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rancor" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caf5f7161924b9d1cea0e4cabc97c372cea92b5f927fc13c6bca67157a0ad947" dependencies = [ - "ptr_meta", + "ptr_meta 0.3.0", ] [[package]] @@ -4755,6 +4857,15 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "rend" version = "0.5.2" @@ -4834,6 +4945,24 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta 0.1.4", + "rend 0.4.2", + "rkyv_derive 0.7.45", + "seahash", + "tinyvec", + "uuid", +] + [[package]] name = "rkyv" version = "0.8.11" @@ -4844,14 +4973,25 @@ dependencies = [ "hashbrown 0.15.4", "indexmap 2.10.0", "munge", - "ptr_meta", + "ptr_meta 0.3.0", "rancor", - "rend", - "rkyv_derive", + "rend 0.5.2", + "rkyv_derive 0.8.11", "tinyvec", "uuid", ] +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rkyv_derive" version = "0.8.11" @@ -5112,7 +5252,7 @@ dependencies = [ "integration-test-tools", "log", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "program-schedulecommit", "solana-program", "solana-rpc-client", @@ -5130,7 +5270,7 @@ dependencies = [ "log", "magicblock-committor-program", "magicblock-committor-service", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-program", "magicblock-rpc-client", "magicblock-table-mania", @@ -5223,6 +5363,12 @@ version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "security-framework" version = "3.2.0" @@ -5623,7 +5769,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d65a1a23a53cae19cb92bab2cbdd9e289e5210bb12175ce27642c94adf74b220" dependencies = [ - "ahash", + "ahash 0.8.12", "bincode", "blake3", "bv", @@ -5924,7 +6070,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4ee734c35b736e632aa3b1367f933d93ee7b4129dd1e20ca942205d4834054e" dependencies = [ - "ahash", + "ahash 0.8.12", "lazy_static", "log", "qualifier_attr", @@ -6150,7 +6296,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a675ead1473b32a7a5735801608b35cbd8d3f5057ca8dbafdd5976146bb7e9e4" dependencies = [ - "ahash", + "ahash 0.8.12", "lazy_static", "log", "solana-bincode", @@ -6336,7 +6482,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89e1d3b52b4a014efeaaab67f14e40af3972a4be61c523d612860db8e3145529" dependencies = [ - "ahash", + "ahash 0.8.12", "lazy_static", "solana-epoch-schedule", "solana-hash", @@ -6815,7 +6961,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f0962d3818fc942a888f7c2d530896aeaf6f2da2187592a67bbdc8cf8a54192" dependencies = [ - "ahash", + "ahash 0.8.12", "bincode", "bv", "caps", @@ -7370,7 +7516,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5335e7925f6dc8d2fdcdc6ead3b190aca65f191a11cef74709a7a6ab5d0d5877" dependencies = [ - "ahash", + "ahash 0.8.12", "aquamarine", "arrayref", "base64 0.22.1", @@ -7441,8 +7587,8 @@ dependencies = [ "solana-vote", "solana-vote-program", "static_assertions", - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", "symlink", "tar", "tempfile", @@ -7915,7 +8061,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0850baf834aba4a94a7558fa6cf6ca93fad284abf0363dec5fb9cab173a11fc4" dependencies = [ - "ahash", + "ahash 0.8.12", "itertools 0.12.1", "log", "percentage", @@ -7957,9 +8103,9 @@ dependencies = [ [[package]] name = "solana-svm" version = "2.2.1" -source = "git+https://github.com/magicblock-labs/magicblock-svm.git?rev=48787597#48787597fcbbdf301a068c2fec9c032419a2d3ce" +source = "git+https://github.com/magicblock-labs/magicblock-svm.git?rev=3e9456ec4#3e9456ec4d5798ad8281537501c1e777d6888ba3" dependencies = [ - "ahash", + "ahash 0.8.12", "log", "percentage", "qualifier_attr", @@ -8618,7 +8764,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd1adc42def3cb101f3ebef3cd2d642f9a21072bbcd4ec9423343ccaa6afa596" dependencies = [ - "ahash", + "ahash 0.8.12", "bumpalo", "bytes", "cfg-if", @@ -9052,7 +9198,16 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", ] [[package]] @@ -9068,6 +9223,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "subtle" version = "2.6.1" @@ -9159,6 +9326,12 @@ dependencies = [ "solana-program", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tar" version = "0.4.44" @@ -9258,7 +9431,7 @@ dependencies = [ "log", "magicblock-chainlink", "magicblock-config", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "program-flexi-counter", "program-mini", "solana-account", @@ -9340,7 +9513,7 @@ dependencies = [ "log", "magicblock-accounts-db", "magicblock-config", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "program-flexi-counter", "solana-rpc-client", "solana-sdk", @@ -9361,7 +9534,7 @@ dependencies = [ "magic-domain-program", "magicblock-api", "magicblock-config", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "magicblock-program", "magicblock-validator-admin", "solana-rpc-client", @@ -9401,7 +9574,7 @@ version = "0.0.0" dependencies = [ "integration-test-tools", "log", - "magicblock-delegation-program", + "magicblock-delegation-program 1.1.3", "program-flexi-counter", "solana-rpc-client-api", "solana-sdk", @@ -10640,6 +10813,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "x509-parser" version = "0.14.0" From 4f7f74546352537f83e6d812390f13f0b481b689 Mon Sep 17 00:00:00 2001 From: taco-paco Date: Wed, 10 Dec 2025 11:59:45 +0700 Subject: [PATCH 7/9] fix: integration tests, have to compile dlp with logging feature --- .../src/intent_executor/error.rs | 9 +++++---- test-integration/schedulecommit/elfs/dlp.so | Bin 346384 -> 347744 bytes 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/magicblock-committor-service/src/intent_executor/error.rs b/magicblock-committor-service/src/intent_executor/error.rs index 2a83f8ab3..7e8f9c03f 100644 --- a/magicblock-committor-service/src/intent_executor/error.rs +++ b/magicblock-committor-service/src/intent_executor/error.rs @@ -156,8 +156,9 @@ impl From for TransactionStrategyExecutionError { } impl TransactionStrategyExecutionError { - // There's always 2 budget instructions in front - const OFFSET: u8 = 2; + /// Number of compute budget instructions prepended to every transaction. + /// Used to map instruction indices back to task indices. + const TASK_OFFSET: u8 = 2; pub fn is_cpi_limit_error(&self) -> bool { matches!(self, Self::CpiLimitError(_, _)) @@ -184,7 +185,7 @@ impl TransactionStrategyExecutionError { | Self::CpiLimitError( TransactionError::InstructionError(index, _), _, - ) => index.checked_sub(Self::OFFSET), + ) => index.checked_sub(Self::TASK_OFFSET), _ => None, } } @@ -235,7 +236,7 @@ impl TransactionStrategyExecutionError { let tx_err_helper = |instruction_err| -> TransactionError { TransactionError::InstructionError(index, instruction_err) }; - let Some(action_index) = index.checked_sub(Self::OFFSET) else { + let Some(action_index) = index.checked_sub(Self::TASK_OFFSET) else { return Err(tx_err_helper(instruction_err)); }; diff --git a/test-integration/schedulecommit/elfs/dlp.so b/test-integration/schedulecommit/elfs/dlp.so index 740d769832ae0184c53f081558ec2895cea29880..534ccf787e162fbdef3e7c7a1f3d357f1552f9fd 100755 GIT binary patch delta 59787 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 delta 58611 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 Date: Fri, 12 Dec 2025 14:08:11 +0700 Subject: [PATCH 8/9] fix: compilation --- magicblock-committor-service/src/intent_executor/error.rs | 3 ++- .../src/intent_executor/single_stage_executor.rs | 2 +- test-integration/Cargo.lock | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/magicblock-committor-service/src/intent_executor/error.rs b/magicblock-committor-service/src/intent_executor/error.rs index 7e8f9c03f..1ecb45a2e 100644 --- a/magicblock-committor-service/src/intent_executor/error.rs +++ b/magicblock-committor-service/src/intent_executor/error.rs @@ -236,7 +236,8 @@ impl TransactionStrategyExecutionError { let tx_err_helper = |instruction_err| -> TransactionError { TransactionError::InstructionError(index, instruction_err) }; - let Some(action_index) = index.checked_sub(Self::TASK_OFFSET) else { + let Some(action_index) = index.checked_sub(Self::TASK_OFFSET) + else { return Err(tx_err_helper(instruction_err)); }; diff --git a/magicblock-committor-service/src/intent_executor/single_stage_executor.rs b/magicblock-committor-service/src/intent_executor/single_stage_executor.rs index 50b1b4960..8142ffcc0 100644 --- a/magicblock-committor-service/src/intent_executor/single_stage_executor.rs +++ b/magicblock-committor-service/src/intent_executor/single_stage_executor.rs @@ -2,7 +2,7 @@ use std::ops::ControlFlow; use log::error; use solana_pubkey::Pubkey; -use solana_sdk::signature::Signature; +use solana_signature::Signature; use crate::{ intent_executor::{ diff --git a/test-integration/Cargo.lock b/test-integration/Cargo.lock index f6db455b3..ecd7ee2cc 100644 --- a/test-integration/Cargo.lock +++ b/test-integration/Cargo.lock @@ -5773,7 +5773,7 @@ dependencies = [ [[package]] name = "solana-account" version = "2.2.1" -source = "git+https://github.com/magicblock-labs/solana-account.git?rev=1beed4c#1beed4c0bc368bc0bed819fbdf551d1a4bf00001" +source = "git+https://github.com/magicblock-labs/solana-account.git?rev=57158728#571587284a525b66666291aee5174783139a1595" dependencies = [ "bincode", "qualifier_attr", From fa5948dca83305b708390b54d127d46c3f255db5 Mon Sep 17 00:00:00 2001 From: taco-paco Date: Fri, 12 Dec 2025 14:12:40 +0700 Subject: [PATCH 9/9] feat: use latest dlp --- Cargo.lock | 2 +- Cargo.toml | 2 +- test-integration/Cargo.lock | 2 +- test-integration/Cargo.toml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3d7c1b13b..0923d2bdf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2952,7 +2952,7 @@ dependencies = [ [[package]] name = "magicblock-delegation-program" version = "1.1.3" -source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=a56deac#a56deaca2fac5fb422565fdf6369baf893266d19" +source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=735640a#735640a1260f5bf77d907b5fd46ca50dd162afbd" dependencies = [ "bincode", "borsh 1.5.7", diff --git a/Cargo.toml b/Cargo.toml index 0e140a48a..17a1ad17d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -95,7 +95,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 = "a56deac", features = [ +magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "735640a", features = [ "no-entrypoint", ] } magicblock-ledger = { path = "./magicblock-ledger" } diff --git a/test-integration/Cargo.lock b/test-integration/Cargo.lock index ecd7ee2cc..233d2b2e2 100644 --- a/test-integration/Cargo.lock +++ b/test-integration/Cargo.lock @@ -3362,7 +3362,7 @@ dependencies = [ [[package]] name = "magicblock-delegation-program" version = "1.1.3" -source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=a56deac#a56deaca2fac5fb422565fdf6369baf893266d19" +source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=735640a#735640a1260f5bf77d907b5fd46ca50dd162afbd" dependencies = [ "bincode", "borsh 1.5.7", diff --git a/test-integration/Cargo.toml b/test-integration/Cargo.toml index 4f55117a9..52c359fad 100644 --- a/test-integration/Cargo.toml +++ b/test-integration/Cargo.toml @@ -57,7 +57,7 @@ magicblock-config = { path = "../magicblock-config" } magicblock-core = { path = "../magicblock-core" } magic-domain-program = { git = "https://github.com/magicblock-labs/magic-domain-program.git", rev = "ea04d46", default-features = false } 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 = "a56deac", features = [ +magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "735640a", features = [ "no-entrypoint", ] } magicblock-program = { path = "../programs/magicblock" }