Releases: amadeusprotocol/node
Release list
v1.5.5 - Raditz Update
v1.5.5
Major 📜
- 🏦 Add the LockupVault BIC — vault staking for AMA. Lock 1000+ AMA in og/3m/6m/12m tiers with the APY rate locked at creation
(5% / 10% / 15% +5% early bonus on 12m until epoch 1150). Vaults name a validator (2-epoch change queue), route yield to a
payout address or auto-compound it into the vault (payout address alone decides), and serve a 21-day unlock window before
withdraw. Includes owner transfer (change_owner), lock extension (extend_lock, capped at 100 years), treasury-funded
beneficiary vaults (owner arg), and strict canonical-map args. Callable on testnet now, mainnet from epoch 750. See
lockup_vault.rs, consensus_apply.rs. - 🐉 Activate the Shenron emission curve (v2) at epoch 750. Per-epoch emission becomes 1,430,936,428 / (epoch−20)^1.3 (anchored
+72, ~232.4k AMA at activation), computed exactly in integers, replacing the legacy geometric decay. Single source of truth
for minting, supply accounting, and the emission API. See epoch.rs. - ⚖️ New epoch boundary (next2) at fork 750: emission split, vault APY, participation, network tax. Emission splits 50/50
between vault APY and solvers. Vault yield draws on its half plus a carried pool (paid on amount+accrued, pro-rata if dues
exceed budget); solver emission is curbed by network participation (phash, the integer-exact pflops measure) — below 100 PFLOPS
only phash% pays and the shortfall accrues; from epoch 1150 participation curbs vault APY too. A 25% network tax on everything
paid goes to the treasury, funded from the vault leftover so total issuance never exceeds the curve. Undisbursed emission
carries in bic:epoch:vault_accrued_pool / bic:epoch:solver_accrued_pool. Pre-750 boundaries replay byte-identical on the
untouched legacy path. See epoch.rs. - 🗳️ Validator-set rework at fork 750. Next epoch's set = peddlebike67 + every vault-backed validator with ≥1m AMA staked
(amount+accrued) + the top 33 solvers by sol count, deduped, with the fixed 99 cap removed. Every sol-submitting solver in the
set is paid (no top-99 payout cap); payouts — sol and vault alike — require already being in the set, so first-time solvers
mine one unpaid epoch to earn entry. Queued vault validator changes post exactly once, first thing at the boundary (single
promotion site). See epoch.rs, lockup_vault.rs. - 🪓 Remove the legacy Hubt/bintree entirely (−2.7k lines). With HBSMT live since epoch 710, the old bintree trie, its rdb
backing, and proof code are deleted; the NIF surface migrates bintree_* → hbsmt_* (root/prove/verify, contractstate proofs).
See consensus_apply.rs, hbsmt_rdb.rs, lib.rs.
Minor
- Unlocking vaults keep earning yield and keep backing their validator's stake until withdrawn.
- Testnet: rebuild the MMR from genesis automatically when none exists. See ex.ex.
- New consensus test harness (single-node chain + multi-node cluster) and a ~1.2k-line LockupVault suite, including an
epoch-751 emission-conservation scenario (paid + tax + pools == curve, exactly). See tests/chain_harness.rs,
tests/lockup_vault.rs.
v1.5.4 - 0to100
0to100.mp4
This is the 100th tagged release 🥳
Major 📜
- 🔱 Activate HBSMT as the consensus contractstate tree at epoch 710. At fork height 710_00000 the contractstate trie
migrates from the legacy HubtV2/bintree to HBSMT, whose root is now signed into attestations. The fork block does a
deterministic full rebuild of the HBSMT from contractstate; post-fork updates are incremental and rewind-safe (folded
into the mutation set). See consensus_apply.rs, hbsmt_rdb.rs. - 🌲 Move the receipts / tx / validator roots to HBSMT at the fork. The per-block root_receipts, root_tx, and
root_validator switch from the Hubt trie to HBSMT once past the fork height (gated; pre-fork stays on Hubt). See
consensus_apply.rs, entry.ex. - 🔗 Add root_chain — an MMR commitment over all blocks — to the header. At epoch 710 the MMR accumulator root becomes
a mandatory block-header field that every node re-derives and verifies per block, and that snapshot import re-checks.
Built in lockstep with the chain and rewind-safe via per-entry pre-apply snapshots. See entry.ex, db_mmr.ex,
fabric_snapshot.ex. - 💸 Charge a per-value-byte READ budget (epoch 710). Reads now cost proportional to value size, so re-reading a large
(1MB+) term repeatedly is no longer almost free. See consensus_kv.rs. - ⚙️ Add a native multi-threaded UPOW solver — new upow.rs (~350 lines): the genuine 16×50240×16 matmul with
AVX-512-VNNI / AVX2 / scalar autodetect. A computor can compute UPOW to itself as a node, with a COMPUTOR_UPOW_THREADS override. See upow.rs, computor_gen.ex, node/upow.ex. - 🛡️ WASM VM budget/metering fixes — meter as_abort string reads (charge-before-read, capped), fix the
LOG element off-by-one, cap import call depth at MAX_CALL_DEPTH=16, and charge slash_trainer exec cost
(COST_PER_SLASH). See wasm.rs, protocol.rs. - 🧮 Harden Freivalds UPOW verification — AVX2-accelerated matmul check (hsum256/dot8_i32_to_i64/i64 accumulation),
fix an i32-min-wrap, plus a soundness/attack test battery. See sol_freivalds.rs.
Minor
- Don't crash on UDP send failure — handle all :gen_udp.send errors instead of only :ok/:eperm. See
node_gen_socket_gen.ex. - Harden special-meeting consensus — ignore signatures from non-validators, add a catch-all handler. See
special_meeting_gen.ex. - Per-op peer rate-limiting — canonical accepted-op set with per-6s quotas; throttle/drop unknown ops. See node_ops.ex
(new), node_gen_netguard.ex. - Harden STUN self-IP detection — DNS-resolve the STUN server, validate responses by transaction id, deadline/retry;
only accept parsable IPv4. See stun.ex, cymru_routing.ex. - Don't crash on malformed peer input — graceful handling of invalid entries/ANRs/attestations (throw vs match-crash),
cache pending attestations. See node_state.ex. - Validate BIC names/symbols — shared validate_name (1–32 bytes) for coin/NFT/collection; reject reserved symbols even
with punctuation stripped. See coin.rs, nft.rs, coin_symbol_reserved.rs. - Depth-limited, length-checked vecpak decode (reject malformed payloads).
- Cost-overflow guard (cost_per_byte_overflow) + min historical tx cost. See protocol.rs.
- RocksDB single-subcompaction tuning;
- fix an Elixir Range deprecation warning.
v1.5.3 - Waiting so Long
silverfins_waitingsolong.mp4
Major 📜
- Add MMR (Merkle Mountain Range) block accumulator — append-only commitment over all blocks with compact inclusion proofs + standalone verify, exposed over RPC (proof/block, proof/verify_block). See mmr.ex and api_proof.ex.
- Add state snapshots + chain pruner — snapshot-consistent reads via transaction_with_snapshot, fast-sync state snapshots, and a pruner to bound disk growth. See fabric_snapshot.ex, db_pruner.ex.
- Add submit_and_wait?finalized=true on RPC to block until a tx is finalized (not just committed). See api_tx.ex.
- Harden the WASM contract VM — upgrade to wasmer 7.1.0; fix gas/budget accounting, bulk-mem & seed charging, RNG farming, cache poisoning, and cap call depth at 16.
- 🧪 Land HBSMT (Hot Binary Sparse Merkle Tree) — ~5k-line Merkle tree running alongside legacy HubtV2, with a full soundness/attack test battery. Will be added to consensus in next fork. See hbsmt.rs.
Minor
- Significantly lower RocksDB RAM usage; add memaudit.
- Add finalized | committed | pending tx status to metadata.
- New cursor/start_nonce pagination for tx-by-address queries.
- Peer hardening: malicious-address warning endpoint, drop spammy/unrouted peers, cache IPv4 off STUN, only accept parsable IPv4.
- Fix DoS on the testnet SSL forwarder + validator bitset; rate-limit testnet uPoW endpoints.
- Guard against zstd bombs, negative nonces, and invalid sols (no crash).
- Rewrite DOCS.md (protocol params, WASM contracts, SDKs, networks).
- Snapshot at 63000010.
v1.5.2 - Tree of Might
output.mp4
Major 📜
- Upgrade bintree🌲 to V2 which significantly improves merkle proofs+verification
- Add
submit_and_wait?finalized=trueon RPC to wait for finality - Add Rust and more AssembyScript contract examples
Minor:
- Add Prometheus support for RPC metrics feed (BYOT)
- Reduce storage cost per read 10x
- Reduce storage cost per write 10x (didnt allow large contracts to deploy)
- Fix a DoS bug on the testnet SSL forwarder
- Add
finalized|committed|pendingto tx metadata as status - Add
transfer_nftto API - Snapshot at 48362121
v1.5.1
Fix issues related to the tx_filter.
To recap:
/api/chain/tx_by_filter?arg0=<b58(sol)>
now naturally checks if the sol is included in the chain
Queries on accounts with tons of transactions will work now
to rebuild ALL CHAIN filters you can use
DB.Entry.Hashbuilder.clear_all()
DB.Entry.Hashbuilder.start()
otherwise itl start building new filters from when you launch.
you should still delete all the old filters via
RocksDB.get_cf_size(:tx_filter)
DB.Entry.Hashbuilder.clear_all()
size of optimized filters should be approx 22G for full chain. If your size is over 30G delete the old filters.
v1.5.0
Upgrade whenever possible, otherwise you will fall out of sync when the next slash_trainer gets called
Major:
- Changes TX filters to use hashfilters (current filters defined here)
- Reorgs slash_trainer args so the mpk is arg0
Minor:
- Temporary hashfilter builder genserver
NOTE:
Please consider arg0 as the receiver PK as its part of the hashfilter for future contract programming.
With hashfilters its possible now to search for arg0 == sol, making it quick to check if a sol is included in the chain.
v1.3.9 - Frieza Upgrade
awaken.mp4
AKA The WASM Executor update 🥳
- Adds full WASM execution live only on testnet and behind a NOOP on mainnet (pending further tests)
- Adds full AssembyScript examples for coding smart contracts
- Fixes large performance regression in RPC
/statsapi
Minor:
- Relax NetGuard in the case of catchup
- Fix crash inside ComputorGen
v1.3.8 - Kami Road
Update before epoch 434:
- Adds new ExecutionReceipt
#[derive(Clone, Debug)]
pub struct ExecutionReceipt {
pub txid: Vec<u8>,
pub success: bool,
pub result: Vec<u8>,
pub exec_used: Vec<u8>,
pub logs: Vec<Vec<u8>>,
}- Adds storage deposit of 1.0 AMA which is refunded at TX END
- Ensures some extra correctness of TXPool
- Continuing work on VM cost counting and import calling