@keetanetwork/keetanet-client 0.14.7 → 0.14.8

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 (131) hide show
  1. package/api/index.d.ts +1 -0
  2. package/api/node.d.ts +1 -0
  3. package/client/client_common_tests.d.ts +1 -1
  4. package/client/index-browser.d.ts +107 -12
  5. package/client/index-browser.js +4433 -4217
  6. package/client/index.d.ts +107 -12
  7. package/client/index.js +287 -37
  8. package/docs/assets/hierarchy.js +1 -1
  9. package/docs/assets/navigation.js +1 -1
  10. package/docs/assets/search.js +1 -1
  11. package/docs/classes/KeetaNetSDK.Client.html +16 -6
  12. package/docs/classes/KeetaNetSDK.Referenced.BaseSet.html +1 -1
  13. package/docs/classes/KeetaNetSDK.Referenced.BaseVoteBuilder.html +1 -1
  14. package/docs/classes/KeetaNetSDK.Referenced.BlockHash.html +1 -1
  15. package/docs/classes/KeetaNetSDK.Referenced.BlockOperation.html +1 -1
  16. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationCREATE_IDENTIFIER.html +1 -1
  17. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMANAGE_CERTIFICATE.html +1 -1
  18. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMODIFY_PERMISSIONS.html +1 -1
  19. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationRECEIVE.html +1 -1
  20. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSEND.html +1 -1
  21. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_INFO.html +1 -1
  22. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_REP.html +1 -1
  23. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
  24. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_SUPPLY.html +1 -1
  25. package/docs/classes/KeetaNetSDK.Referenced.CertificateHash.html +1 -1
  26. package/docs/classes/KeetaNetSDK.Referenced.ECDSAKeyPair.html +1 -1
  27. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1KeyPair.html +1 -1
  28. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PrivateKey.html +1 -1
  29. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PublicKey.html +1 -1
  30. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1Signature.html +1 -1
  31. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1KeyPair.html +1 -1
  32. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PrivateKey.html +1 -1
  33. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PublicKey.html +1 -1
  34. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1Signature.html +1 -1
  35. package/docs/classes/KeetaNetSDK.Referenced.ED25519KeyPair.html +1 -1
  36. package/docs/classes/KeetaNetSDK.Referenced.ED25519PrivateKey.html +1 -1
  37. package/docs/classes/KeetaNetSDK.Referenced.ED25519PublicKey.html +1 -1
  38. package/docs/classes/KeetaNetSDK.Referenced.ED25519Signature.html +1 -1
  39. package/docs/classes/KeetaNetSDK.Referenced.ExternalKeyPair.html +1 -1
  40. package/docs/classes/KeetaNetSDK.Referenced.ExternalSet.html +1 -1
  41. package/docs/classes/KeetaNetSDK.Referenced.IdempotentKey.html +1 -1
  42. package/docs/classes/KeetaNetSDK.Referenced.IdentifierKey.html +1 -1
  43. package/docs/classes/KeetaNetSDK.Referenced.IdentifierKeyPair.html +1 -1
  44. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetError.html +2 -2
  45. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetErrorBase.html +1 -1
  46. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerError.html +1 -1
  47. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerIdempotentKeyError.html +1 -1
  48. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerVoteError.html +1 -1
  49. package/docs/classes/KeetaNetSDK.Referenced.KeyInterface.html +1 -1
  50. package/docs/classes/KeetaNetSDK.Referenced.KeyStorage.html +1 -1
  51. package/docs/classes/KeetaNetSDK.Referenced.Log.html +1 -1
  52. package/docs/classes/KeetaNetSDK.Referenced.PermissionSetHolder.html +1 -1
  53. package/docs/classes/KeetaNetSDK.Referenced.PossiblyExpiredVote.html +1 -1
  54. package/docs/classes/KeetaNetSDK.Referenced.RequestTiming.html +1 -1
  55. package/docs/classes/KeetaNetSDK.Referenced.SignatureStorage.html +1 -1
  56. package/docs/classes/KeetaNetSDK.Referenced.Stats.html +1 -1
  57. package/docs/classes/KeetaNetSDK.Referenced.StatsPending.html +1 -1
  58. package/docs/classes/KeetaNetSDK.Referenced.Vote.html +1 -1
  59. package/docs/classes/KeetaNetSDK.Referenced.VoteBlockBundle.html +1 -1
  60. package/docs/classes/KeetaNetSDK.Referenced.VoteBlockHash.html +1 -1
  61. package/docs/classes/KeetaNetSDK.Referenced.VoteBuilder.html +1 -1
  62. package/docs/classes/KeetaNetSDK.Referenced.VoteHash.html +1 -1
  63. package/docs/classes/KeetaNetSDK.Referenced.VoteLikeBase.html +1 -1
  64. package/docs/classes/KeetaNetSDK.Referenced.VoteQuote.html +1 -1
  65. package/docs/classes/KeetaNetSDK.Referenced.VoteQuoteBuilder.html +1 -1
  66. package/docs/classes/KeetaNetSDK.Referenced.VoteStaple.html +1 -1
  67. package/docs/classes/KeetaNetSDK.Referenced.VoteStapleHash.html +1 -1
  68. package/docs/classes/KeetaNetSDK.Referenced.src_lib_utils_buffer.BufferStorage.html +1 -1
  69. package/docs/classes/KeetaNetSDK.UserClient.html +42 -5
  70. package/docs/hierarchy.html +1 -1
  71. package/docs/interfaces/KeetaNetSDK.Referenced.ACLEntry.html +1 -1
  72. package/docs/interfaces/KeetaNetSDK.Referenced.ACLUpdate.html +1 -1
  73. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ExplicitContextTag.html +1 -1
  74. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ImplicitContextTag.html +1 -1
  75. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1Object.html +1 -1
  76. package/docs/interfaces/KeetaNetSDK.Referenced.AcceptSwapRequest.html +3 -0
  77. package/docs/interfaces/KeetaNetSDK.Referenced.BaseExternalKeyPairFunctions.html +1 -1
  78. package/docs/interfaces/KeetaNetSDK.Referenced.BaseGenerationConfig.html +1 -1
  79. package/docs/interfaces/KeetaNetSDK.Referenced.BaseIdentifierCreateArguments.html +1 -1
  80. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperation.html +1 -1
  81. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationCREATE_IDENTIFIER.html +1 -1
  82. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMANAGE_CERTIFICATE.html +1 -1
  83. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMANAGE_CERTIFICATESerializable.html +1 -1
  84. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMODIFY_PERMISSIONS.html +1 -1
  85. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationRECEIVE.html +1 -1
  86. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSEND.html +1 -1
  87. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_INFO.html +1 -1
  88. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_REP.html +1 -1
  89. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
  90. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_SUPPLY.html +1 -1
  91. package/docs/interfaces/KeetaNetSDK.Referenced.BlockV1Canonical.html +1 -1
  92. package/docs/interfaces/KeetaNetSDK.Referenced.BlockV2Canonical.html +1 -1
  93. package/docs/interfaces/KeetaNetSDK.Referenced.Constructor.html +1 -1
  94. package/docs/interfaces/KeetaNetSDK.Referenced.CreateSwapRequest.html +3 -0
  95. package/docs/interfaces/KeetaNetSDK.Referenced.DisposableTimingHandle.html +1 -1
  96. package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsNoEncryption.html +1 -1
  97. package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsSupportsEncryption.html +1 -1
  98. package/docs/interfaces/KeetaNetSDK.Referenced.InitialConfigSupply.html +1 -1
  99. package/docs/interfaces/KeetaNetSDK.Referenced.InstanceSet.html +1 -1
  100. package/docs/interfaces/KeetaNetSDK.Referenced.KVGenericOptionsType.html +1 -1
  101. package/docs/interfaces/KeetaNetSDK.Referenced.KVSetOptionsType.html +1 -1
  102. package/docs/interfaces/KeetaNetSDK.Referenced.ModifyTokenBalanceEntry.html +1 -1
  103. package/docs/interfaces/KeetaNetSDK.Referenced.MultiSigIdentifierCreateArguments.html +1 -1
  104. package/docs/interfaces/KeetaNetSDK.Referenced.MultisigConfig.html +1 -1
  105. package/docs/interfaces/KeetaNetSDK.Referenced.NumericValueEntry.html +1 -1
  106. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerBase.html +1 -1
  107. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerListener.html +1 -1
  108. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerRepBase.html +1 -1
  109. package/docs/interfaces/KeetaNetSDK.Referenced.PublicKeyStorage.html +1 -1
  110. package/docs/interfaces/KeetaNetSDK.Referenced.PublishOptions.html +19 -4
  111. package/docs/interfaces/KeetaNetSDK.Referenced.RequestTokenReceiveEntry.html +1 -1
  112. package/docs/interfaces/KeetaNetSDK.Referenced.TokenNumericEntry.html +1 -1
  113. package/docs/interfaces/KeetaNetSDK.Referenced.UserClientConfig.html +2 -2
  114. package/docs/interfaces/KeetaNetSDK.Referenced.UserClientOptions.html +2 -2
  115. package/docs/interfaces/KeetaNetSDK.Referenced.WithIsInstance.html +1 -1
  116. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1BitString.html +1 -1
  117. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Date.html +1 -1
  118. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1OID.html +1 -1
  119. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Set.html +1 -1
  120. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1String.html +1 -1
  121. package/docs/modules/KeetaNetSDK.Referenced.html +1 -1
  122. package/docs/variables/KeetaNetSDK.Referenced.allFullErrorCodes.html +1 -1
  123. package/lib/error/client.d.ts +2 -2
  124. package/lib/error/index.d.ts +1 -1
  125. package/lib/log/target_gcp.d.ts +8 -0
  126. package/lib/log/target_gcp.js +130 -100
  127. package/lib/node/timing.d.ts +3 -2
  128. package/lib/node/utils.d.ts +7 -1
  129. package/npm-shrinkwrap.json +2 -2
  130. package/package.json +1 -1
  131. package/version.d.ts +1 -1
