Enclave is now The Interfold.
Reference
Contracts & Addresses

Contracts & Addresses

This page lists the deployed Interfold contracts on Ethereum mainnet and Sepolia, with the address and deploy block of each one. It is for operators who configure a ciphernode and for developers who call the contracts. It also describes the role of each contract and the enums and events that clients read. Copy addresses from this page or from the manifest, not from other sources.

Deployment manifest

The source of every address on this page is deployments/manifest.json in the repository. The release process attaches the same file to each GitHub release as manifest.json. The script packages/interfold-contracts/scripts/genManifest.ts generates it from packages/interfold-contracts/deployed_contracts.json.

The manifest has two sections for each network:

SectionContent
contractsContracts that a node configuration uses. The keys are the same as the keys under contracts in interfold.config.yaml.
referenceOther deployed contracts that operators, the dashboard, and the docs need. The node configuration has no keys for these contracts.

Each network entry also has a chain_id and a mocks flag. The flag is true when the network uses a mock E3 program or a mock verifier, which accepts proofs without verification. The manifest in the repository sets mocks: true for Sepolia, because the Sepolia deployment records MockE3Program. It sets mocks: false for mainnet. See Verifiers in use on mainnet and Verifiers in use on Sepolia.

To compare your node configuration with the published manifest, run this command:

interfold config check

For an up-to-date Sepolia chain, the output has this form:

Deployment manifest: release <tag>
sepolia: up to date

The command reads the manifest.json asset of the latest GitHub release. It exits with an error when an address or a chain ID does not match. For the flags and the finding labels, see interfold config check.

⚠️

Contract addresses change when the protocol is deployed again. A node that points at an old address syncs nothing and reports no error. Run interfold config check before you start a node and after each release.

Mainnet

Mainnet Ethereum mainnet, chain ID 1.

Mainnet contracts

ContractAddressDeploy blockManifest keyExplorer
Interfold0x28cF63B459e6218C69EA97ea7D90541cf648c71525786382interfoldEtherscan (opens in a new tab)
CiphernodeRegistry0xC927A5B2d8F68697bC28C0670df05178c93df2d725786378ciphernode_registryEtherscan (opens in a new tab)
BondingRegistry0x0ec90465095C21830BEcED07e032809A2Bd2915F25473398bonding_registryEtherscan (opens in a new tab)
SlashingManager0x753109Ee36Dc65cC178875AddA30C6433e5bEEe425998899slashing_managerEtherscan (opens in a new tab)
USDS (fee token)0xdC035D45d973E3EC169d2276DDab16f1e407384F20663730fee_tokenEtherscan (opens in a new tab)

Mainnet reference contracts

ContractAddressDeploy blockManifest keyExplorer
InterfoldTicketToken (tFOLD)0xC0B5b49a3949eC4B520eF21BaCFE16e3695F3B5D25786372InterfoldTicketTokenEtherscan (opens in a new tab)
E3RefundManager0x1940eF168f4E0B3dA24BEca539856684793B0F6e25786384E3RefundManagerEtherscan (opens in a new tab)
BfvDecryptionVerifierRouter0xbbFF7101A3Be43e06b64B00e2e656529E6aDf2eE26156286BfvDecryptionVerifierRouterEtherscan (opens in a new tab)
BfvPkVerifierRouter0x3E9614e711ee301DAC3FeF7D86031ED015bc406b26156286BfvPkVerifierRouterEtherscan (opens in a new tab)
OpenVmBfvCiphertextVerifier0x6cD258E0a893612Aea41c42dC47450ac1A6E2dD126156226OpenVmBfvCiphertextVerifierEtherscan (opens in a new tab)
OpenVmReceiptVerifier0x0dd5E45414629F0f7D757cbb0310A9cfdc5B400b26156225OpenVmReceiptVerifierEtherscan (opens in a new tab)

For the two routers, the manifest records block 26,156,286 as the deploy block. That is the first block of the v0.19 deployment. The router contracts have code from block 26,156,611 (BfvPkVerifierRouter) and block 26,156,612 (BfvDecryptionVerifierRouter).

