Skip to content

Commit 2407129

Browse files
author
himanshu
committed
refactoring and test case fixes
1 parent 4e8d654 commit 2407129

14 files changed

+372
-72
lines changed

package-lock.json

+140
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"@types/json-stable-stringify": "^1.0.36",
4646
"@types/jsonwebtoken": "^9.0.5",
4747
"@types/mocha": "^10.0.6",
48+
"@types/sinon": "^17.0.3",
4849
"chai": "^4.3.10",
4950
"cross-env": "^7.0.3",
5051
"dotenv": "^16.3.1",
@@ -56,6 +57,7 @@
5657
"mocha": "^10.2.0",
5758
"prettier": "^3.1.0",
5859
"rimraf": "^5.0.5",
60+
"sinon": "^17.0.1",
5961
"ts-node": "^10.9.1",
6062
"typescript": "^5.3.2"
6163
},

src/helpers/common.ts

+22-3
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,36 @@
11
import { Ecies } from "@toruslabs/eccrypto";
22
import JsonStringify from "json-stable-stringify";
33

4-
import { EciesHex, VerifierLookupResponse } from "../interfaces";
4+
import { EciesHex, LegacyVerifierLookupResponse, VerifierLookupResponse } from "../interfaces";
55

66
// this function normalizes the result from nodes before passing the result to threshold check function
77
// For ex: some fields returns by nodes might be different from each other
88
// like created_at field might vary and nonce_data might not be returned by all nodes because
99
// of the metadata implementation in sapphire.
1010
export const normalizeKeysResult = (result: VerifierLookupResponse) => {
11-
const finalResult: Pick<VerifierLookupResponse, "keys" | "is_new_key" | "server_time_offset"> = {
11+
const finalResult: Pick<VerifierLookupResponse, "keys" | "is_new_key"> = {
1212
keys: [],
1313
is_new_key: result.is_new_key,
14-
server_time_offset: result.server_time_offset,
14+
};
15+
if (result && result.keys && result.keys.length > 0) {
16+
const finalKey = result.keys[0];
17+
finalResult.keys = [
18+
{
19+
pub_key_X: finalKey.pub_key_X,
20+
pub_key_Y: finalKey.pub_key_Y,
21+
address: finalKey.address,
22+
},
23+
];
24+
}
25+
return finalResult;
26+
};
27+
28+
// this function normalizes the result from nodes before passing the result to threshold check function
29+
// For ex: some fields returns by nodes might be different from each other
30+
// like key_index which may differ on sapphire_network for each queried node
31+
export const normalizeLegacyKeysResult = (result: LegacyVerifierLookupResponse) => {
32+
const finalResult: Pick<LegacyVerifierLookupResponse, "keys"> = {
33+
keys: [],
1534
};
1635
if (result && result.keys && result.keys.length > 0) {
1736
const finalKey = result.keys[0];

src/helpers/nodeUtils.ts

+24-4
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import {
2727
} from "../interfaces";
2828
import log from "../loglevel";
2929
import { Some } from "../some";
30-
import { kCombinations, normalizeKeysResult, thresholdSame } from "./common";
30+
import { kCombinations, normalizeKeysResult, normalizeLegacyKeysResult, thresholdSame } from "./common";
3131
import { generateAddressFromPrivKey, generateAddressFromPubKey, keccak256 } from "./keyUtils";
3232
import { lagrangeInterpolation } from "./langrangeInterpolatePoly";
3333
import { decryptNodeData, getMetadata, getOrSetNonce } from "./metadataUtils";
@@ -93,6 +93,7 @@ export const GetPubKeyOrKeyAssign = async (params: {
9393
}
9494
}
9595

96+
const serverTimeOffsets: number[] = [];
9697
// nonceResult must exist except for extendedVerifierId and legacy networks along with keyResult
9798
if ((keyResult && (nonceResult || extendedVerifierId || LEGACY_NETWORKS_ROUTE_MAP[network as TORUS_LEGACY_NETWORK_TYPE])) || errorResult) {
9899
if (keyResult) {
@@ -106,10 +107,14 @@ export const GetPubKeyOrKeyAssign = async (params: {
106107
const nodeIndex = parseInt(x1.result.node_index);
107108
if (nodeIndex) nodeIndexes.push(nodeIndex);
108109
}
110+
const serverTimeOffset = x1.result.server_time_offset ? parseInt(x1.result.server_time_offset, 10) : 0;
111+
serverTimeOffsets.push(serverTimeOffset);
109112
}
110113
});
111114
}
112-
return Promise.resolve({ keyResult, nodeIndexes, errorResult, nonceResult });
115+
116+
const serverTimeOffset = Math.max(...serverTimeOffsets);
117+
return Promise.resolve({ keyResult, serverTimeOffset, nodeIndexes, errorResult, nonceResult });
113118
}
114119
return Promise.reject(
115120
new Error(
@@ -643,6 +648,7 @@ export async function retrieveOrImportShare(params: {
643648
nonce: metadataNonce,
644649
typeOfUser,
645650
upgraded: isUpgraded,
651+
serverTimeOffset: serverTimeOffsetResponse,
646652
},
647653
nodesData: {
648654
nodeIndexes: nodeIndexes.map((x) => x.toNumber()),
@@ -669,11 +675,25 @@ export const legacyKeyLookup = async (endpoints: string[], verifier: string, ver
669675
~~(endpoints.length / 2) + 1
670676
);
671677
const keyResult = thresholdSame(
672-
lookupShares.map((x3) => x3 && x3.result),
678+
lookupShares.map((x3) => x3 && normalizeLegacyKeysResult(x3.result)),
673679
~~(endpoints.length / 2) + 1
674680
);
681+
682+
const serverTimeOffsets: number[] = [];
683+
// nonceResult must exist except for extendedVerifierId and legacy networks along with keyResult
684+
if (keyResult) {
685+
lookupResults.forEach((x1) => {
686+
if (x1 && x1.result) {
687+
const timeOffSet = x1.result.server_time_offset;
688+
const serverTimeOffset = timeOffSet ? parseInt(timeOffSet, 10) : 0;
689+
serverTimeOffsets.push(serverTimeOffset);
690+
}
691+
});
692+
}
693+
694+
const serverTimeOffset = Math.max(...serverTimeOffsets);
675695
if (keyResult || errorResult) {
676-
return Promise.resolve({ keyResult, errorResult });
696+
return Promise.resolve({ keyResult, errorResult, serverTimeOffset });
677697
}
678698
return Promise.reject(new Error(`invalid results ${JSON.stringify(lookupResults)}`));
679699
});

src/interfaces.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,13 @@ export interface JRPCResponse<T> {
7777
export interface LegacyKeyLookupResult {
7878
keyResult: Pick<LegacyVerifierLookupResponse, "keys" | "server_time_offset">;
7979
errorResult: JRPCResponse<LegacyVerifierLookupResponse>["error"];
80+
serverTimeOffset: number;
8081
}
8182

8283
export interface KeyLookupResult {
83-
keyResult: Pick<VerifierLookupResponse, "keys" | "is_new_key" | "server_time_offset">;
84+
keyResult: Pick<VerifierLookupResponse, "keys" | "is_new_key">;
8485
nodeIndexes: number[];
86+
serverTimeOffset: number;
8587
errorResult: JRPCResponse<VerifierLookupResponse>["error"];
8688
nonceResult?: GetOrSetNonceResult;
8789
}
@@ -136,6 +138,7 @@ export interface KeyAssignment {
136138

137139
export interface LegacyShareRequestResult {
138140
keys: LegacyKeyAssignment[];
141+
server_time_offset?: string;
139142
}
140143

141144
export interface ShareRequestResult {
@@ -186,6 +189,7 @@ export interface TorusPublicKey {
186189
nonce?: BN;
187190
typeOfUser: UserType;
188191
upgraded: boolean | null;
192+
serverTimeOffset: number;
189193
};
190194
nodesData: {
191195
nodeIndexes: number[];

0 commit comments

Comments
 (0)