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

MPC (Chain Signatures) 3.10.0

3.10.0github.com

This release expands foreign chain transaction support to Base, Arbitrum, Polygon, and Hyper EVM, and enables decentralised state sync (DSS) on the node. Note: contains two breaking changes (#3001, #3026) — see the…

MPC 3.10.0

This release expands foreign chain transaction support to Base, Arbitrum, Polygon, and Hyper EVM, and enables decentralised state sync (DSS) on the node. Note: contains two breaking changes (#3001, #3026) — see the changelog. Also note this features a launcher change, which means upgrading TDX deployments from 3.9.1 requires a full node migration.

🚀 Features

  • #2915(@DSharifi): Foreign chain inspector supports base (#2915)

  • #2918(@DSharifi): (sdk) Support base for foreign tx validation (#2918)

  • #2943(@DSharifi): Node performs foreign chain validation for Base (#2943)

  • #2934(@kevindeforth): (contract) Vote generics structs (#2934)

  • #3001(@DSharifi): [breaking] Nodes don't require unanimous conensus on RPC providers (#3001)

  • #3010(@pbeza): (tee-authority) Support multiple PCCS endpoints with fallback (#3010)

  • #3043(@barakeinav1): (launcher) Add restart policy for MPC node container when started by the launcher (#3043)

  • #3059(@DSharifi): Add jemalloc pprof endpoint on the node (#3059)

  • #3026(@barakeinav1): (tee) [breaking] Allow PCCS with self-signed TLS certs via operator config (#3026)

  • #3107(@DSharifi): (foreign-chain-inspector) Support arbitrum validation requests (#3107)

  • #3106(@DSharifi): Accept foreign tx validation requests on contract (#3106)

  • #3110(@DSharifi): Node performs foreign chain signature requests for arbitrum (#3110)

  • #3085(@gilcu3): Add Protocol enum in DomainConfig (#3085)

  • #3086(@DSharifi): (contract) Add API to submit foreign support instead of configuration (#3086)

  • #3049(@barakeinav1): (tee-authority) Reject PCCS collateral older than 7 days (#3049)

  • #3144(@DSharifi): (sdk) Add support for aribtrum in sdk (#3144)

  • #3148(@DSharifi): Contract supports polygon and hyper_evm foreign tx request (#3148)

  • #3149(@DSharifi): (inspector) Support polygon + hyper_evm validation requests (#3149)

  • #3154(@DSharifi): (sdk) Support hyper_evm and polygon (#3154)

  • #3158(@DSharifi): Node supports sign requests for polygon + hyper (#3158)

  • #3161(@gilcu3): Add ReconstructionThreshold to DomainConfig (#3161)

  • #3177(@anodar): (config) Support query-param auth and optional header scheme (#3177)

  • #3188(@barakeinav1): (node) Enable decentralised state sync (DSS) (#3188)

  • #3211(@kevindeforth): Metric for counting failed requests (#3211)

  • #3187(@netrome): Fan-out responses to all duplicate requests (#3187)

  • #3216(@anodar): Implement foreign chain RPC providers in contract (#3216)

  • #3228(@barakeinav1): (node-config) Validate NearInitConfig address fields as SocketAddr (#3228)

🐛 Bug Fixes

  • #3056(@anodar): Retry conclude_node_migration until contract reflects completion, not until tx is applied (#3056)

  • #3108(@kevindeforth): Recent blocks tracker memory leak (#3108)

  • #3091(@netrome): EVM inspector checks that transaction is on the canonical chain (#3091)

  • #3185(@anodar): Don't serve rpc providers information over public debug endpoint (#3185)

  • #3159(@kevindeforth): RecentBlocksTracker removes dead blocks instead of classifying them as OptimisticAndCanonical (#3159)

  • #3227(@netrome): Use randomly generated delimiters in heredocs in LLM workflows (#3227)

  • #3272(@DSharifi): Correctly label succeeded and failed transactions (#3272)

  • #3273(@pbeza): (scripts) Make prepare-release.sh work on BSD/macOS (#3273)

💼 Other

  • #2919(@anodar): Add make targets that run tests on fresh checkout (#2919)

  • #3021(@DSharifi): (nix) Add reproducible build flake for mpc-node (#3021)

  • #3151(@DSharifi): Use x86-64-v3 instruction set (#3151)

  • #3222(@barakeinav1): (launcher) Render TEE compose from contract template at deploy time (#3222)

🚜 Refactor

  • #2931(@gilcu3): Remove node dependency on the contract for the crypto types (#2931)

  • #2929(@DSharifi): Pre-build http clients to avoid duplication (#2929)

  • #2944(@pbeza): Replace Phala collateral endpoint with direct PCCS calls (#2944)

  • #2951(@barakeinav1): Remove Python launcher (#2951)

  • #2954(@gilcu3): Unify NodeId from contract and dto (#2954)

  • #2964(@gilcu3): Unify participant types from the contract/node and interface (#2964)

  • #2976(@gilcu3): Remove node contract dependency for TEE and migration types in the node (#2976)

  • #2984(@DSharifi): Create generic config type for all foreign chains (#2984)

  • #2989(@gilcu3): Rename sign_pk to tls_public_key in ParticipantInfo (#2989)

  • #3048(@pbeza): (tee-authority) Add typed PCCS endpoint errors and fallback logging (#3048)

  • #3034(@kevindeforth): mpc_client.rs and PendingRequests unit tests (#3034)

  • #3017(@anodar): Don't panic in test helpers (#3017)

  • #3050(@gilcu3): Separate keyshare related contract-internal types/logic from node-facing interface types (#3050)

  • #3057(@kevindeforth): Move block height check out of RecentBlocksTracker, into PendingRequests (#3057)

  • #3069(@kevindeforth): Recent blocks tracker relies on internal block height (#3069)

  • #3115(@gilcu3): Remove V2Secp256k1 variant (#3115)

  • #3132(@kevindeforth): RecentBlocksTracker use weak pointers for parent (#3132)

  • #3155(@barakeinav1): (tee) Testnet TEE scripts Python→Rust + unify with localnet (#3155)

  • #3180(@kevindeforth): Remove OlderThanRecentWindow variant from CheckBlockResult (#3180)

  • #3189(@barakeinav1): Extract apply_near_config_patches helper (#3189)

  • #3209(@kevindeforth): Replace classify-blocks with atomic u8 in RecentBlocksTracker (#3209)

  • #3236(@kevindeforth): Improve RecentBlocksTracker invariants (#3236)

📚 Documentation

  • #2912(@DSharifi): Design solution for allowing per node foreign tx rpc provider configurations (#2912)

  • #2960(@barakeinav1): Clarify launcher vote uses manifest digest (#2960)

  • #2947(@mitinarseny): Use relative links in ckd-example-cli (#2947)

  • #3013(@pbeza): Tell agents to verify docs stay aligned with code changes (#3013)

  • #3006(@anodar): Update e2e tests documentation (#3006)

  • #3029(@barakeinav1): Recommend unlimited function-call allowance for the MPC operator account (#3029)

  • #3095(@barakeinav1): Add PCCS configuration guidance to operator deployment guide (#3095)

  • #3097(@barakeinav1): Add PCCS Collateral Handling section to TEE design doc (#3097)

  • #3163(@barakeinav1): Tighten PCCS TLS-mode wording across operator guide + template (#3163)

  • #3152(@barakeinav1): (tdx-guide) Pin apt sources for reproducible key-provider build (#3152)

  • #3259(@gilcu3): Clarify the DKG in README, add link to internal crypto docs (#3259)

  • #3271(@netrome): Fix doc drift in pending_signature_queue_len (#3271)

  • #3234(@barakeinav1): Fix operator deployment guide (#3234)

⚡ Performance

  • #3007(@pbeza): (contract) Enable dcap-qvl json-core feature to slim wasm (#3007)

  • #3023(@pbeza): (contract) Slim attestation crate wasm by 14.38 KiB (#3023)

  • #3035(@DSharifi): Use jemalloc as memory allocator on node (#3035)

🧪 Testing

  • #2922(@anodar): Pass account_id in request, implement ToNearKey trait (#2922)

  • #2844(@DSharifi): Update sandbox integration test to use a builder pattern for setup (#2844)

  • #2946(@anodar): Port test_cleanup_lagging_node from pytest to Rust e2e (#2946)

  • #2953(@anodar): Port foreign chain policy and transaction validation from pytest to Rust e2e (#2953)

  • #2988(@anodar): Port migration endpoint and migration service from pytest to Rust e2e (#2988)

  • #3015(@anodar): Port multi-domain key event and robust ECDSA request-during-resharing from pytest to Rust (#3015)

  • #3041(@barakeinav1): Update allowance to unlimited in all scrips (#3041)

  • #3124(@anodar): Flaky migration service test (#3124)

  • #3147(@gilcu3): Add e2e for contract upgrade compatibility (#3147)

  • #3126(@anodar): Flaky key_resharing test (#3126)

  • #3133(@gilcu3): (perf) Measure testnet signing performance using devnet (#3133)

⚙️ Miscellaneous Tasks

  • #2927(@DSharifi): Bump tooling versions on CI and nix (#2927)

  • #2924(@gilcu3): Leave some amount of contract increase without breaking CI (#2924)

  • #2926(@gilcu3): Use Ed25519PublicKey in the contract interface consistently (#2926)

  • #2940(@gilcu3): Update migrations after 3.9.0 release (#2940)

  • #2958(@gilcu3): Fix dependabot vulnerability, bump rand (#2958)

  • #2968(@dependabot[bot]): Bump tokio-metrics from 0.4.9 to 0.5.0 (#2968)

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

  • #2949(@barakeinav1): (localnet) Use slirp gateway for NEAR_BOOT_NODES so CVMs reach neard on loopback (#2949)

  • #2974(@gilcu3): Make account public key non-optional (#2974)

  • #2993(@DSharifi): Update rustls due to RUSTSEC-2026-0104 (#2993)

  • #2990(@gilcu3): Reduce contract size by disabling anyhow features (#2990)

  • #3003(@dependabot[bot]): Bump openssl from 0.10.76 to 0.10.78 in the cargo group across 1 directory (#3003)

  • #3038(@dependabot[bot]): Bump average from 0.16.0 to 0.17.0 (#3038)

  • #3040(@dependabot[bot]): Bump lru from 0.16.4 to 0.17.0 (#3040)

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

  • #3047(@gilcu3): Remove image hashes, manifest digest is enough to guarantee repro (#3047)

  • #3018(@anodar): Factor out pytests into daily workflow (#3018)

  • #3052(@DSharifi): Add nix build job for mpc-node (#3052)

  • #3064(@kevindeforth): Improve handshake error messages (#3064)

  • #3065(@gilcu3): Remove unused infra folder (#3065)

  • #3058(@DSharifi): Use nix for running CI checks except remaining builds (#3058)

  • #3066(@gilcu3): Update migrations after 3.9.1 (#3066)

  • #3072(@anodar): Concurrency group in nix-build-mpc-node.yml (#3072)

  • #3078(@DSharifi): Deprecate ForeignChainPolicyVotes storage key (#3078)

  • #2972(@barakeinav1): (localnet) Finish Python-launcher removal on localnet path (#2972)

  • #3082(@gilcu3): Add comments and tests for untagged ecdsa payload (#3082)

  • #3084(@gilcu3): Remove 3.9.0 compatibility serde serialization (#3084)

  • #3076(@anodar): Remove pytests, nearcore submodule, and pytests workflow, update docs (#3076)

  • #3093(@netrome): Ignore hickory-proto related advisories + clear out stale advisory + bump wasmtime (#3093)

  • #3102(@gilcu3): Make schemars crate excluded from compiling under wasm32 target (#3102)

  • #3100(@gilcu3): Unify the protocol_state_to_string function (#3100)

  • #3120(@dependabot[bot]): Bump lru from 0.17.0 to 0.18.0 (#3120)

  • #3117(@dependabot[bot]): Bump the rust-minor-and-patch group with 2 updates (#3117)

  • #3122(@gilcu3): Make Claude reviews more thorough, similar to Copilot (#3122)

  • #3112(@pbeza): Ban trailing whitespace via .editorconfig and CI grep step (#3112)

  • #3125(@gilcu3): Bump claude-code action (#3125)

  • #3129(@gilcu3): Workaround for claude-code bug (#3129)

  • #3131(@anodar): Bump up cluster wait timeout (#3131)

  • #3128(@pbeza): Enforce all .editorconfig rules via editorconfig-checker (#3128)

  • #3074(@gilcu3): Upd changelog in main after 3.9.1 (#3074)

  • #3141(@pbeza): (editorconfig) Drop LICENSE exemption, add final newline (#3141)

  • #3146(@gilcu3): Remove mpc-contract dep from devnet (#3146)

  • #3157(@dependabot[bot]): Bump openssl from 0.10.78 to 0.10.79 in the cargo group across 1 directory (#3157)

  • #3175(@kevindeforth): Additional label for signature request timeouts (#3175)

  • #3204(@dependabot[bot]): Bump inferno from 0.11.21 to 0.12.6 (#3204)

  • #3201(@dependabot[bot]): Bump tokio from 1.52.1 to 1.52.2 in the rust-minor-and-patch group (#3201)

  • #3250(@dependabot[bot]): Bump rkyv from 0.8.15 to 0.8.16 in the cargo group across 1 directory (#3250)

  • #3260(@gilcu3): Remove curve from DomainConfig (#3260)

Docker images

  • nearone/mpc-node:3.10.0 Manifest digest: sha256:96d5d607bd997abece343a5375d8f202457b01af1afea5d8ac4ba71d0f7f36d2 Image ID: sha256:51923d93941cde3111aab7e757dcd86ae6be112e828496b4589851a4dfb8b2d3

  • nearone/mpc-node-gcp:3.10.0 Manifest digest: sha256:0ad5d0953c37a1025ebcdf2456f42e2d58c1cc2d73cdccd59c03a11a69a6ba5d Image ID: sha256:0a9f33c88330fffa0ba361ec2c4ad5aa01832edd590c8f0365a170e6e7787bea

  • nearone/mpc-launcher:3.10.0 Manifest digest: sha256:c004f02cb6c75a8203ac772d22fdb3d9bb2e05f2378a0a53a089e78372888c70 Image ID: sha256:6415ef6a16e3e929d3ccbcc1435a85bc5fa400204723ceb3a24f51ccf25f4bf6

MPC contract

  • digest: sha256:0517ffe01a7745dd2ef83491bd42627ea30924f3b62d518470bc300213091bd9