@ledgerhq/revault-sdk 0.21.2 → 0.21.4

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.
package/lib/bake.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createDeviceIndexResolver,
3
3
  fetchAll
4
- } from "./chunk-PEHCVOGV.js";
4
+ } from "./chunk-IHGVWOD7.js";
5
5
  import {
6
6
  genKeys
7
7
  } from "./chunk-CZLZUISN.js";
@@ -44,6 +44,17 @@ async function createAndApproveRequest(input, approvers, logger) {
44
44
  const request = await creator.client.requests.create.mutate({ request: input });
45
45
  return approveRequest(request, approvers, logger);
46
46
  }
47
+ function stripUndefinedDeep(obj) {
48
+ if (Array.isArray(obj)) {
49
+ return obj.map(stripUndefinedDeep);
50
+ }
51
+ if (obj && typeof obj === "object") {
52
+ return Object.fromEntries(
53
+ Object.entries(obj).filter(([_2, v]) => v !== void 0).map(([k, v]) => [k, stripUndefinedDeep(v)])
54
+ );
55
+ }
56
+ return obj;
57
+ }
47
58
 
48
59
  // src/bake/bake-pledge.ts
49
60
  var flattenApprovers = (groups) => {
@@ -97,7 +108,7 @@ async function bakePledgeAdjustment(options, logger) {
97
108
  );
98
109
  await createAndApproveRequest(
99
110
  {
100
- type: "ADJUST_PLEDGE",
111
+ type: "TRADELINK_ADJUST_PLEDGE",
101
112
  data: {
102
113
  accountId: account.id,
103
114
  exchangeId: exchange.id,
@@ -214,12 +225,14 @@ async function bakeWorkspace(options, logger) {
214
225
  const [
215
226
  existingUsers,
216
227
  existingGroups,
228
+ existingWhitelists,
217
229
  existingPolicies,
218
230
  existingAccounts,
219
231
  tradelinkNetworkBlueprint
220
232
  ] = await Promise.all([
221
233
  fetchAll(admin1.client.users.list.query, { status: "ACTIVE" }),
222
234
  fetchAll(admin1.client.groups.list.query, { status: "ACTIVE" }),
235
+ fetchAll(admin1.client.whitelists.list.query, { status: "ACTIVE" }),
223
236
  fetchAll(admin1.client.policies.list.query, { isPrivate: false }),
224
237
  fetchAll(admin1.client.accounts.list.query, { status: "ACTIVE" }),
225
238
  admin1.client.tradelink.getNetworkBlueprint.query()
@@ -275,9 +288,6 @@ async function bakeWorkspace(options, logger) {
275
288
  }
276
289
  }
277
290
  async function createWhitelists(whitelists) {
278
- const existingWhitelists = await fetchAll(admin1.client.whitelists.list.query, {
279
- status: "ACTIVE"
280
- });
281
291
  for (const whitelist of whitelists) {
282
292
  await createWhitelist(whitelist);
283
293
  }
@@ -291,8 +301,10 @@ async function bakeWorkspace(options, logger) {
291
301
  type: "CREATE_WHITELIST",
292
302
  data: whitelist
293
303
  };
294
- await createAndApproveRequest(input, [admin1, admin2], logger);
304
+ const req = await createAndApproveRequest(input, [admin1, admin2], logger);
295
305
  logSubStep(`Whitelist "${whitelist.name}" has been created`);
306
+ const createdWhitelist = await admin1.client.whitelists.findById.query({ id: req.targetId });
307
+ existingWhitelists.push(createdWhitelist);
296
308
  }
297
309
  }
298
310
  function govRuleFromManifest(rule) {
@@ -309,17 +321,17 @@ async function bakeWorkspace(options, logger) {
309
321
  quorum: step.quorum,
310
322
  userIds: step.members.map(userIdFromDeviceIndexOrName)
311
323
  };
312
- })
324
+ }),
325
+ threshold: rule.threshold,
326
+ whitelistIds: rule.whitelistNames?.map(whitelistIdFromName)
313
327
  };
314
328
  }
