Skip to main content

uor_addr_wasm/
lib.rs

1//! **`uor-addr-wasm` — WASM Component Model bindings for `uor-addr`**.
2//!
3//! Generates a Component-Model component from the WIT interface at
4//! `wit/uor-addr.wit` via the `wit-bindgen` macro. Exports:
5//!
6//! - one `*-address` function per UOR-ADDR realization (κ-label only),
7//! - one `*-address-with-witness` function per realization (returning
8//!   an opaque `grounded` resource that carries the ψ-pipeline
9//!   derivation),
10//! - the `grounded` resource type with three methods:
11//!   `kappa-label`, `content-fingerprint`, `verify`.
12//!
13//! # Polyglot consumption
14//!
15//! This crate is pure compute — it imports nothing from the host. Build
16//! it for `wasm32-unknown-unknown` and componentize the resulting core
17//! module (`jco new`, or `wasm-tools component new`) to obtain a
18//! **zero-import Component Model component**. Prefer this over
19//! `wasm32-wasip2`: the wasip2 target links std's WASI runtime
20//! (`cli`/`io`/`exit`/`environment`) into the component even though it
21//! is never called, which forces every host to provision WASI 0.2 and —
22//! for the JS path — pins jco's Node-only `preview2-shim`, breaking
23//! browser / Deno / Bun / Workers / bundler use.
24//!
25//! The zero-import component is consumable from:
26//!
27//! - **JS / TS** via `jco transpile` → npm-publishable bindings that run
28//!   in any JS environment (see `bindings/npm/scripts/build.mjs`).
29//! - **Python** via `wasmtime-py` (once it adds Component Model
30//!   support; until then Python uses the C ABI path).
31//! - **Go** via `wasmtime-go`.
32//! - **.NET** via `Wasmtime.NET`.
33//! - **Ruby / Java / C#** via their respective wasmtime bindings.
34//!
35//! All host paths produce the **same 71-byte κ-label byte-for-byte**
36//! as the Rust + C ABI paths.
37//!
38//! # TC-05 replay across the wasm boundary
39//!
40//! `grounded.verify()` re-certifies the witness's owned replay
41//! `Trace<256>` through `prism::replay::certify_from_trace` (ADR-060,
42//! via `uor_addr::AddressWitness::verify`), returning the re-derived
43//! κ-label. The verifier path does **not** re-invoke the canonical
44//! SHA-256 hash axis (TC-05 / QS-05 — see CL-R\* in CONFORMANCE.md). The
45//! resource carries the in-process owned witness; cross-process replay
46//! requires re-minting at the verifier side (a deliberate constraint of
47//! the Component Model resource lifecycle).
48//!
49//! # Allocator
50//!
51//! The WIT Component Model represents `list<u8>` and `string` as
52//! heap-allocated Rust types in the binding layer (`Vec<u8>` and
53//! `String`). Wasm runtimes ship an allocator; the binding turns on
54//! the `alloc` feature of `uor-addr` accordingly. The underlying
55//! ψ-pipeline remains no_alloc — only the host-input / host-output
56//! marshalling at the Component Model boundary allocates.
57
58// `uor-addr-wasm` targets `wasm32-unknown-unknown` (componentized
59// post-build). Outside `wasm32`, the crate compiles to an empty
60// `rlib`/`cdylib` so the workspace builds without a wasm toolchain
61// everywhere. The Component Model symbol exports only link on `wasm32`.
62
63#![cfg_attr(not(target_arch = "wasm32"), allow(dead_code))]
64
65#[cfg(target_arch = "wasm32")]
66mod component {
67    use std::string::ToString;
68    use std::vec::Vec;
69
70    // `wit-bindgen` generates the Component Model glue from the WIT
71    // file at compile time. `world: "uor-addr"` matches the world
72    // declared in `wit/uor-addr.wit`. The `grounded` resource is
73    // bound to `GroundedImpl` through the `Guest::Grounded` associated
74    // type below — wit-bindgen 0.34 uses the associated-type pattern
75    // (not the `with:` remap) for resources declared in the world's
76    // exported interfaces.
77    wit_bindgen::generate!({
78        world: "uor-addr",
79        path: "wit/uor-addr.wit",
80        generate_all,
81    });
82
83    use exports::uor::addr::kappa::{
84        AddressError, Grounded, Guest, GuestGrounded, HashAlgorithm, KappaLabel, VerifyError,
85    };
86
87    /// Component-Model export root.
88    pub struct UorAddrComponent;
89
90    // ─── grounded resource: the foreign-managed witness handle ────────
91
92    /// The Rust-side state behind the WIT `resource grounded`. Holds
93    /// the `AddressOutcome` (which carries the sealed
94    /// `Grounded<AddressLabel>` and the 71-byte κ-label) for the
95    /// lifetime of the resource handle.
96    ///
97    /// wit-bindgen wraps this in a `Grounded` handle that the host
98    /// consumes via the WIT method exports; the host's `own grounded`
99    /// drop triggers `Drop` here, releasing the Rust state.
100    /// Width-erased owned outcome — lets one `grounded` resource carry a
101    /// κ-label of any admissible σ-axis width (71 / 73 / 74).
102    enum AnyOutcome {
103        W71(uor_addr::AddressOutcome<71>),
104        W73(uor_addr::AddressOutcome<73>),
105        W74(uor_addr::AddressOutcome<74>),
106        W512(uor_addr::AddressOutcome<135, 64>),
107    }
108
109    impl From<uor_addr::AddressOutcome<71>> for AnyOutcome {
110        fn from(o: uor_addr::AddressOutcome<71>) -> Self {
111            Self::W71(o)
112        }
113    }
114    impl From<uor_addr::AddressOutcome<73>> for AnyOutcome {
115        fn from(o: uor_addr::AddressOutcome<73>) -> Self {
116            Self::W73(o)
117        }
118    }
119    impl From<uor_addr::AddressOutcome<74>> for AnyOutcome {
120        fn from(o: uor_addr::AddressOutcome<74>) -> Self {
121            Self::W74(o)
122        }
123    }
124    impl From<uor_addr::AddressOutcome<135, 64>> for AnyOutcome {
125        fn from(o: uor_addr::AddressOutcome<135, 64>) -> Self {
126            Self::W512(o)
127        }
128    }
129
130    impl AnyOutcome {
131        fn label(&self) -> String {
132            match self {
133                Self::W71(o) => o.address.as_str().to_string(),
134                Self::W73(o) => o.address.as_str().to_string(),
135                Self::W74(o) => o.address.as_str().to_string(),
136                Self::W512(o) => o.address.as_str().to_string(),
137            }
138        }
139        fn fingerprint(&self) -> Vec<u8> {
140            match self {
141                Self::W71(o) => o.witness.content_fingerprint().to_vec(),
142                Self::W73(o) => o.witness.content_fingerprint().to_vec(),
143                Self::W74(o) => o.witness.content_fingerprint().to_vec(),
144                Self::W512(o) => o.witness.content_fingerprint().to_vec(),
145            }
146        }
147        fn verify(&self) -> Result<String, uor_addr::VerifyError> {
148            match self {
149                Self::W71(o) => o.witness.verify().map(|l| l.as_str().to_string()),
150                Self::W73(o) => o.witness.verify().map(|l| l.as_str().to_string()),
151                Self::W74(o) => o.witness.verify().map(|l| l.as_str().to_string()),
152                Self::W512(o) => o.witness.verify().map(|l| l.as_str().to_string()),
153            }
154        }
155    }
156
157    pub struct GroundedImpl {
158        outcome: AnyOutcome,
159    }
160
161    impl GuestGrounded for GroundedImpl {
162        fn kappa_label(&self) -> KappaLabel {
163            self.outcome.label()
164        }
165
166        fn content_fingerprint(&self) -> Vec<u8> {
167            // ADR-060: the witness owns its 32-byte σ-projection fingerprint.
168            self.outcome.fingerprint()
169        }
170
171        fn verify(&self) -> Result<KappaLabel, VerifyError> {
172            // ADR-060: `verify()` re-certifies the owned replay `Trace<256>`
173            // through `prism::replay::certify_from_trace` (SHA-256 is *not*
174            // re-invoked) and confirms the re-derived fingerprint matches
175            // (QS-05 replay equivalence; CL-R* in CONFORMANCE.md), returning
176            // the recovered κ-label.
177            self.outcome.verify().map_err(map_verify_error)
178        }
179    }
180
181    fn map_verify_error(e: uor_addr::VerifyError) -> VerifyError {
182        // Both are defensive — unreachable for a witness this component
183        // minted. Map to the closest existing WIT verify-error variants.
184        match e {
185            uor_addr::VerifyError::ReplayFailed => VerifyError::EmptyTrace,
186            uor_addr::VerifyError::FingerprintMismatch => VerifyError::OutOfOrderEvent,
187        }
188    }
189
190    // ─── Helpers to factor out the κ-label-only path ────────────────
191
192    // Under ADR-060 every realization's `AddressFailure` is the uniform
193    // two-variant `{ Invalid*, PipelineFailure }` (no `TooLarge` — inputs
194    // are unbounded). `$err_ty` is retained for the `PipelineFailure`
195    // path; `$invalid` names the realization's parse-rejection variant.
196    macro_rules! map_addr {
197        ($result:expr, $err_ty:path, $invalid:path) => {
198            match $result {
199                Ok(outcome) => Ok(outcome.address.as_str().to_string()),
200                Err($invalid) => Err(AddressError::InvalidInput),
201                Err(<$err_ty>::PipelineFailure) => Err(AddressError::PipelineFailure),
202            }
203        };
204    }
205
206    macro_rules! map_witness {
207        ($result:expr, $err_ty:path, $invalid:path) => {
208            match $result {
209                Ok(outcome) => Ok(Grounded::new(GroundedImpl {
210                    outcome: outcome.into(),
211                })),
212                Err($invalid) => Err(AddressError::InvalidInput),
213                Err(<$err_ty>::PipelineFailure) => Err(AddressError::PipelineFailure),
214            }
215        };
216    }
217
218    // ─── κ-label composition helpers (ADR-061) ─────────────────────
219    //
220    // Operands arrive as κ-label strings; each axis fixes the
221    // `KappaLabel<N>` width. A parse failure or a `CompositionFailure`
222    // other than `PipelineFailure` (malformed operand / σ-axis mismatch)
223    // maps to `invalid-input`; the WIT `address-error` surface is
224    // unchanged.
225    fn map_compose_failure(e: uor_addr::composition::CompositionFailure) -> AddressError {
226        match e {
227            uor_addr::composition::CompositionFailure::PipelineFailure => {
228                AddressError::PipelineFailure
229            }
230            _ => AddressError::InvalidInput,
231        }
232    }
233
234    /// Unary composition → κ-label.
235    fn compose1_label<const N: usize, const FP: usize>(
236        operand: &str,
237        f: impl Fn(
238            &uor_addr::KappaLabel<N>,
239        )
240            -> Result<uor_addr::AddressOutcome<N, FP>, uor_addr::composition::CompositionFailure>,
241    ) -> Result<KappaLabel, AddressError> {
242        let l = uor_addr::KappaLabel::<N>::from_bytes(operand.as_bytes())
243            .map_err(|_| AddressError::InvalidInput)?;
244        f(&l)
245            .map(|o| o.address.as_str().to_string())
246            .map_err(map_compose_failure)
247    }
248
249    /// Unary composition → verifiable witness.
250    fn compose1_witness<const N: usize, const FP: usize>(
251        operand: &str,
252        f: impl Fn(
253            &uor_addr::KappaLabel<N>,
254        )
255            -> Result<uor_addr::AddressOutcome<N, FP>, uor_addr::composition::CompositionFailure>,
256    ) -> Result<Grounded, AddressError>
257    where
258        AnyOutcome: From<uor_addr::AddressOutcome<N, FP>>,
259    {
260        let l = uor_addr::KappaLabel::<N>::from_bytes(operand.as_bytes())
261            .map_err(|_| AddressError::InvalidInput)?;
262        f(&l)
263            .map(|o| Grounded::new(GroundedImpl { outcome: o.into() }))
264            .map_err(map_compose_failure)
265    }
266
267    /// Binary (CS-G2) composition → κ-label.
268    fn compose2_label<const N: usize, const FP: usize>(
269        left: &str,
270        right: &str,
271        f: impl Fn(
272            &uor_addr::KappaLabel<N>,
273            &uor_addr::KappaLabel<N>,
274        )
275            -> Result<uor_addr::AddressOutcome<N, FP>, uor_addr::composition::CompositionFailure>,
276    ) -> Result<KappaLabel, AddressError> {
277        let la = uor_addr::KappaLabel::<N>::from_bytes(left.as_bytes())
278            .map_err(|_| AddressError::InvalidInput)?;
279        let ra = uor_addr::KappaLabel::<N>::from_bytes(right.as_bytes())
280            .map_err(|_| AddressError::InvalidInput)?;
281        f(&la, &ra)
282            .map(|o| o.address.as_str().to_string())
283            .map_err(map_compose_failure)
284    }
285
286    /// Binary (CS-G2) composition → verifiable witness.
287    fn compose2_witness<const N: usize, const FP: usize>(
288        left: &str,
289        right: &str,
290        f: impl Fn(
291            &uor_addr::KappaLabel<N>,
292            &uor_addr::KappaLabel<N>,
293        )
294            -> Result<uor_addr::AddressOutcome<N, FP>, uor_addr::composition::CompositionFailure>,
295    ) -> Result<Grounded, AddressError>
296    where
297        AnyOutcome: From<uor_addr::AddressOutcome<N, FP>>,
298    {
299        let la = uor_addr::KappaLabel::<N>::from_bytes(left.as_bytes())
300            .map_err(|_| AddressError::InvalidInput)?;
301        let ra = uor_addr::KappaLabel::<N>::from_bytes(right.as_bytes())
302            .map_err(|_| AddressError::InvalidInput)?;
303        f(&la, &ra)
304            .map(|o| Grounded::new(GroundedImpl { outcome: o.into() }))
305            .map_err(map_compose_failure)
306    }
307
308    impl Guest for UorAddrComponent {
309        type Grounded = GroundedImpl;
310
311        // ─── κ-label-only entry points ──────────────────────────────
312
313        fn json_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
314            map_addr!(
315                uor_addr::json::address(&input),
316                uor_addr::json::AddressFailure,
317                uor_addr::json::AddressFailure::InvalidJson
318            )
319        }
320
321        fn sexp_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
322            map_addr!(
323                uor_addr::sexp::address(&input),
324                uor_addr::sexp::AddressFailure,
325                uor_addr::sexp::AddressFailure::InvalidSExpr
326            )
327        }
328
329        fn xml_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
330            map_addr!(
331                uor_addr::xml::address(&input),
332                uor_addr::xml::AddressFailure,
333                uor_addr::xml::AddressFailure::InvalidXml
334            )
335        }
336
337        fn asn1_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
338            map_addr!(
339                uor_addr::asn1::address(&input),
340                uor_addr::asn1::AddressFailure,
341                uor_addr::asn1::AddressFailure::InvalidDer
342            )
343        }
344
345        fn ring_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
346            map_addr!(
347                uor_addr::ring::address(&input),
348                uor_addr::ring::AddressFailure,
349                uor_addr::ring::AddressFailure::InvalidRingElement
350            )
351        }
352
353        fn codemodule_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
354            map_addr!(
355                uor_addr::codemodule::address(&input),
356                uor_addr::codemodule::AddressFailure,
357                uor_addr::codemodule::AddressFailure::InvalidAst
358            )
359        }
360
361        fn cbor_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
362            map_addr!(
363                uor_addr::cbor::address(&input),
364                uor_addr::cbor::AddressFailure,
365                uor_addr::cbor::AddressFailure::InvalidCbor
366            )
367        }
368
369        fn schema_photo_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
370            map_addr!(
371                uor_addr::schema::photo::address(&input),
372                uor_addr::schema::photo::AddressFailure,
373                uor_addr::schema::photo::AddressFailure::SchemaViolation
374            )
375        }
376
377        fn schema_document_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
378            map_addr!(
379                uor_addr::schema::document::address(&input),
380                uor_addr::schema::document::AddressFailure,
381                uor_addr::schema::document::AddressFailure::SchemaViolation
382            )
383        }
384
385        fn schema_codemodule_signed_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
386            map_addr!(
387                uor_addr::schema::codemodule_signed::address(&input),
388                uor_addr::schema::codemodule_signed::AddressFailure,
389                uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
390            )
391        }
392
393        // ─── Witness-bearing entry points ───────────────────────────
394
395        fn json_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
396            map_witness!(
397                uor_addr::json::address(&input),
398                uor_addr::json::AddressFailure,
399                uor_addr::json::AddressFailure::InvalidJson
400            )
401        }
402
403        fn sexp_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
404            map_witness!(
405                uor_addr::sexp::address(&input),
406                uor_addr::sexp::AddressFailure,
407                uor_addr::sexp::AddressFailure::InvalidSExpr
408            )
409        }
410
411        fn xml_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
412            map_witness!(
413                uor_addr::xml::address(&input),
414                uor_addr::xml::AddressFailure,
415                uor_addr::xml::AddressFailure::InvalidXml
416            )
417        }
418
419        fn asn1_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
420            map_witness!(
421                uor_addr::asn1::address(&input),
422                uor_addr::asn1::AddressFailure,
423                uor_addr::asn1::AddressFailure::InvalidDer
424            )
425        }
426
427        fn ring_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
428            map_witness!(
429                uor_addr::ring::address(&input),
430                uor_addr::ring::AddressFailure,
431                uor_addr::ring::AddressFailure::InvalidRingElement
432            )
433        }
434
435        fn codemodule_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
436            map_witness!(
437                uor_addr::codemodule::address(&input),
438                uor_addr::codemodule::AddressFailure,
439                uor_addr::codemodule::AddressFailure::InvalidAst
440            )
441        }
442
443        fn cbor_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
444            map_witness!(
445                uor_addr::cbor::address(&input),
446                uor_addr::cbor::AddressFailure,
447                uor_addr::cbor::AddressFailure::InvalidCbor
448            )
449        }
450
451        fn schema_photo_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
452            map_witness!(
453                uor_addr::schema::photo::address(&input),
454                uor_addr::schema::photo::AddressFailure,
455                uor_addr::schema::photo::AddressFailure::SchemaViolation
456            )
457        }
458
459        fn schema_document_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
460            map_witness!(
461                uor_addr::schema::document::address(&input),
462                uor_addr::schema::document::AddressFailure,
463                uor_addr::schema::document::AddressFailure::SchemaViolation
464            )
465        }
466
467        fn schema_codemodule_signed_address_with_witness(
468            input: Vec<u8>,
469        ) -> Result<Grounded, AddressError> {
470            map_witness!(
471                uor_addr::schema::codemodule_signed::address(&input),
472                uor_addr::schema::codemodule_signed::AddressFailure,
473                uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
474            )
475        }
476
477        // ── GGUF v3 realization ──
478
479        fn gguf_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
480            map_addr!(
481                uor_addr::gguf::address(&input),
482                uor_addr::gguf::AddressFailure,
483                uor_addr::gguf::AddressFailure::InvalidGguf
484            )
485        }
486
487        fn gguf_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
488            map_witness!(
489                uor_addr::gguf::address(&input),
490                uor_addr::gguf::AddressFailure,
491                uor_addr::gguf::AddressFailure::InvalidGguf
492            )
493        }
494
495        // ── ONNX IR v13 realization ──
496
497        fn onnx_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
498            map_addr!(
499                uor_addr::onnx::address(&input),
500                uor_addr::onnx::AddressFailure,
501                uor_addr::onnx::AddressFailure::InvalidOnnx
502            )
503        }
504
505        fn onnx_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
506            map_witness!(
507                uor_addr::onnx::address(&input),
508                uor_addr::onnx::AddressFailure,
509                uor_addr::onnx::AddressFailure::InvalidOnnx
510            )
511        }
512
513        // ─── σ-axis-selecting entry points ──────────────────────────
514
515        fn json_address_with_hash(
516            input: Vec<u8>,
517            algo: HashAlgorithm,
518        ) -> Result<KappaLabel, AddressError> {
519            match algo {
520                HashAlgorithm::Sha256 => map_addr!(
521                    uor_addr::json::address(&input),
522                    uor_addr::json::AddressFailure,
523                    uor_addr::json::AddressFailure::InvalidJson
524                ),
525                HashAlgorithm::Blake3 => map_addr!(
526                    uor_addr::json::address_blake3(&input),
527                    uor_addr::json::AddressFailure,
528                    uor_addr::json::AddressFailure::InvalidJson
529                ),
530                HashAlgorithm::Sha3256 => map_addr!(
531                    uor_addr::json::address_sha3_256(&input),
532                    uor_addr::json::AddressFailure,
533                    uor_addr::json::AddressFailure::InvalidJson
534                ),
535                HashAlgorithm::Keccak256 => map_addr!(
536                    uor_addr::json::address_keccak256(&input),
537                    uor_addr::json::AddressFailure,
538                    uor_addr::json::AddressFailure::InvalidJson
539                ),
540                HashAlgorithm::Sha512 => map_addr!(
541                    uor_addr::json::address_sha512(&input),
542                    uor_addr::json::AddressFailure,
543                    uor_addr::json::AddressFailure::InvalidJson
544                ),
545            }
546        }
547
548        fn json_address_with_witness_hash(
549            input: Vec<u8>,
550            algo: HashAlgorithm,
551        ) -> Result<Grounded, AddressError> {
552            match algo {
553                HashAlgorithm::Sha256 => map_witness!(
554                    uor_addr::json::address(&input),
555                    uor_addr::json::AddressFailure,
556                    uor_addr::json::AddressFailure::InvalidJson
557                ),
558                HashAlgorithm::Blake3 => map_witness!(
559                    uor_addr::json::address_blake3(&input),
560                    uor_addr::json::AddressFailure,
561                    uor_addr::json::AddressFailure::InvalidJson
562                ),
563                HashAlgorithm::Sha3256 => map_witness!(
564                    uor_addr::json::address_sha3_256(&input),
565                    uor_addr::json::AddressFailure,
566                    uor_addr::json::AddressFailure::InvalidJson
567                ),
568                HashAlgorithm::Keccak256 => map_witness!(
569                    uor_addr::json::address_keccak256(&input),
570                    uor_addr::json::AddressFailure,
571                    uor_addr::json::AddressFailure::InvalidJson
572                ),
573                HashAlgorithm::Sha512 => map_witness!(
574                    uor_addr::json::address_sha512(&input),
575                    uor_addr::json::AddressFailure,
576                    uor_addr::json::AddressFailure::InvalidJson
577                ),
578            }
579        }
580
581        fn sexp_address_with_hash(
582            input: Vec<u8>,
583            algo: HashAlgorithm,
584        ) -> Result<KappaLabel, AddressError> {
585            match algo {
586                HashAlgorithm::Sha256 => map_addr!(
587                    uor_addr::sexp::address(&input),
588                    uor_addr::sexp::AddressFailure,
589                    uor_addr::sexp::AddressFailure::InvalidSExpr
590                ),
591                HashAlgorithm::Blake3 => map_addr!(
592                    uor_addr::sexp::address_blake3(&input),
593                    uor_addr::sexp::AddressFailure,
594                    uor_addr::sexp::AddressFailure::InvalidSExpr
595                ),
596                HashAlgorithm::Sha3256 => map_addr!(
597                    uor_addr::sexp::address_sha3_256(&input),
598                    uor_addr::sexp::AddressFailure,
599                    uor_addr::sexp::AddressFailure::InvalidSExpr
600                ),
601                HashAlgorithm::Keccak256 => map_addr!(
602                    uor_addr::sexp::address_keccak256(&input),
603                    uor_addr::sexp::AddressFailure,
604                    uor_addr::sexp::AddressFailure::InvalidSExpr
605                ),
606                HashAlgorithm::Sha512 => map_addr!(
607                    uor_addr::sexp::address_sha512(&input),
608                    uor_addr::sexp::AddressFailure,
609                    uor_addr::sexp::AddressFailure::InvalidSExpr
610                ),
611            }
612        }
613
614        fn sexp_address_with_witness_hash(
615            input: Vec<u8>,
616            algo: HashAlgorithm,
617        ) -> Result<Grounded, AddressError> {
618            match algo {
619                HashAlgorithm::Sha256 => map_witness!(
620                    uor_addr::sexp::address(&input),
621                    uor_addr::sexp::AddressFailure,
622                    uor_addr::sexp::AddressFailure::InvalidSExpr
623                ),
624                HashAlgorithm::Blake3 => map_witness!(
625                    uor_addr::sexp::address_blake3(&input),
626                    uor_addr::sexp::AddressFailure,
627                    uor_addr::sexp::AddressFailure::InvalidSExpr
628                ),
629                HashAlgorithm::Sha3256 => map_witness!(
630                    uor_addr::sexp::address_sha3_256(&input),
631                    uor_addr::sexp::AddressFailure,
632                    uor_addr::sexp::AddressFailure::InvalidSExpr
633                ),
634                HashAlgorithm::Keccak256 => map_witness!(
635                    uor_addr::sexp::address_keccak256(&input),
636                    uor_addr::sexp::AddressFailure,
637                    uor_addr::sexp::AddressFailure::InvalidSExpr
638                ),
639                HashAlgorithm::Sha512 => map_witness!(
640                    uor_addr::sexp::address_sha512(&input),
641                    uor_addr::sexp::AddressFailure,
642                    uor_addr::sexp::AddressFailure::InvalidSExpr
643                ),
644            }
645        }
646
647        fn xml_address_with_hash(
648            input: Vec<u8>,
649            algo: HashAlgorithm,
650        ) -> Result<KappaLabel, AddressError> {
651            match algo {
652                HashAlgorithm::Sha256 => map_addr!(
653                    uor_addr::xml::address(&input),
654                    uor_addr::xml::AddressFailure,
655                    uor_addr::xml::AddressFailure::InvalidXml
656                ),
657                HashAlgorithm::Blake3 => map_addr!(
658                    uor_addr::xml::address_blake3(&input),
659                    uor_addr::xml::AddressFailure,
660                    uor_addr::xml::AddressFailure::InvalidXml
661                ),
662                HashAlgorithm::Sha3256 => map_addr!(
663                    uor_addr::xml::address_sha3_256(&input),
664                    uor_addr::xml::AddressFailure,
665                    uor_addr::xml::AddressFailure::InvalidXml
666                ),
667                HashAlgorithm::Keccak256 => map_addr!(
668                    uor_addr::xml::address_keccak256(&input),
669                    uor_addr::xml::AddressFailure,
670                    uor_addr::xml::AddressFailure::InvalidXml
671                ),
672                HashAlgorithm::Sha512 => map_addr!(
673                    uor_addr::xml::address_sha512(&input),
674                    uor_addr::xml::AddressFailure,
675                    uor_addr::xml::AddressFailure::InvalidXml
676                ),
677            }
678        }
679
680        fn xml_address_with_witness_hash(
681            input: Vec<u8>,
682            algo: HashAlgorithm,
683        ) -> Result<Grounded, AddressError> {
684            match algo {
685                HashAlgorithm::Sha256 => map_witness!(
686                    uor_addr::xml::address(&input),
687                    uor_addr::xml::AddressFailure,
688                    uor_addr::xml::AddressFailure::InvalidXml
689                ),
690                HashAlgorithm::Blake3 => map_witness!(
691                    uor_addr::xml::address_blake3(&input),
692                    uor_addr::xml::AddressFailure,
693                    uor_addr::xml::AddressFailure::InvalidXml
694                ),
695                HashAlgorithm::Sha3256 => map_witness!(
696                    uor_addr::xml::address_sha3_256(&input),
697                    uor_addr::xml::AddressFailure,
698                    uor_addr::xml::AddressFailure::InvalidXml
699                ),
700                HashAlgorithm::Keccak256 => map_witness!(
701                    uor_addr::xml::address_keccak256(&input),
702                    uor_addr::xml::AddressFailure,
703                    uor_addr::xml::AddressFailure::InvalidXml
704                ),
705                HashAlgorithm::Sha512 => map_witness!(
706                    uor_addr::xml::address_sha512(&input),
707                    uor_addr::xml::AddressFailure,
708                    uor_addr::xml::AddressFailure::InvalidXml
709                ),
710            }
711        }
712
713        fn asn1_address_with_hash(
714            input: Vec<u8>,
715            algo: HashAlgorithm,
716        ) -> Result<KappaLabel, AddressError> {
717            match algo {
718                HashAlgorithm::Sha256 => map_addr!(
719                    uor_addr::asn1::address(&input),
720                    uor_addr::asn1::AddressFailure,
721                    uor_addr::asn1::AddressFailure::InvalidDer
722                ),
723                HashAlgorithm::Blake3 => map_addr!(
724                    uor_addr::asn1::address_blake3(&input),
725                    uor_addr::asn1::AddressFailure,
726                    uor_addr::asn1::AddressFailure::InvalidDer
727                ),
728                HashAlgorithm::Sha3256 => map_addr!(
729                    uor_addr::asn1::address_sha3_256(&input),
730                    uor_addr::asn1::AddressFailure,
731                    uor_addr::asn1::AddressFailure::InvalidDer
732                ),
733                HashAlgorithm::Keccak256 => map_addr!(
734                    uor_addr::asn1::address_keccak256(&input),
735                    uor_addr::asn1::AddressFailure,
736                    uor_addr::asn1::AddressFailure::InvalidDer
737                ),
738                HashAlgorithm::Sha512 => map_addr!(
739                    uor_addr::asn1::address_sha512(&input),
740                    uor_addr::asn1::AddressFailure,
741                    uor_addr::asn1::AddressFailure::InvalidDer
742                ),
743            }
744        }
745
746        fn asn1_address_with_witness_hash(
747            input: Vec<u8>,
748            algo: HashAlgorithm,
749        ) -> Result<Grounded, AddressError> {
750            match algo {
751                HashAlgorithm::Sha256 => map_witness!(
752                    uor_addr::asn1::address(&input),
753                    uor_addr::asn1::AddressFailure,
754                    uor_addr::asn1::AddressFailure::InvalidDer
755                ),
756                HashAlgorithm::Blake3 => map_witness!(
757                    uor_addr::asn1::address_blake3(&input),
758                    uor_addr::asn1::AddressFailure,
759                    uor_addr::asn1::AddressFailure::InvalidDer
760                ),
761                HashAlgorithm::Sha3256 => map_witness!(
762                    uor_addr::asn1::address_sha3_256(&input),
763                    uor_addr::asn1::AddressFailure,
764                    uor_addr::asn1::AddressFailure::InvalidDer
765                ),
766                HashAlgorithm::Keccak256 => map_witness!(
767                    uor_addr::asn1::address_keccak256(&input),
768                    uor_addr::asn1::AddressFailure,
769                    uor_addr::asn1::AddressFailure::InvalidDer
770                ),
771                HashAlgorithm::Sha512 => map_witness!(
772                    uor_addr::asn1::address_sha512(&input),
773                    uor_addr::asn1::AddressFailure,
774                    uor_addr::asn1::AddressFailure::InvalidDer
775                ),
776            }
777        }
778
779        fn ring_address_with_hash(
780            input: Vec<u8>,
781            algo: HashAlgorithm,
782        ) -> Result<KappaLabel, AddressError> {
783            match algo {
784                HashAlgorithm::Sha256 => map_addr!(
785                    uor_addr::ring::address(&input),
786                    uor_addr::ring::AddressFailure,
787                    uor_addr::ring::AddressFailure::InvalidRingElement
788                ),
789                HashAlgorithm::Blake3 => map_addr!(
790                    uor_addr::ring::address_blake3(&input),
791                    uor_addr::ring::AddressFailure,
792                    uor_addr::ring::AddressFailure::InvalidRingElement
793                ),
794                HashAlgorithm::Sha3256 => map_addr!(
795                    uor_addr::ring::address_sha3_256(&input),
796                    uor_addr::ring::AddressFailure,
797                    uor_addr::ring::AddressFailure::InvalidRingElement
798                ),
799                HashAlgorithm::Keccak256 => map_addr!(
800                    uor_addr::ring::address_keccak256(&input),
801                    uor_addr::ring::AddressFailure,
802                    uor_addr::ring::AddressFailure::InvalidRingElement
803                ),
804                HashAlgorithm::Sha512 => map_addr!(
805                    uor_addr::ring::address_sha512(&input),
806                    uor_addr::ring::AddressFailure,
807                    uor_addr::ring::AddressFailure::InvalidRingElement
808                ),
809            }
810        }
811
812        fn ring_address_with_witness_hash(
813            input: Vec<u8>,
814            algo: HashAlgorithm,
815        ) -> Result<Grounded, AddressError> {
816            match algo {
817                HashAlgorithm::Sha256 => map_witness!(
818                    uor_addr::ring::address(&input),
819                    uor_addr::ring::AddressFailure,
820                    uor_addr::ring::AddressFailure::InvalidRingElement
821                ),
822                HashAlgorithm::Blake3 => map_witness!(
823                    uor_addr::ring::address_blake3(&input),
824                    uor_addr::ring::AddressFailure,
825                    uor_addr::ring::AddressFailure::InvalidRingElement
826                ),
827                HashAlgorithm::Sha3256 => map_witness!(
828                    uor_addr::ring::address_sha3_256(&input),
829                    uor_addr::ring::AddressFailure,
830                    uor_addr::ring::AddressFailure::InvalidRingElement
831                ),
832                HashAlgorithm::Keccak256 => map_witness!(
833                    uor_addr::ring::address_keccak256(&input),
834                    uor_addr::ring::AddressFailure,
835                    uor_addr::ring::AddressFailure::InvalidRingElement
836                ),
837                HashAlgorithm::Sha512 => map_witness!(
838                    uor_addr::ring::address_sha512(&input),
839                    uor_addr::ring::AddressFailure,
840                    uor_addr::ring::AddressFailure::InvalidRingElement
841                ),
842            }
843        }
844
845        fn codemodule_address_with_hash(
846            input: Vec<u8>,
847            algo: HashAlgorithm,
848        ) -> Result<KappaLabel, AddressError> {
849            match algo {
850                HashAlgorithm::Sha256 => map_addr!(
851                    uor_addr::codemodule::address(&input),
852                    uor_addr::codemodule::AddressFailure,
853                    uor_addr::codemodule::AddressFailure::InvalidAst
854                ),
855                HashAlgorithm::Blake3 => map_addr!(
856                    uor_addr::codemodule::address_blake3(&input),
857                    uor_addr::codemodule::AddressFailure,
858                    uor_addr::codemodule::AddressFailure::InvalidAst
859                ),
860                HashAlgorithm::Sha3256 => map_addr!(
861                    uor_addr::codemodule::address_sha3_256(&input),
862                    uor_addr::codemodule::AddressFailure,
863                    uor_addr::codemodule::AddressFailure::InvalidAst
864                ),
865                HashAlgorithm::Keccak256 => map_addr!(
866                    uor_addr::codemodule::address_keccak256(&input),
867                    uor_addr::codemodule::AddressFailure,
868                    uor_addr::codemodule::AddressFailure::InvalidAst
869                ),
870                HashAlgorithm::Sha512 => map_addr!(
871                    uor_addr::codemodule::address_sha512(&input),
872                    uor_addr::codemodule::AddressFailure,
873                    uor_addr::codemodule::AddressFailure::InvalidAst
874                ),
875            }
876        }
877
878        fn codemodule_address_with_witness_hash(
879            input: Vec<u8>,
880            algo: HashAlgorithm,
881        ) -> Result<Grounded, AddressError> {
882            match algo {
883                HashAlgorithm::Sha256 => map_witness!(
884                    uor_addr::codemodule::address(&input),
885                    uor_addr::codemodule::AddressFailure,
886                    uor_addr::codemodule::AddressFailure::InvalidAst
887                ),
888                HashAlgorithm::Blake3 => map_witness!(
889                    uor_addr::codemodule::address_blake3(&input),
890                    uor_addr::codemodule::AddressFailure,
891                    uor_addr::codemodule::AddressFailure::InvalidAst
892                ),
893                HashAlgorithm::Sha3256 => map_witness!(
894                    uor_addr::codemodule::address_sha3_256(&input),
895                    uor_addr::codemodule::AddressFailure,
896                    uor_addr::codemodule::AddressFailure::InvalidAst
897                ),
898                HashAlgorithm::Keccak256 => map_witness!(
899                    uor_addr::codemodule::address_keccak256(&input),
900                    uor_addr::codemodule::AddressFailure,
901                    uor_addr::codemodule::AddressFailure::InvalidAst
902                ),
903                HashAlgorithm::Sha512 => map_witness!(
904                    uor_addr::codemodule::address_sha512(&input),
905                    uor_addr::codemodule::AddressFailure,
906                    uor_addr::codemodule::AddressFailure::InvalidAst
907                ),
908            }
909        }
910
911        fn cbor_address_with_hash(
912            input: Vec<u8>,
913            algo: HashAlgorithm,
914        ) -> Result<KappaLabel, AddressError> {
915            match algo {
916                HashAlgorithm::Sha256 => map_addr!(
917                    uor_addr::cbor::address(&input),
918                    uor_addr::cbor::AddressFailure,
919                    uor_addr::cbor::AddressFailure::InvalidCbor
920                ),
921                HashAlgorithm::Blake3 => map_addr!(
922                    uor_addr::cbor::address_blake3(&input),
923                    uor_addr::cbor::AddressFailure,
924                    uor_addr::cbor::AddressFailure::InvalidCbor
925                ),
926                HashAlgorithm::Sha3256 => map_addr!(
927                    uor_addr::cbor::address_sha3_256(&input),
928                    uor_addr::cbor::AddressFailure,
929                    uor_addr::cbor::AddressFailure::InvalidCbor
930                ),
931                HashAlgorithm::Keccak256 => map_addr!(
932                    uor_addr::cbor::address_keccak256(&input),
933                    uor_addr::cbor::AddressFailure,
934                    uor_addr::cbor::AddressFailure::InvalidCbor
935                ),
936                HashAlgorithm::Sha512 => map_addr!(
937                    uor_addr::cbor::address_sha512(&input),
938                    uor_addr::cbor::AddressFailure,
939                    uor_addr::cbor::AddressFailure::InvalidCbor
940                ),
941            }
942        }
943
944        fn cbor_address_with_witness_hash(
945            input: Vec<u8>,
946            algo: HashAlgorithm,
947        ) -> Result<Grounded, AddressError> {
948            match algo {
949                HashAlgorithm::Sha256 => map_witness!(
950                    uor_addr::cbor::address(&input),
951                    uor_addr::cbor::AddressFailure,
952                    uor_addr::cbor::AddressFailure::InvalidCbor
953                ),
954                HashAlgorithm::Blake3 => map_witness!(
955                    uor_addr::cbor::address_blake3(&input),
956                    uor_addr::cbor::AddressFailure,
957                    uor_addr::cbor::AddressFailure::InvalidCbor
958                ),
959                HashAlgorithm::Sha3256 => map_witness!(
960                    uor_addr::cbor::address_sha3_256(&input),
961                    uor_addr::cbor::AddressFailure,
962                    uor_addr::cbor::AddressFailure::InvalidCbor
963                ),
964                HashAlgorithm::Keccak256 => map_witness!(
965                    uor_addr::cbor::address_keccak256(&input),
966                    uor_addr::cbor::AddressFailure,
967                    uor_addr::cbor::AddressFailure::InvalidCbor
968                ),
969                HashAlgorithm::Sha512 => map_witness!(
970                    uor_addr::cbor::address_sha512(&input),
971                    uor_addr::cbor::AddressFailure,
972                    uor_addr::cbor::AddressFailure::InvalidCbor
973                ),
974            }
975        }
976
977        fn schema_photo_address_with_hash(
978            input: Vec<u8>,
979            algo: HashAlgorithm,
980        ) -> Result<KappaLabel, AddressError> {
981            match algo {
982                HashAlgorithm::Sha256 => map_addr!(
983                    uor_addr::schema::photo::address(&input),
984                    uor_addr::schema::photo::AddressFailure,
985                    uor_addr::schema::photo::AddressFailure::SchemaViolation
986                ),
987                HashAlgorithm::Blake3 => map_addr!(
988                    uor_addr::schema::photo::address_blake3(&input),
989                    uor_addr::schema::photo::AddressFailure,
990                    uor_addr::schema::photo::AddressFailure::SchemaViolation
991                ),
992                HashAlgorithm::Sha3256 => map_addr!(
993                    uor_addr::schema::photo::address_sha3_256(&input),
994                    uor_addr::schema::photo::AddressFailure,
995                    uor_addr::schema::photo::AddressFailure::SchemaViolation
996                ),
997                HashAlgorithm::Keccak256 => map_addr!(
998                    uor_addr::schema::photo::address_keccak256(&input),
999                    uor_addr::schema::photo::AddressFailure,
1000                    uor_addr::schema::photo::AddressFailure::SchemaViolation
1001                ),
1002                HashAlgorithm::Sha512 => map_addr!(
1003                    uor_addr::schema::photo::address_sha512(&input),
1004                    uor_addr::schema::photo::AddressFailure,
1005                    uor_addr::schema::photo::AddressFailure::SchemaViolation
1006                ),
1007            }
1008        }
1009
1010        fn schema_photo_address_with_witness_hash(
1011            input: Vec<u8>,
1012            algo: HashAlgorithm,
1013        ) -> Result<Grounded, AddressError> {
1014            match algo {
1015                HashAlgorithm::Sha256 => map_witness!(
1016                    uor_addr::schema::photo::address(&input),
1017                    uor_addr::schema::photo::AddressFailure,
1018                    uor_addr::schema::photo::AddressFailure::SchemaViolation
1019                ),
1020                HashAlgorithm::Blake3 => map_witness!(
1021                    uor_addr::schema::photo::address_blake3(&input),
1022                    uor_addr::schema::photo::AddressFailure,
1023                    uor_addr::schema::photo::AddressFailure::SchemaViolation
1024                ),
1025                HashAlgorithm::Sha3256 => map_witness!(
1026                    uor_addr::schema::photo::address_sha3_256(&input),
1027                    uor_addr::schema::photo::AddressFailure,
1028                    uor_addr::schema::photo::AddressFailure::SchemaViolation
1029                ),
1030                HashAlgorithm::Keccak256 => map_witness!(
1031                    uor_addr::schema::photo::address_keccak256(&input),
1032                    uor_addr::schema::photo::AddressFailure,
1033                    uor_addr::schema::photo::AddressFailure::SchemaViolation
1034                ),
1035                HashAlgorithm::Sha512 => map_witness!(
1036                    uor_addr::schema::photo::address_sha512(&input),
1037                    uor_addr::schema::photo::AddressFailure,
1038                    uor_addr::schema::photo::AddressFailure::SchemaViolation
1039                ),
1040            }
1041        }
1042
1043        fn schema_document_address_with_hash(
1044            input: Vec<u8>,
1045            algo: HashAlgorithm,
1046        ) -> Result<KappaLabel, AddressError> {
1047            match algo {
1048                HashAlgorithm::Sha256 => map_addr!(
1049                    uor_addr::schema::document::address(&input),
1050                    uor_addr::schema::document::AddressFailure,
1051                    uor_addr::schema::document::AddressFailure::SchemaViolation
1052                ),
1053                HashAlgorithm::Blake3 => map_addr!(
1054                    uor_addr::schema::document::address_blake3(&input),
1055                    uor_addr::schema::document::AddressFailure,
1056                    uor_addr::schema::document::AddressFailure::SchemaViolation
1057                ),
1058                HashAlgorithm::Sha3256 => map_addr!(
1059                    uor_addr::schema::document::address_sha3_256(&input),
1060                    uor_addr::schema::document::AddressFailure,
1061                    uor_addr::schema::document::AddressFailure::SchemaViolation
1062                ),
1063                HashAlgorithm::Keccak256 => map_addr!(
1064                    uor_addr::schema::document::address_keccak256(&input),
1065                    uor_addr::schema::document::AddressFailure,
1066                    uor_addr::schema::document::AddressFailure::SchemaViolation
1067                ),
1068                HashAlgorithm::Sha512 => map_addr!(
1069                    uor_addr::schema::document::address_sha512(&input),
1070                    uor_addr::schema::document::AddressFailure,
1071                    uor_addr::schema::document::AddressFailure::SchemaViolation
1072                ),
1073            }
1074        }
1075
1076        fn schema_document_address_with_witness_hash(
1077            input: Vec<u8>,
1078            algo: HashAlgorithm,
1079        ) -> Result<Grounded, AddressError> {
1080            match algo {
1081                HashAlgorithm::Sha256 => map_witness!(
1082                    uor_addr::schema::document::address(&input),
1083                    uor_addr::schema::document::AddressFailure,
1084                    uor_addr::schema::document::AddressFailure::SchemaViolation
1085                ),
1086                HashAlgorithm::Blake3 => map_witness!(
1087                    uor_addr::schema::document::address_blake3(&input),
1088                    uor_addr::schema::document::AddressFailure,
1089                    uor_addr::schema::document::AddressFailure::SchemaViolation
1090                ),
1091                HashAlgorithm::Sha3256 => map_witness!(
1092                    uor_addr::schema::document::address_sha3_256(&input),
1093                    uor_addr::schema::document::AddressFailure,
1094                    uor_addr::schema::document::AddressFailure::SchemaViolation
1095                ),
1096                HashAlgorithm::Keccak256 => map_witness!(
1097                    uor_addr::schema::document::address_keccak256(&input),
1098                    uor_addr::schema::document::AddressFailure,
1099                    uor_addr::schema::document::AddressFailure::SchemaViolation
1100                ),
1101                HashAlgorithm::Sha512 => map_witness!(
1102                    uor_addr::schema::document::address_sha512(&input),
1103                    uor_addr::schema::document::AddressFailure,
1104                    uor_addr::schema::document::AddressFailure::SchemaViolation
1105                ),
1106            }
1107        }
1108
1109        fn schema_codemodule_signed_address_with_hash(
1110            input: Vec<u8>,
1111            algo: HashAlgorithm,
1112        ) -> Result<KappaLabel, AddressError> {
1113            match algo {
1114                HashAlgorithm::Sha256 => map_addr!(
1115                    uor_addr::schema::codemodule_signed::address(&input),
1116                    uor_addr::schema::codemodule_signed::AddressFailure,
1117                    uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
1118                ),
1119                HashAlgorithm::Blake3 => map_addr!(
1120                    uor_addr::schema::codemodule_signed::address_blake3(&input),
1121                    uor_addr::schema::codemodule_signed::AddressFailure,
1122                    uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
1123                ),
1124                HashAlgorithm::Sha3256 => map_addr!(
1125                    uor_addr::schema::codemodule_signed::address_sha3_256(&input),
1126                    uor_addr::schema::codemodule_signed::AddressFailure,
1127                    uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
1128                ),
1129                HashAlgorithm::Keccak256 => map_addr!(
1130                    uor_addr::schema::codemodule_signed::address_keccak256(&input),
1131                    uor_addr::schema::codemodule_signed::AddressFailure,
1132                    uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
1133                ),
1134                HashAlgorithm::Sha512 => map_addr!(
1135                    uor_addr::schema::codemodule_signed::address_sha512(&input),
1136                    uor_addr::schema::codemodule_signed::AddressFailure,
1137                    uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
1138                ),
1139            }
1140        }
1141
1142        fn schema_codemodule_signed_address_with_witness_hash(
1143            input: Vec<u8>,
1144            algo: HashAlgorithm,
1145        ) -> Result<Grounded, AddressError> {
1146            match algo {
1147                HashAlgorithm::Sha256 => map_witness!(
1148                    uor_addr::schema::codemodule_signed::address(&input),
1149                    uor_addr::schema::codemodule_signed::AddressFailure,
1150                    uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
1151                ),
1152                HashAlgorithm::Blake3 => map_witness!(
1153                    uor_addr::schema::codemodule_signed::address_blake3(&input),
1154                    uor_addr::schema::codemodule_signed::AddressFailure,
1155                    uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
1156                ),
1157                HashAlgorithm::Sha3256 => map_witness!(
1158                    uor_addr::schema::codemodule_signed::address_sha3_256(&input),
1159                    uor_addr::schema::codemodule_signed::AddressFailure,
1160                    uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
1161                ),
1162                HashAlgorithm::Keccak256 => map_witness!(
1163                    uor_addr::schema::codemodule_signed::address_keccak256(&input),
1164                    uor_addr::schema::codemodule_signed::AddressFailure,
1165                    uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
1166                ),
1167                HashAlgorithm::Sha512 => map_witness!(
1168                    uor_addr::schema::codemodule_signed::address_sha512(&input),
1169                    uor_addr::schema::codemodule_signed::AddressFailure,
1170                    uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
1171                ),
1172            }
1173        }
1174
1175        fn gguf_address_with_hash(
1176            input: Vec<u8>,
1177            algo: HashAlgorithm,
1178        ) -> Result<KappaLabel, AddressError> {
1179            match algo {
1180                HashAlgorithm::Sha256 => map_addr!(
1181                    uor_addr::gguf::address(&input),
1182                    uor_addr::gguf::AddressFailure,
1183                    uor_addr::gguf::AddressFailure::InvalidGguf
1184                ),
1185                HashAlgorithm::Blake3 => map_addr!(
1186                    uor_addr::gguf::address_blake3(&input),
1187                    uor_addr::gguf::AddressFailure,
1188                    uor_addr::gguf::AddressFailure::InvalidGguf
1189                ),
1190                HashAlgorithm::Sha3256 => map_addr!(
1191                    uor_addr::gguf::address_sha3_256(&input),
1192                    uor_addr::gguf::AddressFailure,
1193                    uor_addr::gguf::AddressFailure::InvalidGguf
1194                ),
1195                HashAlgorithm::Keccak256 => map_addr!(
1196                    uor_addr::gguf::address_keccak256(&input),
1197                    uor_addr::gguf::AddressFailure,
1198                    uor_addr::gguf::AddressFailure::InvalidGguf
1199                ),
1200                HashAlgorithm::Sha512 => map_addr!(
1201                    uor_addr::gguf::address_sha512(&input),
1202                    uor_addr::gguf::AddressFailure,
1203                    uor_addr::gguf::AddressFailure::InvalidGguf
1204                ),
1205            }
1206        }
1207
1208        fn gguf_address_with_witness_hash(
1209            input: Vec<u8>,
1210            algo: HashAlgorithm,
1211        ) -> Result<Grounded, AddressError> {
1212            match algo {
1213                HashAlgorithm::Sha256 => map_witness!(
1214                    uor_addr::gguf::address(&input),
1215                    uor_addr::gguf::AddressFailure,
1216                    uor_addr::gguf::AddressFailure::InvalidGguf
1217                ),
1218                HashAlgorithm::Blake3 => map_witness!(
1219                    uor_addr::gguf::address_blake3(&input),
1220                    uor_addr::gguf::AddressFailure,
1221                    uor_addr::gguf::AddressFailure::InvalidGguf
1222                ),
1223                HashAlgorithm::Sha3256 => map_witness!(
1224                    uor_addr::gguf::address_sha3_256(&input),
1225                    uor_addr::gguf::AddressFailure,
1226                    uor_addr::gguf::AddressFailure::InvalidGguf
1227                ),
1228                HashAlgorithm::Keccak256 => map_witness!(
1229                    uor_addr::gguf::address_keccak256(&input),
1230                    uor_addr::gguf::AddressFailure,
1231                    uor_addr::gguf::AddressFailure::InvalidGguf
1232                ),
1233                HashAlgorithm::Sha512 => map_witness!(
1234                    uor_addr::gguf::address_sha512(&input),
1235                    uor_addr::gguf::AddressFailure,
1236                    uor_addr::gguf::AddressFailure::InvalidGguf
1237                ),
1238            }
1239        }
1240
1241        fn onnx_address_with_hash(
1242            input: Vec<u8>,
1243            algo: HashAlgorithm,
1244        ) -> Result<KappaLabel, AddressError> {
1245            match algo {
1246                HashAlgorithm::Sha256 => map_addr!(
1247                    uor_addr::onnx::address(&input),
1248                    uor_addr::onnx::AddressFailure,
1249                    uor_addr::onnx::AddressFailure::InvalidOnnx
1250                ),
1251                HashAlgorithm::Blake3 => map_addr!(
1252                    uor_addr::onnx::address_blake3(&input),
1253                    uor_addr::onnx::AddressFailure,
1254                    uor_addr::onnx::AddressFailure::InvalidOnnx
1255                ),
1256                HashAlgorithm::Sha3256 => map_addr!(
1257                    uor_addr::onnx::address_sha3_256(&input),
1258                    uor_addr::onnx::AddressFailure,
1259                    uor_addr::onnx::AddressFailure::InvalidOnnx
1260                ),
1261                HashAlgorithm::Keccak256 => map_addr!(
1262                    uor_addr::onnx::address_keccak256(&input),
1263                    uor_addr::onnx::AddressFailure,
1264                    uor_addr::onnx::AddressFailure::InvalidOnnx
1265                ),
1266                HashAlgorithm::Sha512 => map_addr!(
1267                    uor_addr::onnx::address_sha512(&input),
1268                    uor_addr::onnx::AddressFailure,
1269                    uor_addr::onnx::AddressFailure::InvalidOnnx
1270                ),
1271            }
1272        }
1273
1274        fn onnx_address_with_witness_hash(
1275            input: Vec<u8>,
1276            algo: HashAlgorithm,
1277        ) -> Result<Grounded, AddressError> {
1278            match algo {
1279                HashAlgorithm::Sha256 => map_witness!(
1280                    uor_addr::onnx::address(&input),
1281                    uor_addr::onnx::AddressFailure,
1282                    uor_addr::onnx::AddressFailure::InvalidOnnx
1283                ),
1284                HashAlgorithm::Blake3 => map_witness!(
1285                    uor_addr::onnx::address_blake3(&input),
1286                    uor_addr::onnx::AddressFailure,
1287                    uor_addr::onnx::AddressFailure::InvalidOnnx
1288                ),
1289                HashAlgorithm::Sha3256 => map_witness!(
1290                    uor_addr::onnx::address_sha3_256(&input),
1291                    uor_addr::onnx::AddressFailure,
1292                    uor_addr::onnx::AddressFailure::InvalidOnnx
1293                ),
1294                HashAlgorithm::Keccak256 => map_witness!(
1295                    uor_addr::onnx::address_keccak256(&input),
1296                    uor_addr::onnx::AddressFailure,
1297                    uor_addr::onnx::AddressFailure::InvalidOnnx
1298                ),
1299                HashAlgorithm::Sha512 => map_witness!(
1300                    uor_addr::onnx::address_sha512(&input),
1301                    uor_addr::onnx::AddressFailure,
1302                    uor_addr::onnx::AddressFailure::InvalidOnnx
1303                ),
1304            }
1305        }
1306
1307        // ─── κ-label composition (ADR-061) ──────────────────────────
1308        // CS-G2 (binary commutative product) + four unary endomorphisms.
1309
1310        fn compose_g2(
1311            left: KappaLabel,
1312            right: KappaLabel,
1313            algo: HashAlgorithm,
1314        ) -> Result<KappaLabel, AddressError> {
1315            use uor_addr::composition as c;
1316            match algo {
1317                HashAlgorithm::Sha256 => compose2_label(&left, &right, c::compose_g2_product),
1318                HashAlgorithm::Blake3 => {
1319                    compose2_label(&left, &right, c::compose_g2_product_blake3)
1320                }
1321                HashAlgorithm::Sha3256 => {
1322                    compose2_label(&left, &right, c::compose_g2_product_sha3_256)
1323                }
1324                HashAlgorithm::Keccak256 => {
1325                    compose2_label(&left, &right, c::compose_g2_product_keccak256)
1326                }
1327                HashAlgorithm::Sha512 => {
1328                    compose2_label(&left, &right, c::compose_g2_product_sha512)
1329                }
1330            }
1331        }
1332
1333        fn compose_g2_with_witness(
1334            left: KappaLabel,
1335            right: KappaLabel,
1336            algo: HashAlgorithm,
1337        ) -> Result<Grounded, AddressError> {
1338            use uor_addr::composition as c;
1339            match algo {
1340                HashAlgorithm::Sha256 => compose2_witness(&left, &right, c::compose_g2_product),
1341                HashAlgorithm::Blake3 => {
1342                    compose2_witness(&left, &right, c::compose_g2_product_blake3)
1343                }
1344                HashAlgorithm::Sha3256 => {
1345                    compose2_witness(&left, &right, c::compose_g2_product_sha3_256)
1346                }
1347                HashAlgorithm::Keccak256 => {
1348                    compose2_witness(&left, &right, c::compose_g2_product_keccak256)
1349                }
1350                HashAlgorithm::Sha512 => {
1351                    compose2_witness(&left, &right, c::compose_g2_product_sha512)
1352                }
1353            }
1354        }
1355
1356        fn compose_f4(
1357            operand: KappaLabel,
1358            algo: HashAlgorithm,
1359        ) -> Result<KappaLabel, AddressError> {
1360            use uor_addr::composition as c;
1361            match algo {
1362                HashAlgorithm::Sha256 => compose1_label(&operand, c::compose_f4_quotient),
1363                HashAlgorithm::Blake3 => compose1_label(&operand, c::compose_f4_quotient_blake3),
1364                HashAlgorithm::Sha3256 => compose1_label(&operand, c::compose_f4_quotient_sha3_256),
1365                HashAlgorithm::Keccak256 => {
1366                    compose1_label(&operand, c::compose_f4_quotient_keccak256)
1367                }
1368                HashAlgorithm::Sha512 => compose1_label(&operand, c::compose_f4_quotient_sha512),
1369            }
1370        }
1371
1372        fn compose_f4_with_witness(
1373            operand: KappaLabel,
1374            algo: HashAlgorithm,
1375        ) -> Result<Grounded, AddressError> {
1376            use uor_addr::composition as c;
1377            match algo {
1378                HashAlgorithm::Sha256 => compose1_witness(&operand, c::compose_f4_quotient),
1379                HashAlgorithm::Blake3 => compose1_witness(&operand, c::compose_f4_quotient_blake3),
1380                HashAlgorithm::Sha3256 => {
1381                    compose1_witness(&operand, c::compose_f4_quotient_sha3_256)
1382                }
1383                HashAlgorithm::Keccak256 => {
1384                    compose1_witness(&operand, c::compose_f4_quotient_keccak256)
1385                }
1386                HashAlgorithm::Sha512 => compose1_witness(&operand, c::compose_f4_quotient_sha512),
1387            }
1388        }
1389
1390        fn compose_e6(
1391            operand: KappaLabel,
1392            algo: HashAlgorithm,
1393        ) -> Result<KappaLabel, AddressError> {
1394            use uor_addr::composition as c;
1395            match algo {
1396                HashAlgorithm::Sha256 => compose1_label(&operand, c::compose_e6_filtration),
1397                HashAlgorithm::Blake3 => compose1_label(&operand, c::compose_e6_filtration_blake3),
1398                HashAlgorithm::Sha3256 => {
1399                    compose1_label(&operand, c::compose_e6_filtration_sha3_256)
1400                }
1401                HashAlgorithm::Keccak256 => {
1402                    compose1_label(&operand, c::compose_e6_filtration_keccak256)
1403                }
1404                HashAlgorithm::Sha512 => compose1_label(&operand, c::compose_e6_filtration_sha512),
1405            }
1406        }
1407
1408        fn compose_e6_with_witness(
1409            operand: KappaLabel,
1410            algo: HashAlgorithm,
1411        ) -> Result<Grounded, AddressError> {
1412            use uor_addr::composition as c;
1413            match algo {
1414                HashAlgorithm::Sha256 => compose1_witness(&operand, c::compose_e6_filtration),
1415                HashAlgorithm::Blake3 => {
1416                    compose1_witness(&operand, c::compose_e6_filtration_blake3)
1417                }
1418                HashAlgorithm::Sha3256 => {
1419                    compose1_witness(&operand, c::compose_e6_filtration_sha3_256)
1420                }
1421                HashAlgorithm::Keccak256 => {
1422                    compose1_witness(&operand, c::compose_e6_filtration_keccak256)
1423                }
1424                HashAlgorithm::Sha512 => {
1425                    compose1_witness(&operand, c::compose_e6_filtration_sha512)
1426                }
1427            }
1428        }
1429
1430        fn compose_e7(
1431            operand: KappaLabel,
1432            algo: HashAlgorithm,
1433        ) -> Result<KappaLabel, AddressError> {
1434            use uor_addr::composition as c;
1435            match algo {
1436                HashAlgorithm::Sha256 => compose1_label(&operand, c::compose_e7_augmentation),
1437                HashAlgorithm::Blake3 => {
1438                    compose1_label(&operand, c::compose_e7_augmentation_blake3)
1439                }
1440                HashAlgorithm::Sha3256 => {
1441                    compose1_label(&operand, c::compose_e7_augmentation_sha3_256)
1442                }
1443                HashAlgorithm::Keccak256 => {
1444                    compose1_label(&operand, c::compose_e7_augmentation_keccak256)
1445                }
1446                HashAlgorithm::Sha512 => {
1447                    compose1_label(&operand, c::compose_e7_augmentation_sha512)
1448                }
1449            }
1450        }
1451
1452        fn compose_e7_with_witness(
1453            operand: KappaLabel,
1454            algo: HashAlgorithm,
1455        ) -> Result<Grounded, AddressError> {
1456            use uor_addr::composition as c;
1457            match algo {
1458                HashAlgorithm::Sha256 => compose1_witness(&operand, c::compose_e7_augmentation),
1459                HashAlgorithm::Blake3 => {
1460                    compose1_witness(&operand, c::compose_e7_augmentation_blake3)
1461                }
1462                HashAlgorithm::Sha3256 => {
1463                    compose1_witness(&operand, c::compose_e7_augmentation_sha3_256)
1464                }
1465                HashAlgorithm::Keccak256 => {
1466                    compose1_witness(&operand, c::compose_e7_augmentation_keccak256)
1467                }
1468                HashAlgorithm::Sha512 => {
1469                    compose1_witness(&operand, c::compose_e7_augmentation_sha512)
1470                }
1471            }
1472        }
1473
1474        fn compose_e8(
1475            operand: KappaLabel,
1476            algo: HashAlgorithm,
1477        ) -> Result<KappaLabel, AddressError> {
1478            use uor_addr::composition as c;
1479            match algo {
1480                HashAlgorithm::Sha256 => compose1_label(&operand, c::compose_e8_embedding),
1481                HashAlgorithm::Blake3 => compose1_label(&operand, c::compose_e8_embedding_blake3),
1482                HashAlgorithm::Sha3256 => {
1483                    compose1_label(&operand, c::compose_e8_embedding_sha3_256)
1484                }
1485                HashAlgorithm::Keccak256 => {
1486                    compose1_label(&operand, c::compose_e8_embedding_keccak256)
1487                }
1488                HashAlgorithm::Sha512 => compose1_label(&operand, c::compose_e8_embedding_sha512),
1489            }
1490        }
1491
1492        fn compose_e8_with_witness(
1493            operand: KappaLabel,
1494            algo: HashAlgorithm,
1495        ) -> Result<Grounded, AddressError> {
1496            use uor_addr::composition as c;
1497            match algo {
1498                HashAlgorithm::Sha256 => compose1_witness(&operand, c::compose_e8_embedding),
1499                HashAlgorithm::Blake3 => compose1_witness(&operand, c::compose_e8_embedding_blake3),
1500                HashAlgorithm::Sha3256 => {
1501                    compose1_witness(&operand, c::compose_e8_embedding_sha3_256)
1502                }
1503                HashAlgorithm::Keccak256 => {
1504                    compose1_witness(&operand, c::compose_e8_embedding_keccak256)
1505                }
1506                HashAlgorithm::Sha512 => compose1_witness(&operand, c::compose_e8_embedding_sha512),
1507            }
1508        }
1509    }
1510
1511    export!(UorAddrComponent);
1512}