@@ -16,11 +16,11 @@ image_reference = "nearone/mpc-node"
1616# docs/running-an-mpc-node-in-tdx-external-guide.md#required-ports
1717# (80 P2P, 8080 web/metrics, 8079 migration, 3030 debug, 24567 DSS).
1818port_mappings = [
19- { host = 80 , container = 80 }, # MPC P2P (port_override convention)
20- { host = 8080 , container = 8080 }, # web_ui / metrics / /public_data
21- { host = 8079 , container = 8079 }, # migration_web_ui
22- { host = 3030 , container = 3030 }, # debug / telemetry
23- { host = 24567 , container = 24567 }, # decentralized state sync
19+ { host = 80 , container = 80 }, # MPC P2P (port_override convention)
20+ { host = 8080 , container = 8080 }, # web_ui / metrics / /public_data
21+ { host = 8079 , container = 8079 }, # migration_web_ui
22+ { host = 3030 , container = 3030 }, # debug / telemetry
23+ { host = 24567 , container = 24567 }, # decentralized state sync
2424]
2525
2626[mpc_node_config ]
@@ -54,7 +54,7 @@ format = "plain"
5454filter = " info"
5555
5656[mpc_node_config .near_init ]
57- chain_id = " testnet" # mainnet: "mainnet"
57+ chain_id = " testnet" # mainnet: "mainnet"
5858# Testnet boot nodes. For mainnet, replace with the mainnet boot-nodes
5959# string from https://near-nodes.io/ or the official nearcore mainnet
6060# config.json (rpc.mainnet.near.org).
@@ -101,7 +101,7 @@ cores = 6
101101validate_genesis = false
102102sync_mode = " Latest"
103103concurrency = 1
104- mpc_contract_id = " v1.signer-prod.testnet" # mainnet: "v1.signer"
104+ mpc_contract_id = " v1.signer-prod.testnet" # mainnet: "v1.signer"
105105finality = " optimistic"
106106# MPC P2P convention is port 80. Forces it on every peer URL (listen +
107107# dial) regardless of the URL's scheme/port.
@@ -124,16 +124,19 @@ timeout_sec = 60
124124[mpc_node_config .node .ckd ]
125125timeout_sec = 60
126126
127- # Foreign-chain RPC URLs below target testnet networks (Bitcoin testnet,
128- # Abstract testnet, Starknet Sepolia). For mainnet, swap each provider's
129- # rpc_url for the corresponding mainnet endpoint, and any
130- # expected_network_fingerprint for the mainnet value shown beside it.
127+ # Foreign-chain RPC providers. The active sections below target testnet
128+ # networks; the mainnet variant is the commented block at the end — for a
129+ # mainnet node, replace the testnet sections with it.
130+ #
131+ # Replace the YOUR_* placeholders with your own API keys and YOUR-SLUG with
132+ # your QuickNode endpoint name. See "Foreign chain RPC providers" in
133+ # docs/running-an-mpc-node-in-tdx-external-guide.md for details, and verify
134+ # with crates/foreign-chain-config-tester before deploying.
131135
132136[mpc_node_config .node .foreign_chains .bitcoin ]
133137timeout_sec = 30
134138max_retries = 3
135139# Genesis block hash, as block explorers render it.
136- # mainnet: "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
137140expected_network_fingerprint = " 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"
138141
139142[mpc_node_config .node .foreign_chains .bitcoin .providers .public ]
@@ -142,15 +145,234 @@ rpc_url = "https://bitcoin-testnet-rpc.publicnode.com"
142145[mpc_node_config .node .foreign_chains .abstract ]
143146timeout_sec = 30
144147max_retries = 3
145- expected_network_fingerprint = " 11124" # Abstract testnet; mainnet: "2741"
148+ expected_network_fingerprint = " 11124"
146149
147150[mpc_node_config .node .foreign_chains .abstract .providers .abstract-testnet ]
148151rpc_url = " https://api.testnet.abs.xyz"
149152
153+ [mpc_node_config .node .foreign_chains .abstract .providers .alchemy ]
154+ rpc_url = " https://abstract-testnet.g.alchemy.com/v2/{API_KEY}"
155+
156+ [mpc_node_config .node .foreign_chains .abstract .providers .alchemy .auth ]
157+ kind = " path"
158+ placeholder = " {API_KEY}"
159+ token = { val = " YOUR_ALCHEMY_API_KEY" }
160+
161+ [mpc_node_config .node .foreign_chains .abstract .providers .quicknode ]
162+ rpc_url = " https://YOUR-SLUG.abstract-testnet.quiknode.pro/{api_key}"
163+
164+ [mpc_node_config .node .foreign_chains .abstract .providers .quicknode .auth ]
165+ kind = " path"
166+ placeholder = " {api_key}"
167+ token = { val = " YOUR_QUICKNODE_API_KEY" }
168+
150169[mpc_node_config .node .foreign_chains .starknet ]
151170timeout_sec = 30
152171max_retries = 3
153- expected_network_fingerprint = " 0x534e5f5345504f4c4941" # SN_SEPOLIA; mainnet: "0x534e5f4d41494e"
172+ expected_network_fingerprint = " 0x534e5f5345504f4c4941" # SN_SEPOLIA
154173
155174[mpc_node_config .node .foreign_chains .starknet .providers .publicnode ]
156175rpc_url = " https://starknet-sepolia-rpc.publicnode.com"
176+
177+ [mpc_node_config .node .foreign_chains .starknet .providers .alchemy ]
178+ rpc_url = " https://starknet-sepolia.g.alchemy.com/starknet/version/rpc/v0_10/{API_KEY}"
179+
180+ [mpc_node_config .node .foreign_chains .starknet .providers .alchemy .auth ]
181+ kind = " path"
182+ placeholder = " {API_KEY}"
183+ token = { val = " YOUR_ALCHEMY_API_KEY" }
184+
185+ [mpc_node_config .node .foreign_chains .starknet .providers .quicknode ]
186+ rpc_url = " https://YOUR-SLUG.strk-sepolia.quiknode.pro/{api_key}"
187+
188+ [mpc_node_config .node .foreign_chains .starknet .providers .quicknode .auth ]
189+ kind = " path"
190+ placeholder = " {api_key}"
191+ token = { val = " YOUR_QUICKNODE_API_KEY" }
192+
193+ [mpc_node_config .node .foreign_chains .aptos ]
194+ timeout_sec = 30
195+ max_retries = 3
196+ expected_network_fingerprint = " 2" # Aptos ledger chain id
197+
198+ [mpc_node_config .node .foreign_chains .aptos .providers .public ]
199+ rpc_url = " https://fullnode.testnet.aptoslabs.com/v1"
200+
201+ [mpc_node_config .node .foreign_chains .aptos .providers .alchemy ]
202+ rpc_url = " https://aptos-testnet.g.alchemy.com/v2/{API_KEY}/v1"
203+
204+ [mpc_node_config .node .foreign_chains .aptos .providers .alchemy .auth ]
205+ kind = " path"
206+ placeholder = " {API_KEY}"
207+ token = { val = " YOUR_ALCHEMY_API_KEY" }
208+
209+ [mpc_node_config .node .foreign_chains .aptos .providers .quicknode ]
210+ rpc_url = " https://YOUR-SLUG.aptos-testnet.quiknode.pro/{api_key}/v1"
211+
212+ [mpc_node_config .node .foreign_chains .aptos .providers .quicknode .auth ]
213+ kind = " path"
214+ placeholder = " {api_key}"
215+ token = { val = " YOUR_QUICKNODE_API_KEY" }
216+
217+ [mpc_node_config .node .foreign_chains .aptos .providers .geomi ]
218+ rpc_url = " https://api.testnet.aptoslabs.com/v1"
219+
220+ [mpc_node_config .node .foreign_chains .aptos .providers .geomi .auth ]
221+ kind = " header"
222+ name = " Authorization"
223+ scheme = " Bearer"
224+ token = { val = " YOUR_GEOMI_API_KEY" }
225+
226+ # Sui speaks gRPC: keys go in headers, never in the URL (path/query auth is
227+ # not supported by the gRPC client).
228+ [mpc_node_config .node .foreign_chains .sui ]
229+ timeout_sec = 30
230+ max_retries = 3
231+ # Genesis checkpoint digest.
232+ expected_network_fingerprint = " 69WiPg3DAQiwdxfncX6wYQ2siKwAe6L9BZthQea3JNMD"
233+
234+ [mpc_node_config .node .foreign_chains .sui .providers .public ]
235+ rpc_url = " https://archive.testnet.sui.io"
236+
237+ [mpc_node_config .node .foreign_chains .sui .providers .public .auth ]
238+ kind = " none"
239+
240+ [mpc_node_config .node .foreign_chains .sui .providers .alchemy ]
241+ rpc_url = " https://sui-testnet.g.alchemy.com"
242+
243+ [mpc_node_config .node .foreign_chains .sui .providers .alchemy .auth ]
244+ kind = " header"
245+ name = " Authorization"
246+ scheme = " Bearer"
247+ token = { val = " YOUR_ALCHEMY_API_KEY" }
248+
249+ [mpc_node_config .node .foreign_chains .sui .providers .quicknode ]
250+ rpc_url = " https://YOUR-SLUG.sui-testnet.quiknode.pro"
251+
252+ [mpc_node_config .node .foreign_chains .sui .providers .quicknode .auth ]
253+ kind = " header"
254+ name = " x-token"
255+ token = { val = " YOUR_QUICKNODE_API_KEY" }
256+
257+ # ─── Mainnet variant ─────────────────────────────────────────────────────────
258+ # For a mainnet node, replace the testnet foreign_chains sections above with:
259+ #
260+ # [mpc_node_config.node.foreign_chains.bitcoin]
261+ # timeout_sec = 30
262+ # max_retries = 3
263+ # # Genesis block hash, as block explorers render it.
264+ # expected_network_fingerprint = "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
265+ #
266+ # [mpc_node_config.node.foreign_chains.bitcoin.providers.public]
267+ # rpc_url = "https://bitcoin-rpc.publicnode.com"
268+ #
269+ # [mpc_node_config.node.foreign_chains.abstract]
270+ # timeout_sec = 30
271+ # max_retries = 3
272+ # expected_network_fingerprint = "2741"
273+ #
274+ # [mpc_node_config.node.foreign_chains.abstract.providers.abstract-mainnet]
275+ # rpc_url = "https://api.mainnet.abs.xyz"
276+ #
277+ # [mpc_node_config.node.foreign_chains.abstract.providers.alchemy]
278+ # rpc_url = "https://abstract-mainnet.g.alchemy.com/v2/{API_KEY}"
279+ #
280+ # [mpc_node_config.node.foreign_chains.abstract.providers.alchemy.auth]
281+ # kind = "path"
282+ # placeholder = "{API_KEY}"
283+ # token = { val = "YOUR_ALCHEMY_API_KEY" }
284+ #
285+ # [mpc_node_config.node.foreign_chains.abstract.providers.quicknode]
286+ # rpc_url = "https://YOUR-SLUG.abstract-mainnet.quiknode.pro/{api_key}"
287+ #
288+ # [mpc_node_config.node.foreign_chains.abstract.providers.quicknode.auth]
289+ # kind = "path"
290+ # placeholder = "{api_key}"
291+ # token = { val = "YOUR_QUICKNODE_API_KEY" }
292+ #
293+ # [mpc_node_config.node.foreign_chains.starknet]
294+ # timeout_sec = 30
295+ # max_retries = 3
296+ # expected_network_fingerprint = "0x534e5f4d41494e" # SN_MAIN
297+ #
298+ # [mpc_node_config.node.foreign_chains.starknet.providers.publicnode]
299+ # rpc_url = "https://starknet-rpc.publicnode.com"
300+ #
301+ # [mpc_node_config.node.foreign_chains.starknet.providers.alchemy]
302+ # rpc_url = "https://starknet-mainnet.g.alchemy.com/starknet/version/rpc/v0_10/{API_KEY}"
303+ #
304+ # [mpc_node_config.node.foreign_chains.starknet.providers.alchemy.auth]
305+ # kind = "path"
306+ # placeholder = "{API_KEY}"
307+ # token = { val = "YOUR_ALCHEMY_API_KEY" }
308+ #
309+ # [mpc_node_config.node.foreign_chains.starknet.providers.quicknode]
310+ # rpc_url = "https://YOUR-SLUG.strk-mainnet.quiknode.pro/{api_key}"
311+ #
312+ # [mpc_node_config.node.foreign_chains.starknet.providers.quicknode.auth]
313+ # kind = "path"
314+ # placeholder = "{api_key}"
315+ # token = { val = "YOUR_QUICKNODE_API_KEY" }
316+ #
317+ # [mpc_node_config.node.foreign_chains.aptos]
318+ # timeout_sec = 30
319+ # max_retries = 3
320+ # expected_network_fingerprint = "1" # Aptos ledger chain id
321+ #
322+ # [mpc_node_config.node.foreign_chains.aptos.providers.public]
323+ # rpc_url = "https://fullnode.mainnet.aptoslabs.com/v1"
324+ #
325+ # [mpc_node_config.node.foreign_chains.aptos.providers.alchemy]
326+ # rpc_url = "https://aptos-mainnet.g.alchemy.com/v2/{API_KEY}/v1"
327+ #
328+ # [mpc_node_config.node.foreign_chains.aptos.providers.alchemy.auth]
329+ # kind = "path"
330+ # placeholder = "{API_KEY}"
331+ # token = { val = "YOUR_ALCHEMY_API_KEY" }
332+ #
333+ # [mpc_node_config.node.foreign_chains.aptos.providers.quicknode]
334+ # rpc_url = "https://YOUR-SLUG.aptos-mainnet.quiknode.pro/{api_key}/v1"
335+ #
336+ # [mpc_node_config.node.foreign_chains.aptos.providers.quicknode.auth]
337+ # kind = "path"
338+ # placeholder = "{api_key}"
339+ # token = { val = "YOUR_QUICKNODE_API_KEY" }
340+ #
341+ # [mpc_node_config.node.foreign_chains.aptos.providers.geomi]
342+ # rpc_url = "https://api.mainnet.aptoslabs.com/v1"
343+ #
344+ # [mpc_node_config.node.foreign_chains.aptos.providers.geomi.auth]
345+ # kind = "header"
346+ # name = "Authorization"
347+ # scheme = "Bearer"
348+ # token = { val = "YOUR_GEOMI_API_KEY" }
349+ #
350+ # # Sui speaks gRPC: keys go in headers, never in the URL.
351+ # [mpc_node_config.node.foreign_chains.sui]
352+ # timeout_sec = 30
353+ # max_retries = 3
354+ # # Genesis checkpoint digest.
355+ # expected_network_fingerprint = "4btiuiMPvEENsttpZC7CZ53DruC3MAgfznDbASZ7DR6S"
356+ #
357+ # [mpc_node_config.node.foreign_chains.sui.providers.public]
358+ # rpc_url = "https://archive.mainnet.sui.io"
359+ #
360+ # [mpc_node_config.node.foreign_chains.sui.providers.public.auth]
361+ # kind = "none"
362+ #
363+ # [mpc_node_config.node.foreign_chains.sui.providers.alchemy]
364+ # rpc_url = "https://sui-mainnet.g.alchemy.com"
365+ #
366+ # [mpc_node_config.node.foreign_chains.sui.providers.alchemy.auth]
367+ # kind = "header"
368+ # name = "Authorization"
369+ # scheme = "Bearer"
370+ # token = { val = "YOUR_ALCHEMY_API_KEY" }
371+ #
372+ # [mpc_node_config.node.foreign_chains.sui.providers.quicknode]
373+ # rpc_url = "https://YOUR-SLUG.sui-mainnet.quiknode.pro"
374+ #
375+ # [mpc_node_config.node.foreign_chains.sui.providers.quicknode.auth]
376+ # kind = "header"
377+ # name = "x-token"
378+ # token = { val = "YOUR_QUICKNODE_API_KEY" }
0 commit comments