From 5ba8ded3aa632516bd581d4253de258b12eb0cb9 Mon Sep 17 00:00:00 2001 From: Muad'Dib Date: Mon, 18 May 2026 20:37:48 +0200 Subject: [PATCH 1/2] fix(interpreter): adapt to ergo_avltree_rust fork's Arc Resolver API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The local fork at ~/projects/ergo_avltree_rust/ (HEAD 879545c) changed the Resolver type from `fn(&Digest32) -> Node` to `Arc Node + Send + Sync>` (fork commit 28862a1) to support stateful persistence-backed resolvers. The fork-corrected contains semantics (fork commit 879545c) is the canonical reference for the ergots TypeScript port's AVL+ verifier, so ergots' fixture-gen applies [patch.crates-io] to redirect ergo_avltree_rust to the fork. That redirection forces ergotree- interpreter to compile against the new Resolver API. This commit wraps every bare-closure Resolver call site in Arc::new(...) so ergotree-interpreter compiles cleanly against the fork. Identical to the migration upstream sigma-rust would need if/when the fork's API change merges into a future ergo_avltree_rust release. Affects: savltree.rs (10 sites incl. tests), tree_lookup.rs (2 sites). No semantic behavior changes — pure type-level adaptation. Co-Authored-By: Claude Opus 4.7 (1M context) --- ergotree-interpreter/src/eval/savltree.rs | 21 ++++++++++---------- ergotree-interpreter/src/eval/tree_lookup.rs | 6 ++++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/ergotree-interpreter/src/eval/savltree.rs b/ergotree-interpreter/src/eval/savltree.rs index f7a7b60e4..f90cab5b0 100644 --- a/ergotree-interpreter/src/eval/savltree.rs +++ b/ergotree-interpreter/src/eval/savltree.rs @@ -11,6 +11,7 @@ use ergo_avltree_rust::batch_avl_verifier::BatchAVLVerifier; use ergo_avltree_rust::batch_node::AVLTree; use ergo_avltree_rust::batch_node::Node; use ergo_avltree_rust::batch_node::NodeHeader; +use ergo_avltree_rust::operation::Digest32; use ergo_avltree_rust::operation::KeyValue; use ergo_avltree_rust::operation::Operation; use ergo_chain_types::ADDigest; @@ -113,7 +114,7 @@ pub(crate) static GET_EVAL_FN: EvalFn = |_mc, _env, _ctx, obj, args| { &starting_digest, &proof, AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), avl_tree_data.key_length as usize, avl_tree_data .value_length_opt @@ -161,7 +162,7 @@ pub(crate) static GET_MANY_EVAL_FN: EvalFn = &starting_digest, &proof, AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), avl_tree_data.key_length as usize, avl_tree_data .value_length_opt @@ -228,7 +229,7 @@ pub(crate) static INSERT_EVAL_FN: EvalFn = &starting_digest, &proof, AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), avl_tree_data.key_length as usize, avl_tree_data .value_length_opt @@ -293,7 +294,7 @@ pub(crate) static REMOVE_EVAL_FN: EvalFn = &starting_digest, &proof, AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), avl_tree_data.key_length as usize, avl_tree_data .value_length_opt @@ -349,7 +350,7 @@ pub(crate) static CONTAINS_EVAL_FN: EvalFn = |_mc, _env, _ctx, obj, args| { &starting_digest, &proof, AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), avl_tree_data.key_length as usize, avl_tree_data .value_length_opt @@ -397,7 +398,7 @@ pub(crate) static UPDATE_EVAL_FN: EvalFn = &starting_digest, &proof, AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), avl_tree_data.key_length as usize, avl_tree_data .value_length_opt @@ -456,7 +457,7 @@ pub(crate) static INSERT_OR_UPDATE_EVAL_FN: EvalFn = |_mc, _env, _ctx, obj, args &starting_digest, &proof, AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), avl_tree_data.key_length as usize, avl_tree_data .value_length_opt @@ -666,7 +667,7 @@ mod tests { // This example taken from `ergo_avltree_rust` README let mut prover = BatchAVLProver::new( AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), 1, None, ), @@ -772,7 +773,7 @@ mod tests { fn eval_avl_insert_or_update() { let mut prover = BatchAVLProver::new( AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), 1, None, ), @@ -1188,7 +1189,7 @@ mod tests { fn populate_tree(entries: Vec<(Vec, Vec)>) -> BatchAVLProver { let mut prover = BatchAVLProver::new( AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), 1, None, ), diff --git a/ergotree-interpreter/src/eval/tree_lookup.rs b/ergotree-interpreter/src/eval/tree_lookup.rs index a98da823f..2fac058ae 100644 --- a/ergotree-interpreter/src/eval/tree_lookup.rs +++ b/ergotree-interpreter/src/eval/tree_lookup.rs @@ -1,4 +1,5 @@ use alloc::boxed::Box; +use alloc::sync::Arc; use alloc::vec::Vec; use bytes::Bytes; use ergotree_ir::mir::tree_lookup::TreeLookup; @@ -10,6 +11,7 @@ use crate::eval::EvalError; use crate::eval::Evaluable; use ergo_avltree_rust::batch_avl_verifier::BatchAVLVerifier; use ergo_avltree_rust::batch_node::{AVLTree, Node, NodeHeader}; +use ergo_avltree_rust::operation::Digest32; use ergo_avltree_rust::operation::Operation; use ergotree_ir::mir::avl_tree_data::AvlTreeData; use ergotree_ir::mir::constant::TryExtractInto; @@ -35,7 +37,7 @@ impl Evaluable for TreeLookup { &starting_digest, &proof, AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), normalized_tree_val.key_length as usize, normalized_tree_val .value_length_opt @@ -151,7 +153,7 @@ mod tests { fn populate_tree(entries: Vec<(Vec, Vec)>) -> BatchAVLProver { let mut prover = BatchAVLProver::new( AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), 1, None, ), From 2bcf83e55866cfe72bb621e984948acbfa532299 Mon Sep 17 00:00:00 2001 From: Muad'Dib Date: Tue, 19 May 2026 00:05:12 +0200 Subject: [PATCH 2/2] fix(interpreter): wrap 13th Resolver closure site in create_avl_tree test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Completes the Arc Resolver API-compat fix from ff2c514f. The prior commit wrapped 12 of 13 closure call sites (10 in savltree.rs + 2 in tree_lookup.rs) but missed the test-only site in create_avl_tree.rs at the eval_create_avl_tree fn. Adds `use alloc::sync::Arc` and `use ergo_avltree_rust::operation::Digest32` inside the test mod, then wraps the bare closure in the same Arc::new(|digest: &Digest32| ...) pattern used everywhere else. Canonical build environment for integration/ergots is via the ergots/fixture-gen `[patch.crates-io] ergo_avltree_rust = { path = ... }` directive which routes to the local fork at ~/projects/ergo_avltree_rust/ (HEAD 879545c). Confirmed clean fixture-gen build (4.63s) with this edit. Standalone `cargo build` from the worktree fails by design under the new Resolver API — the integration/ergots branch is incompatible with crates.io ergo_avltree_rust@0.1.1's bare-fn-pointer API, by intent (per option A of the prior session's discussion). Co-Authored-By: Claude Opus 4.7 (1M context) --- ergotree-interpreter/src/eval/create_avl_tree.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ergotree-interpreter/src/eval/create_avl_tree.rs b/ergotree-interpreter/src/eval/create_avl_tree.rs index a2ceb43cc..d6c87155f 100644 --- a/ergotree-interpreter/src/eval/create_avl_tree.rs +++ b/ergotree-interpreter/src/eval/create_avl_tree.rs @@ -50,9 +50,11 @@ mod tests { use super::*; use crate::eval::test_util::eval_out_wo_ctx; + use alloc::sync::Arc; use ergo_avltree_rust::authenticated_tree_ops::AuthenticatedTreeOps; use ergo_avltree_rust::batch_avl_prover::BatchAVLProver; use ergo_avltree_rust::batch_node::{AVLTree, Node, NodeHeader}; + use ergo_avltree_rust::operation::Digest32; use ergo_chain_types::ADDigest; use ergotree_ir::mir::{ avl_tree_data::{AvlTreeData, AvlTreeFlags}, @@ -64,7 +66,7 @@ mod tests { fn eval_create_avl_tree() { let prover = BatchAVLProver::new( AVLTree::new( - |digest| Node::LabelOnly(NodeHeader::new(Some(*digest), None)), + Arc::new(|digest: &Digest32| Node::LabelOnly(NodeHeader::new(Some(*digest), None))), 1, None, ),