Skip to content

Commit d45bd9b

Browse files
authored
docs: Add section in onboarding doc about foreign chain configs (#4097)
1 parent c2e8ed5 commit d45bd9b

2 files changed

Lines changed: 468 additions & 15 deletions

File tree

deployment/cvm-deployment/user-config.toml

Lines changed: 236 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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).
1818
port_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"
5454
filter = "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
101101
validate_genesis = false
102102
sync_mode = "Latest"
103103
concurrency = 1
104-
mpc_contract_id = "v1.signer-prod.testnet" # mainnet: "v1.signer"
104+
mpc_contract_id = "v1.signer-prod.testnet" # mainnet: "v1.signer"
105105
finality = "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]
125125
timeout_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]
133137
timeout_sec = 30
134138
max_retries = 3
135139
# Genesis block hash, as block explorers render it.
136-
# mainnet: "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
137140
expected_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]
143146
timeout_sec = 30
144147
max_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]
148151
rpc_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]
151170
timeout_sec = 30
152171
max_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]
156175
rpc_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

Comments
 (0)