Also used on mainnet

The manifest does not publish these two mainnet contracts, so interfold config check does not compare them. The addresses come from the mainnet deployment records in packages/interfold-contracts/deploy/protocol/. Each deploy block is the first block that has contract code at the address.

ContractAddressDeploy blockSourceExplorer
InterfoldToken (FOLD)0xE172e9B6cfBeeB5593bDcE3f077356FDb33af90425473449fold in mainnet-protocol.config.jsonEtherscan (opens in a new tab)
sUSDS (ticket collateral)0xa3931d71877C0E7a3148CB7Eb4463524FEc27fbD20677434ticketUnderlyingToken in mainnet-protocol.config.jsonEtherscan (opens in a new tab)

sUSDS is a third-party token. The Interfold does not deploy it. To confirm the token addresses on-chain, call getCiphernodeBondToken() on the BondingRegistry for FOLD. For the ticket collateral, call underlying() on the InterfoldTicketToken.

Verifiers in use on mainnet

Since the v0.19 cutover at block 26,176,770 (12 October 2026), mainnet uses OpenVM for compute proofs. See Verify the Compute Provider.

The Interfold contract stores one verifier of each kind for each encryption scheme. The table shows the values for the BFV scheme (keccak256("fhe.rs:BFV")) at block 26,221,910 (18 October 2026). Each E3 keeps the verifiers that were set when it was requested.

VerifierContractAddressSet at blockRead with
CiphertextOpenVmBfvCiphertextVerifier0x6cD258E0a893612Aea41c42dC47450ac1A6E2dD126176770getCiphertextVerifier(schemeId)
DecryptionBfvDecryptionVerifierRouter0xbbFF7101A3Be43e06b64B00e2e656529E6aDf2eE26176770getDecryptionVerifier(schemeId)
Public keyBfvPkVerifierRouter0x3E9614e711ee301DAC3FeF7D86031ED015bc406b26176770getPkVerifier(schemeId)
  • The ciphertext verifier checks an OpenVM proof for the guest image ID 0x126eb3ea8c2d24cbf8e89f7e41dd2f0be5050be7a28276f0bcd4cb0546acdf52. Read it with imageId(). The ciphertext verifier uses the OpenVmReceiptVerifier from the reference table to verify the proof.
  • Each router has three routes (routeCount(), routeAt(index)). All routes point to BfvDecryptionVerifier or BfvPkVerifier contracts.
  • mainnet-protocol.deployment.json records these verifiers. Its bfvVerifierRoutes field lists the three routes, with the BfvDecryptionVerifier and the BfvPkVerifier of each route.

The first mainnet deployment set DeployableMockCiphertextVerifier as the ciphertext verifier at block 25,788,974 (19 August 2026). That contract accepts every proof. The contract owner replaced it with a Risc0BfvCiphertextVerifier at block 25,813,839 (22 August 2026), and again at block 26,004,622 (18 September 2026). The first mainnet E3 was requested at block 26,012,772, so no mainnet E3 used the mock verifier. At block 26,004,622, the contract owner also unregistered the first E3 program, MockE3Program, and registered CRISPProgram.

At block 26,176,770 (12 October 2026), the contract owner ran the v0.19 cutover. It replaced the ciphertext verifier with an OpenVmBfvCiphertextVerifier and installed two new verifier routers. It also unregistered the earlier CRISPProgram and registered a new CRISPProgram.

The manifest.json asset of release v0.18.0 still marks mainnet with mocks: true. With that asset, interfold config check prints the mock-deployment note for mainnet, although the verifiers in use are not mocks. The manifest.json asset of release v0.19.0 lists the verifiers from before the cutover. The manifest in the repository lists the current verifiers.

Sepolia

Testnet Ethereum Sepolia, chain ID 11155111. The public key, decryption, and DKG verifiers are real. The ciphertext verifier and CRISP use MockOpenVmReceiptVerifier, which accepts every OpenVM receipt, so Sepolia does not verify compute proofs. CRISP uses MockCrispDataAvailabilityVerifier because Avail Turing is down. MockUSDC is the fee token. Anyone can mint it.

