@ledgerhq/vault-common 2.1.1 → 2.1.2

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.
Files changed (42) hide show
  1. package/.turbo/turbo-build.log +20 -60
  2. package/CHANGELOG.md +6 -0
  3. package/package.json +8 -9
  4. package/tsup.config.ts +1 -1
  5. package/lib/chunk-54MXA3ZY.mjs +0 -14
  6. package/lib/chunk-54MXA3ZY.mjs.map +0 -1
  7. package/lib/chunk-6TT6A6YA.mjs +0 -1176
  8. package/lib/chunk-6TT6A6YA.mjs.map +0 -1
  9. package/lib/chunk-HU7O2ZFW.mjs +0 -249
  10. package/lib/chunk-HU7O2ZFW.mjs.map +0 -1
  11. package/lib/chunk-J5LGTIGS.mjs +0 -10
  12. package/lib/chunk-J5LGTIGS.mjs.map +0 -1
  13. package/lib/chunk-MNUHUKY3.mjs +0 -503
  14. package/lib/chunk-MNUHUKY3.mjs.map +0 -1
  15. package/lib/chunk-QNNV5GBH.mjs +0 -1261
  16. package/lib/chunk-QNNV5GBH.mjs.map +0 -1
  17. package/lib/chunk-VOB7PA3G.mjs +0 -97
  18. package/lib/chunk-VOB7PA3G.mjs.map +0 -1
  19. package/lib/chunk-ZJCMYPBL.mjs +0 -83
  20. package/lib/chunk-ZJCMYPBL.mjs.map +0 -1
  21. package/lib/createHSMBridge.d.mts +0 -27
  22. package/lib/createHSMBridge.mjs +0 -10
  23. package/lib/createHSMBridge.mjs.map +0 -1
  24. package/lib/crypto/utils.d.mts +0 -14
  25. package/lib/crypto/utils.mjs +0 -12
  26. package/lib/crypto/utils.mjs.map +0 -1
  27. package/lib/index-Cm_O9VIx.d.mts +0 -2010
  28. package/lib/index.d.mts +0 -161
  29. package/lib/index.mjs +0 -3252
  30. package/lib/index.mjs.map +0 -1
  31. package/lib/recipeManifest.d.mts +0 -6
  32. package/lib/recipeManifest.mjs +0 -11
  33. package/lib/recipeManifest.mjs.map +0 -1
  34. package/lib/reviewAPIRequest.d.mts +0 -20
  35. package/lib/reviewAPIRequest.mjs +0 -11
  36. package/lib/reviewAPIRequest.mjs.map +0 -1
  37. package/lib/types/index.d.mts +0 -6
  38. package/lib/types/index.mjs +0 -10
  39. package/lib/types/index.mjs.map +0 -1
  40. package/lib/utils.d.mts +0 -29
  41. package/lib/utils.mjs +0 -38
  42. package/lib/utils.mjs.map +0 -1
