@waku/rln 0.1.5-9901863.0 → 0.1.5-a824fff.0

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 (142) hide show
  1. package/bundle/index.js +2 -1
  2. package/bundle/packages/rln/dist/contract/constants.js +2 -1
  3. package/bundle/packages/rln/dist/contract/rln_base_contract.js +70 -65
  4. package/bundle/packages/rln/dist/contract/rln_contract.js +1 -1
  5. package/bundle/packages/rln/dist/credentials_manager.js +10 -28
  6. package/bundle/packages/rln/dist/identity.js +0 -8
  7. package/bundle/packages/rln/dist/keystore/keystore.js +28 -15
  8. package/bundle/packages/rln/dist/utils/metamask.js +2 -2
  9. package/bundle/packages/rln/dist/zerokit.js +5 -5
  10. package/dist/.tsbuildinfo +1 -1
  11. package/dist/contract/constants.d.ts +1 -1
  12. package/dist/contract/constants.js +1 -1
  13. package/dist/contract/constants.js.map +1 -1
  14. package/dist/contract/index.d.ts +1 -0
  15. package/dist/contract/index.js +1 -0
  16. package/dist/contract/index.js.map +1 -1
  17. package/dist/contract/rln_base_contract.d.ts +5 -11
  18. package/dist/contract/rln_base_contract.js +68 -63
  19. package/dist/contract/rln_base_contract.js.map +1 -1
  20. package/dist/contract/types.d.ts +5 -0
  21. package/dist/contract/types.js.map +1 -1
  22. package/dist/credentials_manager.d.ts +3 -9
  23. package/dist/credentials_manager.js +10 -28
  24. package/dist/credentials_manager.js.map +1 -1
  25. package/dist/identity.d.ts +0 -1
  26. package/dist/identity.js +0 -8
  27. package/dist/identity.js.map +1 -1
  28. package/dist/index.d.ts +2 -1
  29. package/dist/index.js +1 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/keystore/keystore.d.ts +1 -0
  32. package/dist/keystore/keystore.js +28 -15
  33. package/dist/keystore/keystore.js.map +1 -1
  34. package/dist/keystore/types.d.ts +2 -2
  35. package/dist/rln.js.map +1 -1
  36. package/dist/zerokit.d.ts +3 -3
  37. package/dist/zerokit.js +5 -5
  38. package/dist/zerokit.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/contract/constants.ts +1 -1
  41. package/src/contract/index.ts +1 -0
  42. package/src/contract/rln_base_contract.ts +100 -93
  43. package/src/contract/types.ts +5 -0
  44. package/src/credentials_manager.ts +10 -34
  45. package/src/identity.ts +0 -9
  46. package/src/index.ts +3 -1
  47. package/src/keystore/keystore.ts +54 -29
  48. package/src/keystore/types.ts +2 -2
  49. package/src/rln.ts +1 -0
  50. package/src/zerokit.ts +3 -3
  51. package/bundle/_virtual/__node-resolve_empty.js +0 -6
  52. package/bundle/_virtual/_node-resolve_empty.js +0 -3
  53. package/bundle/_virtual/bn.js +0 -3
  54. package/bundle/_virtual/common.js +0 -3
  55. package/bundle/_virtual/common2.js +0 -3
  56. package/bundle/_virtual/hash.js +0 -3
  57. package/bundle/_virtual/inherits_browser.js +0 -3
  58. package/bundle/_virtual/ripemd.js +0 -3
  59. package/bundle/_virtual/sha.js +0 -3
  60. package/bundle/_virtual/sha3.js +0 -3
  61. package/bundle/_virtual/utils3.js +0 -3
  62. package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +0 -3
  63. package/bundle/node_modules/@ethersproject/abi/lib.esm/abi-coder.js +0 -96
  64. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js +0 -148
  65. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/address.js +0 -26
  66. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/anonymous.js +0 -20
  67. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/array.js +0 -210
  68. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/boolean.js +0 -18
  69. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/bytes.js +0 -30
  70. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/fixed-bytes.js +0 -26
  71. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/null.js +0 -22
  72. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/number.js +0 -43
  73. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/string.js +0 -19
  74. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/tuple.js +0 -58
  75. package/bundle/node_modules/@ethersproject/abi/lib.esm/fragments.js +0 -854
  76. package/bundle/node_modules/@ethersproject/abi/lib.esm/interface.js +0 -609
  77. package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +0 -3
  78. package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/index.js +0 -66
  79. package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +0 -3
  80. package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/index.js +0 -302
  81. package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +0 -3
  82. package/bundle/node_modules/@ethersproject/address/lib.esm/index.js +0 -110
  83. package/bundle/node_modules/@ethersproject/base64/lib.esm/base64.js +0 -20
  84. package/bundle/node_modules/@ethersproject/basex/lib.esm/index.js +0 -120
  85. package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +0 -3
  86. package/bundle/node_modules/@ethersproject/bignumber/lib.esm/bignumber.js +0 -287
  87. package/bundle/node_modules/@ethersproject/bytes/lib.esm/_version.js +0 -3
  88. package/bundle/node_modules/@ethersproject/bytes/lib.esm/index.js +0 -402
  89. package/bundle/node_modules/@ethersproject/constants/lib.esm/addresses.js +0 -3
  90. package/bundle/node_modules/@ethersproject/constants/lib.esm/bignumbers.js +0 -8
  91. package/bundle/node_modules/@ethersproject/constants/lib.esm/hashes.js +0 -3
  92. package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +0 -3
  93. package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +0 -893
  94. package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +0 -3
  95. package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/decoder.js +0 -256
  96. package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/include.js +0 -36
  97. package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/lib.js +0 -135
  98. package/bundle/node_modules/@ethersproject/hash/lib.esm/id.js +0 -8
  99. package/bundle/node_modules/@ethersproject/hash/lib.esm/namehash.js +0 -64
  100. package/bundle/node_modules/@ethersproject/hash/lib.esm/typed-data.js +0 -443
  101. package/bundle/node_modules/@ethersproject/keccak256/lib.esm/index.js +0 -8
  102. package/bundle/node_modules/@ethersproject/keccak256/node_modules/js-sha3/src/sha3.js +0 -660
  103. package/bundle/node_modules/@ethersproject/logger/lib.esm/_version.js +0 -3
  104. package/bundle/node_modules/@ethersproject/logger/lib.esm/index.js +0 -352
  105. package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +0 -3
  106. package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +0 -248
  107. package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +0 -3
  108. package/bundle/node_modules/@ethersproject/properties/lib.esm/index.js +0 -127
  109. package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +0 -3
  110. package/bundle/node_modules/@ethersproject/providers/lib.esm/base-provider.js +0 -2007
  111. package/bundle/node_modules/@ethersproject/providers/lib.esm/formatter.js +0 -422
  112. package/bundle/node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js +0 -674
  113. package/bundle/node_modules/@ethersproject/providers/lib.esm/web3-provider.js +0 -132
  114. package/bundle/node_modules/@ethersproject/rlp/lib.esm/_version.js +0 -3
  115. package/bundle/node_modules/@ethersproject/rlp/lib.esm/index.js +0 -120
  116. package/bundle/node_modules/@ethersproject/sha2/lib.esm/sha2.js +0 -8
  117. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +0 -3
  118. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +0 -2430
  119. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/index.js +0 -76
  120. package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +0 -3
  121. package/bundle/node_modules/@ethersproject/strings/lib.esm/utf8.js +0 -219
  122. package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +0 -3
  123. package/bundle/node_modules/@ethersproject/transactions/lib.esm/index.js +0 -279
  124. package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +0 -3
  125. package/bundle/node_modules/@ethersproject/web/lib.esm/geturl.js +0 -69
  126. package/bundle/node_modules/@ethersproject/web/lib.esm/index.js +0 -404
  127. package/bundle/node_modules/bech32/index.js +0 -187
  128. package/bundle/node_modules/bn.js/lib/bn.js +0 -3361
  129. package/bundle/node_modules/hash.js/lib/hash/common.js +0 -97
  130. package/bundle/node_modules/hash.js/lib/hash/hmac.js +0 -51
  131. package/bundle/node_modules/hash.js/lib/hash/ripemd.js +0 -152
  132. package/bundle/node_modules/hash.js/lib/hash/sha/1.js +0 -81
  133. package/bundle/node_modules/hash.js/lib/hash/sha/224.js +0 -33
  134. package/bundle/node_modules/hash.js/lib/hash/sha/256.js +0 -113
  135. package/bundle/node_modules/hash.js/lib/hash/sha/384.js +0 -39
  136. package/bundle/node_modules/hash.js/lib/hash/sha/512.js +0 -336
  137. package/bundle/node_modules/hash.js/lib/hash/sha/common.js +0 -53
  138. package/bundle/node_modules/hash.js/lib/hash/sha.js +0 -14
  139. package/bundle/node_modules/hash.js/lib/hash/utils.js +0 -282
  140. package/bundle/node_modules/hash.js/lib/hash.js +0 -33
  141. package/bundle/node_modules/inherits/inherits_browser.js +0 -33
  142. package/bundle/node_modules/minimalistic-assert/index.js +0 -13
