Skip to content

Commit 5ca21df

Browse files
add tracking query param support
1 parent 85dd21e commit 5ca21df

File tree

10 files changed

+3724
-2913
lines changed

10 files changed

+3724
-2913
lines changed

.env.development

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,6 @@ LOG_LEVEL=debug
99
SENTRY_DSN=
1010
SENTRY_TRACES_SAMPLE_RATE=0.01
1111
SENTRY_SAMPLE_RATE=0.1
12+
13+
# Tracking
14+
TRACKING_ENABLED=false

package-lock.json

Lines changed: 3630 additions & 2855 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/constants/src/constants.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ export const TORUS_LEGACY_NETWORK = {
55
TESTNET: "testnet",
66
CYAN: "cyan",
77
AQUA: "aqua",
8-
CELESTE: "celeste",
98
} as const;
109

1110
export const TORUS_SAPPHIRE_NETWORK = {
@@ -21,23 +20,15 @@ export const PROXY_CONTRACT_ADDRESS = {
2120
[TORUS_LEGACY_NETWORK.CYAN]: "0x9f072ba19b3370e512aa1b4bfcdaf97283168005",
2221

2322
[TORUS_LEGACY_NETWORK.AQUA]: "0x29Dea82a0509153b91040ee13cDBba0f03efb625",
24-
25-
[TORUS_LEGACY_NETWORK.CELESTE]: "0x6Bffb4e89453069E7487f0fa5c9f4a2D771cce6c",
2623
};
2724

2825
export const MULTI_CLUSTER_NETWORKS: TORUS_LEGACY_NETWORK_TYPE[] = [
2926
// TORUS_LEGACY_NETWORK.AQUA,
30-
// TORUS_LEGACY_NETWORK.CELESTE,
3127
// TORUS_LEGACY_NETWORK.CYAN,
3228
];
3329

3430
export const LEGACY_NETWORKS_ROUTE_MAP: Record<TORUS_LEGACY_NETWORK_TYPE, ILegacyNetworkMigrationInfo> = {
3531
[TORUS_LEGACY_NETWORK.AQUA]: { migrationCompleted: true, networkIdentifier: "aqua", networkMigratedTo: TORUS_SAPPHIRE_NETWORK.SAPPHIRE_MAINNET },
36-
[TORUS_LEGACY_NETWORK.CELESTE]: {
37-
migrationCompleted: true,
38-
networkIdentifier: "celeste",
39-
networkMigratedTo: TORUS_SAPPHIRE_NETWORK.SAPPHIRE_MAINNET,
40-
},
4132
[TORUS_LEGACY_NETWORK.CYAN]: { migrationCompleted: true, networkIdentifier: "cyan", networkMigratedTo: TORUS_SAPPHIRE_NETWORK.SAPPHIRE_MAINNET },
4233
[TORUS_LEGACY_NETWORK.MAINNET]: {
4334
migrationCompleted: true,
@@ -56,7 +47,6 @@ export const NETWORK_MAP: Record<TORUS_LEGACY_NETWORK_TYPE, string> = {
5647
[TORUS_LEGACY_NETWORK.TESTNET]: "goerli",
5748
[TORUS_LEGACY_NETWORK.CYAN]: "polygon-mainnet",
5849
[TORUS_LEGACY_NETWORK.AQUA]: "polygon-mainnet",
59-
[TORUS_LEGACY_NETWORK.CELESTE]: "polygon-mainnet",
6050
};
6151

6252
export const SIGNER_MAP: Record<TORUS_NETWORK_TYPE, string> = {
@@ -66,15 +56,13 @@ export const SIGNER_MAP: Record<TORUS_NETWORK_TYPE, string> = {
6656
[TORUS_LEGACY_NETWORK.TESTNET]: "https://api.web3auth.io/signer-service",
6757
[TORUS_LEGACY_NETWORK.CYAN]: "https://api.web3auth.io/signer-polygon-service",
6858
[TORUS_LEGACY_NETWORK.AQUA]: "https://api.web3auth.io/signer-polygon-service",
69-
[TORUS_LEGACY_NETWORK.CELESTE]: "https://api.web3auth.io/signer-polygon-service",
7059
};
7160

7261
export const METADATA_MAP: Record<TORUS_LEGACY_NETWORK_TYPE, string> = {
7362
[TORUS_LEGACY_NETWORK.MAINNET]: "https://api.web3auth.io/metadata-service",
7463
[TORUS_LEGACY_NETWORK.TESTNET]: "https://api.web3auth.io/metadata-service",
7564
[TORUS_LEGACY_NETWORK.CYAN]: "https://api.web3auth.io/metadata-service",
7665
[TORUS_LEGACY_NETWORK.AQUA]: "https://api.web3auth.io/metadata-service",
77-
[TORUS_LEGACY_NETWORK.CELESTE]: "https://api.web3auth.io/metadata-service",
7866
};
7967

8068
// FND backend service
@@ -97,3 +85,5 @@ export const SIG_TYPE = {
9785
ED25519: "ed25519",
9886
BIP340: "bip340",
9987
} as const;
88+
89+
export const TEST_VERIFIERS = ["torus-test-health"];

packages/fetch-node-details/src/nodeDetailManager.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,22 +83,21 @@ class NodeDetailManager {
8383
};
8484
}
8585

86-
async getNodeDetails({ verifier, verifierId }: { verifier: string; verifierId: string }): Promise<INodeDetails> {
86+
async getNodeDetails({ verifier, verifierId, trackingId }: { verifier: string; verifierId: string; trackingId?: string }): Promise<INodeDetails> {
8787
try {
8888
if (this.updated && !MULTI_CLUSTER_NETWORKS.includes(this.network as TORUS_LEGACY_NETWORK_TYPE)) return this._nodeDetails;
8989

9090
try {
9191
const { nodeDetails } = await get<{ nodeDetails: INodeDetails }>(
92-
`${this.fndServerEndpoint}?network=${this.network}&verifier=${verifier}&verifierId=${verifierId}&keyType=${this._keyType}&sigType=${this._sigType}`
92+
`${this.fndServerEndpoint}?network=${this.network}&verifier=${verifier}&verifierId=${verifierId}&keyType=${this._keyType}&sigType=${this._sigType}&trackingId=${trackingId}`
9393
);
9494
this.setNodeDetails(nodeDetails);
95-
9695
return this._nodeDetails;
9796
} catch (error) {
9897
log.error("Failed to fetch node details from server, using local.", error);
9998
}
10099

101-
const nodeDetails = fetchLocalConfig(this.network as TORUS_NETWORK_TYPE, this._keyType, this._sigType);
100+
const nodeDetails = fetchLocalConfig(this.network as TORUS_NETWORK_TYPE, this._keyType, this._sigType, trackingId);
102101
if (!nodeDetails) throw new Error("Failed to fetch node details");
103102
this.setNodeDetails(nodeDetails);
104103
return this._nodeDetails;

packages/fetch-node-details/test/nodeDetail.test.ts

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@ describe("Fetch Node Details", function () {
1414
enableLogging: true,
1515
});
1616
const details = await nodeDetailManager.getNodeDetails({ verifier: "google", verifierId: "[email protected]" });
17+
1718
delete details.updated;
1819
const metadataUrl = await nodeDetailManager.getMetadataUrl();
19-
deepStrictEqual(details, getSapphireNodeDetails(TORUS_SAPPHIRE_NETWORK.SAPPHIRE_MAINNET, TORUS_LEGACY_NETWORK.MAINNET));
20+
const expectedDetails = getSapphireNodeDetails(TORUS_SAPPHIRE_NETWORK.SAPPHIRE_MAINNET, TORUS_LEGACY_NETWORK.MAINNET);
21+
deepStrictEqual(details, expectedDetails);
2022
strictEqual(metadataUrl, METADATA_MAP[TORUS_LEGACY_NETWORK.MAINNET]);
2123
});
2224

2325
it("#should return correct values - sapphire devnet", async function () {
26+
const trackingId = "eea55f6dede3377b63c3aa3e52cfc7345553f4af7125fb51062404f285afb407";
2427
const nodeDetailManager = new NodeDetailManager({
2528
network: TORUS_SAPPHIRE_NETWORK.SAPPHIRE_DEVNET,
2629
fndServerEndpoint,
@@ -29,7 +32,7 @@ describe("Fetch Node Details", function () {
2932
const details = await nodeDetailManager.getNodeDetails({ verifier: "google", verifierId: "[email protected]" });
3033
delete details.updated;
3134
const metadataUrl = await nodeDetailManager.getMetadataUrl();
32-
const compareNodeDetails = getSapphireNodeDetails(TORUS_SAPPHIRE_NETWORK.SAPPHIRE_DEVNET);
35+
const compareNodeDetails = getSapphireNodeDetails(TORUS_SAPPHIRE_NETWORK.SAPPHIRE_DEVNET, undefined, undefined, undefined, trackingId);
3336
deepStrictEqual(details, compareNodeDetails);
3437
strictEqual(metadataUrl, compareNodeDetails.torusNodeEndpoints[0].replace("/sss/jrpc", "/metadata"));
3538
});
@@ -74,20 +77,9 @@ describe("Fetch Node Details", function () {
7477
strictEqual(metadataUrl, METADATA_MAP[TORUS_LEGACY_NETWORK.AQUA]);
7578
});
7679

77-
it("#should return correct values - celeste", async function () {
78-
const nodeDetailManager = new NodeDetailManager({
79-
network: TORUS_LEGACY_NETWORK.CELESTE,
80-
fndServerEndpoint,
81-
enableLogging: true,
82-
});
83-
const details = await nodeDetailManager.getNodeDetails({ verifier: "google-celeste", verifierId: "[email protected]" });
84-
delete details.updated;
85-
const metadataUrl = await nodeDetailManager.getMetadataUrl();
86-
deepStrictEqual(details, getSapphireNodeDetails(TORUS_SAPPHIRE_NETWORK.SAPPHIRE_MAINNET, TORUS_LEGACY_NETWORK.CELESTE));
87-
strictEqual(metadataUrl, METADATA_MAP[TORUS_LEGACY_NETWORK.CELESTE]);
88-
});
89-
9080
it("#should return correct values - testnet", async function () {
81+
const trackingId = "26a8e90f2414039ac61398b6b3aa4bd4993f6f65cc81954c1a435b0789621343";
82+
9183
const nodeDetailManager = new NodeDetailManager({
9284
network: TORUS_LEGACY_NETWORK.TESTNET,
9385
fndServerEndpoint,
@@ -96,7 +88,10 @@ describe("Fetch Node Details", function () {
9688
const details = await nodeDetailManager.getNodeDetails({ verifier: "google-lrc", verifierId: "[email protected]" });
9789
delete details.updated;
9890
const metadataUrl = await nodeDetailManager.getMetadataUrl();
99-
deepStrictEqual(details, getSapphireNodeDetails(TORUS_SAPPHIRE_NETWORK.SAPPHIRE_DEVNET, TORUS_LEGACY_NETWORK.TESTNET));
91+
deepStrictEqual(
92+
details,
93+
getSapphireNodeDetails(TORUS_SAPPHIRE_NETWORK.SAPPHIRE_DEVNET, TORUS_LEGACY_NETWORK.TESTNET, undefined, undefined, trackingId)
94+
);
10095
strictEqual(metadataUrl, METADATA_MAP[TORUS_LEGACY_NETWORK.TESTNET]);
10196
});
10297

packages/fnd-base/src/endpoints.ts

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,40 +26,44 @@ export const SAPPHIRE_NETWORK_URLS: Record<TORUS_SAPPHIRE_NETWORK_TYPE, string[]
2626
],
2727
};
2828

29-
export const getSSSEndpoints = (sapphireNetwork: TORUS_SAPPHIRE_NETWORK_TYPE, legacyNetwork?: TORUS_LEGACY_NETWORK_TYPE) => {
29+
export const getSSSEndpoints = (sapphireNetwork: TORUS_SAPPHIRE_NETWORK_TYPE, legacyNetwork?: TORUS_LEGACY_NETWORK_TYPE, trackingId?: string) => {
3030
const endpoints = SAPPHIRE_NETWORK_URLS[sapphireNetwork];
3131
if (!endpoints || endpoints.length === 0) {
3232
throw new Error(`Unsupported network: ${sapphireNetwork}`);
3333
}
3434
const routeIdentifier = LEGACY_NETWORKS_ROUTE_MAP[legacyNetwork as TORUS_LEGACY_NETWORK_TYPE];
3535
return endpoints.map((e) => {
36+
let endpoint = new URL(`${e}/sss/jrpc`);
3637
if (routeIdentifier && routeIdentifier.networkIdentifier) {
37-
return `${e}/sss/${routeIdentifier.networkIdentifier}/jrpc`;
38+
endpoint = new URL(`${e}/sss/${routeIdentifier.networkIdentifier}/jrpc`);
3839
}
39-
return `${e}/sss/jrpc`;
40+
if (trackingId) {
41+
endpoint.searchParams.set("trackingId", trackingId);
42+
}
43+
return endpoint.href;
4044
});
4145
};
4246

43-
export const getRSSEndpoints = (sapphireNetwork: TORUS_SAPPHIRE_NETWORK_TYPE, legacyNetwork?: TORUS_LEGACY_NETWORK_TYPE) => {
47+
export const getRSSEndpoints = (sapphireNetwork: TORUS_SAPPHIRE_NETWORK_TYPE, trackingId?: string) => {
4448
const endpoints = SAPPHIRE_NETWORK_URLS[sapphireNetwork];
4549
if (!endpoints || endpoints.length === 0) {
4650
throw new Error(`Unsupported network: ${sapphireNetwork}`);
4751
}
48-
49-
const routeIdentifier = LEGACY_NETWORKS_ROUTE_MAP[legacyNetwork as TORUS_LEGACY_NETWORK_TYPE];
5052
return endpoints.map((e) => {
51-
if (routeIdentifier && routeIdentifier.networkIdentifier) {
52-
return `${e}/rss/${routeIdentifier.networkIdentifier}`;
53+
const endpoint = new URL(`${e}/rss`);
54+
55+
if (trackingId) {
56+
endpoint.searchParams.set("trackingId", trackingId);
5357
}
54-
return `${e}/rss`;
58+
return endpoint.href;
5559
});
5660
};
5761

5862
export const getTSSEndpoints = (
5963
sapphireNetwork: TORUS_SAPPHIRE_NETWORK_TYPE,
60-
legacyNetwork?: TORUS_LEGACY_NETWORK_TYPE,
6164
keyType = KEY_TYPE.SECP256K1 as WEB3AUTH_KEY_TYPE,
62-
sigType?: WEB3AUTH_SIG_TYPE
65+
sigType?: WEB3AUTH_SIG_TYPE,
66+
trackingId?: string
6367
) => {
6468
const endpoints = SAPPHIRE_NETWORK_URLS[sapphireNetwork];
6569
if (!endpoints || endpoints.length === 0) {
@@ -95,11 +99,11 @@ export const getTSSEndpoints = (
9599
throw new Error("Invalid key type");
96100
})();
97101

98-
const routeIdentifier = LEGACY_NETWORKS_ROUTE_MAP[legacyNetwork as TORUS_LEGACY_NETWORK_TYPE];
99102
return endpoints.map((e) => {
100-
if (routeIdentifier && routeIdentifier.networkIdentifier) {
101-
return `${e}/${tssPath}/${routeIdentifier.networkIdentifier}`;
103+
const endpoint = new URL(`${e}/${tssPath}`);
104+
if (trackingId) {
105+
endpoint.searchParams.set("trackingId", trackingId);
102106
}
103-
return `${e}/${tssPath}`;
107+
return endpoint.href;
104108
});
105109
};

packages/fnd-base/src/sapphireNetworkConfig.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,19 @@ export const getSapphireNodeDetails = (
77
sapphireNetwork: TORUS_SAPPHIRE_NETWORK_TYPE,
88
legacyNetwork?: TORUS_LEGACY_NETWORK_TYPE,
99
keyType?: WEB3AUTH_KEY_TYPE,
10-
sigType?: WEB3AUTH_SIG_TYPE
10+
sigType?: WEB3AUTH_SIG_TYPE,
11+
trackingId?: string
1112
): INodeDetails => {
1213
return {
1314
currentEpoch: "1",
1415

15-
torusNodeEndpoints: getSSSEndpoints(sapphireNetwork, legacyNetwork),
16+
torusNodeEndpoints: getSSSEndpoints(sapphireNetwork, legacyNetwork, trackingId),
1617

17-
torusNodeSSSEndpoints: getSSSEndpoints(sapphireNetwork, legacyNetwork),
18+
torusNodeSSSEndpoints: getSSSEndpoints(sapphireNetwork, legacyNetwork, trackingId),
1819

19-
torusNodeRSSEndpoints: getRSSEndpoints(sapphireNetwork, legacyNetwork),
20+
torusNodeRSSEndpoints: getRSSEndpoints(sapphireNetwork, trackingId),
2021

21-
torusNodeTSSEndpoints: getTSSEndpoints(sapphireNetwork, legacyNetwork, keyType, sigType),
22+
torusNodeTSSEndpoints: getTSSEndpoints(sapphireNetwork, keyType, sigType, trackingId),
2223
torusIndexes: [1, 2, 3, 4, 5],
2324

2425
torusNodePub: SAPPHIRE_NODE_PUB_KEYS[sapphireNetwork],

packages/fnd-base/src/utils.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,23 @@ import {
1212

1313
import { getSapphireNodeDetails } from "./sapphireNetworkConfig";
1414

15-
export function fetchLocalConfig(network: TORUS_NETWORK_TYPE, keyType: WEB3AUTH_KEY_TYPE, sigType?: WEB3AUTH_SIG_TYPE): INodeDetails | undefined {
15+
export function fetchLocalConfig(
16+
network: TORUS_NETWORK_TYPE,
17+
keyType: WEB3AUTH_KEY_TYPE,
18+
sigType?: WEB3AUTH_SIG_TYPE,
19+
trackingId?: string
20+
): INodeDetails | undefined {
1621
if (Object.values(TORUS_SAPPHIRE_NETWORK).includes(network as TORUS_SAPPHIRE_NETWORK_TYPE)) {
17-
return getSapphireNodeDetails(network as TORUS_SAPPHIRE_NETWORK_TYPE, undefined, keyType, sigType);
22+
const eps = getSapphireNodeDetails(network as TORUS_SAPPHIRE_NETWORK_TYPE, undefined, keyType, sigType, trackingId);
23+
return eps;
1824
}
1925

2026
if (Object.values(TORUS_LEGACY_NETWORK).includes(network as TORUS_LEGACY_NETWORK_TYPE)) {
2127
const legacyMap = LEGACY_NETWORKS_ROUTE_MAP[network as TORUS_LEGACY_NETWORK_TYPE];
22-
if (legacyMap.migrationCompleted) return getSapphireNodeDetails(legacyMap.networkMigratedTo, network as TORUS_LEGACY_NETWORK_TYPE, keyType);
28+
if (legacyMap.migrationCompleted) {
29+
const ep = getSapphireNodeDetails(legacyMap.networkMigratedTo, network as TORUS_LEGACY_NETWORK_TYPE, keyType, sigType, trackingId);
30+
return ep;
31+
}
2332
}
2433

2534
return undefined;

packages/fnd-server/src/router.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { celebrate, Joi } from "celebrate";
1212
import express, { Request, Response } from "express";
1313
import log from "loglevel";
1414

15+
import { getTrackingId } from "./utils/tracking";
16+
1517
const router = express.Router();
1618

1719
router.get("/", (_req: Request, res: Response) => {
@@ -38,17 +40,27 @@ router.get(
3840
sigType: Joi.string()
3941
.optional()
4042
.allow(...Object.values(SIG_TYPE)),
43+
trackingId: Joi.string().optional(),
4144
}),
4245
},
4346
{ allowUnknown: true }
4447
),
4548
async (req: Request, res: Response) => {
4649
try {
47-
const { network, keyType = KEY_TYPE.SECP256K1, sigType = SIG_TYPE.ECDSA_SECP256K1 } = req.query as Record<string, string>;
50+
const { network, verifier, verifierId, keyType = KEY_TYPE.SECP256K1, sigType = SIG_TYPE.ECDSA_SECP256K1 } = req.query as Record<string, string>;
4851
const finalNetwork = network.toLowerCase();
52+
let trackingId = req.query.trackingId as string;
53+
if (!trackingId || trackingId === "undefined") {
54+
// check if tracking is enabled by default
55+
trackingId = getTrackingId(verifier, verifierId, finalNetwork as TORUS_NETWORK_TYPE);
56+
}
4957
// use static details for sapphire mainnet and testnet
50-
const nodeDetails = fetchLocalConfig(finalNetwork as TORUS_NETWORK_TYPE, keyType as WEB3AUTH_KEY_TYPE, sigType as WEB3AUTH_SIG_TYPE);
51-
58+
const nodeDetails = fetchLocalConfig(
59+
finalNetwork as TORUS_NETWORK_TYPE,
60+
keyType as WEB3AUTH_KEY_TYPE,
61+
sigType as WEB3AUTH_SIG_TYPE,
62+
trackingId
63+
);
5264
return res.status(200).json({
5365
nodeDetails,
5466
success: true,
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { TEST_VERIFIERS, TORUS_LEGACY_NETWORK, TORUS_NETWORK_TYPE, TORUS_SAPPHIRE_NETWORK } from "@toruslabs/constants";
2+
import crypto from "crypto";
3+
const trackingEnabled = process.env.TRACKING_ENABLED;
4+
export const isTrackingEnabled = (verifier: string, network: TORUS_NETWORK_TYPE) => {
5+
if (
6+
trackingEnabled === "true" ||
7+
TEST_VERIFIERS.includes(verifier) ||
8+
network === TORUS_LEGACY_NETWORK.TESTNET ||
9+
network === TORUS_SAPPHIRE_NETWORK.SAPPHIRE_DEVNET
10+
) {
11+
return true;
12+
}
13+
return false;
14+
};
15+
16+
export const getTrackingId = (verifier: string, verifierId: string, network: TORUS_NETWORK_TYPE) => {
17+
if (!isTrackingEnabled(verifier, network)) {
18+
return undefined;
19+
}
20+
// hash the verifier and verifierId
21+
const hash = crypto.createHash("sha256").update(`${verifier.toLowerCase()}:${verifierId.toLowerCase()}`).digest("hex");
22+
return hash;
23+
};

0 commit comments

Comments
 (0)