@keetanetwork/keetanet-client 0.14.12 → 0.14.13

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 (121) hide show
  1. package/client/index-browser.d.ts +35 -3
  2. package/client/index-browser.js +96 -26
  3. package/client/index.d.ts +35 -3
  4. package/client/index.js +116 -49
  5. package/docs/assets/hierarchy.js +1 -1
  6. package/docs/assets/search.js +1 -1
  7. package/docs/classes/KeetaNetSDK.Referenced.BaseSet.html +1 -1
  8. package/docs/classes/KeetaNetSDK.Referenced.BaseVoteBuilder.html +1 -1
  9. package/docs/classes/KeetaNetSDK.Referenced.Block.html +1 -1
  10. package/docs/classes/KeetaNetSDK.Referenced.BlockHash.html +1 -1
  11. package/docs/classes/KeetaNetSDK.Referenced.BlockOperation.html +1 -1
  12. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationCREATE_IDENTIFIER.html +1 -1
  13. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMANAGE_CERTIFICATE.html +1 -1
  14. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMODIFY_PERMISSIONS.html +1 -1
  15. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationRECEIVE.html +1 -1
  16. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSEND.html +1 -1
  17. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_INFO.html +1 -1
  18. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_REP.html +1 -1
  19. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
  20. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_SUPPLY.html +1 -1
  21. package/docs/classes/KeetaNetSDK.Referenced.CertificateHash.html +1 -1
  22. package/docs/classes/KeetaNetSDK.Referenced.ECDSAKeyPair.html +1 -1
  23. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1KeyPair.html +1 -1
  24. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PrivateKey.html +1 -1
  25. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PublicKey.html +1 -1
  26. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1Signature.html +1 -1
  27. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1KeyPair.html +1 -1
  28. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PrivateKey.html +1 -1
  29. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PublicKey.html +1 -1
  30. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1Signature.html +1 -1
  31. package/docs/classes/KeetaNetSDK.Referenced.ED25519KeyPair.html +1 -1
  32. package/docs/classes/KeetaNetSDK.Referenced.ED25519PrivateKey.html +1 -1
  33. package/docs/classes/KeetaNetSDK.Referenced.ED25519PublicKey.html +1 -1
  34. package/docs/classes/KeetaNetSDK.Referenced.ED25519Signature.html +1 -1
  35. package/docs/classes/KeetaNetSDK.Referenced.ExternalKeyPair.html +1 -1
  36. package/docs/classes/KeetaNetSDK.Referenced.ExternalSet.html +1 -1
  37. package/docs/classes/KeetaNetSDK.Referenced.IdempotentKey.html +1 -1
  38. package/docs/classes/KeetaNetSDK.Referenced.IdentifierKey.html +1 -1
  39. package/docs/classes/KeetaNetSDK.Referenced.IdentifierKeyPair.html +1 -1
  40. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetError.html +2 -2
  41. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetErrorBase.html +1 -1
  42. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerError.html +1 -1
  43. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerIdempotentKeyError.html +1 -1
  44. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerVoteError.html +1 -1
  45. package/docs/classes/KeetaNetSDK.Referenced.KeyInterface.html +1 -1
  46. package/docs/classes/KeetaNetSDK.Referenced.KeyStorage.html +1 -1
  47. package/docs/classes/KeetaNetSDK.Referenced.PermissionSetHolder.html +1 -1
  48. package/docs/classes/KeetaNetSDK.Referenced.PossiblyExpiredVote.html +1 -1
  49. package/docs/classes/KeetaNetSDK.Referenced.SignatureStorage.html +1 -1
  50. package/docs/classes/KeetaNetSDK.Referenced.Stats.html +1 -1
  51. package/docs/classes/KeetaNetSDK.Referenced.StatsPending.html +1 -1
  52. package/docs/classes/KeetaNetSDK.Referenced.VoteBlockBundle.html +1 -1
  53. package/docs/classes/KeetaNetSDK.Referenced.VoteBlockHash.html +1 -1
  54. package/docs/classes/KeetaNetSDK.Referenced.VoteBuilder.html +1 -1
  55. package/docs/classes/KeetaNetSDK.Referenced.VoteHash.html +1 -1
  56. package/docs/classes/KeetaNetSDK.Referenced.VoteLikeBase.html +1 -1
  57. package/docs/classes/KeetaNetSDK.Referenced.VoteQuoteBuilder.html +1 -1
  58. package/docs/classes/KeetaNetSDK.Referenced.VoteStapleHash.html +1 -1
  59. package/docs/classes/KeetaNetSDK.Referenced.src_lib_utils_buffer.BufferStorage.html +1 -1
  60. package/docs/hierarchy.html +1 -1
  61. package/docs/interfaces/KeetaNetSDK.Referenced.ACLEntry.html +1 -1
  62. package/docs/interfaces/KeetaNetSDK.Referenced.ACLUpdate.html +1 -1
  63. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ExplicitContextTag.html +1 -1
  64. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ImplicitContextTag.html +1 -1
  65. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1Object.html +1 -1
  66. package/docs/interfaces/KeetaNetSDK.Referenced.AcceptSwapRequest.html +7 -2
  67. package/docs/interfaces/KeetaNetSDK.Referenced.BaseExternalKeyPairFunctions.html +1 -1
  68. package/docs/interfaces/KeetaNetSDK.Referenced.BaseGenerationConfig.html +1 -1
  69. package/docs/interfaces/KeetaNetSDK.Referenced.BaseIdentifierCreateArguments.html +1 -1
  70. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperation.html +1 -1
  71. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationCREATE_IDENTIFIER.html +1 -1
  72. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMANAGE_CERTIFICATE.html +1 -1
  73. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMANAGE_CERTIFICATESerializable.html +1 -1
  74. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMODIFY_PERMISSIONS.html +1 -1
  75. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationRECEIVE.html +1 -1
  76. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSEND.html +1 -1
  77. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_INFO.html +1 -1
  78. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_REP.html +1 -1
  79. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
  80. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_SUPPLY.html +1 -1
  81. package/docs/interfaces/KeetaNetSDK.Referenced.BlockV1Canonical.html +1 -1
  82. package/docs/interfaces/KeetaNetSDK.Referenced.BlockV2Canonical.html +1 -1
  83. package/docs/interfaces/KeetaNetSDK.Referenced.Constructor.html +1 -1
  84. package/docs/interfaces/KeetaNetSDK.Referenced.CreateSwapRequest.html +3 -2
  85. package/docs/interfaces/KeetaNetSDK.Referenced.DisposableTimingHandle.html +1 -1
  86. package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsNoEncryption.html +1 -1
  87. package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsSupportsEncryption.html +1 -1
  88. package/docs/interfaces/KeetaNetSDK.Referenced.InitialConfigSupply.html +1 -1
  89. package/docs/interfaces/KeetaNetSDK.Referenced.InstanceSet.html +1 -1
  90. package/docs/interfaces/KeetaNetSDK.Referenced.KVGenericOptionsType.html +1 -1
  91. package/docs/interfaces/KeetaNetSDK.Referenced.KVSetOptionsType.html +1 -1
  92. package/docs/interfaces/KeetaNetSDK.Referenced.ModifyTokenBalanceEntry.html +1 -1
  93. package/docs/interfaces/KeetaNetSDK.Referenced.MultiSigIdentifierCreateArguments.html +1 -1
  94. package/docs/interfaces/KeetaNetSDK.Referenced.MultisigConfig.html +1 -1
  95. package/docs/interfaces/KeetaNetSDK.Referenced.NumericValueEntry.html +1 -1
  96. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerBase.html +1 -1
  97. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerListener.html +1 -1
  98. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerRepBase.html +1 -1
  99. package/docs/interfaces/KeetaNetSDK.Referenced.PublicKeyStorage.html +1 -1
  100. package/docs/interfaces/KeetaNetSDK.Referenced.PublishOptions.html +1 -1
  101. package/docs/interfaces/KeetaNetSDK.Referenced.RequestTokenReceiveEntry.html +1 -1
  102. package/docs/interfaces/KeetaNetSDK.Referenced.TokenNumericEntry.html +1 -1
  103. package/docs/interfaces/KeetaNetSDK.Referenced.UserClientConfig.html +1 -1
  104. package/docs/interfaces/KeetaNetSDK.Referenced.UserClientOptions.html +1 -1
  105. package/docs/interfaces/KeetaNetSDK.Referenced.WithIsInstance.html +1 -1
  106. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1BitString.html +1 -1
  107. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Date.html +1 -1
  108. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1OID.html +1 -1
  109. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Set.html +1 -1
  110. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1String.html +1 -1
  111. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Struct.html +1 -1
  112. package/docs/modules/KeetaNetSDK.Referenced.html +1 -1
  113. package/docs/types/KeetaNetSDK.Referenced.AcceptSwapRequestExpectedDeprecated.html +4 -0
  114. package/docs/variables/KeetaNetSDK.Referenced.allFullErrorCodes.html +1 -1
  115. package/lib/block/index.d.ts +1 -1
  116. package/lib/error/block.d.ts +2 -2
  117. package/lib/error/client.d.ts +2 -2
  118. package/lib/error/index.d.ts +1 -1
  119. package/npm-shrinkwrap.json +2 -2
  120. package/package.json +1 -1
  121. package/version.d.ts +1 -1