@@ -14,7 +14,6 @@ import {
14
14
  import _ from "lodash";
15
15
  import { v4 as uuidV4 } from "uuid";
16
16
 
17
- import { IdentityCredential } from "../identity.js";
18
17
  import { buildBigIntFromUint8Array } from "../utils/bytes.js";
19
18
 
20
19
  import { decryptEipKeystore, keccak256Checksum } from "./cipher.js";
@@ -22,8 +21,8 @@ import { isCredentialValid, isKeystoreValid } from "./schema_validator.js";
22
21
  import type {
23
22
  Keccak256Hash,
24
23
  KeystoreEntity,
24
+ KeystoreMembershipInfo,
25
25
  MembershipHash,
26
- MembershipInfo,
27
26
  Password,
28
27
  Sha256Hash
29
28
  } from "./types.js";
@@ -251,27 +250,27 @@ export class Keystore {
251
250
  const str = bytesToUtf8(bytes);
252
251
  const obj = JSON.parse(str);
253
252
 
254
- // Get identity fields from named object
255
- const { idTrapdoor, idNullifier, idSecretHash, idCommitment } = _.get(
256
- obj,
257
- "identityCredential",
258
- {}
259
- );
260
-
261
- const idTrapdoorArray = new Uint8Array(idTrapdoor || []);
262
- const idNullifierArray = new Uint8Array(idNullifier || []);
263
- const idSecretHashArray = new Uint8Array(idSecretHash || []);
264
- const idCommitmentArray = new Uint8Array(idCommitment || []);
265
- const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitmentArray);
266
-
253
+ // TODO: add runtime validation of nwaku credentials
267
254
  return {
268
- identity: new IdentityCredential(
269
- idTrapdoorArray,
270
- idNullifierArray,
271
- idSecretHashArray,
272
- idCommitmentArray,
273
- idCommitmentBigInt
274
- ),
255
+ identity: {
256
+ IDCommitment: Keystore.fromArraylikeToBytes(
257
+ _.get(obj, "identityCredential.idCommitment", [])
258
+ ),
259
+ IDTrapdoor: Keystore.fromArraylikeToBytes(
260
+ _.get(obj, "identityCredential.idTrapdoor", [])
261
+ ),
262
+ IDNullifier: Keystore.fromArraylikeToBytes(
263
+ _.get(obj, "identityCredential.idNullifier", [])
264
+ ),
265
+ IDCommitmentBigInt: buildBigIntFromUint8Array(
266
+ Keystore.fromArraylikeToBytes(
267
+ _.get(obj, "identityCredential.idCommitment", [])
268
+ )
269
+ ),
270
+ IDSecretHash: Keystore.fromArraylikeToBytes(
271
+ _.get(obj, "identityCredential.idSecretHash", [])
272
+ )
273
+ },
275
274
  membership: {
276
275
  treeIndex: _.get(obj, "treeIndex"),
277
276
  chainId: _.get(obj, "membershipContract.chainId"),
@@ -285,9 +284,35 @@ export class Keystore {
285
284
  }
286
285
  }
287
286
 
287
+ private static fromArraylikeToBytes(
288
+ obj:
289
+ | number[]
290
+ | {
291
+ [key: number]: number;
292
+ }
293
+ ): Uint8Array {
294
+ if (Array.isArray(obj)) {
295
+ return new Uint8Array(obj);
296
+ }
297
+
298
+ const bytes = [];
299
+ let index = 0;
300
+ let lastElement = obj[index];
301
+
302
+ while (lastElement !== undefined) {
303
+ bytes.push(lastElement);
304
+ index += 1;
305
+ lastElement = obj[index];
306
+ }
307
+
308
+ return new Uint8Array(bytes);
309
+ }
310
+
288
311
  // follows nwaku implementation
289
312
  // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L111
290
- private static computeMembershipHash(info: MembershipInfo): MembershipHash {
313
+ private static computeMembershipHash(
314
+ info: KeystoreMembershipInfo
315
+ ): MembershipHash {
291
316
  return bytesToHex(
292
317
  sha256(utf8ToBytes(`${info.chainId}${info.address}${info.treeIndex}`))
293
318
  ).toUpperCase();
@@ -298,16 +323,16 @@ export class Keystore {
298
323
  private static fromIdentityToBytes(options: KeystoreEntity): Uint8Array {
299
324
  return utf8ToBytes(
300
325
  JSON.stringify({
301
- membershipContract: {
302
- chainId: options.membership.chainId,
303
- address: options.membership.address
304
- },
305
326
  treeIndex: options.membership.treeIndex,
306
327
  identityCredential: {
307
- idTrapdoor: Array.from(options.identity.IDTrapdoor),
328
+ idCommitment: Array.from(options.identity.IDCommitment),
308
329
  idNullifier: Array.from(options.identity.IDNullifier),
309
330
  idSecretHash: Array.from(options.identity.IDSecretHash),
310
- idCommitment: Array.from(options.identity.IDCommitment)
331
+ idTrapdoor: Array.from(options.identity.IDTrapdoor)
332
+ },
333
+ membershipContract: {
334
+ chainId: options.membership.chainId,
335
+ address: options.membership.address
311
336
  },
312
337
  userMessageLimit: options.membership.rateLimit
313
338
  })
@@ -7,7 +7,7 @@ export type Password = string | Uint8Array;
7
7
 
8
8
  // see reference
9
9
  // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L111
10
- export type MembershipInfo = {
10
+ export type KeystoreMembershipInfo = {
11
11
  chainId: string;
12
12
  address: string;
13
13
  treeIndex: number;
@@ -16,7 +16,7 @@ export type MembershipInfo = {
16
16
 
17
17
  export type KeystoreEntity = {
18
18
  identity: IdentityCredential;
19
- membership: MembershipInfo;
19
+ membership: KeystoreMembershipInfo;
20
20
  };
21
21
 
22
22
  export type DecryptedCredentials = KeystoreEntity;
package/src/rln.ts CHANGED
@@ -58,6 +58,7 @@ export class RLNInstance extends RLNCredentialsManager {
58
58
  throw error;
59
59
  }
60
60
  }
61
+
61
62
  private constructor(public zerokit: Zerokit) {
62
63
  super(zerokit);
63
64
  }
package/src/zerokit.ts CHANGED
@@ -16,7 +16,7 @@ export class Zerokit {
16
16
  public constructor(
17
17
  private readonly zkRLN: number,
18
18
  private readonly witnessCalculator: WitnessCalculator,
19
- private readonly rateLimit: number = DEFAULT_RATE_LIMIT
19
+ private readonly _rateLimit: number = DEFAULT_RATE_LIMIT
20
20
  ) {}
21
21
 
22
22
  public get getZkRLN(): number {
@@ -27,8 +27,8 @@ export class Zerokit {
27
27
  return this.witnessCalculator;
28
28
  }
29
29
 
30
- public get getRateLimit(): number {
31
- return this.rateLimit;
30
+ public get rateLimit(): number {
31
+ return this._rateLimit;
32
32
  }
33
33
 
34
34
  public generateIdentityCredentials(): IdentityCredential {
@@ -1,6 +0,0 @@
1
- import * as _nodeResolve_empty from './_node-resolve_empty.js';
2
- import { getAugmentedNamespace } from './_commonjsHelpers.js';
3
-
4
- var require$$0 = /*@__PURE__*/getAugmentedNamespace(_nodeResolve_empty);
5
-
6
- export { require$$0 as default };
@@ -1,3 +0,0 @@
1
- var _nodeResolve_empty = {};
2
-
3
- export { _nodeResolve_empty as default };
@@ -1,3 +0,0 @@
1
- var bn = {exports: {}};
2
-
3
- export { bn as __module };
@@ -1,3 +0,0 @@
1
- var common = {};
2
-
3
- export { common as __exports };
@@ -1,3 +0,0 @@
1
- var common = {};
2
-
3
- export { common as __exports };
@@ -1,3 +0,0 @@
1
- var hash = {};
2
-
3
- export { hash as __exports };
@@ -1,3 +0,0 @@
1
- var inherits_browser = {exports: {}};
2
-
3
- export { inherits_browser as __module };
@@ -1,3 +0,0 @@
1
- var ripemd = {};
2
-
3
- export { ripemd as __exports };
@@ -1,3 +0,0 @@
1
- var sha = {};
2
-
3
- export { sha as __exports };
@@ -1,3 +0,0 @@
1
- var sha3 = {exports: {}};
2
-
3
- export { sha3 as __module };
@@ -1,3 +0,0 @@
1
- var utils = {};
2
-
3
- export { utils as __exports };
@@ -1,3 +0,0 @@
1
- const version = "abi/5.7.0";
2
-
3
- export { version };
@@ -1,96 +0,0 @@
1
- import { arrayify } from '../../bytes/lib.esm/index.js';
2
- import { defineReadOnly } from '../../properties/lib.esm/index.js';
3
- import { Logger } from '../../logger/lib.esm/index.js';
4
- import { version } from './_version.js';
5
- import { Reader, Writer } from './coders/abstract-coder.js';
6
- import { AddressCoder } from './coders/address.js';
7
- import { ArrayCoder } from './coders/array.js';
8
- import { BooleanCoder } from './coders/boolean.js';
9
- import { BytesCoder } from './coders/bytes.js';
10
- import { FixedBytesCoder } from './coders/fixed-bytes.js';
11
- import { NullCoder } from './coders/null.js';
12
- import { NumberCoder } from './coders/number.js';
13
- import { StringCoder } from './coders/string.js';
14
- import { TupleCoder } from './coders/tuple.js';
15
- import { ParamType } from './fragments.js';
16
-
17
- const logger = new Logger(version);
18
- const paramTypeBytes = new RegExp(/^bytes([0-9]*)$/);
19
- const paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/);
20
- class AbiCoder {
21
- constructor(coerceFunc) {
22
- defineReadOnly(this, "coerceFunc", coerceFunc || null);
23
- }
24
- _getCoder(param) {
25
- switch (param.baseType) {
26
- case "address":
27
- return new AddressCoder(param.name);
28
- case "bool":
29
- return new BooleanCoder(param.name);
30
- case "string":
31
- return new StringCoder(param.name);
32
- case "bytes":
33
- return new BytesCoder(param.name);
34
- case "array":
35
- return new ArrayCoder(this._getCoder(param.arrayChildren), param.arrayLength, param.name);
36
- case "tuple":
37
- return new TupleCoder((param.components || []).map((component) => {
38
- return this._getCoder(component);
39
- }), param.name);
40
- case "":
41
- return new NullCoder(param.name);
42
- }
43
- // u?int[0-9]*
44
- let match = param.type.match(paramTypeNumber);
45
- if (match) {
46
- let size = parseInt(match[2] || "256");
47
- if (size === 0 || size > 256 || (size % 8) !== 0) {
48
- logger.throwArgumentError("invalid " + match[1] + " bit length", "param", param);
49
- }
50
- return new NumberCoder(size / 8, (match[1] === "int"), param.name);
51
- }
52
- // bytes[0-9]+
53
- match = param.type.match(paramTypeBytes);
54
- if (match) {
55
- let size = parseInt(match[1]);
56
- if (size === 0 || size > 32) {
57
- logger.throwArgumentError("invalid bytes length", "param", param);
58
- }
59
- return new FixedBytesCoder(size, param.name);
60
- }
61
- return logger.throwArgumentError("invalid type", "type", param.type);
62
- }
63
- _getWordSize() { return 32; }
64
- _getReader(data, allowLoose) {
65
- return new Reader(data, this._getWordSize(), this.coerceFunc, allowLoose);
66
- }
67
- _getWriter() {
68
- return new Writer(this._getWordSize());
69
- }
70
- getDefaultValue(types) {
71
- const coders = types.map((type) => this._getCoder(ParamType.from(type)));
72
- const coder = new TupleCoder(coders, "_");
73
- return coder.defaultValue();
74
- }
75
- encode(types, values) {
76
- if (types.length !== values.length) {
77
- logger.throwError("types/values length mismatch", Logger.errors.INVALID_ARGUMENT, {
78
- count: { types: types.length, values: values.length },
79
- value: { types: types, values: values }
80
- });
81
- }
82
- const coders = types.map((type) => this._getCoder(ParamType.from(type)));
83
- const coder = (new TupleCoder(coders, "_"));
84
- const writer = this._getWriter();
85
- coder.encode(writer, values);
86
- return writer.data;
87
- }
88
- decode(types, data, loose) {
89
- const coders = types.map((type) => this._getCoder(ParamType.from(type)));
90
- const coder = new TupleCoder(coders, "_");
91
- return coder.decode(this._getReader(arrayify(data), loose));
92
- }
93
- }
94
- const defaultAbiCoder = new AbiCoder();
95
-
96
- export { AbiCoder, defaultAbiCoder };
@@ -1,148 +0,0 @@
1
- import { arrayify, hexlify, hexConcat, concat } from '../../../bytes/lib.esm/index.js';
2
- import { defineReadOnly } from '../../../properties/lib.esm/index.js';
3
- import { Logger } from '../../../logger/lib.esm/index.js';
4
- import { version } from '../_version.js';
5
- import { BigNumber } from '../../../bignumber/lib.esm/bignumber.js';
6
-
7
- const logger = new Logger(version);
8
- function checkResultErrors(result) {
9
- // Find the first error (if any)
10
- const errors = [];
11
- const checkErrors = function (path, object) {
12
- if (!Array.isArray(object)) {
13
- return;
14
- }
15
- for (let key in object) {
16
- const childPath = path.slice();
17
- childPath.push(key);
18
- try {
19
- checkErrors(childPath, object[key]);
20
- }
21
- catch (error) {
22
- errors.push({ path: childPath, error: error });
23
- }
24
- }
25
- };
26
- checkErrors([], result);
27
- return errors;
28
- }
29
- class Coder {
30
- constructor(name, type, localName, dynamic) {
31
- // @TODO: defineReadOnly these
32
- this.name = name;
33
- this.type = type;
34
- this.localName = localName;
35
- this.dynamic = dynamic;
36
- }
37
- _throwError(message, value) {
38
- logger.throwArgumentError(message, this.localName, value);
39
- }
40
- }
41
- class Writer {
42
- constructor(wordSize) {
43
- defineReadOnly(this, "wordSize", wordSize || 32);
44
- this._data = [];
45
- this._dataLength = 0;
46
- this._padding = new Uint8Array(wordSize);
47
- }
48
- get data() {
49
- return hexConcat(this._data);
50
- }
51
- get length() { return this._dataLength; }
52
- _writeData(data) {
53
- this._data.push(data);
54
- this._dataLength += data.length;
55
- return data.length;
56
- }
57
- appendWriter(writer) {
58
- return this._writeData(concat(writer._data));
59
- }
60
- // Arrayish items; padded on the right to wordSize
61
- writeBytes(value) {
62
- let bytes = arrayify(value);
63
- const paddingOffset = bytes.length % this.wordSize;
64
- if (paddingOffset) {
65
- bytes = concat([bytes, this._padding.slice(paddingOffset)]);
66
- }
67
- return this._writeData(bytes);
68
- }
69
- _getValue(value) {
70
- let bytes = arrayify(BigNumber.from(value));
71
- if (bytes.length > this.wordSize) {
72
- logger.throwError("value out-of-bounds", Logger.errors.BUFFER_OVERRUN, {
73
- length: this.wordSize,
74
- offset: bytes.length
75
- });
76
- }
77
- if (bytes.length % this.wordSize) {
78
- bytes = concat([this._padding.slice(bytes.length % this.wordSize), bytes]);
79
- }
80
- return bytes;
81
- }
82
- // BigNumberish items; padded on the left to wordSize
83
- writeValue(value) {
84
- return this._writeData(this._getValue(value));
85
- }
86
- writeUpdatableValue() {
87
- const offset = this._data.length;
88
- this._data.push(this._padding);
89
- this._dataLength += this.wordSize;
90
- return (value) => {
91
- this._data[offset] = this._getValue(value);
92
- };
93
- }
94
- }
95
- class Reader {
96
- constructor(data, wordSize, coerceFunc, allowLoose) {
97
- defineReadOnly(this, "_data", arrayify(data));
98
- defineReadOnly(this, "wordSize", wordSize || 32);
99
- defineReadOnly(this, "_coerceFunc", coerceFunc);
100
- defineReadOnly(this, "allowLoose", allowLoose);
101
- this._offset = 0;
102
- }
103
- get data() { return hexlify(this._data); }
104
- get consumed() { return this._offset; }
105
- // The default Coerce function
106
- static coerce(name, value) {
107
- let match = name.match("^u?int([0-9]+)$");
108
- if (match && parseInt(match[1]) <= 48) {
109
- value = value.toNumber();
110
- }
111
- return value;
112
- }
113
- coerce(name, value) {
114
- if (this._coerceFunc) {
115
- return this._coerceFunc(name, value);
116
- }
117
- return Reader.coerce(name, value);
118
- }
119
- _peekBytes(offset, length, loose) {
120
- let alignedLength = Math.ceil(length / this.wordSize) * this.wordSize;
121
- if (this._offset + alignedLength > this._data.length) {
122
- if (this.allowLoose && loose && this._offset + length <= this._data.length) {
123
- alignedLength = length;
124
- }
125
- else {
126
- logger.throwError("data out-of-bounds", Logger.errors.BUFFER_OVERRUN, {
127
- length: this._data.length,
128
- offset: this._offset + alignedLength
129
- });
130
- }
131
- }
132
- return this._data.slice(this._offset, this._offset + alignedLength);
133
- }
134
- subReader(offset) {
135
- return new Reader(this._data.slice(this._offset + offset), this.wordSize, this._coerceFunc, this.allowLoose);
136
- }
137
- readBytes(length, loose) {
138
- let bytes = this._peekBytes(0, length, !!loose);
139
- this._offset += bytes.length;
140
- // @TODO: Make sure the length..end bytes are all 0?
141
- return bytes.slice(0, length);
142
- }
143
- readValue() {
144
- return BigNumber.from(this.readBytes(this.wordSize));
145
- }
146
- }
147
-
148
- export { Coder, Reader, Writer, checkResultErrors };
@@ -1,26 +0,0 @@
1
- import { getAddress } from '../../../address/lib.esm/index.js';
2
- import { hexZeroPad } from '../../../bytes/lib.esm/index.js';
3
- import { Coder } from './abstract-coder.js';
4
-
5
- class AddressCoder extends Coder {
6
- constructor(localName) {
7
- super("address", "address", localName, false);
8
- }
9
- defaultValue() {
10
- return "0x0000000000000000000000000000000000000000";
11
- }
12
- encode(writer, value) {
13
- try {
14
- value = getAddress(value);
15
- }
16
- catch (error) {
17
- this._throwError(error.message, value);
18
- }
19
- return writer.writeValue(value);
20
- }
21
- decode(reader) {
22
- return getAddress(hexZeroPad(reader.readValue().toHexString(), 20));
23
- }
24
- }
25
-
26
- export { AddressCoder };
@@ -1,20 +0,0 @@
1
- import { Coder } from './abstract-coder.js';
2
-
3
- // Clones the functionality of an existing Coder, but without a localName
4
- class AnonymousCoder extends Coder {
5
- constructor(coder) {
6
- super(coder.name, coder.type, undefined, coder.dynamic);
7
- this.coder = coder;
8
- }
9
- defaultValue() {
10
- return this.coder.defaultValue();
11
- }
12
- encode(writer, value) {
13
- return this.coder.encode(writer, value);
14
- }
15
- decode(reader) {
16
- return this.coder.decode(reader);
17
- }
18
- }
19
-
20
- export { AnonymousCoder };