package/client/index.js CHANGED
@@ -58008,6 +58008,58 @@ var __importStar = (this && this.__importStar) || function (mod) {
58008
58008
  __setModuleDefault(result, mod);
58009
58009
  return result;
58010
58010
  };
58011
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
58012
+ if (value !== null && value !== void 0) {
58013
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
58014
+ var dispose, inner;
58015
+ if (async) {
58016
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
58017
+ dispose = value[Symbol.asyncDispose];
58018
+ }
58019
+ if (dispose === void 0) {
58020
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
58021
+ dispose = value[Symbol.dispose];
58022
+ if (async) inner = dispose;
58023
+ }
58024
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
58025
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
58026
+ env.stack.push({ value: value, dispose: dispose, async: async });
58027
+ }
58028
+ else if (async) {
58029
+ env.stack.push({ async: true });
58030
+ }
58031
+ return value;
58032
+ };
58033
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
58034
+ return function (env) {
58035
+ function fail(e) {
58036
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
58037
+ env.hasError = true;
58038
+ }
58039
+ var r, s = 0;
58040
+ function next() {
58041
+ while (r = env.stack.pop()) {
58042
+ try {
58043
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
58044
+ if (r.dispose) {
58045
+ var result = r.dispose.call(r.value);
58046
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
58047
+ }
58048
+ else s |= 1;
58049
+ }
58050
+ catch (e) {
58051
+ fail(e);
58052
+ }
58053
+ }
58054
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
58055
+ if (env.hasError) throw env.error;
58056
+ }
58057
+ return next();
58058
+ };
58059
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
58060
+ var e = new Error(message);
58061
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
58062
+ });
58011
58063
  var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