@@ -1,503 +0,0 @@
1
- import {
2
- deserializeUnitValue,
3
- getCryptoCurrencyById,
4
- getDefaultUsername,
5
- unwrapConnection
6
- } from "./chunk-QNNV5GBH.mjs";
7
-
8
- // src/recipeManifest.ts
9
- import invariant from "invariant";
10
- import keyBy from "lodash/keyBy";
11
- import sortBy from "lodash/sortBy";
12
- var ADMIN_START_DEVICE_INDEX = 4;
13
- var DEFAULT_ADMINS_COUNT = 3;
14
- var NB_SHARED_OWNERS = 3;
15
- var getDeviceIndex = (index) => {
16
- const n = ADMIN_START_DEVICE_INDEX + index;
17
- if (n < ADMIN_START_DEVICE_INDEX + NB_SHARED_OWNERS) {
18
- return n;
19
- }
20
- return n + NB_SHARED_OWNERS;
21
- };
22
- async function recipeManifest(pool, options = {}) {
23
- const adminDevices = await pool.getOnboardingAdminDevices();
24
- const admin = await pool.login(adminDevices[0][1]);
25
- const [
26
- organization,
27
- pendingUserRequestsConnection,
28
- usersConnection,
29
- groupsConnection,
30
- accountsConnection,
31
- vaultEntitiesConnection,
32
- whitelistsConnection,
33
- exchangesConnection,
34
- policiesConnection,
35
- tradelinkCustodianConnection,
36
- tradelinkHSMCustodianConnection,
37
- tradelinkExchangeConnection,
38
- tradelinkHSMExchangeConnection,
39
- tradelinkHSMAssetManagerConnection,
40
- tradelinkAssetManagerConnection,
41
- tradelinkNetwork,
42
- tradelinkOnboardingStatus,
43
- allWorkspaceRulesConnection
44
- ] = await Promise.all([
45
- admin.network("GET", "/organization"),
46
- admin.network(
47
- "GET",
48
- `/requests?type=CREATE_ADMIN&type=CREATE_OPERATOR&type=CREATE_API_USER&status=PENDING_REGISTRATION&status=PENDING_APPROVAL`
49
- ).catch(
50
- /* istanbul ignore next */
51
- () => ({
52
- edges: [],
53
- pageInfo: { hasNextPage: false, count: 0 }
54
- })
55
- ),
56
- admin.network(
57
- "GET",
58
- "/people?status=ACTIVE&status=ACCESS_SUSPENDED&role=ADMIN&role=OPERATOR&pageSize=-1"
59
- ),
60
- admin.network("GET", "/groups?pageSize=-1"),
61
- admin.network(
62
- "GET",
63
- "/accounts?status=ACTIVE&status=APPROVED&status=PENDING&status=VIEW_ONLY&pageSize=-1"
64
- ),
65
- admin.network("GET", "/entities?pageSize=-1"),
66
- admin.network("GET", "/whitelists?pageSize=-1"),
67
- admin.network("GET", "/exchanges?pageSize=-1").catch(
68
- /* istanbul ignore next */
69
- () => ({
70
- edges: [],
71
- pageInfo: { hasNextPage: false, count: 0 }
72
- })
73
- ),
74
- admin.network("GET", "/policies?pageSize=-1").catch(
75
- /* istanbul ignore next */
76
- () => ({
77
- edges: [],
78
- pageInfo: { hasNextPage: false, count: 0 }
79
- })
80
- ),
81
- admin.network("GET", "/tradelink/custodians").catch(
82
- /* istanbul ignore next */
83
- () => ({
84
- edges: [],
85
- pageInfo: { hasNextPage: false, count: 0 }
86
- })
87
- ),
88
- admin.network("GET", "/tradelink/hsm-custodians").catch(
89
- /* istanbul ignore next */
90
- () => ({
91
- edges: [],
92
- pageInfo: { hasNextPage: false, count: 0 }
93
- })
94
- ),
95
- admin.network("GET", "/tradelink/exchanges").catch(
96
- /* istanbul ignore next */
97
- () => ({
98
- edges: [],
99
- pageInfo: { hasNextPage: false, count: 0 }
100
- })
101
- ),
102
- admin.network("GET", "/tradelink/hsm-exchanges").catch(
103
- /* istanbul ignore next */
104
- () => ({
105
- edges: [],
106
- pageInfo: { hasNextPage: false, count: 0 }
107
- })
108
- ),
109
- admin.network("GET", "/tradelink/hsm-asset-managers").catch(
110
- /* istanbul ignore next */
111
- () => ({
112
- edges: [],
113
- pageInfo: { hasNextPage: false, count: 0 }
114
- })
115
- ),
116
- admin.network("GET", "/tradelink/asset_managers").catch(
117
- /* istanbul ignore next */
118
- () => ({
119
- edges: [],
120
- pageInfo: { hasNextPage: false, count: 0 }
121
- })
122
- ),
123
- admin.network("GET", "/tradelink/network").catch(
124
- /* istanbul ignore next */
125
- () => ({
126
- id: "",
127
- asset_managers: [],
128
- custodian: {
129
- approver_group_id: 0,
130
- code: "",
131
- id: "",
132
- logo_url: "",
133
- name: "",
134
- whitelist_id: 0
135
- },
136
- exchanges: []
137
- })
138
- ),
139
- admin.network("GET", "/tradelink/onboarding").catch(
140
- /* istanbul ignore next */
141
- () => ({ status: "NOT_READY" })
142
- ),
143
- admin.network("GET", "/workspace-rules").catch(
144
- /* istanbul ignore next */
145
- () => ({
146
- edges: [],
147
- pageInfo: { count: 0, hasNextPage: false }
148
- })
149
- )
150
- ]);
151
- const pendingUserRequests = unwrapConnection(pendingUserRequestsConnection);
152
- const users = sortBy(unwrapConnection(usersConnection), "id");
153
- const groups = unwrapConnection(groupsConnection);
154
- const whitelists = unwrapConnection(whitelistsConnection);
155
- const accounts = sortBy(unwrapConnection(accountsConnection), "index");
156
- const vaultEntities = unwrapConnection(vaultEntitiesConnection);
157
- const exchanges = unwrapConnection(exchangesConnection);
158
- const policies = unwrapConnection(policiesConnection);
159
- const tradelinkCustodians = unwrapConnection(
160
- tradelinkCustodianConnection
161
- );
162
- const tradelinkHSMCustodians = unwrapConnection(tradelinkHSMCustodianConnection);
163
- const tradelinkExchanges = unwrapConnection(
164
- tradelinkExchangeConnection
165
- );
166
- const tradelinkHSMExchanges = unwrapConnection(
167
- tradelinkHSMExchangeConnection
168
- );
169
- const tradelinkHSMAssetManagers = unwrapConnection(
170
- tradelinkHSMAssetManagerConnection
171
- );
172
- const tradelinkAssetManagers = unwrapConnection(
173
- tradelinkAssetManagerConnection
174
- );
175
- const allWorkspaceRules = unwrapConnection(allWorkspaceRulesConnection);
176
- const rootWorkspaceRule = allWorkspaceRules.find((r) => r.permission === "ROOT") ?? null;
177
- const apiAdminWorkspaceRules = allWorkspaceRules.filter((r) => r.permission !== "ROOT");
178
- const groupsByName = keyBy(groups, (group) => group.name);
179
- const whitelistsByName = keyBy(whitelists, (w) => w.name);
180
- const accountsByName = keyBy(accounts, (a) => a.name);
181
- const vaultEntitiesByName = keyBy(vaultEntities, (e) => e.name);
182
- const exchangesByName = keyBy(exchanges, (e) => e.name);
183
- const policiesByName = keyBy(policies, (e) => e.name);
184
- const tradelinkCustodiansByName = keyBy(tradelinkCustodians, (e) => e.name);
185
- const tradelinkHSMCustodiansByName = keyBy(
186
- tradelinkHSMCustodians,
187
- (e) => e.network.custodian.name
188
- );
189
- const tradelinkExchangesByName = keyBy(tradelinkExchanges, (e) => e.name);
190
- const tradelinkHSMExchangesByName = keyBy(tradelinkHSMExchanges, (e) => e.hsm_data.name);
191
- const tradelinkHSMAssetManagersByName = keyBy(tradelinkHSMAssetManagers, (e) => e.hsm_data.name);
192
- const tradelinkAssetManagersByName = keyBy(tradelinkAssetManagers, (e) => e.name);
193
- const {
194
- admins: _admins,
195
- operators,
196
- apiUsers,
197
- apiV2Users
198
- } = users.reduce(
199
- (acc, curr, index) => (
200
- // @ts-ignore
201
- curr.device_type === "API" ? {
202
- ...acc,
203
- apiV2Users: [...acc.apiV2Users, { deviceIndex: curr.username, user: curr }]
204
- } : curr.role === "ADMIN" ? {
205
- ...acc,
206
- admins: [
207
- ...acc.admins,
208
- {
209
- deviceIndex: getDeviceIndex(index - countAPIUsersUntil(index, users)),
210
- user: curr
211
- }
212
- ]
213
- } : curr.device_type === "SOFT_PSD" ? {
214
- ...acc,
215
- apiUsers: [...acc.apiUsers, { deviceIndex: curr.username, user: curr }]
216
- } : {
217
- ...acc,
218
- operators: [
219
- ...acc.operators,
220
- {
221
- deviceIndex: getDeviceIndex(index - countAPIUsersUntil(index, users)),
222
- user: curr
223
- }
224
- ]
225
- }
226
- ),
227
- { admins: [], operators: [], apiUsers: [], apiV2Users: [] }
228
- );
229
- const operatorsDevicesByID = operators.reduce((acc, curr) => {
230
- return { ...acc, [curr.user.id]: curr.deviceIndex };
231
- }, {});
232
- const customUsernames = [..._admins, ...operators].reduce((acc, curr) => {
233
- if (getDefaultUsername(curr.user.role === "ADMIN" ? "admin" : "operator", curr.deviceIndex) === curr.user.username) {
234
- return acc;
235
- }
236
- return { ...acc, [curr.deviceIndex]: curr.user.username };
237
- }, {});
238
- const admins = _admins.filter((_, i) => i > DEFAULT_ADMINS_COUNT - 1);
239
- const usersManifest = {
240
- operators: operators.map((o) => o.deviceIndex),
241
- admins: admins.map((a) => a.deviceIndex),
242
- api: apiUsers.map(
243
- (a) => a.user.view_all_override ? {
244
- name: a.user.username,
245
- viewAll: true
246
- } : a.user.username
247
- ),
248
- apiV2: apiV2Users.map((a) => ({
249
- role: a.user.role,
250
- name: a.user.username,
251
- ...a.user.pub_key ? { publicKey: a.user.pub_key } : {},
252
- ...a.user.view_all_override ? { viewAll: true } : {}
253
- }))
254
- };
255
- const quorum = rootWorkspaceRule ? rootWorkspaceRule.steps[0].quorum : organization.quorum;
256
- const manifestWorkspaceRules = apiAdminWorkspaceRules.map((rule) => ({
257
- permission: rule.permission,
258
- steps: rule.steps.map((gateStep) => ({
259
- quorum: gateStep.quorum,
260
- users: gateStep.users.map((pubKey) => {
261
- const user = users.find((u) => u.pub_key === pubKey);
262
- invariant(
263
- user,
264
- `Can't find user with pub key ${pubKey} referenced in workspace rule ${rule.permission}`
265
- );
266
- return user.username;
267
- })
268
- }))
269
- })).filter((rule) => {
270
- return rule.steps.length > 0;
271
- });
272
- const fullManifest = {
273
- quorum: quorum === 2 ? void 0 : quorum,
274
- customUsernames,
275
- users: usersManifest,
276
- workspaceRules: manifestWorkspaceRules,
277
- groups: groups.filter((g) => g.status === "ACTIVE").map((g) => ({
278
- name: g.name,
279
- description: g.description,
280
- users: g.members.map((m) => m.is_api ? m.username : operatorsDevicesByID[m.id])
281
- })),
282
- whitelists: whitelists.filter((w) => w.status === "ACTIVE").map((w) => ({
283
- name: w.name,
284
- description: w.description,
285
- type: w.whitelist_type,
286
- addresses: w.addresses.map(
287
- (a) => ({
288
- name: a.name,
289
- address: a.address,
290
- currency: a.currency,
291
- destination_tags: a.destination_tags
292
- })
293
- )
294
- })),
295
- accounts: accounts.filter((a) => a.status === "ACTIVE").map((a) => ({
296
- name: a.name,
297
- currency: a.currency,
298
- ...options.saveAccountsTypes ? { accountType: a.account_type } : {},
299
- derivationMode: a.derivation_mode === "STANDARD" ? void 0 : a.derivation_mode,
300
- contractAddress: a.contract_address || void 0,
301
- ...options.saveAccountsIndexes ? { index: a.index } : {},
302
- ...a.parent ? {
303
- parentAccount: (() => {
304
- const parentAccount = accounts.find((acc) => acc.id === a.parent);
305
- if (!parentAccount) {
306
- throw new Error(`Can't find parent account with id ${a.parent}`);
307
- }
308
- if (parentAccount.status !== "ACTIVE") {
309
- return void 0;
310
- }
311
- return parentAccount.name;
312
- })()
313
- } : {},
314
- rules: extractRules(a.governance_rules, a.currency, operatorsDevicesByID),
315
- ...(() => {
316
- const config = {};
317
- if (a.nfts_gallery_enabled) {
318
- config.nftGallery = true;
319
- }
320
- const hasConfig = Object.keys(config).length > 0;
321
- return hasConfig ? { config } : {};
322
- })()
323
- })),
324
- entities: vaultEntities.filter((e) => e.status === "ACTIVE").map((e) => ({
325
- name: e.name,
326
- accounts: e.accounts.map((a) => a.name)
327
- })),
328
- exchanges: exchanges.filter((e) => e.status === "ACTIVE").map(
329
- (e) => ({
330
- name: e.name,
331
- platform: e.platform,
332
- configuration: {
333
- apiKey: "<not-retrievable>",
334
- apiSecret: "<not-retrievable>"
335
- }
336
- })
337
- ),
338
- policies: policies.map((p) => {
339
- return {
340
- name: p.name,
341
- currency: p.currency,
342
- rules: extractRules(p.governance_rules, p.currency, operatorsDevicesByID),
343
- status: p.status
344
- };
345
- })
346
- };
347
- const manifest = pickNonEmpty(fullManifest);
348
- return {
349
- manifest,
350
- rawData: {
351
- pendingUserRequests,
352
- groupsByName,
353
- whitelistsByName,
354
- accountsByName,
355
- vaultEntitiesByName,
356
- usersWithDevice: [..._admins, ...operators, ...apiUsers],
357
- usersWithoutDevice: [...apiV2Users],
358
- exchangesByName,
359
- policiesByName,
360
- tradelinkCustodiansByName,
361
- tradelinkHSMCustodiansByName,
362
- tradelinkExchangesByName,
363
- tradelinkHSMExchangesByName,
364
- tradelinkHSMAssetManagersByName,
365
- tradelinkAssetManagersByName,
366
- tradelinkNetwork,
367
- tradelinkOnboardingStatus
368
- }
369
- };
370
- }
371
- function pickNonEmpty(obj) {
372
- const out = {};
373
- const keys = Object.keys(obj);
374
- for (let i = 0; i < keys.length; i++) {
375
- const key = keys[i];
376
- if (!key) throw new Error(`Invalid key at index ${i}`);
377
- const val = obj[key];
378
- const getSanitized = (val2) => {
379
- if (val2 === null) {
380
- return;
381
- } else if (Array.isArray(val2)) {
382
- const withoutEmpty = val2.map(getSanitized).filter((v) => v !== void 0);
383
- if (withoutEmpty.length > 0) {
384
- return withoutEmpty;
385
- }
386
- } else if (typeof val2 === "object") {
387
- const subObj = val2;
388
- const nonEmptyVal = pickNonEmpty(subObj);
389
- const nbKeys = Object.keys(nonEmptyVal).length;
390
- if (nbKeys > 0) {
391
- return nonEmptyVal;
392
- }
393
- } else if (val2 !== void 0) {
394
- return val2;
395
- }
396
- };
397
- const sanitized = getSanitized(val);
398
- if (sanitized !== void 0) {
399
- out[key] = sanitized;
400
- }
401
- }
402
- return out;
403
- }
404
- function extractRules(gateGovRules, _currency, operatorsDevicesByID) {
405
- const currency = getCryptoCurrencyById(_currency);
406
- const unit = currency.units[0];
407
- const governance_rules = gateGovRules || [];
408
- let rulesSets = governance_rules.map((r) => {
409
- const rules = r.rules.map((rule) => {
410
- if (rule.type === "THRESHOLD") {
411
- const thresholdRule = {
412
- type: "THRESHOLD",
413
- ...rule.data[0].min ? { min: deserializeUnitValue(unit, rule.data[0].min) } : {},
414
- ...rule.data[0].max ? { max: deserializeUnitValue(unit, rule.data[0].max) } : {}
415
- };
416
- return thresholdRule;
417
- }
418
- if (rule.type === "WHITELIST") {
419
- const whitelistRule = {
420
- type: "WHITELIST",
421
- whitelists: rule.data.map((d) => d.name)
422
- };
423
- return whitelistRule;
424
- }
425
- if (rule.type === "MULTI_AUTHORIZATIONS") {
426
- const multiAuthRule = {
427
- type: "MULTI_AUTHORIZATIONS",
428
- steps: rule.data.map((s) => ({
429
- quorum: s.quorum,
430
- ...s.group.is_internal ? {
431
- users: s.group.members.map((m) => {
432
- const u = m.is_api ? m.username : operatorsDevicesByID[m.id];
433
- if (!u) throw new Error(`Invalid user ${m}`);
434
- return u;
435
- })
436
- } : { group: s.group.name }
437
- }))
438
- };
439
- return multiAuthRule;
440
- }
441
- if (rule.type === "SMART_CONTRACT_INTERACTION") {
442
- const sciRule = {
443
- type: "SMART_CONTRACT_INTERACTION",
444
- enabled: rule.data[0].enabled
445
- };
446
- return sciRule;
447
- }
448
- if (rule.type === "TRANSACTION_FILTER") {
449
- switch (rule.data.preset) {
450
- case "TEZOS_DELEGATION":
451
- return { type: "TEZOS_DELEGATION" };
452
- case "POLKADOT_STAKING":
453
- return { type: "POLKADOT_STAKING" };
454
- case "SOLANA_STAKING":
455
- return { type: "SOLANA_STAKING" };
456
- case "CARDANO_STAKING":
457
- return { type: "CARDANO_STAKING" };
458
- case "RAW_SIGNING":
459
- return { type: "RAW_SIGNING" };
460
- case "CREATE_SPL_TOKEN_ACCOUNT":
461
- return { type: "CREATE_SPL_TOKEN_ACCOUNT" };
462
- case "TRANSFER_SPL_TOKEN":
463
- return {
464
- type: "TRANSFER_SPL_TOKEN",
465
- contractAddress: rule.data.contract_address
466
- };
467
- case "SEND":
468
- return null;
469
- case "STAKE":
470
- return { type: "STAKE" };
471
- case "MESSAGE_SIGNING":
472
- return { type: "MESSAGE_SIGNING" };
473
- case "DEPLOY_CONTRACT":
474
- return { type: "DEPLOY_CONTRACT" };
475
- }
476
- }
477
- throw new Error(`Unknown rule type ${rule.type}`);
478
- });
479
- return rules.filter(Boolean);
480
- });
481
- rulesSets = enforceSCIRuleIfNecessary(rulesSets);
482
- return rulesSets;
483
- }
484
- function enforceSCIRuleIfNecessary(rulesSets) {
485
- const hasSCIRulesSet = rulesSets.find(
486
- (rulesSet) => rulesSet.find((rule) => rule.type === "SMART_CONTRACT_INTERACTION" && rule.enabled)
487
- );
488
- if (!hasSCIRulesSet) return rulesSets;
489
- return rulesSets.map((rulesSet) => {
490
- const sciRule = rulesSet.find((r) => r.type === "SMART_CONTRACT_INTERACTION");
491
- if (sciRule) return rulesSet;
492
- return [...rulesSet, { type: "SMART_CONTRACT_INTERACTION", enabled: false }];
493
- });
494
- }
495
- function countAPIUsersUntil(index, users) {
496
- return users.slice(0, index).filter((u) => u.is_api).length;
497
- }
498
-
499
- export {
500
- getDeviceIndex,
501
- recipeManifest
502
- };
503
- //# sourceMappingURL=chunk-MNUHUKY3.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/recipeManifest.ts"],"sourcesContent":["import invariant from \"invariant\";\nimport keyBy from \"lodash/keyBy\";\nimport sortBy from \"lodash/sortBy\";\n\nimport { getCryptoCurrencyById } from \"./currencies\";\nimport {\n GateGovernanceRulesSet,\n GateTradelink,\n GateTradelinkAssetManager,\n GateTradelinkEntity,\n GateTradelinkExchange,\n GateTradelinkNetwork,\n GateTradelinkOnboardingStatus,\n GateWorkspacePermission,\n GateWorkspaceRule,\n ManifestAccountRuleCreateSplTokenAccount,\n ManifestAccountRuleTransferSplToken,\n ManifestWorkspaceRule,\n} from \"./types\";\nimport {\n Connection,\n DevicesPool,\n GateAccount,\n GateExchange,\n GateGroup,\n GatePolicy,\n GateUser,\n GateUserRequest,\n GateVaultEntity,\n GateWhitelist,\n Manifest,\n ManifestAccountConfig,\n ManifestAccountRule,\n ManifestAccountRuleCardanoStaking,\n ManifestAccountRuleDeployContract,\n ManifestAccountRuleMessageSigning,\n ManifestAccountRuleMultiAuth,\n ManifestAccountRulePolkadotStaking,\n ManifestAccountRuleRawSigning,\n ManifestAccountRuleSCI,\n ManifestAccountRuleSolanaStaking,\n ManifestAccountRuleStake,\n ManifestAccountRuleTezosDelegation,\n ManifestAccountRuleThreshold,\n ManifestAccountRuleWhitelist,\n ManifestExchange,\n ManifestPolicy,\n ManifestWhitelistAddress,\n Organization,\n UserWithDevice,\n UserWithoutDevice,\n} from \"./types\";\nimport { getDefaultUsername } from \"./utils\";\nimport { deserializeUnitValue, unwrapConnection } from \"./utils\";\n\nconst ADMIN_START_DEVICE_INDEX = 4;\nconst DEFAULT_ADMINS_COUNT = 3;\nconst NB_SHARED_OWNERS = 3;\n\nexport const getDeviceIndex = (index: number): number => {\n const n = ADMIN_START_DEVICE_INDEX + index;\n if (n < ADMIN_START_DEVICE_INDEX + NB_SHARED_OWNERS) {\n return n;\n }\n return n + NB_SHARED_OWNERS;\n};\n\nexport type GateGroupsByName = Record<string, GateGroup>;\nexport type GateWhitelistsByName = Record<string, GateWhitelist>;\nexport type GateAccountsByName = Record<string, GateAccount>;\nexport type GateVaultEntitiesByName = Record<string, GateVaultEntity>;\nexport type GateExchangesByName = Record<string, GateExchange>;\nexport type GatePoliciesByName = Record<string, GatePolicy>;\nexport type GateTradelinkCustodianByName = Record<string, GateTradelinkEntity<\"CUSTODIAN\">>;\nexport type GateTradelinkHSMCustodianByName = Record<string, GateTradelink>;\nexport type GateTradelinkExchangeByName = Record<string, GateTradelinkEntity<\"EXCHANGE\">>;\nexport type GateTradelinkHSMExchangeByName = Record<string, GateTradelinkExchange>;\nexport type GateTradelinkHSMAssetManagerByName = Record<string, GateTradelinkAssetManager>;\nexport type GateTradelinkAssetManagerByName = Record<string, GateTradelinkEntity<\"ASSET_MANAGER\">>;\n\nexport type RecipeRawData = {\n pendingUserRequests: GateUserRequest[];\n groupsByName: GateGroupsByName;\n whitelistsByName: GateWhitelistsByName;\n accountsByName: GateAccountsByName;\n vaultEntitiesByName: GateVaultEntitiesByName;\n exchangesByName: GateExchangesByName;\n policiesByName: GatePoliciesByName;\n usersWithDevice: UserWithDevice[];\n usersWithoutDevice: UserWithoutDevice[];\n tradelinkCustodiansByName: GateTradelinkCustodianByName;\n tradelinkHSMCustodiansByName: GateTradelinkHSMCustodianByName;\n tradelinkExchangesByName: GateTradelinkExchangeByName;\n tradelinkHSMExchangesByName: GateTradelinkHSMExchangeByName;\n tradelinkHSMAssetManagersByName: GateTradelinkHSMAssetManagerByName;\n tradelinkAssetManagersByName: GateTradelinkAssetManagerByName;\n tradelinkNetwork: GateTradelinkNetwork;\n tradelinkOnboardingStatus: GateTradelinkOnboardingStatus;\n};\n\nexport type RecipeManifestResult = {\n manifest: Manifest;\n rawData: RecipeRawData;\n};\n\nexport type RecipeManifestOptions = {\n saveAccountsIndexes?: boolean;\n saveAccountsTypes?: boolean;\n};\n\nexport default async function recipeManifest(\n pool: DevicesPool,\n options: RecipeManifestOptions = {},\n): Promise<RecipeManifestResult> {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const [\n organization,\n pendingUserRequestsConnection,\n usersConnection,\n groupsConnection,\n accountsConnection,\n vaultEntitiesConnection,\n whitelistsConnection,\n exchangesConnection,\n policiesConnection,\n tradelinkCustodianConnection,\n tradelinkHSMCustodianConnection,\n tradelinkExchangeConnection,\n tradelinkHSMExchangeConnection,\n tradelinkHSMAssetManagerConnection,\n tradelinkAssetManagerConnection,\n tradelinkNetwork,\n tradelinkOnboardingStatus,\n allWorkspaceRulesConnection,\n ] = await Promise.all([\n admin.network<Organization>(\"GET\", \"/organization\"),\n admin\n .network<Connection<GateUserRequest>>(\n \"GET\",\n `/requests?type=CREATE_ADMIN&type=CREATE_OPERATOR&type=CREATE_API_USER&status=PENDING_REGISTRATION&status=PENDING_APPROVAL`,\n )\n // for some reason this particular one can fail when targeting prod (not sure why)\n .catch(\n /* istanbul ignore next */ () => ({\n edges: [],\n pageInfo: { hasNextPage: false, count: 0 },\n }),\n ),\n admin.network<Connection<GateUser>>(\n \"GET\",\n \"/people?status=ACTIVE&status=ACCESS_SUSPENDED&role=ADMIN&role=OPERATOR&pageSize=-1\",\n ),\n admin.network<Connection<GateGroup>>(\"GET\", \"/groups?pageSize=-1\"),\n admin.network<Connection<GateAccount>>(\n \"GET\",\n \"/accounts?status=ACTIVE&status=APPROVED&status=PENDING&status=VIEW_ONLY&pageSize=-1\",\n ),\n admin.network<Connection<GateVaultEntity>>(\"GET\", \"/entities?pageSize=-1\"),\n admin.network<Connection<GateWhitelist>>(\"GET\", \"/whitelists?pageSize=-1\"),\n admin\n .network<Connection<GateExchange>>(\"GET\", \"/exchanges?pageSize=-1\")\n // handle case where /exchanges is not supported by Gate\n .catch(\n /* istanbul ignore next */ () => ({\n edges: [],\n pageInfo: { hasNextPage: false, count: 0 },\n }),\n ),\n admin\n .network<Connection<GatePolicy>>(\"GET\", \"/policies?pageSize=-1\")\n // handle case where /policies is not supported by Gate\n .catch(\n /* istanbul ignore next */ () => ({\n edges: [],\n pageInfo: { hasNextPage: false, count: 0 },\n }),\n ),\n admin\n .network<Connection<GateTradelinkEntity<\"CUSTODIAN\">>>(\"GET\", \"/tradelink/custodians\")\n .catch(\n /* istanbul ignore next */ () => ({\n edges: [],\n pageInfo: { hasNextPage: false, count: 0 },\n }),\n ),\n admin.network<Connection<GateTradelink>>(\"GET\", \"/tradelink/hsm-custodians\").catch(\n /* istanbul ignore next */ () => ({\n edges: [],\n pageInfo: { hasNextPage: false, count: 0 },\n }),\n ),\n\n admin.network<Connection<GateTradelinkEntity<\"EXCHANGE\">>>(\"GET\", \"/tradelink/exchanges\").catch(\n /* istanbul ignore next */ () => ({\n edges: [],\n pageInfo: { hasNextPage: false, count: 0 },\n }),\n ),\n admin.network<Connection<GateTradelinkExchange>>(\"GET\", \"/tradelink/hsm-exchanges\").catch(\n /* istanbul ignore next */ () => ({\n edges: [],\n pageInfo: { hasNextPage: false, count: 0 },\n }),\n ),\n admin\n .network<Connection<GateTradelinkAssetManager>>(\"GET\", \"/tradelink/hsm-asset-managers\")\n .catch(\n /* istanbul ignore next */ () => ({\n edges: [],\n pageInfo: { hasNextPage: false, count: 0 },\n }),\n ),\n admin\n .network<Connection<GateTradelinkEntity<\"ASSET_MANAGER\">>>(\"GET\", \"/tradelink/asset_managers\")\n .catch(\n /* istanbul ignore next */ () => ({\n edges: [],\n pageInfo: { hasNextPage: false, count: 0 },\n }),\n ),\n admin.network<GateTradelinkNetwork>(\"GET\", \"/tradelink/network\").catch(\n /* istanbul ignore next */ () => ({\n id: \"\",\n asset_managers: [],\n custodian: {\n approver_group_id: 0,\n code: \"\",\n id: \"\",\n logo_url: \"\",\n name: \"\",\n whitelist_id: 0,\n },\n exchanges: [],\n }),\n ),\n admin\n .network<GateTradelinkOnboardingStatus>(\"GET\", \"/tradelink/onboarding\")\n .catch(\n /* istanbul ignore next */ (): GateTradelinkOnboardingStatus => ({ status: \"NOT_READY\" }),\n ),\n admin.network<Connection<GateWorkspaceRule>>(\"GET\", \"/workspace-rules\").catch(\n /* istanbul ignore next */ (): Connection<GateWorkspaceRule> => ({\n edges: [],\n pageInfo: { count: 0, hasNextPage: false },\n }),\n ),\n ]);\n\n const pendingUserRequests: GateUserRequest[] = unwrapConnection(pendingUserRequestsConnection);\n const users: GateUser[] = sortBy(unwrapConnection(usersConnection), \"id\");\n const groups: GateGroup[] = unwrapConnection(groupsConnection);\n const whitelists: GateWhitelist[] = unwrapConnection(whitelistsConnection);\n const accounts: GateAccount[] = sortBy(unwrapConnection(accountsConnection), \"index\");\n const vaultEntities: GateVaultEntity[] = unwrapConnection(vaultEntitiesConnection);\n const exchanges: GateExchange[] = unwrapConnection(exchangesConnection);\n const policies: GatePolicy[] = unwrapConnection(policiesConnection);\n const tradelinkCustodians: GateTradelinkEntity<\"CUSTODIAN\">[] = unwrapConnection(\n tradelinkCustodianConnection,\n );\n const tradelinkHSMCustodians: GateTradelink[] = unwrapConnection(tradelinkHSMCustodianConnection);\n const tradelinkExchanges: GateTradelinkEntity<\"EXCHANGE\">[] = unwrapConnection(\n tradelinkExchangeConnection,\n );\n const tradelinkHSMExchanges: GateTradelinkExchange[] = unwrapConnection(\n tradelinkHSMExchangeConnection,\n );\n const tradelinkHSMAssetManagers: GateTradelinkAssetManager[] = unwrapConnection(\n tradelinkHSMAssetManagerConnection,\n );\n const tradelinkAssetManagers: GateTradelinkEntity<\"ASSET_MANAGER\">[] = unwrapConnection(\n tradelinkAssetManagerConnection,\n );\n const allWorkspaceRules = unwrapConnection(allWorkspaceRulesConnection);\n const rootWorkspaceRule = allWorkspaceRules.find((r) => r.permission === \"ROOT\") ?? null;\n const apiAdminWorkspaceRules = allWorkspaceRules.filter((r) => r.permission !== \"ROOT\");\n\n const groupsByName = keyBy(groups, (group) => group.name);\n const whitelistsByName = keyBy(whitelists, (w) => w.name);\n const accountsByName = keyBy(accounts, (a) => a.name);\n const vaultEntitiesByName = keyBy(vaultEntities, (e) => e.name);\n const exchangesByName = keyBy(exchanges, (e) => e.name);\n const policiesByName = keyBy(policies, (e) => e.name);\n const tradelinkCustodiansByName = keyBy(tradelinkCustodians, (e) => e.name);\n const tradelinkHSMCustodiansByName = keyBy(\n tradelinkHSMCustodians,\n (e) => e.network.custodian.name,\n );\n const tradelinkExchangesByName = keyBy(tradelinkExchanges, (e) => e.name);\n const tradelinkHSMExchangesByName = keyBy(tradelinkHSMExchanges, (e) => e.hsm_data.name);\n const tradelinkHSMAssetManagersByName = keyBy(tradelinkHSMAssetManagers, (e) => e.hsm_data.name);\n const tradelinkAssetManagersByName = keyBy(tradelinkAssetManagers, (e) => e.name);\n\n // gate is sending all active users by order of creation\n // we rely on index in the reduce() to get the device index assuming we take them in order\n //\n // FIXME there is something weird with the typing of this reduce :(\n // @ts-ignore\n const {\n admins: _admins,\n operators,\n apiUsers,\n apiV2Users,\n }: {\n admins: Array<{ deviceIndex: number; user: GateUser }>;\n operators: Array<{ deviceIndex: number; user: GateUser }>;\n apiUsers: Array<{ deviceIndex: number; user: GateUser }>;\n apiV2Users: Array<{ username: string; user: GateUser }>;\n } = users.reduce(\n (acc, curr, index) =>\n // @ts-ignore\n curr.device_type === \"API\"\n ? {\n ...acc,\n apiV2Users: [...acc.apiV2Users, { deviceIndex: curr.username, user: curr }],\n }\n : curr.role === \"ADMIN\"\n ? {\n ...acc,\n admins: [\n ...acc.admins,\n {\n deviceIndex: getDeviceIndex(index - countAPIUsersUntil(index, users)),\n user: curr,\n },\n ],\n }\n : curr.device_type === \"SOFT_PSD\"\n ? {\n ...acc,\n apiUsers: [...acc.apiUsers, { deviceIndex: curr.username, user: curr }],\n }\n : {\n ...acc,\n operators: [\n ...acc.operators,\n {\n deviceIndex: getDeviceIndex(index - countAPIUsersUntil(index, users)),\n user: curr,\n },\n ],\n },\n { admins: [], operators: [], apiUsers: [], apiV2Users: [] },\n );\n\n const operatorsDevicesByID: Record<string, number> = operators.reduce((acc, curr) => {\n return { ...acc, [curr.user.id]: curr.deviceIndex };\n }, {});\n\n const customUsernames = [..._admins, ...operators].reduce((acc, curr) => {\n // don't assign custom username if user has default name\n if (\n getDefaultUsername(curr.user.role === \"ADMIN\" ? \"admin\" : \"operator\", curr.deviceIndex) ===\n curr.user.username\n ) {\n return acc;\n }\n return { ...acc, [curr.deviceIndex]: curr.user.username };\n }, {});\n\n const admins = _admins\n // remove admins 4, 5, 6, they are implicitly created during onboarding\n // we still want to fetch them first to eventually collect custom usernames\n .filter((_, i) => i > DEFAULT_ADMINS_COUNT - 1);\n\n const usersManifest = {\n operators: operators.map((o) => o.deviceIndex),\n admins: admins.map((a) => a.deviceIndex),\n api: apiUsers.map((a) =>\n a.user.view_all_override\n ? {\n name: a.user.username,\n viewAll: true,\n }\n : a.user.username,\n ),\n apiV2: apiV2Users.map((a) => ({\n role: a.user.role,\n name: a.user.username,\n ...(a.user.pub_key ? { publicKey: a.user.pub_key } : {}),\n ...(a.user.view_all_override ? { viewAll: true } : {}),\n })),\n };\n\n // we assume that if ROOT workspace rule exist, we take the workspace quorum from there,\n // else, we take it from the legacy \"organization\" object\n const quorum = rootWorkspaceRule ? rootWorkspaceRule.steps[0]!.quorum : organization.quorum;\n\n const manifestWorkspaceRules: ManifestWorkspaceRule[] = apiAdminWorkspaceRules\n .map((rule) => ({\n permission: rule.permission as Exclude<GateWorkspacePermission, \"ROOT\">,\n steps: rule.steps.map((gateStep) => ({\n quorum: gateStep.quorum,\n users: gateStep.users.map((pubKey) => {\n const user = users.find((u) => u.pub_key === pubKey);\n invariant(\n user,\n `Can't find user with pub key ${pubKey} referenced in workspace rule ${rule.permission}`,\n );\n return user.username;\n }),\n })),\n }))\n .filter((rule) => {\n // only output the rules that have users defined\n return rule.steps.length > 0;\n });\n\n const fullManifest: Manifest = {\n quorum: quorum === 2 ? undefined : quorum,\n customUsernames,\n users: usersManifest,\n workspaceRules: manifestWorkspaceRules,\n groups: groups\n .filter((g) => g.status === \"ACTIVE\")\n .map((g) => ({\n name: g.name,\n description: g.description,\n users: g.members.map((m) => (m.is_api ? m.username : operatorsDevicesByID[m.id]!)),\n })),\n whitelists: whitelists\n .filter((w) => w.status === \"ACTIVE\")\n .map((w) => ({\n name: w.name,\n description: w.description,\n type: w.whitelist_type,\n addresses: w.addresses.map(\n (a): ManifestWhitelistAddress => ({\n name: a.name,\n address: a.address,\n currency: a.currency,\n destination_tags: a.destination_tags,\n }),\n ),\n })),\n accounts: accounts\n // we want to get rid of VIEW_ONLY account see #76\n .filter((a) => a.status === \"ACTIVE\")\n .map((a) => ({\n name: a.name,\n currency: a.currency,\n ...(options.saveAccountsTypes ? { accountType: a.account_type } : {}),\n derivationMode: a.derivation_mode === \"STANDARD\" ? undefined : a.derivation_mode,\n contractAddress: a.contract_address || undefined,\n ...(options.saveAccountsIndexes ? { index: a.index } : {}),\n ...(a.parent\n ? {\n parentAccount: (() => {\n const parentAccount = accounts.find((acc) => acc.id === a.parent);\n /* istanbul ignore if */\n if (!parentAccount) {\n throw new Error(`Can't find parent account with id ${a.parent}`);\n }\n if (parentAccount.status !== \"ACTIVE\") {\n return undefined;\n }\n return parentAccount.name;\n })(),\n }\n : {}),\n rules: extractRules(a.governance_rules, a.currency, operatorsDevicesByID),\n ...(() => {\n const config: ManifestAccountConfig = {};\n\n if (a.nfts_gallery_enabled) {\n config.nftGallery = true;\n }\n\n const hasConfig = Object.keys(config).length > 0;\n return hasConfig ? { config } : {};\n })(),\n })),\n entities: vaultEntities\n .filter((e) => e.status === \"ACTIVE\")\n .map((e) => ({\n name: e.name,\n accounts: e.accounts.map((a) => a.name),\n })),\n exchanges: exchanges\n .filter((e) => e.status === \"ACTIVE\")\n .map(\n (e): ManifestExchange => ({\n name: e.name,\n platform: e.platform,\n configuration: {\n apiKey: \"<not-retrievable>\",\n apiSecret: \"<not-retrievable>\",\n },\n }),\n ),\n policies: policies.map((p): ManifestPolicy => {\n return {\n name: p.name,\n currency: p.currency,\n rules: extractRules(p.governance_rules, p.currency, operatorsDevicesByID),\n status: p.status,\n };\n }),\n };\n\n // clean out un-necessary keys\n const manifest = pickNonEmpty(fullManifest);\n\n return {\n manifest,\n rawData: {\n pendingUserRequests,\n groupsByName,\n whitelistsByName,\n accountsByName,\n vaultEntitiesByName,\n usersWithDevice: [..._admins, ...operators, ...apiUsers],\n usersWithoutDevice: [...apiV2Users],\n exchangesByName,\n policiesByName,\n tradelinkCustodiansByName,\n tradelinkHSMCustodiansByName,\n tradelinkExchangesByName,\n tradelinkHSMExchangesByName,\n tradelinkHSMAssetManagersByName,\n tradelinkAssetManagersByName,\n tradelinkNetwork,\n tradelinkOnboardingStatus,\n },\n };\n}\n\n// recursively create a minimal object (removing empty arrays etc.)\n// yeah.. lot of @ts-ignore in the function!\nfunction pickNonEmpty<T extends Record<string, any>>(obj: T) {\n const out = {};\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n /* istanbul ignore if */\n if (!key) throw new Error(`Invalid key at index ${i}`);\n const val = obj[key];\n // @ts-ignore\n const getSanitized = (val: any) => {\n /* istanbul ignore if */\n if (val === null) {\n return;\n } else if (Array.isArray(val)) {\n // @ts-ignore\n const withoutEmpty = val.map(getSanitized).filter((v) => v !== undefined);\n if (withoutEmpty.length > 0) {\n return withoutEmpty;\n }\n } else if (typeof val === \"object\") {\n // @ts-ignore\n const subObj: Record<string, unknown> = val;\n const nonEmptyVal = pickNonEmpty(subObj);\n const nbKeys = Object.keys(nonEmptyVal).length;\n if (nbKeys > 0) {\n return nonEmptyVal;\n }\n } else if (val !== undefined) {\n return val;\n }\n };\n const sanitized = getSanitized(val);\n if (sanitized !== undefined) {\n // @ts-ignore\n out[key] = sanitized;\n }\n }\n return out;\n}\n\nfunction extractRules(\n gateGovRules: GateGovernanceRulesSet[] | null,\n _currency: string,\n operatorsDevicesByID: Record<string, number>,\n): ManifestAccountRule[][] {\n const currency = getCryptoCurrencyById(_currency);\n const unit = currency.units[0]!;\n const governance_rules = gateGovRules || [];\n let rulesSets = governance_rules.map((r) => {\n const rules = r.rules.map((rule) => {\n if (rule.type === \"THRESHOLD\") {\n const thresholdRule: ManifestAccountRuleThreshold = {\n type: \"THRESHOLD\",\n ...(rule.data[0].min ? { min: deserializeUnitValue(unit, rule.data[0].min) } : {}),\n ...(rule.data[0].max ? { max: deserializeUnitValue(unit, rule.data[0].max) } : {}),\n };\n return thresholdRule;\n }\n if (rule.type === \"WHITELIST\") {\n const whitelistRule: ManifestAccountRuleWhitelist = {\n type: \"WHITELIST\",\n whitelists: rule.data.map((d) => d.name),\n };\n return whitelistRule;\n }\n if (rule.type === \"MULTI_AUTHORIZATIONS\") {\n const multiAuthRule: ManifestAccountRuleMultiAuth = {\n type: \"MULTI_AUTHORIZATIONS\",\n steps: rule.data.map((s) => ({\n quorum: s.quorum,\n ...(s.group.is_internal\n ? {\n users: s.group.members.map((m) => {\n const u = m.is_api ? m.username : operatorsDevicesByID[m.id];\n /* istanbul ignore if */\n if (!u) throw new Error(`Invalid user ${m}`);\n return u;\n }),\n }\n : { group: s.group.name }),\n })),\n };\n return multiAuthRule;\n }\n if (rule.type === \"SMART_CONTRACT_INTERACTION\") {\n const sciRule: ManifestAccountRuleSCI = {\n type: \"SMART_CONTRACT_INTERACTION\",\n enabled: rule.data[0].enabled,\n };\n return sciRule;\n }\n if (rule.type === \"TRANSACTION_FILTER\") {\n switch (rule.data.preset) {\n case \"TEZOS_DELEGATION\":\n return { type: \"TEZOS_DELEGATION\" } as ManifestAccountRuleTezosDelegation;\n case \"POLKADOT_STAKING\":\n return { type: \"POLKADOT_STAKING\" } as ManifestAccountRulePolkadotStaking;\n case \"SOLANA_STAKING\":\n return { type: \"SOLANA_STAKING\" } as ManifestAccountRuleSolanaStaking;\n case \"CARDANO_STAKING\":\n return { type: \"CARDANO_STAKING\" } as ManifestAccountRuleCardanoStaking;\n case \"RAW_SIGNING\":\n return { type: \"RAW_SIGNING\" } as ManifestAccountRuleRawSigning;\n case \"CREATE_SPL_TOKEN_ACCOUNT\":\n return { type: \"CREATE_SPL_TOKEN_ACCOUNT\" } as ManifestAccountRuleCreateSplTokenAccount;\n case \"TRANSFER_SPL_TOKEN\":\n return {\n type: \"TRANSFER_SPL_TOKEN\",\n contractAddress: rule.data.contract_address,\n } as ManifestAccountRuleTransferSplToken;\n case \"SEND\":\n // VG-18271 don't recipe \"SEND\" rule as it's the default\n return null;\n case \"STAKE\":\n return { type: \"STAKE\" } as ManifestAccountRuleStake;\n case \"MESSAGE_SIGNING\":\n return { type: \"MESSAGE_SIGNING\" } as ManifestAccountRuleMessageSigning;\n case \"DEPLOY_CONTRACT\":\n return { type: \"DEPLOY_CONTRACT\" } as ManifestAccountRuleDeployContract;\n }\n }\n // @ts-ignore\n throw new Error(`Unknown rule type ${rule.type}`);\n });\n return rules.filter(Boolean) as ManifestAccountRule[];\n });\n\n // see VG-22141\n rulesSets = enforceSCIRuleIfNecessary(rulesSets);\n\n return rulesSets;\n}\n\n// Enforce that if a RulesSet have a SCI-enabled rule, all the other RulesSet should have\n// a SCI-disabled rule\n//\n// see VG-22141\n//\nfunction enforceSCIRuleIfNecessary(rulesSets: ManifestAccountRule[][]): ManifestAccountRule[][] {\n const hasSCIRulesSet = rulesSets.find((rulesSet) =>\n rulesSet.find((rule) => rule.type === \"SMART_CONTRACT_INTERACTION\" && rule.enabled),\n );\n if (!hasSCIRulesSet) return rulesSets;\n return rulesSets.map((rulesSet) => {\n const sciRule = rulesSet.find((r) => r.type === \"SMART_CONTRACT_INTERACTION\");\n if (sciRule) return rulesSet;\n return [...rulesSet, { type: \"SMART_CONTRACT_INTERACTION\", enabled: false }];\n });\n}\n\nfunction countAPIUsersUntil(index: number, users: GateUser[]) {\n return users.slice(0, index).filter((u) => u.is_api).length;\n}\n"],"mappings":"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","names":["val"]}