A production-grade, three-tier assertion template library for cryptocurrency compliance
verification, bridging business logic, protocol specifications, and mathematical proofs
through compile-time static dispatch and theorem-proven safety guarantees.
CryptoAssert eliminates the need for engineers to understand low-level cryptographic primitives
when building cryptocurrency compliance checks. It provides a formally verified, type-safe
abstraction over address validation, transaction verification, signature scheme compatibility,
fee ratio enforcement, replay protection, contract safety, and cross-chain bridge security across
9 blockchain ecosystems and 5 signature schemes.
The library is organized in three layers, each with a distinct responsibility:
All traits use self: Self parameters and fn[V: Trait] generic syntax.
This guarantees the compiler resolves every method call at compile time. There is
no vtable lookup, no dyn dispatch, and no runtime NotImplemented error state.
In a smart-contract context, a runtime “not implemented” branch is not a usability
nuisance — it is a remote code execution vulnerability. By eliminating this
class of errors entirely through the type system, CryptoAssert removes an entire
attack surface.
2. Theorem-Proven Invariants
The transfer_proof.mbtp file uses MoonBit’s Hermes system to encode and prove
mathematical invariants about cryptocurrency transfers. These proofs are checked
by Why3/Z3 at compile time — not at runtime, not in CI, but as part of the
static analysis pipeline that runs every time the code is compiled.
This is equivalent to having a mathematical paper’s proofs mechanically checked
every build. No other mainstream blockchain ecosystem (Solidity, Rust/CosmWasm,
Go/Cosmos SDK) offers this capability natively.
3. Trait-Based Extension
The library ships with a DefaultVerifier that covers 9 blockchain ecosystems,
but users can implement their own verifiers by implementing the AddressVerifier,
TransactionVerifier, and SecurityVerifier traits. The compiler enforces
completeness — missing any method is a compilation error, not a runtime panic.
4. Structured Error Model
All errors use MoonBit’s suberror mechanism (checked error subtypes). Each error
variant carries structured payload data that enables programmatic error handling
without string parsing. The 10 error variants cover the entire error space of
cryptocurrency assertion failures.
Layer 1: Hermes Proof Layer
File: protocol/transfer_proof.mbtp
This layer defines and proves mathematical theorems about cryptocurrency transfers
using moon prove, which invokes the Why3 verification platform backed by the Z3 SMT solver.
Predicates
Predicate
Signature
Mathematical Meaning
fund_conservation_inv
(total_in, total_out, fee: UInt64)
total_in ≡ total_out + fee
transfer_state_invariant
(pre_total, post_total: UInt64)
pre_total ≡ post_total
Lemmas & Theorems
Lemma
Dependencies
Conclusion
no_inflation_lemma
fund_conservation_inv ∧ fee ≥ 0
total_in ≥ total_out
fee_nonnegative_lemma
— (UInt64 axiom)
fee ≥ 0
value_monotonic_lemma
in1 ≥ in2 ∧ both ≥ out + fee
(in1 − out − fee) ≥ (in2 − out − fee)
overflow_safe_lemma
a + b ≥ a
a + b ≥ b
transfer_correctness_theorem
fund_conservation_inv ∧ fee ≥ 0
No inflation + state invariant
Each lemma body contains explicit proof_assert statements that guide the Z3 solver
through the logical derivation. The proofs are verifiable by running:
moon prove protocol
Why This Matters in Production
Without formal proof, a developer writes assert(total_in == total_out + fee) and
hopes it is correct. With Hermes, the SMT solver exhaustively checks the logic across
all possible UInt64 inputs, including edge cases like overflow wraparound, zero-fee
transactions, and maximum-value inputs. This eliminates entire categories of bugs —
integer overflow, inflation attacks, and conservation violations — before code reaches
production.
Layer 2: Protocol Specification Layer
Directory: protocol/
The protocol layer defines what must be verified — the type contracts, trait
interfaces, and the reference DefaultVerifier implementation.
The business layer provides how to verify — concrete assertion functions that
consume trait implementations and return structured results or raise typed errors.
This generates browsable documentation in the _build/doc/ directory.
Error Model
All errors use MoonBit’s suberror mechanism — checked error subtypes that the
compiler enforces at call sites. Each variant carries domain-specific payload data.
/// Validate an Ethereum EIP-55 checksummed address
let verifier = @protocol.DefaultVerifier{}
let result = try @business.assert_address_format(
verifier,
"0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18",
@protocol.AddressType::EthEip55,
) catch {
@protocol.AssertError::InvalidPrefix(a, p) => panic("Bad prefix: \{p}")
@protocol.AssertError::InvalidLength(a, mn, mx) =>
panic("Length \{a.length()} not in [\{mn}, \{mx}]")
@protocol.AssertError::InvalidCharacter(a, c) =>
panic("Illegal character '\{c}' in address")
@protocol.AssertError::ChecksumMismatch(a) =>
panic("EIP-55 checksum mismatch")
_ => panic("Unknown error")
}
// result == AssertionResult::Valid
Example 2: Signature Scheme Compatibility (Pure Function)
/// ECDSA + Bitcoin P2PKH is compatible
let ok = try @business.assert_sig_scheme_compatible(
@protocol.SignatureScheme::EcdsaSecp256k1,
@protocol.AddressType::BtcP2pkh,
)
// ok == AssertionResult::Valid
/// BLS12-381 + Bitcoin is NOT compatible
try @business.assert_sig_scheme_compatible(
@protocol.SignatureScheme::Bls12381,
@protocol.AddressType::BtcP2pkh,
) catch {
@protocol.AssertError::IncompatibleScheme(s, a) =>
// s == Bls12381, a == BtcP2pkh
...
}
Total: 9,100+ property check rounds across the compatibility matrix.
Test Execution
# Type checking
moon check
# Run all 23 tests
moon test
# Update test snapshots
moon test --update
# Run Hermes theorem proofs
moon prove protocol
Security Considerations
Compile-Time Guarantees
Zero NotImplemented: All traits use self: Self with fn[V: Trait] syntax.
The compiler rejects any incomplete trait implementation at compile time. This
eliminates a class of vulnerabilities where runtime “not implemented” branches
could be exploited in smart contract contexts.
Overflow Protection: The overflow_safe_lemma is proven by Z3 and enforced
at runtime in assert_transaction_balance. Every UInt64 addition is guarded by
a + b ≥ a checks.
Fund Conservation: The fund_conservation_inv predicate is verified by the
SMT solver across all possible UInt64 inputs. The runtime implementation mirrors
this invariant exactly.
Numeric Domain: UInt64 vs U256
The current Hermes proofs and assert_transaction_balance operate on UInt64
(max ≈ 1.84 × 10¹⁹), which is sufficient for Bitcoin (Satoshi), Solana (Lamport),
and most UTXO-based chains where individual UTXO values fit within 64 bits.
For Ethereum and EVM-compatible chains that use 256-bit integers (U256, max ≈
1.16 × 10⁷⁷) for native ETH or ERC-20 balances with 18 decimal places, UInt64
may overflow on large transfers (e.g., > ~18 ETH or equivalent). The
overflow_safe_lemma and runtime guards will correctly reject these overflow
cases rather than silently wrapping, which is safe but may block legitimate
high-value transactions.
Roadmap & Workarounds:
U256 proof extension is planned — the fund_conservation_inv predicate and
all 6 lemmas will be parameterized over arbitrary-precision integers.
In the interim, callers processing Ethereum transactions should either (a)
scale amounts to a sub-unit that fits within UInt64 (e.g., Gwei instead of Wei),
or (b) use a custom SecurityVerifier that operates on BigInt/string
representations and bypasses the UInt64-based assert_transaction_balance.
Production Hardening Recommendations
Implement real cryptographic verification — The DefaultVerifier provides
structural validation (length, charset, checksum). For production, implement
TransactionVerifier.verify_signature with actual elliptic curve operations.
Use a secure random number generator — The QuickCheck LCG in tests is
deterministic by design. Production systems should use OS-provided CSPRNGs.
Audit custom verifiers — While the trait system guarantees completeness,
the semantic correctness of custom SecurityVerifier implementations is the
integrator’s responsibility.
Attack Surface Analysis
Class
Mitigation
Mechanism
Integer overflow (inflation)
Proven
overflow_safe_lemma + Z3 + runtime guard
Integer overflow (fee bypass)
Proven
fund_conservation_inv + Z3
Incomplete trait impl
Prevented
Compile-time trait completeness check
Address spoofing (wrong prefix)
Caught
InvalidPrefix error
Address spoofing (invalid char)
Caught
InvalidCharacter error
Checksum bypass
Caught
ChecksumMismatch error
Signature scheme mismatch
Caught
IncompatibleScheme error
Double-spend
Caught
TxValidationCode::DoubleSpend
Replay attack
Caught
ReplayProtectionSpec + SecurityVerifier
Cross-chain bridge exploit
Caught
BridgeSpec.min_validators check
Build, Prove & Test
Development Commands
# ─── Type Checking ──────────────────────────────────
moon check # Full project type check
# ─── Testing ────────────────────────────────────────
moon test # Run all 23 tests
moon test --update # Update test snapshots
moon test --package crypto_assert # Target specific package
# ─── Hermes Theorem Proving ─────────────────────────
moon prove protocol # Verify all lemmas in transfer_proof.mbtp
# ─── Build ──────────────────────────────────────────
moon build # Build the package
moon build --target wasm # Build for WebAssembly
moon build --target wasm-gc # Build for wasm-gc backend
# ─── Documentation ──────────────────────────────────
moon doc # Generate API documentation
# ─── Formatting ─────────────────────────────────────
moon fmt # Format all source files
# ─── IDE Support ────────────────────────────────────
moon ide # Start LSP for editor integration
# ─── Full Validation Pipeline ───────────────────────
moon check && moon prove protocol && moon test
Key differentiator: CryptoAssert is the only library that provides
proof-carrying code — mathematical theorems about fund conservation are verified
by an SMT solver at compile time and embedded in the binary. No other blockchain
verification library in any language offers this level of assurance.
License
Apache 2.0 License
Contributing
Implement missing trait methods — the compiler will tell you which ones.
Add new chain support by implementing all three traits.
Extend transfer_proof.mbtp with chain-specific invariants and prove them.
Add QuickCheck property tests for new compatibility pairs.
Run moon check && moon prove protocol && moon test before submitting.
Built with MoonBit · Proven with Hermes/Z3 · Tested with QuickCheck
Making cryptocurrency compliance verification accessible, provably safe, and
production-ready.
关于
Production-grade assertion library for multi-chain crypto compliance and fund conservation, built on MoonBit with static dispatch and formal proofs.
CryptoAssert — Cryptocurrency Compliance & Security Assertion Library
Table of Contents
Overview
CryptoAssert eliminates the need for engineers to understand low-level cryptographic primitives when building cryptocurrency compliance checks. It provides a formally verified, type-safe abstraction over address validation, transaction verification, signature scheme compatibility, fee ratio enforcement, replay protection, contract safety, and cross-chain bridge security across 9 blockchain ecosystems and 5 signature schemes.
The library is organized in three layers, each with a distinct responsibility:
protocol/transfer_proof.mbtpprotocol/DefaultVerifierbusiness/fn[V: Trait]dispatchNotImplementedArchitecture
Project Structure
Line counts (implementation only):
protocol/address_spec.mbtprotocol/transfer_proof.mbtpprotocol/security_spec.mbtprotocol/transaction_spec.mbtprotocol/assert_result.mbtbusiness/security_assert.mbtbusiness/address_assert.mbtDesign Philosophy
1. Static Dispatch over Dynamic Dispatch
All traits use
self: Selfparameters andfn[V: Trait]generic syntax. This guarantees the compiler resolves every method call at compile time. There is no vtable lookup, nodyndispatch, and no runtimeNotImplementederror state.In a smart-contract context, a runtime “not implemented” branch is not a usability nuisance — it is a remote code execution vulnerability. By eliminating this class of errors entirely through the type system, CryptoAssert removes an entire attack surface.
2. Theorem-Proven Invariants
The
transfer_proof.mbtpfile uses MoonBit’s Hermes system to encode and prove mathematical invariants about cryptocurrency transfers. These proofs are checked by Why3/Z3 at compile time — not at runtime, not in CI, but as part of the static analysis pipeline that runs every time the code is compiled.This is equivalent to having a mathematical paper’s proofs mechanically checked every build. No other mainstream blockchain ecosystem (Solidity, Rust/CosmWasm, Go/Cosmos SDK) offers this capability natively.
3. Trait-Based Extension
The library ships with a
DefaultVerifierthat covers 9 blockchain ecosystems, but users can implement their own verifiers by implementing theAddressVerifier,TransactionVerifier, andSecurityVerifiertraits. The compiler enforces completeness — missing any method is a compilation error, not a runtime panic.4. Structured Error Model
All errors use MoonBit’s
suberrormechanism (checked error subtypes). Each error variant carries structured payload data that enables programmatic error handling without string parsing. The 10 error variants cover the entire error space of cryptocurrency assertion failures.Layer 1: Hermes Proof Layer
File:
protocol/transfer_proof.mbtpThis layer defines and proves mathematical theorems about cryptocurrency transfers using
moon prove, which invokes the Why3 verification platform backed by the Z3 SMT solver.Predicates
fund_conservation_inv(total_in, total_out, fee: UInt64)total_in ≡ total_out + feetransfer_state_invariant(pre_total, post_total: UInt64)pre_total ≡ post_totalLemmas & Theorems
no_inflation_lemmafund_conservation_inv∧fee ≥ 0total_in ≥ total_outfee_nonnegative_lemmafee ≥ 0value_monotonic_lemmain1 ≥ in2∧ both ≥out + fee(in1 − out − fee) ≥ (in2 − out − fee)overflow_safe_lemmaa + b ≥ aa + b ≥ btransfer_correctness_theoremfund_conservation_inv∧fee ≥ 0Each lemma body contains explicit
proof_assertstatements that guide the Z3 solver through the logical derivation. The proofs are verifiable by running:Why This Matters in Production
Without formal proof, a developer writes
assert(total_in == total_out + fee)and hopes it is correct. With Hermes, the SMT solver exhaustively checks the logic across all possibleUInt64inputs, including edge cases like overflow wraparound, zero-fee transactions, and maximum-value inputs. This eliminates entire categories of bugs — integer overflow, inflation attacks, and conservation violations — before code reaches production.Layer 2: Protocol Specification Layer
Directory:
protocol/The protocol layer defines what must be verified — the type contracts, trait interfaces, and the reference
DefaultVerifierimplementation.AddressVerifier Trait
All 9 address types supported by
DefaultVerifier:BtcP2pkh1BtcP2sh3BtcBech32bc1BtcBech32mbc1pEth0xEthEip550xSolanaTronTCosmoscosmos1TransactionVerifier Trait
SecurityVerifier Trait
Layer 3: Business Assertion Layer
Directory:
business/The business layer provides how to verify — concrete assertion functions that consume trait implementations and return structured results or raise typed errors.
Address & Signature Assertions (
address_assert.mbt)assert_address_formatfn[V: AddressVerifier](V, String, AddressType) -> AssertionResult raise AssertErrorassert_sig_scheme_compatiblefn(SignatureScheme, AddressType) -> AssertionResult raise AssertErrorassert_tx_signaturefn[V: TransactionVerifier](V, TransactionSpec) -> AssertionResult raise AssertErrorSecurity Assertions (
security_assert.mbt)assert_transaction_balancefn(TransactionSpec) -> AssertionResult raise AssertErrorΣinputs ≡ Σoutputs + feeassert_replay_protectionfn[V: SecurityVerifier](V, TransactionSpec, ReplayProtectionSpec) -> AssertionResult raise AssertErrorassert_amount_in_rangefn[V: SecurityVerifier](V, String, String, String) -> AssertionResult raise AssertErrorassert_fee_within_ratiofn[V: SecurityVerifier](V, String, String, String) -> AssertionResult raise AssertErrorassert_contract_safetyfn[V: SecurityVerifier](V, TokenSafetySpec) -> AssertionResult raise AssertErrorassert_bridge_securityfn[V: SecurityVerifier](V, BridgeSpec) -> AssertionResult raise AssertErrorBalance Verification
The
assert_transaction_balancefunction directly corresponds to the Hermes-provenfund_conservation_invpredicate. It performs:UInt64with overflow detection.overflow_safe_lemmaguard:a + b ≥ acheck at each addition.total_in ≡ total_out + feewith overflow check ontotal_out + fee.AmountImbalancewith exact values if conservation fails.This is the runtime embodiment of the compile-time-proven theorem.
Type System Reference
Enumerated Types
AddressType— 9 blockchain address formatsBtcP2pkhBtcP2shBtcBech32BtcBech32mEthEthEip55SolanaTronCosmosSignatureScheme— 5 cryptographic signature algorithmsEcdsaSecp256k1Ed25519Sr25519Bls12381SchnorrSecp256k1HashScheme— 6 hash algorithmsSha256Keccak256Blake2b256Blake2s256Ripemd160Sha256dChecksumType— 4 checksum strategiesNoneBase58CheckBech32Eip55TxStatus— 5 transaction lifecycle statesPending,Confirmed,Failed,Dropped,UnknownTxValidationCode— 9 transaction validation outcomesValid,InvalidSignature,InvalidInput,InvalidOutput,InsufficientFee,DoubleSpend,Expired,AmountMismatch,ChainIdMismatchSecurityAssertResult— 3-tier security verdictSafe,Warning(String),Unsafe(String)ContractSafetyMode— 5 smart contract safety controlsOwned,TimeLock,Pausable,Upgradeable,RateLimitedStruct Types
AddressLengthRangemin_chars: UInt,max_chars: UInt,byte_len: UIntAddressFormatSpecty, length, checksum_type, prefix_req, charset, descriptionPrecisionSpecdecimals: UInt,unit_vals: String,symbol: StringTxInputSpectxid, vout, script_sig, amount_strTxOutputSpecaddress, amount_str, script_pubkey, is_changeFeeSpecrate_str, total_str, unit_descTransactionSpecversion, inputs[], outputs[], locktime, fee, txid, sig_schemeTokenTransferSpecfrom, to, contract, amount_str, chain_id, precisionSignatureVerifySpecmessage_hex, signature_hex, public_key_hex, schemeReplayProtectionSpecrequire_nonce, require_chain_id, require_timestamp, max_nonce_reuseTokenSafetySpechas_mint, mint_controlled, has_burn, has_pause, safety_modes[]BridgeSpeccontract_address, target_chain_id, min_amount_str, max_amount_str, has_validator_set, min_validatorsTrait Reference
AddressVerifieraddress_format_spec(self, AddressType)AddressFormatSpecvalid_address_length_range(self, AddressType)AddressLengthRangevalidate_checksum(self, AddressType, String)Booladdress_precision(self, SignatureScheme)PrecisionSpechash_output_length(self, HashScheme)UIntis_valid_hash_size(self, Bytes, HashScheme)BoolTransactionVerifiervalidate_transaction(self, TransactionSpec)TxValidationCodeverify_signature(self, SignatureVerifySpec)Boolcompute_txid(self, TransactionSpec)Stringestimate_fee(self, TransactionSpec, String)FeeSpecvalidate_token_transfer(self, TokenTransferSpec)TxValidationCodeSecurityVerifiercheck_replay_protection(self, TransactionSpec, ReplayProtectionSpec)SecurityAssertResultcheck_contract_safety(self, TokenSafetySpec)SecurityAssertResultcheck_bridge_security(self, BridgeSpec)SecurityAssertResultvalidate_amount_range(self, String, String, String)SecurityAssertResultcheck_fee_ratio(self, String, String, String)SecurityAssertResultAPI Reference
The sections above (Type System Reference, Trait Reference, and Layer 3: Business Assertion Layer) constitute the complete API catalog for this library. For an interactive HTML API reference with cross-linked types and search, run:
This generates browsable documentation in the
_build/doc/directory.Error Model
All errors use MoonBit’s
suberrormechanism — checked error subtypes that the compiler enforces at call sites. Each variant carries domain-specific payload data.suberror AssertError— 10 variantsInvalidPrefix(String, String)— address, expected prefixInvalidLength(String, UInt, UInt)— address, min, maxInvalidCharacter(String, Char)— address, illegal charChecksumMismatch(String)— addressAmountImbalance(UInt64, UInt64, UInt64)— total_in, total_out, feeIncompatibleScheme(SignatureScheme, AddressType)SignatureVerificationFailed(String)— txidNumericParseError(String)— parse detailHashLengthMismatch(UInt, UInt)— actual, expectedSecurityCheckFailed(String)— reasonHandling Errors
Quick Start
Prerequisites
moon prove)Adding CryptoAssert to Your Project
Or add to
moon.modmanually:Then in your
moon.pkg:Example 1: Address Format Validation
Example 2: Signature Scheme Compatibility (Pure Function)
Example 3: Transaction Balance Verification
Example 4: Custom Security Verifier
Extending the Library
Implementing a Custom
AddressVerifierTo add support for a new blockchain (e.g., Polkadot), implement all 6 methods of the
AddressVerifiertrait:The compiler will not compile if any method is missing. This is enforced statically — no runtime
NotImplementederror can ever occur.Adding New Chain Support
The recommended workflow:
AddressVerifierfor your chain’s address format.TransactionVerifierfor your chain’s transaction structure.SecurityVerifierfor your chain’s security model.business/business_test.mbtfor patterns).transfer_proof.mbtpwith chain-specific invariants and prove them withmoon prove.Testing & Quality Assurance
Test Coverage
protocol/spec_easy_test.mbtSecurityAssertResultvariantsprotocol/spec_difficult_test.mbtSignatureVerifySpecbusiness/business_test.mbtQuickCheck Property Bombardment
The business test suite uses
moonbitlang/quickcheck@0.14.0to systematically verify properties through randomized input generation:qc: ECDSA + BtcP2pkhqc: Ed25519 + Solanaqc: Bls12381 + BtcP2pkh incompatibleqc: error payload correctnessIncompatibleSchemecarries correct(scheme, addr)qc: deterministic / idempotenceqc: all 11 compatible pairsqc: all 34 incompatible pairs5×9−11=34)Total: 9,100+ property check rounds across the compatibility matrix.
Test Execution
Security Considerations
Compile-Time Guarantees
Zero
NotImplemented: All traits useself: Selfwithfn[V: Trait]syntax. The compiler rejects any incomplete trait implementation at compile time. This eliminates a class of vulnerabilities where runtime “not implemented” branches could be exploited in smart contract contexts.Overflow Protection: The
overflow_safe_lemmais proven by Z3 and enforced at runtime inassert_transaction_balance. EveryUInt64addition is guarded bya + b ≥ achecks.Fund Conservation: The
fund_conservation_invpredicate is verified by the SMT solver across all possibleUInt64inputs. The runtime implementation mirrors this invariant exactly.Numeric Domain: UInt64 vs U256
The current Hermes proofs and
assert_transaction_balanceoperate onUInt64(max ≈ 1.84 × 10¹⁹), which is sufficient for Bitcoin (Satoshi), Solana (Lamport), and most UTXO-based chains where individual UTXO values fit within 64 bits.For Ethereum and EVM-compatible chains that use 256-bit integers (U256, max ≈ 1.16 × 10⁷⁷) for native ETH or ERC-20 balances with 18 decimal places,
UInt64may overflow on large transfers (e.g., > ~18 ETH or equivalent). Theoverflow_safe_lemmaand runtime guards will correctly reject these overflow cases rather than silently wrapping, which is safe but may block legitimate high-value transactions.Roadmap & Workarounds:
fund_conservation_invpredicate and all 6 lemmas will be parameterized over arbitrary-precision integers.SecurityVerifierthat operates onBigInt/string representations and bypasses theUInt64-basedassert_transaction_balance.Production Hardening Recommendations
Implement real cryptographic verification — The
DefaultVerifierprovides structural validation (length, charset, checksum). For production, implementTransactionVerifier.verify_signaturewith actual elliptic curve operations.Use a secure random number generator — The QuickCheck LCG in tests is deterministic by design. Production systems should use OS-provided CSPRNGs.
Add chain-specific invariants — Extend
transfer_proof.mbtpwith chain-specific theorems (e.g., staking conservation, slashing invariants).Audit custom verifiers — While the trait system guarantees completeness, the semantic correctness of custom
SecurityVerifierimplementations is the integrator’s responsibility.Attack Surface Analysis
overflow_safe_lemma+ Z3 + runtime guardfund_conservation_inv+ Z3InvalidPrefixerrorInvalidCharactererrorChecksumMismatcherrorIncompatibleSchemeerrorTxValidationCode::DoubleSpendReplayProtectionSpec+SecurityVerifierBridgeSpec.min_validatorscheckBuild, Prove & Test
Development Commands
CI/CD Pipeline Example
Comparison with Industry Alternatives
NotImplemented)Key differentiator: CryptoAssert is the only library that provides proof-carrying code — mathematical theorems about fund conservation are verified by an SMT solver at compile time and embedded in the binary. No other blockchain verification library in any language offers this level of assurance.
License
Apache 2.0 License
Contributing
transfer_proof.mbtpwith chain-specific invariants and prove them.moon check && moon prove protocol && moon testbefore submitting.Built with MoonBit · Proven with Hermes/Z3 · Tested with QuickCheck
Making cryptocurrency compliance verification accessible, provably safe, and production-ready.