⚠️

E3 requests on Sepolia are paused. requestsPaused() on the Interfold contract returns true, and request reverts with RequestsPaused. The owner of the Interfold contract unpauses requests after operators that run the 0.19.0-test.3 release (protocol_version 8, node_generation 2) register.

Sepolia contracts

ContractAddressDeploy blockManifest keyExplorer
Interfold0xb35EE9ed8BE5967daabBA8c2e817C52D0b57ac2612050035interfoldEtherscan (opens in a new tab)
CiphernodeRegistry0x895392D5782E78768A35B1aDfc5b0BD1faB259e412050030ciphernode_registryEtherscan (opens in a new tab)
BondingRegistry0x8f42eD45556bC8fF8949c37c7644Af9Cf321108F12050022bonding_registryEtherscan (opens in a new tab)
SlashingManager0xa82F589B29BD5c2392b7127Cba8727Af2bbEd84D12050027slashing_managerEtherscan (opens in a new tab)
MockUSDC (fee token)0xE2e534F7Cb95777eD870CDCaCb80B1E9E2aD555B11856062fee_tokenEtherscan (opens in a new tab)
Faucet0x1B4340A65BB669267BF5DE37385B139987C3F09c11873271faucetEtherscan (opens in a new tab)

Sepolia reference contracts

ContractAddressDeploy blockManifest keyExplorer
InterfoldToken (FOLD)0x3192Ee1FeE48159807058aA78038cf80cB3450Cb11873112InterfoldTokenEtherscan (opens in a new tab)
InterfoldTicketToken (tFOLD)0xE7cCF95F36131340bdAB122C4cc09787D28217e512050025InterfoldTicketTokenEtherscan (opens in a new tab)
E3RefundManager0x272f3A25E30990A7C30b7B90a240e7afe436534912050041E3RefundManagerEtherscan (opens in a new tab)
NodeReleaseRegistry0xd6d7D4839985BFEB5d6440A1ECe594e288C128e612050048NodeReleaseRegistryEtherscan (opens in a new tab)
MockE3Program0xc4C83c3C94e9360C136f3cd022925b4979BD580b12050024MockE3ProgramEtherscan (opens in a new tab)
BfvDecryptionVerifierRouter0x2e66AE65d8eF5399b231113aFE4E06a175F0A20E12050099BfvDecryptionVerifierRouterEtherscan (opens in a new tab)
BfvPkVerifierRouter0xA5a95C7aBdFdC814f4E724743CFD20Cc50ba7E5B12050098BfvPkVerifierRouterEtherscan (opens in a new tab)
OpenVmBfvCiphertextVerifier0x86A4C3CF4026599ed521738cd534f1C0354f77fA12050706OpenVmBfvCiphertextVerifierEtherscan (opens in a new tab)

Also used on Sepolia

The manifest does not publish these Sepolia contracts, so interfold config check does not compare them. The addresses and deploy blocks come from two deployment records. The Interfold record is packages/interfold-contracts/deployed_contracts.json. The CRISP record is packages/crisp-contracts/deployed_contracts.json (opens in a new tab) in the CRISP repository.

ContractAddressDeploy blockRecordExplorer
BondedVotes0xfbd932BD297e9C7261A384925E78371C7B1FEc7a12050190InterfoldEtherscan (opens in a new tab)
BondedCheckpoints0xd3a7998D9DF56ce2218a26fdc36F3b27870b1b5F12050049InterfoldEtherscan (opens in a new tab)
ChainlinkVrfRandomnessProvider0xb34a7998d3960D1E0A91B0cDCFB98D57d66DfEa812050031InterfoldEtherscan (opens in a new tab)
MockOpenVmReceiptVerifier0x226436d8A72357c7992896B37f0A2E00dCb6A34112050705CRISPEtherscan (opens in a new tab)
MockCrispDataAvailabilityVerifier0xB5cDE772357C9dB2d2515Cf94Daa0696c9a2FB1712050713CRISPEtherscan (opens in a new tab)
HonkVerifier0x0F5f300581273c7986095b76F1d718fe87031fF112050709CRISPEtherscan (opens in a new tab)
OnchainHonkVerifier0x584f6b4F0EA4a1b0a94B7224CDFaDb3fB5eea7d012050712CRISPEtherscan (opens in a new tab)
CRISPProgram0x25Df8D3C04D67efb6198E215963d19a8d119ADFF12050714CRISPEtherscan (opens in a new tab)
MockVotingToken0xE7d5a0A91A616A78DAF5753DBe2eA63EdBB9f4F312050718CRISPEtherscan (opens in a new tab)
SelfRegistry (CRISP)0x06FB4dee06483988cf0292691Ef46A1e70F3057f12050719CRISPEtherscan (opens in a new tab)

