All notable changes to this project will be documented in this file.
Exceptions are the API server and WASM bindings, which have their own changelogs.
The format is loosely based on Keep a Changelog.
-
Node:
node-daemonandnode-gui: the "reckless" mode of the chainstate database is now enabled by default during the initial block download or bootstrapping, which significantly increases its speed at the cost of a potential db corruption if the system crashes in the meantime; the node automatically switches back to the normal mode of operation when the download/bootstrapping finishes.
-
Node CLI:
- boolean node options now require an explicit
true/falsevalue (e.g.--enable-db-reckless-mode-in-ibd true) instead of working as value-less flags; the corresponding environment variables (ML_NODE_*for top-level options andML_MAINNET_NODE_*/ML_TESTNET_NODE_*/ML_REGTEST_NODE_*for per-network ones) likewise now require an explicittrue/falsevalue. This makes the absence of an option distinguishable from an explicit opt-out, so a value from the configuration file is no longer silently overridden by the command line or the environment. correspondingML_NODE_*environment variables likewise now require an explicittrue/falsevalue. This makes the absence of an option distinguishable from an explicit opt-out, so a value from the configuration file is no longer silently overridden by the command line or the environment.--enable-db-reckless-mode-in-ibd true) instead of working as value-less flags; this makes the absence of an option distinguishable from an explicit opt-out, so a value from the configuration file is no longer silently overridden by the command line.
- boolean node options now require an explicit
-
Node:
- Per-peer fork download budget in the block sync manager: after initial sync, each peer may download a bounded number of header lists per refill interval (defaults: 2000 downloads, 600 seconds), tip-anchored lists included and initial sync exempt. Requests beyond the budget are deferred without punishment and retried at the next refill, which bounds the cost of adversarial fork announcements.
-
Wallet:
- A read-only MCP server for the wallet RPC daemon (new
mcp-servercrate, stdio transport), allowing MCP clients to inspect wallets. The server validates the MCP protocol envelope and tool arguments, bounds requests with a timeout, and resynchronizes the stream after an oversized message.
- A read-only MCP server for the wallet RPC daemon (new
-
Wallet CLI:
- Commands are reorganized into a nested grammar (for example
wallet create,staking pool create). The previous flat command names keep working, but are hidden from help and tab completion. - Command results carry a machine-readable payload alongside the
human-readable text;
wallet-cli execJSON output reflects the command payload. - Interactive wizards for complex commands, gated on an interactive terminal.
- Destructive commands go through a confirmation gate.
- The choice to store or only display the seed phrase at wallet creation is now an optional flag.
- Block generation asks for confirmation first.
- Commands are reorganized into a nested grammar (for example
- Wallet:
- Password file handling hardened: the file size cap is enforced before reads, the size race between stat and read is closed, and unverifiable password sources fail closed instead of falling back silently.
- Node:
- The orphan pool now enforces a per-peer capacity limit for remote orphans: peers reached through outbound connections get a larger orphan quota, eviction honors per-peer reservations, occupancy is tracked per origin, and the new quota fields are exposed through the mempool config RPC.
- Node:
- Orphan pool hardening: stale orphans are rejected before insertion and expiry takes priority over capacity during admission, the first-recorded origin class stays authoritative, the outbound tier is honored by eviction reservations, quota configuration is validated, and zero-count origin statistics are purged on teardown.
- Wallet:
- Remote orphan quota rejections are classified as transient errors instead of permanent failures.
- Node:
- Advisory-exposed dependencies were patched (rustls-webpki, webpki-root-certs, tokio) and the cargo-vet imports refreshed.
- Node:
- Added PoS seal indexing infrastructure: duplicate-proof evidence storage for block seals, active by default, with a chainstate configuration option to disable it.
- Wallet:
- Fixed an issue where
standalone-add-watch-only-address,standalone-add-private-key-from-hexandstandalone-add-multisig(and the corresponding RPC methods) would reset the wallet to genesis but never perform the announced rescan; the rescan is now done before the command returns. Previously, inwallet-clinon-interactive mode the process would exit before the background rescan could run, leaving the wallet stuck at genesis so that every subsequent wallet open had to rescan the whole blockchain.
- Fixed an issue where
-
Wallet:
- Added support for Ledger hardware wallets (beta).
-
Wallet RPC:
- New value
ledgerin thehardware_walletoption forwallet_create,wallet_recoverandwallet_openmethods.
- New value
-
Wallet CLI:
wallet-create/wallet-recover/wallet-opensupport theledgersubcommand, in addition to the existingsoftwareandtrezor, which specifies the type of the wallet to operate on.
-
Node:
- New options to control the newly introduced mempool cluster limits:
--mempool-max-cluster-transaction-countand--mempool-max-cluster-size-bytes. - New RPC method
mempool_get_config, which returns the current mempool configuration.
- New options to control the newly introduced mempool cluster limits:
-
P2p:
- Various improvements to transaction announcement:
- Local transactions that were already announced but never sent to any peer will now be re-announced after a few minutes.
- Adding an already existing relayable local transaction to the mempool will cause p2p to re-announce it.
- Transactions are now announced in batches at irregular intervals (previously, a random delay was added before each individual transaction announcement).
- Security improvements:
- The number of pending inbound connections is now limited.
- Various improvements to transaction announcement:
-
Mempool:
- Various optimizations were made.
- There are now limits on how big a single mempool transaction cluster can be (a cluster is a set of unconfirmed transactions that depend on each other); the mempool will reject transactions that would result in the formation of a cluster that exceeds the limits. The default cluster limits are: max 64 transactions, max 100'000 bytes in total.
-
Consensus:
-
Tightening of certain consensus rules have been implemented, in particular:
- When changing token metadata URI, the URI can no longer contain arbitrary characters (the restrictions are the same as when a token is created).
- Transferring or burning zero amount of a token is no longer allowed.
The actual consensus tightening will happen after a soft fork. The testnet fork height was set to 787640. The mainnet fork height is yet to be decided.
-
-
Node RPC:
- The method
mempool_transactionsnow returns transactions in the same order in which they were originally inserted into the mempool, rather than sorting them by descendant score.
- The method
-
Mempool:
- Fixed an issue where the mempool wouldn't track non-UTXO dependencies between transactions, which could prevent e.g. several token management transactions from being included in the same block.
-
Wallet:
- Fixed an issue where wallet transactions would remain marked as in-mempool after reopening the wallet when they are actually no longer in the mempool.
- Wallet:
- Fixed wallet handling of V1 order command conflicts, allowing confirmed ConcludeOrder and FreezeOrder transactions to replace conflicting unconfirmed order transactions correctly.
- Fixed an issue where the wallet in cold mode would always use input commitments v0, thus producing signatures that may no longer be valid at the current height.
- Fixed an issue where the wallet in cold mode would still try to access the mempool, which would cause
wallet-clito print lots of error messages like "Method is not available in cold wallet mode".
-
Node RPC: new methods added -
chainstate_tokens_info,chainstate_orders_info_by_currencies. -
Wallet RPC:
- new methods added:
node_get_tokens_info,order_list_own,order_list_all_active,utxo_spend.
- new methods added:
-
Wallet CLI:
- the commands
order-create,order-fill,order-freeze,order-conclude,htlc-create-transactionwere added, mirroring their existing RPC counterparts. - other new commands added:
order-list-own,order-list-all-active,utxo-spend,htlc-generate-secret,htlc-calc-secret-hash.
- the commands
-
Wallet:
- Now the wallet subscribes to events from the Mempool to include not yet confirmed transactions relevant to this wallet.
-
Node:
-
new options added:
node-daemon:--import-bootstrap-file- import a bootstrap file on start (previously bootstrapping was only available via node RPC).
node-daemonandnode-gui:--enable-db-reckless-mode-in-ibd- this enables the "reckless" mode of the chainstate database during initial block download or bootstrapping, which significantly increases its speed at the cost of a potential db corruption if the system crashes in the meantime.
-
-
Wallet RPC:
wallet_info: the structure of the returned fieldextra_infowas changed.create_order,conclude_order,fill_order,freeze_orderwere renamed toorder_create,order_conclude,order_fill,order_freeze.
-
The format of
PartiallySignedTransactionwas changed again. -
Node RPC:
-
The result of
chainstate_order_infonow also indicates whether the order is frozen. -
chainstate_pool_decommission_destinationnow returns a bech32 string instead of a hexified destination (note that in the generated documentation its result was already incorrectly designated as "bech32 string"; now the description is correct). -
Documentation-only changes:
- Certain parameters that were designated as "string" are now designated as "bech32 string".
-
-
Node:
- The now redundant option
min_max_bootstrap_import_buffer_sizeswas removed from chainstate config. - The option
--clean-datais now a top-level option, i.e. instead of writingnode-daemon testnet --clean-datayou have to writenode-daemon --clean-data testnet.
- The now redundant option
-
Node bootstrapping:
- The format of the bootstrap file was changed and the legacy format is no longer supported.
-
P2p:
- The logic of initiating new outbound connections has been improved to prevent the node from constantly attempting to re-establish a connection with a peer that has banned it.
-
P2p:
-
When a peer sends a message that can't be decoded, it will now be discouraged (which is what is normally done for misbehaving peers) and the node won't try connecting to it again.
Also, the peer will be sent an appropriateWillDisconnectmessage prior to disconnection. -
Fixed a potential indefinite stalling of a particular connection when both nodes start sending large amounts of data to each other.
-
Fixed a potential indefinite exchange of the same header list requests and responses if the node and the peer are on different branches of a deep fork (such as the one happened due to the recent hard fork).
-
-
Wallet CLI and RPC: the commands
account-utxosandstandalone-multisig-utxosand their RPC counterparts now return correct decimal amounts for tokens with non-default number of decimals. -
Node RPC:
-
chainstate_order_infowill no longer fail if one of the order's balances became zero. -
Documentation-only changes:
-
Certain parameters and/or returned values that were previously (incorrectly) designated as "hex string" are now designated as "hexified xxx id".
-
Parameters and/or returned values having the "plain"
Destinationtype were incorrectly designated as "bech32 string", while in reality they are "hexified destination".
-
-
-
Node bootstrapping:
-
Fixed a bug where importing a bootstrap file would truncate the file to zero length instead of actually importing it.
-
Importing a bootstrap file will no longer fail if some of the blocks already exist in the chainstate.
-
Bootstrapping can now be interrupted via Ctrl-C.
-
The speed of the import was improved.
-
-
General
- Fixed a bug that could lead to indefinite stalling of the node during initial sync when there are many peers and the host machine is slow.
- Fixed a Windows-specific crash in
node-daemonandnode-guithat occurred when the chainstate DB reached 2 GB.
-
A Mainnet fork is scheduled at height 517700 with the same consensus changes that previously happened on Testnet, namely:
- Orders V1.
- Change in the token id generation.
- Transaction input commitments V1.
- Prohibit updating staker's destination in
ProduceBlockFromStakeoutputs.
See the changelog for v1.1.0 below for extra details.
-
Wallet:
-
Added a new
wallet-clicommand to undiscourage a previously discouraged peer -node-undiscourage-peer-address. -
Added a new
wallet-clicommand to return the account's extended public key -account-extended-public-key-as-hex. -
Added new
wallet-clicommandconfig-broadcast. Whenconfig-broadcast nois called, it prevents all commands that create transactions from automatically broadcasting them to the network. -
wallet-cligained a new option--no-qr, which disables QR code output for wallet commands. -
Added support for Trezor hardware wallets (beta).
Because of this,
wallet-cliandwallet-rpc-daemongained an additional parameter,--hardware-wallet, which must be used together with--wallet-fileto indicate that the wallet file being opened corresponds to a hardware wallet.
-
-
Wallet RPC:
- New methods:
account_extended_public_key,node_undiscourage_peer_address(similar to the corresponding commands inwallet-cli) andtoken_make_tx_to_send_with_intent.
- New methods:
-
Node RPC: new methods -
chainstate_pool_decommission_destination,p2p_undiscourage. -
node-guiandnode-daemonnow can store info-level logs to the data directory, regardless of what is printed to the console. This is controlled by the--log-to-fileoption, which is enabled by default fornode-gui.
-
A Testnet fork is scheduled at height 566060 with the following consensus changes:
-
Orders V1. The previous (V0) order inputs will no longer be supported, and the new (V1) ones will have to be used instead.
The main difference is that the new order commands don't use nonces. Also, an additional order-related input will be available -FreezeOrder. -
Change in the token id generation.
Previously, when a new token was being issued, its token id would be generated from the first input of the issuing transaction (which can be UTXO-based or account-based).
Now the token id will always be generated from the first UTXO input of the issuing transaction. -
Transaction input commitments V1.
Transaction signatures will now commit to additional information about the transaction (i.e. the information will become a part of what is being signed), namely:
- In transactions that decommission a pool the signatures will commit to the current staker balance.
- In transactions that fill or conclude an order the signatures will commit to the order balances.
-
Updating staker's destination in
ProduceBlockFromStakeoutputs will no longer be possible.
-
-
ChainstateStorageVersionwas increased, full node resync is required. -
Wallet CLI commands:
-
wallet-createwas split into 2 commands -wallet-createandwallet-recover. They both create a new wallet file and the difference is thatwallet-recoverrescans the blockchain upon creation andwallet-createdoesn't. -
wallet-create/wallet-recover/wallet-opennow have a mandatory subcommand, which can be eithersoftwareortrezor, which specifies the type of the wallet to operate on. -
staking-create-poolnow accepts two optional additional parameters - the staker address and the VRF public key. This allows to create a pool from a wallet other than the one that will be used for staking. -
transaction-list-by-addressandtransaction-list-pendingnow print their output in paginated mode. -
address-shownow has the option--include-change, which makes it include the change addresses in the output. The command will now also print the coin balances of shown addresses. -
address-sweep-spendablenow has the option--all, which makes it sweep all addresses of the selected account.
-
-
Wallet RPC:
-
Most of the methods that create transactions, such as
address_send, now accept an additional field in theiroptionsparameter -broadcast_to_mempool, which specifies whether the transaction should be sent to the mempool upon creation. The default istrue(which is the old behavior). -
Methods that create transactions now also return extra information in addition to the transaction id - the transaction itself (in the hex-encoded form), the info about fees paid by the transaction, whether it was broadcast to mempool or not.
-
address_sweep_spendablegained an additional boolean parameter -all, which may be used to force it to sweep all addresses from the given account. -
staking_create_poolgained additional optional parameters -staker_addressandvrf_public_key, same as the correspondingwallet-clicommand. -
wallet_createwas split intowallet_createandwallet_recover, same as the correspondingwallet-clicommand. -
wallet_create,wallet_recoverandwallet_opengained an additional optional parameter -hardware_wallet. This specifies the type of the hardware wallet to use (currently only trezor wallets are supported); if not set, the wallet is meant to be a software wallet.The results of
wallet_create,wallet_recoverandwallet_opennow may contain additional data, to indicate a situation when creating/recovering/opening a hardware wallet could not be completed due to multiple potentially suitable devices being available.Also,
wallet_createandwallet_recover's result will no longer include the passphrase. -
wallet_inforeturns an additional fieldextra_info, which specifies whether it's a software or hardware wallet; in the latter case the field will also contain additional information, such as the device name. -
address_showgained an additional parameter -include_change_addresses, similar to the corresponding command inwallet-cli.Also, the result of the call now contains additional info - the purpose of each address ("Receive" or "Change") and its coins balance.
-
-
The format of `PartiallySignedTransaction was changed.
Note that
PartiallySignedTransactionis returned or accepted in the hex-encoded form by certainwallet-clicommands and their wallet RPC counterparts, such astransaction-composeoraccount-sign-raw-transaction.
-
Fixed issues in the wallet related to a transaction with an outdated nonce not being marked as conflicted.
-
node-guino longer ignores the network type (i.e. "mainnet" ot "testnet") passed via the command line. -
Fixed an issue where
node-guiwould appear stuck when opening a wallet that wasn't synced in a long time. -
Fixed an issue in the wallet where a text summary for a token-issuing transaction would show its "freezable" status incorrectly.
-
Fixed issues with transaction fee calculation in the wallet.
-
Fixes related to standalone private keys in the wallet:
- Fixed encryption of standalone private keys when a new password is set or the existing one is changed.
- Fixed watching/scanning for relevant public key destinations belonging to standalone private keys (only public key hash destinations used to work before).
- Fixed wallet balance to show spendable UTXOs belonging to standalone private keys.
-
Various minor visual fixes in
node-gui. -
wallet-clihelp output was prettified.
No changes except for the API server, see the corresponding CHANGELOG.md.
- Fix erroneous peer discouragement after mempool reorg.
First major release.