Skip to content

Commit 836c919

Browse files
authored
Merge pull request #1 from ava-labs/feat/replace-set-usages
Replace set usage with unique function
2 parents 778aa98 + 702b24a commit 836c919

10 files changed

Lines changed: 54 additions & 30 deletions

File tree

packages/core/src/controllers/pairing.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
isExpired,
2626
parseExpirerTarget,
2727
TYPE_1,
28+
unique,
2829
} from "@walletconnect/utils";
2930
import {
3031
formatJsonRpcRequest,
@@ -90,7 +91,7 @@ export class Pairing implements IPairing {
9091

9192
public register: IPairing["register"] = ({ methods }) => {
9293
this.isInitialized();
93-
this.registeredMethods = [...new Set([...this.registeredMethods, ...methods])];
94+
this.registeredMethods = [...unique([...this.registeredMethods, ...methods])];
9495
};
9596

9697
public create: IPairing["create"] = async (params) => {

packages/sign-client/src/controllers/engine.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ import {
109109
getNamespacesChains,
110110
getNamespacesMethods,
111111
getNamespacesEvents,
112+
unique,
112113
} from "@walletconnect/utils";
113114
import EventEmmiter from "events";
114115
import {
@@ -1015,7 +1016,7 @@ export class Engine extends IEngine {
10151016
eip155: {
10161017
chains,
10171018
// request `personal_sign` method by default to allow for fallback siwe
1018-
methods: [...new Set(["personal_sign", ...methods])],
1019+
methods: [...unique(["personal_sign", ...methods])],
10191020
events: ["chainChanged", "accountsChanged"],
10201021
},
10211022
};
@@ -1128,8 +1129,8 @@ export class Engine extends IEngine {
11281129
relay: { protocol: "irn" },
11291130
pairingTopic,
11301131
namespaces: buildNamespacesFromAuth(
1131-
[...new Set(approvedMethods)],
1132-
[...new Set(approvedAccounts)],
1132+
[...unique(approvedMethods)],
1133+
[...unique(approvedAccounts)],
11331134
),
11341135
transportType,
11351136
};
@@ -1337,8 +1338,8 @@ export class Engine extends IEngine {
13371338
relay: { protocol: "irn" },
13381339
pairingTopic: pendingRequest.pairingTopic,
13391340
namespaces: buildNamespacesFromAuth(
1340-
[...new Set(approvedMethods)],
1341-
[...new Set(approvedAccounts)],
1341+
[...unique(approvedMethods)],
1342+
[...unique(approvedAccounts)],
13421343
),
13431344
transportType,
13441345
};
@@ -3184,7 +3185,7 @@ export class Engine extends IEngine {
31843185
}
31853186

31863187
// ----- reject multi namespaces ----- //
3187-
const uniqueNamespaces = [...new Set(chains.map((chain) => parseChainId(chain).namespace))];
3188+
const uniqueNamespaces = [...unique(chains.map((chain) => parseChainId(chain).namespace))];
31883189
if (uniqueNamespaces.length > 1) {
31893190
throw new Error(
31903191
"Multi-namespace requests are not supported. Please request single namespace only.",

packages/utils/src/cacao.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AuthTypes } from "@walletconnect/types";
2-
import { getCommonValuesInArrays } from "./misc.js";
2+
import { getCommonValuesInArrays, unique } from "./misc.js";
33
import { verifySignature } from "./signatures.js";
44
const didPrefix = "did:pkh:";
55
const NAMESPACE_DISPLAY_NAMES = {
@@ -408,7 +408,7 @@ export function getChainsFromRecap(recap: string) {
408408
}
409409
});
410410
});
411-
return [...new Set(chains.flat())];
411+
return [...unique(chains.flat())];
412412
}
413413

414414
export function buildRecapStatement(statement: string, recap: unknown) {

packages/utils/src/misc.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,22 @@ export function engineEvent(event: EngineTypes.Event, id?: number | string | und
417417
}
418418

419419
export function mergeArrays<T>(a: T[] = [], b: T[] = []): T[] {
420-
return [...new Set([...a, ...b])];
420+
return [...unique([...a, ...b])];
421+
}
422+
423+
export function unique<T>(arr: T[] = []) {
424+
const seen = Object.create(null);
425+
const out: T[] = [];
426+
for (let i = 0, len = arr.length; i < len; i++) {
427+
const val = arr[i];
428+
// key must be string — handles numbers, strings, booleans fine
429+
const key = typeof val + val;
430+
if (seen[key] === undefined) {
431+
seen[key] = true;
432+
out.push(val);
433+
}
434+
}
435+
return out;
421436
}
422437

423438
export async function handleDeeplinkRedirect({

packages/utils/src/namespaces.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ProposalTypes, SessionTypes } from "@walletconnect/types";
2-
import { mergeArrays } from "./misc.js";
2+
import { mergeArrays, unique } from "./misc.js";
33
import { isConformingNamespaces, isValidNamespaces, isValidObject } from "./validators.js";
44

55
export function getAccountsChains(accounts: SessionTypes.Namespace["accounts"]) {
@@ -18,23 +18,23 @@ export function getNamespacesChains(namespaces: SessionTypes.Namespaces) {
1818
chains.push(...getAccountsChains(namespace.accounts));
1919
});
2020

21-
return [...new Set(chains)];
21+
return [...unique(chains)];
2222
}
2323

2424
export function getNamespacesMethods(namespaces: SessionTypes.Namespaces) {
2525
const methods: SessionTypes.Namespace["methods"] = [];
2626
Object.values(namespaces).forEach((namespace) => {
2727
methods.push(...namespace.methods);
2828
});
29-
return [...new Set(methods)];
29+
return [...unique(methods)];
3030
}
3131

3232
export function getNamespacesEvents(namespaces: SessionTypes.Namespaces) {
3333
const events: SessionTypes.Namespace["events"] = [];
3434
Object.values(namespaces).forEach((namespace) => {
3535
events.push(...namespace.events);
3636
});
37-
return [...new Set(events)];
37+
return [...unique(events)];
3838
}
3939

4040
export function getNamespacesMethodsForChainId(

packages/utils/src/validators.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
getAccountsChains,
88
} from "./namespaces.js";
99
import { getSdkError, getInternalError } from "./errors.js";
10-
import { fromBase64, hasOverlap } from "./misc.js";
10+
import { fromBase64, hasOverlap, unique } from "./misc.js";
1111
import { getChainsFromNamespace } from "./caip.js";
1212

1313
export type ErrorObject = { message: string; code: number } | null;
@@ -469,7 +469,7 @@ function parseNamespaces(namespaces: ProposalTypes.RequiredNamespaces) {
469469

470470
function filterDuplicateNamespaces(namespaces: string[]) {
471471
return [
472-
...new Set(
472+
...unique(
473473
namespaces.map((namespace) =>
474474
namespace.includes(":") ? namespace.split(":")[0] : namespace,
475475
),

providers/ethereum-provider/src/EthereumProvider.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { EventEmitter } from "events";
2-
import { getAccountsFromNamespaces, getSdkError, isValidArray } from "@walletconnect/utils";
2+
import { getAccountsFromNamespaces, getSdkError, isValidArray, unique } from "@walletconnect/utils";
33
import { KeyValueStorageOptions } from "@walletconnect/keyvaluestorage";
44
import {
55
IEthereumProvider as IProvider,
@@ -165,17 +165,17 @@ export function buildNamespaces(params: NamespacesParams): {
165165

166166
const optional: Namespace = {
167167
chains: [
168-
...new Set(
168+
...unique(
169169
shouldIncludeRequiredChains ? required.chains.concat(optionalChains || []) : optionalChains,
170170
),
171171
],
172172
methods: [
173-
...new Set(
173+
...unique(
174174
required.methods.concat(optionalMethods?.length ? optionalMethods : OPTIONAL_METHODS),
175175
),
176176
],
177177
events: [
178-
...new Set(required.events.concat(optionalEvents?.length ? optionalEvents : OPTIONAL_EVENTS)),
178+
...unique(required.events.concat(optionalEvents?.length ? optionalEvents : OPTIONAL_EVENTS)),
179179
],
180180
rpcMap,
181181
};
@@ -607,7 +607,7 @@ export class EthereumProvider implements IEthereumProvider {
607607
const { convertWCMToAppKitOptions } = await import("./wcmToAppKit.js");
608608
const options = convertWCMToAppKitOptions({
609609
...this.rpc.qrModalOptions,
610-
chains: [...new Set([...this.rpc.chains, ...this.rpc.optionalChains])],
610+
chains: [...unique([...this.rpc.chains, ...this.rpc.optionalChains])],
611611
metadata: this.rpc.metadata,
612612
projectId: this.rpc.projectId,
613613
});

providers/universal-provider/src/UniversalProvider.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import { SignClient } from "@walletconnect/sign-client";
22
import { SessionTypes } from "@walletconnect/types";
33
import { JsonRpcResult } from "@walletconnect/jsonrpc-types";
4-
import { createLogger, getSdkError, isValidArray, parseNamespaceKey } from "@walletconnect/utils";
4+
import {
5+
createLogger,
6+
getSdkError,
7+
isValidArray,
8+
parseNamespaceKey,
9+
unique,
10+
} from "@walletconnect/utils";
511
import { Logger } from "@walletconnect/logger";
612

713
import {
@@ -313,7 +319,7 @@ export class UniversalProvider implements IUniversalProvider {
313319
}
314320

315321
const providersToCreate = [
316-
...new Set(
322+
...unique(
317323
Object.keys(this.session.namespaces).map((namespace) => parseNamespaceKey(namespace)),
318324
),
319325
];

providers/universal-provider/src/providers/eip155.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
} from "../utils/index.js";
2626
import EventEmitter from "events";
2727
import { BUNDLER_URL, PROVIDER_EVENTS } from "../constants/index.js";
28+
import { unique } from "@walletconnect/utils";
2829

2930
class Eip155Provider implements IProvider {
3031
public name = "eip155";
@@ -139,7 +140,7 @@ class Eip155Provider implements IProvider {
139140
return [];
140141
}
141142
return [
142-
...new Set(
143+
...unique(
143144
accounts
144145
// get the accounts from the active chain
145146
.filter((account) => account.split(":")[1] === this.chainId.toString())

providers/universal-provider/src/providers/generic.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
SubProviderOpts,
1313
} from "../types/index.js";
1414
import { getGlobal, getRpcUrl } from "../utils/index.js";
15-
import { parseChainId } from "@walletconnect/utils";
15+
import { parseChainId, unique } from "@walletconnect/utils";
1616

1717
class GenericProvider implements IProvider {
1818
public name = GENERIC_SUBPROVIDER_NAME;
@@ -33,16 +33,16 @@ class GenericProvider implements IProvider {
3333

3434
public updateNamespace(namespace: SessionTypes.Namespace) {
3535
this.namespace.chains = [
36-
...new Set((this.namespace.chains || []).concat(namespace.chains || [])),
36+
...unique((this.namespace.chains || []).concat(namespace.chains || [])),
3737
];
3838
this.namespace.accounts = [
39-
...new Set((this.namespace.accounts || []).concat(namespace.accounts || [])),
39+
...unique((this.namespace.accounts || []).concat(namespace.accounts || [])),
4040
];
4141
this.namespace.methods = [
42-
...new Set((this.namespace.methods || []).concat(namespace.methods || [])),
42+
...unique((this.namespace.methods || []).concat(namespace.methods || [])),
4343
];
4444
this.namespace.events = [
45-
...new Set((this.namespace.events || []).concat(namespace.events || [])),
45+
...unique((this.namespace.events || []).concat(namespace.events || [])),
4646
];
4747
this.httpProviders = this.createHttpProviders();
4848
}
@@ -97,7 +97,7 @@ class GenericProvider implements IProvider {
9797
}
9898

9999
return [
100-
...new Set(
100+
...unique(
101101
accounts
102102
// get the accounts from the active chain
103103
.filter((account) => account.split(":")[1] === this.chainId.toString())

0 commit comments

Comments
 (0)