CRISPProgram and the Honk verifiers on Sepolia come from the CRISP deployment for the circuits of @crisp-e3/sdk 0.28.0 and 0.28.1. Use 0.28.1: with 0.28.0, proof generation fails in Chromium-based browsers. availabilityFinalizationWindow is 0.

The fee token is MockUSDC, a test USDC with 6 decimals. Anyone can call its mint function. It is also the ticket collateral. To confirm it on-chain, call feeToken() on the Interfold contract. For the ticket collateral, call underlying() on the InterfoldTicketToken.

To get Sepolia USDC and FOLD, run interfold faucet --chain sepolia. You can also call faucet() on the Faucet contract, or call mint on MockUSDC. The Faucet sends 1000 FOLD and 1000 USDC to a wallet that holds less than 1000 of that token. The operator bond on Sepolia is 100 FOLD. FOLD transfers are restricted before the token generation event, and the Interfold team mints FOLD to operators.

Verifiers in use on Sepolia

Sepolia verifies the public key, decryption, and DKG proofs with real verifiers. The Interfold contract stores one verifier of each kind for each encryption scheme. The table shows the values for the BFV scheme (keccak256("fhe.rs:BFV")).

VerifierContractAddressRead with
CiphertextOpenVmBfvCiphertextVerifier0x86A4C3CF4026599ed521738cd534f1C0354f77fAgetCiphertextVerifier(schemeId)
DecryptionBfvDecryptionVerifierRouter0x2e66AE65d8eF5399b231113aFE4E06a175F0A20EgetDecryptionVerifier(schemeId)
Public keyBfvPkVerifierRouter0xA5a95C7aBdFdC814f4E724743CFD20Cc50ba7E5BgetPkVerifier(schemeId)
  • The ciphertext verifier wraps MockOpenVmReceiptVerifier, which accepts every receipt. Read the receipt verifier with openVmVerifier() and the receipt identity with imageId(). The CRISP deployment set this verifier for BFV.
  • Each router has six routes (routeCount(), routeAt(index)). The routes cover the insecure-64 preset (parameter set 0) and the secure-8192 preset (parameter set 2), each with the three committee sizes. Every route points to a BfvDecryptionVerifier or a BfvPkVerifier contract.
  • sepolia-protocol.deployment.json records these verifiers. Its bfvVerifierRoutes field lists the six routes, with the BfvDecryptionVerifier and the BfvPkVerifier of each route.

Contract roles

The Interfold contract coordinates each E3. The two registries hold the ciphernodes and their collateral. The slashing and refund contracts handle faults and failures.

