@gitmyabi/fxcacheroottunnel 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,708 @@
1
+ import type { Abi, Address, PublicClient, WalletClient, GetContractReturnType } from 'viem';
2
+ import { getContract } from 'viem';
3
+
4
+ /**
5
+ * FxCacheRootTunnel_json ABI
6
+ *
7
+ * This ABI is typed using viem's type system for full type safety.
8
+ */
9
+ export const FxCacheRootTunnel_jsonAbi = [
10
+ {
11
+ "inputs": [
12
+ {
13
+ "internalType": "address",
14
+ "name": "_checkpointManager",
15
+ "type": "address"
16
+ },
17
+ {
18
+ "internalType": "address",
19
+ "name": "_fxRoot",
20
+ "type": "address"
21
+ }
22
+ ],
23
+ "stateMutability": "nonpayable",
24
+ "type": "constructor"
25
+ },
26
+ {
27
+ "anonymous": false,
28
+ "inputs": [
29
+ {
30
+ "indexed": true,
31
+ "internalType": "address",
32
+ "name": "rootToken",
33
+ "type": "address"
34
+ },
35
+ {
36
+ "indexed": true,
37
+ "internalType": "address",
38
+ "name": "depositor",
39
+ "type": "address"
40
+ },
41
+ {
42
+ "indexed": true,
43
+ "internalType": "address",
44
+ "name": "userAddress",
45
+ "type": "address"
46
+ },
47
+ {
48
+ "indexed": false,
49
+ "internalType": "uint256",
50
+ "name": "amount",
51
+ "type": "uint256"
52
+ }
53
+ ],
54
+ "name": "FxDepositERC20",
55
+ "type": "event"
56
+ },
57
+ {
58
+ "anonymous": false,
59
+ "inputs": [
60
+ {
61
+ "indexed": true,
62
+ "internalType": "address",
63
+ "name": "rootToken",
64
+ "type": "address"
65
+ },
66
+ {
67
+ "indexed": true,
68
+ "internalType": "address",
69
+ "name": "childToken",
70
+ "type": "address"
71
+ },
72
+ {
73
+ "indexed": true,
74
+ "internalType": "address",
75
+ "name": "userAddress",
76
+ "type": "address"
77
+ },
78
+ {
79
+ "indexed": false,
80
+ "internalType": "uint256",
81
+ "name": "amount",
82
+ "type": "uint256"
83
+ }
84
+ ],
85
+ "name": "FxWithdrawERC20",
86
+ "type": "event"
87
+ },
88
+ {
89
+ "anonymous": false,
90
+ "inputs": [
91
+ {
92
+ "indexed": true,
93
+ "internalType": "address",
94
+ "name": "rootToken",
95
+ "type": "address"
96
+ },
97
+ {
98
+ "indexed": true,
99
+ "internalType": "address",
100
+ "name": "childToken",
101
+ "type": "address"
102
+ }
103
+ ],
104
+ "name": "TokenMappedERC20",
105
+ "type": "event"
106
+ },
107
+ {
108
+ "inputs": [],
109
+ "name": "DEPOSIT",
110
+ "outputs": [
111
+ {
112
+ "internalType": "bytes32",
113
+ "name": "",
114
+ "type": "bytes32"
115
+ }
116
+ ],
117
+ "stateMutability": "view",
118
+ "type": "function"
119
+ },
120
+ {
121
+ "inputs": [],
122
+ "name": "MAP_TOKEN",
123
+ "outputs": [
124
+ {
125
+ "internalType": "bytes32",
126
+ "name": "",
127
+ "type": "bytes32"
128
+ }
129
+ ],
130
+ "stateMutability": "view",
131
+ "type": "function"
132
+ },
133
+ {
134
+ "inputs": [],
135
+ "name": "SEND_MESSAGE_EVENT_SIG",
136
+ "outputs": [
137
+ {
138
+ "internalType": "bytes32",
139
+ "name": "",
140
+ "type": "bytes32"
141
+ }
142
+ ],
143
+ "stateMutability": "view",
144
+ "type": "function"
145
+ },
146
+ {
147
+ "inputs": [],
148
+ "name": "checkpointManager",
149
+ "outputs": [
150
+ {
151
+ "internalType": "contract ICheckpointManager",
152
+ "name": "",
153
+ "type": "address"
154
+ }
155
+ ],
156
+ "stateMutability": "view",
157
+ "type": "function"
158
+ },
159
+ {
160
+ "inputs": [
161
+ {
162
+ "internalType": "address",
163
+ "name": "rootToken",
164
+ "type": "address"
165
+ },
166
+ {
167
+ "internalType": "address",
168
+ "name": "childToken",
169
+ "type": "address"
170
+ },
171
+ {
172
+ "internalType": "address",
173
+ "name": "user",
174
+ "type": "address"
175
+ },
176
+ {
177
+ "internalType": "uint256",
178
+ "name": "amount",
179
+ "type": "uint256"
180
+ },
181
+ {
182
+ "internalType": "bytes",
183
+ "name": "data",
184
+ "type": "bytes"
185
+ }
186
+ ],
187
+ "name": "deposit",
188
+ "outputs": [],
189
+ "stateMutability": "nonpayable",
190
+ "type": "function"
191
+ },
192
+ {
193
+ "inputs": [],
194
+ "name": "fxChildTunnel",
195
+ "outputs": [
196
+ {
197
+ "internalType": "address",
198
+ "name": "",
199
+ "type": "address"
200
+ }
201
+ ],
202
+ "stateMutability": "view",
203
+ "type": "function"
204
+ },
205
+ {
206
+ "inputs": [],
207
+ "name": "fxRoot",
208
+ "outputs": [
209
+ {
210
+ "internalType": "contract IFxStateSender",
211
+ "name": "",
212
+ "type": "address"
213
+ }
214
+ ],
215
+ "stateMutability": "view",
216
+ "type": "function"
217
+ },
218
+ {
219
+ "inputs": [
220
+ {
221
+ "internalType": "address",
222
+ "name": "rootToken",
223
+ "type": "address"
224
+ },
225
+ {
226
+ "internalType": "address",
227
+ "name": "_childToken",
228
+ "type": "address"
229
+ }
230
+ ],
231
+ "name": "mapToken",
232
+ "outputs": [],
233
+ "stateMutability": "nonpayable",
234
+ "type": "function"
235
+ },
236
+ {
237
+ "inputs": [
238
+ {
239
+ "internalType": "bytes32",
240
+ "name": "",
241
+ "type": "bytes32"
242
+ }
243
+ ],
244
+ "name": "processedExits",
245
+ "outputs": [
246
+ {
247
+ "internalType": "bool",
248
+ "name": "",
249
+ "type": "bool"
250
+ }
251
+ ],
252
+ "stateMutability": "view",
253
+ "type": "function"
254
+ },
255
+ {
256
+ "inputs": [
257
+ {
258
+ "internalType": "bytes",
259
+ "name": "inputData",
260
+ "type": "bytes"
261
+ }
262
+ ],
263
+ "name": "receiveMessage",
264
+ "outputs": [],
265
+ "stateMutability": "nonpayable",
266
+ "type": "function"
267
+ },
268
+ {
269
+ "inputs": [
270
+ {
271
+ "internalType": "address",
272
+ "name": "",
273
+ "type": "address"
274
+ }
275
+ ],
276
+ "name": "rootToChildTokens",
277
+ "outputs": [
278
+ {
279
+ "internalType": "address",
280
+ "name": "",
281
+ "type": "address"
282
+ }
283
+ ],
284
+ "stateMutability": "view",
285
+ "type": "function"
286
+ },
287
+ {
288
+ "inputs": [
289
+ {
290
+ "internalType": "address",
291
+ "name": "_fxChildTunnel",
292
+ "type": "address"
293
+ }
294
+ ],
295
+ "name": "setFxChildTunnel",
296
+ "outputs": [],
297
+ "stateMutability": "nonpayable",
298
+ "type": "function"
299
+ }
300
+ ] as const satisfies Abi;
301
+
302
+ /**
303
+ * Type-safe ABI for FxCacheRootTunnel_json
304
+ */
305
+ export type FxCacheRootTunnel_jsonAbi = typeof FxCacheRootTunnel_jsonAbi;
306
+
307
+ /**
308
+ * Contract instance type for FxCacheRootTunnel_json
309
+ */
310
+ // Use any for contract type to avoid complex viem type issues
311
+ // The runtime behavior is type-safe through viem's ABI typing
312
+ export type FxCacheRootTunnel_jsonContract = any;
313
+
314
+ /**
315
+ * FxCacheRootTunnel_json Contract Class
316
+ *
317
+ * Provides a class-based API similar to TypeChain for interacting with the contract.
318
+ *
319
+ * @example
320
+ * ```typescript
321
+ * import { createPublicClient, createWalletClient, http } from 'viem';
322
+ * import { mainnet } from 'viem/chains';
323
+ * import { FxCacheRootTunnel_json } from 'FxCacheRootTunnel_json';
324
+ *
325
+ * const publicClient = createPublicClient({ chain: mainnet, transport: http() });
326
+ * const walletClient = createWalletClient({ chain: mainnet, transport: http() });
327
+ *
328
+ * const contract = new FxCacheRootTunnel_json('0x...', { publicClient, walletClient });
329
+ *
330
+ * // Read functions
331
+ * const result = await contract.balanceOf('0x...');
332
+ *
333
+ * // Write functions
334
+ * const hash = await contract.transfer('0x...', 1000n);
335
+ *
336
+ * // Simulate transactions (dry-run)
337
+ * const simulation = await contract.simulate.transfer('0x...', 1000n);
338
+ * console.log('Gas estimate:', simulation.request.gas);
339
+ *
340
+ * // Watch events
341
+ * const unwatch = contract.watch.Transfer((event) => {
342
+ * console.log('Transfer event:', event);
343
+ * });
344
+ * ```
345
+ */
346
+ export class FxCacheRootTunnel_json {
347
+ private contract: FxCacheRootTunnel_jsonContract;
348
+ private contractAddress: Address;
349
+ private publicClient: PublicClient;
350
+
351
+ constructor(
352
+ address: Address,
353
+ clients: {
354
+ publicClient: PublicClient;
355
+ walletClient?: WalletClient;
356
+ }
357
+ ) {
358
+ this.contractAddress = address;
359
+ this.publicClient = clients.publicClient;
360
+ this.contract = getContract({
361
+ address,
362
+ abi: FxCacheRootTunnel_jsonAbi,
363
+ client: {
364
+ public: clients.publicClient,
365
+ wallet: clients.walletClient,
366
+ },
367
+ });
368
+ }
369
+
370
+ /**
371
+ * Get the contract address
372
+ */
373
+ get address(): Address {
374
+ return this.contractAddress;
375
+ }
376
+
377
+ /**
378
+ * Get the underlying viem contract instance
379
+ */
380
+ getContract(): FxCacheRootTunnel_jsonContract {
381
+ return this.contract;
382
+ }
383
+
384
+ /**
385
+ * DEPOSIT
386
+ * view
387
+ */
388
+ async DEPOSIT(): Promise<`0x${string}`> {
389
+ return this.contract.read.DEPOSIT() as Promise<`0x${string}`>;
390
+ }
391
+
392
+ /**
393
+ * MAP_TOKEN
394
+ * view
395
+ */
396
+ async MAP_TOKEN(): Promise<`0x${string}`> {
397
+ return this.contract.read.MAP_TOKEN() as Promise<`0x${string}`>;
398
+ }
399
+
400
+ /**
401
+ * SEND_MESSAGE_EVENT_SIG
402
+ * view
403
+ */
404
+ async SEND_MESSAGE_EVENT_SIG(): Promise<`0x${string}`> {
405
+ return this.contract.read.SEND_MESSAGE_EVENT_SIG() as Promise<`0x${string}`>;
406
+ }
407
+
408
+ /**
409
+ * checkpointManager
410
+ * view
411
+ */
412
+ async checkpointManager(): Promise<`0x${string}`> {
413
+ return this.contract.read.checkpointManager() as Promise<`0x${string}`>;
414
+ }
415
+
416
+ /**
417
+ * fxChildTunnel
418
+ * view
419
+ */
420
+ async fxChildTunnel(): Promise<`0x${string}`> {
421
+ return this.contract.read.fxChildTunnel() as Promise<`0x${string}`>;
422
+ }
423
+
424
+ /**
425
+ * fxRoot
426
+ * view
427
+ */
428
+ async fxRoot(): Promise<`0x${string}`> {
429
+ return this.contract.read.fxRoot() as Promise<`0x${string}`>;
430
+ }
431
+
432
+ /**
433
+ * processedExits
434
+ * view
435
+ */
436
+ async processedExits(arg0: `0x${string}`): Promise<boolean> {
437
+ return this.contract.read.processedExits([arg0] as const) as Promise<boolean>;
438
+ }
439
+
440
+ /**
441
+ * rootToChildTokens
442
+ * view
443
+ */
444
+ async rootToChildTokens(arg0: `0x${string}`): Promise<`0x${string}`> {
445
+ return this.contract.read.rootToChildTokens([arg0] as const) as Promise<`0x${string}`>;
446
+ }
447
+
448
+ /**
449
+ * deposit
450
+ * nonpayable
451
+ * @param options Optional transaction parameters (value, gas, nonce, etc.)
452
+ */
453
+ async deposit(rootToken: `0x${string}`, childToken: `0x${string}`, user: `0x${string}`, amount: bigint, data: `0x${string}`, options?: {
454
+ accessList?: import('viem').AccessList;
455
+ authorizationList?: import('viem').AuthorizationList;
456
+ chain?: import('viem').Chain | null;
457
+ dataSuffix?: `0x${string}`;
458
+ gas?: bigint;
459
+ gasPrice?: bigint;
460
+ maxFeePerGas?: bigint;
461
+ maxPriorityFeePerGas?: bigint;
462
+ nonce?: number;
463
+ value?: bigint;
464
+ }): Promise<`0x${string}`> {
465
+ if (!this.contract.write) {
466
+ throw new Error('Wallet client is required for write operations');
467
+ }
468
+ return this.contract.write.deposit([rootToken, childToken, user, amount, data] as const, options) as Promise<`0x${string}`>;
469
+ }
470
+
471
+ /**
472
+ * mapToken
473
+ * nonpayable
474
+ * @param options Optional transaction parameters (value, gas, nonce, etc.)
475
+ */
476
+ async mapToken(rootToken: `0x${string}`, _childToken: `0x${string}`, options?: {
477
+ accessList?: import('viem').AccessList;
478
+ authorizationList?: import('viem').AuthorizationList;
479
+ chain?: import('viem').Chain | null;
480
+ dataSuffix?: `0x${string}`;
481
+ gas?: bigint;
482
+ gasPrice?: bigint;
483
+ maxFeePerGas?: bigint;
484
+ maxPriorityFeePerGas?: bigint;
485
+ nonce?: number;
486
+ value?: bigint;
487
+ }): Promise<`0x${string}`> {
488
+ if (!this.contract.write) {
489
+ throw new Error('Wallet client is required for write operations');
490
+ }
491
+ return this.contract.write.mapToken([rootToken, _childToken] as const, options) as Promise<`0x${string}`>;
492
+ }
493
+
494
+ /**
495
+ * receiveMessage
496
+ * nonpayable
497
+ * @param options Optional transaction parameters (value, gas, nonce, etc.)
498
+ */
499
+ async receiveMessage(inputData: `0x${string}`, options?: {
500
+ accessList?: import('viem').AccessList;
501
+ authorizationList?: import('viem').AuthorizationList;
502
+ chain?: import('viem').Chain | null;
503
+ dataSuffix?: `0x${string}`;
504
+ gas?: bigint;
505
+ gasPrice?: bigint;
506
+ maxFeePerGas?: bigint;
507
+ maxPriorityFeePerGas?: bigint;
508
+ nonce?: number;
509
+ value?: bigint;
510
+ }): Promise<`0x${string}`> {
511
+ if (!this.contract.write) {
512
+ throw new Error('Wallet client is required for write operations');
513
+ }
514
+ return this.contract.write.receiveMessage([inputData] as const, options) as Promise<`0x${string}`>;
515
+ }
516
+
517
+ /**
518
+ * setFxChildTunnel
519
+ * nonpayable
520
+ * @param options Optional transaction parameters (value, gas, nonce, etc.)
521
+ */
522
+ async setFxChildTunnel(_fxChildTunnel: `0x${string}`, options?: {
523
+ accessList?: import('viem').AccessList;
524
+ authorizationList?: import('viem').AuthorizationList;
525
+ chain?: import('viem').Chain | null;
526
+ dataSuffix?: `0x${string}`;
527
+ gas?: bigint;
528
+ gasPrice?: bigint;
529
+ maxFeePerGas?: bigint;
530
+ maxPriorityFeePerGas?: bigint;
531
+ nonce?: number;
532
+ value?: bigint;
533
+ }): Promise<`0x${string}`> {
534
+ if (!this.contract.write) {
535
+ throw new Error('Wallet client is required for write operations');
536
+ }
537
+ return this.contract.write.setFxChildTunnel([_fxChildTunnel] as const, options) as Promise<`0x${string}`>;
538
+ }
539
+
540
+
541
+
542
+ /**
543
+ * Simulate contract write operations (dry-run without sending transaction)
544
+ *
545
+ * @example
546
+ * const result = await contract.simulate.transfer('0x...', 1000n);
547
+ * console.log('Gas estimate:', result.request.gas);
548
+ * console.log('Would succeed:', result.result);
549
+ */
550
+ get simulate() {
551
+ const contract = this.contract;
552
+ if (!contract.simulate) {
553
+ throw new Error('Public client is required for simulation');
554
+ }
555
+ return {
556
+ /**
557
+ * Simulate deposit
558
+ * Returns gas estimate and result without sending transaction
559
+ * @param options Optional transaction parameters (value, gas, nonce, etc.)
560
+ */
561
+ async deposit(rootToken: `0x${string}`, childToken: `0x${string}`, user: `0x${string}`, amount: bigint, data: `0x${string}`, options?: {
562
+ accessList?: import('viem').AccessList;
563
+ authorizationList?: import('viem').AuthorizationList;
564
+ chain?: import('viem').Chain | null;
565
+ dataSuffix?: `0x${string}`;
566
+ gas?: bigint;
567
+ gasPrice?: bigint;
568
+ maxFeePerGas?: bigint;
569
+ maxPriorityFeePerGas?: bigint;
570
+ nonce?: number;
571
+ value?: bigint;
572
+ }): Promise<void> {
573
+ return contract.simulate.deposit([rootToken, childToken, user, amount, data] as const, options) as Promise<void>;
574
+ },
575
+ /**
576
+ * Simulate mapToken
577
+ * Returns gas estimate and result without sending transaction
578
+ * @param options Optional transaction parameters (value, gas, nonce, etc.)
579
+ */
580
+ async mapToken(rootToken: `0x${string}`, _childToken: `0x${string}`, options?: {
581
+ accessList?: import('viem').AccessList;
582
+ authorizationList?: import('viem').AuthorizationList;
583
+ chain?: import('viem').Chain | null;
584
+ dataSuffix?: `0x${string}`;
585
+ gas?: bigint;
586
+ gasPrice?: bigint;
587
+ maxFeePerGas?: bigint;
588
+ maxPriorityFeePerGas?: bigint;
589
+ nonce?: number;
590
+ value?: bigint;
591
+ }): Promise<void> {
592
+ return contract.simulate.mapToken([rootToken, _childToken] as const, options) as Promise<void>;
593
+ },
594
+ /**
595
+ * Simulate receiveMessage
596
+ * Returns gas estimate and result without sending transaction
597
+ * @param options Optional transaction parameters (value, gas, nonce, etc.)
598
+ */
599
+ async receiveMessage(inputData: `0x${string}`, options?: {
600
+ accessList?: import('viem').AccessList;
601
+ authorizationList?: import('viem').AuthorizationList;
602
+ chain?: import('viem').Chain | null;
603
+ dataSuffix?: `0x${string}`;
604
+ gas?: bigint;
605
+ gasPrice?: bigint;
606
+ maxFeePerGas?: bigint;
607
+ maxPriorityFeePerGas?: bigint;
608
+ nonce?: number;
609
+ value?: bigint;
610
+ }): Promise<void> {
611
+ return contract.simulate.receiveMessage([inputData] as const, options) as Promise<void>;
612
+ },
613
+ /**
614
+ * Simulate setFxChildTunnel
615
+ * Returns gas estimate and result without sending transaction
616
+ * @param options Optional transaction parameters (value, gas, nonce, etc.)
617
+ */
618
+ async setFxChildTunnel(_fxChildTunnel: `0x${string}`, options?: {
619
+ accessList?: import('viem').AccessList;
620
+ authorizationList?: import('viem').AuthorizationList;
621
+ chain?: import('viem').Chain | null;
622
+ dataSuffix?: `0x${string}`;
623
+ gas?: bigint;
624
+ gasPrice?: bigint;
625
+ maxFeePerGas?: bigint;
626
+ maxPriorityFeePerGas?: bigint;
627
+ nonce?: number;
628
+ value?: bigint;
629
+ }): Promise<void> {
630
+ return contract.simulate.setFxChildTunnel([_fxChildTunnel] as const, options) as Promise<void>;
631
+ }
632
+ };
633
+ }
634
+
635
+ /**
636
+ * Watch contract events
637
+ *
638
+ * @example
639
+ * // Watch all Transfer events
640
+ * const unwatch = contract.watch.Transfer((event) => {
641
+ * console.log('Transfer:', event);
642
+ * });
643
+ *
644
+ * // Stop watching
645
+ * unwatch();
646
+ */
647
+ get watch() {
648
+ return {
649
+ /**
650
+ * Watch FxDepositERC20 events
651
+ * @param callback Function to call when event is emitted
652
+ * @param filter Optional filter for indexed parameters
653
+ * @returns Unwatch function to stop listening
654
+ */
655
+ FxDepositERC20: (callback: (event: { rootToken: `0x${string}`; depositor: `0x${string}`; userAddress: `0x${string}`; amount: bigint }) => void, filter?: { rootToken: `0x${string}`; depositor: `0x${string}`; userAddress: `0x${string}` }) => {
656
+ return this.publicClient.watchContractEvent({
657
+ address: this.contractAddress,
658
+ abi: FxCacheRootTunnel_jsonAbi,
659
+ eventName: 'FxDepositERC20',
660
+ args: filter,
661
+ onLogs: (logs: any[]) => {
662
+ logs.forEach((log: any) => {
663
+ callback(log.args as any);
664
+ });
665
+ },
666
+ }) as () => void;
667
+ },
668
+ /**
669
+ * Watch FxWithdrawERC20 events
670
+ * @param callback Function to call when event is emitted
671
+ * @param filter Optional filter for indexed parameters
672
+ * @returns Unwatch function to stop listening
673
+ */
674
+ FxWithdrawERC20: (callback: (event: { rootToken: `0x${string}`; childToken: `0x${string}`; userAddress: `0x${string}`; amount: bigint }) => void, filter?: { rootToken: `0x${string}`; childToken: `0x${string}`; userAddress: `0x${string}` }) => {
675
+ return this.publicClient.watchContractEvent({
676
+ address: this.contractAddress,
677
+ abi: FxCacheRootTunnel_jsonAbi,
678
+ eventName: 'FxWithdrawERC20',
679
+ args: filter,
680
+ onLogs: (logs: any[]) => {
681
+ logs.forEach((log: any) => {
682
+ callback(log.args as any);
683
+ });
684
+ },
685
+ }) as () => void;
686
+ },
687
+ /**
688
+ * Watch TokenMappedERC20 events
689
+ * @param callback Function to call when event is emitted
690
+ * @param filter Optional filter for indexed parameters
691
+ * @returns Unwatch function to stop listening
692
+ */
693
+ TokenMappedERC20: (callback: (event: { rootToken: `0x${string}`; childToken: `0x${string}` }) => void, filter?: { rootToken: `0x${string}`; childToken: `0x${string}` }) => {
694
+ return this.publicClient.watchContractEvent({
695
+ address: this.contractAddress,
696
+ abi: FxCacheRootTunnel_jsonAbi,
697
+ eventName: 'TokenMappedERC20',
698
+ args: filter,
699
+ onLogs: (logs: any[]) => {
700
+ logs.forEach((log: any) => {
701
+ callback(log.args as any);
702
+ });
703
+ },
704
+ }) as () => void;
705
+ }
706
+ };
707
+ }
708
+ }
@@ -0,0 +1,2 @@
1
+ export { FxCacheRootTunnel_jsonAbi, FxCacheRootTunnel_json } from './FxCacheRootTunnel_json';
2
+ export type { FxCacheRootTunnel_jsonAbi as FxCacheRootTunnel_jsonAbiType, FxCacheRootTunnel_jsonContract } from './FxCacheRootTunnel_json';