-
Oracle
0x3ad71d4660d8a8d2f92248b9c286392dd76a3ab6 IgneumStateOracle, deployed 8 October 2026 on the shared verifier (tx 0x16312cf8…4e2a, block 11870855); its trust() names the two unchecked items below; accepts statements with chain id 4463 or 4464 (the earlier devnet it was deployed against; a redeploy against the 2.0 devnet, chain id 4465, is owed).
+
Oracle
0xbb3450049926da3572e6b67cb94df312fe349e34 IgneumStateOracle for the 2.0 devnet (igneum-devnet-4, statements with chain id 4465), deployed 8 October 2026 on the shared verifier (tx 0x5eb08f3a…a5a9, block 11871485). The Devnet 3 oracles stay as deployed with their records: 0x3ad71d46…3ab6 (chain ids 4463 and 4464, on the shared verifier) and 0xefe9879d…a1b2 (the stand-in verifier at first).
Verifier
0xAf74f3F512081291D663Bb1d6b6d37E99e37D744 the shared IgneumCertificateVerifier (the DEX lane's, a real BLS12-381 check on chain through the EIP-2537 precompiles, voter table installed at checkpoint 2127), set by setVerifier on 8 October 2026 (tx 0xd679bb65…db8e); the stand-in 0xa197ef31…a6f6 served until then
Chain
Sepolia, chain id 11155111; the Igneum 2.0 devnet (igneum-devnet-4), no value
Proven roots
Certificate 2232 (0xf056c26e…, 29 voters, signed weight 4,988 of 7,164) recorded on the shared verifier with a real BLS check, tx 0x1794b785…1e8a, 792,677 gas. Devnet chain block 28439, post_root 0x6e6d2fc8… stored on this oracle with a 6-header path, tx 0xcdb24dbc…ee5fc, 1,624,984 gas; provenBalance read 721.451608 IGN for 0xcaed79d8…c087 on Sepolia, equal to the devnet node's eth_getProof.
@@ -277,7 +277,7 @@
Every read: a keccak-keyed Merkle Patricia proof against the stored root, verified on chain.
Trust anchors and unchecked signatures, named (also returned by the contract's trust())
-- Deployer-installed trust anchor, disclosed, not removed: the shared verifier's voter table. It stays because no header field commits to the table yet; the day one does, the table is read from the chain and this anchor goes.
+- Deployer-installed trust anchor, disclosed, not removed: the shared verifier's voter table. It stays because no header field commits to the table yet; the day one does, the table is read from the chain and this anchor goes. The table installed today is Devnet 3's (checkpoint 2127, chain id igneum-devnet-3): a 2.0 devnet certificate is not recordable through it until its deployer installs devnet-4's table; the roots and certificate recorded below are Devnet 3's.
- The voter table and weights the shared verifier checks certificates against were installed by the verifier's deployer (read from a node at checkpoint 2127), not read from the chain. A certificate is verified against that installed table; a later table that drifts past the rule's margin needs a new install by that deployer.
- The aggregator's BLS signature over the segment record is not checked on chain, and the SP1 proof behind its statement is not verified on chain. A stored root rests on the aggregator's statement as the nodes check and pay it.
- A balance read from a stored root is executed and finalised state under those assumptions, not a payment outcome.
diff --git a/tools/reference-apps/oracle/deploy.mjs b/tools/reference-apps/oracle/deploy.mjs
index 3e70b397b..6bf648dbb 100644
--- a/tools/reference-apps/oracle/deploy.mjs
+++ b/tools/reference-apps/oracle/deploy.mjs
@@ -29,13 +29,15 @@ async function deploy(name, args) {
const oracleOnly = process.argv.includes('--oracle-only');
// --verifier 0x..: construct the oracle on that verifier (the shared IgneumCertificateVerifier) instead of the stub
const vi = process.argv.indexOf('--verifier'); const verifierArg = vi > 0 ? process.argv[vi + 1] : null;
+// --chain-ids A,B: the statement chain ids the oracle accepts (Devnet 3: 4463,4464; the 2.0 devnet igneum-devnet-4: 4465,4465)
+const ci = process.argv.indexOf('--chain-ids'); const chainIds = ci > 0 ? process.argv[ci + 1].split(',').map(Number) : [EVM_CHAIN_ID, EVM_CHAIN_ID_AFTER_FLOOR];
const previous = existsSync(out) ? deployment() : null;
const stub = oracleOnly && previous ? previous.stub : await deploy('StubCertificateVerifier', []);
-const oracle = await deploy('IgneumStateOracle', [verifierArg || stub.address, EVM_CHAIN_ID, EVM_CHAIN_ID_AFTER_FLOOR]);
+const oracle = await deploy('IgneumStateOracle', [verifierArg || stub.address, chainIds[0], chainIds[1] ?? chainIds[0]]);
const after = await pub.getBalance({ address: account.address });
const d = {
network: 'sepolia', chainId: 11155111, rpc: 'https://ethereum-sepolia-rpc.publicnode.com', deployer: account.address,
- evmChainId: EVM_CHAIN_ID, evmChainIdAfterFloor: EVM_CHAIN_ID_AFTER_FLOOR, verifier: verifierArg || 'stub', verifierAddress: verifierArg || stub.address, stub, oracle, deployedAt: new Date().toISOString(), spentWei: (bal - after).toString(),
+ evmChainId: chainIds[0], evmChainIdAfterFloor: chainIds[1] ?? chainIds[0], verifier: verifierArg || 'stub', verifierAddress: verifierArg || stub.address, stub, oracle, deployedAt: new Date().toISOString(), spentWei: (bal - after).toString(),
previous: previous ? [...(previous.previous || []), { stub: previous.stub, oracle: previous.oracle, deployedAt: previous.deployedAt, writes: previous.writes || [] }] : [],
};
writeFileSync(out, JSON.stringify(d, null, 1) + '\n');
diff --git a/tools/reference-apps/oracle/deployment.json b/tools/reference-apps/oracle/deployment.json
index 8628ee337..0d3d840ea 100644
--- a/tools/reference-apps/oracle/deployment.json
+++ b/tools/reference-apps/oracle/deployment.json
@@ -3,8 +3,8 @@
"chainId": 11155111,
"rpc": "https://ethereum-sepolia-rpc.publicnode.com",
"deployer": "0xe1D08384ef4c4c1511c8f05F94C914C4DeDc2787",
- "evmChainId": 4463,
- "evmChainIdAfterFloor": 4464,
+ "evmChainId": 4465,
+ "evmChainIdAfterFloor": 4465,
"verifier": "0xAf74f3F512081291D663Bb1d6b6d37E99e37D744",
"verifierAddress": "0xAf74f3F512081291D663Bb1d6b6d37E99e37D744",
"stub": {
@@ -14,13 +14,13 @@
"gasUsed": 8434842
},
"oracle": {
- "address": "0x3ad71d4660d8a8d2f92248b9c286392dd76a3ab6",
- "tx": "0x16312cf8177eb79c28858d79509ea56376cefb94e09fb1872bfea018df734e2a",
- "block": 11870855,
+ "address": "0xbb3450049926da3572e6b67cb94df312fe349e34",
+ "tx": "0x5eb08f3aadfbcec8e6eeccf5349278e1c5eeba27c08d6150aa2fdbd0395ca5a9",
+ "block": 11871485,
"gasUsed": 20561543
},
- "deployedAt": "2026-10-08T14:47:15.139Z",
- "spentWei": "20561810300059",
+ "deployedAt": "2026-10-08T16:53:26.556Z",
+ "spentWei": "20561871984688",
"previous": [
{
"stub": {
@@ -165,21 +165,36 @@
"headers": 6
}
]
- }
- ],
- "writes": [
+ },
{
- "at": "2026-10-08T14:47:39.502Z",
- "what": "submitStateRoot",
- "vector": "devnet-3",
- "number": "28439",
- "postRoot": "0x6e6d2fc8993db13220d84f39ca9cbc08a8c6975ce2932a4289a1d6ef4cef60c8",
- "certIndex": "2232",
- "tx": "0xcdb24dbceb5b1c5f4605842809228428c59bd73291a0114e555df74c57dee5fc",
- "block": 11870857,
- "gasUsed": 1624984,
- "calldataBytes": 24391,
- "headers": 6
+ "stub": {
+ "address": "0xa197ef31d5d5613125779179668e2482ac69a6f6",
+ "tx": "0xa01091b62dfb4a89b25afb57a3d384677a9ad62370748504d2b3f288c0d3ad38",
+ "block": 11869583,
+ "gasUsed": 8434842
+ },
+ "oracle": {
+ "address": "0x3ad71d4660d8a8d2f92248b9c286392dd76a3ab6",
+ "tx": "0x16312cf8177eb79c28858d79509ea56376cefb94e09fb1872bfea018df734e2a",
+ "block": 11870855,
+ "gasUsed": 20561543
+ },
+ "deployedAt": "2026-10-08T14:47:15.139Z",
+ "writes": [
+ {
+ "at": "2026-10-08T14:47:39.502Z",
+ "what": "submitStateRoot",
+ "vector": "devnet-3",
+ "number": "28439",
+ "postRoot": "0x6e6d2fc8993db13220d84f39ca9cbc08a8c6975ce2932a4289a1d6ef4cef60c8",
+ "certIndex": "2232",
+ "tx": "0xcdb24dbceb5b1c5f4605842809228428c59bd73291a0114e555df74c57dee5fc",
+ "block": 11870857,
+ "gasUsed": 1624984,
+ "calldataBytes": 24391,
+ "headers": 6
+ }
+ ]
}
]
}