ContractSourceRole
Interfoldcontracts/Interfold.solAccepts E3 requests and holds the service fee in escrow. Records the stage of each E3. Accepts the ciphertext output reference and the verified plaintext output. Marks an E3 as failed after a missed deadline. Credits the rewards of the committee.
CiphernodeRegistrycontracts/registry/CiphernodeRegistryOwnable.solKeeps the registered ciphernodes in an incremental Merkle tree. Collects sortition tickets, finalizes each committee, and publishes the committee public key. Expels slashed committee members.
BondingRegistrycontracts/registry/BondingRegistry.solHolds the FOLD bond and the ticket balance of each operator. Records the bond owner, registration, and activation. Runs the exit queue for withdrawn collateral.
SlashingManagercontracts/slashing/SlashingManager.solAccepts slash proposals, executes slashes and bans, and handles appeals. Routes slashed funds.
E3RefundManagercontracts/E3RefundManager.solCalculates the refund of a failed E3. The requester and the honest committee members claim their shares here. It also holds slashed funds for an E3.
InterfoldToken (FOLD)contracts/token/InterfoldToken.solThe governance and utility token. Operators bond FOLD for each ciphernode.
InterfoldTicketToken (tFOLD)contracts/token/InterfoldTicketToken.solA non-transferable token that wraps the ticket collateral. The ticket balance of an operator sets its sortition tickets.
Fee tokenThird-party token on mainnet, MockUSDC on SepoliaThe ERC-20 token that requesters use to pay for an E3. Mainnet uses USDS. Sepolia uses MockUSDC, a test token that anyone can mint.
OpenVmReceiptVerifiercontracts/verifiers/OpenVmReceiptVerifier.solVerifies the Halo2 EVM proof of an OpenVM guest, bound to one Halo2 verifier, executable commitment, and VM commitment. Its imageId is the receipt identity that the ciphertext verifier and the E3 program both name.
OpenVmBfvCiphertextVerifiercontracts/verifiers/bfv/OpenVmBfvCiphertextVerifier.solThe BFV ciphertext verifier for OpenVM. It rebuilds the protocol words of the journal from chain state and calls the receipt verifier.
Mock contractscontracts/test/MockE3Program, MockComputeProvider, and the mock verifiers accept test data without real proof verification. Local chains use them. Sepolia uses MockUSDC, the Faucet, MockE3Program, and the CRISP MockOpenVmReceiptVerifier.
DeployableMockCiphertextVerifiercontracts/test/DeployableMockCiphertextVerifier.solA test verifier that accepts every ciphertext proof. It was the mainnet ciphertext verifier from 19 to 22 August 2026.

The main entry points are these functions:

ContractFunctions
Interfoldrequest, publishCiphertextOutput, publishPlaintextOutput, markE3Failed, cancelE3, processE3Failure, claimReward, getE3Stage, getFailureReason
CiphernodeRegistrysubmitTicket, finalizeCommittee, publishCommittee, expelCommitteeMember, getCommitteeNodes, getCommitteeViability
BondingRegistrysetBondOwner, proposeBondOwner, acceptBondOwner, bondCiphernodeFor, unbondCiphernodeFor, addTicketBalanceFor, removeTicketBalanceFor, registerOperatorFor, deregisterOperatorFor, claimExitsFor
SlashingManagerproposeSlash, proposeSlashEvidence, executeSlash, fileAppeal, resolveAppeal
E3RefundManagercalculateRefund, claimRequesterRefund, claimHonestNodeReward

For how to call request, see Requesting an E3. For the operator calls, see Registration.

Enums

The enums are in contracts/interfaces/IInterfold.sol.

E3Stage

ValueNameMeaningEntered by
0NoneThe E3 does not exist.None
1RequestedThe request is accepted. Sortition runs.request
2CommitteeFinalizedThe committee is fixed. The DKG runs.finalizeCommittee on the CiphernodeRegistry
3KeyPublishedThe committee public key is on-chain. Inputs can be encrypted to it.publishCommittee on the CiphernodeRegistry
4CiphertextReadyThe encrypted output is available. The committee decrypts it.publishCiphertextOutput
5CompleteThe plaintext output is on-chain and verified.publishPlaintextOutput
6FailedThe E3 stopped. getFailureReason returns the reason.markE3Failed, cancelE3, or a registry or slashing report

For the full sequence, see E3 lifecycle.

FailureReason

The payer column shows who carries the cost of the failure, from contracts/lib/FailurePayerLib.sol. When the ciphernodes pay, the requester gets back the full service fee escrow. When the requester pays, the honest nodes get the value of the completed work, the protocol gets its share, and the requester gets the rest.