58012
58064
  if (kind === "m") throw new TypeError("Private method is not writable");
58013
58065
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
@@ -58246,6 +58298,7 @@ class Client {
58246
58298
  * The `blocks` builder will be computed using {@link computeBuilderBlocks} and then transmitted.
58247
58299
  *
58248
58300
  * @param builder The UserClientBuilder to compute and transmit transmit
58301
+ * @param options User provided options {@link PublishOptions }
58249
58302
  * @param network The network to use for the builder (if using a builder)
58250
58303
  * @return The result of the publish operation
58251
58304
  */
@@ -58276,7 +58329,7 @@ class Client {
58276
58329
  throw (new Error('Votes require fees but generateFeeBlock was not defined'));
58277
58330
  }
58278
58331
  const staple = vote_1.VoteStaple.fromVotesAndBlocks(tempVotes, blocks);
58279
- const feeBlock = await options.generateFeeBlock(staple);
58332
+ const feeBlock = await options.generateFeeBlock(staple, options);
58280
58333
  blocks.push(feeBlock);
58281
58334
  }
58282
58335
  const permVotes = await __classPrivateFieldGet(this, _Client_instances, "m", _Client_requestVotes).call(this, blocks, tempVotes);
@@ -58557,21 +58610,43 @@ class Client {
58557
58610
  *
58558
58611
  * @param account The account to get the head block for
58559
58612
  * @param rep The representative to get the head block from -- this is generally "ANY" in which case the best representative will be used, but it is possible to request a specific representative
58560
- * @return The head block for the account or null if the account has
58561
- * not created any blocks
58613
+ * @return The head block and height for the account or null if the account has not created any blocks
58562
58614
  */
58563
- async getHeadBlock(account, rep = 'ANY') {
58615
+ async getAccountHeadInfo(account, rep = 'ANY') {
58564
58616
  account = lib_1.default.Account.toPublicKeyString(account);
58565
58617
  const result = await __classPrivateFieldGet(this, _Client_instances, "m", _Client_api).call(this, rep, 'GET /node/ledger/account/:account/head', {
58566
58618
  args: {
58567
58619
  account
58568
58620
  }
58569
58621
  });
58570
- if (result.block === null) {
58622
+ if (result.block === null || result.height === null) {
58571
58623
  return (null);
58572
58624
  }
58573
58625
  const block = new lib_1.default.Block(result.block);
58574
- return (block);
58626
+ return ({
58627
+ block,
58628
+ height: BigInt(result.height)
58629
+ });
58630
+ }
58631
+ /**
58632
+ * Get the current head block for a given account. This will return the
58633
+ * entire block, or null if the account has not created any blocks.
58634
+ *
58635
+ * An account with no blocks may still have a balance because other users
58636
+ * may have sent tokens to it.
58637
+ *
58638
+ * @param account The account to get the head block for
58639
+ * @param rep The representative to get the head block from -- this is generally "ANY" in which case the best representative will be used, but it is possible to request a specific representative
58640
+ * @return The head block for the account or null if the account has
58641
+ * not created any blocks
58642
+ */
58643
+ async getHeadBlock(account, rep = 'ANY') {
58644
+ account = lib_1.default.Account.toPublicKeyString(account);
58645
+ const headBlockInfo = await this.getAccountHeadInfo(account, rep);
58646
+ if (headBlockInfo === null) {
58647
+ return (null);
58648
+ }
58649
+ return (headBlockInfo.block);
58575
58650
  }
58576
58651
  /**
58577
58652
  * @param blockhash The block hash to get the block for
@@ -59061,8 +59136,9 @@ class Client {
59061
59136
  *
59062
59137
  * @param account Account to recover
59063
59138
  * @param publish Publish the recovered staple to the network (default is true)
59139
+ * @param options options for publishing {@link PublishOptions }
59064
59140
  */
59065
- async recoverAccount(account, publish = true) {
59141
+ async recoverAccount(account, publish = true, options) {
59066
59142
  const successorBlock = await this.getPendingBlock(account);
59067
59143
  if (!successorBlock) {
59068
59144
  return (null);
@@ -59158,7 +59234,7 @@ class Client {
59158
59234
  let newTempVotes = [];
59159
59235
  if (tempVotes.length !== __classPrivateFieldGet(this, _Client_reps, "f").length) {
59160
59236
  try {
59161
- newTempVotes = await __classPrivateFieldGet(this, _Client_instances, "m", _Client_requestVotes).call(this, votedOnBlocks, undefined, missingReps);
59237
+ newTempVotes = await __classPrivateFieldGet(this, _Client_instances, "m", _Client_requestVotes).call(this, votedOnBlocks, undefined, missingReps, options?.quotes);
59162
59238
  }
59163
59239
  catch {
59164
59240
  /* Ignore */
@@ -59166,6 +59242,22 @@ class Client {
59166
59242
  tempVotes = [...tempVotes, ...newTempVotes];
59167
59243
  }
59168
59244
  const missingPermReps = __classPrivateFieldGet(this, _Client_reps, "f").filter(rep => !permReps.includes(rep));
59245
+ // If any of the temporary votes require a fee, we need to generate a fee block
59246
+ let requiresFee = false;
59247
+ for (const vote of tempVotes) {
59248
+ if (vote.fee !== undefined) {
59249
+ requiresFee = true;
59250
+ }
59251
+ }
59252
+ // If we need a fee block and don't have any permanent votes, we need to generate a fee block
59253
+ if (requiresFee && permVotes.length === 0) {
59254
+ if (options?.generateFeeBlock === undefined) {
59255
+ throw (new Error('Votes require fees but generateFeeBlock was not defined'));
59256
+ }
59257
+ const staple = vote_1.VoteStaple.fromVotesAndBlocks(tempVotes, votedOnBlocks);
59258
+ const feeBlock = await options.generateFeeBlock(staple, options);
59259
+ votedOnBlocks.push(feeBlock);
59260
+ }
59169
59261
  try {
59170
59262
  const newPermVotes = await __classPrivateFieldGet(this, _Client_instances, "m", _Client_requestVotes).call(this, votedOnBlocks, tempVotes, missingPermReps);
59171
59263
  permVotes = [...permVotes, ...newPermVotes];
@@ -59200,7 +59292,7 @@ class Client {
59200
59292
  const repAccountInfoPromises = [];
59201
59293
  for (const rep of reps) {
59202
59294
  repAccountInfoPromises.push((async () => {
59203
- const info = await this.getAccountInfo(account, rep);
59295
+ const info = await this.getAccountHeadInfo(account, rep);
59204
59296
  return ({
59205
59297
  rep,
59206
59298
  info
@@ -59215,15 +59307,15 @@ class Client {
59215
59307
  }
59216
59308
  }
59217
59309
  const accountInfoSorted = accountInfo.sort(function (a, b) {
59218
- return (Number(BigInt(a.info.currentHeadBlockHeight ?? -1) - BigInt(b.info.currentHeadBlockHeight ?? -1)));
59310
+ return (Number(BigInt(a.info?.height ?? -1) - BigInt(b.info?.height ?? -1)));
59219
59311
  });
59220
- if (accountInfoSorted[0].info.currentHeadBlockHeight === accountInfoSorted[accountInfoSorted.length - 1].info.currentHeadBlockHeight) {
59312
+ if (accountInfoSorted[0].info?.height === accountInfoSorted[accountInfoSorted.length - 1].info?.height) {
59221
59313
  // Block Heights match so return
59222
59314
  return (null);
59223
59315
  }
59224
- let lowestHead = accountInfoSorted[0].info.currentHeadBlock;
59225
- if (lowestHead === null) {
59226
- lowestHead = block_1.default.getAccountOpeningHash(account).toString();
59316
+ let lowestHead = accountInfoSorted[0].info?.block.hash;
59317
+ if (lowestHead === null || lowestHead === undefined) {
59318
+ lowestHead = block_1.default.getAccountOpeningHash(account);
59227
59319
  }
59228
59320
  // Get the missing successor block and vote staple from the rep with the highest block height
59229
59321
  const successorBlock = await this.getSuccessorBlock(lowestHead, accountInfoSorted[accountInfoSorted.length - 1].rep);
@@ -59237,8 +59329,8 @@ class Client {
59237
59329
  if (publish === true) {
59238
59330
  await this.transmitStaple(successorStaple, [accountInfoSorted[0].rep]);
59239
59331
  }
59240
- const updatedAccountInfo = await this.getAccountInfo(account, accountInfoSorted[0].rep);
59241
- if (updatedAccountInfo.currentHeadBlockHeight === accountInfoSorted[0].info.currentHeadBlockHeight) {
59332
+ const updatedAccountInfo = await this.getAccountHeadInfo(account, accountInfoSorted[0].rep);
59333
+ if (updatedAccountInfo?.height === accountInfoSorted[0].info?.height) {
59242
59334
  throw (new client_1.default('CLIENT_SYNC_PUBLISH_FAILED', `Client sync found a missing staple: ${successorStaple.blocksHash}, but it could not be published to rep: ${accountInfoSorted[0].rep.key.publicKeyString.get()}`));
59243
59335
  }
59244
59336
  return (successorStaple);
@@ -59364,10 +59456,16 @@ async function _Client_apiRaw(rep, api, method, options = {}) {
59364
59456
  const keetaNetError = error_1.KeetaNetError.fromJSON(errorInfo);
59365
59457
  try {
59366
59458
  if (ledger_1.KeetaNetLedgerVoteError.isInstance(keetaNetError)) {
59459
+ let syncPerformed = false;
59367
59460
  for (const account of keetaNetError.accounts) {
59368
- await this.syncAccount(account);
59461
+ const successorStaple = await this.syncAccount(account);
59462
+ if (successorStaple !== null) {
59463
+ syncPerformed = true;
59464
+ }
59465
+ }
59466
+ if (syncPerformed) {
59467
+ continue;
59369
59468
  }
59370
- continue;
59371
59469
  }
59372
59470
  }
59373
59471
  catch {
@@ -59836,6 +59934,103 @@ class UserClient {
59836
59934
  };
59837
59935
  return (new UserClient(config));
59838
59936
  }
59937
+ /**
59938
+ * Initiate a swap request
59939
+ *
59940
+ * @param request {@link CreateSwapRequest}
59941
+ * Defines what is being sent from {@link Account}, {@link TokenAddress} and Amount
59942
+ * Defines what is being received from {@link Account}, {@link TokenAddress} and Converted Amount
59943
+ * @param client either a UserClient instance or network and signer from which to create a UserClient
59944
+ * @param options User client options (common options)
59945
+ * @returns Swap {@link Block}
59946
+ */
59947
+ static async createSwapRequest(request, client, options) {
59948
+ let userClient;
59949
+ if (UserClient.isInstance(client)) {
59950
+ userClient = client;
59951
+ }
59952
+ else {
59953
+ userClient = this.fromNetwork(client.network, client.signer, options);
59954
+ }
59955
+ if (userClient === undefined) {
59956
+ throw (new Error('UserClient Should have been defined for swap'));
59957
+ }
59958
+ const { from, to } = request;
59959
+ if (options?.account !== undefined && !request.from.account.comparePublicKey(options.account)) {
59960
+ throw (new client_1.default('CLIENT_SWAP_INVALID_ACCOUNT_OPTION', 'account should be provided in the request instead of options'));
59961
+ }
59962
+ const builder = userClient.initBuilder({ ...options, account: request.from.account });
59963
+ builder.send(to.account, from.amount, from.token);
59964
+ builder.receive(to.account, to.amount, to.token, true);
59965
+ const blocks = await builder.computeBlocks();
59966
+ if (blocks.blocks.length !== 1) {
59967
+ throw (new Error('Compute Swap Request Generated more than 1 block'));
59968
+ }
59969
+ return (blocks.blocks[0]);
59970
+ }
59971
+ static async acceptSwapRequest(request, builderOrUserClient, options) {
59972
+ let builder;
59973
+ let account;
59974
+ if (builder_1.UserClientBuilder.isInstance(builderOrUserClient)) {
59975
+ builder = builderOrUserClient;
59976
+ account = builder.defaultOptions.account;
59977
+ }
59978
+ else {
59979
+ let userClient;
59980
+ if (UserClient.isInstance(builderOrUserClient)) {
59981
+ userClient = builderOrUserClient;
59982
+ account = builderOrUserClient.account;
59983
+ }
59984
+ else {
59985
+ const env_1 = { stack: [], error: void 0, hasError: false };
59986
+ try {
59987
+ // Use await using so this temporary client gets cleaned up
59988
+ const temporaryClient = __addDisposableResource(env_1, this.fromNetwork(builderOrUserClient.network, builderOrUserClient.signer, options), true);
59989
+ userClient = temporaryClient;
59990
+ account = options?.account ?? builderOrUserClient.signer;
59991
+ if (account === null) {
59992
+ throw (new client_1.default('CLIENT_SWAP_INVALID_ACCOUNT_OPTION', 'Signer is required for building swap block'));
59993
+ }
59994
+ }
59995
+ catch (e_1) {
59996
+ env_1.error = e_1;
59997
+ env_1.hasError = true;
59998
+ }
59999
+ finally {
60000
+ const result_1 = __disposeResources(env_1);
60001
+ if (result_1)
60002
+ await result_1;
60003
+ }
60004
+ }
60005
+ builder = userClient.initBuilder(options);
60006
+ }
60007
+ if (account === undefined) {
60008
+ throw (new client_1.default('CLIENT_SWAP_INVALID_ACCOUNT_OPTION', 'Unable to determine account for swap'));
60009
+ }
60010
+ const sendOperation = request.block.operations.find(({ type }) => block_1.default.OperationType.SEND === type);
60011
+ const receiveOperation = request.block.operations.find(({ type }) => block_1.default.OperationType.RECEIVE === type);
60012
+ if (!sendOperation || sendOperation.type !== block_1.default.OperationType.SEND) {
60013
+ throw (new client_1.default('CLIENT_SWAP_MISSING_SEND', 'Swap Request is missing send'));
60014
+ }
60015
+ if (!receiveOperation || receiveOperation.type !== block_1.default.OperationType.RECEIVE) {
60016
+ throw (new client_1.default('CLIENT_SWAP_MISSING_RECEIVE', 'Swap Request is missing receive operation'));
60017
+ }
60018
+ if (!sendOperation.to.comparePublicKey(receiveOperation.from)) {
60019
+ throw (new client_1.default('CLIENT_SWAP_SEND_RECEIVE_ACCOUNT_MISMATCH', 'The SEND and RECEIVE operations must have matching accounts.'));
60020
+ }
60021
+ if (!sendOperation.to.comparePublicKey(account)) {
60022
+ throw (new client_1.default('CLIENT_SWAP_SEND_ACCOUNT_MISMATCH', 'Swap Request send account does not match'));
60023
+ }
60024
+ if (request.expected?.token !== undefined && !sendOperation.token.comparePublicKey(request.expected?.token)) {
60025
+ throw (new client_1.default('CLIENT_SWAP_REQUEST_TOKEN_MISMATCH', 'Swap Request send token does not match expected'));
60026
+ }
60027
+ if (request.expected?.amount !== undefined && sendOperation.amount !== request.expected?.amount) {
60028
+ throw (new client_1.default('CLIENT_SWAP_REQUEST_AMOUNT_MISMATCH', 'Swap Request send amount does not match expected'));
60029
+ }
60030
+ builder.send(request.block.account, receiveOperation.amount, receiveOperation.token);
60031
+ const blocks = await builder.computeBlocks();
60032
+ return ([...blocks.blocks, request.block]);
60033
+ }
59839
60034
  /**
59840
60035
  * Helper method to filter a list of vote staples into
59841
60036
  * a list of blocks and operations that are related to
@@ -59942,8 +60137,8 @@ class UserClient {
59942
60137
  this.networkAddress = networkAddress;
59943
60138
  this.baseToken = baseToken;
59944
60139
  __classPrivateFieldSet(this, _UserClient_config, {
59945
- generateFeeBlock: async (staple) => {
59946
- const builder = this.initBuilder();
60140
+ generateFeeBlock: async (staple, options) => {
60141
+ const builder = this.initBuilder(options);
59947
60142
  const block = await builder.computeFeeBlock(staple);
59948
60143
  return (block);
59949
60144
  },
@@ -60090,6 +60285,22 @@ class UserClient {
60090
60285
  from: 'publish-aid'
60091
60286
  });
60092
60287
  }
60288
+ /**
60289
+ * Transmit a set of blocks to the network. This will request short
60290
+ * votes and permanent votes for the blocks and then publish them to
60291
+ * the network. Optionally it will generate a fee block from a user
60292
+ * provided function if fees are required.
60293
+ *
60294
+ * @param blocks The blocks to transmit
60295
+ * @param options User provided options {@link PublishOptions }
60296
+ * @return The result of the publish operation
60297
+ */
60298
+ async transmit(blocks, options = {}) {
60299
+ if (options.generateFeeBlock === undefined) {
60300
+ options.generateFeeBlock = __classPrivateFieldGet(this, _UserClient_config, "f").generateFeeBlock;
60301
+ }
60302
+ return (await __classPrivateFieldGet(this, _UserClient_client, "f").transmit(blocks, options));
60303
+ }
60093
60304
  /**
60094
60305
  * Set the metadata for an account and publish the blocks to the
60095
60306
  * network.
@@ -60350,7 +60561,7 @@ class UserClient {
60350
60561
  * @param options User client options (common options)
60351
60562
  */
60352
60563
  async recover(publish, options = {}) {
60353
- return (await __classPrivateFieldGet(this, _UserClient_client, "f").recoverAccount(__classPrivateFieldGet(this, _UserClient_instances, "m", _UserClient_getAccount).call(this, options), publish));
60564
+ return (await __classPrivateFieldGet(this, _UserClient_client, "f").recoverAccount(__classPrivateFieldGet(this, _UserClient_instances, "m", _UserClient_getAccount).call(this, options), publish, options));
60354
60565
  }
60355
60566
  /**
60356
60567
  * Fetch a block from a given idempotent key
@@ -60370,6 +60581,33 @@ class UserClient {
60370
60581
  async sync(publish, options = {}) {
60371
60582
  return (await __classPrivateFieldGet(this, _UserClient_client, "f").syncAccount(__classPrivateFieldGet(this, _UserClient_instances, "m", _UserClient_getAccount).call(this, options), publish));
60372
60583
  }
60584
+ /**
60585
+ * Initiate a swap request
60586
+ *
60587
+ * @param request {@link CreateSwapRequest}
60588
+ * Defines what is being sent from {@link Account}, {@link TokenAddress} and Amount
60589
+ * Defines what is being received from {@link Account}, {@link TokenAddress} and Converted Amount
60590
+ * @param options User client options (common options)
60591
+ * @returns Swap {@link Block}
60592
+ */
60593
+ async createSwapRequest(request, options) {
60594
+ return (await UserClient.createSwapRequest(request, this, options));
60595
+ }
60596
+ /**
60597
+ * Finalize a swap request
60598
+ *
60599
+ * @param request {@link AcceptSwapRequest} initial swap request block and optional expected token and amounts
60600
+ * @param builderOrOptions {@link UserClientBuilder} or {@link UserClientOptions} to use for building the swap block
60601
+ * @returns Blocks
60602
+ */
60603
+ async acceptSwapRequest(request, builderOrOptions) {
60604
+ if (builder_1.UserClientBuilder.isInstance(builderOrOptions)) {
60605
+ return (await UserClient.acceptSwapRequest(request, builderOrOptions));
60606
+ }
60607
+ else {
60608
+ return (await UserClient.acceptSwapRequest(request, this, builderOrOptions));
60609
+ }
60610
+ }
60373
60611
  /**
60374
60612
  * Register a callback for change messages and set up a websocket filtered to our account only.
60375
60613
  * Also set up long timeout polling for changes in case the websocket misses a change update
@@ -65336,7 +65574,15 @@ exports.ClientErrorCodes = [
65336
65574
  'BUILDER_USER_CLIENT_REQUIRED',
65337
65575
  'PUBLISH_AID_NOT_AVAILABLE',
65338
65576
  'SIGNER_REQUIRES_PRIVATE_KEY',
65339
- 'SYNC_PUBLISH_FAILED'
65577
+ 'SYNC_PUBLISH_FAILED',
65578
+ 'SWAP_INVALID_ACCOUNT_OPTION',
65579
+ 'SWAP_OPTIONS_INVALID',
65580
+ 'SWAP_MISSING_SEND',
65581
+ 'SWAP_MISSING_RECEIVE',
65582
+ 'SWAP_SEND_RECEIVE_ACCOUNT_MISMATCH',
65583
+ 'SWAP_SEND_ACCOUNT_MISMATCH',
65584
+ 'SWAP_REQUEST_TOKEN_MISMATCH',
65585
+ 'SWAP_REQUEST_AMOUNT_MISMATCH'
65340
65586
  ];
65341
65587
  exports.FullClientErrorCodes = exports.ClientErrorCodes.map(code => `${ClientErrorType}_${code}`);
65342
65588
  class KeetaNetClientError extends base_1.KeetaNetErrorBase {
@@ -69271,13 +69517,18 @@ class Log {
69271
69517
  *
69272
69518
  * The default value for `<name>` is `KEETANET`.
69273
69519
  */
69274
- static Legacy(name) {
69275
- if (name === undefined) {
69276
- name = 'KEETANET';
69520
+ static Legacy(name = 'KEETANET') {
69521
+ if (Log.legacyLoggerInstance) {
69522
+ if (__classPrivateFieldGet(Log.legacyLoggerInstance, _Log_destroyed, "f")) {
69523
+ Log.legacyLoggerInstance = undefined;
69524
+ }
69525
+ }
69526
+ if (Log.legacyLoggerInstance) {
69527
+ return (Log.legacyLoggerInstance);
69277
69528
  }
69278
69529
  const extraConfig = {};
69279
69530
  if (process !== undefined) {
69280
- let environmentLogLevel = process.env[`${name}_DEBUG`]?.toUpperCase() ?? 'NONE';
69531
+ let environmentLogLevel = process.env[`${name}_DEBUG`]?.toUpperCase() ?? process.env[`${name}_LAMBDA_LOG_LEVEL`]?.toUpperCase() ?? 'NONE';
69281
69532
  if (environmentLogLevel === 'TRUE') {
69282
69533
  environmentLogLevel = 'DEBUG';
69283
69534
  }
@@ -69285,16 +69536,11 @@ class Log {
69285
69536
  environmentLogLevel = 'NONE';
69286
69537
  }
69287
69538
  extraConfig.logLevel = (0, helper_generated_1.assertLogTargetLevel)(environmentLogLevel);
69288
- extraConfig.filter = new RegExp(process.env[`${name}_DEBUG_FILTER`] ?? '', 'i');
69289
- }
69290
- if (Log.legacyLoggerInstance) {
69291
- if (__classPrivateFieldGet(Log.legacyLoggerInstance, _Log_destroyed, "f")) {
69292
- Log.legacyLoggerInstance = undefined;
69539
+ const logFilterString = process.env[`${name}_DEBUG_FILTER`] ?? process.env[`${name}_LAMBDA_LOG_FILTER`] ?? '';
69540
+ if (logFilterString !== '') {
69541
+ extraConfig.filter = new RegExp(logFilterString, 'i');
69293
69542
  }
69294
69543
  }
69295
- if (Log.legacyLoggerInstance) {
69296
- return (Log.legacyLoggerInstance);
69297
- }
69298
69544
  const logger = new Log();
69299
69545
  logger.registerConsoleTarget({
69300
69546
  logLevel: Log.defaultLevel,
@@ -69839,7 +70085,7 @@ exports["default"] = Node;
69839
70085
  /***/ }),
69840
70086
 
69841
70087
  /***/ 2895:
69842
- /***/ (function(__unused_webpack_module, exports) {
70088
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
69843
70089
 
69844
70090
  "use strict";
69845
70091
 
@@ -69854,9 +70100,13 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
69854
70100
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
69855
70101
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
69856
70102
  };
70103
+ var __importDefault = (this && this.__importDefault) || function (mod) {
70104
+ return (mod && mod.__esModule) ? mod : { "default": mod };
70105
+ };
69857
70106
  var _RequestTiming_timing, _RequestTiming_counter;
69858
70107
  Object.defineProperty(exports, "__esModule", ({ value: true }));
69859
70108
  exports.RequestTiming = void 0;
70109
+ const log_1 = __importDefault(__webpack_require__(9));
69860
70110
  /**
69861
70111
  * Support the old way of doing timing where the callers could call
69862
70112
  * startTime/endTime with the same string to terminate a timing section
@@ -70009,7 +70259,7 @@ class RequestTiming {
70009
70259
  }
70010
70260
  exports.RequestTiming = RequestTiming;
70011
70261
  _RequestTiming_timing = new WeakMap(), _RequestTiming_counter = new WeakMap();
70012
- RequestTiming.defaultLogger = console;
70262
+ RequestTiming.defaultLogger = log_1.default.Legacy();
70013
70263
  exports["default"] = RequestTiming;
70014
70264
 
70015
70265
 
@@ -78545,7 +78795,7 @@ exports.Testing = { findRDN, blockHashesFromVote, feeFromVote };
78545
78795
 
78546
78796
  Object.defineProperty(exports, "__esModule", ({ value: true }));
78547
78797
  exports.version = void 0;
78548
- exports.version = '0.14.7+gc361cc93bcd5918c1bfac43f60a0a68020a0ecb1';
78798
+ exports.version = '0.14.8+g2ae53aba450fae088463ac1a8f545b6460825c5b';
78549
78799
  exports["default"] = exports.version;
78550
78800
 
78551
78801
 
@@ -1 +1 @@
1
- window.hierarchyData = "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"
1
+ window.hierarchyData = "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"
@@ -1 +1 @@
1
- window.navigationData = "eJyNz0ELgjAYxvHvsrNlKcTwFikSggddJ/EwtzccTQ03Iwi/e4PAqQfpuvfPjz3FB2l4axSgOCLkmsa7nJwzEoXIQU+qa3PgHRsaaLVyV8m+1o003UO0HAXYx/h0wKMziQmApinoPEys1nR8kKDc2XHpeA5itZC8hxYFxYRlcAfzxIBvW7ZbsbOPXaQwe6zDJFVq5fyapXH05vNuCvp/JNttaVJUlnnRXtBqPc0kS8H3xnIsv9F3k/E="
1
+ window.navigationData = "eJyNz8ELgjAUx/H/5Z1XlkKIt0iREDyoncTDdC8czRnbjCD83zsETj1I5/flw/uVHzD4NhBAHBXFNY13eXHOiigEAk9qWgiA9c3QoTTaWSX71nQCCDy4ZBD4nu+fDv5IJjFBNDRFk4eJ1bqeDQK1MzsuHZdA03LBFEoIygnL8I4KZYNs27Ldip09dhEcpbFOI6jWK+fXLI2jO59306j+kWy3pQleW+ZFFaf1eprg9VLw3LEaqy/Rd5Px"