package/client/index.js CHANGED
@@ -59991,7 +59991,7 @@ class UserClient {
59991
59991
  }
59992
59992
  const builder = userClient.initBuilder({ ...options, account: request.from.account });
59993
59993
  builder.send(to.account, from.amount, from.token);
59994
- builder.receive(to.account, to.amount, to.token, true);
59994
+ builder.receive(to.account, to.amount, to.token, request.to.exact ?? false);
59995
59995
  const blocks = await builder.computeBlocks();
59996
59996
  if (blocks.blocks.length !== 1) {
59997
59997
  throw (new Error('Compute Swap Request Generated more than 1 block'));
@@ -60009,7 +60009,7 @@ class UserClient {
60009
60009
  let userClient;
60010
60010
  if (UserClient.isInstance(builderOrUserClient)) {
60011
60011
  userClient = builderOrUserClient;
60012
- account = builderOrUserClient.account;
60012
+ account = options?.account ?? builderOrUserClient.account;
60013
60013
  }
60014
60014
  else {
60015
60015
  const env_1 = { stack: [], error: void 0, hasError: false };
@@ -60051,13 +60051,41 @@ class UserClient {
60051
60051
  if (!sendOperation.to.comparePublicKey(account)) {
60052
60052
  throw (new client_1.default('CLIENT_SWAP_SEND_ACCOUNT_MISMATCH', 'Swap Request send account does not match'));
60053
60053
  }
60054
- if (request.expected?.token !== undefined && !sendOperation.token.comparePublicKey(request.expected?.token)) {
60055
- throw (new client_1.default('CLIENT_SWAP_REQUEST_TOKEN_MISMATCH', 'Swap Request send token does not match expected'));
60056
- }
60057
- if (request.expected?.amount !== undefined && sendOperation.amount !== request.expected?.amount) {
60058
- throw (new client_1.default('CLIENT_SWAP_REQUEST_AMOUNT_MISMATCH', 'Swap Request send amount does not match expected'));
60054
+ let sendAmount = receiveOperation.amount;
60055
+ if (request.expected) {
60056
+ let expectedReceive;
60057
+ let expectedSend;
60058
+ if ('receive' in request.expected || 'send' in request.expected) {
60059
+ expectedReceive = request.expected?.receive;
60060
+ expectedSend = request.expected?.send;
60061
+ }
60062
+ else if ('token' in request.expected || 'amount' in request.expected) {
60063
+ expectedReceive = request.expected;
60064
+ }
60065
+ if (expectedReceive) {
60066
+ if (expectedReceive.token !== undefined && !sendOperation.token.comparePublicKey(expectedReceive.token)) {
60067
+ throw (new client_1.default('CLIENT_SWAP_REQUEST_TOKEN_MISMATCH', 'Swap Request send token does not match expected'));
60068
+ }
60069
+ if (expectedReceive.amount !== undefined && sendOperation.amount !== expectedReceive.amount) {
60070
+ throw (new client_1.default('CLIENT_SWAP_REQUEST_AMOUNT_MISMATCH', 'Swap Request send amount does not match expected'));
60071
+ }
60072
+ }
60073
+ if (expectedSend) {
60074
+ if (expectedSend.token !== undefined && !(expectedSend.token.comparePublicKey(receiveOperation.token))) {
60075
+ throw (new client_1.default('CLIENT_SWAP_SEND_TOKEN_MISMATCH', 'Swap acceptance send token does not match swap request receive token'));
60076
+ }
60077
+ if (expectedSend.amount !== undefined) {
60078
+ if (expectedSend.amount < receiveOperation.amount) {
60079
+ throw (new client_1.default('CLIENT_SWAP_SEND_AMOUNT_TOO_LOW', 'Send amount must be at least the receive amount specified in the swap request'));
60080
+ }
60081
+ if (receiveOperation.exact && receiveOperation.amount !== expectedSend.amount) {
60082
+ throw (new client_1.default('CLIENT_SWAP_SEND_AMOUNT_RECEIVE_EXACT_MISMATCH', 'Send value is not allowed to differ from expected receive amount for exact receives'));
60083
+ }
60084
+ sendAmount = expectedSend.amount;
60085
+ }
60086
+ }
60059
60087
  }
60060
- builder.send(request.block.account, receiveOperation.amount, receiveOperation.token);
60088
+ builder.send(request.block.account, sendAmount, receiveOperation.token);
60061
60089
  const blocks = await builder.computeBlocks();
60062
60090
  return ([...blocks.blocks, request.block]);
60063
60091
  }
@@ -62822,7 +62850,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
62822
62850
  var __importDefault = (this && this.__importDefault) || function (mod) {
62823
62851
  return (mod && mod.__esModule) ? mod : { "default": mod };
62824
62852
  };
62825
- var _Block_instances, _a, _Block_valueBytes, _Block_valueHash, _Block_getSortedRequiredSigners, _Block_validateOperationsPurpose, _Block_validateSignerField, _Block_validateSignatures, _BlockBuilder_block;
62853
+ var _Block_instances, _a, _Block_valueBytes, _Block_valueHash, _Block_getSortedRequiredSigners, _Block_validateBytes, _Block_validateOperationsPurpose, _Block_validateSignerField, _Block_validateSignatures, _BlockBuilder_block;
62826
62854
  Object.defineProperty(exports, "__esModule", ({ value: true }));
62827
62855
  exports.BlockBuilder = exports.Block = exports.BlockHash = exports.AdjustMethod = exports.BlockPurpose = void 0;
62828
62856
  exports.toAdjustMethod = toAdjustMethod;
@@ -63501,6 +63529,7 @@ class Block {
63501
63529
  if (this.account.isMultisig()) {
63502
63530
  throw (new block_1.default('BLOCK_NO_MULTISIG_OP', 'Cannot create a block for a multisig account'));
63503
63531
  }
63532
+ __classPrivateFieldGet(this, _Block_instances, "m", _Block_validateBytes).call(this);
63504
63533
  __classPrivateFieldGet(this, _Block_instances, "m", _Block_validateSignerField).call(this);
63505
63534
  __classPrivateFieldGet(this, _Block_instances, "m", _Block_validateOperationsPurpose).call(this);
63506
63535
  __classPrivateFieldGet(this, _Block_instances, "m", _Block_validateSignatures).call(this);
@@ -63508,9 +63537,11 @@ class Block {
63508
63537
  static getAccountOpeningHash(account) {
63509
63538
  return (BlockHash.getAccountOpeningHash(account));
63510
63539
  }
63511
- toBytes(includeSignatures = true) {
63512
- if (__classPrivateFieldGet(this, _Block_valueBytes, "f") !== undefined && includeSignatures) {
63513
- return (__classPrivateFieldGet(this, _Block_valueBytes, "f"));
63540
+ toBytes(includeSignatures = true, useCached = true) {
63541
+ if (useCached) {
63542
+ if (__classPrivateFieldGet(this, _Block_valueBytes, "f") !== undefined && includeSignatures) {
63543
+ return (__classPrivateFieldGet(this, _Block_valueBytes, "f"));
63544
+ }
63514
63545
  }
63515
63546
  const sharedBlockValues = {
63516
63547
  previous: this.previous,
@@ -63712,6 +63743,18 @@ _a = Block, _Block_valueBytes = new WeakMap(), _Block_valueHash = new WeakMap(),
63712
63743
  }
63713
63744
  }
63714
63745
  return (out);
63746
+ }, _Block_validateBytes = function _Block_validateBytes() {
63747
+ const existingBytes = __classPrivateFieldGet(this, _Block_valueBytes, "f");
63748
+ if (existingBytes === undefined) {
63749
+ return;
63750
+ }
63751
+ const recalculatedBytesBuffer = Buffer.from(this.toBytes(true, false));
63752
+ const existingBytesBuffer = Buffer.from(existingBytes);
63753
+ if (!recalculatedBytesBuffer.equals(existingBytesBuffer)) {
63754
+ const existingBytesHash = Buffer.from((0, hash_1.Hash)(existingBytesBuffer)).toString('hex').toUpperCase();
63755
+ const recalculatedBytesHash = Buffer.from((0, hash_1.Hash)(recalculatedBytesBuffer)).toString('hex').toUpperCase();
63756
+ throw (new block_1.default('BLOCK_INVALID_SIGNATURE', `Block signed bytes (${existingBytesHash}) do not match calculated bytes (${recalculatedBytesHash})`));
63757
+ }
63715
63758
  }, _Block_validateOperationsPurpose = function _Block_validateOperationsPurpose() {
63716
63759
  /**
63717
63760
  * Do not allow blocks to contain invalid constructions
@@ -63767,7 +63810,7 @@ _a = Block, _Block_valueBytes = new WeakMap(), _Block_valueHash = new WeakMap(),
63767
63810
  const signature = new buffer_1.BufferStorage(this.signatures[i], 64);
63768
63811
  const valid = signers[i].verify(this.hash.get(), signature.get());
63769
63812
  if (valid !== true) {
63770
- throw (new Error(`Unable to validate signature of ${this.hash.toString()} against signature ${this.signatures[i]} for account ${signers[i].publicKeyString.get()}`));
63813
+ throw (new block_1.default('BLOCK_INVALID_SIGNATURE', `Unable to validate signature of ${this.hash.toString()} against signature ${this.signatures[i].toString('hex')} for account ${signers[i].publicKeyString.get()}`));
63771
63814
  }
63772
63815
  }
63773
63816
  };
@@ -64354,7 +64397,11 @@ class BlockOperation {
64354
64397
  if (amount === undefined || amount === null) {
64355
64398
  throw (new Error('internal error: "amount" is invalid'));
64356
64399
  }
64357
- return (BigInt(amount));
64400
+ const bigintAmount = BigInt(amount);
64401
+ if (bigintAmount < 0n) {
64402
+ throw (new block_1.default('BLOCK_AMOUNT_BELOW_ZERO', 'value cannot be negative'));
64403
+ }
64404
+ return (bigintAmount);
64358
64405
  }
64359
64406
  }
64360
64407
  BlockOperation.isInstance = (0, helper_1.checkableGenerator)(BlockOperation);
@@ -64550,7 +64597,7 @@ class BlockOperationTOKEN_ADMIN_MODIFY_BALANCE extends BlockOperation {
64550
64597
  }
64551
64598
  __classPrivateFieldSet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_token, __classPrivateFieldGet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_instances, "m", _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_computeToken).call(this, input.token), "f");
64552
64599
  __classPrivateFieldSet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_amount, this.computeAmount(input.amount), "f");
64553
- __classPrivateFieldSet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_method, input.method, "f");
64600
+ __classPrivateFieldSet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_method, (0, _1.toAdjustMethod)(input.method), "f");
64554
64601
  }
64555
64602
  set token(token) {
64556
64603
  __classPrivateFieldSet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_token, __classPrivateFieldGet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_instances, "m", _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_computeToken).call(this, token), "f");
@@ -64559,7 +64606,7 @@ class BlockOperationTOKEN_ADMIN_MODIFY_BALANCE extends BlockOperation {
64559
64606
  return (__classPrivateFieldGet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_token, "f"));
64560
64607
  }
64561
64608
  set method(newMethod) {
64562
- __classPrivateFieldSet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_method, newMethod, "f");
64609
+ __classPrivateFieldSet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_method, (0, _1.toAdjustMethod)(newMethod), "f");
64563
64610
  }
64564
64611
  get method() {
64565
64612
  return (Number(__classPrivateFieldGet(this, _BlockOperationTOKEN_ADMIN_MODIFY_BALANCE_method, "f")));
@@ -64846,7 +64893,7 @@ class BlockOperationMODIFY_PERMISSIONS extends BlockOperation {
64846
64893
  }
64847
64894
  __classPrivateFieldSet(this, _BlockOperationMODIFY_PERMISSIONS_principal, this.computeTo(input.principal), "f");
64848
64895
  __classPrivateFieldSet(this, _BlockOperationMODIFY_PERMISSIONS_target, account_1.default.toAccount(input.target), "f");
64849
- __classPrivateFieldSet(this, _BlockOperationMODIFY_PERMISSIONS_method, input.method, "f");
64896
+ __classPrivateFieldSet(this, _BlockOperationMODIFY_PERMISSIONS_method, (0, _1.toAdjustMethod)(input.method), "f");
64850
64897
  __classPrivateFieldSet(this, _BlockOperationMODIFY_PERMISSIONS_permissions, __classPrivateFieldGet(this, _BlockOperationMODIFY_PERMISSIONS_instances, "m", _BlockOperationMODIFY_PERMISSIONS_computePermissions).call(this, input.permissions), "f");
64851
64898
  }
64852
64899
  set principal(principal) {
@@ -64868,7 +64915,7 @@ class BlockOperationMODIFY_PERMISSIONS extends BlockOperation {
64868
64915
  return (__classPrivateFieldGet(this, _BlockOperationMODIFY_PERMISSIONS_target, "f"));
64869
64916
  }
64870
64917
  set method(method) {
64871
- __classPrivateFieldSet(this, _BlockOperationMODIFY_PERMISSIONS_method, method, "f");
64918
+ __classPrivateFieldSet(this, _BlockOperationMODIFY_PERMISSIONS_method, (0, _1.toAdjustMethod)(method), "f");
64872
64919
  }
64873
64920
  get method() {
64874
64921
  return (Number(__classPrivateFieldGet(this, _BlockOperationMODIFY_PERMISSIONS_method, "f")));
@@ -65495,47 +65542,49 @@ const base_1 = __webpack_require__(1096);
65495
65542
  const helper_1 = __webpack_require__(3208);
65496
65543
  const BlockErrorType = 'BLOCK';
65497
65544
  exports.BlockErrorCodes = [
65498
- 'INVALID_TYPE',
65499
- 'INVALID_VERSION',
65500
- 'NO_MULTIPLE_SET_REP',
65501
- 'IDENTIFIER_NEED_DEFAULT_PERMISSIONS',
65545
+ 'AMOUNT_BELOW_ZERO',
65546
+ 'CANNOT_FORWARD_TO_SELF',
65502
65547
  'CANNOT_SEND_NON_TOKEN',
65503
- 'TOKEN_RECEIVE_DIFFERS',
65504
- 'ONLY_TOKEN_OP',
65505
- 'ONLY_IDENTIFIER_OP',
65506
- 'NO_TOKEN_OP',
65507
- 'NO_IDENTIFIER_OP',
65508
- 'INVALID_SIGNER',
65509
- 'INVALID_PURPOSE_VALIDATION',
65548
+ 'CERTIFICATE_SUBJECT_MISMATCH',
65549
+ 'EXACT_TRUE_WHEN_FORWARDING',
65550
+ 'EXTERNAL_INVALID',
65551
+ 'EXTERNAL_MISSING',
65552
+ 'EXTERNAL_TOO_LONG',
65553
+ 'GENERAL_FIELD_INVALID',
65554
+ 'IDENTIFIER_INVALID',
65555
+ 'IDENTIFIER_NEED_DEFAULT_PERMISSIONS',
65556
+ 'INTERMEDIATE_CERTIFICATES_ONLY_ADD',
65557
+ 'INVALID_ACCOUNT_TYPE',
65558
+ 'INVALID_CERTIFICATE_VALUE',
65559
+ 'INVALID_CREATE_IDENTIFIER_ARGS',
65560
+ 'INVALID_IDEMPOTENT_FORMAT',
65561
+ 'INVALID_IDEMPOTENT_LENGTH',
65510
65562
  'INVALID_MULTISIG_QUORUM',
65511
- 'INVALID_MULTISIG_SIGNER_DEPTH',
65512
65563
  'INVALID_MULTISIG_SIGNER_COUNT',
65564
+ 'INVALID_MULTISIG_SIGNER_DEPTH',
65513
65565
  'INVALID_MULTISIG_SIGNER_DUPLICATE',
65514
- 'INVALID_CREATE_IDENTIFIER_ARGS',
65566
+ 'INVALID_PURPOSE_VALIDATION',
65567
+ 'INVALID_SIGNATURE',
65568
+ 'INVALID_SIGNER',
65569
+ 'INVALID_TYPE',
65570
+ 'INVALID_VERSION',
65571
+ 'NO_ADMIN_ON_TARGET',
65572
+ 'NO_DELEGATE_ADMIN',
65573
+ 'NO_DUPLICATE_CERTIFICATE_OPERATION',
65574
+ 'NO_IDENTIFIER_OP',
65575
+ 'NO_MODIFY_PERMISSION_DUPE',
65576
+ 'NO_MULTIPLE_SET_REP',
65515
65577
  'NO_MULTISIG_OP',
65516
- 'IDENTIFIER_INVALID',
65517
- 'GENERAL_FIELD_INVALID',
65578
+ 'NO_TOKEN_OP',
65579
+ 'ONLY_IDENTIFIER_OP',
65580
+ 'ONLY_TOKEN_OP',
65518
65581
  'PERMISSIONS_INVALID_DEFAULT',
65519
65582
  'PERMISSIONS_INVALID_ENTITY',
65520
65583
  'PERMISSIONS_INVALID_PRINCIPAL',
65521
65584
  'PERMISSIONS_INVALID_TARGET',
65522
- 'INVALID_ACCOUNT_TYPE',
65523
- 'NO_ADMIN_ON_TARGET',
65524
65585
  'PREVIOUS_SELF',
65525
- 'NO_DELEGATE_ADMIN',
65526
- 'NO_MODIFY_PERMISSION_DUPE',
65527
- 'CANNOT_FORWARD_TO_SELF',
65528
- 'EXACT_TRUE_WHEN_FORWARDING',
65529
- 'CERTIFICATE_SUBJECT_MISMATCH',
65530
- 'NO_DUPLICATE_CERTIFICATE_OPERATION',
65531
- 'INTERMEDIATE_CERTIFICATES_ONLY_ADD',
65532
- 'INVALID_CERTIFICATE_VALUE',
65533
- 'EXTERNAL_TOO_LONG',
65534
- 'EXTERNAL_INVALID',
65535
- 'EXTERNAL_MISSING',
65536
65586
  'SUPPLY_INVALID',
65537
- 'INVALID_IDEMPOTENT_FORMAT',
65538
- 'INVALID_IDEMPOTENT_LENGTH'
65587
+ 'TOKEN_RECEIVE_DIFFERS'
65539
65588
  ];
65540
65589
  exports.FullBlockErrorCodes = exports.BlockErrorCodes.map(code => `${BlockErrorType}_${code}`);
65541
65590
  class KeetaNetBlockError extends base_1.KeetaNetErrorBase {
@@ -65611,6 +65660,9 @@ exports.ClientErrorCodes = [
65611
65660
  'SWAP_MISSING_RECEIVE',
65612
65661
  'SWAP_SEND_RECEIVE_ACCOUNT_MISMATCH',
65613
65662
  'SWAP_SEND_ACCOUNT_MISMATCH',
65663
+ 'SWAP_SEND_TOKEN_MISMATCH',
65664
+ 'SWAP_SEND_AMOUNT_TOO_LOW',
65665
+ 'SWAP_SEND_AMOUNT_RECEIVE_EXACT_MISMATCH',
65614
65666
  'SWAP_REQUEST_TOKEN_MISMATCH',
65615
65667
  'SWAP_REQUEST_AMOUNT_MISMATCH'
65616
65668
  ];
@@ -67334,6 +67386,9 @@ function updateAccountInfoInState(state, account, info) {
67334
67386
  * Compute the effect of a SEND operation
67335
67387
  */
67336
67388
  function computeEffectOfOperationSEND(state, block, operation) {
67389
+ if (operation.amount < 0n) {
67390
+ throw (new Error('Internal error: SEND operation with negative amount'));
67391
+ }
67337
67392
  // Decrement sender balance
67338
67393
  const senderChange = {
67339
67394
  state,
@@ -67361,6 +67416,9 @@ function computeEffectOfOperationSEND(state, block, operation) {
67361
67416
  * Compute the effect of a RECEIVE operation
67362
67417
  */
67363
67418
  function computeEffectOfOperationRECEIVE(state, block, operation) {
67419
+ if (operation.amount < 0n) {
67420
+ throw (new Error('Internal error: RECEIVE operation with negative amount'));
67421
+ }
67364
67422
  // Increment recipient balance
67365
67423
  const recipientChange = {
67366
67424
  state,
@@ -67396,6 +67454,9 @@ function computeEffectOfOperationRECEIVE(state, block, operation) {
67396
67454
  }
67397
67455
  }
67398
67456
  function computeEffectOfOperationTOKEN_ADMIN_MODIFY_BALANCE(state, block, operation) {
67457
+ if (operation.amount < 0n) {
67458
+ throw (new Error('Internal error: TOKEN_ADMIN_MODIFY_BALANCE operation with negative amount'));
67459
+ }
67399
67460
  if (operation.method === block_1.Block.AdjustMethod.SET) {
67400
67461
  const setChange = {
67401
67462
  state,
@@ -67465,6 +67526,9 @@ function computeEffectOfOperationCREATE_IDENTIFIER(state, block, operation, cont
67465
67526
  throw (new Error('Invalid identifier creation arguments'));
67466
67527
  }
67467
67528
  updateAccountInfoInState(state, operation.identifier, { multisigQuorum: operation.createArguments.quorum });
67529
+ if (operation.createArguments.quorum < 1n || operation.createArguments.quorum > BigInt(operation.createArguments.signers.length)) {
67530
+ throw (new Error('Internal error: operation.createArguments.quorum is invalid'));
67531
+ }
67468
67532
  for (const multisigSigner of operation.createArguments.signers) {
67469
67533
  state.possibleNewAccounts.add(multisigSigner);
67470
67534
  addPermission(state, {
@@ -67506,6 +67570,9 @@ function computeEffectOfOperationMODIFY_PERMISSIONS(state, block, operation) {
67506
67570
  });
67507
67571
  }
67508
67572
  function computeEffectOfOperationTOKEN_ADMIN_SUPPLY(state, block, operation) {
67573
+ if (operation.amount < 0n) {
67574
+ throw (new Error('Internal error: TOKEN_ADMIN_SUPPLY operation with negative amount'));
67575
+ }
67509
67576
  const tokenPubKey = block.account.publicKeyString.get();
67510
67577
  let value = 0n;
67511
67578
  switch (operation.method) {
@@ -79699,7 +79766,7 @@ exports.Testing = { findRDN, blockHashesFromVote, feeFromVote };
79699
79766
 
79700
79767
  Object.defineProperty(exports, "__esModule", ({ value: true }));
79701
79768
  exports.version = void 0;
79702
- exports.version = '0.14.12+g091eeeea12610658c71c9ee6a7c5e2eac6aabdde';
79769
+ exports.version = '0.14.13+g566b8de2c01660608e6eb5257113db271d7fc075';
79703
79770
  exports["default"] = exports.version;
79704
79771
 
79705
79772
 
@@ -1 +1 @@
1
- window.hierarchyData = "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"
1
+ window.hierarchyData = "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"