@waku/rln 0.1.4 → 0.1.5-053bb95.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.
- package/README.md +5 -0
- package/bundle/_virtual/index2.js +1 -1
- package/bundle/_virtual/utils.js +2 -2
- package/bundle/_virtual/utils2.js +2 -2
- package/bundle/index.js +3 -1
- package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +1 -1
- package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/keccak256/lib.esm/index.js +1 -1
- package/bundle/node_modules/{js-sha3 → @ethersproject/keccak256/node_modules/js-sha3}/src/sha3.js +2 -2
- package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +1 -19
- package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +10 -58
- package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +1 -1
- package/bundle/packages/rln/dist/contract/abi.js +502 -248
- package/bundle/packages/rln/dist/contract/constants.js +5 -8
- package/bundle/packages/rln/dist/contract/errors.js +62 -0
- package/bundle/packages/rln/dist/contract/rln_base_contract.js +347 -0
- package/bundle/packages/rln/dist/contract/rln_contract.js +81 -392
- package/bundle/packages/rln/dist/contract/types.js +9 -0
- package/bundle/packages/rln/dist/create.js +1 -1
- package/bundle/packages/rln/dist/credentials_manager.js +215 -0
- package/bundle/packages/rln/dist/identity.js +8 -0
- package/bundle/packages/rln/dist/keystore/cipher.js +3 -3
- package/bundle/packages/rln/dist/keystore/keystore.js +21 -29
- package/bundle/packages/rln/dist/rln.js +56 -166
- package/bundle/packages/rln/dist/zerokit.js +5 -5
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/checksum.js +3 -3
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/cipher.js +4 -4
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/class.js +7 -7
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/functional.js +7 -7
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/index.js +6 -6
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/kdf.js +5 -5
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/password.js +1 -1
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/schema-validation-generated.js +1 -1
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/schema-validation.js +2 -2
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/types.js +1 -1
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/aes.js +3 -3
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/pbkdf2.js +7 -7
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +3 -3
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/scrypt.js +3 -3
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/sha256.js +3 -3
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +7 -7
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_assert.js +1 -1
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_sha2.js +3 -3
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_u64.js +1 -1
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/cryptoBrowser.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/esm/_assert.js +43 -0
- package/bundle/packages/rln/node_modules/@noble/hashes/esm/_sha2.js +116 -0
- package/bundle/packages/rln/node_modules/@noble/hashes/esm/hmac.js +79 -0
- package/bundle/packages/rln/node_modules/@noble/hashes/esm/sha256.js +126 -0
- package/bundle/packages/rln/node_modules/@noble/hashes/esm/utils.js +43 -0
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/hmac.js +3 -3
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/pbkdf2.js +4 -4
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/scrypt.js +5 -5
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/sha256.js +3 -3
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/sha512.js +4 -4
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/utils.js +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/codec.test-utils.d.ts +36 -0
- package/dist/codec.test-utils.js +56 -0
- package/dist/codec.test-utils.js.map +1 -0
- package/dist/contract/abi.d.ts +21 -17
- package/dist/contract/abi.js +502 -248
- package/dist/contract/abi.js.map +1 -1
- package/dist/contract/constants.d.ts +23 -19
- package/dist/contract/constants.js +3 -3
- package/dist/contract/constants.js.map +1 -1
- package/dist/contract/errors.d.ts +30 -0
- package/dist/contract/errors.js +61 -0
- package/dist/contract/errors.js.map +1 -0
- package/dist/contract/rln_base_contract.d.ts +88 -0
- package/dist/contract/rln_base_contract.js +330 -0
- package/dist/contract/rln_base_contract.js.map +1 -0
- package/dist/contract/rln_contract.d.ts +19 -109
- package/dist/contract/rln_contract.js +80 -390
- package/dist/contract/rln_contract.js.map +1 -1
- package/dist/contract/test-setup.d.ts +26 -0
- package/dist/contract/test-setup.js +56 -0
- package/dist/contract/test-setup.js.map +1 -0
- package/dist/contract/test-utils.d.ts +39 -0
- package/dist/contract/test-utils.js +118 -0
- package/dist/contract/test-utils.js.map +1 -0
- package/dist/contract/types.d.ts +40 -0
- package/dist/contract/types.js +8 -0
- package/dist/contract/types.js.map +1 -0
- package/dist/create.js +1 -1
- package/dist/create.js.map +1 -1
- package/dist/credentials_manager.d.ts +44 -0
- package/dist/credentials_manager.js +197 -0
- package/dist/credentials_manager.js.map +1 -0
- package/dist/identity.d.ts +1 -0
- package/dist/identity.js +8 -0
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/keystore/keystore.d.ts +0 -1
- package/dist/keystore/keystore.js +20 -28
- package/dist/keystore/keystore.js.map +1 -1
- package/dist/keystore/types.d.ts +2 -1
- package/dist/rln.d.ts +9 -52
- package/dist/rln.js +54 -163
- package/dist/rln.js.map +1 -1
- package/dist/types.d.ts +27 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/zerokit.d.ts +3 -3
- package/dist/zerokit.js +5 -5
- package/dist/zerokit.js.map +1 -1
- package/package.json +1 -91
- package/src/codec.test-utils.ts +80 -0
- package/src/contract/abi.ts +502 -248
- package/src/contract/constants.ts +3 -3
- package/src/contract/errors.ts +75 -0
- package/src/contract/rln_base_contract.ts +500 -0
- package/src/contract/rln_contract.ts +102 -619
- package/src/contract/test-setup.ts +86 -0
- package/src/contract/test-utils.ts +179 -0
- package/src/contract/types.ts +48 -0
- package/src/create.ts +1 -1
- package/src/credentials_manager.ts +282 -0
- package/src/identity.ts +9 -0
- package/src/index.ts +17 -2
- package/src/keystore/keystore.ts +32 -46
- package/src/keystore/types.ts +2 -1
- package/src/rln.ts +67 -258
- package/src/types.ts +31 -0
- package/src/zerokit.ts +3 -3
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/index.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/md5.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/nil.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/parse.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/regex.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/rng.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/sha1.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/stringify.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v1.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v3.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v35.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v4.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v5.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/validate.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/version.js +0 -0
package/package.json
CHANGED
@@ -1,91 +1 @@
|
|
1
|
-
{
|
2
|
-
"name": "@waku/rln",
|
3
|
-
"version": "0.1.4",
|
4
|
-
"description": "RLN (Rate Limiting Nullifier) implementation for Waku",
|
5
|
-
"types": "./dist/index.d.ts",
|
6
|
-
"module": "./dist/index.js",
|
7
|
-
"exports": {
|
8
|
-
".": {
|
9
|
-
"types": "./dist/index.d.ts",
|
10
|
-
"import": "./dist/index.js"
|
11
|
-
}
|
12
|
-
},
|
13
|
-
"type": "module",
|
14
|
-
"homepage": "https://github.com/waku-org/js-waku/tree/master/packages/rln#readme",
|
15
|
-
"repository": {
|
16
|
-
"type": "git",
|
17
|
-
"url": "https://github.com/waku-org/js-waku.git"
|
18
|
-
},
|
19
|
-
"bugs": {
|
20
|
-
"url": "https://github.com/waku-org/js-waku/issues"
|
21
|
-
},
|
22
|
-
"license": "MIT OR Apache-2.0",
|
23
|
-
"keywords": [
|
24
|
-
"waku",
|
25
|
-
"rln",
|
26
|
-
"rate-limiting",
|
27
|
-
"privacy",
|
28
|
-
"web3"
|
29
|
-
],
|
30
|
-
"scripts": {
|
31
|
-
"build": "run-s build:**",
|
32
|
-
"build:copy": "mkdir -p dist/resources && cp -r src/resources/* dist/resources/",
|
33
|
-
"build:esm": "tsc",
|
34
|
-
"build:bundle": "rollup --config rollup.config.js",
|
35
|
-
"fix": "run-s fix:*",
|
36
|
-
"fix:lint": "eslint src *.js --fix",
|
37
|
-
"check": "run-s check:*",
|
38
|
-
"check:tsc": "tsc -p tsconfig.dev.json",
|
39
|
-
"check:lint": "eslint \"src/!(resources)/**/*.{ts,js}\" *.js",
|
40
|
-
"check:spelling": "cspell \"{README.md,src/**/*.ts}\"",
|
41
|
-
"test": "NODE_ENV=test run-s test:*",
|
42
|
-
"test:browser": "karma start karma.conf.cjs",
|
43
|
-
"watch:build": "tsc -p tsconfig.json -w",
|
44
|
-
"watch:test": "mocha --watch",
|
45
|
-
"prepublish": "npm run build",
|
46
|
-
"reset-hard": "git clean -dfx -e .idea && git reset --hard && npm i && npm run build"
|
47
|
-
},
|
48
|
-
"engines": {
|
49
|
-
"node": ">=20"
|
50
|
-
},
|
51
|
-
"devDependencies": {
|
52
|
-
"@rollup/plugin-commonjs": "^25.0.7",
|
53
|
-
"@rollup/plugin-json": "^6.0.0",
|
54
|
-
"@rollup/plugin-node-resolve": "^15.2.3",
|
55
|
-
"@types/chai": "^5.0.1",
|
56
|
-
"@types/chai-spies": "^1.0.6",
|
57
|
-
"@types/deep-equal-in-any-order": "^1.0.4",
|
58
|
-
"@types/lodash": "^4.17.15",
|
59
|
-
"@types/sinon": "^17.0.3",
|
60
|
-
"@waku/build-utils": "^1.0.0",
|
61
|
-
"@waku/message-encryption": "^0.0.32",
|
62
|
-
"chai": "^5.1.2",
|
63
|
-
"chai-as-promised": "^8.0.1",
|
64
|
-
"chai-spies": "^1.1.0",
|
65
|
-
"chai-subset": "^1.6.0",
|
66
|
-
"deep-equal-in-any-order": "^2.0.6",
|
67
|
-
"fast-check": "^3.23.2",
|
68
|
-
"rollup-plugin-copy": "^3.5.0",
|
69
|
-
"sinon": "^19.0.2"
|
70
|
-
},
|
71
|
-
"files": [
|
72
|
-
"dist",
|
73
|
-
"bundle",
|
74
|
-
"src/**/*.ts",
|
75
|
-
"!**/*.spec.*",
|
76
|
-
"!**/*.json",
|
77
|
-
"CHANGELOG.md",
|
78
|
-
"LICENSE",
|
79
|
-
"README.md"
|
80
|
-
],
|
81
|
-
"dependencies": {
|
82
|
-
"@chainsafe/bls-keystore": "3.0.0",
|
83
|
-
"@waku/core": "^0.0.34",
|
84
|
-
"@waku/utils": "^0.0.22",
|
85
|
-
"@waku/zerokit-rln-wasm": "^0.0.13",
|
86
|
-
"ethereum-cryptography": "^3.1.0",
|
87
|
-
"ethers": "^5.7.2",
|
88
|
-
"lodash": "^4.17.21",
|
89
|
-
"uuid": "^11.0.5"
|
90
|
-
}
|
91
|
-
}
|
1
|
+
{"name":"@waku/rln","version":"0.1.5-053bb95.0","description":"RLN (Rate Limiting Nullifier) implementation for Waku","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"type":"module","homepage":"https://github.com/waku-org/js-waku/tree/master/packages/rln#readme","repository":{"type":"git","url":"https://github.com/waku-org/js-waku.git"},"bugs":{"url":"https://github.com/waku-org/js-waku/issues"},"license":"MIT OR Apache-2.0","keywords":["waku","rln","rate-limiting","privacy","web3"],"scripts":{"build":"run-s build:**","build:copy":"mkdir -p dist/resources && cp -r src/resources/* dist/resources/","build:esm":"tsc","build:bundle":"rollup --config rollup.config.js","fix":"run-s fix:*","fix:lint":"eslint src *.js --fix","check":"run-s check:*","check:tsc":"tsc -p tsconfig.dev.json","check:lint":"eslint \"src/!(resources)/**/*.{ts,js}\" *.js","check:spelling":"cspell \"{README.md,src/**/*.ts}\"","test":"NODE_ENV=test run-s test:*","test:browser":"karma start karma.conf.cjs","watch:build":"tsc -p tsconfig.json -w","watch:test":"mocha --watch","prepublish":"npm run build","reset-hard":"git clean -dfx -e .idea && git reset --hard && npm i && npm run build"},"engines":{"node":">=20"},"devDependencies":{"@rollup/plugin-commonjs":"^25.0.7","@rollup/plugin-json":"^6.0.0","@rollup/plugin-node-resolve":"^15.2.3","@types/chai":"^5.0.1","@types/chai-spies":"^1.0.6","@types/deep-equal-in-any-order":"^1.0.4","@types/lodash":"^4.17.15","@types/sinon":"^17.0.3","@waku/build-utils":"^1.0.0","@waku/message-encryption":"0.0.33-053bb95.0","deep-equal-in-any-order":"^2.0.6","fast-check":"^3.23.2","rollup-plugin-copy":"^3.5.0"},"files":["dist","bundle","src/**/*.ts","!**/*.spec.*","!**/*.json","CHANGELOG.md","LICENSE","README.md"],"dependencies":{"@chainsafe/bls-keystore":"3.0.0","@waku/core":"0.0.35-053bb95.0","@waku/utils":"0.0.23-053bb95.0","@noble/hashes":"^1.2.0","@waku/zerokit-rln-wasm":"^0.0.13","ethereum-cryptography":"^3.1.0","ethers":"^5.7.2","lodash":"^4.17.21","uuid":"^11.0.5","chai":"^5.1.2","chai-as-promised":"^8.0.1","chai-spies":"^1.1.0","chai-subset":"^1.6.0","sinon":"^19.0.2"}}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
import type { IProtoMessage } from "@waku/interfaces";
|
2
|
+
import { expect } from "chai";
|
3
|
+
|
4
|
+
import { createRLN } from "./create.js";
|
5
|
+
import type { IdentityCredential } from "./identity.js";
|
6
|
+
|
7
|
+
export interface TestRLNCodecSetup {
|
8
|
+
rlnInstance: any;
|
9
|
+
credential: IdentityCredential;
|
10
|
+
index: number;
|
11
|
+
payload: Uint8Array;
|
12
|
+
}
|
13
|
+
|
14
|
+
export const TEST_CONSTANTS = {
|
15
|
+
contentTopic: "/test/1/waku-message/utf8",
|
16
|
+
emptyPubsubTopic: "",
|
17
|
+
defaultIndex: 0,
|
18
|
+
defaultPayload: new Uint8Array([1, 2, 3, 4, 5])
|
19
|
+
} as const;
|
20
|
+
|
21
|
+
export const EMPTY_PROTO_MESSAGE = {
|
22
|
+
timestamp: undefined,
|
23
|
+
contentTopic: "",
|
24
|
+
ephemeral: undefined,
|
25
|
+
meta: undefined,
|
26
|
+
rateLimitProof: undefined,
|
27
|
+
version: undefined
|
28
|
+
} as const;
|
29
|
+
|
30
|
+
/**
|
31
|
+
* Creates a basic RLN setup for codec tests
|
32
|
+
*/
|
33
|
+
export async function createTestRLNCodecSetup(): Promise<TestRLNCodecSetup> {
|
34
|
+
const rlnInstance = await createRLN();
|
35
|
+
const credential = rlnInstance.zerokit.generateIdentityCredentials();
|
36
|
+
rlnInstance.zerokit.insertMember(credential.IDCommitment);
|
37
|
+
|
38
|
+
return {
|
39
|
+
rlnInstance,
|
40
|
+
credential,
|
41
|
+
index: TEST_CONSTANTS.defaultIndex,
|
42
|
+
payload: TEST_CONSTANTS.defaultPayload
|
43
|
+
};
|
44
|
+
}
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Creates a meta setter function for testing
|
48
|
+
*/
|
49
|
+
export function createTestMetaSetter(): (
|
50
|
+
msg: IProtoMessage & { meta: undefined }
|
51
|
+
) => Uint8Array {
|
52
|
+
return (msg: IProtoMessage & { meta: undefined }): Uint8Array => {
|
53
|
+
const buffer = new ArrayBuffer(4);
|
54
|
+
const view = new DataView(buffer);
|
55
|
+
view.setUint32(0, msg.payload.length, false);
|
56
|
+
return new Uint8Array(buffer);
|
57
|
+
};
|
58
|
+
}
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Verifies common RLN message properties
|
62
|
+
*/
|
63
|
+
export function verifyRLNMessage(
|
64
|
+
msg: any,
|
65
|
+
payload: Uint8Array,
|
66
|
+
contentTopic: string,
|
67
|
+
version: number,
|
68
|
+
rlnInstance: any
|
69
|
+
): void {
|
70
|
+
expect(msg.rateLimitProof).to.not.be.undefined;
|
71
|
+
expect(msg.verify([rlnInstance.zerokit.getMerkleRoot()])).to.be.true;
|
72
|
+
expect(msg.verifyNoRoot()).to.be.true;
|
73
|
+
expect(msg.epoch).to.not.be.undefined;
|
74
|
+
expect(msg.epoch).to.be.gt(0);
|
75
|
+
|
76
|
+
expect(msg.contentTopic).to.eq(contentTopic);
|
77
|
+
expect(msg.msg.version).to.eq(version);
|
78
|
+
expect(msg.payload).to.deep.eq(payload);
|
79
|
+
expect(msg.timestamp).to.not.be.undefined;
|
80
|
+
}
|