Skip to content
by Unity Nodes
MPC (Chain Signatures)Stable

MPC (Chain Signatures) 3.12.0

3.12.0github.com

This release was dispatched from main after commit 4b114d4 had merged on top of the release commit 74ba360, so the originally published images and the contract artifact were built from the wrong commit.

Corrected 2026-06-16 (see #3576)

This release was dispatched from main after commit 4b114d4 had merged on top of the release commit 74ba360, so the originally published images and the contract artifact were built from the wrong commit.

What was corrected:

  • DockerHub :3.12.0 image tags — retagged to the 74ba360 builds.
  • Image & contract digests below — updated to the 74ba360 artifacts.
  • mpc-launcher — unaffected (identical digest).

** The attached mpc-contract-v3.12.0.tar.gz could NOT be replaced** (this is an immutable release) and still contains the wrong-commit contract — do not use it:

Contract digest
Attached .tar.gz (wrong) sha256:f85dc0389dcf06aba18cc7054add72f3784033a7534f800cc0e72f6cdeb6a46c
✅ Correct (74ba360) sha256:4f72fa9d73497fd1789c4d70860ebfbb6d6251ab77cc0ff8a59fd779a3a3c152

Use the correct digest (also listed under MPC contract below); rebuild it reproducibly from tag 3.12.0.


This release adds Aptos foreign-chain transaction support (#3507, #3508), carries per-domain thresholds over resharings (#3326), and introduces a foreign-chain whitelist verifier (#3327).

🚀 Features

  • #3327(@anodar): Add foreign-chain whitelist verifier (#3327)

  • #3389(@pbeza): (foreign-chain-inspector) Canonical-chain check for Starknet (#3389)

  • #3225(@DSharifi): Fan out requests to all configured RPC providers (#3225)

  • #3390(@pbeza): (foreign-chain-inspector) Canonical-chain check for Bitcoin (#3390)

  • #3244(@DSharifi): TON support for foreign tx validation requests in mpc contract (#3244)

  • #3235(@pbeza): (tee-verifier-interface) Borsh DTOs for the verifier contract boundary (#3235)

  • #3507(@frolvanya): Aptos support for foreign tx validation requests in mpc contract (#3507)

  • #3237(@pbeza): (tee-verifier) Stateless dcap_qvl::verify wrapper contract (#3237)

  • #3525(@anodar): Add debug info about the number of configured foreign chain RPC providers (#3525)

  • #3504(@gilcu3): Add a separate runtime for asset generation (#3504)

  • #3508(@frolvanya): Aptos foreign-chain inspector and node wiring (#3508)

  • #3326(@SimonRastikian): Adding resharing per-domain (#3326)

  • #3435(@pbeza): (indexer) Add /debug/recent_transactions page (#3435)

🐛 Bug Fixes

  • #3397(@gilcu3): Bump prometheus, fix missing nearcore metrics (#3397)

  • #3414(@barakeinav1): (attestation) Reject non-empty app-compose init_script (#3414)

  • #3439(@netrome): Enforce signer=predecessor across all governance methods (#3439)

  • #3420(@barakeinav1): (attestation) Fail closed on unknown app-compose fields; reject tproxy_enabled (#3420)

  • #3469(@gilcu3): (ci) Avoid cancelling concurrent docker push jobs (#3469)

  • #3410(@barakeinav1): (node) Handle SIGTERM for graceful shutdown on operator stop (#3410)

  • #3515(@gilcu3): Add asset id checks for follower paths (#3515)

  • #3519(@gilcu3): Outgoing connection hanging on unstable network (#3519)

  • #3486(@barakeinav1): (node) Drain embedded near-indexer thread on graceful shutdown (#3486)

  • #3491(@DSharifi): (contract) Add auth check to remove_non_participant_update_votes (#3491)

  • #3532(@gilcu3): Make sure localnet launcher script kills processes successfully (#3532)

  • #3533(@barakeinav1): (tdx) Default state sync to Peers (DSS); require tier3_public_addr (#3533)

  • #3560(@gilcu3): (test) Remove time bomb from e2e tests (#3560)

💼 Other

  • #3441(@gilcu3): Make mpc-node repro binary independent of local tags (#3441)

  • #3479(@gilcu3): (ci) Update tools using in CI (#3479)

  • #3490(@gilcu3): Bring back support for NEP-330 contract repro builds (#3490)

🚜 Refactor

  • #3359(@SimonRastikian): Presign args private share (#3359)

  • #3455(@kevindeforth): Drop Result from RecentBlocksTracker::add_block (#3455)

  • #3343(@SimonRastikian): Cleanup frost interface (#3343)

  • #3330(@kevindeforth): Share blocks tracker instance between queues (#3330)

  • #3481(@kevindeforth): Wrap BlockStatus in handle (#3481)

  • #3497(@kevindeforth): RecentBlocksTracker uses types from chain gateway crate (#3497)

  • #3498(@kevindeforth): Move recent blocks tracker to chain-gateway crate (#3498)

  • #3344(@SimonRastikian): Cleaning up the test_utils.rs in threshold signatures crate (#3344)

📚 Documentation

  • #3339(@SimonRastikian): Documenting eddsa with presign (#3339)

  • #3423(@gilcu3): Add SAFETY notice in bls scalar zeroize block (#3423)

  • #3431(@anodar): Update documentation to allow all methods for added keys (#3431)

  • #3376(@pbeza): (design) Clarify verifier-rotation eviction in attestation-verifier-contract.md (#3376)

  • #3443(@barakeinav1): Build dstack-mr from a pinned DSTACK_REV (not master) (#3443)

  • #3468(@netrome): One-pager for node operators (#3468)

  • #3436(@anodar): Propose different way of calculating supported foreign chain set (#3436)

  • #3408(@barakeinav1): Use dstack v0.5.11 build-args for reproducible key-provider mr_enclave (#3408)

  • #3458(@barakeinav1): Require every CVM port (incl. migration :8079) bound to a dedicated IP (#3458)

  • #3488(@barakeinav1): Design doc for auto-removal of unused launcher image hashes (#3488)

  • #3558(@SimonRastikian): Adding unsaid bits in the contract interface (#3558)

🧪 Testing

  • #3384(@gilcu3): Add unit test for incoming connections task drop bug (#3384)

  • #3399(@SimonRastikian): Flaky test for DamgardEtAl (#3399)

  • #3478(@gilcu3): Verify participants below threshold are not kicked out when attestation fails (#3478)

  • #3374(@gilcu3): Showcase contention during asset generation, analyse problem and solutions (#3374)

⚙️ Miscellaneous Tasks

  • #3391(@gilcu3): Remove unneeded file (#3391)

  • #3394(@gilcu3): Bump cargo-near/cargo-near-build to 0.20.3, remove workaround (#3394)

  • #3402(@dependabot[bot]): Bump tar from 0.4.45 to 0.4.46 in the cargo group across 1 directory (#3402)

  • #3416(@netrome): Upgrade Hyper to 1.10.1 (#3416)

  • #3418(@gilcu3): Prevent dependabot updating nearcore pinned versions (#3418)

  • #3419(@gilcu3): Eliminate the need for python in the codebase (#3419)

  • #3424(@dependabot[bot]): Bump the rust-minor-and-patch group across 1 directory with 3 updates (#3424)

  • #3427(@gilcu3): Use upstream version of cache-nix-action (#3427)

  • #3134(@anodar): Deduplicate code with wait_for_debug_migration, elaborate comment on resitual race window (#3134)

  • #3325(@kevindeforth): Remove new final blocks from add block result and use snapshots for test (#3325)

  • #3446(@dependabot[bot]): Bump http from 1.4.0 to 1.4.1 in the rust-minor-and-patch group (#3446)

  • #3447(@dependabot[bot]): Bump near-kit from 0.7.2 to 0.9.1 (#3447)

  • #3459(@gilcu3): Delete triple migration steps from 3.11, clean legacy triples column (#3459)

  • #3465(@gilcu3): Bump nearcore to 2.12.0 (#3465)

  • #3449(@barakeinav1): (deployment) Clarify TDX HW requirements are per-CVM, bump disk to 1TB (#3449)

  • #3470(@gilcu3): Remove EpochData legacy cleanup behavior (#3470)

  • #3483(@SimonRastikian): Deployment of the contract to 3.11.2 (#3483)

  • #3506(@barakeinav1): (tdx) Default to DSS-first state sync in operator setup (#3506)

  • #3530(@gilcu3): Align devnet with the workspace deps (#3530)

  • #3544(@dependabot[bot]): Bump thread-priority from 1.2.0 to 3.0.0 (#3544)

  • #3542(@dependabot[bot]): Bump the rust-minor-and-patch group across 1 directory with 4 updates (#3542)

  • #3528(@anodar): Bump protocol version in genesis for localnet deployment (#3528)

  • #3168(@barakeinav1): (tee) Address PR #3155 follow-up nits (#3168)

  • #3565(@pbeza): Release v3.12.0 (#3565)

Docker images

MPC contract

  • digest: sha256:4f72fa9d73497fd1789c4d70860ebfbb6d6251ab77cc0ff8a59fd779a3a3c152