315
329
  async function createAccount(account) {
316
- const existing = existingAccounts.find((a) => a.name === account.name);
317
- if (existing) {
318
- logger.info(`[SKIPPED] Account "${account.name}" already exists`);
319
- return;
320
- }
321
- logStep(`Creating account "${account.name}"`);
322
- const input = {
330
+ let req = null;
331
+ const existing = existingAccounts.find(
332
+ (a) => a.currency === account.currency && a.index === account.index && (a.contractAddress ?? null) === (account.contractAddress ?? null)
333
+ );
334
+ const createInput = {
323
335
  type: "CREATE_ACCOUNT",
324
336
  data: {
325
337
  // general fields
@@ -342,8 +354,43 @@ async function bakeWorkspace(options, logger) {
342
354
  }
343
355
  }
344
356
  };
345
- const req = await createAndApproveRequest(input, [admin1, admin2], logger);
346
- if (account.governance.type === "TRADELINK") {
357
+ if (existing) {
358
+ const editInput = {
359
+ ...createInput,
360
+ type: "EDIT_ACCOUNT",
361
+ targetId: existing.id
362
+ };
363
+ const previousAccountRequests = await admin1.client.requests.list.query({
364
+ type: ["CREATE_ACCOUNT", "EDIT_ACCOUNT"],
365
+ targetId: existing.id,
366
+ state: "EXECUTED",
367
+ sortBy: "createdAt",
368
+ sortOrder: "desc"
369
+ });
370
+ if (previousAccountRequests?.results && previousAccountRequests.results.length > 0) {
371
+ const stateRequest = previousAccountRequests.results?.[0];
372
+ invariant3(
373
+ stateRequest && (stateRequest.type === "EDIT_ACCOUNT" || stateRequest.type === "CREATE_ACCOUNT"),
374
+ "State request should be an edit account request"
375
+ );
376
+ if (_.isEqual(
377
+ stripUndefinedDeep(createInput.data.governance),
378
+ stripUndefinedDeep(stateRequest.data.governance)
379
+ ) && createInput.data.name === stateRequest.data.name) {
380
+ logger.info(`[SKIPPED] Account "${account.name}" has not changed`);
381
+ return;
382
+ }
383
+ req = await createAndApproveRequest(editInput, [admin1, admin2], logger);
384
+ logger.info(`[EDITED] Account "${account.name}" has been edited`);
385
+ return;
386
+ }
387
+ } else {
388
+ logStep(`Creating account "${account.name}"`);
389
+ req = await createAndApproveRequest(createInput, [admin1, admin2], logger);
390
+ const createdAccount = await admin1.client.accounts.findById.query({ id: req.targetId });
391
+ existingAccounts.push(createdAccount);
392
+ }
393
+ if (account.governance.type === "TRADELINK" && req) {
347
394
  logStep(`Activating tradelink account "${account.name}"`);
348
395
  const assetManagerId = assetManagerIdFromName(account.governance.assetManager);
349
396
  const assetManager = existingTradelinkNetwork?.assetManagers.find(
@@ -359,7 +406,7 @@ async function bakeWorkspace(options, logger) {
359
406
  )
360
407
  );
361
408
  await createAndApproveRequest(
362
- { type: "ACTIVATE_TRADELINK_ACCOUNT", targetId: req.targetId, data: {} },
409
+ { type: "TRADELINK_ACTIVATE_ACCOUNT", targetId: req.targetId, data: null },
363
410
  loggedAssetManagerOperators,
364
411
  logger
365
412
  );
@@ -495,7 +542,7 @@ async function bakeWorkspace(options, logger) {
495
542
  logSubStep("Creating request...");
496
543
  const request = await admin1.client.requests.create.mutate({
497
544
  request: {
498
- type: "CREATE_TRADELINK_CUSTODIAN",
545
+ type: "TRADELINK_CREATE_CUSTODIAN",
499
546
  data
500
547
  }
501
548
  });
@@ -538,7 +585,7 @@ async function bakeWorkspace(options, logger) {
538
585
  logSubStep("Creating request...");
539
586
  const request = await admin1.client.requests.create.mutate({
540
587
  request: {
541
- type: "CREATE_TRADELINK_EXCHANGE",
588
+ type: "TRADELINK_CREATE_EXCHANGE",
542
589
  data: {
543
590
  tradelinkId: exchangeId,
544
591
  groups: exchange.groups.map(tradelinkReviewStepFromManifest),
@@ -578,7 +625,7 @@ async function bakeWorkspace(options, logger) {
578
625
  logSubStep("Creating request...");
579
626
  const request = await admin1.client.requests.create.mutate({
580
627
  request: {
581
- type: "CREATE_TRADELINK_ASSET_MANAGER",
628
+ type: "TRADELINK_CREATE_ASSET_MANAGER",
582
629
  data: {
583
630
  tradelinkId: assetManagerId,
584
631
  groups: assetManager.groups.map(tradelinkReviewStepFromManifest),
@@ -632,6 +679,11 @@ async function bakeWorkspace(options, logger) {
632
679
  invariant3(group, `Group ${groupName} not found`);
633
680
  return group.id;
634
681
  }
682
+ function whitelistIdFromName(whitelistName) {
683
+ const whitelist = existingWhitelists.find((w) => w.name === whitelistName);
684
+ invariant3(whitelist, `Whitelist ${whitelistName} not found`);
685
+ return whitelist.id;
686
+ }
635
687
  function assetManagerIdFromName(assetManagerName) {
636
688
  const orgAssetManager = tradelinkOrgAssetManagersByName[assetManagerName];
637
689
  invariant3(
@@ -666,32 +718,32 @@ async function bakeWorkspace(options, logger) {
666
718
 
667
719
  // src/bake/types.ts
668
720
  import z from "zod";
669
- var zManifestUser = z.number().describe("User device index");
670
- var zManifestUserName = z.string().describe("User name");
721
+ var zManifestUser = z.number().meta({ description: "User device index" });
722
+ var zManifestUserName = z.string().meta({ description: "User name" });
671
723
  var zManifestApiUser = z.object({
672
- name: z.string().describe("API user name"),
673
- role: z.enum(["ADMIN", "OPERATOR"]).describe("API user role").default("OPERATOR"),
674
- pubKey: z.string().describe(
675
- "API user public key. If not provided, one will be generated using the name as entropy"
676
- ).optional(),
677
- viewAll: z.boolean().describe("Whether the API user can view all accounts")
724
+ name: z.string().meta({ description: "API user name" }),
725
+ role: z.enum(["ADMIN", "OPERATOR"]).meta({ description: "API user role" }).default("OPERATOR"),
726
+ pubKey: z.string().meta({
727
+ description: "API user public key. If not provided, one will be generated using the name as entropy"
728
+ }).optional(),
729
+ viewAll: z.boolean().meta({ description: "Whether the API user can view all accounts" })
678
730
  });
679
731
  var zManifestGroup = z.object({
680
- name: z.string().describe("Group name"),
681
- members: z.array(z.union([zManifestUser, zManifestUserName])).describe("Group members")
682
- }).strict().describe("Operators group");
732
+ name: z.string().meta({ description: "Group name" }),
733
+ members: z.array(z.union([zManifestUser, zManifestUserName])).meta({ description: "Group members" })
734
+ }).strict().meta({ description: "Operators group" });
683
735
  var zManifestWhitelistAddress = z.object({
684
- name: z.string().describe("Whitelist address name"),
685
- currency: z.string().describe("Whitelist address currency"),
686
- address: z.string().describe("Whitelist address"),
687
- destinationTags: z.array(z.string()).optional().describe("List of destination tags (applicable for Ripple currency)")
736
+ name: z.string().meta({ description: "Whitelist address name" }),
737
+ currency: z.string().meta({ description: "Whitelist address currency" }),
738
+ address: z.string().meta({ description: "Whitelist address" }),
739
+ destinationTags: z.array(z.string()).optional().meta({ description: "List of destination tags (applicable for Ripple currency)" })
688
740
  }).strict();
689
741
  var zManifestWhitelist = z.object({
690
- name: z.string().describe("Whitelist name"),
691
- description: z.string().optional().default("").describe("Whitelist description"),
692
- type: z.enum(["TRANSACTION", "SMART_CONTRACT"]).optional().default("TRANSACTION").describe("Whitelist type"),
693
- addresses: z.array(zManifestWhitelistAddress).describe("Whitelist addresses")
694
- }).strict().describe("Whitelist");
742
+ name: z.string().meta({ description: "Whitelist name" }),
743
+ description: z.string().optional().default("").meta({ description: "Whitelist description" }),
744
+ type: z.enum(["TRANSACTION", "SMART_CONTRACT"]).optional().default("TRANSACTION").meta({ description: "Whitelist type" }),
745
+ addresses: z.array(zManifestWhitelistAddress).meta({ description: "Whitelist addresses" })
746
+ }).strict().meta({ description: "Whitelist" });
695
747
  var zManifestGovernanceStepWithUsers = z.object({
696
748
  quorum: z.number(),
697
749
  members: z.array(z.union([zManifestUser, zManifestUserName]))
@@ -708,11 +760,16 @@ var zManifestGovernanceRule = z.object({
708
760
  // TODO see if there is a way to import this from `api` package
709
761
  // (the challenge there is that enums are not transpiled)
710
762
  type: z.enum(["SEND", "STAKE", "DEPLOY_CONTRACT", "EXECUTE_CONTRACT", "SIGN_MESSAGE"]),
711
- steps: z.array(zManifestGovernanceStep).min(1)
763
+ steps: z.array(zManifestGovernanceStep).min(1),
764
+ threshold: z.object({
765
+ min: z.string(),
766
+ max: z.string()
767
+ }).optional(),
768
+ whitelistNames: z.array(z.string()).optional()
712
769
  }).strict();
713
770
  var zManifestPolicy = z.object({
714
771
  name: z.string(),
715
- currency: z.string(),
772
+ currency: z.string().nullable(),
716
773
  rules: z.array(zManifestGovernanceRule)
717
774
  }).strict();
718
775
  var zManifestClassicAccountGovernance = z.object({
@@ -720,13 +777,13 @@ var zManifestClassicAccountGovernance = z.object({
720
777
  rules: z.array(zManifestGovernanceRule)
721
778
  }).strict();
722
779
  var zManifestTradelinkExchangeConfig = z.object({
723
- name: z.string().describe("Exchange name"),
724
- repledgeAuthorized: z.boolean().optional().describe("Whether repledge is authorized"),
725
- needsAssetManagerApprovalForSettlements: z.boolean().optional().describe("Whether asset manager pre approval is needed")
780
+ name: z.string().meta({ description: "Exchange name" }),
781
+ repledgeAuthorized: z.boolean().optional().meta({ description: "Whether repledge is authorized" }),
782
+ needsAssetManagerApprovalForSettlements: z.boolean().optional().meta({ description: "Whether asset manager pre approval is needed" })
726
783
  }).strict();
727
784
  var zManifestTradelinkAccountGovernance = z.object({
728
785
  type: z.literal("TRADELINK"),
729
- assetManager: z.string().describe("Asset manager name"),
786
+ assetManager: z.string().meta({ description: "Asset manager name" }),
730
787
  exchanges: z.array(zManifestTradelinkExchangeConfig)
731
788
  }).strict();
732
789
  var zManifestAccountGovernance = z.discriminatedUnion("type", [
@@ -736,7 +793,7 @@ var zManifestAccountGovernance = z.discriminatedUnion("type", [
736
793
  var zManifestAccount = z.object({
737
794
  name: z.string(),
738
795
  currency: z.string(),
739
- index: z.number().nonnegative().optional(),
796
+ index: z.number().nonnegative(),
740
797
  contractAddress: z.string().optional(),
741
798
  governance: zManifestAccountGovernance
742
799
  }).strict();
@@ -748,14 +805,14 @@ var zManifestPledgeAdjustment = z.object({
748
805
  var zManifestTradelinkGroup = z.object({
749
806
  members: z.array(zManifestUser),
750
807
  quorum: z.number()
751
- }).strict().describe("Tradelink group");
808
+ }).strict().meta({ description: "Tradelink group" });
752
809
  var zManifestTradelinkGroups = z.array(zManifestTradelinkGroup);
753
810
  var zManifestTradelinkWhitelistAddress = z.object({
754
811
  name: z.string().min(1),
755
812
  currency: z.string().min(1),
756
813
  address: z.string().min(1)
757
- }).strict().describe("Tradelink whitelist address");
758
- var zManifestTradelinkWhitelist = z.array(zManifestTradelinkWhitelistAddress).describe("Tradelink whitelist");
814
+ }).strict().meta({ description: "Tradelink whitelist address" });
815
+ var zManifestTradelinkWhitelist = z.array(zManifestTradelinkWhitelistAddress).meta({ description: "Tradelink whitelist" });
759
816
  var zManifestTradelinkEntity = z.object({
760
817
  name: z.string(),
761
818
  groups: zManifestTradelinkGroups,
@@ -776,7 +833,7 @@ var zManifestTradelinkNetwork = z.object({
776
833
  custodian: zManifestTradelinkCustodian.optional(),
777
834
  exchanges: z.array(zManifestTradelinkEntity).optional(),
778
835
  assetManagers: z.array(zManifestTradelinkEntity).optional()
779
- }).strict().describe("Tradelink network configuration");
836
+ }).strict().meta({ description: "Tradelink network configuration" });
780
837
  var zManifestWorkspace = z.object({
781
838
  tradelink: zManifestTradelinkNetwork.optional(),
782
839
  users: z.object({
@@ -789,17 +846,17 @@ var zManifestWorkspace = z.object({
789
846
  policies: z.array(zManifestPolicy).optional(),
790
847
  accounts: z.array(zManifestAccount).optional(),
791
848
  pledges: z.array(zManifestPledgeAdjustment).optional()
792
- }).strict().describe("Workspace configuration");
849
+ }).strict().meta({ description: "Workspace configuration" });
793
850
  var zManifestTradelinkOrgEntity = z.object({
794
851
  name: z.string(),
795
852
  code: z.string(),
796
853
  logo: z.string()
797
- }).strict().describe("Tradelink organization entity");
854
+ }).strict().meta({ description: "Tradelink organization entity" });
798
855
  var zManifestTradelinkOrg = z.object({
799
856
  exchanges: z.array(zManifestTradelinkOrgEntity).optional(),
800
857
  assetManagers: z.array(zManifestTradelinkOrgEntity).optional(),
801
858
  custodians: z.array(zManifestTradelinkOrgEntity).optional()
802
- }).strict().describe("Tradelink organization configuration");
859
+ }).strict().meta({ description: "Tradelink organization configuration" });
803
860
  var zManifest = z.object({
804
861
  manifestVersion: z.literal(2),
805
862
  tradelink: zManifestTradelinkOrg.optional(),