Functional-First Design
Built with immutable data structures, pure functions, and algebraic data types for predictable, composable code that eliminates entire classes of bugs.
Our journey from concept to production-ready implementation
Research and planning began
Core protocol in Kotlin
Started Scala client
Fuzz testing & security
GP 0.7.2 conformance
P2P & block production
Research and planning began
Core protocol in Kotlin
Started Scala client
Fuzz testing & security
GP 0.7.2 conformance
P2P & block production
Built for performance, designed for developers
Built with immutable data structures, pure functions, and algebraic data types for predictable, composable code that eliminates entire classes of bugs.
Custom PolkaVM virtual machine implementation in pure Scala with efficient bytecode execution, gas metering, and memory management.
Leverages Rust-based cryptographic libraries via JNI and JVM JIT optimization for production-grade performance without sacrificing type safety.
Cats Effect provides composable, referentially transparent concurrency primitives for safe async operations in consensus-critical code.
Comprehensive type system with opaque types, GADTs, and refined types ensures compile-time correctness and prevents invalid states.
Cleanly separated modules (jam-core, jam-crypto, jam-pvm, jam-protocol) with minimal dependencies for easy integration and maintenance.
JAM Forge is a production-grade Scala 3 implementation of the JAM (Join-Accumulate Machine) protocol—the next evolution in blockchain infrastructure. JAM introduces a novel architecture for scalable, decentralized computation through its innovative work package and service account model.
By leveraging Scala's advanced type system and functional programming paradigms, JAM Forge delivers a concise, maintainable implementation while maintaining full protocol conformance and production-grade performance.
import io.forge.jam.core.types.*
import io.forge.jam.protocol.*
// Decode and import a block
val result = for
block <- Block.codec.decode(bytes)
state <- BlockImport.importBlock(
currentState, block, config
)
yield state
// Pattern match on result
result match
case Right(newState) => // success
case Left(error) => // handle