ValueNameSet whenPayer
0NoneThe E3 did not fail.None
1CommitteeFormationTimeoutThe committee deadline passes in Requested, or the randomness is not ready at finalization. cancelE3 also uses it.Ciphernodes
2InsufficientCommitteeMembersFinalization finds fewer tickets than the committee size N, or an expulsion leaves fewer than H active members.Ciphernodes
3DKGTimeoutThe DKG deadline passes in CommitteeFinalized.Ciphernodes
4DKGInvalidSharesReported through onE3Failed.Ciphernodes
5NoInputsReceivedReported through onE3Failed.Requester
6ComputeTimeoutThe compute deadline passes in KeyPublished.Requester
7ComputeProviderExpiredReported through onE3Failed.Requester
8ComputeProviderFailedReported through onE3Failed.Requester
9RequesterCancelledReserved for ABI compatibility. The current contracts do not set it.Requester
10DecryptionTimeoutThe decryption deadline passes in CiphertextReady.Ciphernodes
11DecryptionInvalidSharesReported through onE3Failed.Ciphernodes
12VerificationFailedReported through onE3Failed.Ciphernodes

Only the CiphernodeRegistry or the SlashingManager of the E3 can call onE3Failed. Anyone can call markE3Failed after a deadline. During a grace period after the deadline, only the requester, the owner, and active committee members can call it.

CommitteeSize

ValueNameCommittee size NThreshold THonest parties H
0Minimum312
1Micro945
2Small19914

Decryption needs T + 1 shares. The contracts store H and N for each size as the committee threshold. The values come from crates/committee/src/lib.rs.

Key events

Clients and ciphernodes follow these events. Each event is declared in the interface of its contract.

EventContractEmitted when
E3RequestedInterfoldrequest accepts an E3.
E3StageChangedInterfoldAn E3 moves to a new stage. The event has the previous and the new stage.
CommitteeFinalizedInterfoldThe E3 enters CommitteeFinalized.
CommitteeFormedInterfoldThe E3 enters KeyPublished.
CiphertextOutputReferencePublishedInterfoldThe ciphertext output reference is accepted. The E3 enters CiphertextReady.
PlaintextOutputPublishedInterfoldThe verified plaintext output is accepted. The E3 enters Complete.
E3FailedInterfoldThe E3 enters Failed. The event has the stage and the FailureReason.
E3FailureProcessedInterfoldprocessE3Failure moves the payment to the refund manager.
RewardCredited, RewardClaimedInterfoldA committee member gets a reward credit, and later claims it.
CiphernodeAdded, CiphernodeRemovedCiphernodeRegistryA ciphernode enters or leaves the registration tree.
TicketSubmittedCiphernodeRegistryA ciphernode submits a sortition ticket.
SortitionCommitteeFinalizedCiphernodeRegistryfinalizeCommittee fixes the committee.
CommitteeFormationFailedCiphernodeRegistryfinalizeCommittee finds too few members or no randomness.
CommitteeProofPublishedCiphernodeRegistrypublishCommittee accepts the DKG proof and the public key commitment.
CommitteePublicKeyChunkPublishedCiphernodeRegistryA part of the serialized committee public key is published.
CommitteeMemberExpelledCiphernodeRegistryA slash expels a committee member.
BondOwnerSet, BondOwnerTransferProposedBondingRegistryThe bond owner of an operator is set, or a transfer is proposed.
CiphernodeBondUpdatedBondingRegistryThe FOLD bond of an operator changes.
TicketBalanceUpdatedBondingRegistryThe ticket balance of an operator changes.
OperatorActivationChangedBondingRegistryAn operator becomes active or inactive.
CiphernodeDeregistrationRequestedBondingRegistryAn operator requests deregistration.
AssetsClaimedBondingRegistryAn exit claim pays out released collateral.
SlashProposed, SlashExecutedSlashingManagerA slash is proposed, and later executed.
AppealFiled, AppealResolvedSlashingManagerAn operator appeals a slash, and the appeal ends.
RefundDistributionCalculatedE3RefundManagerThe refund split of a failed E3 is calculated.
RefundClaimedE3RefundManagerA requester or an honest node claims a refund share.

IInterfold.sol also declares InputPublished and CiphertextOutputPublished, and ICiphernodeRegistry.sol declares CommitteeRequested and CommitteePublished. The current contracts do not emit these four events.

Next steps