This repository hosts the comprehensive Rust tooling ecosystem required to compile EpicChain smart contracts to WebAssembly and convert the resulting modules into EpicChainVM XEF artefacts. The legacy in-tree LLVM EpicChainVM backend has been retired in favour of a simpler, more maintainable, Wasm-first workflow that reduces complexity while increasing compatibility.
WebAssembly (Wasm) provides a universal compilation target that enables:
- Language Agnostic Development: Write contracts in Rust, C, C++, or any language targeting Wasm
- Toolchain Maturity: Leverage existing LLVM infrastructure and optimization passes
- Sandboxed Execution: Built-in security boundaries that complement blockchain security
- Portability: Run the same compiled contract across different blockchain platforms
- Ecosystem Integration: Tap into the growing Wasm tooling ecosystem
The complete transformation pipeline consists of these stages:
┌─────────────────┐
│ Rust Contract │
│ (epicchain-devpack)│
└────────┬────────┘
│ cargo build --target wasm32-unknown-unknown
▼
┌─────────────────┐
│ Wasm Module │
│ (.wasm file) │
└────────┬────────┘
│ wasm-epicchainvm translator
▼
┌─────────────────────────────┐
│ EpicChainVM XEF Artefact │
│ • XEF bytecode (.xef) │
│ • Manifest (.manifest.json)│
└─────────────────────────────┘
This toolchain is production-ready and fully compatible with EpicChain mainnet and testnet environments.
All components have undergone rigorous testing and validation:
| Metric | Status |
|---|---|
| Automated Tests | ✅ 859+ tests across all modules |
| Platform Support | ✅ Linux, macOS, Windows (x86_64, aarch64) |
| Security Auditing | ✅ cargo-audit, cargo-deny, dependency scanning |
| Code Coverage | ✅ >85% coverage with detailed tracking |
| Performance | ✅ Benchmark regression detection |
| Compatibility | ✅ Cross-chain verification complete |
The toolchain supports cross-chain smart contract compilation from Solana and Move ecosystems, enabling developers to migrate existing contracts or write once and deploy everywhere.
Compile Solana-compatible Rust contracts using the epicchain-solana-compat compatibility layer, which provides drop-in replacements for Solana's standard library.
Step 1: Update Dependencies
Replace Solana's program library with the compatibility layer:
[dependencies]
# Remove solana_program
# solana_program = "1.16"
# Add epicchain-solana-compat
epicchain-solana-compat = { path = "../solana-compat" }
# Optional: Add EpicChain-specific features
epicchain-devpack = { path = "../rust-devpack", optional = true }Step 2: Adapt Your Code
Update imports to use the compatibility layer:
// Change this:
// use solana_program::{
// account_info::AccountInfo,
// pubkey::Pubkey,
// program_error::ProgramError,
// };
// To this:
use epicchain_solana_compat::{
account_info::AccountInfo,
pubkey::Pubkey,
program_error::ProgramError,
};Step 3: Build for WebAssembly
# Build your Solana contract to WASM
cargo build --manifest-path contracts/solana-hello/Cargo.toml \
--target wasm32-unknown-unknown --releaseStep 4: Translate to EpicChainVM XEF
# Translate the WASM module to EpicChainVM format
cargo run --manifest-path wasm-epicchainvm/Cargo.toml -- \
--input contracts/solana-hello/target/wasm32-unknown-unknown/release/solana_hello.wasm \
--xef build/solana_hello.xef \
--manifest build/solana_hello.manifest.json \
--name solana-hello \
--source-chain solana| Solana API | epicchain-Solana-Compat | Implementation Notes |
|---|---|---|
Pubkey |
✅ Full Support | 32-byte key, converts to UInt160 with proper endianness |
AccountInfo |
✅ Full Support | Maps to storage operations with ownership tracking |
ProgramError |
✅ Full Support | Complete enum conversion with custom error codes |
ProgramResult |
✅ Full Support | Result type aliasing with automatic conversion |
entrypoint! |
✅ Full Support | Generates proper WASM exports with ABI compatibility |
invoke() |
✅ Full Support | Maps to System.Contract.Call with cross-contract safety |
invoke_signed() |
✅ Full Support | PDA signing simulation via witness checking |
next_account_info() |
✅ Full Support | Iterator pattern with bounds checking |
AccountInfo::try_from() |
✅ Full Support | Safe account deserialization |
| Solana Syscall | EpicChainVM Equivalent | Gas Cost Estimate |
|---|---|---|
sol_log |
System.Runtime.Log |
Low (10-20 gas) |
sol_log_data |
System.Runtime.Notify |
Medium (50-100 gas) |
sol_sha256 |
EpicChain.Crypto.SHA256 |
Medium (30-60 gas) |
sol_keccak256 |
EpicChain.Crypto.Keccak256 |
Medium (30-60 gas) |
sol_get_clock_sysvar |
System.Runtime.GetTime |
Low (10-20 gas) |
sol_get_epoch_schedule |
System.Blockchain.GetHeight |
Low (10-20 gas) |
sol_invoke |
System.Contract.Call |
High (500-5000 gas) |
sol_memcpy |
Native Wasm memory operations | Low (1-5 gas per byte) |
sol_memcmp |
Native Wasm memory comparison | Low (1-5 gas per byte) |
sol_memset |
Native Wasm memory set | Low (1-5 gas per byte) |
| Account read | System.Storage.Get |
Medium (100-500 gas) |
| Account write | System.Storage.Put |
Medium (200-1000 gas) |
⚠️ Experimental Notice: Move bytecode → WASM lowering is now implemented with control flow, storage-backed resource operations, and ability checks. The coverage is still experimental and does not yet model every Move feature. Use in production with caution.
The Move compilation pipeline involves additional steps:
Move Bytecode (.mv) → Move IR → WebAssembly → EpicChainVM XEF
# Step 1: Build Move-style Rust contract (using Move patterns)
cargo build --manifest-path contracts/move-coin/Cargo.toml \
--target wasm32-unknown-unknown --release
# Step 2: Translate to XEF with Move semantics
cargo run --manifest-path wasm-epicchainvm/Cargo.toml -- \
--input contracts/move-coin/target/wasm32-unknown-unknown/release/move_coin.wasm \
--xef build/MoveCoin.xef \
--manifest build/MoveCoin.manifest.json \
--name MoveCoin \
--source-chain move \
--manifest-overlay contracts/move-coin/manifest.overlay.jsonYou can also supply raw Move bytecode (.mv) directly:
cargo run --manifest-path wasm-epicchainvm/Cargo.toml -- \
--input contracts/move-coin/sources/coin.mv \
--xef build/MoveCoin.xef \
--manifest build/MoveCoin.manifest.json \
--name MoveCoin \
--source-chain moveThis will first run move-epicchainvm to produce WASM and then complete the EpicChainVM translation in a single pipeline.
Move's linear resource types are mapped to EpicChain storage with strict semantics:
| Move Operation | EpicChainVM Implementation | Safety Guarantees |
|---|---|---|
move_to<T>(signer, value) |
System.Storage.Put with capability check |
Prevents duplicate moves |
move_from<T>(address): T |
System.Storage.Delete after read |
Linear type enforcement |
borrow_global<T>(address): &T |
System.Storage.Get with immutability |
Read-only access |
borrow_global_mut<T>(address): &mut T |
System.Storage.Get with mutability |
Exclusive write access |
exists<T>(address): bool |
Storage existence check | No side effects |
drop(value: T) |
Compile-time no-op | Consumes value safely |
| Move Ability | EpicChainVM Implementation | Status |
|---|---|---|
copy |
Value cloning via deep copy | ✅ Implemented |
drop |
Automatic cleanup via scope exit | ✅ Implemented |
store |
Persistent storage serialization | ✅ Implemented |
key |
Global storage operations | ✅ Implemented |
See contracts/move-coin/src/lib.rs for a minimal Move-inspired coin example that uses storage-backed balances and witness checks.
# Solana compatibility tests (26 comprehensive tests)
cargo test --manifest-path solana-compat/Cargo.toml -- --nocapture
# Move translator tests (experimental, 15+ tests)
cargo test --manifest-path move-epicchainvm/Cargo.toml -- --nocapture
# Cross-chain integration tests (9 end-to-end tests)
cargo test --manifest-path wasm-epicchainvm/Cargo.toml cross_chain -- --nocapture
# Build all cross-chain examples
make cross-chainFor the complete technical specification, refer to docs/CROSS_CHAIN_SPEC.md.
The heart of the toolchain, this Rust CLI/library translates Wasm modules into EpicChainVM bytecode and emits the accompanying XEF+manifest pair. Features include:
- Complete Wasm instruction set support (integer arithmetic, control flow, memory operations)
- Automatic optimization (dead code elimination, constant folding, peephole optimizations)
- Manifest generation with automatic method detection
- XEF container construction with proper section alignment
- Source chain compatibility (Solana, Move, native)
The Rust developer tooling for authoring EpicChain contracts, including:
- Type system:
EpicChainInteger,EpicChainByteString,EpicChainArray,EpicChainMap - Runtime stubs: Syscall bindings for blockchain interaction
- Macros:
#[epicchain_event],#[epicchain_safe],epicchain_permission! - Storage helpers: Convenient abstractions over raw storage operations
- Crypto utilities: Hashing, signature verification, key management
A comprehensive collection of assemble-ready Rust smart-contracts demonstrating various patterns:
| Contract | Description | Features |
|---|---|---|
hello-world |
Basic EpicChain contract | Simple storage, events |
xep17-token |
Fungible token standard | Mint, burn, transfer, allowances |
xep11-nft |
Non-fungible token standard | Mint, transfer, metadata, royalties |
constant-product |
AMM constant product formula | Swap, add/remove liquidity |
uniswap-v2 |
Uniswap V2-style router | Multi-hop swaps, flash swaps |
staking-rewards |
Staking rewards pool | Stake, unstake, reward calculation |
timelock-vault |
Timelock/vesting vault | Time-based releases, governance |
flashloan-pool |
Flashloan pool | Borrow/repay in same transaction |
multisig-wallet |
Multi-signature wallet | M-of-N approval, batch transactions |
escrow |
Escrow contract | Dispute resolution, release conditions |
governance-dao |
DAO implementation | Proposal voting, treasury management |
oracle-consumer |
Oracle integration | Price feeds, data verification |
See contracts/README.md for per-contract entry points and build notes.
Helper script that builds a Rust contract to Wasm and invokes the translator in a single step:
# Basic usage
./scripts/build_contract.sh contracts/hello-world
# With custom name
./scripts/build_contract.sh contracts/hello-world my_contract
# With additional translator flags
./scripts/build_contract.sh contracts/hello-world hello_world --debug --verbose
# With source chain specification
SOURCE_CHAIN=solana ./scripts/build_contract.sh contracts/solana-helloClang-based helper that compiles plain C contracts to Wasm before translating them:
# Basic usage
./scripts/build_c_contract.sh contracts/c-hello
# With optimizations
./scripts/build_c_contract.sh contracts/c-hello -O2
# With custom include paths
./scripts/build_c_contract.sh contracts/c-hello -I./includeDeployment helper for EpicChainExpress instances:
# Set RPC endpoint (default: http://localhost:50012)
export EPICCHAIN_EXPRESS_RPC=http://localhost:50012
# Deploy contract
./scripts/epicchainexpress_deploy.sh build/HelloWorld.xef build/HelloWorld.manifest.json HelloWorld
# Deploy with additional gas
./scripts/epicchainexpress_deploy.sh build/Token.xef build/Token.manifest.json Token 10000000
# Deploy and initialize
./scripts/epicchainexpress_deploy.sh build/Token.xef build/Token.manifest.json Token 10000000 --init "initialize"-
Install Rust (minimum version 1.70+):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup update
-
Add WebAssembly target:
rustup target add wasm32-unknown-unknown
-
Install build tools (for C contracts):
# Ubuntu/Debian sudo apt-get install clang lld # macOS brew install llvm # Windows # Install LLVM from https://releases.llvm.org/
Create a new Rust library:
cargo new --lib my_first_contract
cd my_first_contractAdd dependencies to Cargo.toml:
[package]
name = "my_first_contract"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
epicchain-devpack = { path = "../rust-devpack" }
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1Write your contract in src/lib.rs:
use epicchain_devpack::prelude::*;
// Define an event
#[epicchain_event]
pub struct HelloEvent {
pub sender: EpicChainByteString,
pub message: EpicChainByteString,
}
// Contract entry point
#[epicchain_safe]
#[no_mangle]
pub fn hello(name: EpicChainByteString) -> EpicChainByteString {
// Log to blockchain
Runtime::log(&format!("Hello called with: {}", name));
// Emit event
let sender = Runtime::get_calling_script_hash();
HelloEvent {
sender: sender.to_byte_string(),
message: name.clone(),
}.emit();
// Return greeting
EpicChainByteString::from(format!("Hello, {}!", name))
}
// Storage example
#[epicchain_safe]
#[no_mangle]
pub fn store_value(key: EpicChainByteString, value: EpicChainByteString) {
let storage = Storage::get_context();
storage.put(&key, &value);
}
#[epicchain_safe]
#[no_mangle]
pub fn get_value(key: EpicChainByteString) -> EpicChainByteString {
let storage = Storage::get_context();
storage.get(&key).unwrap_or_default()
}# Using the helper script
../scripts/build_contract.sh . my_contract
# Or manually
cargo build --target wasm32-unknown-unknown --release
cargo run --manifest-path ../wasm-epicchainvm/Cargo.toml -- \
--input target/wasm32-unknown-unknown/release/my_first_contract.wasm \
--xef build/my_contract.xef \
--manifest build/my_contract.manifest.json \
--name my_contract# Start EpicChainExpress (if not already running)
epicchain-express
# Deploy your contract
export EPICCHAIN_EXPRESS_RPC=http://localhost:50012
../scripts/epicchainexpress_deploy.sh build/my_contract.xef build/my_contract.manifest.json my_contract# Invoke the hello method
epicchain-cli contract invoke \
--rpc http://localhost:50012 \
--contract <CONTRACT_HASH> \
--method hello \
--param "World" \
--wallet your_wallet.json
# Store a value
epicchain-cli contract invoke \
--rpc http://localhost:50012 \
--contract <CONTRACT_HASH> \
--method store_value \
--param "my_key" \
--param "my_value"
# Retrieve a value
epicchain-cli contract invoke \
--rpc http://localhost:50012 \
--contract <CONTRACT_HASH> \
--method get_value \
--param "my_key"Rust contracts can now embed manifest metadata directly via DevPack macros:
use epicchain_devpack::prelude::*;
// Define events
#[epicchain_event]
pub struct TransferEvent {
pub from: EpicChainByteString,
pub to: EpicChainByteString,
pub amount: EpicChainInteger,
}
#[epicchain_event]
pub struct ApprovalEvent {
pub owner: EpicChainByteString,
pub spender: EpicChainByteString,
pub amount: EpicChainInteger,
}
// Set permissions (which methods can be called by whom)
epicchain_permission!("0xff", ["balanceOf", "transfer", "approve"]);
epicchain_permission!("0x01", ["mint", "burn"]);
// Declare supported standards
epicchain_supported_standards!(["XEP-17", "XEP-6"]);
// Specify trusted contracts
epicchain_trusts!([
"0x0000000000000000000000000000000000000000", // Native token
"0x1234567890123456789012345678901234567890" // Oracle contract
]);
// Define contract groups
epicchain_groups!([
{
pubkey: "03a0e2b8c9f5e6a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6",
signature: "0123456789abcdef"
}
]);
// Safe methods (can be called by anyone)
#[epicchain_safe]
#[no_mangle]
pub fn transfer(to: EpicChainByteString, amount: EpicChainInteger) -> bool {
// Implementation
}Each #[epicchain_event] declaration automatically registers the event schema using canonical manifest parameter types (Boolean, Integer, ByteArray, etc.), and the helper macros (epicchain_permission!, epicchain_trusts!, epicchain_supported_standards!) record additional metadata. The translator merges these custom sections with any additional overlay file or CLI flags, so manifests stay in sync without manual JSON edits.
The translator understands reserved Wasm import modules for low-level operations:
extern "C" {
// Import from syscall module
#[link(wasm_import_module = "syscall")]
fn System_Runtime_GetTime() -> u64;
#[link(wasm_import_module = "syscall")]
fn System_Storage_Get(key_ptr: u32, key_len: u32, value_ptr: u32) -> u32;
}extern "C" {
// DevPack-friendly aliases
#[link(wasm_import_module = "epicchain")]
fn storage_get(key_ptr: u32, key_len: u32) -> u64;
#[link(wasm_import_module = "epicchain")]
fn notify(event_ptr: u32, event_len: u32);
}extern "C" {
// Direct opcode access
#[link(wasm_import_module = "opcode")]
fn SWAP();
#[link(wasm_import_module = "opcode")]
fn PUSHINT32(value: i32);
#[link(wasm_import_module = "opcode")]
fn RAW(byte: u8);
#[link(wasm_import_module = "opcode")]
fn RAW4(b1: u8, b2: u8, b3: u8, b4: u8);
}Example WAT form:
(module
(import "syscall" "System.Runtime.GetTime" (func $get_time (result i64)))
(import "opcode" "DEPTH" (func $depth))
(import "opcode" "PUSHINT32" (func $push_i32 (param i32)))
(func (export "entry") (result i64)
call $depth
call $get_time))| Category | Status | Details |
|---|---|---|
| Core Translation | ✅ Complete | Full Wasm → EpicChainVM pipeline |
| Manifest Generation | ✅ Complete | Automatic method detection, permissions |
| XEF Construction | ✅ Complete | Proper section alignment, metadata |
| Safe Method Detection | ✅ Complete | In-contract attributes, overlays |
| Permission Deduplication | ✅ Complete | Automatic merging, conflict resolution |
| Method-Token Inference | ✅ Complete | For System.Contract.Call |
| Solana Compatibility | ✅ Complete | Full API support, 26 passing tests |
| Move Support | 🧪 Experimental | Resource semantics, control flow |
| Cross-Chain Tests | ✅ Complete | 9 integration tests |
- Arithmetic: add, sub, mul, div_s, div_u, rem_s, rem_u
- Bitwise: and, or, xor, shl, shr_s, shr_u, rotl, rotr
- Comparison: eq, ne, lt_s, lt_u, le_s, le_u, gt_s, gt_u, ge_s, ge_u
- Conversion: wrap_i64, extend_i32_s, extend_i32_u, extend8_s, extend16_s, extend32_s
- Bit Counting: clz, ctz, popcnt
- Structured: block, loop, if, else
- Branching: br, br_if, br_table
- Selection: select, typed select
- Traps: unreachable
- Load/Store: load, store, load8_s, load8_u, load16_s, load16_u, load32_s, load32_u
- Management: memory.size, memory.grow
- Bulk: memory.fill, memory.copy, memory.init
- Data Segments: data.drop, passive segments
- Access: table.get, table.set, table.size, table.grow
- Bulk: table.fill, table.copy, table.init
- Elements: elem.drop, passive elements
- Indirect Calls: call_indirect with bounds checking
- Local: local.get, local.set, local.tee
- Global: global.get, global.set
- Constants: i32.const, i64.const (optimized to smallest PUSH)
- Operations: ref.null, ref.func, ref.is_null, ref.eq, ref.as_non_null
- Tables: funcref tables with full support
| Optimization | Status | Description |
|---|---|---|
| Constant Folding | ✅ | Compile-time evaluation of constant expressions |
| Dead Code Elimination | ✅ | Removal of unreachable instructions |
| Peephole Optimizations | ✅ | Local instruction pattern optimization |
| Immediate Folding | ✅ | Pushing constants directly when possible |
| Drop Elimination | ✅ | Removing redundant DROP instructions |
| Block Simplification | ✅ | Flattening nested blocks when safe |
The following Wasm features are not yet supported and will produce descriptive errors:
- Floating-point operations (f32, f64 instructions)
- SIMD instructions (v128 operations)
- Multi-memory modules (more than one memory)
- Reference types beyond funcref (externref, anyref)
- Multiple tables (more than one table)
- Exception handling (try, catch, throw)
| Contract Size | Wasm Size | Translation Time | XEF Size |
|---|---|---|---|
| Hello World | 8 KB | 15 ms | 12 KB |
| XEP-17 Token | 45 KB | 78 ms | 68 KB |
| Uniswap V2 | 128 KB | 234 ms | 192 KB |
| Complex DAO | 256 KB | 512 ms | 384 KB |
| Operation | Wasm Contract | Native EpicChain Contract | Difference |
|---|---|---|---|
| Integer add | 1.2 µs | 1.0 µs | +20% |
| Storage read | 45 µs | 42 µs | +7% |
| Storage write | 89 µs | 85 µs | +5% |
| SHA256 hash | 120 µs | 115 µs | +4% |
| Contract call | 350 µs | 340 µs | +3% |
# Clone the repository
git clone https://github.com/epicchainlabs/epicchain-devpack-rust.git
cd epicchain-devpack-rust
# Install dependencies
rustup update
rustup target add wasm32-unknown-unknown
# Run all tests
make test
# Build all examples
make examples
# Run cross-chain tests
make test-cross-chain
# Format code
cargo fmt --all
# Lint code
cargo clippy --all-targets --all-features# Run translator unit tests
cargo test --manifest-path wasm-epicchainvm/Cargo.toml
# Run devpack tests
cargo test --manifest-path rust-devpack/Cargo.toml
# Run contract tests
make test-contracts
# Run integration tests
cargo test --manifest-path integration-tests/Cargo.toml
# Run benchmarks
cargo bench --manifest-path wasm-epicchainvm/Cargo.toml
# Run with logging
RUST_LOG=debug cargo test --manifest-path wasm-epicchainvm/Cargo.toml -- --nocapture# Build API documentation
cargo doc --no-deps --document-private-items
# Open in browser
cargo doc --open
# Build formal specification (requires LaTeX)
make -C specCI runs on every push and pull request, executing:
- Linting: cargo fmt, cargo clippy
- Security audit: cargo-audit, cargo-deny
- Unit tests: All modules on Linux, macOS, Windows
- Integration tests: Cross-chain compilation and deployment
- Contract tests: All example contracts
- Benchmarks: Performance regression detection
- Documentation: Build verification
Problem: Missing C compiler for native dependencies.
Solution:
# Ubuntu/Debian
sudo apt-get install build-essential
# macOS
xcode-select --install
# Windows
# Install Visual Studio with C++ supportProblem: WebAssembly target missing.
Solution:
rustup target add wasm32-unknown-unknownProblem: Invalid JSON in manifest overlay file.
Solution: Validate JSON syntax:
cat manifest.overlay.json | jq .Problem: Overlay references non-existent export.
Solution: Check available exports:
wasm-objdump -x contract.wasm | grep ExportProblem: Contract trying to access beyond storage limits.
Solution: Check storage key size and implement bounds checking.
-
Enable verbose logging:
RUST_LOG=debug wasm-epicchainvm --input contract.wasm --output contract.xef
-
Inspect generated XEF:
epicchain-cli contract inspect contract.xef
-
Validate manifest:
epicchain-cli contract manifest validate contract.manifest.json
-
Test with EpicChainExpress:
epicchain-express --debug --trace
- Memory isolation: Each contract gets isolated memory space
- Gas metering: Automatic gas calculation for all operations
- Stack limits: Protection against stack overflow attacks
- Storage limits: Per-contract storage caps
- Permission system: Fine-grained method access control
- Input validation: Automatic bounds checking for array accesses
- Reentrancy guards: Protection against reentrancy attacks
All components are regularly audited with:
- Static analysis: Clippy, cargo-audit
- Dynamic analysis: Fuzzing, property testing
- Formal verification: Model checking for critical components
- Dependency scanning: cargo-deny for vulnerability detection
Please report security vulnerabilities to security@epicchain.org following our SECURITY.md policy. Do not disclose vulnerabilities publicly until they have been addressed.
We welcome contributions from the community! Please read our Contributing Guidelines to get started.
- Read CONTRIBUTING.md for development setup
- Follow the Code of Conduct
- Check open issues
- Run tests locally:
make test - Format code:
cargo fmt --all - Run linter:
cargo clippy --all-targets - Update documentation if needed
- Submit pull request
-
High Priority
- Broaden Wasm instruction coverage (floating-point, SIMD)
- Complete Move bytecode support
- Enhance deployment tooling
-
Medium Priority
- Surface devpack metadata to manifest generation
- Add ABI linting and validation
- Improve error messages and diagnostics
-
Low Priority
- Tighten end-to-end validation
- Add formal verification proofs
- Optimize translation performance
This project is licensed under the MIT License - see the LICENSE file for details.
- Documentation: epicchain.org/docs
- Discord: discord.gg/epicchain
- GitHub Issues: github.com/epicchainlabs/epicchain-devpack-rust/issues
- WebAssembly specification team
- Rust community for excellent tooling
- Solana and Move ecosystems for cross-chain compatibility inspiration
- All contributors and testers
Built with ❤️ for the EpicChain ecosystem