From 126aa04cdddef620e4ee1e7f18684243c47e2cae Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Tue, 18 Apr 2023 15:16:37 +0200 Subject: [PATCH 1/3] chore(rs-drive-nodejs): remove unused rs-drive-nodejs --- Cargo.lock | 151 +- Cargo.toml | 1 - package.json | 5 +- packages/rs-drive-nodejs/.eslintrc | 35 - packages/rs-drive-nodejs/.gitignore | 2 - packages/rs-drive-nodejs/.mocharc.yml | 2 - packages/rs-drive-nodejs/Cargo.toml | 23 - packages/rs-drive-nodejs/Drive.js | 940 ----- packages/rs-drive-nodejs/FeeResult.js | 95 - packages/rs-drive-nodejs/GroveDB.js | 342 -- packages/rs-drive-nodejs/appendStack.js | 36 - packages/rs-drive-nodejs/docker/build.sh | 44 - packages/rs-drive-nodejs/package.json | 50 - packages/rs-drive-nodejs/scripts/build.sh | 23 - packages/rs-drive-nodejs/src/converter.rs | 534 --- packages/rs-drive-nodejs/src/fee/mod.rs | 39 - packages/rs-drive-nodejs/src/fee/result.rs | 167 - packages/rs-drive-nodejs/src/lib.rs | 3682 ----------------- packages/rs-drive-nodejs/test/.eslintrc | 12 - packages/rs-drive-nodejs/test/Drive.spec.js | 1181 ------ packages/rs-drive-nodejs/test/GroveDB.spec.js | 1240 ------ packages/rs-drive-nodejs/test/utils.js | 16 - 22 files changed, 11 insertions(+), 8609 deletions(-) delete mode 100644 packages/rs-drive-nodejs/.eslintrc delete mode 100644 packages/rs-drive-nodejs/.gitignore delete mode 100644 packages/rs-drive-nodejs/.mocharc.yml delete mode 100644 packages/rs-drive-nodejs/Cargo.toml delete mode 100644 packages/rs-drive-nodejs/Drive.js delete mode 100644 packages/rs-drive-nodejs/FeeResult.js delete mode 100644 packages/rs-drive-nodejs/GroveDB.js delete mode 100644 packages/rs-drive-nodejs/appendStack.js delete mode 100755 packages/rs-drive-nodejs/docker/build.sh delete mode 100644 packages/rs-drive-nodejs/package.json delete mode 100755 packages/rs-drive-nodejs/scripts/build.sh delete mode 100644 packages/rs-drive-nodejs/src/converter.rs delete mode 100644 packages/rs-drive-nodejs/src/fee/mod.rs delete mode 100644 packages/rs-drive-nodejs/src/fee/result.rs delete mode 100644 packages/rs-drive-nodejs/src/lib.rs delete mode 100644 packages/rs-drive-nodejs/test/.eslintrc delete mode 100644 packages/rs-drive-nodejs/test/Drive.spec.js delete mode 100644 packages/rs-drive-nodejs/test/GroveDB.spec.js delete mode 100644 packages/rs-drive-nodejs/test/utils.js diff --git a/Cargo.lock b/Cargo.lock index 451b625e837..53af8fffa8e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -508,7 +508,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver 1.0.17", + "semver", "serde", "serde_json", ] @@ -591,7 +591,7 @@ checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" dependencies = [ "glob", "libc", - "libloading 0.7.4", + "libloading", ] [[package]] @@ -1169,16 +1169,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "drive-nodejs" -version = "0.24.0-dev.1" -dependencies = [ - "drive", - "drive-abci", - "neon", - "num 0.4.0", -] - [[package]] name = "ed" version = "0.2.2" @@ -1401,7 +1391,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aba3510011eee8825018be07f08d9643421de007eaf62a3bde58d89b058abfa7" dependencies = [ "lazy_static", - "num 0.2.1", + "num", ] [[package]] @@ -1890,16 +1880,6 @@ version = "0.2.141" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" -[[package]] -name = "libloading" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" -dependencies = [ - "cfg-if", - "winapi", -] - [[package]] name = "libloading" version = "0.7.4" @@ -2119,47 +2099,6 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" -[[package]] -name = "neon" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e15415261d880aed48122e917a45e87bb82cf0260bb6db48bbab44b7464373" -dependencies = [ - "neon-build", - "neon-macros", - "neon-runtime", - "semver 0.9.0", - "smallvec", -] - -[[package]] -name = "neon-build" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bac98a702e71804af3dacfde41edde4a16076a7bbe889ae61e56e18c5b1c811" - -[[package]] -name = "neon-macros" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7288eac8b54af7913c60e0eb0e2a7683020dffa342ab3fd15e28f035ba897cf" -dependencies = [ - "quote", - "syn 1.0.109", - "syn-mid", -] - -[[package]] -name = "neon-runtime" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4676720fa8bb32c64c3d9f49c47a47289239ec46b4bdb66d0913cc512cb0daca" -dependencies = [ - "cfg-if", - "libloading 0.6.7", - "smallvec", -] - [[package]] name = "nohash-hasher" version = "0.2.0" @@ -2198,25 +2137,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" dependencies = [ - "num-bigint 0.2.6", - "num-complex 0.2.4", - "num-integer", - "num-iter", - "num-rational 0.2.4", - "num-traits", -] - -[[package]] -name = "num" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" -dependencies = [ - "num-bigint 0.4.3", - "num-complex 0.4.3", + "num-bigint", + "num-complex", "num-integer", "num-iter", - "num-rational 0.4.1", + "num-rational", "num-traits", ] @@ -2231,17 +2156,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-cmp" version = "0.1.0" @@ -2258,15 +2172,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-complex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" -dependencies = [ - "num-traits", -] - [[package]] name = "num-derive" version = "0.3.3" @@ -2306,19 +2211,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ "autocfg", - "num-bigint 0.2.6", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint 0.4.3", + "num-bigint", "num-integer", "num-traits", ] @@ -2977,7 +2870,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.17", + "semver", ] [[package]] @@ -3085,15 +2978,6 @@ dependencies = [ "cc", ] -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - [[package]] name = "semver" version = "1.0.17" @@ -3103,12 +2987,6 @@ dependencies = [ "serde", ] -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "serde" version = "1.0.160" @@ -3397,17 +3275,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "syn-mid" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa8e7560a164edb1621a55d18a0c59abf49d360f47aa7b821061dd7eea7fac9" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "synstructure" version = "0.12.6" @@ -3446,7 +3313,7 @@ source = "git+https://github.com/dashpay/rs-tenderdash-abci#e66a7d6683c0843f11e9 dependencies = [ "bytes", "prost", - "semver 1.0.17", + "semver", "tenderdash-proto", "thiserror", "tracing", diff --git a/Cargo.toml b/Cargo.toml index 1e84b12d923..0353b5edae1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,6 @@ members = [ "packages/rs-drive", "packages/rs-platform-value", "packages/rs-drive-abci", - "packages/rs-drive-nodejs", "packages/dashpay-contract", "packages/withdrawals-contract", "packages/masternode-reward-shares-contract", diff --git a/package.json b/package.json index a3170a24d7f..92a3324b4af 100644 --- a/package.json +++ b/package.json @@ -65,8 +65,7 @@ "packages/masternode-reward-shares-contract", "packages/dash-spv", "packages/wasm-dpp", - "packages/withdrawals-contract", - "packages/rs-drive-nodejs" + "packages/withdrawals-contract" ], "resolutions": { "elliptic": "^6.5.4", @@ -79,4 +78,4 @@ "ua-parser-js": "^1.0.33", "dns-packet": "^5.4.0" } -} +} \ No newline at end of file diff --git a/packages/rs-drive-nodejs/.eslintrc b/packages/rs-drive-nodejs/.eslintrc deleted file mode 100644 index 6de4b115694..00000000000 --- a/packages/rs-drive-nodejs/.eslintrc +++ /dev/null @@ -1,35 +0,0 @@ -{ - "extends": "airbnb-base", - "env": { - "es2021": true, - "node": true - }, - "rules": { - "no-plusplus": 0, - "eol-last": [ - "error", - "always" - ], - "no-continue": "off", - "class-methods-use-this": "off", - "no-await-in-loop": "off", - "no-restricted-syntax": [ - "error", - { - "selector": "LabeledStatement", - "message": "Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand." - }, - { - "selector": "WithStatement", - "message": "`with` is disallowed in strict mode because it makes code impossible to predict and optimize." - } - ], - "curly": [ - "error", - "all" - ] - }, - "globals": { - "BigInt": true - } -} diff --git a/packages/rs-drive-nodejs/.gitignore b/packages/rs-drive-nodejs/.gitignore deleted file mode 100644 index b645ad69ce8..00000000000 --- a/packages/rs-drive-nodejs/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -prebuilds -test_data diff --git a/packages/rs-drive-nodejs/.mocharc.yml b/packages/rs-drive-nodejs/.mocharc.yml deleted file mode 100644 index 53f2f870b5e..00000000000 --- a/packages/rs-drive-nodejs/.mocharc.yml +++ /dev/null @@ -1,2 +0,0 @@ -exit: true -timeout: 10000 diff --git a/packages/rs-drive-nodejs/Cargo.toml b/packages/rs-drive-nodejs/Cargo.toml deleted file mode 100644 index 6c38ec29284..00000000000 --- a/packages/rs-drive-nodejs/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "drive-nodejs" -version = "0.24.0-dev.1" -description = "GroveDB node.js bindings" -edition = "2021" -license = "MIT" -private = true - -[lib] -crate-type = ["cdylib"] - -[dependencies] -drive = { path = "../rs-drive", features = ["fixtures-and-mocks"] } -drive-abci = { path = "../rs-drive-abci" } -num = "0.4.0" - -[dependencies.neon] -version = "0.10.1" -default-features = false -features = ["napi-6", "event-queue-api", "try-catch-api"] - -[features] -enable-mocking = [] diff --git a/packages/rs-drive-nodejs/Drive.js b/packages/rs-drive-nodejs/Drive.js deleted file mode 100644 index d1ac2239a74..00000000000 --- a/packages/rs-drive-nodejs/Drive.js +++ /dev/null @@ -1,940 +0,0 @@ -const { promisify } = require('util'); -const cbor = require('cbor'); -const Document = require('@dashevo/dpp/lib/document/Document'); -const DataContract = require('@dashevo/dpp/lib/dataContract/DataContract'); -const Identity = require('@dashevo/dpp/lib/identity/Identity'); -const decodeProtocolEntityFactory = require('@dashevo/dpp/lib/decodeProtocolEntityFactory'); - -// This file is crated when run `npm run build`. The actual source file that -// exports those functions is ./src/lib.rs -const { - driveOpen, - driveClose, - driveCreateInitialStateStructure, - driveFetchContract, - driveCreateContract, - driveUpdateContract, - driveCreateDocument, - driveUpdateDocument, - driveDeleteDocument, - driveQueryDocuments, - driveProveDocumentsQuery, - driveInsertIdentity, - driveFetchIdentity, - driveFetchIdentityBalance, - driveFetchIdentityBalanceWithCosts, - driveFetchIdentityBalanceIncludeDebtWithCosts, - driveFetchProvedIdentity, - driveFetchManyProvedIdentities, - driveFetchIdentityWithCosts, - driveAddToIdentityBalance, - driveAddKeysToIdentity, - driveDisableIdentityKeys, - driveUpdateIdentityRevision, - driveRemoveFromIdentityBalance, - driveApplyFeesToIdentityBalance, - driveFetchLatestWithdrawalTransactionIndex, - abciInitChain, - abciBlockBegin, - abciBlockEnd, - abciAfterFinalizeBlock, - calculateStorageFeeDistributionAmountAndLeftovers, - driveFetchIdentitiesByPublicKeyHashes, - driveProveIdentitiesByPublicKeyHashes, - driveAddToSystemCredits, -} = require('neon-load-or-build')({ - dir: __dirname, -}); - -const GroveDB = require('./GroveDB'); -const FeeResult = require('./FeeResult'); - -const { appendStackAsync, appendStack } = require('./appendStack'); - -const decodeProtocolEntity = decodeProtocolEntityFactory(); - -// Convert the Drive methods from using callbacks to returning promises -const driveCloseAsync = appendStackAsync(promisify(driveClose)); -const driveCreateInitialStateStructureAsync = appendStackAsync( - promisify(driveCreateInitialStateStructure), -); -const driveFetchContractAsync = appendStackAsync(promisify(driveFetchContract)); -const driveCreateContractAsync = appendStackAsync(promisify(driveCreateContract)); -const driveUpdateContractAsync = appendStackAsync(promisify(driveUpdateContract)); -const driveCreateDocumentAsync = appendStackAsync(promisify(driveCreateDocument)); -const driveUpdateDocumentAsync = appendStackAsync(promisify(driveUpdateDocument)); -const driveDeleteDocumentAsync = appendStackAsync(promisify(driveDeleteDocument)); -const driveQueryDocumentsAsync = appendStackAsync(promisify(driveQueryDocuments)); -const driveProveDocumentsQueryAsync = appendStackAsync(promisify(driveProveDocumentsQuery)); -const driveFetchLatestWithdrawalTransactionIndexAsync = appendStackAsync( - promisify(driveFetchLatestWithdrawalTransactionIndex), -); -const driveInsertIdentityAsync = appendStackAsync(promisify(driveInsertIdentity)); -const driveFetchIdentityAsync = appendStackAsync(promisify(driveFetchIdentity)); -const driveFetchProvedIdentityAsync = appendStackAsync(promisify(driveFetchProvedIdentity)); -const driveFetchIdentityBalanceAsync = appendStackAsync(promisify(driveFetchIdentityBalance)); -const driveFetchIdentityBalanceWithCostsAsync = appendStackAsync( - promisify(driveFetchIdentityBalanceWithCosts), -); -const driveFetchIdentityBalanceIncludeDebtWithCostsAsync = appendStackAsync( - promisify(driveFetchIdentityBalanceIncludeDebtWithCosts), -); - -const driveFetchManyProvedIdentitiesAsync = appendStackAsync( - promisify(driveFetchManyProvedIdentities), -); -const driveFetchIdentityWithCostsAsync = appendStackAsync(promisify(driveFetchIdentityWithCosts)); -const driveAddToIdentityBalanceAsync = appendStackAsync(promisify(driveAddToIdentityBalance)); -const driveAddToSystemCreditsAsync = appendStackAsync(promisify(driveAddToSystemCredits)); -const driveFetchIdentitiesByPublicKeyHashesAsync = appendStackAsync( - promisify(driveFetchIdentitiesByPublicKeyHashes), -); -const driveProveIdentitiesByPublicKeyHashesAsync = appendStackAsync( - promisify(driveProveIdentitiesByPublicKeyHashes), -); -const driveAddKeysToIdentityAsync = appendStackAsync(promisify(driveAddKeysToIdentity)); -const driveDisableIdentityKeysAsync = appendStackAsync(promisify(driveDisableIdentityKeys)); -const driveUpdateIdentityRevisionAsync = appendStackAsync(promisify(driveUpdateIdentityRevision)); -const driveRemoveFromIdentityBalanceAsync = appendStackAsync( - promisify(driveRemoveFromIdentityBalance), -); -const driveApplyFeesToIdentityBalanceAsync = appendStackAsync( - promisify(driveApplyFeesToIdentityBalance), -); -const abciInitChainAsync = appendStackAsync(promisify(abciInitChain)); -const abciBlockBeginAsync = appendStackAsync(promisify(abciBlockBegin)); -const abciBlockEndAsync = appendStackAsync(promisify(abciBlockEnd)); -const abciAfterFinalizeBlockAsync = appendStackAsync(promisify(abciAfterFinalizeBlock)); - -const calculateStorageFeeDistributionAmountAndLeftoversWithStack = appendStack( - calculateStorageFeeDistributionAmountAndLeftovers, -); - -// Wrapper class for the boxed `Drive` for idiomatic JavaScript usage -class Drive { - /** - * @param {string} dbPath - * @param {Object} config - * @param {number} config.dataContractsGlobalCacheSize - * @param {number} config.dataContractsBlockCacheSize - */ - constructor(dbPath, config) { - this.drive = driveOpen(dbPath, config); - this.groveDB = new GroveDB(this.drive); - } - - /** - * @returns {GroveDB} - */ - getGroveDB() { - return this.groveDB; - } - - /** - * @returns {Promise} - */ - async close() { - return driveCloseAsync.call(this.drive); - } - - /** - * @param {boolean} [useTransaction=false] - * - * @returns {Promise<[number, number]>} - */ - async createInitialStateStructure(useTransaction = false) { - return driveCreateInitialStateStructureAsync.call(this.drive, useTransaction); - } - - /** - * @param {Buffer|Identifier} id - * @param {number} [epochIndex] - * @param {boolean} [useTransaction=false] - * - * @returns {Promise<[DataContract|null, FeeResult]>} - */ - async fetchContract(id, epochIndex = undefined, useTransaction = false) { - return driveFetchContractAsync.call( - this.drive, - Buffer.from(id), - epochIndex, - useTransaction, - ).then(([encodedDataContract, innerFeeResult]) => { - let dataContract = encodedDataContract; - - if (encodedDataContract !== null) { - const [protocolVersion, rawDataContract] = decodeProtocolEntity( - encodedDataContract, - ); - - rawDataContract.protocolVersion = protocolVersion; - - dataContract = new DataContract(rawDataContract); - } - - const result = [dataContract]; - - if (innerFeeResult) { - result.push(new FeeResult(innerFeeResult)); - } - - return result; - }); - } - - /** - * @param {DataContract} dataContract - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async createContract(dataContract, blockInfo, useTransaction = false, dryRun = false) { - return driveCreateContractAsync.call( - this.drive, - dataContract.toBuffer(), - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * @param {DataContract} dataContract - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async updateContract(dataContract, blockInfo, useTransaction = false, dryRun = false) { - return driveUpdateContractAsync.call( - this.drive, - dataContract.toBuffer(), - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * @param {Document} document - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async createDocument(document, blockInfo, useTransaction = false, dryRun = false) { - return driveCreateDocumentAsync.call( - this.drive, - document.toBuffer(), - document.getDataContractId().toBuffer(), - document.getType(), - document.getOwnerId().toBuffer(), - true, - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * @param {Document} document - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async updateDocument(document, blockInfo, useTransaction = false, dryRun = false) { - return driveUpdateDocumentAsync.call( - this.drive, - document.toBuffer(), - document.getDataContractId().toBuffer(), - document.getType(), - document.getOwnerId().toBuffer(), - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * @param {Identifier} dataContractId - * @param {string} documentType - * @param {Identifier} documentId - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async deleteDocument( - dataContractId, - documentType, - documentId, - blockInfo, - useTransaction = false, - dryRun = false, - ) { - return driveDeleteDocumentAsync.call( - this.drive, - documentId.toBuffer(), - dataContractId.toBuffer(), - documentType, - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * - * @param {DataContract} dataContract - * @param {string} documentType - * @param {number} [epochIndex] - * @param [query] - * @param [query.where] - * @param [query.limit] - * @param [query.startAt] - * @param [query.startAfter] - * @param [query.orderBy] - * @param {boolean} [useTransaction=false] - * - * @returns {Promise<[Document[], number]>} - */ - async queryDocuments( - dataContract, - documentType, - epochIndex = undefined, - query = {}, - useTransaction = false, - ) { - const encodedQuery = await cbor.encodeAsync(query); - - const [encodedDocuments, , processingFee] = await driveQueryDocumentsAsync.call( - this.drive, - encodedQuery, - dataContract.getId().toBuffer(), - documentType, - epochIndex, - useTransaction, - ); - - const documents = encodedDocuments.map((encodedDocument) => { - const [protocolVersion, rawDocument] = decodeProtocolEntity(encodedDocument); - - rawDocument.$protocolVersion = protocolVersion; - - return new Document(rawDocument, dataContract); - }); - - return [ - documents, - processingFee, - ]; - } - - /** - * - * @param {DataContract} dataContract - * @param {string} documentType - * @param [query] - * @param [query.where] - * @param [query.limit] - * @param [query.startAt] - * @param [query.startAfter] - * @param [query.orderBy] - * @param {boolean} [useTransaction=false] - * - * @returns {Promise<[Document[], number]>} - */ - async proveDocumentsQuery(dataContract, documentType, query = {}, useTransaction = false) { - const encodedQuery = await cbor.encodeAsync(query); - - // eslint-disable-next-line no-return-await - return await driveProveDocumentsQueryAsync.call( - this.drive, - encodedQuery, - dataContract.getId().toBuffer(), - documentType, - useTransaction, - ); - } - - /** - * @param {Identity} identity - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async insertIdentity(identity, blockInfo, useTransaction = false, dryRun = false) { - return driveInsertIdentityAsync.call( - this.drive, - identity.toBuffer(), - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * @param {Buffer|Identifier} id - * @param {boolean} [useTransaction=false] - * - * @returns {Promise} - */ - async fetchIdentity(id, useTransaction = false) { - return driveFetchIdentityAsync.call( - this.drive, - Buffer.from(id), - useTransaction, - ).then((encodedIdentity) => { - if (encodedIdentity === null) { - return null; - } - - const [protocolVersion, rawIdentity] = decodeProtocolEntity( - encodedIdentity, - ); - - rawIdentity.protocolVersion = protocolVersion; - - return new Identity(rawIdentity); - }); - } - - /** - * @param {Buffer|Identifier} id - * @param {boolean} [useTransaction=false] - * - * @returns {Promise} - */ - async fetchIdentityBalance(id, useTransaction = false) { - return driveFetchIdentityBalanceAsync.call( - this.drive, - Buffer.from(id), - useTransaction, - ); - } - - /** - * @param {Buffer|Identifier} id - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise<[number, FeeResult]>} - */ - async fetchIdentityBalanceWithCosts(id, blockInfo, useTransaction = false, dryRun = false) { - return driveFetchIdentityBalanceWithCostsAsync.call( - this.drive, - Buffer.from(id), - blockInfo, - !dryRun, - useTransaction, - ).then(([balance, innerFeeResult]) => [balance, new FeeResult(innerFeeResult)]); - } - - /** - * @param {Buffer|Identifier} id - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise<[number|null, FeeResult]>} - */ - async fetchIdentityBalanceIncludeDebtWithCosts( - id, - blockInfo, - useTransaction = false, - dryRun = false, - ) { - return driveFetchIdentityBalanceIncludeDebtWithCostsAsync.call( - this.drive, - Buffer.from(id), - blockInfo, - !dryRun, - useTransaction, - ).then(([balance, innerFeeResult]) => [balance, new FeeResult(innerFeeResult)]); - } - - /** - * @param {Identifier} id - * @param {boolean} [useTransaction=false] - * - * @returns {Promise} - */ - async proveIdentity(id, useTransaction = false) { - return driveFetchProvedIdentityAsync.call( - this.drive, - Buffer.from(id), - useTransaction, - ); - } - - /** - * @param {Identifier[]} ids - * @param {boolean} [useTransaction=false] - * - * @returns {Promise} - */ - async proveManyIdentities(ids, useTransaction = false) { - return driveFetchManyProvedIdentitiesAsync.call( - this.drive, - ids.map((id) => Buffer.from(id)), - useTransaction, - ); - } - - /** - * @param {Buffer|Identifier} id - * @param {number} epochIndex - * @param {boolean} [useTransaction=false] - * - * @returns {Promise<[Identity|null, FeeResult]>} - */ - async fetchIdentityWithCosts(id, epochIndex, useTransaction = false) { - return driveFetchIdentityWithCostsAsync.call( - this.drive, - Buffer.from(id), - epochIndex, - useTransaction, - ).then(([encodedIdentity, innerFeeResult]) => { - let identity = encodedIdentity; - - if (encodedIdentity !== null) { - const [protocolVersion, rawIdentity] = decodeProtocolEntity( - encodedIdentity, - ); - - rawIdentity.protocolVersion = protocolVersion; - - identity = new Identity(rawIdentity); - } - - return [identity, new FeeResult(innerFeeResult)]; - }); - } - - /** - * @param {Identifier} identityId - * @param {number} amount - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async addToIdentityBalance( - identityId, - amount, - blockInfo, - useTransaction = false, - dryRun = false, - ) { - return driveAddToIdentityBalanceAsync.call( - this.drive, - identityId.toBuffer(), - amount, - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * @param {Identifier} identityId - * @param {number} amount - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async removeFromIdentityBalance( - identityId, - amount, - blockInfo, - useTransaction = false, - dryRun = false, - ) { - return driveRemoveFromIdentityBalanceAsync.call( - this.drive, - identityId.toBuffer(), - amount, - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * @param {Identifier} identityId - * @param {FeeResult} fees - * @param {boolean} [useTransaction=false] - * - * @returns {Promise} - */ - async applyFeesToIdentityBalance( - identityId, - fees, - useTransaction = false, - ) { - return driveApplyFeesToIdentityBalanceAsync.call( - this.drive, - identityId.toBuffer(), - fees.inner, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * @param {number} amount - * @param {boolean} [useTransaction=false] - * - * @returns {Promise} - */ - async addToSystemCredits( - amount, - useTransaction = false, - ) { - return driveAddToSystemCreditsAsync.call( - this.drive, - amount, - useTransaction, - ); - } - - /** - * @param {Buffer[]} hashes - * @param {boolean} [useTransaction=false] - * - * @returns {Promise>} - */ - async fetchIdentitiesByPublicKeyHashes(hashes, useTransaction = false) { - return driveFetchIdentitiesByPublicKeyHashesAsync.call( - this.drive, - hashes.map((h) => Buffer.from(h)), - useTransaction, - ).then((encodedIdentities) => ( - encodedIdentities.map((encodedIdentity) => { - const [protocolVersion, rawIdentity] = decodeProtocolEntity( - encodedIdentity, - ); - - rawIdentity.protocolVersion = protocolVersion; - - return new Identity(rawIdentity); - }) - )); - } - - /** - * @param {Buffer[]} hashes - * @param {boolean} [useTransaction=false] - * - * @returns {Promise>} - */ - async proveIdentitiesByPublicKeyHashes(hashes, useTransaction = false) { - return driveProveIdentitiesByPublicKeyHashesAsync.call( - this.drive, - hashes.map((h) => Buffer.from(h)), - useTransaction, - ); - } - - /** - * @param {Identifier} identityId - * @param {IdentityPublicKey[]} keys - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async addKeysToIdentity( - identityId, - keys, - blockInfo, - useTransaction = false, - dryRun = false, - ) { - return driveAddKeysToIdentityAsync.call( - this.drive, - identityId.toBuffer(), - keys, - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * @param {Identifier} identityId - * @param {number[]} keyIds - * @param {number} disableAt - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async disableIdentityKeys( - identityId, - keyIds, - disableAt, - blockInfo, - useTransaction = false, - dryRun = false, - ) { - return driveDisableIdentityKeysAsync.call( - this.drive, - identityId.toBuffer(), - keyIds, - disableAt, - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * @param {Identifier} identityId - * @param {number} revision - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async updateIdentityRevision( - identityId, - revision, - blockInfo, - useTransaction = false, - dryRun = false, - ) { - return driveUpdateIdentityRevisionAsync.call( - this.drive, - identityId.toBuffer(), - revision, - blockInfo, - !dryRun, - useTransaction, - ).then((innerFeeResult) => new FeeResult(innerFeeResult)); - } - - /** - * Fetch the latest index of the withdrawal transaction in a queue - * - * @param {RawBlockInfo} blockInfo - * @param {boolean} [useTransaction=false] - * @param {boolean} [dryRun=false] - * - * @returns {Promise} - */ - async fetchLatestWithdrawalTransactionIndex(blockInfo, useTransaction = false, dryRun = false) { - return driveFetchLatestWithdrawalTransactionIndexAsync.call( - this.drive, - blockInfo, - !dryRun, - useTransaction, - ); - } - - /** - * Get the ABCI interface - * @returns {RSAbci} - */ - getAbci() { - const { drive } = this; - - /** - * @typedef RSAbci - */ - return { - /** - * ABCI init chain - * - * @param {InitChainRequest} request - * @param {boolean} [useTransaction=false] - * - * @returns {Promise} - */ - async initChain(request, useTransaction = false) { - const requestBytes = cbor.encode(request); - - const responseBytes = await abciInitChainAsync.call( - drive, - requestBytes, - useTransaction, - ); - - return cbor.decode(responseBytes); - }, - - /** - * ABCI block begin - * - * @param {BlockBeginRequest} request - * @param {boolean} [useTransaction=false] - * - * @returns {Promise} - */ - async blockBegin(request, useTransaction = false) { - const requestBytes = cbor.encode({ - ...request, - // cborium doesn't eat Buffers - proposerProTxHash: Array.from(request.proposerProTxHash), - validatorSetQuorumHash: Array.from(request.validatorSetQuorumHash), - }); - - const responseBytes = await abciBlockBeginAsync.call( - drive, - requestBytes, - useTransaction, - ); - - return cbor.decode(responseBytes); - }, - - /** - * ABCI block end - * - * @param {BlockEndRequest} request - * @param {boolean} [useTransaction=false] - * - * @returns {Promise} - */ - async blockEnd(request, useTransaction = false) { - const responseBytes = await abciBlockEndAsync.call( - drive, - request, - useTransaction, - ); - - return cbor.decode(responseBytes); - }, - - /** - * ABCI after finalize block - * - * @param {AfterFinalizeBlockRequest} request - * - * @returns {Promise} - */ - async afterFinalizeBlock(request) { - const requestBytes = cbor.encode({ - ...request, - // cborium doesn't eat Buffers - updatedDataContractIds: request.updatedDataContractIds - .map((identifier) => Array.from(identifier)), - }); - - const responseBytes = await abciAfterFinalizeBlockAsync.call( - drive, - requestBytes, - ); - - return cbor.decode(responseBytes); - }, - }; - } -} - -// eslint-disable-next-line max-len -Drive.calculateStorageFeeDistributionAmountAndLeftovers = calculateStorageFeeDistributionAmountAndLeftoversWithStack; -Drive.FeeResult = FeeResult; - -/** - * @typedef RawBlockInfo - * @property {number} height - * @property {number} epoch - * @property {number} timeMs - */ - -/** - * @typedef InitChainRequest - * @property {number} genesisTimeMs - * @property {SystemIdentityPublicKeys} systemIdentityPublicKeys - */ - -/** - * @typedef SystemIdentityPublicKeys - * @property {RequiredIdentityPublicKeysSet} masternodeRewardSharesContractOwner - * @property {RequiredIdentityPublicKeysSet} featureFlagsContractOwner - * @property {RequiredIdentityPublicKeysSet} dpnsContractOwner - * @property {RequiredIdentityPublicKeysSet} withdrawalsContractOwner - * @property {RequiredIdentityPublicKeysSet} dashpayContractOwner - */ - -/** - * @typedef RequiredIdentityPublicKeysSet - * @property {Buffer} master - * @property {Buffer} high - */ - -/** - * @typedef InitChainResponse - */ - -/** - * @typedef BlockBeginRequest - * @property {number} blockHeight - * @property {number} blockTimeMs - timestamp in milliseconds - * @property {number} [previousBlockTimeMs] - timestamp in milliseconds - * @property {Buffer} proposerProTxHash - * @property {Buffer} validatorSetQuorumHash - * @property {number} lastSyncedCoreHeight - * @property {number} coreChainLockedHeight, - * @property {number} proposedAppVersion - * @property {number} totalHpmns - */ - -/** - * @typedef BlockBeginResponse - * @property {Buffer[]} unsignedWithdrawalTransactions - * @property {EpochInfo} epochInfo - */ - -/** - * @typedef EpochInfo - * @property {number} currentEpochIndex - * @property {boolean} isEpochChange - * @property {number} [previousEpochIndex] - Available only on epoch change - */ - -/** - * @typedef BlockEndRequest - * @property {BlockFees} fees - */ - -/** - * @typedef BlockFees - * @property {number} storageFee - * @property {number} processingFee - * @property {Object} refundsPerEpoch - */ - -/** - * @typedef BlockEndResponse - * @property {number} [proposersPaidCount] - * @property {number} [paidEpochIndex] - * @property {number} [refundedEpochsCount] - */ - -/** - * @typedef AfterFinalizeBlockRequest - * @property {Identifier[]|Buffer[]} updatedDataContractIds - */ - -/** - * @typedef AfterFinalizeBlockResponse - */ - -module.exports = Drive; diff --git a/packages/rs-drive-nodejs/FeeResult.js b/packages/rs-drive-nodejs/FeeResult.js deleted file mode 100644 index 50a7b120e10..00000000000 --- a/packages/rs-drive-nodejs/FeeResult.js +++ /dev/null @@ -1,95 +0,0 @@ -// This file is crated when run `npm run build`. The actual source file that -// exports those functions is ./src/lib.rs -const { - feeResultAdd, - feeResultGetStorageFee, - feeResultGetProcessingFee, - feeResultAddFees, - feeResultCreate, - feeResultGetRefunds, - feeResultSumRefundsPerEpoch, -} = require('neon-load-or-build')({ - dir: __dirname, -}); - -const { appendStack } = require('./appendStack'); - -const feeResultAddWithStack = appendStack(feeResultAdd); -const feeResultAddFeesWithStack = appendStack(feeResultAddFees); -const feeResultGetStorageFeeWithStack = appendStack(feeResultGetStorageFee); -const feeResultGetProcessingFeeWithStack = appendStack(feeResultGetProcessingFee); -const feeResultCreateWithStack = appendStack(feeResultCreate); -const feeResultGetRefundsWithStack = appendStack(feeResultGetRefunds); -const feeResultSumRefundsPerEpochWithStack = appendStack(feeResultSumRefundsPerEpoch); - -class FeeResult { - constructor(inner) { - this.inner = inner; - } - - /** - * Processing fees - * - * @returns {number} - */ - get processingFee() { - return feeResultGetProcessingFeeWithStack.call(this.inner); - } - - /** - * Storage fees - * - * @returns {number} - */ - get storageFee() { - return feeResultGetStorageFeeWithStack.call(this.inner); - } - - /** - * Credit refunds - * - * @return {{identifier: Buffer, creditsPerEpoch: Object}[]} - */ - get feeRefunds() { - return feeResultGetRefundsWithStack.call(this.inner); - } - - /** - * Sum credit refunds per epoch - * - * @returns {Object}[]} - */ - sumFeeRefundsPerEpoch() { - return feeResultSumRefundsPerEpochWithStack.call(this.inner); - } - - /** - * Adds and self assigns result between two Fee Results - * - * @param {FeeResult} feeResult - */ - add(feeResult) { - this.inner = feeResultAddWithStack.call(this.inner, feeResult.inner); - } - - /** - * @param {number} storageFee - * @param {number} processingFee - */ - addFees(storageFee, processingFee) { - feeResultAddFeesWithStack.call(this.inner, storageFee, processingFee); - } - - /** - * Create new fee result - * - * @returns {FeeResult} - */ - static create(storageFee, processingFee, feeRefunds) { - const inner = feeResultCreateWithStack(storageFee, processingFee, feeRefunds); - - return new FeeResult(inner); - } -} - -module.exports = FeeResult; diff --git a/packages/rs-drive-nodejs/GroveDB.js b/packages/rs-drive-nodejs/GroveDB.js deleted file mode 100644 index b020affb1f4..00000000000 --- a/packages/rs-drive-nodejs/GroveDB.js +++ /dev/null @@ -1,342 +0,0 @@ -const { promisify } = require('util'); - -// This file is crated when run `npm run build`. The actual source file that -// exports those functions is ./src/lib.rs -const { - groveDbInsert, - groveDbGet, - groveDbFlush, - groveDbStartTransaction, - groveDbCommitTransaction, - groveDbRollbackTransaction, - groveDbAbortTransaction, - groveDbIsTransactionStarted, - groveDbDelete, - groveDbInsertIfNotExists, - groveDbPutAux, - groveDbDeleteAux, - groveDbGetAux, - groveDbQuery, - groveDbProveQuery, - groveDbRootHash, - groveDbProveQueryMany, -} = require('neon-load-or-build')({ - dir: __dirname, -}); - -const { appendStackAsync } = require('./appendStack'); - -const groveDbGetAsync = appendStackAsync(promisify(groveDbGet)); -const groveDbInsertAsync = appendStackAsync(promisify(groveDbInsert)); -const groveDbInsertIfNotExistsAsync = appendStackAsync(promisify(groveDbInsertIfNotExists)); -const groveDbDeleteAsync = appendStackAsync(promisify(groveDbDelete)); -const groveDbFlushAsync = appendStackAsync(promisify(groveDbFlush)); -const groveDbStartTransactionAsync = appendStackAsync(promisify(groveDbStartTransaction)); -const groveDbCommitTransactionAsync = appendStackAsync(promisify(groveDbCommitTransaction)); -const groveDbRollbackTransactionAsync = appendStackAsync(promisify(groveDbRollbackTransaction)); -const groveDbIsTransactionStartedAsync = appendStackAsync(promisify(groveDbIsTransactionStarted)); -const groveDbAbortTransactionAsync = appendStackAsync(promisify(groveDbAbortTransaction)); -const groveDbPutAuxAsync = appendStackAsync(promisify(groveDbPutAux)); -const groveDbDeleteAuxAsync = appendStackAsync(promisify(groveDbDeleteAux)); -const groveDbGetAuxAsync = appendStackAsync(promisify(groveDbGetAux)); -const groveDbQueryAsync = appendStackAsync(promisify(groveDbQuery)); -const groveDbProveQueryAsync = appendStackAsync(promisify(groveDbProveQuery)); -const groveDbProveQueryManyAsync = appendStackAsync(promisify(groveDbProveQueryMany)); -const groveDbRootHashAsync = appendStackAsync(promisify(groveDbRootHash)); - -// Wrapper class for the boxed `GroveDB` for idiomatic JavaScript usage -class GroveDB { - /** - * @param drive - */ - constructor(drive) { - this.db = drive; - } - - /** - * @param {Buffer[]} path - * @param {Buffer} key - * @param {boolean} [useTransaction=false] - * @returns {Promise} - */ - async get(path, key, useTransaction = false) { - return groveDbGetAsync.call(this.db, path, key, useTransaction); - } - - /** - * @param {Buffer[]} path - * @param {Buffer} key - * @param {Element} value - * @param {boolean} [useTransaction=false] - * @returns {Promise<*>} - */ - async insert(path, key, value, useTransaction = false) { - return groveDbInsertAsync.call(this.db, path, key, value, useTransaction); - } - - /** - * @param {Buffer[]} path - * @param {Buffer} key - * @param {Element} value - * @param {boolean} [useTransaction=false] - * @return {Promise<*>} - */ - async insertIfNotExists(path, key, value, useTransaction = false) { - return groveDbInsertIfNotExistsAsync.call(this.db, path, key, value, useTransaction); - } - - /** - * - * @param {Buffer[]} path - * @param {Buffer} key - * @param {boolean} [useTransaction=false] - * @return {Promise<*>} - */ - async delete(path, key, useTransaction = false) { - return groveDbDeleteAsync.call(this.db, path, key, useTransaction); - } - - /** - * Flush data on the disk - * - * @returns {Promise} - */ - async flush() { - return groveDbFlushAsync.call(this.db); - } - - /** - * Start a transaction with isolated scope - * - * Write operations will be allowed only for the transaction - * until it's committed - * - * @return {Promise} - */ - async startTransaction() { - return groveDbStartTransactionAsync.call(this.db); - } - - /** - * Commit transaction - * - * Transaction should be started before - * - * @return {Promise} - */ - async commitTransaction() { - return groveDbCommitTransactionAsync.call(this.db); - } - - /** - * Rollback transaction to this initial state when it was created - * - * @returns {Promise} - */ - async rollbackTransaction() { - return groveDbRollbackTransactionAsync.call(this.db); - } - - /** - * Returns true if transaction started - * - * @returns {Promise} - */ - async isTransactionStarted() { - return groveDbIsTransactionStartedAsync.call(this.db); - } - - /** - * Aborts transaction - * - * @returns {Promise} - */ - async abortTransaction() { - return groveDbAbortTransactionAsync.call(this.db); - } - - /** - * Put auxiliary data - * - * @param {Buffer} key - * @param {Buffer} value - * @param {boolean} [useTransaction=false] - * @return {Promise<*>} - */ - async putAux(key, value, useTransaction = false) { - return groveDbPutAuxAsync.call(this.db, key, value, useTransaction); - } - - /** - * Delete auxiliary data - * - * @param {Buffer} key - * @param {boolean} [useTransaction=false] - * @return {Promise<*>} - */ - async deleteAux(key, useTransaction = false) { - return groveDbDeleteAuxAsync.call(this.db, key, useTransaction); - } - - /** - * Get auxiliary data - * - * @param {Buffer} key - * @param {boolean} [useTransaction=false] - * @return {Promise} - */ - async getAux(key, useTransaction = false) { - return groveDbGetAuxAsync.call(this.db, key, useTransaction); - } - - /** - * Get data using query. - * - * @param {PathQuery} query - * @param {boolean} [skipCache=false] - * @param {boolean} [useTransaction=false] - * @return {Promise<*>} - */ - async query(query, skipCache = false, useTransaction = false) { - return groveDbQueryAsync.call(this.db, query, skipCache, useTransaction); - } - - /** - * Get proof using query. - * - * @param {PathQuery} query - * @param {boolean} [verbose=false] - * @param {boolean} [useTransaction=false] - * @return {Promise<*>} - */ - async proveQuery(query, verbose = false, useTransaction = false) { - return groveDbProveQueryAsync.call(this.db, query, verbose, useTransaction); - } - - /** - * Get proof using query. - * - * @param {PathQuery[]} queries - * @param {boolean} [useTransaction=false] - * @return {Promise} - */ - async proveQueryMany(queries, useTransaction = false) { - return groveDbProveQueryManyAsync.call(this.db, queries, useTransaction); - } - - /** - * Get root hash - * - * @param {boolean} [useTransaction=false] - * @returns {Promise} - */ - async getRootHash(useTransaction = false) { - return groveDbRootHashAsync.call(this.db, useTransaction); - } -} - -/** - * @typedef Element - * @property {"item"|"reference"|"tree"} type - element type. Can be "item", "reference" or "tree" - * @property {number} [epoch] - epoch storage flag - * @property {Buffer} [ownerId] - ownerId storage flag - * @property {Buffer|Buffer[]|Object} [value] - element value - */ - -/** - * @typedef PathQuery - * @property {Buffer[]} path - * @property {SizedQuery} query - */ - -/** - * @typedef SizedQuery - * @property {Query} query - * @property {number} [limit] - * @property {number} [offset] - */ - -/** - * @typedef Query - * @property {Array< - * QueryItemKey| - * QueryItemKey| - * QueryItemRange| - * QueryItemRangeInclusive| - * QueryItemRangeFull| - * QueryItemRangeFrom| - * QueryItemRangeTo| - * QueryItemRangeToInclusive| - * QueryItemRangeAfter| - * QueryItemRangeAfterTo| - * QueryItemRangeAfterToInclusive - * >} [items] - * @property {Buffer} [subqueryPath] - * @property {Query} [subquery] - * @property {boolean} [leftToRight] - */ - -/** - * @typedef QueryItemKey - * @property {"key"} type - * @property {Buffer} key - */ - -/** - * @typedef QueryItemRange - * @property {"range"} type - * @property {Buffer} from - * @property {Buffer} to - */ - -/** - * @typedef QueryItemRangeInclusive - * @property {"rangeInclusive"} type - * @property {Buffer} from - * @property {Buffer} to - */ - -/** - * @typedef QueryItemRangeFull - * @property {"rangeFull"} type - */ - -/** - * @typedef QueryItemRangeFrom - * @property {"rangeFrom"} type - * @property {Buffer} from - */ - -/** - * @typedef QueryItemRangeTo - * @property {"rangeTo"} type - * @property {Buffer} to - */ - -/** - * @typedef QueryItemRangeToInclusive - * @property {"rangeToInclusive"} type - * @property {Buffer} to - */ - -/** - * @typedef QueryItemRangeAfter - * @property {"rangeAfter"} type - * @property {Buffer} after - */ - -/** - * @typedef QueryItemRangeAfterTo - * @property {"rangeAfterTo"} type - * @property {Buffer} after - * @property {Buffer} to - */ - -/** - * @typedef QueryItemRangeAfterToInclusive - * @property {"rangeAfterToInclusive"} type - * @property {Buffer} after - * @property {Buffer} to - */ - -module.exports = GroveDB; diff --git a/packages/rs-drive-nodejs/appendStack.js b/packages/rs-drive-nodejs/appendStack.js deleted file mode 100644 index 6e8489361cc..00000000000 --- a/packages/rs-drive-nodejs/appendStack.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @param {Function} fn - * @returns {(function(...[*]): Promise<*>)} - */ -function appendStackAsync(fn) { - return async function appendStackWrapper(...args) { - try { - return await fn.call(this, ...args); - } catch (e) { - e.stack = (new Error(e.message)).stack; - - throw e; - } - }; -} - -/** - * @param {Function} fn - * @returns {(function(...[*]): *)} - */ -function appendStack(fn) { - return function appendStackWrapper(...args) { - try { - return fn.call(this, ...args); - } catch (e) { - e.stack = (new Error(e.message)).stack; - - throw e; - } - }; -} - -module.exports = { - appendStack, - appendStackAsync, -}; diff --git a/packages/rs-drive-nodejs/docker/build.sh b/packages/rs-drive-nodejs/docker/build.sh deleted file mode 100755 index 5a69bcd6e32..00000000000 --- a/packages/rs-drive-nodejs/docker/build.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash - -## Setup arguments -while getopts t:a:l: flag -do - case "${flag}" in - t) target=${OPTARG};; - a) arch=${OPTARG};; - l) libc=${OPTARG};; - *) echo "invalid arguments" && exit 1;; - esac -done - -## Install multilib -apt update -apt install -y gcc-multilib -if [[ $target = "aarch64-unknown-linux-gnu" ]] -then - apt install -y gcc-aarch64-linux-gnu libstdc++-11-dev-arm64-cross -fi - -## Update toolchain -rustup update stable - -## Install build target -rustup target install $target - -chmod 777 -R /root/.cargo -mkdir -p /github/workspace/target -chmod 777 -R /github/workspace/target - -## Install Node.JS -curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - -apt install -y nodejs - -corepack enable - -yarn install - -CARGO_BUILD_TARGET=$target \ -CARGO_BUILD_PROFILE=release \ -ARCH=$arch \ -LIBC=$libc \ -yarn workspace @dashevo/rs-drive run build diff --git a/packages/rs-drive-nodejs/package.json b/packages/rs-drive-nodejs/package.json deleted file mode 100644 index eb665132ece..00000000000 --- a/packages/rs-drive-nodejs/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "@dashevo/rs-drive", - "version": "0.24.0-dev.16", - "description": "Node.JS binding for Rust Drive", - "main": "Drive.js", - "scripts": { - "build": "yarn exec scripts/build.sh", - "test": "NODE_ENV=test ultra --build && mocha test", - "lint": "eslint ." - }, - "files": [ - "prebuilds", - "Drive.js", - "GroveDB.js", - "appendStack.js", - "src" - ], - "license": "MIT", - "devDependencies": { - "@dashevo/dashcore-lib": "~0.20.0", - "@dashevo/withdrawals-contract": "workspace:*", - "chai": "^4.3.4", - "dirty-chai": "^2.0.1", - "eslint": "^7.32.0", - "eslint-config-airbnb-base": "^14.2.1", - "eslint-plugin-import": "^2.24.2", - "mocha": "^9.1.2", - "neon-cli": "^0.10.1", - "ultra-runner": "^3.10.5" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/dashevo/rs-drive.git" - }, - "keywords": [ - "Dash Platform", - "Drive" - ], - "bugs": { - "url": "https://github.com/dashevo/rs-drive/issues" - }, - "homepage": "https://github.com/dashevo/rs-drive#readme", - "dependencies": { - "@dashevo/dpp": "workspace:*", - "cargo-cp-artifact": "^0.1.6", - "cbor": "^8.0.0", - "neon-load-or-build": "^2.2.2", - "neon-tag-prebuild": "github:shumkov/neon-tag-prebuild#patch-1" - } -} diff --git a/packages/rs-drive-nodejs/scripts/build.sh b/packages/rs-drive-nodejs/scripts/build.sh deleted file mode 100755 index 6e169fdf681..00000000000 --- a/packages/rs-drive-nodejs/scripts/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash - -PROFILE_ARG="" -FEATURE_FLAG="" - -if [ -n "$CARGO_BUILD_PROFILE" ]; then - if [ "$CARGO_BUILD_PROFILE" == "release" ]; then - PROFILE_ARG="--release" - elif [ "$CARGO_BUILD_PROFILE" != "debug" ]; then - PROFILE_ARG="--profile $CARGO_BUILD_PROFILE" - fi -fi - -if [ -n "$NODE_ENV" ]; then - if [ "$NODE_ENV" == "test" ]; then - FEATURE_FLAG="--features enable-mocking" - fi -fi - -cargo-cp-artifact -ac drive-nodejs native/index.node -- \ - cargo build --message-format=json-render-diagnostics $PROFILE_ARG $FEATURE_FLAG \ - && neon-tag-prebuild \ - && rm -rf native diff --git a/packages/rs-drive-nodejs/src/converter.rs b/packages/rs-drive-nodejs/src/converter.rs deleted file mode 100644 index 13d49f334c4..00000000000 --- a/packages/rs-drive-nodejs/src/converter.rs +++ /dev/null @@ -1,534 +0,0 @@ -use drive::dpp::block::block_info::BlockInfo; -use drive::dpp::block::epoch::Epoch; -use drive::dpp::identity::{IdentityPublicKey, KeyID, KeyType, Purpose, SecurityLevel}; -use drive::dpp::platform_value::BinaryData; -use drive::drive::flags::StorageFlags; -use drive::fee::credits::Credits; -use drive::fee::epoch::CreditsPerEpoch; -use drive::grovedb::reference_path::ReferencePathType; -use drive::grovedb::{Element, PathQuery, Query, SizedQuery}; -use neon::prelude::*; -use neon::types::buffer::TypedArray; -use num::FromPrimitive; -use std::borrow::Borrow; -use std::num::ParseIntError; - -fn element_to_string(element: &Element) -> &'static str { - match element { - Element::Item(..) => "item", - Element::SumItem(..) => "sumItem", - Element::Reference(..) => "reference", - Element::Tree(..) => "tree", - Element::SumTree(..) => "sumTree", - } -} - -pub fn js_object_to_element<'a, C: Context<'a>>( - cx: &mut C, - js_object: Handle, -) -> NeonResult { - let js_element_type: Handle = js_object.get(cx, "type")?; - - let element_type: String = js_element_type.value(cx); - - let js_element_epoch: Option> = js_object.get_opt(cx, "epoch")?; - - let element_flags = if let Some(js_epoch) = js_element_epoch { - let epoch = u16::try_from(js_epoch.value(cx) as i64) - .or_else(|_| cx.throw_range_error("`epochs` must fit in u16"))?; - - let js_maybe_owner_id: Option> = js_object.get_opt(cx, "ownerId")?; - - let maybe_owner_id = js_maybe_owner_id - .map(|js_buffer| js_buffer_to_identifier(cx, js_buffer)) - .transpose()?; - - let storage_flags = StorageFlags::new_single_epoch(epoch, maybe_owner_id); - - storage_flags.to_some_element_flags() - } else { - None - }; - - match element_type.as_str() { - "item" => { - let js_buffer: Handle = js_object.get(cx, "value")?; - let item = js_buffer_to_vec_u8(cx, js_buffer); - - Ok(Element::new_item_with_flags(item, element_flags)) - } - "reference" => { - let js_object: Handle = js_object.get(cx, "value")?; - let reference = js_object_to_reference(cx, js_object)?; - - Ok(Element::new_reference_with_flags(reference, element_flags)) - } - "tree" => Ok(Element::empty_tree_with_flags(element_flags)), - _ => cx.throw_error(format!("Unexpected element type {}", element_type)), - } -} - -fn js_object_to_reference<'a, C: Context<'a>>( - cx: &mut C, - js_object: Handle, -) -> NeonResult { - let js_reference_type: Handle = js_object.get(cx, "type")?; - let reference_type: String = js_reference_type.value(cx); - - match reference_type.as_str() { - "absolutePathReference" => { - let js_path: Handle = js_object.get(cx, "path")?; - let path = js_array_of_buffers_to_vec(cx, js_path)?; - - Ok(ReferencePathType::AbsolutePathReference(path)) - } - "upstreamRootHeightReference" => { - let js_path: Handle = js_object.get(cx, "path")?; - let path = js_array_of_buffers_to_vec(cx, js_path)?; - - let js_relativity_index: Handle = js_object.get(cx, "relativityIndex")?; - let relativity_index_f64: f64 = js_relativity_index.value(cx); - let relativity_index_option: Option = FromPrimitive::from_f64(relativity_index_f64); - let relativity_index: u8 = relativity_index_option - .ok_or(()) - .or_else(|_| cx.throw_error("cannot convert relativity_index from f64 to u8"))?; - - Ok(ReferencePathType::UpstreamRootHeightReference( - relativity_index, - path, - )) - } - "upstreamFromElementHeightReference" => { - let js_path: Handle = js_object.get(cx, "path")?; - let path = js_array_of_buffers_to_vec(cx, js_path)?; - - let js_relativity_index: Handle = js_object.get(cx, "relativityIndex")?; - let relativity_index_f64: f64 = js_relativity_index.value(cx); - let relativity_index_option: Option = FromPrimitive::from_f64(relativity_index_f64); - let relativity_index: u8 = relativity_index_option - .ok_or(()) - .or_else(|_| cx.throw_error("cannot convert relativity_index from f64 to u8"))?; - - Ok(ReferencePathType::UpstreamFromElementHeightReference( - relativity_index, - path, - )) - } - "cousinReference" => { - let js_key: Handle = js_object.get(cx, "key")?; - let key = js_buffer_to_vec_u8(cx, js_key); - - Ok(ReferencePathType::CousinReference(key)) - } - "siblingReference" => { - let js_key: Handle = js_object.get(cx, "key")?; - let key = js_buffer_to_vec_u8(cx, js_key); - - Ok(ReferencePathType::SiblingReference(key)) - } - _ => cx.throw_error(format!("Unexpected reference type {}", reference_type)), - } -} - -pub fn element_to_js_object<'a, C: Context<'a>>( - cx: &mut C, - element: Element, -) -> NeonResult> { - let js_object = cx.empty_object(); - let js_type_string = cx.string(element_to_string(&element)); - js_object.set(cx, "type", js_type_string)?; - - let maybe_js_value: Option> = match element { - Element::Item(item, _) => { - let js_buffer = JsBuffer::external(cx, item); - Some(js_buffer.upcast()) - } - Element::SumItem(number, _) => { - let js_number = cx.number(number as f64).upcast(); - Some(js_number) - } - Element::Reference(reference, _, _) => { - let reference = reference_to_dictionary(cx, reference)?; - Some(reference) - } - Element::Tree(Some(tree), _) | Element::SumTree(Some(tree), ..) => { - let js_buffer = JsBuffer::external(cx, tree); - Some(js_buffer.upcast()) - } - Element::Tree(None, _) | Element::SumTree(None, ..) => None, - }; - - if let Some(js_value) = maybe_js_value { - js_object.set(cx, "value", js_value)?; - } - - Ok(js_object.upcast()) -} - -pub fn nested_vecs_to_js<'a, C: Context<'a>>( - cx: &mut C, - v: Vec>, -) -> NeonResult> { - let js_array: Handle = cx.empty_array(); - - for (index, bytes) in v.iter().enumerate() { - let js_buffer = JsBuffer::external(cx, bytes.clone()); - let js_value = js_buffer.as_value(cx); - js_array.set(cx, index as u32, js_value)?; - } - - Ok(js_array.upcast()) -} - -pub fn reference_to_dictionary<'a, C: Context<'a>>( - cx: &mut C, - reference: ReferencePathType, -) -> NeonResult> { - let js_object: Handle = cx.empty_object(); - - match reference { - ReferencePathType::AbsolutePathReference(path) => { - let js_type_name = cx.string("absolutePathReference"); - let js_path = nested_vecs_to_js(cx, path)?; - - js_object.set(cx, "type", js_type_name)?; - js_object.set(cx, "path", js_path)?; - } - ReferencePathType::UpstreamRootHeightReference(relativity_index, path) => { - let js_type_name = cx.string("upstreamRootHeightReference"); - let js_relativity_index = cx.number(relativity_index); - let js_path = nested_vecs_to_js(cx, path)?; - - js_object.set(cx, "type", js_type_name)?; - js_object.set(cx, "relativityIndex", js_relativity_index)?; - js_object.set(cx, "path", js_path)?; - } - ReferencePathType::UpstreamFromElementHeightReference(relativity_index, path) => { - let js_type_name = cx.string("upstreamFromElementHeightReference"); - let js_relativity_index = cx.number(relativity_index); - let js_path = nested_vecs_to_js(cx, path)?; - - js_object.set(cx, "type", js_type_name)?; - js_object.set(cx, "relativityIndex", js_relativity_index)?; - js_object.set(cx, "path", js_path)?; - } - ReferencePathType::CousinReference(key) => { - let js_type_name = cx.string("cousinReference"); - let js_key = JsBuffer::external(cx, key); - - js_object.set(cx, "type", js_type_name)?; - js_object.set(cx, "key", js_key)?; - } - ReferencePathType::SiblingReference(key) => { - let js_type_name = cx.string("siblingReference"); - let js_key = JsBuffer::external(cx, key); - - js_object.set(cx, "type", js_type_name)?; - js_object.set(cx, "key", js_key)?; - } - ReferencePathType::RemovedCousinReference(path) => { - let js_type_name = cx.string("removedCousinReference"); - let js_path = nested_vecs_to_js(cx, path)?; - - js_object.set(cx, "type", js_type_name)?; - js_object.set(cx, "path", js_path)?; - } - } - - Ok(js_object.upcast()) -} - -pub fn js_buffer_to_identifier<'a, C: Context<'a>>( - cx: &mut C, - js_buffer: Handle, -) -> NeonResult<[u8; 32]> { - // let guard = cx.lock(); - - let key_memory_view = js_buffer.borrow(); - - // let key_buffer = js_buffer.deref(); - // let key_memory_view = js_buffer.borrow(&guard); - let key_slice: &[u8] = key_memory_view.as_slice(cx); - <[u8; 32]>::try_from(key_slice).or_else(|_| cx.throw_type_error("hash must be 32 bytes long")) -} - -pub fn js_buffer_to_vec_u8<'a, C: Context<'a>>(cx: &mut C, js_buffer: Handle) -> Vec { - // let guard = cx.lock(); - - let key_memory_view = js_buffer.borrow(); - - // let key_buffer = js_buffer.deref(); - // let key_memory_view = js_buffer.borrow(&guard); - let key_slice: &[u8] = key_memory_view.as_slice(cx); - key_slice.to_vec() -} - -pub fn js_array_of_buffers_to_vec<'a, C: Context<'a>>( - cx: &mut C, - js_array: Handle, -) -> NeonResult>> { - let buf_vec = js_array.to_vec(cx)?; - let mut vec: Vec> = Vec::with_capacity(buf_vec.len()); - - for buf in buf_vec { - let js_buffer_handle = buf.downcast_or_throw::(cx)?; - vec.push(js_buffer_to_vec_u8(cx, js_buffer_handle)); - } - - Ok(vec) -} - -pub fn js_array_of_buffers_to_identifiers<'a, C: Context<'a>>( - cx: &mut C, - js_array: Handle, -) -> NeonResult> { - let buf_vec = js_array.to_vec(cx)?; - let mut vec: Vec<[u8; 32]> = Vec::with_capacity(buf_vec.len()); - - for buf in buf_vec { - let js_buffer_handle = buf.downcast_or_throw::(cx)?; - vec.push(js_buffer_to_identifier(cx, js_buffer_handle)?); - } - - Ok(vec) -} - -pub fn js_value_to_option<'a, T: Value, C: Context<'a>>( - cx: &mut C, - js_value: Handle<'a, JsValue>, -) -> NeonResult>> { - if js_value.is_a::(cx) || js_value.is_a::(cx) { - Ok(None) - } else { - Ok(Some(js_value.downcast_or_throw::(cx)?)) - } -} - -fn js_object_get_vec_u8<'a, C: Context<'a>>( - cx: &mut C, - js_object: Handle, - field: &str, -) -> NeonResult> { - let buffer: Handle = js_object.get(cx, field)?; - - Ok(js_buffer_to_vec_u8(cx, buffer)) -} - -fn js_object_to_query<'a, C: Context<'a>>( - cx: &mut C, - js_object: Handle, -) -> NeonResult { - let items: Handle = js_object.get(cx, "items")?; - let mut query = Query::new(); - for js_item in items.to_vec(cx)? { - let item = js_item.downcast_or_throw::(cx)?; - - let item_type: Handle = item.get(cx, "type")?; - let item_type = item_type.value(cx); - - match item_type.as_ref() { - "key" => { - query.insert_key(js_object_get_vec_u8(cx, item, "key")?); - } - "range" => { - let from = js_object_get_vec_u8(cx, item, "from")?; - let to = js_object_get_vec_u8(cx, item, "to")?; - query.insert_range(from..to); - } - "rangeInclusive" => { - let from = js_object_get_vec_u8(cx, item, "from")?; - let to = js_object_get_vec_u8(cx, item, "to")?; - query.insert_range_inclusive(from..=to); - } - "rangeFull" => { - query.insert_all(); - } - "rangeFrom" => { - query.insert_range_from(js_object_get_vec_u8(cx, item, "from")?..); - } - "rangeTo" => { - query.insert_range_to(..js_object_get_vec_u8(cx, item, "to")?); - } - "rangeToInclusive" => { - query.insert_range_to_inclusive(..=js_object_get_vec_u8(cx, item, "to")?); - } - "rangeAfter" => { - query.insert_range_after(js_object_get_vec_u8(cx, item, "after")?..); - } - "rangeAfterTo" => { - let after = js_object_get_vec_u8(cx, item, "after")?; - let to = js_object_get_vec_u8(cx, item, "to")?; - query.insert_range_after_to(after..to); - } - "rangeAfterToInclusive" => { - let after = js_object_get_vec_u8(cx, item, "after")?; - let to = js_object_get_vec_u8(cx, item, "to")?; - query.insert_range_after_to_inclusive(after..=to); - } - _ => { - cx.throw_range_error("query item type is not supported")?; - } - } - } - - let js_subquery_path = js_object.get(cx, "subqueryPath")?; - let subquery_path = js_value_to_option::(cx, js_subquery_path)? - .map(|x| js_array_of_buffers_to_vec(cx, x)) - .transpose()?; - let js_subquery = js_object.get(cx, "subquery")?; - let subquery = js_value_to_option::(cx, js_subquery)? - .map(|x| js_object_to_query(cx, x)) - .transpose()?; - let js_left_to_right = js_object.get(cx, "leftToRight")?; - let left_to_right = - js_value_to_option::(cx, js_left_to_right)?.map(|x| x.value(cx)); - - query.default_subquery_branch.subquery_path = subquery_path; - query.default_subquery_branch.subquery = subquery.map(Box::new); - query.left_to_right = left_to_right.unwrap_or(true); - - Ok(query) -} - -fn js_object_to_sized_query<'a, C: Context<'a>>( - cx: &mut C, - js_object: Handle, -) -> NeonResult { - let query: Handle = js_object.get(cx, "query")?; - let query = js_object_to_query(cx, query)?; - - let js_limit = js_object.get(cx, "limit")?; - let limit: Option = js_value_to_option::(cx, js_limit)? - .map(|x| { - u16::try_from(x.value(cx) as i64) - .or_else(|_| cx.throw_range_error("`limit` must fit in u16")) - }) - .transpose()?; - let js_offset = js_object.get(cx, "offset")?; - let offset: Option = js_value_to_option::(cx, js_offset)? - .map(|x| { - u16::try_from(x.value(cx) as i64) - .or_else(|_| cx.throw_range_error("`offset` must fit in u16")) - }) - .transpose()?; - - Ok(SizedQuery::new(query, limit, offset)) -} - -pub fn js_path_query_to_path_query<'a, C: Context<'a>>( - cx: &mut C, - js_path_query: Handle, -) -> NeonResult { - let js_path = js_path_query.get(cx, "path")?; - let path = js_array_of_buffers_to_vec(cx, js_path)?; - let js_query = js_path_query.get(cx, "query")?; - let query = js_object_to_sized_query(cx, js_query)?; - - Ok(PathQuery::new(path, query)) -} - -pub fn js_object_to_block_info<'a, C: Context<'a>>( - cx: &mut C, - js_object: Handle, -) -> NeonResult { - let js_height: Handle = js_object.get(cx, "height")?; - let js_epoch: Handle = js_object.get(cx, "epoch")?; - let js_time: Handle = js_object.get(cx, "timeMs")?; - - let epoch = Epoch::new(js_epoch.value(cx) as u16).unwrap(); - - let block_info = BlockInfo { - height: js_height.value(cx) as u64, - time_ms: js_time.value(cx) as u64, - epoch, - core_height: 1, - }; - - Ok(block_info) -} - -pub fn js_object_to_identity_public_key<'a, C: Context<'a>>( - cx: &mut C, - js_object: Handle, -) -> NeonResult { - let js_id: Handle = js_object.get(cx, "id")?; - let js_purpose: Handle = js_object.get(cx, "purpose")?; - let js_security_level: Handle = js_object.get(cx, "securityLevel")?; - let js_key_type: Handle = js_object.get(cx, "type")?; - let js_read_only: Handle = js_object.get(cx, "readOnly")?; - let js_data: Handle = js_object.get(cx, "data")?; - let js_disabled_at: Handle = js_object.get(cx, "disabledAt")?; - - let id = js_id.value(cx) as KeyID; - - let purpose = Purpose::try_from(js_purpose.value(cx) as u8) - .or_else(|_| cx.throw_range_error("`purpose` value is incorrect"))?; - - let security_level = SecurityLevel::try_from(js_security_level.value(cx) as u8) - .or_else(|_| cx.throw_range_error("`securityLevel` value is incorrect"))?; - - let key_type = KeyType::try_from(js_key_type.value(cx) as u8) - .or_else(|_| cx.throw_range_error("`keyType` value is incorrect"))?; - - let read_only = js_read_only.value(cx); - - let data = js_buffer_to_vec_u8(cx, js_data); - - let disabled_at: Option = js_value_to_option::(cx, js_disabled_at)? - .map(|x| { - u64::try_from(x.value(cx) as i64) - .or_else(|_| cx.throw_range_error("`offset` must fit in u16")) - }) - .transpose()?; - - Ok(IdentityPublicKey { - id, - purpose, - security_level, - key_type, - read_only, - data: BinaryData::new(data), - disabled_at, - }) -} - -pub fn js_array_to_keys<'a, C: Context<'a>>( - cx: &mut C, - js_array: Handle, -) -> NeonResult> { - let keys = js_array - .to_vec(cx)? - .into_iter() - .map(|js_value| { - let js_key = js_value.downcast_or_throw::(cx)?; - let key = js_object_to_identity_public_key(cx, js_key)?; - - Ok(key) - }) - .collect::>()?; - - Ok(keys) -} - -pub fn js_object_to_fee_refunds<'a, C: Context<'a>>( - cx: &mut C, - js_object: Handle, -) -> NeonResult { - let mut fee_refunds: CreditsPerEpoch = Default::default(); - - for js_epoch_index_value in js_object.get_own_property_names(cx)?.to_vec(cx)? { - let js_epoch_index = js_epoch_index_value.downcast_or_throw::(cx)?; - - let epoch_index = js_epoch_index - .value(cx) - .parse() - .or_else(|e: ParseIntError| cx.throw_error(e.to_string()))?; - - let js_credits: Handle = js_object.get(cx, js_epoch_index)?; - let credits = js_credits.value(cx) as Credits; - - fee_refunds.insert(epoch_index, credits); - } - - Ok(fee_refunds) -} diff --git a/packages/rs-drive-nodejs/src/fee/mod.rs b/packages/rs-drive-nodejs/src/fee/mod.rs deleted file mode 100644 index 2b0f5c68e78..00000000000 --- a/packages/rs-drive-nodejs/src/fee/mod.rs +++ /dev/null @@ -1,39 +0,0 @@ -use drive::fee::credits::Credits; -use drive::fee::epoch::distribution::calculate_storage_fee_refund_amount_and_leftovers; -use drive::fee::epoch::EpochIndex; -use neon::prelude::*; - -pub mod result; - -pub fn js_calculate_storage_fee_distribution_amount_and_leftovers( - mut cx: FunctionContext, -) -> JsResult { - let js_storage_fees = cx.argument::(0)?; - let storage_fees = js_storage_fees.value(&mut cx) as Credits; - - let js_start_epoch_index = cx.argument::(1)?; - - let start_epoch_index = EpochIndex::try_from(js_start_epoch_index.value(&mut cx) as i64) - .or_else(|_| cx.throw_range_error("`startEpochIndex` must fit in u16"))?; - - let js_skip_up_to_epoch_index = cx.argument::(2)?; - let current_epoch_index = EpochIndex::try_from(js_skip_up_to_epoch_index.value(&mut cx) as i64) - .or_else(|_| cx.throw_range_error("`startEpochIndex` must fit in u16"))?; - - let (amount, leftovers) = calculate_storage_fee_refund_amount_and_leftovers( - storage_fees, - start_epoch_index, - current_epoch_index, - ) - .or_else(|e| cx.throw_error(e.to_string()))?; - - let js_array = cx.empty_array(); - - let js_amount = cx.number(amount as f64); - let js_leftovers = cx.number(leftovers as f64); - - js_array.set(&mut cx, 0, js_amount)?; - js_array.set(&mut cx, 1, js_leftovers)?; - - Ok(js_array) -} diff --git a/packages/rs-drive-nodejs/src/fee/result.rs b/packages/rs-drive-nodejs/src/fee/result.rs deleted file mode 100644 index 759c8fa9756..00000000000 --- a/packages/rs-drive-nodejs/src/fee/result.rs +++ /dev/null @@ -1,167 +0,0 @@ -use crate::converter::{js_buffer_to_identifier, js_object_to_fee_refunds}; -use drive::fee::result::refunds::{CreditsPerEpochByIdentifier, FeeRefunds}; -use drive::fee::result::FeeResult; -use neon::prelude::*; -use std::ops::Deref; - -pub struct FeeResultWrapper(FeeResult); - -impl FeeResultWrapper { - pub fn new(fee_result: FeeResult) -> Self { - FeeResultWrapper(fee_result) - } - - pub fn create(mut cx: FunctionContext) -> JsResult> { - let storage_fee = cx.argument::(0)?.value(&mut cx) as u64; - let processing_fee = cx.argument::(1)?.value(&mut cx) as u64; - let js_fee_refunds = cx.argument::(2)?.to_vec(&mut cx)?; - - let mut credits_per_epoch_by_identifier = CreditsPerEpochByIdentifier::new(); - for item in js_fee_refunds { - let js_refunds = item.downcast_or_throw::(&mut cx)?; - - let js_identifier: Handle = js_refunds.get(&mut cx, "identifier")?; - let identifier = js_buffer_to_identifier(&mut cx, js_identifier)?; - - let js_credits_per_epoch: Handle = - js_refunds.get(&mut cx, "creditsPerEpoch")?; - - let credits_per_epoch = js_object_to_fee_refunds(&mut cx, js_credits_per_epoch)?; - - credits_per_epoch_by_identifier.insert(identifier, credits_per_epoch); - } - - let fee_result = FeeResult { - storage_fee, - processing_fee, - fee_refunds: FeeRefunds(credits_per_epoch_by_identifier), - ..Default::default() - }; - - Ok(cx.boxed(Self::new(fee_result))) - } - - pub fn get_storage_fee(mut cx: FunctionContext) -> JsResult { - let fee_result_self = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - // TODO: We might lose with the conversion - Ok(cx.number(fee_result_self.0.storage_fee as f64)) - } - - pub fn get_processing_fee(mut cx: FunctionContext) -> JsResult { - let fee_result_self = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - // TODO: We might lose with the conversion - Ok(cx.number(fee_result_self.0.processing_fee as f64)) - } - - pub fn add(mut cx: FunctionContext) -> JsResult> { - let fee_result_wrapper_to_add = cx.argument::>(0)?; - - let fee_result_wrapper_self = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - // TODO: Figure out how to get mutable link from JsBox - let mut fee_result_sum = fee_result_wrapper_self.deref().deref().deref().clone(); - - // TODO: To avoid clone we need to be able to pass a reference to - // FeeResult#checked_add_assign - let fee_result_to_add = fee_result_wrapper_to_add.deref().deref().deref().clone(); - - fee_result_sum - .checked_add_assign(fee_result_to_add) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.boxed(Self::new(fee_result_sum))) - } - - pub fn add_fees(mut cx: FunctionContext) -> JsResult> { - let storage_fee = cx.argument::(0)?.value(&mut cx) as u64; - let processing_fee = cx.argument::(1)?.value(&mut cx) as u64; - - let fee_result_wrapper_self = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - // TODO: Figure out how to get mutable link from JsBox - let mut fee_result_sum = fee_result_wrapper_self.deref().deref().deref().clone(); - - let fee_result_to_add = FeeResult::default_with_fees(storage_fee, processing_fee); - - fee_result_sum - .checked_add_assign(fee_result_to_add) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.boxed(Self::new(fee_result_sum))) - } - - pub fn get_refunds(mut cx: FunctionContext) -> JsResult { - let fee_result_wrapper_self = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - // Clone fee result because IntMap doesn't implement iterator for reference - let fee_result = fee_result_wrapper_self.deref().deref().deref().clone(); - - let js_fee_refunds: Handle = cx.empty_array(); - - for (index, (identifier, credits_per_epoch)) in - fee_result.fee_refunds.into_iter().enumerate() - { - let js_epoch_index_map = cx.empty_object(); - - for (epoch, credits) in credits_per_epoch { - // TODO: We could miss fees here - let js_credits = cx.number(credits as f64); - - js_epoch_index_map.set(&mut cx, epoch.to_string().as_str(), js_credits)?; - } - - let js_identity_to_epochs = cx.empty_object(); - - let js_identifier = JsBuffer::external(&mut cx, identifier); - - js_identity_to_epochs.set(&mut cx, "identifier", js_identifier)?; - js_identity_to_epochs.set(&mut cx, "creditsPerEpoch", js_epoch_index_map)?; - - js_fee_refunds.set(&mut cx, index as u32, js_identity_to_epochs)?; - } - - Ok(js_fee_refunds) - } - - pub fn get_refunds_per_epoch(mut cx: FunctionContext) -> JsResult { - let fee_result_wrapper_self = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - // Clone fee result because IntMap doesn't implement iterator for reference - let fee_result = fee_result_wrapper_self.deref().deref().deref().clone(); - - let js_credits_per_epoch = cx.empty_object(); - - for (epoch_index, epoch_credits) in fee_result.fee_refunds.sum_per_epoch() { - // TODO: We could miss fees here - let js_credits = cx.number(epoch_credits as f64); - - js_credits_per_epoch.set(&mut cx, epoch_index.to_string().as_str(), js_credits)?; - } - - Ok(js_credits_per_epoch) - } -} - -impl Finalize for FeeResultWrapper {} - -impl Deref for FeeResultWrapper { - type Target = FeeResult; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} diff --git a/packages/rs-drive-nodejs/src/lib.rs b/packages/rs-drive-nodejs/src/lib.rs deleted file mode 100644 index eeb250c775e..00000000000 --- a/packages/rs-drive-nodejs/src/lib.rs +++ /dev/null @@ -1,3682 +0,0 @@ -mod converter; -mod fee; - -use drive::drive::config::DriveConfig; -use drive_abci::config::{CoreConfig, CoreRpcConfig, PlatformConfig}; - -use std::ops::Deref; -use std::{option::Option::None, path::Path, sync::mpsc, thread}; - -use crate::converter::js_object_to_fee_refunds; -use crate::fee::result::FeeResultWrapper; - -use drive::dpp::block::epoch::Epoch; -use drive::dpp::identity::{KeyID, TimestampMillis}; -use drive::dpp::prelude::Revision; -use drive::dpp::Convertible; -use drive::drive::flags::StorageFlags; -use drive::drive::query::QuerySerializedDocumentsOutcome; -use drive::error::Error; -use drive::fee::credits::Credits; -use drive::grovedb::{PathQuery, Transaction}; -use drive::query::TransactionArg; -use drive_abci::abci::messages::{ - AfterFinalizeBlockRequest, BlockBeginRequest, BlockEndRequest, BlockFees, InitChainRequest, - Serializable, -}; -use drive_abci::platform::Platform; -use drive_abci::rpc::core::DefaultCoreRPC; -use fee::js_calculate_storage_fee_distribution_amount_and_leftovers; -use neon::prelude::*; - -type PlatformCallback = - Box FnOnce(&'a Platform, TransactionArg, &Channel) + Send>; -type UnitCallback = Box; -type ErrorCallback = Box) + Send>; -type TransactionCallback = - Box, Result<(), String>, &Channel) + Send>; - -// Messages sent on the drive channel -enum PlatformWrapperMessage { - // Callback to be executed - Callback(PlatformCallback), - // Indicates that the thread should be stopped and connection closed - Close(UnitCallback), - StartTransaction(TransactionCallback), - CommitTransaction(ErrorCallback), - RollbackTransaction(ErrorCallback), - AbortTransaction(ErrorCallback), - Flush(UnitCallback), -} - -struct PlatformWrapper { - tx: mpsc::Sender, -} - -// Internal wrapper logic. Needed to avoid issues with passing threads to -// node.js. Avoiding thread conflicts by having a dedicated thread for the -// groveDB instance and uses events to communicate with it -impl PlatformWrapper { - // Creates a new instance of `DriveWrapper` - // - // 1. Creates a connection and a channel - // 2. Spawns a thread and moves the channel receiver and connection to it - // 3. On a separate thread, read closures off the channel and execute with - // access to the connection. - fn new(cx: &mut FunctionContext) -> NeonResult { - // Drive's configuration - let path_string = cx.argument::(0)?.value(cx); - let platform_config = cx.argument::(1)?; - - let drive_config: Handle = platform_config.get(cx, "drive")?; - let core_config: Handle = platform_config.get(cx, "core")?; - let core_rpc_config: Handle = core_config.get(cx, "rpc")?; - - let js_core_rpc_url: Handle = core_rpc_config.get(cx, "url")?; - let js_core_rpc_username: Handle = core_rpc_config.get(cx, "username")?; - let js_core_rpc_password: Handle = core_rpc_config.get(cx, "password")?; - - let core_rpc_url = js_core_rpc_url.value(cx); - let core_rpc_username = js_core_rpc_username.value(cx); - let core_rpc_password = js_core_rpc_password.value(cx); - - let js_data_contracts_cache_size: Handle = - drive_config.get(cx, "dataContractsGlobalCacheSize")?; - let data_contracts_global_cache_size = - u64::try_from(js_data_contracts_cache_size.value(cx) as i64).or_else(|_| { - cx.throw_range_error("`dataContractsGlobalCacheSize` must fit in u64") - })?; - - let js_data_contracts_transactional_cache_size: Handle = - drive_config.get(cx, "dataContractsBlockCacheSize")?; - let data_contracts_block_cache_size = u64::try_from( - js_data_contracts_transactional_cache_size.value(cx) as i64, - ) - .or_else(|_| cx.throw_range_error("`dataContractsBlockCacheSize` must fit in u64"))?; - - // Channel for sending callbacks to execute on the Drive connection thread - let (tx, rx) = mpsc::channel::(); - - // Create an `Channel` for calling back to JavaScript. It is more efficient - // to create a single channel and re-use it for all database callbacks. - // The JavaScript process will not exit as long as this channel has not been - // dropped. - let channel = cx.channel(); - - let sender = tx.clone(); - - // Spawn a thread for processing database queries - // This will not block the JavaScript main thread and will continue executing - // concurrently. - thread::spawn(move || { - let path = Path::new(&path_string); - // Open a connection to groveDb, this will be moved to a separate thread - - let drive_config = DriveConfig { - data_contracts_global_cache_size, - data_contracts_block_cache_size, - ..Default::default() - }; - //core_addr: Vec<&str> - let core_addr: Vec<&str> = core_rpc_url.split(':').collect(); - let core_host = core_addr.first().expect("missing core address"); - let core_port = core_addr - .get(1) - .expect("missing port number in core address"); - let core_config = CoreConfig { - rpc: CoreRpcConfig { - host: core_host.to_string(), - port: core_port.to_string(), - - username: core_rpc_username, - password: core_rpc_password, - }, - ..Default::default() - }; - - let platform_config = PlatformConfig { - drive: Some(drive_config), - core: core_config, - verify_sum_trees: true, - ..Default::default() - }; - - // TODO: think how to pass this error to JS - let mut platform: Platform = - Platform::::open(path, Some(platform_config)).unwrap(); - - // if cfg!(feature = "enable-mocking") { - // platform.mock_core_rpc_client(); - // } - - let mut maybe_transaction: Option = None; - - // Blocks until a callback is available - // When the instance of `Database` is dropped, the channel will be closed - // and `rx.recv()` will return an `Err`, ending the loop and terminating - // the thread. - while let Ok(message) = rx.recv() { - match message { - PlatformWrapperMessage::Callback(callback) => { - // The connection and channel are owned by the thread, but _lent_ to - // the callback. The callback has exclusive access to the connection - // for the duration of the callback. - callback(&platform, maybe_transaction.as_ref(), &channel); - } - // Immediately close the connection, even if there are pending messages - PlatformWrapperMessage::Close(callback) => { - drop(maybe_transaction); - drop(platform); - - callback(&channel); - break; - } - // Flush message - PlatformWrapperMessage::Flush(callback) => { - platform.drive.grove.flush().unwrap(); - callback(&channel); - } - PlatformWrapperMessage::StartTransaction(callback) => { - let result = if maybe_transaction.is_some() { - Err("transaction is already started".to_string()) - } else { - let transaction = platform.drive.grove.start_transaction(); - - maybe_transaction = Some(transaction); - - Ok(()) - }; - - callback(sender.clone(), result, &channel); - } - PlatformWrapperMessage::CommitTransaction(callback) => { - let result = if maybe_transaction.is_some() { - let mut drive_cache = platform.drive.cache.write().unwrap(); - - drive_cache.cached_contracts.merge_block_cache(); - - drive_cache.cached_contracts.clear_block_cache(); - - platform - .drive - .commit_transaction(maybe_transaction.take().unwrap()) - .map_err(|err| err.to_string()) - } else { - Err("transaction is not started".to_string()) - }; - - callback(&channel, result); - } - PlatformWrapperMessage::RollbackTransaction(callback) => { - let result = if let Some(transaction) = &maybe_transaction { - let mut drive_cache = platform.drive.cache.write().unwrap(); - - drive_cache.cached_contracts.clear_block_cache(); - - platform - .drive - .rollback_transaction(transaction) - .map_err(|err| err.to_string()) - } else { - Err("transaction is not started".to_string()) - }; - - callback(&channel, result); - } - PlatformWrapperMessage::AbortTransaction(callback) => { - let result = if maybe_transaction.is_some() { - let mut drive_cache = platform.drive.cache.write().unwrap(); - - drive_cache.cached_contracts.clear_block_cache(); - - drop(maybe_transaction.take()); - - Ok(()) - } else { - Err("transaction is not started".to_string()) - }; - - callback(&channel, result); - } - } - } - }); - - Ok(Self { tx }) - } - - // Idiomatic rust would take an owned `self` to prevent use after close - // However, it's not possible to prevent JavaScript from continuing to hold a - // closed database - fn close( - &self, - callback: impl FnOnce(&Channel) + Send + 'static, - ) -> Result<(), mpsc::SendError> { - self.tx - .send(PlatformWrapperMessage::Close(Box::new(callback))) - } - - fn send_to_drive_thread( - &self, - callback: impl for<'a> FnOnce(&'a Platform, TransactionArg, &Channel) - + Send - + 'static, - ) -> Result<(), mpsc::SendError> { - self.tx - .send(PlatformWrapperMessage::Callback(Box::new(callback))) - } - - fn start_transaction( - &self, - callback: impl FnOnce(mpsc::Sender, Result<(), String>, &Channel) - + Send - + 'static, - ) -> Result<(), mpsc::SendError> { - self.tx - .send(PlatformWrapperMessage::StartTransaction(Box::new(callback))) - } - - fn commit_transaction( - &self, - callback: impl FnOnce(&Channel, Result<(), String>) + Send + 'static, - ) -> Result<(), mpsc::SendError> { - self.tx - .send(PlatformWrapperMessage::CommitTransaction(Box::new( - callback, - ))) - } - - fn rollback_transaction( - &self, - callback: impl FnOnce(&Channel, Result<(), String>) + Send + 'static, - ) -> Result<(), mpsc::SendError> { - self.tx - .send(PlatformWrapperMessage::RollbackTransaction(Box::new( - callback, - ))) - } - - fn abort_transaction( - &self, - callback: impl FnOnce(&Channel, Result<(), String>) + Send + 'static, - ) -> Result<(), mpsc::SendError> { - self.tx - .send(PlatformWrapperMessage::AbortTransaction(Box::new(callback))) - } - - // Idiomatic rust would take an owned `self` to prevent use after close - // However, it's not possible to prevent JavaScript from continuing to hold a - // closed database - fn flush( - &self, - callback: impl FnOnce(&Channel) + Send + 'static, - ) -> Result<(), mpsc::SendError> { - self.tx - .send(PlatformWrapperMessage::Flush(Box::new(callback))) - } -} - -// Ensures that DriveWrapper is properly disposed when the corresponding JS -// object gets garbage collected -impl Finalize for PlatformWrapper {} - -// External wrapper logic -impl PlatformWrapper { - // Create a new instance of `Drive` and place it inside a `JsBox` - // JavaScript can hold a reference to a `JsBox`, but the contents are opaque - fn js_open(mut cx: FunctionContext) -> JsResult> { - let drive_wrapper = - PlatformWrapper::new(&mut cx).or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.boxed(drive_wrapper)) - } - - /// Sends a message to the DB thread to stop the thread and dispose the - /// groveDb instance owned by it, then calls js callback passed as a first - /// argument to the function - fn js_close(mut cx: FunctionContext) -> JsResult { - let js_callback = cx.argument::(0)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - drive - .close(|channel| { - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = - vec![task_context.null().upcast()]; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_create_initial_state_structure(mut cx: FunctionContext) -> JsResult { - let js_using_transaction = cx.argument::(0)?; - let js_callback = cx.argument::(1)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let execution_result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .create_initial_state_structure(transaction_arg) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match execution_result { - Ok(_) => vec![task_context.null().upcast()], - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_fetch_contract(mut cx: FunctionContext) -> JsResult { - let js_contract_id = cx.argument::(0)?; - let js_maybe_epoch_index = cx.argument::(1)?; - let js_using_transaction = cx.argument::(2)?; - let js_callback = cx.argument::(3)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let contract_id = converter::js_buffer_to_identifier(&mut cx, js_contract_id)?; - - let maybe_epoch: Option = if !js_maybe_epoch_index.is_a::(&mut cx) { - let js_epoch_index = js_maybe_epoch_index.downcast_or_throw::(&mut cx)?; - - let epoch_index = u16::try_from(js_epoch_index.value(&mut cx) as i64) - .or_else(|_| cx.throw_range_error("`epochs` must fit in u16"))?; - - let epoch = Epoch::new(epoch_index).unwrap(); - - Some(epoch) - } else { - None - }; - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .get_contract_with_fetch_info( - contract_id, - maybe_epoch.as_ref(), - true, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok((maybe_fee_result, maybe_contract_fetch_info)) => { - let js_result = task_context.empty_array(); - - let js_contract: Handle = - if let Some(contract_fetch_info) = maybe_contract_fetch_info { - let contract_cbor = contract_fetch_info - .contract - .to_buffer() - .or_else(|_| { - task_context - .throw_range_error("can't serialize contract") - })?; - - JsBuffer::external(&mut task_context, contract_cbor) - .upcast() - } else { - task_context.null().upcast() - }; - - js_result.set(&mut task_context, 0, js_contract)?; - - if let Some(fee_result) = maybe_fee_result { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - js_result.set(&mut task_context, 1, js_fee_result)?; - } - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_create_contract(mut cx: FunctionContext) -> JsResult { - let js_contract_cbor = cx.argument::(0)?; - let js_block_info = cx.argument::(1)?; - let js_apply = cx.argument::(2)?; - let js_using_transaction = cx.argument::(3)?; - let js_callback = cx.argument::(4)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let contract_cbor = converter::js_buffer_to_vec_u8(&mut cx, js_contract_cbor); - let apply = js_apply.value(&mut cx); - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .insert_contract_cbor( - contract_cbor, - None, - block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_update_contract(mut cx: FunctionContext) -> JsResult { - let js_contract_cbor = cx.argument::(0)?; - let js_block_info = cx.argument::(1)?; - let js_apply = cx.argument::(2)?; - let js_using_transaction = cx.argument::(3)?; - let js_callback = cx.argument::(4)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let contract_cbor = converter::js_buffer_to_vec_u8(&mut cx, js_contract_cbor); - let apply = js_apply.value(&mut cx); - - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .update_contract_cbor( - contract_cbor, - None, - block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_create_document(mut cx: FunctionContext) -> JsResult { - let js_document_cbor = cx.argument::(0)?; - let js_contract_id = cx.argument::(1)?; - let js_document_type_name = cx.argument::(2)?; - let js_owner_id = cx.argument::(3)?; - let js_override_document = cx.argument::(4)?; - let js_block_info = cx.argument::(5)?; - let js_apply = cx.argument::(6)?; - let js_using_transaction = cx.argument::(7)?; - let js_callback = cx.argument::(8)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let document_cbor = converter::js_buffer_to_vec_u8(&mut cx, js_document_cbor); - let contract_id = converter::js_buffer_to_identifier(&mut cx, js_contract_id)?; - let document_type_name = js_document_type_name.value(&mut cx); - let owner_id = converter::js_buffer_to_identifier(&mut cx, js_owner_id)?; - let override_document = js_override_document.value(&mut cx); - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let apply = js_apply.value(&mut cx); - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let storage_flags = - StorageFlags::new_single_epoch(block_info.epoch.index, Some(owner_id)); - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .add_serialized_document_for_contract_id( - &document_cbor, - contract_id, - &document_type_name, - Some(owner_id), - override_document, - block_info, - apply, - storage_flags.into_optional_cow(), - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_update_document(mut cx: FunctionContext) -> JsResult { - let js_document_cbor = cx.argument::(0)?; - let js_contract_id = cx.argument::(1)?; - let js_document_type_name = cx.argument::(2)?; - let js_owner_id = cx.argument::(3)?; - let js_block_info = cx.argument::(4)?; - let js_apply = cx.argument::(5)?; - let js_using_transaction = cx.argument::(6)?; - let js_callback = cx.argument::(7)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let document_cbor = converter::js_buffer_to_vec_u8(&mut cx, js_document_cbor); - let contract_id = converter::js_buffer_to_identifier(&mut cx, js_contract_id)?; - let document_type_name = js_document_type_name.value(&mut cx); - let owner_id = converter::js_buffer_to_identifier(&mut cx, js_owner_id)?; - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let apply = js_apply.value(&mut cx); - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let storage_flags = - StorageFlags::new_single_epoch(block_info.epoch.index, Some(owner_id)); - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .update_document_for_contract_id( - &document_cbor, - contract_id, - &document_type_name, - Some(owner_id), - block_info, - apply, - storage_flags.into_optional_cow(), - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_delete_document(mut cx: FunctionContext) -> JsResult { - let js_document_id = cx.argument::(0)?; - let js_contract_id = cx.argument::(1)?; - let js_document_type_name = cx.argument::(2)?; - let js_block_info = cx.argument::(3)?; - let js_apply = cx.argument::(4)?; - let js_using_transaction = cx.argument::(5)?; - let js_callback = cx.argument::(6)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let document_id = converter::js_buffer_to_identifier(&mut cx, js_document_id)?; - let contract_id = converter::js_buffer_to_identifier(&mut cx, js_contract_id)?; - let document_type_name = js_document_type_name.value(&mut cx); - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let apply = js_apply.value(&mut cx); - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .delete_document_for_contract_id( - document_id, - contract_id, - &document_type_name, - None, - block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_insert_identity_cbor(mut cx: FunctionContext) -> JsResult { - let js_identity_cbor = cx.argument::(0)?; - let js_block_info = cx.argument::(1)?; - let js_apply = cx.argument::(2)?; - let js_using_transaction = cx.argument::(3)?; - let js_callback = cx.argument::(4)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_cbor = converter::js_buffer_to_vec_u8(&mut cx, js_identity_cbor); - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let apply = js_apply.value(&mut cx); - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .add_new_identity_from_cbor_encoded_bytes( - identity_cbor, - &block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_fetch_identity(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_using_transaction = cx.argument::(1)?; - let js_callback = cx.argument::(2)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .fetch_full_identity(identity_id, transaction_arg) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(maybe_identity) => { - if let Some(identity) = maybe_identity { - match identity.to_buffer() { - Ok(serialized_identity) => { - let js_serialized_identity = JsBuffer::external( - &mut task_context, - serialized_identity, - ); - - vec![ - task_context.null().upcast(), - js_serialized_identity.upcast(), - ] - } - Err(e) => { - let err_message = - format!("can't serialise identities: {}", e); - - vec![task_context.error(err_message)?.upcast()] - } - } - } else { - vec![task_context.null().upcast(), task_context.null().upcast()] - } - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_fetch_identity_balance(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_using_transaction = cx.argument::(1)?; - let js_callback = cx.argument::(2)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .fetch_identity_balance(identity_id, transaction_arg) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(maybe_balance) => { - if let Some(credits) = maybe_balance { - let value = JsNumber::new(&mut task_context, credits as f64); - vec![task_context.null().upcast(), value.upcast()] - } else { - vec![task_context.null().upcast(), task_context.null().upcast()] - } - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_fetch_identity_balance_include_debt_with_costs( - mut cx: FunctionContext, - ) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_block_info = cx.argument::(1)?; - let js_apply = cx.argument::(2)?; - let js_using_transaction = cx.argument::(3)?; - let js_callback = cx.argument::(4)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - - let apply = js_apply.value(&mut cx); - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .fetch_identity_balance_include_debt_with_costs( - identity_id, - &block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok((maybe_balance, fee_result)) => { - let js_result = task_context.empty_array(); - - let js_balance: Handle = if let Some(credits) = - maybe_balance - { - let value = JsNumber::new(&mut task_context, credits as f64); - value.upcast() - } else { - task_context.null().upcast() - }; - - js_result.set(&mut task_context, 0, js_balance)?; - - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - js_result.set(&mut task_context, 1, js_fee_result)?; - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_fetch_identity_balance_with_costs(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_block_info = cx.argument::(1)?; - let js_apply = cx.argument::(2)?; - let js_using_transaction = cx.argument::(3)?; - let js_callback = cx.argument::(4)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - - let apply = js_apply.value(&mut cx); - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .fetch_identity_balance_with_costs( - identity_id, - &block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok((maybe_balance, fee_result)) => { - let js_result = task_context.empty_array(); - - let js_balance: Handle = if let Some(credits) = - maybe_balance - { - let value = JsNumber::new(&mut task_context, credits as f64); - value.upcast() - } else { - task_context.null().upcast() - }; - - js_result.set(&mut task_context, 0, js_balance)?; - - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - js_result.set(&mut task_context, 1, js_fee_result)?; - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_fetch_proved_identity(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_using_transaction = cx.argument::(1)?; - let js_callback = cx.argument::(2)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .prove_full_identity(identity_id, transaction_arg) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(identity_proof) => { - let js_identity_proof = - JsBuffer::external(&mut task_context, identity_proof); - - vec![task_context.null().upcast(), js_identity_proof.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_fetch_many_proved_identities(mut cx: FunctionContext) -> JsResult { - let js_identity_ids = cx.argument::(0)?; - let js_using_transaction = cx.argument::(1)?; - let js_callback = cx.argument::(2)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_ids = converter::js_array_of_buffers_to_identifiers(&mut cx, js_identity_ids)?; - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .proved_full_identities(&identity_ids, transaction_arg) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(identities_proof) => { - let js_identities_proof = - JsBuffer::external(&mut task_context, identities_proof); - - vec![task_context.null().upcast(), js_identities_proof.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_fetch_identities_by_public_key_hashes(mut cx: FunctionContext) -> JsResult { - let js_public_key_hashes = cx.argument::(0)?; - let js_using_transaction = cx.argument::(1)?; - let js_callback = cx.argument::(2)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let public_key_hashes: Vec<[u8; 20]> = - converter::js_array_of_buffers_to_vec(&mut cx, js_public_key_hashes)? - .into_iter() - .map(|hash| { - hash.try_into() - .or_else(|_| cx.throw_error("invalid hash size")) - }) - .collect::>()?; - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result: Result>>, String> = - transaction_result.and_then(|transaction_arg| { - platform - .drive - .fetch_full_identities_by_unique_public_key_hashes( - &public_key_hashes, - transaction_arg, - ) - .map_err(|err| err.to_string()) - .and_then(|hashes_to_identities| { - hashes_to_identities - .into_values() - .filter(|identity| identity.is_some()) - .map(|identity| identity.map(|i| i.to_buffer()).transpose()) - .collect::>() - .map_err(|err| err.to_string()) - }) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(hashes_to_identities) => { - let js_array = task_context.empty_array(); - - hashes_to_identities.into_iter().enumerate().try_for_each( - |(i, identity_bytes)| { - let value: Handle = if let Some(bytes) = - identity_bytes - { - JsBuffer::external(&mut task_context, bytes).upcast() - } else { - task_context.null().upcast() - }; - - js_array.set(&mut task_context, i as u32, value).map(|_| ()) - }, - )?; - - vec![task_context.null().upcast(), js_array.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_prove_identities_by_public_key_hashes(mut cx: FunctionContext) -> JsResult { - let js_public_key_hashes = cx.argument::(0)?; - let js_using_transaction = cx.argument::(1)?; - let js_callback = cx.argument::(2)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let public_key_hashes: Vec<[u8; 20]> = - converter::js_array_of_buffers_to_vec(&mut cx, js_public_key_hashes)? - .into_iter() - .map(|hash| { - hash.try_into() - .or_else(|_| cx.throw_error("invalid hash size")) - }) - .collect::>()?; - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result: Result, String> = - transaction_result.and_then(|transaction_arg| { - platform - .drive - .prove_full_identities_by_unique_public_key_hashes( - &public_key_hashes, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(proof) => { - let js_proof = JsBuffer::external(&mut task_context, proof); - - vec![task_context.null().upcast(), js_proof.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_fetch_identity_with_costs(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_epoch_index = cx.argument::(1)?; - let js_using_transaction = cx.argument::(2)?; - let js_callback = cx.argument::(3)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - - let epoch_index = u16::try_from(js_epoch_index.value(&mut cx) as i64) - .or_else(|_| cx.throw_range_error("`epochs` must fit in u16"))?; - - let epoch = Epoch::new(epoch_index).unwrap(); - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .fetch_full_identity_with_costs(identity_id, &epoch, transaction_arg) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok((maybe_identity, fee_result)) => { - let js_result = task_context.empty_array(); - - let js_identity: Handle = - if let Some(identity) = maybe_identity { - let serialized_identity = - identity.to_buffer().or_else(|e| { - task_context.throw_error(format!( - "can't serialize identity: {}", - e - )) - })?; - - JsBuffer::external(&mut task_context, serialized_identity) - .upcast() - } else { - task_context.null().upcast() - }; - - js_result.set(&mut task_context, 0, js_identity)?; - - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - js_result.set(&mut task_context, 1, js_fee_result)?; - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_add_to_identity_balance(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_balance_to_add = cx.argument::(1)?; - let js_block_info = cx.argument::(2)?; - let js_apply = cx.argument::(3)?; - let js_using_transaction = cx.argument::(4)?; - let js_callback = cx.argument::(5)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - let balance_to_add = js_balance_to_add.value(&mut cx) as u64; - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let apply = js_apply.value(&mut cx); - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .add_to_identity_balance( - identity_id, - balance_to_add, - &block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_remove_from_identity_balance(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_amount = cx.argument::(1)?; - let js_block_info = cx.argument::(2)?; - let js_apply = cx.argument::(3)?; - let js_using_transaction = cx.argument::(4)?; - let js_callback = cx.argument::(5)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - let amount = js_amount.value(&mut cx) as u64; - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let apply = js_apply.value(&mut cx); - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .remove_from_identity_balance( - identity_id, - amount, - &block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_apply_fees_to_identity_balance(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_fee_result = cx.argument::>(1)?; - let js_using_transaction = cx.argument::(2)?; - let js_callback = cx.argument::(3)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - - let fee_result = js_fee_result.deref().deref().deref().clone(); - let balance_change = fee_result.into_balance_change(identity_id); - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .apply_balance_change_from_fee_to_identity( - balance_change, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(outcome) => { - let js_fee_result = task_context - .boxed(FeeResultWrapper::new(outcome.actual_fee_paid)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_add_to_system_credits(mut cx: FunctionContext) -> JsResult { - let js_amount = cx.argument::(0)?; - let js_using_transaction = cx.argument::(1)?; - let js_callback = cx.argument::(2)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let amount = js_amount.value(&mut cx) as Credits; - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .add_to_system_credits(amount, transaction_arg) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(()) => { - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_add_keys_to_identity(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_keys_to_add = cx.argument::(1)?; - let js_block_info = cx.argument::(2)?; - let js_apply = cx.argument::(3)?; - let js_using_transaction = cx.argument::(4)?; - let js_callback = cx.argument::(5)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - let keys_to_add = converter::js_array_to_keys(&mut cx, js_keys_to_add)?; - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let apply = js_apply.value(&mut cx); - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .add_new_keys_to_identity( - identity_id, - keys_to_add, - &block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_disable_identity_keys(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_key_ids = cx.argument::(1)?; - let js_disable_at = cx.argument::(2)?; - let js_block_info = cx.argument::(3)?; - let js_apply = cx.argument::(4)?; - let js_using_transaction = cx.argument::(5)?; - let js_callback = cx.argument::(6)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - - let key_ids = js_key_ids - .to_vec(&mut cx)? - .into_iter() - .map(|js_value| { - let js_key = js_value.downcast_or_throw::(&mut cx)?; - let key = KeyID::try_from(js_key.value(&mut cx) as u64) - .or_else(|_| cx.throw_range_error("key id must be u32"))?; - - Ok(key) - }) - .collect::, _>>()?; - - let disabled_at = js_disable_at.value(&mut cx) as TimestampMillis; - - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let apply = js_apply.value(&mut cx); - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .disable_identity_keys( - identity_id, - key_ids, - disabled_at, - &block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_update_identity_revision(mut cx: FunctionContext) -> JsResult { - let js_identity_id = cx.argument::(0)?; - let js_revision = cx.argument::(1)?; - let js_block_info = cx.argument::(2)?; - let js_apply = cx.argument::(3)?; - let js_using_transaction = cx.argument::(4)?; - let js_callback = cx.argument::(5)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let identity_id = converter::js_buffer_to_identifier(&mut cx, js_identity_id)?; - - let revision = js_revision.value(&mut cx) as Revision; - - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let apply = js_apply.value(&mut cx); - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .update_identity_revision( - identity_id, - revision, - &block_info, - apply, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(fee_result) => { - let js_fee_result = - task_context.boxed(FeeResultWrapper::new(fee_result)); - - // First parameter of JS callbacks is error, which is null in this case - vec![task_context.null().upcast(), js_fee_result.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_query_documents(mut cx: FunctionContext) -> JsResult { - let js_query_cbor = cx.argument::(0)?; - let js_contract_id = cx.argument::(1)?; - let js_document_type_name = cx.argument::(2)?; - let js_maybe_epoch_index = cx.argument::(3)?; - // TODO We need dry run for validation - let js_using_transaction = cx.argument::(4)?; - let js_callback = cx.argument::(5)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let query_cbor = converter::js_buffer_to_vec_u8(&mut cx, js_query_cbor); - let contract_id = converter::js_buffer_to_identifier(&mut cx, js_contract_id)?; - let document_type_name = js_document_type_name.value(&mut cx); - - let maybe_epoch: Option = if !js_maybe_epoch_index.is_a::(&mut cx) { - let js_epoch_index = js_maybe_epoch_index.downcast_or_throw::(&mut cx)?; - - let epoch_index = u16::try_from(js_epoch_index.value(&mut cx) as i64) - .or_else(|_| cx.throw_range_error("`epochs` must fit in u16"))?; - - let epoch = Epoch::new(epoch_index).unwrap(); - - Some(epoch) - } else { - None - }; - - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .query_documents_cbor_with_document_type_lookup( - &query_cbor, - contract_id, - document_type_name.as_str(), - maybe_epoch.as_ref(), - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(QuerySerializedDocumentsOutcome { - items, - skipped, - cost, - }) => { - let js_array: Handle = task_context.empty_array(); - let js_vecs = - converter::nested_vecs_to_js(&mut task_context, items)?; - let js_num = task_context.number(skipped).upcast::(); - let js_cost = task_context.number(cost as f64).upcast::(); - - js_array.set(&mut task_context, 0, js_vecs)?; - js_array.set(&mut task_context, 1, js_num)?; - js_array.set(&mut task_context, 2, js_cost)?; - - vec![task_context.null().upcast(), js_array.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_prove_documents_query(mut cx: FunctionContext) -> JsResult { - let js_query_cbor = cx.argument::(0)?; - let js_contract_id = cx.argument::(1)?; - let js_document_type_name = cx.argument::(2)?; - let js_using_transaction = cx.argument::(3)?; - - let js_callback = cx.argument::(4)?.root(&mut cx); - - let drive = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let query_cbor = converter::js_buffer_to_vec_u8(&mut cx, js_query_cbor); - let contract_id = converter::js_buffer_to_identifier(&mut cx, js_contract_id)?; - let document_type_name = js_document_type_name.value(&mut cx); - let using_transaction = js_using_transaction.value(&mut cx); - - drive - .send_to_drive_thread(move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - platform - .drive - .query_proof_of_documents_using_contract_id_using_cbor_encoded_query_with_cost( - &query_cbor, - contract_id, - document_type_name.as_str(), - None, - None, - transaction_arg, - ) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok((proof, processing_cost)) => { - let js_array: Handle = task_context.empty_array(); - let js_buffer = JsBuffer::external(&mut task_context, proof); - let js_processing_cost = task_context.number(processing_cost as f64); - - js_array.set(&mut task_context, 0, js_buffer)?; - js_array.set(&mut task_context, 1, js_processing_cost)?; - - vec![task_context.null().upcast(), js_array.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_grove_db_start_transaction(mut cx: FunctionContext) -> JsResult { - let js_callback = cx.argument::(0)?.root(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.start_transaction(|_, result, channel| { - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(_) => { - vec![task_context.null().upcast()] - } - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_grove_db_commit_transaction(mut cx: FunctionContext) -> JsResult { - let js_callback = cx.argument::(0)?.root(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.commit_transaction(|channel, result| { - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(_) => vec![task_context.null().upcast()], - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_grove_db_rollback_transaction(mut cx: FunctionContext) -> JsResult { - let js_callback = cx.argument::(0)?.root(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.rollback_transaction(|channel, result| { - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(_) => vec![task_context.null().upcast()], - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_grove_db_abort_transaction(mut cx: FunctionContext) -> JsResult { - let js_callback = cx.argument::(0)?.root(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.abort_transaction(|channel, result| { - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(_) => vec![task_context.null().upcast()], - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_grove_db_is_transaction_started(mut cx: FunctionContext) -> JsResult { - let js_callback = cx.argument::(0)?.root(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |_platform: &Platform, transaction, channel| { - let result = transaction.is_some(); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - // First parameter of JS callbacks is error, which is null in this case - let callback_arguments: Vec> = vec![ - task_context.null().upcast(), - task_context.boolean(result).upcast(), - ]; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_grove_db_get(mut cx: FunctionContext) -> JsResult { - let js_path = cx.argument::(0)?; - let js_key = cx.argument::(1)?; - let js_using_transaction = cx.argument::(2)?; - - let js_callback = cx.argument::(3)?.root(&mut cx); - - let path = converter::js_array_of_buffers_to_vec(&mut cx, js_path)?; - let key = converter::js_buffer_to_vec_u8(&mut cx, js_key); - - let using_transaction = js_using_transaction.value(&mut cx); - - // Get the `this` value as a `JsBox` - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let grove_db = &platform.drive.grove; - let path_slice = path.iter().map(|fragment| fragment.as_slice()); - let result = transaction_result.and_then(|transaction_arg| { - grove_db - .get(path_slice, &key, transaction_arg) - .unwrap() - .map_err(Error::GroveDB) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(element) => { - // First parameter of JS callbacks is error, which is null in this case - vec![ - task_context.null().upcast(), - converter::element_to_js_object(&mut task_context, element)?, - ] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - // The result is returned through the callback, not through direct return - Ok(cx.undefined()) - } - - fn js_grove_db_insert(mut cx: FunctionContext) -> JsResult { - let js_path = cx.argument::(0)?; - let js_key = cx.argument::(1)?; - let js_element = cx.argument::(2)?; - let js_using_transaction = cx.argument::(3)?; - - let js_callback = cx.argument::(4)?.root(&mut cx); - - let path = converter::js_array_of_buffers_to_vec(&mut cx, js_path)?; - let key = converter::js_buffer_to_vec_u8(&mut cx, js_key); - let element = converter::js_object_to_element(&mut cx, js_element)?; - - let using_transaction = js_using_transaction.value(&mut cx); - - // Get the `this` value as a `JsBox` - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let grove_db = &platform.drive.grove; - let path_slice = path.iter().map(|fragment| fragment.as_slice()); - let result = transaction_result.and_then(|transaction_arg| { - grove_db - .insert(path_slice, &key, element, None, transaction_arg) - .unwrap() - .map_err(Error::GroveDB) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(_) => vec![task_context.null().upcast()], - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_grove_db_insert_if_not_exists(mut cx: FunctionContext) -> JsResult { - let js_path = cx.argument::(0)?; - let js_key = cx.argument::(1)?; - let js_element = cx.argument::(2)?; - let js_using_transaction = cx.argument::(3)?; - - let js_callback = cx.argument::(4)?.root(&mut cx); - - let path = converter::js_array_of_buffers_to_vec(&mut cx, js_path)?; - let key = converter::js_buffer_to_vec_u8(&mut cx, js_key); - let element = converter::js_object_to_element(&mut cx, js_element)?; - - let using_transaction = js_using_transaction.value(&mut cx); - - // Get the `this` value as a `JsBox` - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let grove_db = &platform.drive.grove; - - let path_slice: Vec<&[u8]> = - path.iter().map(|fragment| fragment.as_slice()).collect(); - let result = transaction_result.and_then(|transaction_arg| { - grove_db - .insert_if_not_exists(path_slice, key.as_slice(), element, transaction_arg) - .unwrap() - .map_err(Error::GroveDB) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(is_inserted) => vec![ - task_context.null().upcast(), - task_context - .boolean(is_inserted) - .as_value(&mut task_context), - ], - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - fn js_grove_db_put_aux(mut cx: FunctionContext) -> JsResult { - let js_key = cx.argument::(0)?; - let js_value = cx.argument::(1)?; - let js_using_transaction = cx.argument::(2)?; - - let js_callback = cx.argument::(3)?.root(&mut cx); - - let key = converter::js_buffer_to_vec_u8(&mut cx, js_key); - let value = converter::js_buffer_to_vec_u8(&mut cx, js_value); - - let using_transaction = js_using_transaction.value(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let grove_db = &platform.drive.grove; - - let result = transaction_result.and_then(|transaction_arg| { - grove_db - .put_aux(&key, &value, None, transaction_arg) - .unwrap() - .map_err(Error::GroveDB) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(()) => { - vec![task_context.null().upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - // The result is returned through the callback, not through direct return - Ok(cx.undefined()) - } - - fn js_grove_db_delete_aux(mut cx: FunctionContext) -> JsResult { - let js_key = cx.argument::(0)?; - let js_using_transaction = cx.argument::(1)?; - - let js_callback = cx.argument::(2)?.root(&mut cx); - - let key = converter::js_buffer_to_vec_u8(&mut cx, js_key); - - let using_transaction = js_using_transaction.value(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let grove_db = &platform.drive.grove; - - let result = transaction_result.and_then(|transaction_arg| { - grove_db - .delete_aux(&key, None, transaction_arg) - .unwrap() - .map_err(Error::GroveDB) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(()) => { - vec![task_context.null().upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - // The result is returned through the callback, not through direct return - Ok(cx.undefined()) - } - - fn js_grove_db_get_aux(mut cx: FunctionContext) -> JsResult { - let js_key = cx.argument::(0)?; - let js_using_transaction = cx.argument::(1)?; - - let js_callback = cx.argument::(2)?.root(&mut cx); - - let key = converter::js_buffer_to_vec_u8(&mut cx, js_key); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - let using_transaction = js_using_transaction.value(&mut cx); - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let grove_db = &platform.drive.grove; - - let result = transaction_result.and_then(|transaction_arg| { - grove_db - .get_aux(&key, transaction_arg) - .unwrap() - .map_err(Error::GroveDB) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(value) => { - if let Some(value) = value { - vec![ - task_context.null().upcast(), - JsBuffer::external(&mut task_context, value).upcast(), - ] - } else { - vec![task_context.null().upcast(), task_context.null().upcast()] - } - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - // The result is returned through the callback, not through direct return - Ok(cx.undefined()) - } - - fn js_grove_db_query(mut cx: FunctionContext) -> JsResult { - let js_path_query = cx.argument::(0)?; - let js_skip_cache = cx.argument::(1)?; - let js_using_transaction = cx.argument::(2)?; - - let js_callback = cx.argument::(3)?.root(&mut cx); - - let path_query = converter::js_path_query_to_path_query(&mut cx, js_path_query)?; - - let skip_cache = js_skip_cache.value(&mut cx); - - let using_transaction = js_using_transaction.value(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let grove_db = &platform.drive.grove; - - let result = transaction_result.and_then(|transaction_arg| { - grove_db - .query_item_value(&path_query, !skip_cache, transaction_arg) - .unwrap() - .map_err(Error::GroveDB) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok((values, skipped)) => { - let js_array: Handle = task_context.empty_array(); - let js_vecs = converter::nested_vecs_to_js(&mut task_context, values)?; - let js_num = task_context.number(skipped).upcast::(); - - js_array.set(&mut task_context, 0, js_vecs)?; - js_array.set(&mut task_context, 1, js_num)?; - - vec![task_context.null().upcast(), js_array.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - // The result is returned through the callback, not through direct return - Ok(cx.undefined()) - } - - fn js_grove_db_prove_query(mut cx: FunctionContext) -> JsResult { - let js_path_query = cx.argument::(0)?; - let js_get_verbose_proof = cx.argument::(1)?; - let js_using_transaction = cx.argument::(2)?; - - let js_callback = cx.argument::(3)?.root(&mut cx); - - let path_query = converter::js_path_query_to_path_query(&mut cx, js_path_query)?; - - let get_verbose_proof = js_get_verbose_proof.value(&mut cx); - - let using_transaction = js_using_transaction.value(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let grove_db = &platform.drive.grove; - - let result = transaction_result.and_then(|transaction_arg| { - grove_db - .get_proved_path_query(&path_query, get_verbose_proof, transaction_arg) - .unwrap() - .map_err(Error::GroveDB) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(proof) => { - let js_buffer = JsBuffer::external(&mut task_context, proof); - let js_value = js_buffer.as_value(&mut task_context); - - vec![task_context.null().upcast(), js_value.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - // The result is returned through the callback, not through direct return - Ok(cx.undefined()) - } - - fn js_grove_db_prove_query_many(mut cx: FunctionContext) -> JsResult { - let js_path_queries = cx.argument::(0)?; - let js_using_transaction = cx.argument::(1)?; - - if js_using_transaction.value(&mut cx) { - cx.throw_type_error("transaction is not supported")?; - } - - let js_callback = cx.argument::(2)?.root(&mut cx); - - let js_path_queries = js_path_queries.to_vec(&mut cx)?; - let mut path_queries: Vec = Vec::with_capacity(js_path_queries.len()); - - for js_path_query in js_path_queries { - let js_path_query = js_path_query.downcast_or_throw::(&mut cx)?; - path_queries.push(converter::js_path_query_to_path_query( - &mut cx, - js_path_query, - )?); - } - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread(move |platform: &Platform, _, channel| { - let grove_db = &platform.drive.grove; - - let path_queries = path_queries.iter().collect(); - - let result = grove_db.prove_query_many(path_queries).unwrap(); - - channel.send(move |mut task_context| { - let this = task_context.undefined(); - let callback = js_callback.into_inner(&mut task_context); - - let callback_arguments = match result { - Ok(proof) => { - let js_buffer = JsBuffer::external(&mut task_context, proof); - let js_value = js_buffer.as_value(&mut task_context); - - vec![task_context.null().upcast(), js_value.upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err.to_string())?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }) - .or_else(|err| cx.throw_error(err.to_string()))?; - - // The result is returned through the callback, not through direct return - Ok(cx.undefined()) - } - - /// Flush data on disc and then calls js callback passed as a first - /// argument to the function - fn js_grove_db_flush(mut cx: FunctionContext) -> JsResult { - let js_callback = cx.argument::(0)?.root(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.flush(|channel| { - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = vec![task_context.null().upcast()]; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }) - .or_else(|err| cx.throw_error(err.to_string()))?; - - Ok(cx.undefined()) - } - - /// Returns root hash or empty buffer - fn js_grove_db_root_hash(mut cx: FunctionContext) -> JsResult { - let js_using_transaction = cx.argument::(0)?; - - let js_callback = cx.argument::(1)?.root(&mut cx); - - let using_transaction = js_using_transaction.value(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let grove_db = &platform.drive.grove; - - let result = transaction_result.and_then(|transaction_arg| { - grove_db - .root_hash(transaction_arg) - .unwrap() - .map_err(Error::GroveDB) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(hash) => vec![ - task_context.null().upcast(), - JsBuffer::external(&mut task_context, hash).upcast(), - ], - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - // The result is returned through the callback, not through direct return - Ok(cx.undefined()) - } - - fn js_grove_db_delete(mut cx: FunctionContext) -> JsResult { - let js_path = cx.argument::(0)?; - let js_key = cx.argument::(1)?; - - let js_using_transaction = cx.argument::(2)?; - - let js_callback = cx.argument::(3)?.root(&mut cx); - - let path = converter::js_array_of_buffers_to_vec(&mut cx, js_path)?; - let key = converter::js_buffer_to_vec_u8(&mut cx, js_key); - - let using_transaction = js_using_transaction.value(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let grove_db = &platform.drive.grove; - - let path_slice: Vec<&[u8]> = - path.iter().map(|fragment| fragment.as_slice()).collect(); - let result = transaction_result.and_then(|transaction_arg| { - grove_db - .delete(path_slice, key.as_slice(), None, transaction_arg) - .unwrap() - .map_err(Error::GroveDB) - .map_err(|err| err.to_string()) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - let callback_arguments: Vec> = match result { - Ok(()) => { - vec![task_context.null().upcast()] - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - // The result is returned through the callback, not through direct return - Ok(cx.undefined()) - } - - fn js_abci_init_chain(mut cx: FunctionContext) -> JsResult { - //this needs to be removed - todo!(); - // let js_request = cx.argument::(0)?; - // let js_using_transaction = cx.argument::(1)?; - // - // let js_callback = cx.argument::(2)?.root(&mut cx); - // - // let using_transaction = js_using_transaction.value(&mut cx); - // - // let db = cx - // .this() - // .downcast_or_throw::, _>(&mut cx)?; - // - // let request_bytes = converter::js_buffer_to_vec_u8(&mut cx, js_request); - // - // db.send_to_drive_thread(move |platform: &Platform, transaction, channel| { - // let transaction_result = if using_transaction { - // if transaction.is_none() { - // Err("transaction is not started".to_string()) - // } else { - // Ok(transaction) - // } - // } else { - // Ok(None) - // }; - // - // let result = transaction_result.and_then(|transaction_arg| { - // InitChainRequest::from_bytes(&request_bytes) - // .and_then(|request| platform.init_chain(request.into())) - // .map_err(|e| e.to_string()) - // }); - // - // channel.send(move |mut task_context| { - // let callback = js_callback.into_inner(&mut task_context); - // let this = task_context.undefined(); - // - // let callback_arguments: Vec> = match result { - // Ok(response_bytes) => { - // let value = JsBuffer::external(&mut task_context, response_bytes); - // - // vec![task_context.null().upcast(), value.upcast()] - // } - // - // // Convert the error to a JavaScript exception on failure - // Err(err) => vec![task_context.error(err)?.upcast()], - // }; - // - // callback.call(&mut task_context, this, callback_arguments)?; - // - // Ok(()) - // }); - // }) - // .or_else(|err| cx.throw_error(err.to_string()))?; - // - // // The result is returned through the callback, not through direct return - // Ok(cx.undefined()) - } - - fn js_abci_block_begin(mut cx: FunctionContext) -> JsResult { - //this needs to be removed - todo!() - // let js_request = cx.argument::(0)?; - // let js_using_transaction = cx.argument::(1)?; - // - // let js_callback = cx.argument::(2)?.root(&mut cx); - // - // let using_transaction = js_using_transaction.value(&mut cx); - // - // let db = cx - // .this() - // .downcast_or_throw::, _>(&mut cx)?; - // - // let request_bytes = converter::js_buffer_to_vec_u8(&mut cx, js_request); - // - // db.send_to_drive_thread(move |platform: &Platform, transaction, channel| { - // let transaction_result = if using_transaction { - // if transaction.is_none() { - // Err("transaction is not started".to_string()) - // } else { - // Ok(transaction) - // } - // } else { - // Ok(None) - // }; - // - // let result = transaction_result.and_then(|transaction_arg| { - // BlockBeginRequest::from_bytes(&request_bytes) - // .and_then(|request| platform.block_begin(request, transaction_arg)) - // .and_then(|response| response.to_bytes()) - // .map_err(|e| e.to_string()) - // }); - // - // channel.send(move |mut task_context| { - // let callback = js_callback.into_inner(&mut task_context); - // let this = task_context.undefined(); - // - // let callback_arguments: Vec> = match result { - // Ok(response_bytes) => { - // let value = JsBuffer::external(&mut task_context, response_bytes); - // - // vec![task_context.null().upcast(), value.upcast()] - // } - // - // // Convert the error to a JavaScript exception on failure - // Err(err) => vec![task_context.error(err)?.upcast()], - // }; - // - // callback.call(&mut task_context, this, callback_arguments)?; - // - // Ok(()) - // }); - // }) - // .or_else(|err| cx.throw_error(err.to_string()))?; - // - // // The result is returned through the callback, not through direct return - // Ok(cx.undefined()) - } - - fn js_abci_block_end(mut cx: FunctionContext) -> JsResult { - //this needs to be removed - todo!() - // let js_request = cx.argument::(0)?; - // - // let js_using_transaction = cx.argument::(1)?; - // - // let js_callback = cx.argument::(2)?.root(&mut cx); - // - // let using_transaction = js_using_transaction.value(&mut cx); - // - // let db = cx - // .this() - // .downcast_or_throw::, _>(&mut cx)?; - // - // let js_fees: Handle = js_request.get(&mut cx, "fees")?; - // - // let js_processing_fee: Handle = js_fees.get(&mut cx, "processingFee")?; - // let processing_fee = js_processing_fee.value(&mut cx) as u64; - // - // let js_storage_fee: Handle = js_fees.get(&mut cx, "storageFee")?; - // let storage_fee = js_storage_fee.value(&mut cx) as u64; - // - // let js_refunds_per_epoch: Handle = js_fees.get(&mut cx, "refundsPerEpoch")?; - // - // let refunds_per_epoch = js_object_to_fee_refunds(&mut cx, js_refunds_per_epoch)?; - // - // db.send_to_drive_thread(move |platform: &Platform, transaction, channel| { - // let transaction_result = if using_transaction { - // if transaction.is_none() { - // Err("transaction is not started".to_string()) - // } else { - // Ok(transaction) - // } - // } else { - // Ok(None) - // }; - // - // let result = transaction_result.and_then(|transaction_arg| { - // let request = BlockEndRequest { - // fees: BlockFees { - // processing_fee, - // storage_fee, - // refunds_per_epoch, - // }, - // }; - // - // platform - // .block_end(request, transaction_arg) - // .and_then(|response| response.to_bytes()) - // .map_err(|e| e.to_string()) - // }); - // - // channel.send(move |mut task_context| { - // let callback = js_callback.into_inner(&mut task_context); - // let this = task_context.undefined(); - // - // let callback_arguments: Vec> = match result { - // Ok(response_bytes) => { - // let value = JsBuffer::external(&mut task_context, response_bytes); - // - // vec![task_context.null().upcast(), value.upcast()] - // } - // - // // Convert the error to a JavaScript exception on failure - // Err(err) => vec![task_context.error(err)?.upcast()], - // }; - // - // callback.call(&mut task_context, this, callback_arguments)?; - // - // Ok(()) - // }); - // }) - // .or_else(|err| cx.throw_error(err.to_string()))?; - // - // // The result is returned through the callback, not through direct return - // Ok(cx.undefined()) - } - - fn js_abci_after_finalize_block(mut cx: FunctionContext) -> JsResult { - //this needs to be removed - todo!(); - // let js_request = cx.argument::(0)?; - // let js_callback = cx.argument::(1)?.root(&mut cx); - // - // let db = cx - // .this() - // .downcast_or_throw::, _>(&mut cx)?; - // - // let request_bytes = converter::js_buffer_to_vec_u8(&mut cx, js_request); - // - // db.send_to_drive_thread(move |platform: &Platform, _, channel| { - // let result = AfterFinalizeBlockRequest::from_bytes(&request_bytes) - // .and_then(|request| platform.after_finalize_block(request)) - // .and_then(|response| response.to_bytes()); - // - // channel.send(move |mut task_context| { - // let callback = js_callback.into_inner(&mut task_context); - // let this = task_context.undefined(); - // - // let callback_arguments: Vec> = match result { - // Ok(response_bytes) => { - // let value = JsBuffer::external(&mut task_context, response_bytes); - // - // vec![task_context.null().upcast(), value.upcast()] - // } - // - // // Convert the error to a JavaScript exception on failure - // Err(err) => vec![task_context.error(err.to_string())?.upcast()], - // }; - // - // callback.call(&mut task_context, this, callback_arguments)?; - // - // Ok(()) - // }); - // }) - // .or_else(|err| cx.throw_error(err.to_string()))?; - // - // // The result is returned through the callback, not through direct return - // Ok(cx.undefined()) - } - - fn js_fetch_latest_withdrawal_transaction_index( - mut cx: FunctionContext, - ) -> JsResult { - let js_block_info = cx.argument::(0)?; - let js_apply = cx.argument::(1)?; - let js_using_transaction = cx.argument::(2)?; - let js_callback = cx.argument::(3)?.root(&mut cx); - - let apply = js_apply.value(&mut cx); - let block_info = converter::js_object_to_block_info(&mut cx, js_block_info)?; - let using_transaction = js_using_transaction.value(&mut cx); - - let db = cx - .this() - .downcast_or_throw::, _>(&mut cx)?; - - db.send_to_drive_thread( - move |platform: &Platform, transaction, channel| { - let transaction_result = if using_transaction { - if transaction.is_none() { - Err("transaction is not started".to_string()) - } else { - Ok(transaction) - } - } else { - Ok(None) - }; - - let result = transaction_result.and_then(|transaction_arg| { - let mut drive_operation_types = vec![]; - - let result = platform - .drive - .fetch_and_remove_latest_withdrawal_transaction_index_operations( - &mut drive_operation_types, - transaction_arg, - ) - .map_err(|err| err.to_string())?; - - platform - .drive - .apply_drive_operations( - drive_operation_types, - apply, - &block_info, - transaction_arg, - ) - .map_err(|err| err.to_string())?; - - Ok(result) - }); - - channel.send(move |mut task_context| { - let callback = js_callback.into_inner(&mut task_context); - let this = task_context.undefined(); - - let callback_arguments: Vec> = match result { - Ok(index) => { - let index_f64 = index as f64; - if index_f64 as u64 != index { - vec![task_context - .error("could not convert withdrawal transaction index to f64")? - .upcast()] - } else { - let value = JsNumber::new(&mut task_context, index_f64); - - vec![task_context.null().upcast(), value.upcast()] - } - } - - // Convert the error to a JavaScript exception on failure - Err(err) => vec![task_context.error(err)?.upcast()], - }; - - callback.call(&mut task_context, this, callback_arguments)?; - - Ok(()) - }); - }, - ) - .or_else(|err| cx.throw_error(err.to_string()))?; - - // The result is returned through the callback, not through direct return - Ok(cx.undefined()) - } -} - -#[neon::main] -fn main(mut cx: ModuleContext) -> NeonResult<()> { - cx.export_function("driveOpen", PlatformWrapper::js_open)?; - cx.export_function("driveClose", PlatformWrapper::js_close)?; - cx.export_function( - "driveCreateInitialStateStructure", - PlatformWrapper::js_create_initial_state_structure, - )?; - cx.export_function("driveFetchContract", PlatformWrapper::js_fetch_contract)?; - cx.export_function("driveCreateContract", PlatformWrapper::js_create_contract)?; - cx.export_function("driveUpdateContract", PlatformWrapper::js_update_contract)?; - cx.export_function("driveCreateDocument", PlatformWrapper::js_create_document)?; - cx.export_function("driveUpdateDocument", PlatformWrapper::js_update_document)?; - cx.export_function("driveDeleteDocument", PlatformWrapper::js_delete_document)?; - cx.export_function( - "driveInsertIdentity", - PlatformWrapper::js_insert_identity_cbor, - )?; - cx.export_function("driveFetchIdentity", PlatformWrapper::js_fetch_identity)?; - cx.export_function( - "driveFetchIdentityBalance", - PlatformWrapper::js_fetch_identity_balance, - )?; - cx.export_function( - "driveFetchIdentityBalanceWithCosts", - PlatformWrapper::js_fetch_identity_balance_with_costs, - )?; - cx.export_function( - "driveFetchIdentityBalanceIncludeDebtWithCosts", - PlatformWrapper::js_fetch_identity_balance_include_debt_with_costs, - )?; - cx.export_function( - "driveFetchProvedIdentity", - PlatformWrapper::js_fetch_proved_identity, - )?; - cx.export_function( - "driveFetchManyProvedIdentities", - PlatformWrapper::js_fetch_many_proved_identities, - )?; - cx.export_function( - "driveFetchIdentityWithCosts", - PlatformWrapper::js_fetch_identity_with_costs, - )?; - cx.export_function( - "driveAddToIdentityBalance", - PlatformWrapper::js_add_to_identity_balance, - )?; - cx.export_function( - "driveRemoveFromIdentityBalance", - PlatformWrapper::js_remove_from_identity_balance, - )?; - cx.export_function( - "driveApplyFeesToIdentityBalance", - PlatformWrapper::js_apply_fees_to_identity_balance, - )?; - cx.export_function( - "driveAddToSystemCredits", - PlatformWrapper::js_add_to_system_credits, - )?; - cx.export_function( - "driveFetchIdentitiesByPublicKeyHashes", - PlatformWrapper::js_fetch_identities_by_public_key_hashes, - )?; - cx.export_function( - "driveProveIdentitiesByPublicKeyHashes", - PlatformWrapper::js_prove_identities_by_public_key_hashes, - )?; - cx.export_function( - "driveAddKeysToIdentity", - PlatformWrapper::js_add_keys_to_identity, - )?; - cx.export_function( - "driveDisableIdentityKeys", - PlatformWrapper::js_disable_identity_keys, - )?; - cx.export_function( - "driveUpdateIdentityRevision", - PlatformWrapper::js_update_identity_revision, - )?; - - cx.export_function("driveQueryDocuments", PlatformWrapper::js_query_documents)?; - - cx.export_function( - "driveProveDocumentsQuery", - PlatformWrapper::js_prove_documents_query, - )?; - - cx.export_function( - "driveFetchLatestWithdrawalTransactionIndex", - PlatformWrapper::js_fetch_latest_withdrawal_transaction_index, - )?; - - cx.export_function("groveDbInsert", PlatformWrapper::js_grove_db_insert)?; - cx.export_function( - "groveDbInsertIfNotExists", - PlatformWrapper::js_grove_db_insert_if_not_exists, - )?; - cx.export_function("groveDbGet", PlatformWrapper::js_grove_db_get)?; - cx.export_function("groveDbDelete", PlatformWrapper::js_grove_db_delete)?; - cx.export_function("groveDbFlush", PlatformWrapper::js_grove_db_flush)?; - cx.export_function( - "groveDbStartTransaction", - PlatformWrapper::js_grove_db_start_transaction, - )?; - cx.export_function( - "groveDbIsTransactionStarted", - PlatformWrapper::js_grove_db_is_transaction_started, - )?; - cx.export_function( - "groveDbCommitTransaction", - PlatformWrapper::js_grove_db_commit_transaction, - )?; - cx.export_function( - "groveDbRollbackTransaction", - PlatformWrapper::js_grove_db_rollback_transaction, - )?; - cx.export_function( - "groveDbAbortTransaction", - PlatformWrapper::js_grove_db_abort_transaction, - )?; - cx.export_function("groveDbPutAux", PlatformWrapper::js_grove_db_put_aux)?; - cx.export_function("groveDbDeleteAux", PlatformWrapper::js_grove_db_delete_aux)?; - cx.export_function("groveDbGetAux", PlatformWrapper::js_grove_db_get_aux)?; - cx.export_function("groveDbQuery", PlatformWrapper::js_grove_db_query)?; - cx.export_function( - "groveDbProveQuery", - PlatformWrapper::js_grove_db_prove_query, - )?; - cx.export_function( - "groveDbProveQueryMany", - PlatformWrapper::js_grove_db_prove_query_many, - )?; - cx.export_function("groveDbRootHash", PlatformWrapper::js_grove_db_root_hash)?; - - cx.export_function("abciInitChain", PlatformWrapper::js_abci_init_chain)?; - cx.export_function("abciBlockBegin", PlatformWrapper::js_abci_block_begin)?; - cx.export_function("abciBlockEnd", PlatformWrapper::js_abci_block_end)?; - cx.export_function( - "abciAfterFinalizeBlock", - PlatformWrapper::js_abci_after_finalize_block, - )?; - - cx.export_function( - "feeResultGetProcessingFee", - FeeResultWrapper::get_processing_fee, - )?; - cx.export_function("feeResultGetStorageFee", FeeResultWrapper::get_storage_fee)?; - cx.export_function("feeResultAdd", FeeResultWrapper::add)?; - cx.export_function("feeResultAddFees", FeeResultWrapper::add_fees)?; - cx.export_function("feeResultCreate", FeeResultWrapper::create)?; - cx.export_function("feeResultGetRefunds", FeeResultWrapper::get_refunds)?; - cx.export_function( - "feeResultSumRefundsPerEpoch", - FeeResultWrapper::get_refunds_per_epoch, - )?; - - cx.export_function( - "calculateStorageFeeDistributionAmountAndLeftovers", - js_calculate_storage_fee_distribution_amount_and_leftovers, - )?; - - Ok(()) -} diff --git a/packages/rs-drive-nodejs/test/.eslintrc b/packages/rs-drive-nodejs/test/.eslintrc deleted file mode 100644 index 720ced73852..00000000000 --- a/packages/rs-drive-nodejs/test/.eslintrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "env": { - "node": true, - "mocha": true - }, - "rules": { - "import/no-extraneous-dependencies": "off" - }, - "globals": { - "expect": true - } -} diff --git a/packages/rs-drive-nodejs/test/Drive.spec.js b/packages/rs-drive-nodejs/test/Drive.spec.js deleted file mode 100644 index 931d7d34a07..00000000000 --- a/packages/rs-drive-nodejs/test/Drive.spec.js +++ /dev/null @@ -1,1181 +0,0 @@ -const fs = require('fs'); - -const { PrivateKey } = require('@dashevo/dashcore-lib'); - -const { expect, use } = require('chai'); -use(require('dirty-chai')); - -const DashPlatformProtocol = require('@dashevo/dpp'); - -const Document = require('@dashevo/dpp/lib/document/Document'); -const Identifier = require('@dashevo/dpp/lib/Identifier'); - -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); - -const withdrawalContractDocumentsSchema = require('@dashevo/withdrawals-contract/schema/withdrawals-documents.json'); -const withdrawalContractIds = require('@dashevo/withdrawals-contract/lib/systemIds'); - -const { - expectFeeResult, -} = require('./utils'); - -const Drive = require('../Drive'); - -const FeeResult = require('../FeeResult'); - -const TEST_DATA_PATH = './test_data'; - -describe('Drive', function main() { - this.timeout(10000); - - let drive; - let dataContract; - let identity; - let blockInfo; - let documents; - let initialRootHash; - let withdrawalsDataContract; - - beforeEach(async () => { - drive = new Drive(TEST_DATA_PATH, { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - const dpp = new DashPlatformProtocol({ - stateRepository: { - fetchDataContract: () => { }, - }, - }); - - await dpp.initialize(); - - withdrawalsDataContract = dpp.dataContract.create( - generateRandomIdentifier(), - withdrawalContractDocumentsSchema, - ); - - withdrawalsDataContract.id = Identifier.from(withdrawalContractIds.contractId); - - dataContract = getDataContractFixture(); - identity = getIdentityFixture(); - - blockInfo = { - height: 1, - epoch: 1, - timeMs: new Date().getTime(), - }; - - documents = getDocumentsFixture(dataContract); - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - afterEach(async () => { - await drive.close(); - - fs.rmSync(TEST_DATA_PATH, { recursive: true }); - }); - - describe('#createInitialStateStructure', () => { - it('should create initial tree structure', async () => { - const result = await drive.createInitialStateStructure(); - - // eslint-disable-next-line no-unused-expressions - expect(result).to.be.undefined; - }); - }); - - describe('#fetchContract', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should return null if contract not exists', async () => { - const result = await drive.fetchContract(Buffer.alloc(32), blockInfo.epoch); - - expect(result).to.be.an.instanceOf(Array); - expect(result).to.have.lengthOf(2); - - const [fetchedDataContract, feeResult] = result; - - expect(fetchedDataContract).to.be.null(); - - expect(feeResult).to.be.instanceOf(FeeResult); - - expect(feeResult.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(feeResult.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - }); - - it('should return contract if contract is present', async () => { - await drive.createContract(dataContract, blockInfo); - - const result = await drive.fetchContract(dataContract.getId(), blockInfo.epoch); - - expect(result).to.be.an.instanceOf(Array); - expect(result).to.have.lengthOf(2); - - const [fetchedDataContract, feeResult] = result; - - expect(fetchedDataContract.toBuffer()).to.deep.equal(dataContract.toBuffer()); - - expect(feeResult).to.be.an.instanceOf(FeeResult); - - expect(feeResult.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(feeResult.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - }); - - it('should return contract without fee result if epoch is not passed', async () => { - await drive.createContract(dataContract, blockInfo); - - const result = await drive.fetchContract(dataContract.getId()); - - expect(result).to.be.an.instanceOf(Array); - expect(result).to.have.lengthOf(1); - - const [fetchedDataContract] = result; - - expect(fetchedDataContract.toBuffer()).to.deep.equal(dataContract.toBuffer()); - }); - }); - - describe('#createContract', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should create contract', async () => { - const result = await drive.createContract(dataContract, blockInfo); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.not.deep.equals(initialRootHash); - }); - - it('should not create contract with dry run flag', async () => { - const result = await drive.createContract(dataContract, blockInfo, undefined, true); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.deep.equals(initialRootHash); - }); - }); - - describe('#updateContract', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - await drive.createContract(dataContract, blockInfo); - - initialRootHash = await drive.getGroveDB().getRootHash(); - - dataContract.setDocumentSchema('newDocumentType', { - type: 'object', - properties: { - newProperty: { - type: 'string', - }, - }, - additionalProperties: false, - }); - }); - - it('should update existing contract', async () => { - const result = await drive.updateContract(dataContract, blockInfo); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.not.deep.equals(initialRootHash); - }); - - it('should not create contract with dry run flag', async () => { - const result = await drive.updateContract(dataContract, blockInfo, undefined, true); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.deep.equals(initialRootHash); - }); - }); - - describe('#createDocument', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - await drive.createContract(dataContract, blockInfo); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - context('without indices', () => { - it('should create a document', async () => { - const documentWithoutIndices = documents[0]; - - const result = await drive.createDocument(documentWithoutIndices, blockInfo); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.not.deep.equals(initialRootHash); - }); - }); - - context('with indices', () => { - it('should create a document', async () => { - const documentWithIndices = documents[3]; - - const result = await drive.createDocument(documentWithIndices, blockInfo); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.not.deep.equals(initialRootHash); - }); - }); - - it('should not create a document with dry run flag', async () => { - const documentWithoutIndices = documents[0]; - - const result = await drive.createDocument(documentWithoutIndices, blockInfo, undefined, true); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.deep.equals(initialRootHash); - }); - }); - - describe('#updateDocument', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - await drive.createContract(dataContract, blockInfo); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - context('without indices', () => { - it('should update a document', async () => { - // Create a document - const documentWithoutIndices = documents[0]; - - await drive.createDocument(documentWithoutIndices, blockInfo); - - // Update the document - documentWithoutIndices.set('name', 'Boooooooooooob'); - - const result = await drive.updateDocument(documentWithoutIndices, blockInfo); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.not.deep.equals(initialRootHash); - }); - }); - - context('with indices', () => { - it('should update the document', async () => { - // Create a document - const documentWithIndices = documents[3]; - - await drive.createDocument(documentWithIndices, blockInfo); - - // Update the document - documentWithIndices.set('firstName', 'Bob'); - - const result = await drive.updateDocument(documentWithIndices, blockInfo); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.not.deep.equals(initialRootHash); - }); - }); - - it('should not update a document with dry run flag', async () => { - const documentWithoutIndices = documents[0]; - - documentWithoutIndices.set('name', 'Boooooooooooooooooooooob'); - - const result = await drive.updateDocument(documentWithoutIndices, blockInfo, undefined, true); - - expect(result).to.be.an.instanceOf(FeeResult); - - expect(result.processingFee).to.be.greaterThan(0); - expect(result.storageFee).to.be.greaterThan(0, 'storage fee must be higher than 0'); - - expect(await drive.getGroveDB().getRootHash()).to.deep.equals(initialRootHash); - }); - }); - - describe('#deleteDocument', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - await drive.createContract(dataContract, blockInfo); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - context('without indices', () => { - it('should delete the document', async () => { - // Create a document - const documentWithoutIndices = documents[3]; - - await drive.createDocument(documentWithoutIndices, blockInfo); - - initialRootHash = await drive.getGroveDB().getRootHash(); - - const result = await drive.deleteDocument( - dataContract.getId(), - documentWithoutIndices.getType(), - documentWithoutIndices.getId(), - blockInfo, - ); - - expect(result).to.be.an.instanceOf(FeeResult); - - expect(result.processingFee).to.be.greaterThan(0, 'processing fee must be higher than 0'); - expect(result.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - - expect(await drive.getGroveDB().getRootHash()).to.not.deep.equals(initialRootHash); - }); - }); - - context('with indices', () => { - it('should delete the document', async () => { - // Create a document - const documentWithIndices = documents[3]; - - await drive.createDocument(documentWithIndices, blockInfo); - - initialRootHash = await drive.getGroveDB().getRootHash(); - - const result = await drive.deleteDocument( - dataContract.getId(), - documentWithIndices.getType(), - documentWithIndices.getId(), - blockInfo, - ); - - expect(result).to.be.an.instanceOf(FeeResult); - - expect(result.processingFee).to.be.greaterThan(0, 'processing fee must be higher than 0'); - expect(result.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - - expect(await drive.getGroveDB().getRootHash()).to.not.deep.equals(initialRootHash); - }); - }); - - it('should not delete the document with dry run flag', async () => { - // Create a document - const documentWithoutIndices = documents[3]; - - await drive.createDocument(documentWithoutIndices, blockInfo); - - initialRootHash = await drive.getGroveDB().getRootHash(); - - const result = await drive.deleteDocument( - dataContract.getId(), - documentWithoutIndices.getType(), - documentWithoutIndices.getId(), - blockInfo, - undefined, - true, - ); - - expect(result).to.be.an.instanceOf(FeeResult); - - expect(result.processingFee).to.be.greaterThan(0, 'processing fee must be higher than 0'); - expect(result.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - - expect(await drive.getGroveDB().getRootHash()).to.deep.equals(initialRootHash); - }); - }); - - describe('#queryDocuments', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - await drive.createContract(dataContract, blockInfo); - }); - - it('should query existing documents', async () => { - // Create documents - await Promise.all( - documents.map((document) => drive.createDocument(document, blockInfo)), - ); - - // eslint-disable-next-line no-unused-vars - const [fetchedDocuments, processingCost] = await drive.queryDocuments(dataContract, 'indexedDocument', undefined, { - where: [['lastName', '==', 'Kennedy']], - }); - - expect(fetchedDocuments).to.have.lengthOf(1); - expect(fetchedDocuments[0]).to.be.an.instanceOf(Document); - expect(fetchedDocuments[0].toObject()).to.deep.equal(documents[4].toObject()); - - // costs are not calculating without block info - expect(processingCost).to.be.equal(0); - }); - - it('should query existing documents again', async () => { - // Create documents - await Promise.all( - documents.map((document) => drive.createDocument(document, blockInfo)), - ); - - // eslint-disable-next-line no-unused-vars - const [fetchedDocuments, processingCost] = await drive.queryDocuments(dataContract, 'indexedDocument', blockInfo.epoch, { - where: [['lastName', '==', 'Kennedy']], - }); - - expect(fetchedDocuments).to.have.lengthOf(1); - expect(fetchedDocuments[0]).to.be.an.instanceOf(Document); - expect(fetchedDocuments[0].toObject()).to.deep.equal(documents[4].toObject()); - - expect(processingCost).to.be.greaterThan(0); - }); - - it('should return empty array if documents are not exist', async () => { - // eslint-disable-next-line no-unused-vars - const [fetchedDocuments, processingCost] = await drive.queryDocuments(dataContract, 'indexedDocument', blockInfo.epoch, { - where: [['lastName', '==', 'Kennedy']], - }); - - expect(fetchedDocuments).to.have.lengthOf(0); - expect(processingCost).to.be.greaterThan(0); - }); - }); - - describe('#proveDocumentsQuery', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - await drive.createContract(dataContract, blockInfo); - }); - - it('should query existing documents', async () => { - // Create documents - await Promise.all( - documents.map((document) => drive.createDocument(document, blockInfo)), - ); - - const result = await drive.proveDocumentsQuery(dataContract, 'indexedDocument', { - where: [['lastName', '==', 'Kennedy']], - }); - - expect(result).to.have.lengthOf(2); - - const [proofs, processingCost] = result; - expect(proofs).to.be.an.instanceOf(Buffer); - expect(proofs.length).to.be.greaterThan(0); - - // TODO: We do not calculating processing costs for poofs yet - expect(processingCost).to.equal(0); - }); - }); - - describe('#insertIdentity', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should create identity if not exists', async () => { - const result = await drive.insertIdentity(identity, blockInfo); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.not.deep.equals(initialRootHash); - }); - }); - - describe('#fetchIdentity', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should return null if identity not exists', async () => { - const result = await drive.fetchIdentity(Buffer.alloc(32)); - - expect(result).to.be.null(); - }); - - it('should return identity if it is present', async () => { - await drive.insertIdentity(identity, blockInfo); - - const result = await drive.fetchIdentity(identity.getId()); - - expect(result.toBuffer()).to.deep.equal(identity.toBuffer()); - }); - }); - - describe('#fetchIdentityWithCosts', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should return null if contract not exists', async () => { - const result = await drive.fetchIdentityWithCosts(Buffer.alloc(32), blockInfo.epoch); - - expect(result).to.be.an.instanceOf(Array); - expect(result).to.have.lengthOf(2); - - const [fetchedIdentity, feeResult] = result; - - expect(fetchedIdentity).to.be.null(); - - expect(feeResult).to.be.instanceOf(FeeResult); - - expect(feeResult.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(feeResult.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - }); - - it('should return contract if contract is present', async () => { - await drive.insertIdentity(identity, blockInfo); - - const result = await drive.fetchIdentityWithCosts(identity.getId(), blockInfo.epoch); - - expect(result).to.be.an.instanceOf(Array); - expect(result).to.have.lengthOf(2); - - const [fetchedIdentity, feeResult] = result; - - expect(fetchedIdentity.toBuffer()).to.deep.equal(identity.toBuffer()); - - expect(feeResult).to.be.an.instanceOf(FeeResult); - - expect(feeResult.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(feeResult.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - }); - }); - - describe('#fetchIdentityBalance', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should return null if identity not exists', async () => { - const result = await drive.fetchIdentityBalance(Buffer.alloc(32)); - - expect(result).to.be.null(); - }); - - it('should return balance if identity is present', async () => { - await drive.insertIdentity(identity, blockInfo); - - const balance = await drive.fetchIdentityBalance(identity.getId()); - - expect(balance).to.deep.equal(identity.getBalance()); - }); - }); - - describe('#fetchIdentityBalanceWithCosts', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should return null if identity not exists', async () => { - const result = await drive.fetchIdentityBalanceWithCosts(Buffer.alloc(32), blockInfo); - - expect(result).to.be.an.instanceOf(Array); - expect(result).to.have.lengthOf(2); - - const [balance, feeResult] = result; - - expect(balance).to.be.null(); - - expect(feeResult).to.be.instanceOf(FeeResult); - - expect(feeResult.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(feeResult.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - }); - - it('should return contract if identity is present', async () => { - await drive.insertIdentity(identity, blockInfo); - - const result = await drive.fetchIdentityBalanceWithCosts(identity.getId(), blockInfo); - - expect(result).to.be.an.instanceOf(Array); - expect(result).to.have.lengthOf(2); - - const [balance, feeResult] = result; - - expect(balance).to.equal(identity.getBalance()); - - expect(feeResult).to.be.an.instanceOf(FeeResult); - - expect(feeResult.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(feeResult.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - }); - }); - - describe('#fetchIdentityBalanceIncludeDebtWithCosts', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should return null if identity not exists', async () => { - const result = await drive.fetchIdentityBalanceIncludeDebtWithCosts( - Buffer.alloc(32), - blockInfo, - ); - - expect(result).to.be.an.instanceOf(Array); - expect(result).to.have.lengthOf(2); - - const [balance, feeResult] = result; - - expect(balance).to.be.null(); - - expect(feeResult).to.be.instanceOf(FeeResult); - - expect(feeResult.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(feeResult.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - }); - - it('should return balance if identity is present', async () => { - await drive.insertIdentity(identity, blockInfo); - - const result = await drive.fetchIdentityBalanceIncludeDebtWithCosts( - identity.getId(), - blockInfo, - ); - - expect(result).to.be.an.instanceOf(Array); - expect(result).to.have.lengthOf(2); - - const [balance, feeResult] = result; - - expect(balance).to.equal(identity.getBalance()); - - expect(feeResult).to.be.an.instanceOf(FeeResult); - - expect(feeResult.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(feeResult.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - }); - }); - - describe('#addToIdentityBalance', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - }); - - it('should add to balance', async () => { - await drive.insertIdentity(identity, blockInfo); - - const amount = 100; - - const result = await drive.addToIdentityBalance( - identity.getId(), - amount, - blockInfo, - ); - - expect(result).to.be.an.instanceOf(FeeResult); - - expect(result.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(result.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - - const fetchedIdentity = await drive.fetchIdentity(identity.getId()); - - expect(fetchedIdentity.getBalance()).to.equals(identity.getBalance() + amount); - }); - - it('should not update state with dry run', async () => { - initialRootHash = await drive.getGroveDB().getRootHash(); - - const result = await drive.addToIdentityBalance( - identity.getId(), - 100, - blockInfo, - false, - true, - ); - - expect(result).to.be.an.instanceOf(FeeResult); - - expect(result.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(result.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - - expect(await drive.getGroveDB().getRootHash()).to.deep.equals(initialRootHash); - }); - }); - - describe('#removeFromIdentitiyBalance', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - }); - - it('should remove from balance', async () => { - await drive.insertIdentity(identity, blockInfo); - - const amount = 2; - - const result = await drive.removeFromIdentityBalance( - identity.getId(), - amount, - blockInfo, - ); - - expect(result).to.be.an.instanceOf(FeeResult); - - expect(result.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(result.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - - const fetchedIdentity = await drive.fetchIdentity(identity.getId()); - - expect(fetchedIdentity.getBalance()).to.equals( - identity.getBalance() - amount, - ); - }); - - it('should not update state with dry run', async () => { - initialRootHash = await drive.getGroveDB().getRootHash(); - - const amount = 2; - - const result = await drive.removeFromIdentityBalance( - identity.getId(), - amount, - blockInfo, - false, - true, - ); - - expect(result).to.be.an.instanceOf(FeeResult); - - expect(result.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(result.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - - expect(await drive.getGroveDB().getRootHash()).to.deep.equals(initialRootHash); - }); - }); - - describe('#applyFeesToIdentityBalance', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - }); - - it('should change balance according to provided fees', async () => { - blockInfo.epoch = 3; - - await drive.insertIdentity(identity, blockInfo); - - const feeResult = FeeResult.create(10000, 10, [{ - identifier: identity.getId().toBuffer(), - creditsPerEpoch: { 0: 1000000 }, - }]); - - const result = await drive.applyFeesToIdentityBalance( - identity.getId(), - feeResult, - ); - - expect(result).to.be.an.instanceOf(FeeResult); - - const fetchedIdentity = await drive.fetchIdentity(identity.getId()); - - expect(fetchedIdentity.getBalance()).to.not.equals( - identity.getBalance(), - ); - }); - }); - - describe('#addToSystemCredits', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - }); - - it('should add to system credits', async () => { - await drive.addToSystemCredits( - 100, - ); - }); - }); - - describe('#fetchIdentitiesByPublicKeyHashes', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should return empty array if identity not exists', async () => { - const result = await drive.fetchIdentitiesByPublicKeyHashes([Buffer.alloc(20)]); - - expect(result).to.be.instanceOf(Array); - expect(result).to.be.empty(); - }); - - it('should return identities if it is present', async () => { - await drive.insertIdentity(identity, blockInfo); - - const result = await drive.fetchIdentitiesByPublicKeyHashes( - identity.getPublicKeys().map((k) => k.hash()), - ); - - expect(result).to.deep.equal(identity.getPublicKeys().map(() => identity)); - }); - }); - - describe('#addKeysToIdentity', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - }); - - it('should add keys to identity', async () => { - const keysToAdd = [identity.getPublicKeys().pop()]; - - await drive.insertIdentity(identity, blockInfo); - - const result = await drive.addKeysToIdentity( - identity.getId(), - keysToAdd, - blockInfo, - ); - - expectFeeResult(result); - - const fetchedIdentity = await drive.fetchIdentity(identity.getId()); - - expect(fetchedIdentity.getPublicKeys()).to.have.lengthOf( - identity.getPublicKeys().length + keysToAdd.length, - ); - }); - - it('should not update state with dry run', async () => { - initialRootHash = await drive.getGroveDB().getRootHash(); - - const keysToAdd = [identity.getPublicKeys().pop()]; - - const result = await drive.addKeysToIdentity( - identity.getId(), - keysToAdd, - blockInfo, - false, - true, - ); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.deep.equals(initialRootHash); - }); - }); - - describe('#disableIdentityKeys', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should disable specified identity keys', async () => { - await drive.insertIdentity(identity, blockInfo); - - const keyIds = identity.getPublicKeys().map((key) => key.getId()); - const disableAt = Date.now(); - - const result = await drive.disableIdentityKeys( - identity.getId(), - keyIds, - disableAt, - blockInfo, - ); - - expectFeeResult(result); - - const fetchedIdentity = await drive.fetchIdentity(identity.getId()); - - expect(fetchedIdentity.getPublicKeys()).to.have.lengthOf(identity.getPublicKeys().length); - - fetchedIdentity.getPublicKeys().forEach((key) => { - expect(key.getDisabledAt()).to.equals(disableAt); - }); - }); - - it('should not update state with dry run', async () => { - const keyIds = identity.getPublicKeys().map((key) => key.getId()); - const disableAt = Date.now(); - - const result = await drive.disableIdentityKeys( - identity.getId(), - keyIds, - disableAt, - blockInfo, - false, - true, - ); - - expectFeeResult(result); - - expect(await drive.getGroveDB().getRootHash()).to.deep.equals(initialRootHash); - }); - }); - - describe('#updateIdentityRevision', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - - initialRootHash = await drive.getGroveDB().getRootHash(); - }); - - it('should update identity revision', async () => { - await drive.insertIdentity(identity, blockInfo); - - const revision = 2; - - const result = await drive.updateIdentityRevision( - identity.getId(), - revision, - blockInfo, - ); - - expect(result).to.be.an.instanceOf(FeeResult); - - expect(result.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(result.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - - const fetchedIdentity = await drive.fetchIdentity(identity.getId()); - - expect(fetchedIdentity.getRevision()).to.equals(revision); - }); - - it('should not update state with dry run', async () => { - const result = await drive.updateIdentityRevision( - identity.getId(), - 2, - blockInfo, - false, - true, - ); - - expect(result).to.be.an.instanceOf(FeeResult); - - expect(result.processingFee).to.greaterThan(0, 'processing fee must be higher than 0'); - expect(result.storageFee).to.be.equal(0, 'storage fee must be equal to 0'); - - expect(await drive.getGroveDB().getRootHash()).to.deep.equals(initialRootHash); - }); - }); - - describe('#fetchLatestWithdrawalTransactionIndex', () => { - beforeEach(async () => { - await drive.createInitialStateStructure(); - }); - - it('should return 0 on the first call', async () => { - const result = await drive.fetchLatestWithdrawalTransactionIndex({ - height: 1, - epoch: 1, - timeMs: (new Date()).getTime(), - }); - - expect(result).to.equal(0); - }); - }); - - describe('ABCI', () => { - let initChainRequest; - - function generateRequiredIdentityPublicKeysSet() { - return { - master: new PrivateKey().toPublicKey().toBuffer(), - high: new PrivateKey().toPublicKey().toBuffer(), - }; - } - - beforeEach(() => { - initChainRequest = { - genesisTimeMs: Date.now(), - systemIdentityPublicKeys: { - masternodeRewardSharesContractOwner: generateRequiredIdentityPublicKeysSet(), - featureFlagsContractOwner: generateRequiredIdentityPublicKeysSet(), - dpnsContractOwner: generateRequiredIdentityPublicKeysSet(), - withdrawalsContractOwner: generateRequiredIdentityPublicKeysSet(), - dashpayContractOwner: generateRequiredIdentityPublicKeysSet(), - }, - }; - }); - - describe('InitChain', () => { - it('should successfully init chain', async () => { - const response = await drive.getAbci().initChain(initChainRequest); - - expect(response).to.be.empty('object'); - }); - }); - - describe('BlockBegin', () => { - beforeEach(async () => { - await drive.getAbci().initChain(initChainRequest); - }); - - it('should process a block without previous block time', async () => { - const request = { - blockHeight: 1, - blockTimeMs: (new Date()).getTime(), - proposerProTxHash: Buffer.alloc(32, 1), - proposedAppVersion: 1, - validatorSetQuorumHash: Buffer.alloc(32, 2), - lastSyncedCoreHeight: 1, - coreChainLockedHeight: 1, - totalHpmns: 100, - }; - - const response = await drive.getAbci().blockBegin(request); - - expect(response.unsignedWithdrawalTransactions).to.be.empty(); - expect(response.epochInfo).to.deep.equal({ - currentEpochIndex: 0, - isEpochChange: true, - previousEpochIndex: null, - }); - }); - - it('should process a block with previous block time', async () => { - const blockTimeMs = (new Date()).getTime(); - - await drive.getAbci().blockBegin({ - blockHeight: 1, - blockTimeMs, - proposerProTxHash: Buffer.alloc(32, 1), - proposedAppVersion: 1, - validatorSetQuorumHash: Buffer.alloc(32, 2), - lastSyncedCoreHeight: 1, - coreChainLockedHeight: 1, - totalHpmns: 100, - }); - - const response = await drive.getAbci().blockBegin({ - blockHeight: 2, - blockTimeMs: blockTimeMs + 100, - proposerProTxHash: Buffer.alloc(32, 1), - previousBlockTimeMs: blockTimeMs, - proposedAppVersion: 1, - validatorSetQuorumHash: Buffer.alloc(32, 2), - lastSyncedCoreHeight: 1, - coreChainLockedHeight: 1, - totalHpmns: 100, - }); - - expect(response.unsignedWithdrawalTransactions).to.be.empty(); - expect(response.epochInfo).to.deep.equal({ - currentEpochIndex: 0, - isEpochChange: false, - previousEpochIndex: null, - }); - }); - }); - - describe('BlockEnd', () => { - beforeEach(async () => { - await drive.getAbci().initChain(initChainRequest); - - await drive.getAbci().blockBegin({ - blockHeight: 1, - blockTimeMs: (new Date()).getTime(), - proposedAppVersion: 1, - proposerProTxHash: Buffer.alloc(32, 1), - validatorSetQuorumHash: Buffer.alloc(32, 2), - lastSyncedCoreHeight: 1, - coreChainLockedHeight: 1, - totalHpmns: 100, - }); - }); - - it('should process a block', async () => { - const request = { - fees: { - storageFee: 0, - processingFee: 0, - refundsPerEpoch: {}, - }, - }; - - const response = await drive.getAbci().blockEnd(request); - - expect(response).to.have.property('proposersPaidCount'); - expect(response).to.have.property('paidEpochIndex'); - expect(response).to.have.property('refundedEpochsCount'); - }); - }); - - describe('AfterFinalizeBlock', () => { - beforeEach(async function beforeEach() { - this.timeout(10000); - - await drive.getAbci().initChain(initChainRequest); - - await drive.createContract(dataContract, blockInfo); - await drive.createContract(withdrawalsDataContract, blockInfo); - - await drive.getAbci().blockBegin({ - blockHeight: 1, - blockTimeMs: (new Date()).getTime(), - proposedAppVersion: 1, - proposerProTxHash: Buffer.alloc(32, 1), - validatorSetQuorumHash: Buffer.alloc(32, 2), - lastSyncedCoreHeight: 1, - coreChainLockedHeight: 1, - totalHpmns: 100, - }); - - await drive.getAbci().blockEnd({ - fees: { - storageFee: 0, - processingFee: 0, - refundsPerEpoch: {}, - }, - }); - }); - - it('should process a block', async function it() { - this.timeout(10000); - - const request = { - updatedDataContractIds: [dataContract.getId()], - }; - - const response = await drive.getAbci().afterFinalizeBlock(request); - - expect(response).to.be.empty(); - }); - }); - }); - - describe('.calculateStorageFeeDistributionAmountAndLeftovers', () => { - it('should calculate amount and leftovers', () => { - const result = Drive.calculateStorageFeeDistributionAmountAndLeftovers(1000, 1, 2); - - expect(result).to.be.an.instanceOf(Array); - expect(result).to.be.lengthOf(2); - - const [amount, leftovers] = result; - - expect(amount).to.equals(556); - expect(leftovers).to.equals(440); - }); - }); -}); diff --git a/packages/rs-drive-nodejs/test/GroveDB.spec.js b/packages/rs-drive-nodejs/test/GroveDB.spec.js deleted file mode 100644 index 0e2000d161a..00000000000 --- a/packages/rs-drive-nodejs/test/GroveDB.spec.js +++ /dev/null @@ -1,1240 +0,0 @@ -const fs = require('fs'); - -const { expect, use } = require('chai'); -use(require('dirty-chai')); - -const Drive = require('../Drive'); - -const TEST_DATA_PATH = './test_data'; - -describe('GroveDB', () => { - let drive; - let groveDb; - let treeKey; - let itemKey; - let itemValue; - let rootTreePath; - let itemTreePath; - let otherTreeKey; - - beforeEach(() => { - drive = new Drive(TEST_DATA_PATH, { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - groveDb = drive.getGroveDB(); - - treeKey = Buffer.from('test_tree'); - itemKey = Buffer.from('test_key'); - itemValue = Buffer.from('very nice test value'); - - rootTreePath = []; - itemTreePath = [treeKey]; - - otherTreeKey = Buffer.from('other_tree'); - }); - - afterEach(async () => { - await drive.close(); - - fs.rmSync(TEST_DATA_PATH, { recursive: true }); - }); - - it('should store and retrieve reference', async () => { - await groveDb.insert( - rootTreePath, - otherTreeKey, - { type: 'tree', epoch: 0 }, - ); - - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - await groveDb.insert( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: itemValue }, - ); - - await groveDb.insert( - [otherTreeKey], - itemKey, - { - type: 'reference', - epoch: 0, - value: { - type: 'absolutePathReference', - path: [...itemTreePath, itemKey], - }, - }, - ); - - const result = await groveDb.get( - [otherTreeKey], - itemKey, - ); - - expect(result).to.exist(); - expect(result.type).to.equals('item'); - expect(result.value).to.deep.equals(itemValue); - }); - - it('should store and retrieve a value', async () => { - // Making a subtree to insert items into - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - // Inserting an item into the subtree - await groveDb.insert( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: itemValue }, - ); - - const element = await groveDb.get(itemTreePath, itemKey); - - expect(element.type).to.be.equal('item'); - expect(element.value).to.deep.equal(itemValue); - }); - - it('should store and delete a value', async () => { - // Making a subtree to insert items into - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - // Inserting an item into the subtree - await groveDb.insert( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: itemValue }, - ); - - // Get item - const element = await groveDb.get(itemTreePath, itemKey); - - expect(element.type).to.be.equal('item'); - expect(element.value).to.deep.equal(itemValue); - - // Delete an item from the subtree - await groveDb.delete( - itemTreePath, - itemKey, - ); - - try { - await groveDb.get(itemTreePath, itemKey); - - expect.fail('Expected to throw en error'); - } catch (e) { - expect(e.message).to.be.equal('grovedb: path key not found: key not found in Merk for get: 746573745f6b6579'); - } - }); - - describe('#get', () => { - it('should return error if key is not exist', async () => { - try { - await groveDb.get([], Buffer.from('nothing')); - - expect.fail('should throw an error'); - } catch (e) { - expect(e.message).to.equal('grovedb: path key not found: key not found in Merk for get: 6e6f7468696e67'); - // appendStack wrapper should add call stack to neon binding errors - expect(e.stack).to.not.equal('grovedb: path key not found: key not found in Merk for get: 6e6f7468696e67'); - expect(e.stack).to.be.a('string').and.satisfy((msg) => ( - msg.startsWith('Error: grovedb: path key not found: key not found in Merk for get: 6e6f7468696e67') - )); - } - }); - }); - - describe('#startTransaction', () => { - it('should not allow to read transactional data from main database until it\'s committed', async () => { - // Making a subtree to insert items into - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree' }, - ); - - await groveDb.startTransaction(); - - // Inserting an item into the subtree - await groveDb.insert( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: itemValue }, - true, - ); - - // Inserted value is not yet commited, but can be retrieved by `get` - // with `useTransaction` flag. - const elementInTransaction = await groveDb.get(itemTreePath, itemKey, true); - - expect(elementInTransaction.type).to.be.equal('item'); - expect(elementInTransaction.value).to.deep.equal(itemValue); - - // ... and using `get` without the flag should return no value - try { - await groveDb.get(itemTreePath, itemKey); - - expect.fail('Expected to throw an error'); - } catch (e) { - expect(e.message).to.be.equal('grovedb: path key not found: key not found in Merk for get: 746573745f6b6579'); - } - }); - }); - - describe('#commitTransaction', () => { - it('should commit transactional data to main database', async () => { - // Making a subtree to insert items into - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - await groveDb.startTransaction(); - - // Inserting an item into the subtree - await groveDb.insert( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: itemValue }, - true, - ); - - // ... and using `get` without the flag should return no value - try { - await groveDb.get(itemTreePath, itemKey); - - expect.fail('Expected to throw an error'); - } catch (e) { - expect(e.message).to.be.equal('grovedb: path key not found: key not found in Merk for get: 746573745f6b6579'); - } - - await groveDb.commitTransaction(); - - // When committed, the value should be accessible without running transaction - const element = await groveDb.get(itemTreePath, itemKey); - expect(element.type).to.be.equal('item'); - expect(element.value).to.deep.equal(itemValue); - }); - }); - - describe('#rollbackTransaction', () => { - it('should rollaback transaction state to its initial state', async () => { - // Making a subtree to insert items into - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - await groveDb.startTransaction(); - - // Inserting an item into the subtree - await groveDb.insert( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: itemValue }, - true, - ); - - // Should rollback inserted item - await groveDb.rollbackTransaction(); - - try { - await groveDb.get(itemTreePath, itemKey); - - expect.fail('Expected to throw an error'); - } catch (e) { - expect(e.message).to.be.equal('grovedb: path key not found: key not found in Merk for get: 746573745f6b6579'); - } - }); - }); - - describe('#isTransactionStarted', () => { - it('should return true if transaction is started', async () => { - // Making a subtree to insert items into - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0, value: Buffer.alloc(32) }, - ); - - await groveDb.startTransaction(); - - const result = await groveDb.isTransactionStarted(); - - // eslint-disable-next-line no-unused-expressions - expect(result).to.be.true; - }); - - it('should return false if transaction is not started', async () => { - const result = await groveDb.isTransactionStarted(); - - // eslint-disable-next-line no-unused-expressions - expect(result).to.be.false; - }); - }); - - describe('#abortTransaction', () => { - it('should abort transaction', async () => { - // Making a subtree to insert items into - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - await groveDb.startTransaction(); - - // Inserting an item into the subtree - await groveDb.insert( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: itemValue }, - true, - ); - - // Should abort inserted item - await groveDb.abortTransaction(); - - const isTransactionStarted = await groveDb.isTransactionStarted(); - - // eslint-disable-next-line no-unused-expressions - expect(isTransactionStarted).to.be.false; - - try { - await groveDb.get(itemTreePath, itemKey); - - expect.fail('Expected to throw an error'); - } catch (e) { - expect(e.message).to.be.equal('grovedb: path key not found: key not found in Merk for get: 746573745f6b6579'); - } - }); - }); - - describe('#insertIfNotExists', () => { - it('should insert a value if key is not exist yet', async () => { - // Making a subtree to insert items into - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - // Inserting an item into the subtree - await groveDb.insertIfNotExists( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: itemValue }, - ); - - const element = await groveDb.get(itemTreePath, itemKey); - - expect(element.type).to.equal('item'); - expect(element.value).to.deep.equal(itemValue); - }); - - it('shouldn\'t overwrite already stored value', async () => { - // Making a subtree to insert items into - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - // Inserting an item into the subtree - await groveDb.insert( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: itemValue }, - ); - - const newItemValue = Buffer.from('replaced item value'); - - // Inserting an item into the subtree - await groveDb.insertIfNotExists( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: newItemValue }, - ); - - const element = await groveDb.get(itemTreePath, itemKey); - - expect(element.type).to.equal('item'); - expect(element.value).to.deep.equal(itemValue); - }); - }); - - describe('#insert', () => { - it('should be able to insert a tree', async () => { - await groveDb.insert( - [], - Buffer.from('test_tree'), - { type: 'tree', epoch: 0 }, - ); - }); - - it('should throw when trying to insert non-existent element type', async () => { - const path = []; - const key = Buffer.from('test_key'); - - try { - await groveDb.insert( - path, - key, - { type: 'not_a_tree', epoch: 0 }, - ); - - expect.fail('Expected to throw en error'); - } catch (e) { - expect(e.message).to.be.equal('Unexpected element type not_a_tree'); - } - }); - }); - - describe('auxiliary data methods', () => { - let key; - let value; - - beforeEach(() => { - key = Buffer.from('aux_key'); - value = Buffer.from('ayy'); - }); - - it('should be able to store and get aux data', async () => { - await groveDb.putAux(key, value); - - const result = await groveDb.getAux(key); - - expect(result).to.deep.equal(value); - }); - - it('should be able to insert and delete aux data', async () => { - await groveDb.putAux(key, value); - - await groveDb.deleteAux(key); - - const result = await groveDb.getAux(key); - - // eslint-disable-next-line no-unused-expressions - expect(result).to.be.null; - }); - }); - - describe('#query', () => { - let aValue; - let aKey; - let bValue; - let bKey; - let cValue; - let cKey; - - beforeEach(async () => { - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - aValue = Buffer.from('a'); - aKey = Buffer.from('aKey'); - bValue = Buffer.from('b'); - bKey = Buffer.from('bKey'); - cValue = Buffer.from('c'); - cKey = Buffer.from('cKey'); - - await groveDb.insert( - itemTreePath, - aKey, - { type: 'item', epoch: 0, value: aValue }, - ); - - await groveDb.insert( - itemTreePath, - bKey, - { type: 'item', epoch: 0, value: bValue }, - ); - - await groveDb.insert( - itemTreePath, - cKey, - { type: 'item', epoch: 0, value: cValue }, - ); - }); - - it('should be able to use limit', async () => { - const query = { - path: itemTreePath, - query: { - limit: 1, - query: { - items: [ - { - type: 'rangeFrom', - from: bValue, - }, - ], - }, - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - bValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to use offset', async () => { - const query = { - path: itemTreePath, - query: { - offset: 1, - query: { - items: [ - { - type: 'rangeFrom', - from: bValue, - }, - ], - }, - - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - cValue, - ]); - - expect(skipped).to.equals(1); - }); - - it('should be able to retrieve data using `key`', async () => { - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'key', - key: aKey, - }, - { - type: 'key', - key: bKey, - }, - ], - }, - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - aValue, - bValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to retrieve data using `range`', async () => { - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'range', - from: aKey, - to: cKey, - }, - ], - }, - - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - aValue, - bValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to retrieve data using `rangeInclusive`', async () => { - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'rangeInclusive', - from: aKey, - to: bKey, - }, - ], - }, - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - aValue, - bValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to retrieve data using `rangeFull`', async () => { - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'rangeFull', - }, - ], - }, - - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - aValue, - bValue, - cValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to retrieve data using `rangeFrom`', async () => { - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'rangeFrom', - from: bKey, - }, - ], - }, - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - bValue, - cValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to retrieve data using `rangeTo`', async () => { - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'rangeTo', - to: cKey, - }, - ], - }, - - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - aValue, - bValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to retrieve data using `rangeToInclusive`', async () => { - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'rangeToInclusive', - to: cKey, - }, - ], - }, - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - aValue, - bValue, - cValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to retrieve data using `rangeAfter`', async () => { - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'rangeAfter', - after: aKey, - }, - ], - }, - - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - bValue, - cValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to retrieve data using `rangeAfterTo`', async () => { - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'rangeAfterTo', - after: aKey, - to: cKey, - }, - ], - }, - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - bValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to retrieve data using `rangeAfterToInclusive`', async () => { - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'rangeAfterToInclusive', - after: aKey, - to: cKey, - }, - ], - }, - - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - bValue, - cValue, - ]); - - expect(skipped).to.equals(0); - }); - - it('should be able to retrieve data with subquery', async () => { - // Prepare tree structure - const dKey = Buffer.from('dKey'); - const daValue = Buffer.from('da'); - const dbValue = Buffer.from('db'); - const dcValue = Buffer.from('dc'); - const eaValue = Buffer.from('ea'); - const eaKey = Buffer.from('eaKey'); - const ebValue = Buffer.from('eb'); - - const dPath = [...itemTreePath]; - - dPath.push(dKey); - - await groveDb.insert( - itemTreePath, - dKey, - { type: 'tree', epoch: 0 }, - ); - - await groveDb.insert( - dPath, - Buffer.from('daKey'), - { type: 'item', epoch: 0, value: daValue }, - ); - - await groveDb.insert( - dPath, - Buffer.from('dbKey'), - { type: 'item', epoch: 0, value: dbValue }, - ); - - await groveDb.insert( - dPath, - Buffer.from('dcKey'), - { type: 'item', epoch: 0, value: dcValue }, - ); - - const eKey = Buffer.from('eKey'); - - const ePath = [...itemTreePath]; - ePath.push(eKey); - await groveDb.insert( - itemTreePath, - eKey, - { type: 'tree', epoch: 0 }, - ); - - await groveDb.insert( - ePath, - Buffer.from('eaKey'), - { type: 'item', epoch: 0, value: eaValue }, - ); - - await groveDb.insert( - ePath, - Buffer.from('ebKey'), - { type: 'item', epoch: 0, value: ebValue }, - ); - - // This should give us only last subtree and apply subquery to it - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'rangeAfter', - after: dKey, - }, - ], - subquery: { - items: [ - { - type: 'rangeAfter', - after: eaKey, - }, - ], - }, - }, - }, - }; - - const result = await groveDb.query(query); - - expect(result).to.have.a.lengthOf(2); - - const [elementValues, skipped] = result; - - expect(elementValues).to.deep.equals([ - ebValue, - ]); - - expect(skipped).to.equals(0); - }); - }); - - describe('#proveQuery', () => { - let dPath; - let dKey; - let ePath; - - let daValue; - let dbValue; - let dcValue; - let eaValue; - let eaKey; - let ebValue; - - beforeEach(async () => { - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - dKey = Buffer.from('dKey'); - daValue = Buffer.from('da'); - dbValue = Buffer.from('db'); - dcValue = Buffer.from('dc'); - eaValue = Buffer.from('ea'); - eaKey = Buffer.from('eaKey'); - ebValue = Buffer.from('eb'); - - dPath = [...itemTreePath]; - dPath.push(dKey); - await groveDb.insert( - itemTreePath, - dKey, - { type: 'tree', epoch: 0 }, - ); - - await groveDb.insert( - dPath, - Buffer.from('daKey'), - { type: 'item', epoch: 0, value: daValue }, - ); - - await groveDb.insert( - dPath, - Buffer.from('dbKey'), - { type: 'item', epoch: 0, value: dbValue }, - ); - - await groveDb.insert( - dPath, - Buffer.from('dcKey'), - { type: 'item', epoch: 0, value: dcValue }, - ); - - const eKey = Buffer.from('eKey'); - ePath = [...itemTreePath]; - ePath.push(eKey); - await groveDb.insert( - itemTreePath, - eKey, - { type: 'tree', epoch: 0 }, - ); - - await groveDb.insert( - ePath, - Buffer.from('eaKey'), - { type: 'item', epoch: 0, value: eaValue }, - ); - - await groveDb.insert( - ePath, - Buffer.from('ebKey'), - { type: 'item', epoch: 0, value: ebValue }, - ); - }); - - it('should be able to retrieve provable data with subquery', async () => { - // This should give us only last subtree and apply subquery to it - const query = { - path: itemTreePath, - query: { - query: { - items: [ - { - type: 'rangeAfter', - after: dKey, - }, - ], - subquery: { - items: [ - { - type: 'rangeAfter', - after: eaKey, - }, - ], - }, - }, - }, - }; - - const result = await groveDb.proveQuery(query); - - expect(result).to.exist(); - - expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(213); - }); - }); - - describe('#proveQueryMany', () => { - let dPath; - let dKey; - let ePath; - - let daValue; - let dbValue; - let dcValue; - let eaValue; - let eaKey; - let ebValue; - - beforeEach(async () => { - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - dKey = Buffer.from('dKey'); - daValue = Buffer.from('da'); - dbValue = Buffer.from('db'); - dcValue = Buffer.from('dc'); - eaValue = Buffer.from('ea'); - eaKey = Buffer.from('eaKey'); - ebValue = Buffer.from('eb'); - - dPath = [...itemTreePath]; - dPath.push(dKey); - await groveDb.insert( - itemTreePath, - dKey, - { type: 'tree', epoch: 0 }, - ); - - await groveDb.insert( - dPath, - Buffer.from('daKey'), - { type: 'item', epoch: 0, value: daValue }, - ); - - await groveDb.insert( - dPath, - Buffer.from('dbKey'), - { type: 'item', epoch: 0, value: dbValue }, - ); - - await groveDb.insert( - dPath, - Buffer.from('dcKey'), - { type: 'item', epoch: 0, value: dcValue }, - ); - - const eKey = Buffer.from('eKey'); - ePath = [...itemTreePath]; - ePath.push(eKey); - await groveDb.insert( - itemTreePath, - eKey, - { type: 'tree' }, - ); - - await groveDb.insert( - ePath, - Buffer.from('eaKey'), - { type: 'item', epoch: 0, value: eaValue }, - ); - - const ownerId = Buffer.alloc(32).fill('c'); - - await groveDb.insert( - ePath, - Buffer.from('ebKey'), - { - type: 'item', - epoch: 0, - ownerId, - value: ebValue, - }, - ); - }); - - it('should be able to prove query', async () => { - const query1 = { - path: ePath, - query: { - query: { - items: [ - { - type: 'key', - key: dKey, - }, - ], - }, - }, - }; - - const query2 = { - path: dPath, - query: { - query: { - items: [ - { - type: 'key', - key: eaKey, - }, - ], - }, - }, - }; - - const result = await groveDb.proveQueryMany([query1, query2]); - - expect(result).to.exist(); - - expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(348); - }); - }); - - describe('#flush', () => { - it('should flush data on disc', async () => { - await groveDb.insert( - [], - Buffer.from('test_tree'), - { type: 'tree', epoch: 0 }, - ); - - await groveDb.flush(); - }); - }); - - describe('#getRootHash', () => { - it('should return empty root hash if there is no data', async () => { - const result = await groveDb.getRootHash(); - - expect(result).to.deep.equal(Buffer.alloc(32)); - - // Get root hash for transaction too - await groveDb.startTransaction(); - - const transactionalResult = await groveDb.getRootHash(true); - - expect(transactionalResult).to.deep.equal(Buffer.alloc(32)); - }); - - it('should root hash', async () => { - // Making a subtree to insert items into - await groveDb.insert( - rootTreePath, - treeKey, - { type: 'tree', epoch: 0 }, - ); - - // Inserting an item into the subtree - await groveDb.insert( - itemTreePath, - itemKey, - { type: 'item', epoch: 0, value: itemValue }, - ); - - await groveDb.startTransaction(); - - // Inserting an item into the subtree - await groveDb.insert( - itemTreePath, - Buffer.from('transactional_test_key'), - { type: 'item', epoch: 0, value: itemValue }, - true, - ); - - const result = await groveDb.getRootHash(); - const transactionalResult = await groveDb.getRootHash(true); - - // Hashes shouldn't be equal - expect(result).to.not.deep.equal(transactionalResult); - - // Hashes shouldn't be empty - - // eslint-disable-next-line no-unused-expressions - expect(result >= Buffer.alloc(32)).to.be.true; - - // eslint-disable-next-line no-unused-expressions - expect(transactionalResult >= Buffer.alloc(32)).to.be.true; - }); - }); -}); diff --git a/packages/rs-drive-nodejs/test/utils.js b/packages/rs-drive-nodejs/test/utils.js deleted file mode 100644 index c5e0fd37539..00000000000 --- a/packages/rs-drive-nodejs/test/utils.js +++ /dev/null @@ -1,16 +0,0 @@ -const { expect } = require('chai'); -const FeeResult = require('../FeeResult'); - -/** - * @param {FeeResult} feeResult - */ -function expectFeeResult(feeResult) { - expect(feeResult).to.be.an.instanceOf(FeeResult); - - expect(feeResult.processingFee).to.be.greaterThan(0, 'processing fee must be higher than 0'); - expect(feeResult.storageFee).to.be.greaterThan(0, 'storage fee must be higher than 0'); -} - -module.exports = { - expectFeeResult, -}; From a32965e69c0a56c6cb0e280351a05971666585d5 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Tue, 18 Apr 2023 16:56:42 +0200 Subject: [PATCH 2/3] chore(js-drive): remove unused js-drive --- .pnp.cjs | 703 ---- package.json | 3 +- packages/js-drive/.env.example | 71 - packages/js-drive/.eslintrc | 36 - packages/js-drive/.mocharc.yml | 4 - packages/js-drive/CHANGELOG.md | 509 --- packages/js-drive/Dockerfile | 114 - packages/js-drive/LICENSE | 20 - packages/js-drive/README.md | 55 - packages/js-drive/db/.gitignore | 2 - .../lib/abci/closeAbciServerFactory.js | 25 - .../lib/abci/errors/AbstractAbciError.js | 68 - .../lib/abci/errors/DPPValidationAbciError.js | 44 - .../lib/abci/errors/InternalAbciError.js | 25 - .../abci/errors/InvalidArgumentAbciError.js | 16 - .../lib/abci/errors/NotFoundAbciError.js | 16 - .../lib/abci/errors/UnavailableAbciError.js | 16 - .../lib/abci/errors/UnimplementedAbciError.js | 16 - .../abci/errors/VerboseInternalAbciError.js | 30 - .../abci/errors/createContextLoggerFactory.js | 24 - .../enrichErrorWithContextLoggerFactory.js | 39 - .../abci/errors/wrapInErrorHandlerFactory.js | 63 - .../abci/handlers/checkTxHandlerFactory.js | 44 - .../NetworkProtocolVersionIsNotSetError.js | 9 - ...NotSupportedNetworkProtocolVersionError.js | 30 - .../abci/handlers/extendVoteHandlerFactory.js | 67 - .../handlers/finalizeBlockHandlerFactory.js | 145 - .../lib/abci/handlers/infoHandlerFactory.js | 94 - .../abci/handlers/initChainHandlerFactory.js | 150 - .../handlers/prepareProposalHandlerFactory.js | 189 - .../handlers/processProposalHandlerFactory.js | 99 - .../handlers/proposal/beginBlockFactory.js | 224 -- .../broadcastWithdrawalTransactionsFactory.js | 64 - .../createConsensusParamUpdateFactory.js | 69 - .../createCoreChainLockUpdateFactory.js | 49 - .../handlers/proposal/deliverTxFactory.js | 281 -- .../abci/handlers/proposal/endBlockFactory.js | 125 - .../fees/addStateTransitionFeesToBlockFees.js | 21 - .../proposal/processProposalFactory.js | 139 - ...otateAndCreateValidatorSetUpdateFactory.js | 51 - .../lib/abci/handlers/proposal/statuses.js | 5 - .../proposal/verifyChainLockFactory.js | 69 - .../query/dataContractQueryHandlerFactory.js | 74 - .../query/documentQueryHandlerFactory.js | 97 - .../query/getProofsQueryHandlerFactory.js | 110 - ...iesByPublicKeyHashesQueryHandlerFactory.js | 70 - .../query/identityQueryHandlerFactory.js | 75 - .../response/createQueryResponseFactory.js | 65 - .../lib/abci/handlers/queryHandlerFactory.js | 58 - .../unserializeStateTransitionFactory.js | 120 - packages/js-drive/lib/abci/handlers/timers.js | 10 - .../validator/createValidatorSetUpdate.js | 49 - .../verifyVoteExtensionHandlerFactory.js | 92 - .../blockExecution/BlockExecutionContext.js | 383 -- .../BlockExecutionContextRepository.js | 69 - .../js-drive/lib/blockExecution/BlockInfo.js | 54 - .../BlockExecutionContextNotFoundError.js | 23 - .../ContextsAreMoreThanStackMaxSizeError.js | 9 - .../js-drive/lib/core/LatestCoreChainLock.js | 42 - .../lib/core/SimplifiedMasternodeList.js | 47 - packages/js-drive/lib/core/ZmqClient.js | 129 - packages/js-drive/lib/core/ensureBlock.js | 35 - .../lib/core/errors/MissingChainLockError.js | 11 - .../errors/NotEnoughBlocksForValidSMLError.js | 23 - .../lib/core/errors/QuorumsNotFoundError.js | 31 - .../lib/core/fetchQuorumMembersFactory.js | 38 - .../lib/core/fetchSimplifiedMNListFactory.js | 23 - .../lib/core/fetchTransactionFactory.js | 33 - .../lib/core/getRandomQuorumFactory.js | 113 - .../updateSimplifiedMasternodeListFactory.js | 113 - .../core/waitForChainLockedHeightFactory.js | 49 - .../core/waitForCoreChainLockSyncFactory.js | 103 - .../lib/core/waitForCoreSyncFactory.js | 47 - packages/js-drive/lib/createDIContainer.js | 894 ----- .../DataContractStoreRepository.js | 181 - .../lib/document/DocumentRepository.js | 330 -- .../lib/document/errors/InvalidQueryError.js | 7 - .../lib/document/fetchDataContractFactory.js | 44 - .../lib/document/fetchDocumentsFactory.js | 46 - .../groveDB/createDocumentTreePath.js | 15 - .../lib/document/proveDocumentsFactory.js | 39 - .../lib/dpp/CachedStateRepositoryDecorator.js | 344 -- .../js-drive/lib/dpp/DriveStateRepository.js | 660 ---- .../lib/dpp/LoggedStateRepositoryDecorator.js | 676 ---- packages/js-drive/lib/errorHandlerFactory.js | 59 - packages/js-drive/lib/errors/DriveError.js | 23 - .../getFeatureFlagForHeightFactory.js | 48 - .../getLatestFeatureFlagFactory.js | 52 - .../IdentityBalanceStoreRepository.js | 200 - .../IdentityPublicKeyStoreRepository.js | 109 - .../lib/identity/IdentityStoreRepository.js | 295 -- .../SpentAssetLockTransactionsRepository.js | 73 - .../LastSyncedCoreHeightRepository.js | 68 - .../createMasternodeIdentityFactory.js | 83 - .../masternode/createOperatorIdentifier.js | 20 - .../createRewardShareDocumentFactory.js | 88 - .../masternode/createVotingIdentifier.js | 21 - .../InvalidIdentityPublicKeyTypeError.js | 22 - .../errors/InvalidMasternodeIdentityError.js | 23 - .../errors/InvalidPayoutScriptError.js | 22 - .../getPublicKeyFromPayoutScript.js | 21 - ...thdrawPubKeyTypeFromPayoutScriptFactory.js | 38 - .../masternode/handleNewMasternodeFactory.js | 128 - .../handleRemovedMasternodeFactory.js | 63 - .../handleUpdatedPubKeyOperatorFactory.js | 145 - .../handleUpdatedScriptPayoutFactory.js | 117 - .../handleUpdatedVotingAddressFactory.js | 77 - .../synchronizeMasternodeIdentitiesFactory.js | 258 -- ...WithdrawalTransactionIdAndStatusFactory.js | 76 - packages/js-drive/lib/storage/GroveDBStore.js | 519 --- .../js-drive/lib/storage/StorageResult.js | 68 - packages/js-drive/lib/test/.eslintrc | 9 - packages/js-drive/lib/test/bootstrap.js | 78 - .../lib/test/createTestDIContainer.js | 30 - .../fixtures/createDataContractDocuments.js | 28 - .../lib/test/fixtures/createIndices.js | 36 - .../lib/test/fixtures/createProperties.js | 17 - .../getBlockExecutionContextObjectFixture.js | 90 - .../lib/test/fixtures/getSmlFixture.js | 87 - .../getSystemIdentityPublicKeysFixture.js | 28 - .../test/mock/BlockExecutionContextMock.js | 67 - .../BlockExecutionContextRepositoryMock.js | 15 - .../BlockExecutionStoreTransactionsMock.js | 21 - packages/js-drive/lib/test/mock/DriveMock.js | 29 - .../lib/test/mock/GroveDBStoreMock.js | 43 - packages/js-drive/lib/test/mock/LoggerMock.js | 25 - .../js-drive/lib/test/mock/RootTreeMock.js | 11 - .../lib/test/mock/StateViewTransactionMock.js | 20 - packages/js-drive/lib/test/mock/StoreMock.js | 13 - .../lib/test/mock/StoreRepositoryMock.js | 17 - .../test/mock/getBiggestPossibleIdentity.js | 46 - .../lib/test/util/allocateRandomMemory.js | 16 - .../js-drive/lib/test/util/setTimeoutShim.js | 14 - packages/js-drive/lib/util/ExecutionTimer.js | 95 - .../lib/util/millisToProtoTimestamp.js | 28 - packages/js-drive/lib/util/noopLogger.js | 8 - packages/js-drive/lib/util/printErrorFace.js | 35 - .../lib/util/protoTimestampToMillis.js | 11 - packages/js-drive/lib/util/rejectAfter.js | 25 - packages/js-drive/lib/util/sanitizeUrl.js | 15 - packages/js-drive/lib/util/shuffleArray.js | 14 - packages/js-drive/lib/util/timeToMillis.js | 15 - packages/js-drive/lib/util/wait.js | 10 - packages/js-drive/lib/validator/Validator.js | 72 - .../lib/validator/ValidatorNetworkInfo.js | 29 - .../js-drive/lib/validator/ValidatorSet.js | 171 - .../errors/PublicKeyShareIsNotPresentError.js | 23 - .../ValidatorSetIsNotInitializedError.js | 9 - packages/js-drive/package.json | 104 - packages/js-drive/scripts/abci.js | 181 - packages/js-drive/scripts/echo.js | 34 - packages/js-drive/test/.eslintrc | 12 - packages/js-drive/test/README.md | 54 - .../abci/handlers/queryHandlerFactory.spec.js | 150 - .../BlockExecutionContextRepository.spec.js | 121 - .../core/SimplifiedMasternodeList.spec.js | 103 - ...ateSimplifiedMasternodeListFactory.spec.js | 92 - .../core/waitForCoreSyncFactory.spec.js | 54 - .../integration/createDIContainer.spec.js | 40 - .../DataContractStoreRepository.spec.js | 438 --- .../document/DocumentRepository.spec.js | 3408 ----------------- .../document/fetchDataContractFactory.spec.js | 83 - .../document/fetchDocumentsFactory.spec.js | 221 -- .../document/proveDocumentsFactory.spec.js | 198 - .../integration/fee/feesPrediction.spec.js | 549 --- .../integration/groveDB/GroveDBStore.spec.js | 423 -- .../IdentityBalanceStoreRepository.spec.js | 452 --- .../IdentityPublicKeyStoreRepository.spec.js | 177 - .../identity/IdentityStoreRepository.spec.js | 544 --- ...entAssetLockTransactionsRepository.spec.js | 85 - .../LastSyncedCoreHeightRepository.spec.js | 89 - ...hronizeMasternodeIdentitiesFactory.spec.js | 1093 ------ .../unit/abci/closeAbciServerFactory.spec.js | 29 - ...nrichErrorWithContextLoggerFactory.spec.js | 38 - .../errors/wrapInErrorHandlerFactory.spec.js | 109 - .../handlers/checkTxHandlerFactory.spec.js | 54 - .../handlers/extendVoteHandlerFactory.spec.js | 68 - .../finalizeBlockHandlerFactory.spec.js | 217 -- .../abci/handlers/infoHandlerFactory.spec.js | 129 - .../handlers/initChainHandlerFactory.spec.js | 164 - .../prepareProposalHandlerFactory.spec.js | 232 -- .../processProposalHandlerFactory.spec.js | 160 - .../proposal/beginBlockFactory.spec.js | 278 -- ...dcastWithdrawalTransactionsFactory.spec.js | 69 - .../createConsensusParamUpdateFactory.spec.js | 90 - .../createCoreChainLockUpdateFactory.spec.js | 65 - .../proposal/deliverTxFactory.spec.js | 319 -- .../handlers/proposal/endBlockFactory.spec.js | 134 - .../proposal/processProposalFactory.spec.js | 170 - ...AndCreateValidatorSetUpdateFactory.spec.js | 103 - .../proposal/verifyChainLockFactory.spec.js | 117 - .../dataContractQueryHandlerFactory.spec.js | 124 - .../query/documentQueryHandlerFactory.spec.js | 167 - .../getProofsQueryHandlerFactory.spec.js | 122 - ...PublicKeyHashesQueryHandlerFactory.spec.js | 135 - .../query/identityQueryHandlerFactory.spec.js | 112 - .../createQueryResponseFactory.spec.js | 77 - .../abci/handlers/queryHandlerFactory.spec.js | 129 - .../unserializeStateTransitionFactory.spec.js | 204 - .../createValidatorSetUpdate.spec.js | 57 - .../verifyVoteExtensionHandlerFactory.spec.js | 98 - .../BlockExecutionContext.spec.js | 427 --- .../unit/core/LatestCoreChainLock.spec.js | 44 - .../test/unit/core/ensureBlock.spec.js | 66 - .../unit/core/getRandomQuorumFactory.spec.js | 196 - ...ateSimplifiedMasternodeListFactory.spec.js | 195 - .../waitForChainLockedHeightFactory.spec.js | 63 - .../waitForCoreChainLockSyncFactory.spec.js | 86 - .../CachedStateRepositoryDecorator.spec.js | 247 -- .../unit/dpp/DriveStateRepository.spec.js | 732 ---- .../LoggedStateRepositoryDecorator.spec.js | 983 ----- .../getFeatureFlagForHeightFactory.spec.js | 65 - .../getLatestFeatureFlagFactory.spec.js | 53 - .../createMasternodeIdentityFactory.spec.js | 191 - .../createOperatorIdentifier.spec.js | 23 - .../masternode/createVotingIdentifier.spec.js | 23 - .../getPublicKeyFromPayoutScript.spec.js | 43 - ...wPubKeyTypeFromPayoutScriptFactory.spec.js | 44 - .../handleNewMasternodeFactory.spec.js | 178 - .../handleUpdatedScriptPayoutFactory.spec.js | 157 - .../handleUpdatedVotingAddressFactory.spec.js | 102 - ...rawalTransactionIdAndStatusFactory.spec.js | 89 - .../test/unit/util/ExecutionTimer.spec.js | 43 - .../unit/util/errorHandlerFactory.spec.js | 142 - .../test/unit/util/rejectAfter.spec.js | 34 - .../test/unit/util/sanitizeUrl.spec.js | 13 - packages/js-drive/test/unit/util/wait.spec.js | 30 - .../test/unit/validator/Validator.spec.js | 37 - .../validator/ValidatorNetworkInfo.spec.js | 24 - .../test/unit/validator/ValidatorSet.spec.js | 253 -- yarn.lock | 661 +--- 231 files changed, 19 insertions(+), 30970 deletions(-) delete mode 100644 packages/js-drive/.env.example delete mode 100644 packages/js-drive/.eslintrc delete mode 100644 packages/js-drive/.mocharc.yml delete mode 100644 packages/js-drive/CHANGELOG.md delete mode 100644 packages/js-drive/Dockerfile delete mode 100644 packages/js-drive/LICENSE delete mode 100644 packages/js-drive/README.md delete mode 100644 packages/js-drive/db/.gitignore delete mode 100644 packages/js-drive/lib/abci/closeAbciServerFactory.js delete mode 100644 packages/js-drive/lib/abci/errors/AbstractAbciError.js delete mode 100644 packages/js-drive/lib/abci/errors/DPPValidationAbciError.js delete mode 100644 packages/js-drive/lib/abci/errors/InternalAbciError.js delete mode 100644 packages/js-drive/lib/abci/errors/InvalidArgumentAbciError.js delete mode 100644 packages/js-drive/lib/abci/errors/NotFoundAbciError.js delete mode 100644 packages/js-drive/lib/abci/errors/UnavailableAbciError.js delete mode 100644 packages/js-drive/lib/abci/errors/UnimplementedAbciError.js delete mode 100644 packages/js-drive/lib/abci/errors/VerboseInternalAbciError.js delete mode 100644 packages/js-drive/lib/abci/errors/createContextLoggerFactory.js delete mode 100644 packages/js-drive/lib/abci/errors/enrichErrorWithContextLoggerFactory.js delete mode 100644 packages/js-drive/lib/abci/errors/wrapInErrorHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/checkTxHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/errors/NetworkProtocolVersionIsNotSetError.js delete mode 100644 packages/js-drive/lib/abci/handlers/errors/NotSupportedNetworkProtocolVersionError.js delete mode 100644 packages/js-drive/lib/abci/handlers/extendVoteHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/finalizeBlockHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/infoHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/initChainHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/prepareProposalHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/processProposalHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/beginBlockFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/broadcastWithdrawalTransactionsFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/createConsensusParamUpdateFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/createCoreChainLockUpdateFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/deliverTxFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/endBlockFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/fees/addStateTransitionFeesToBlockFees.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/processProposalFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/rotateAndCreateValidatorSetUpdateFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/statuses.js delete mode 100644 packages/js-drive/lib/abci/handlers/proposal/verifyChainLockFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/query/dataContractQueryHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/query/documentQueryHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/query/getProofsQueryHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/query/identitiesByPublicKeyHashesQueryHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/query/identityQueryHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/query/response/createQueryResponseFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/queryHandlerFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/stateTransition/unserializeStateTransitionFactory.js delete mode 100644 packages/js-drive/lib/abci/handlers/timers.js delete mode 100644 packages/js-drive/lib/abci/handlers/validator/createValidatorSetUpdate.js delete mode 100644 packages/js-drive/lib/abci/handlers/verifyVoteExtensionHandlerFactory.js delete mode 100644 packages/js-drive/lib/blockExecution/BlockExecutionContext.js delete mode 100644 packages/js-drive/lib/blockExecution/BlockExecutionContextRepository.js delete mode 100644 packages/js-drive/lib/blockExecution/BlockInfo.js delete mode 100644 packages/js-drive/lib/blockExecution/errors/BlockExecutionContextNotFoundError.js delete mode 100644 packages/js-drive/lib/blockExecution/errors/ContextsAreMoreThanStackMaxSizeError.js delete mode 100644 packages/js-drive/lib/core/LatestCoreChainLock.js delete mode 100644 packages/js-drive/lib/core/SimplifiedMasternodeList.js delete mode 100644 packages/js-drive/lib/core/ZmqClient.js delete mode 100644 packages/js-drive/lib/core/ensureBlock.js delete mode 100644 packages/js-drive/lib/core/errors/MissingChainLockError.js delete mode 100644 packages/js-drive/lib/core/errors/NotEnoughBlocksForValidSMLError.js delete mode 100644 packages/js-drive/lib/core/errors/QuorumsNotFoundError.js delete mode 100644 packages/js-drive/lib/core/fetchQuorumMembersFactory.js delete mode 100644 packages/js-drive/lib/core/fetchSimplifiedMNListFactory.js delete mode 100644 packages/js-drive/lib/core/fetchTransactionFactory.js delete mode 100644 packages/js-drive/lib/core/getRandomQuorumFactory.js delete mode 100644 packages/js-drive/lib/core/updateSimplifiedMasternodeListFactory.js delete mode 100644 packages/js-drive/lib/core/waitForChainLockedHeightFactory.js delete mode 100644 packages/js-drive/lib/core/waitForCoreChainLockSyncFactory.js delete mode 100644 packages/js-drive/lib/core/waitForCoreSyncFactory.js delete mode 100644 packages/js-drive/lib/createDIContainer.js delete mode 100644 packages/js-drive/lib/dataContract/DataContractStoreRepository.js delete mode 100644 packages/js-drive/lib/document/DocumentRepository.js delete mode 100644 packages/js-drive/lib/document/errors/InvalidQueryError.js delete mode 100644 packages/js-drive/lib/document/fetchDataContractFactory.js delete mode 100644 packages/js-drive/lib/document/fetchDocumentsFactory.js delete mode 100644 packages/js-drive/lib/document/groveDB/createDocumentTreePath.js delete mode 100644 packages/js-drive/lib/document/proveDocumentsFactory.js delete mode 100644 packages/js-drive/lib/dpp/CachedStateRepositoryDecorator.js delete mode 100644 packages/js-drive/lib/dpp/DriveStateRepository.js delete mode 100644 packages/js-drive/lib/dpp/LoggedStateRepositoryDecorator.js delete mode 100644 packages/js-drive/lib/errorHandlerFactory.js delete mode 100644 packages/js-drive/lib/errors/DriveError.js delete mode 100644 packages/js-drive/lib/featureFlag/getFeatureFlagForHeightFactory.js delete mode 100644 packages/js-drive/lib/featureFlag/getLatestFeatureFlagFactory.js delete mode 100644 packages/js-drive/lib/identity/IdentityBalanceStoreRepository.js delete mode 100644 packages/js-drive/lib/identity/IdentityPublicKeyStoreRepository.js delete mode 100644 packages/js-drive/lib/identity/IdentityStoreRepository.js delete mode 100644 packages/js-drive/lib/identity/SpentAssetLockTransactionsRepository.js delete mode 100644 packages/js-drive/lib/identity/masternode/LastSyncedCoreHeightRepository.js delete mode 100644 packages/js-drive/lib/identity/masternode/createMasternodeIdentityFactory.js delete mode 100644 packages/js-drive/lib/identity/masternode/createOperatorIdentifier.js delete mode 100644 packages/js-drive/lib/identity/masternode/createRewardShareDocumentFactory.js delete mode 100644 packages/js-drive/lib/identity/masternode/createVotingIdentifier.js delete mode 100644 packages/js-drive/lib/identity/masternode/errors/InvalidIdentityPublicKeyTypeError.js delete mode 100644 packages/js-drive/lib/identity/masternode/errors/InvalidMasternodeIdentityError.js delete mode 100644 packages/js-drive/lib/identity/masternode/errors/InvalidPayoutScriptError.js delete mode 100644 packages/js-drive/lib/identity/masternode/getPublicKeyFromPayoutScript.js delete mode 100644 packages/js-drive/lib/identity/masternode/getWithdrawPubKeyTypeFromPayoutScriptFactory.js delete mode 100644 packages/js-drive/lib/identity/masternode/handleNewMasternodeFactory.js delete mode 100644 packages/js-drive/lib/identity/masternode/handleRemovedMasternodeFactory.js delete mode 100644 packages/js-drive/lib/identity/masternode/handleUpdatedPubKeyOperatorFactory.js delete mode 100644 packages/js-drive/lib/identity/masternode/handleUpdatedScriptPayoutFactory.js delete mode 100644 packages/js-drive/lib/identity/masternode/handleUpdatedVotingAddressFactory.js delete mode 100644 packages/js-drive/lib/identity/masternode/synchronizeMasternodeIdentitiesFactory.js delete mode 100644 packages/js-drive/lib/identity/withdrawals/updateWithdrawalTransactionIdAndStatusFactory.js delete mode 100644 packages/js-drive/lib/storage/GroveDBStore.js delete mode 100644 packages/js-drive/lib/storage/StorageResult.js delete mode 100644 packages/js-drive/lib/test/.eslintrc delete mode 100644 packages/js-drive/lib/test/bootstrap.js delete mode 100644 packages/js-drive/lib/test/createTestDIContainer.js delete mode 100644 packages/js-drive/lib/test/fixtures/createDataContractDocuments.js delete mode 100644 packages/js-drive/lib/test/fixtures/createIndices.js delete mode 100644 packages/js-drive/lib/test/fixtures/createProperties.js delete mode 100644 packages/js-drive/lib/test/fixtures/getBlockExecutionContextObjectFixture.js delete mode 100644 packages/js-drive/lib/test/fixtures/getSmlFixture.js delete mode 100644 packages/js-drive/lib/test/fixtures/getSystemIdentityPublicKeysFixture.js delete mode 100644 packages/js-drive/lib/test/mock/BlockExecutionContextMock.js delete mode 100644 packages/js-drive/lib/test/mock/BlockExecutionContextRepositoryMock.js delete mode 100644 packages/js-drive/lib/test/mock/BlockExecutionStoreTransactionsMock.js delete mode 100644 packages/js-drive/lib/test/mock/DriveMock.js delete mode 100644 packages/js-drive/lib/test/mock/GroveDBStoreMock.js delete mode 100644 packages/js-drive/lib/test/mock/LoggerMock.js delete mode 100644 packages/js-drive/lib/test/mock/RootTreeMock.js delete mode 100644 packages/js-drive/lib/test/mock/StateViewTransactionMock.js delete mode 100644 packages/js-drive/lib/test/mock/StoreMock.js delete mode 100644 packages/js-drive/lib/test/mock/StoreRepositoryMock.js delete mode 100644 packages/js-drive/lib/test/mock/getBiggestPossibleIdentity.js delete mode 100644 packages/js-drive/lib/test/util/allocateRandomMemory.js delete mode 100644 packages/js-drive/lib/test/util/setTimeoutShim.js delete mode 100644 packages/js-drive/lib/util/ExecutionTimer.js delete mode 100644 packages/js-drive/lib/util/millisToProtoTimestamp.js delete mode 100644 packages/js-drive/lib/util/noopLogger.js delete mode 100644 packages/js-drive/lib/util/printErrorFace.js delete mode 100644 packages/js-drive/lib/util/protoTimestampToMillis.js delete mode 100644 packages/js-drive/lib/util/rejectAfter.js delete mode 100644 packages/js-drive/lib/util/sanitizeUrl.js delete mode 100644 packages/js-drive/lib/util/shuffleArray.js delete mode 100644 packages/js-drive/lib/util/timeToMillis.js delete mode 100644 packages/js-drive/lib/util/wait.js delete mode 100644 packages/js-drive/lib/validator/Validator.js delete mode 100644 packages/js-drive/lib/validator/ValidatorNetworkInfo.js delete mode 100644 packages/js-drive/lib/validator/ValidatorSet.js delete mode 100644 packages/js-drive/lib/validator/errors/PublicKeyShareIsNotPresentError.js delete mode 100644 packages/js-drive/lib/validator/errors/ValidatorSetIsNotInitializedError.js delete mode 100644 packages/js-drive/package.json delete mode 100644 packages/js-drive/scripts/abci.js delete mode 100644 packages/js-drive/scripts/echo.js delete mode 100644 packages/js-drive/test/.eslintrc delete mode 100644 packages/js-drive/test/README.md delete mode 100644 packages/js-drive/test/integration/abci/handlers/queryHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/integration/blockExecution/BlockExecutionContextRepository.spec.js delete mode 100644 packages/js-drive/test/integration/core/SimplifiedMasternodeList.spec.js delete mode 100644 packages/js-drive/test/integration/core/updateSimplifiedMasternodeListFactory.spec.js delete mode 100644 packages/js-drive/test/integration/core/waitForCoreSyncFactory.spec.js delete mode 100644 packages/js-drive/test/integration/createDIContainer.spec.js delete mode 100644 packages/js-drive/test/integration/dataContract/DataContractStoreRepository.spec.js delete mode 100644 packages/js-drive/test/integration/document/DocumentRepository.spec.js delete mode 100644 packages/js-drive/test/integration/document/fetchDataContractFactory.spec.js delete mode 100644 packages/js-drive/test/integration/document/fetchDocumentsFactory.spec.js delete mode 100644 packages/js-drive/test/integration/document/proveDocumentsFactory.spec.js delete mode 100644 packages/js-drive/test/integration/fee/feesPrediction.spec.js delete mode 100644 packages/js-drive/test/integration/groveDB/GroveDBStore.spec.js delete mode 100644 packages/js-drive/test/integration/identity/IdentityBalanceStoreRepository.spec.js delete mode 100644 packages/js-drive/test/integration/identity/IdentityPublicKeyStoreRepository.spec.js delete mode 100644 packages/js-drive/test/integration/identity/IdentityStoreRepository.spec.js delete mode 100644 packages/js-drive/test/integration/identity/SpentAssetLockTransactionsRepository.spec.js delete mode 100644 packages/js-drive/test/integration/identity/masternode/LastSyncedCoreHeightRepository.spec.js delete mode 100644 packages/js-drive/test/integration/identity/masternode/synchronizeMasternodeIdentitiesFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/closeAbciServerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/errors/enrichErrorWithContextLoggerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/errors/wrapInErrorHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/checkTxHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/extendVoteHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/finalizeBlockHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/infoHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/initChainHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/prepareProposalHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/processProposalHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/proposal/beginBlockFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/proposal/broadcastWithdrawalTransactionsFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/proposal/createConsensusParamUpdateFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/proposal/createCoreChainLockUpdateFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/proposal/deliverTxFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/proposal/endBlockFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/proposal/processProposalFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/proposal/rotateAndCreateValidatorSetUpdateFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/proposal/verifyChainLockFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/query/dataContractQueryHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/query/documentQueryHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/query/getProofsQueryHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/query/identitiesByPublicKeyHashesQueryHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/query/identityQueryHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/query/response/createQueryResponseFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/queryHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/stateTransition/unserializeStateTransitionFactory.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/validator/createValidatorSetUpdate.spec.js delete mode 100644 packages/js-drive/test/unit/abci/handlers/verifyVoteExtensionHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/blockExecution/BlockExecutionContext.spec.js delete mode 100644 packages/js-drive/test/unit/core/LatestCoreChainLock.spec.js delete mode 100644 packages/js-drive/test/unit/core/ensureBlock.spec.js delete mode 100644 packages/js-drive/test/unit/core/getRandomQuorumFactory.spec.js delete mode 100644 packages/js-drive/test/unit/core/updateSimplifiedMasternodeListFactory.spec.js delete mode 100644 packages/js-drive/test/unit/core/waitForChainLockedHeightFactory.spec.js delete mode 100644 packages/js-drive/test/unit/core/waitForCoreChainLockSyncFactory.spec.js delete mode 100644 packages/js-drive/test/unit/dpp/CachedStateRepositoryDecorator.spec.js delete mode 100644 packages/js-drive/test/unit/dpp/DriveStateRepository.spec.js delete mode 100644 packages/js-drive/test/unit/dpp/LoggedStateRepositoryDecorator.spec.js delete mode 100644 packages/js-drive/test/unit/featureFlag/getFeatureFlagForHeightFactory.spec.js delete mode 100644 packages/js-drive/test/unit/featureFlag/getLatestFeatureFlagFactory.spec.js delete mode 100644 packages/js-drive/test/unit/identity/masternode/createMasternodeIdentityFactory.spec.js delete mode 100644 packages/js-drive/test/unit/identity/masternode/createOperatorIdentifier.spec.js delete mode 100644 packages/js-drive/test/unit/identity/masternode/createVotingIdentifier.spec.js delete mode 100644 packages/js-drive/test/unit/identity/masternode/getPublicKeyFromPayoutScript.spec.js delete mode 100644 packages/js-drive/test/unit/identity/masternode/getWithdrawPubKeyTypeFromPayoutScriptFactory.spec.js delete mode 100644 packages/js-drive/test/unit/identity/masternode/handleNewMasternodeFactory.spec.js delete mode 100644 packages/js-drive/test/unit/identity/masternode/handleUpdatedScriptPayoutFactory.spec.js delete mode 100644 packages/js-drive/test/unit/identity/masternode/handleUpdatedVotingAddressFactory.spec.js delete mode 100644 packages/js-drive/test/unit/identity/withdrawals/updateWithdrawalTransactionIdAndStatusFactory.spec.js delete mode 100644 packages/js-drive/test/unit/util/ExecutionTimer.spec.js delete mode 100644 packages/js-drive/test/unit/util/errorHandlerFactory.spec.js delete mode 100644 packages/js-drive/test/unit/util/rejectAfter.spec.js delete mode 100644 packages/js-drive/test/unit/util/sanitizeUrl.spec.js delete mode 100644 packages/js-drive/test/unit/util/wait.spec.js delete mode 100644 packages/js-drive/test/unit/validator/Validator.spec.js delete mode 100644 packages/js-drive/test/unit/validator/ValidatorNetworkInfo.spec.js delete mode 100644 packages/js-drive/test/unit/validator/ValidatorSet.spec.js diff --git a/.pnp.cjs b/.pnp.cjs index 43971ae62d3..708e5c0c6f7 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -59,10 +59,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "name": "@dashevo/dpp",\ "reference": "workspace:packages/js-dpp"\ },\ - {\ - "name": "@dashevo/drive",\ - "reference": "workspace:packages/js-drive"\ - },\ {\ "name": "@dashevo/grpc-common",\ "reference": "workspace:packages/js-grpc-common"\ @@ -75,10 +71,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "name": "@dashevo/platform-test-suite",\ "reference": "workspace:packages/platform-test-suite"\ },\ - {\ - "name": "@dashevo/rs-drive",\ - "reference": "workspace:packages/rs-drive-nodejs"\ - },\ {\ "name": "@dashevo/wallet-lib",\ "reference": "workspace:packages/wallet-lib"\ @@ -103,13 +95,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@dashevo/dashpay-contract", ["workspace:packages/dashpay-contract"]],\ ["@dashevo/dpns-contract", ["workspace:packages/dpns-contract"]],\ ["@dashevo/dpp", ["workspace:packages/js-dpp"]],\ - ["@dashevo/drive", ["workspace:packages/js-drive"]],\ ["@dashevo/feature-flags-contract", ["workspace:packages/feature-flags-contract"]],\ ["@dashevo/grpc-common", ["workspace:packages/js-grpc-common"]],\ ["@dashevo/masternode-reward-shares-contract", ["workspace:packages/masternode-reward-shares-contract"]],\ ["@dashevo/platform", ["workspace:."]],\ ["@dashevo/platform-test-suite", ["workspace:packages/platform-test-suite"]],\ - ["@dashevo/rs-drive", ["workspace:packages/rs-drive-nodejs"]],\ ["@dashevo/wallet-lib", ["workspace:packages/wallet-lib"]],\ ["@dashevo/wasm-dpp", ["workspace:packages/wasm-dpp"]],\ ["@dashevo/withdrawals-contract", ["workspace:packages/withdrawals-contract"]],\ @@ -2278,18 +2268,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@dashevo/abci", [\ - ["https://github.com/dashpay/js-abci.git#commit=09f72120bc2059144f72eb7a246d632ead3fc3c6", {\ - "packageLocation": "./.yarn/cache/@dashevo-abci-https-9fb519f2ca-aaf41ab7fa.zip/node_modules/@dashevo/abci/",\ - "packageDependencies": [\ - ["@dashevo/abci", "https://github.com/dashpay/js-abci.git#commit=09f72120bc2059144f72eb7a246d632ead3fc3c6"],\ - ["@dashevo/protobufjs", "npm:6.10.5"],\ - ["bl", "npm:1.2.3"],\ - ["protocol-buffers-encodings", "npm:1.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@dashevo/bench-suite", [\ ["workspace:packages/bench-suite", {\ "packageLocation": "./packages/bench-suite/",\ @@ -2652,65 +2630,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "SOFT"\ }]\ ]],\ - ["@dashevo/drive", [\ - ["workspace:packages/js-drive", {\ - "packageLocation": "./packages/js-drive/",\ - "packageDependencies": [\ - ["@dashevo/drive", "workspace:packages/js-drive"],\ - ["@dashevo/abci", "https://github.com/dashpay/js-abci.git#commit=09f72120bc2059144f72eb7a246d632ead3fc3c6"],\ - ["@dashevo/dapi-grpc", "workspace:packages/dapi-grpc"],\ - ["@dashevo/dashcore-lib", "npm:0.20.0"],\ - ["@dashevo/dashd-rpc", "npm:18.2.0"],\ - ["@dashevo/dashpay-contract", "workspace:packages/dashpay-contract"],\ - ["@dashevo/dp-services-ctl", "https://github.com/dashevo/js-dp-services-ctl.git#commit=3976076b0018c5b4632ceda4c752fc597f27a640"],\ - ["@dashevo/dpns-contract", "workspace:packages/dpns-contract"],\ - ["@dashevo/dpp", "workspace:packages/js-dpp"],\ - ["@dashevo/feature-flags-contract", "workspace:packages/feature-flags-contract"],\ - ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ - ["@dashevo/masternode-reward-shares-contract", "workspace:packages/masternode-reward-shares-contract"],\ - ["@dashevo/rs-drive", "workspace:packages/rs-drive-nodejs"],\ - ["@dashevo/withdrawals-contract", "workspace:packages/withdrawals-contract"],\ - ["@types/pino", "npm:6.3.12"],\ - ["ajv", "npm:8.8.1"],\ - ["ajv-keywords", "virtual:34fbe5a7dba3086dcbcce8a7faed986b10f7a208f11db70499feb2c1afd76e24089e5b95f9e3b937e89512de1cf4937177cc2000303a1e908baefc73362a7d48#npm:5.0.0"],\ - ["awilix", "npm:4.3.4"],\ - ["babel-eslint", "virtual:27dae49067a60fa65fec6e1c3adad1497d0dda3f71eda711624109131ff3b7d1061a20f55e89b5a0a219da1f7a0a1a0a76bc414d36870315bd60acf5bdcb7f55#npm:10.1.0"],\ - ["blake3", "npm:2.1.7"],\ - ["bs58", "npm:4.0.1"],\ - ["cbor", "npm:8.1.0"],\ - ["chai", "npm:4.3.4"],\ - ["chai-as-promised", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:7.1.1"],\ - ["chai-string", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:1.5.0"],\ - ["chalk", "npm:4.1.2"],\ - ["dirty-chai", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:2.0.1"],\ - ["dotenv-expand", "npm:5.1.0"],\ - ["dotenv-safe", "npm:8.2.0"],\ - ["eslint", "npm:7.32.0"],\ - ["eslint-config-airbnb-base", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:14.2.1"],\ - ["eslint-plugin-import", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:2.25.3"],\ - ["find-my-way", "npm:2.2.5"],\ - ["js-merkle", "npm:0.1.5"],\ - ["levelup", "npm:4.4.0"],\ - ["lodash", "npm:4.17.21"],\ - ["long", "npm:5.2.0"],\ - ["memdown", "npm:5.1.0"],\ - ["mocha", "npm:9.2.2"],\ - ["moment", "npm:2.29.4"],\ - ["node-graceful", "npm:3.1.0"],\ - ["nyc", "npm:15.1.0"],\ - ["pino", "npm:6.13.3"],\ - ["pino-multi-stream", "npm:5.3.0"],\ - ["pino-pretty", "npm:4.8.0"],\ - ["rimraf", "npm:3.0.2"],\ - ["setimmediate", "npm:1.0.5"],\ - ["sinon", "npm:11.1.2"],\ - ["sinon-chai", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:3.7.0"],\ - ["through2", "npm:3.0.2"],\ - ["zeromq", "npm:5.2.8"]\ - ],\ - "linkType": "SOFT"\ - }]\ - ]],\ ["@dashevo/feature-flags-contract", [\ ["workspace:packages/feature-flags-contract", {\ "packageLocation": "./packages/feature-flags-contract/",\ @@ -2909,30 +2828,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@dashevo/rs-drive", [\ - ["workspace:packages/rs-drive-nodejs", {\ - "packageLocation": "./packages/rs-drive-nodejs/",\ - "packageDependencies": [\ - ["@dashevo/rs-drive", "workspace:packages/rs-drive-nodejs"],\ - ["@dashevo/dashcore-lib", "npm:0.20.0"],\ - ["@dashevo/dpp", "workspace:packages/js-dpp"],\ - ["@dashevo/withdrawals-contract", "workspace:packages/withdrawals-contract"],\ - ["cargo-cp-artifact", "npm:0.1.6"],\ - ["cbor", "npm:8.1.0"],\ - ["chai", "npm:4.3.4"],\ - ["dirty-chai", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:2.0.1"],\ - ["eslint", "npm:7.32.0"],\ - ["eslint-config-airbnb-base", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:14.2.1"],\ - ["eslint-plugin-import", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:2.25.3"],\ - ["mocha", "npm:9.2.2"],\ - ["neon-cli", "npm:0.10.1"],\ - ["neon-load-or-build", "npm:2.2.2"],\ - ["neon-tag-prebuild", "https://github.com/shumkov/neon-tag-prebuild.git#commit=a429834da27432b129eceb737e4d2b3f03fa5496"],\ - ["ultra-runner", "npm:3.10.5"]\ - ],\ - "linkType": "SOFT"\ - }]\ - ]],\ ["@dashevo/wallet-lib", [\ ["workspace:packages/wallet-lib", {\ "packageLocation": "./packages/wallet-lib/",\ @@ -3185,15 +3080,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@hapi/bourne", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/@hapi-bourne-npm-2.0.0-8eeda7e0a2-2ea0922101.zip/node_modules/@hapi/bourne/",\ - "packageDependencies": [\ - ["@hapi/bourne", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@humanwhocodes/config-array", [\ ["npm:0.5.0", {\ "packageLocation": "./.yarn/cache/@humanwhocodes-config-array-npm-0.5.0-5ded120470-44ee6a9f05.zip/node_modules/@humanwhocodes/config-array/",\ @@ -4390,40 +4276,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@types/pino", [\ - ["npm:6.3.12", {\ - "packageLocation": "./.yarn/cache/@types-pino-npm-6.3.12-19c7982858-8017351466.zip/node_modules/@types/pino/",\ - "packageDependencies": [\ - ["@types/pino", "npm:6.3.12"],\ - ["@types/node", "npm:17.0.21"],\ - ["@types/pino-pretty", "npm:4.7.3"],\ - ["@types/pino-std-serializers", "npm:2.4.1"],\ - ["sonic-boom", "npm:2.3.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@types/pino-pretty", [\ - ["npm:4.7.3", {\ - "packageLocation": "./.yarn/cache/@types-pino-pretty-npm-4.7.3-5ebf57cfd2-40fe67e73d.zip/node_modules/@types/pino-pretty/",\ - "packageDependencies": [\ - ["@types/pino-pretty", "npm:4.7.3"],\ - ["@types/node", "npm:17.0.21"],\ - ["@types/pino", "npm:6.3.12"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@types/pino-std-serializers", [\ - ["npm:2.4.1", {\ - "packageLocation": "./.yarn/cache/@types-pino-std-serializers-npm-2.4.1-e7c36178c0-a156e25882.zip/node_modules/@types/pino-std-serializers/",\ - "packageDependencies": [\ - ["@types/pino-std-serializers", "npm:2.4.1"],\ - ["@types/node", "npm:17.0.21"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@types/qs", [\ ["npm:6.9.7", {\ "packageLocation": "./.yarn/cache/@types-qs-npm-6.9.7-4a3e6ca0d0-7fd6f9c250.zip/node_modules/@types/qs/",\ @@ -5446,27 +5298,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["npm:5.0.0", {\ - "packageLocation": "./.yarn/cache/ajv-keywords-npm-5.0.0-50b946aaa2-239dd46383.zip/node_modules/ajv-keywords/",\ - "packageDependencies": [\ - ["ajv-keywords", "npm:5.0.0"]\ - ],\ - "linkType": "SOFT"\ - }],\ - ["virtual:34fbe5a7dba3086dcbcce8a7faed986b10f7a208f11db70499feb2c1afd76e24089e5b95f9e3b937e89512de1cf4937177cc2000303a1e908baefc73362a7d48#npm:5.0.0", {\ - "packageLocation": "./.yarn/__virtual__/ajv-keywords-virtual-75ea4b6cf0/0/cache/ajv-keywords-npm-5.0.0-50b946aaa2-239dd46383.zip/node_modules/ajv-keywords/",\ - "packageDependencies": [\ - ["ajv-keywords", "virtual:34fbe5a7dba3086dcbcce8a7faed986b10f7a208f11db70499feb2c1afd76e24089e5b95f9e3b937e89512de1cf4937177cc2000303a1e908baefc73362a7d48#npm:5.0.0"],\ - ["@types/ajv", null],\ - ["ajv", "npm:8.8.1"],\ - ["fast-deep-equal", "npm:3.1.3"]\ - ],\ - "packagePeers": [\ - "@types/ajv",\ - "ajv"\ - ],\ - "linkType": "HARD"\ - }],\ ["virtual:f84d18c473fad3c01e1cf352f81ad13de804ca40da5bf6e752464a2e78dcb097ad579b06da5ff33a55ba9957fb9c74909b99fc5e215420a3f9b5dc87ad71363b#npm:3.5.2", {\ "packageLocation": "./.yarn/__virtual__/ajv-keywords-virtual-11d24a6cf1/0/cache/ajv-keywords-npm-3.5.2-0e391b70e2-7dc5e59316.zip/node_modules/ajv-keywords/",\ "packageDependencies": [\ @@ -5703,35 +5534,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["args", [\ - ["npm:5.0.1", {\ - "packageLocation": "./.yarn/cache/args-npm-5.0.1-cd7b0f9dcc-51e2a05f32.zip/node_modules/args/",\ - "packageDependencies": [\ - ["args", "npm:5.0.1"],\ - ["camelcase", "npm:5.0.0"],\ - ["chalk", "npm:2.4.2"],\ - ["leven", "npm:2.1.0"],\ - ["mri", "npm:1.1.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["array-back", [\ - ["npm:3.1.0", {\ - "packageLocation": "./.yarn/cache/array-back-npm-3.1.0-a52d25f5a3-7205004fcd.zip/node_modules/array-back/",\ - "packageDependencies": [\ - ["array-back", "npm:3.1.0"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:4.0.2", {\ - "packageLocation": "./.yarn/cache/array-back-npm-4.0.2-f735073f8f-f306032707.zip/node_modules/array-back/",\ - "packageDependencies": [\ - ["array-back", "npm:4.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["array-buffer-byte-length", [\ ["npm:1.0.0", {\ "packageLocation": "./.yarn/cache/array-buffer-byte-length-npm-1.0.0-331671f28a-044e101ce1.zip/node_modules/array-buffer-byte-length/",\ @@ -5920,15 +5722,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["atomic-sleep", [\ - ["npm:1.0.0", {\ - "packageLocation": "./.yarn/cache/atomic-sleep-npm-1.0.0-17d8a762a3-b95275afb2.zip/node_modules/atomic-sleep/",\ - "packageDependencies": [\ - ["atomic-sleep", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["available-typed-arrays", [\ ["npm:1.0.5", {\ "packageLocation": "./.yarn/cache/available-typed-arrays-npm-1.0.5-88f321e4d3-20eb47b3ce.zip/node_modules/available-typed-arrays/",\ @@ -6276,15 +6069,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["bl", [\ - ["npm:1.2.3", {\ - "packageLocation": "./.yarn/cache/bl-npm-1.2.3-49c4213ca5-123f097989.zip/node_modules/bl/",\ - "packageDependencies": [\ - ["bl", "npm:1.2.3"],\ - ["readable-stream", "npm:2.3.7"],\ - ["safe-buffer", "npm:5.2.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.2.1", {\ "packageLocation": "./.yarn/cache/bl-npm-2.2.1-f294e1ea12-4f5d9b2589.zip/node_modules/bl/",\ "packageDependencies": [\ @@ -6743,13 +6527,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["camelcase", [\ - ["npm:5.0.0", {\ - "packageLocation": "./.yarn/cache/camelcase-npm-5.0.0-c808398846-8bfe920e04.zip/node_modules/camelcase/",\ - "packageDependencies": [\ - ["camelcase", "npm:5.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:5.3.1", {\ "packageLocation": "./.yarn/cache/camelcase-npm-5.3.1-5db8af62c5-e6effce26b.zip/node_modules/camelcase/",\ "packageDependencies": [\ @@ -6797,15 +6574,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["cargo-cp-artifact", [\ - ["npm:0.1.6", {\ - "packageLocation": "./.yarn/cache/cargo-cp-artifact-npm-0.1.6-fe2dd40a8f-2f5d2f3e73.zip/node_modules/cargo-cp-artifact/",\ - "packageDependencies": [\ - ["cargo-cp-artifact", "npm:0.1.6"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["cbor", [\ ["npm:8.1.0", {\ "packageLocation": "./.yarn/cache/cbor-npm-8.1.0-c1a4d6266a-a90338435d.zip/node_modules/cbor/",\ @@ -7333,42 +7101,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["command-line-args", [\ - ["npm:5.2.1", {\ - "packageLocation": "./.yarn/cache/command-line-args-npm-5.2.1-093a68d295-e759519087.zip/node_modules/command-line-args/",\ - "packageDependencies": [\ - ["command-line-args", "npm:5.2.1"],\ - ["array-back", "npm:3.1.0"],\ - ["find-replace", "npm:3.0.0"],\ - ["lodash.camelcase", "npm:4.3.0"],\ - ["typical", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["command-line-commands", [\ - ["npm:3.0.2", {\ - "packageLocation": "./.yarn/cache/command-line-commands-npm-3.0.2-782bf8a159-2cf5409af0.zip/node_modules/command-line-commands/",\ - "packageDependencies": [\ - ["command-line-commands", "npm:3.0.2"],\ - ["array-back", "npm:4.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["command-line-usage", [\ - ["npm:6.1.3", {\ - "packageLocation": "./.yarn/cache/command-line-usage-npm-6.1.3-145c2dabe1-8261d4e553.zip/node_modules/command-line-usage/",\ - "packageDependencies": [\ - ["command-line-usage", "npm:6.1.3"],\ - ["array-back", "npm:4.0.2"],\ - ["chalk", "npm:2.4.2"],\ - ["table-layout", "npm:1.0.2"],\ - ["typical", "npm:5.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["commander", [\ ["npm:2.20.3", {\ "packageLocation": "./.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip/node_modules/commander/",\ @@ -9655,15 +9387,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["fast-decode-uri-component", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/fast-decode-uri-component-npm-1.0.1-578ba9fecf-427a48fe09.zip/node_modules/fast-decode-uri-component/",\ - "packageDependencies": [\ - ["fast-decode-uri-component", "npm:1.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["fast-deep-equal", [\ ["npm:3.1.3", {\ "packageLocation": "./.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip/node_modules/fast-deep-equal/",\ @@ -9722,24 +9445,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["fast-redact", [\ - ["npm:3.0.2", {\ - "packageLocation": "./.yarn/cache/fast-redact-npm-3.0.2-98d6f1d433-f4ffdf48f1.zip/node_modules/fast-redact/",\ - "packageDependencies": [\ - ["fast-redact", "npm:3.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["fast-safe-stringify", [\ - ["npm:2.1.1", {\ - "packageLocation": "./.yarn/cache/fast-safe-stringify-npm-2.1.1-7ce89033ca-a851cbddc4.zip/node_modules/fast-safe-stringify/",\ - "packageDependencies": [\ - ["fast-safe-stringify", "npm:2.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["fastest-levenshtein", [\ ["npm:1.0.12", {\ "packageLocation": "./.yarn/cache/fastest-levenshtein-npm-1.0.12-a32b4ef51e-e1a013698d.zip/node_modules/fastest-levenshtein/",\ @@ -9749,15 +9454,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["fastify-warning", [\ - ["npm:0.2.0", {\ - "packageLocation": "./.yarn/cache/fastify-warning-npm-0.2.0-f9c53563fc-c19ebccf54.zip/node_modules/fastify-warning/",\ - "packageDependencies": [\ - ["fastify-warning", "npm:0.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["fastq", [\ ["npm:1.13.0", {\ "packageLocation": "./.yarn/cache/fastq-npm-1.13.0-a45963881c-32cf15c29a.zip/node_modules/fastq/",\ @@ -9854,28 +9550,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["find-my-way", [\ - ["npm:2.2.5", {\ - "packageLocation": "./.yarn/cache/find-my-way-npm-2.2.5-3bef2f72f0-9330349565.zip/node_modules/find-my-way/",\ - "packageDependencies": [\ - ["find-my-way", "npm:2.2.5"],\ - ["fast-decode-uri-component", "npm:1.0.1"],\ - ["safe-regex2", "npm:2.0.0"],\ - ["semver-store", "npm:0.3.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["find-replace", [\ - ["npm:3.0.0", {\ - "packageLocation": "./.yarn/cache/find-replace-npm-3.0.0-686bd07d28-6b04bcfd79.zip/node_modules/find-replace/",\ - "packageDependencies": [\ - ["find-replace", "npm:3.0.0"],\ - ["array-back", "npm:3.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["find-up", [\ ["npm:2.1.0", {\ "packageLocation": "./.yarn/cache/find-up-npm-2.1.0-9f6cb1765c-43284fe4da.zip/node_modules/find-up/",\ @@ -9955,15 +9629,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["flatstr", [\ - ["npm:1.0.12", {\ - "packageLocation": "./.yarn/cache/flatstr-npm-1.0.12-4311d37d16-e1bb562c94.zip/node_modules/flatstr/",\ - "packageDependencies": [\ - ["flatstr", "npm:1.0.12"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["flatted", [\ ["npm:3.2.7", {\ "packageLocation": "./.yarn/cache/flatted-npm-3.2.7-0da10b7c56-427633049d.zip/node_modules/flatted/",\ @@ -10308,16 +9973,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["git-config", [\ - ["npm:0.0.7", {\ - "packageLocation": "./.yarn/cache/git-config-npm-0.0.7-fd037544b3-99a7e20306.zip/node_modules/git-config/",\ - "packageDependencies": [\ - ["git-config", "npm:0.0.7"],\ - ["iniparser", "npm:1.0.5"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["git-raw-commits", [\ ["npm:2.0.10", {\ "packageLocation": "./.yarn/cache/git-raw-commits-npm-2.0.10-66e3a843dd-66e2d7b4cd.zip/node_modules/git-raw-commits/",\ @@ -11117,36 +10772,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["iniparser", [\ - ["npm:1.0.5", {\ - "packageLocation": "./.yarn/cache/iniparser-npm-1.0.5-446fd8dfb0-eba0ec2d68.zip/node_modules/iniparser/",\ - "packageDependencies": [\ - ["iniparser", "npm:1.0.5"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["inquirer", [\ - ["npm:7.3.3", {\ - "packageLocation": "./.yarn/cache/inquirer-npm-7.3.3-9e86782610-4d387fc1eb.zip/node_modules/inquirer/",\ - "packageDependencies": [\ - ["inquirer", "npm:7.3.3"],\ - ["ansi-escapes", "npm:4.3.2"],\ - ["chalk", "npm:4.1.2"],\ - ["cli-cursor", "npm:3.1.0"],\ - ["cli-width", "npm:3.0.0"],\ - ["external-editor", "npm:3.1.0"],\ - ["figures", "npm:3.2.0"],\ - ["lodash", "npm:4.17.21"],\ - ["mute-stream", "npm:0.0.8"],\ - ["run-async", "npm:2.4.1"],\ - ["rxjs", "npm:6.6.7"],\ - ["string-width", "npm:4.2.3"],\ - ["strip-ansi", "npm:6.0.1"],\ - ["through", "npm:2.3.8"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:8.2.0", {\ "packageLocation": "./.yarn/cache/inquirer-npm-8.2.0-2bfa19a3d0-861d1a9324.zip/node_modules/inquirer/",\ "packageDependencies": [\ @@ -11918,13 +11544,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["jmespath", [\ - ["npm:0.15.0", {\ - "packageLocation": "./.yarn/cache/jmespath-npm-0.15.0-df80ed6dd1-353bb9e69c.zip/node_modules/jmespath/",\ - "packageDependencies": [\ - ["jmespath", "npm:0.15.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:0.16.0", {\ "packageLocation": "./.yarn/cache/jmespath-npm-0.16.0-d47535c65a-2d602493a1.zip/node_modules/jmespath/",\ "packageDependencies": [\ @@ -11933,15 +11552,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["joycon", [\ - ["npm:2.2.5", {\ - "packageLocation": "./.yarn/cache/joycon-npm-2.2.5-fff23ab519-930bb748c0.zip/node_modules/joycon/",\ - "packageDependencies": [\ - ["joycon", "npm:2.2.5"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["js-base64", [\ ["npm:2.6.4", {\ "packageLocation": "./.yarn/cache/js-base64-npm-2.6.4-569350f803-5f4084078d.zip/node_modules/js-base64/",\ @@ -12544,15 +12154,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["leven", [\ - ["npm:2.1.0", {\ - "packageLocation": "./.yarn/cache/leven-npm-2.1.0-19f0a16606-f7b4a01b15.zip/node_modules/leven/",\ - "packageDependencies": [\ - ["leven", "npm:2.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["levn", [\ ["npm:0.3.0", {\ "packageLocation": "./.yarn/cache/levn-npm-0.3.0-48d774b1c2-0d084a5242.zip/node_modules/levn/",\ @@ -13018,15 +12619,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["make-promises-safe", [\ - ["npm:5.1.0", {\ - "packageLocation": "./.yarn/cache/make-promises-safe-npm-5.1.0-7a3dd5a2e9-6e59ed8c56.zip/node_modules/make-promises-safe/",\ - "packageDependencies": [\ - ["make-promises-safe", "npm:5.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["map-obj", [\ ["npm:1.0.1", {\ "packageLocation": "./.yarn/cache/map-obj-npm-1.0.1-fa55100fac-9949e7baec.zip/node_modules/map-obj/",\ @@ -13559,15 +13151,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["moment", [\ - ["npm:2.29.4", {\ - "packageLocation": "./.yarn/cache/moment-npm-2.29.4-902943305d-0ec3f9c2bc.zip/node_modules/moment/",\ - "packageDependencies": [\ - ["moment", "npm:2.29.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["mongodb", [\ ["npm:3.7.3", {\ "packageLocation": "./.yarn/cache/mongodb-npm-3.7.3-c479129d1e-ef7690fe6e.zip/node_modules/mongodb/",\ @@ -13616,15 +13199,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["mri", [\ - ["npm:1.1.4", {\ - "packageLocation": "./.yarn/cache/mri-npm-1.1.4-d22a399f26-e65b9aed3b.zip/node_modules/mri/",\ - "packageDependencies": [\ - ["mri", "npm:1.1.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["ms", [\ ["npm:2.0.0", {\ "packageLocation": "./.yarn/cache/ms-npm-2.0.0-9e1101a471-0e6a22b8b7.zip/node_modules/ms/",\ @@ -13750,49 +13324,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["neon-cli", [\ - ["npm:0.10.1", {\ - "packageLocation": "./.yarn/cache/neon-cli-npm-0.10.1-f6ee1b3cec-284e7ec9e3.zip/node_modules/neon-cli/",\ - "packageDependencies": [\ - ["neon-cli", "npm:0.10.1"],\ - ["chalk", "npm:4.1.2"],\ - ["command-line-args", "npm:5.2.1"],\ - ["command-line-commands", "npm:3.0.2"],\ - ["command-line-usage", "npm:6.1.3"],\ - ["git-config", "npm:0.0.7"],\ - ["handlebars", "npm:4.7.7"],\ - ["inquirer", "npm:7.3.3"],\ - ["make-promises-safe", "npm:5.1.0"],\ - ["rimraf", "npm:3.0.2"],\ - ["semver", "npm:7.3.8"],\ - ["toml", "npm:3.0.0"],\ - ["ts-typed-json", "npm:0.3.2"],\ - ["validate-npm-package-license", "npm:3.0.4"],\ - ["validate-npm-package-name", "npm:3.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["neon-load-or-build", [\ - ["npm:2.2.2", {\ - "packageLocation": "./.yarn/cache/neon-load-or-build-npm-2.2.2-548a286943-3cafba0e26.zip/node_modules/neon-load-or-build/",\ - "packageDependencies": [\ - ["neon-load-or-build", "npm:2.2.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["neon-tag-prebuild", [\ - ["https://github.com/shumkov/neon-tag-prebuild.git#commit=a429834da27432b129eceb737e4d2b3f03fa5496", {\ - "packageLocation": "./.yarn/cache/neon-tag-prebuild-https-d665d28b1f-00a16bf27c.zip/node_modules/neon-tag-prebuild/",\ - "packageDependencies": [\ - ["neon-tag-prebuild", "https://github.com/shumkov/neon-tag-prebuild.git#commit=a429834da27432b129eceb737e4d2b3f03fa5496"],\ - ["mkdirp", "npm:1.0.4"],\ - ["node-abi", "npm:2.30.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["net", [\ ["npm:1.0.2", {\ "packageLocation": "./.yarn/cache/net-npm-1.0.2-1d5514df5b-d97e215d92.zip/node_modules/net/",\ @@ -13836,16 +13367,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["node-abi", [\ - ["npm:2.30.1", {\ - "packageLocation": "./.yarn/cache/node-abi-npm-2.30.1-36a2c4e28a-3f4b0c912c.zip/node_modules/node-abi/",\ - "packageDependencies": [\ - ["node-abi", "npm:2.30.1"],\ - ["semver", "npm:5.7.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["node-fetch", [\ ["npm:2.6.7", {\ "packageLocation": "./.yarn/cache/node-fetch-npm-2.6.7-777aa2a6df-8d816ffd1e.zip/node_modules/node-fetch/",\ @@ -14925,63 +14446,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["pino", [\ - ["npm:6.13.3", {\ - "packageLocation": "./.yarn/cache/pino-npm-6.13.3-50e2aceb53-a580decd47.zip/node_modules/pino/",\ - "packageDependencies": [\ - ["pino", "npm:6.13.3"],\ - ["fast-redact", "npm:3.0.2"],\ - ["fast-safe-stringify", "npm:2.1.1"],\ - ["fastify-warning", "npm:0.2.0"],\ - ["flatstr", "npm:1.0.12"],\ - ["pino-pretty", "npm:4.8.0"],\ - ["pino-std-serializers", "npm:3.2.0"],\ - ["quick-format-unescaped", "npm:4.0.4"],\ - ["sonic-boom", "npm:1.4.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["pino-multi-stream", [\ - ["npm:5.3.0", {\ - "packageLocation": "./.yarn/cache/pino-multi-stream-npm-5.3.0-ecb9b754cb-10ddb85983.zip/node_modules/pino-multi-stream/",\ - "packageDependencies": [\ - ["pino-multi-stream", "npm:5.3.0"],\ - ["pino", "npm:6.13.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["pino-pretty", [\ - ["npm:4.8.0", {\ - "packageLocation": "./.yarn/cache/pino-pretty-npm-4.8.0-0c822e28cb-8e2e4cdb80.zip/node_modules/pino-pretty/",\ - "packageDependencies": [\ - ["pino-pretty", "npm:4.8.0"],\ - ["@hapi/bourne", "npm:2.0.0"],\ - ["args", "npm:5.0.1"],\ - ["chalk", "npm:4.1.2"],\ - ["dateformat", "npm:4.6.3"],\ - ["fast-safe-stringify", "npm:2.1.1"],\ - ["jmespath", "npm:0.15.0"],\ - ["joycon", "npm:2.2.5"],\ - ["pump", "npm:3.0.0"],\ - ["readable-stream", "npm:3.6.0"],\ - ["rfdc", "npm:1.3.0"],\ - ["split2", "npm:3.2.2"],\ - ["strip-json-comments", "npm:3.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["pino-std-serializers", [\ - ["npm:3.2.0", {\ - "packageLocation": "./.yarn/cache/pino-std-serializers-npm-3.2.0-9fd67503a4-77e29675b1.zip/node_modules/pino-std-serializers/",\ - "packageDependencies": [\ - ["pino-std-serializers", "npm:3.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["pkg-dir", [\ ["npm:2.0.0", {\ "packageLocation": "./.yarn/cache/pkg-dir-npm-2.0.0-2b4bf4abd1-8c72b71230.zip/node_modules/pkg-dir/",\ @@ -15201,17 +14665,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["protocol-buffers-encodings", [\ - ["npm:1.1.1", {\ - "packageLocation": "./.yarn/cache/protocol-buffers-encodings-npm-1.1.1-07111209e8-1b22d6d05b.zip/node_modules/protocol-buffers-encodings/",\ - "packageDependencies": [\ - ["protocol-buffers-encodings", "npm:1.1.1"],\ - ["signed-varint", "npm:2.0.1"],\ - ["varint", "npm:5.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["prr", [\ ["npm:1.0.1", {\ "packageLocation": "./.yarn/cache/prr-npm-1.0.1-608d442761-3bca2db047.zip/node_modules/prr/",\ @@ -15339,15 +14792,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["quick-format-unescaped", [\ - ["npm:4.0.4", {\ - "packageLocation": "./.yarn/cache/quick-format-unescaped-npm-4.0.4-7e22c9b7dc-7bc32b9935.zip/node_modules/quick-format-unescaped/",\ - "packageDependencies": [\ - ["quick-format-unescaped", "npm:4.0.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["quick-lru", [\ ["npm:4.0.1", {\ "packageLocation": "./.yarn/cache/quick-lru-npm-4.0.1-ef8aa17c9c-bea46e1abf.zip/node_modules/quick-lru/",\ @@ -15579,15 +15023,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["reduce-flatten", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/reduce-flatten-npm-2.0.0-01bd4936fa-64393ef99a.zip/node_modules/reduce-flatten/",\ - "packageDependencies": [\ - ["reduce-flatten", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["regenerate", [\ ["npm:1.4.2", {\ "packageLocation": "./.yarn/cache/regenerate-npm-1.4.2-b296c5b63a-3317a09b2f.zip/node_modules/regenerate/",\ @@ -15848,15 +15283,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["ret", [\ - ["npm:0.2.2", {\ - "packageLocation": "./.yarn/cache/ret-npm-0.2.2-f5d3022812-774964bb41.zip/node_modules/ret/",\ - "packageDependencies": [\ - ["ret", "npm:0.2.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["retry", [\ ["npm:0.12.0", {\ "packageLocation": "./.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip/node_modules/retry/",\ @@ -15978,16 +15404,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["safe-regex2", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/safe-regex2-npm-2.0.0-eadecc9909-f5e182fca0.zip/node_modules/safe-regex2/",\ - "packageDependencies": [\ - ["safe-regex2", "npm:2.0.0"],\ - ["ret", "npm:0.2.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["safe-stable-stringify", [\ ["npm:1.1.1", {\ "packageLocation": "./.yarn/cache/safe-stable-stringify-npm-1.1.1-1c282e1c55-e32a30720e.zip/node_modules/safe-stable-stringify/",\ @@ -16103,15 +15519,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["semver-store", [\ - ["npm:0.3.0", {\ - "packageLocation": "./.yarn/cache/semver-store-npm-0.3.0-0fc88fd5b9-b38f747123.zip/node_modules/semver-store/",\ - "packageDependencies": [\ - ["semver-store", "npm:0.3.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["serialize-javascript", [\ ["npm:6.0.0", {\ "packageLocation": "./.yarn/cache/serialize-javascript-npm-6.0.0-0bb8a3c88d-56f90b562a.zip/node_modules/serialize-javascript/",\ @@ -16319,16 +15726,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["signed-varint", [\ - ["npm:2.0.1", {\ - "packageLocation": "./.yarn/cache/signed-varint-npm-2.0.1-18301876e5-a9fd2d954d.zip/node_modules/signed-varint/",\ - "packageDependencies": [\ - ["signed-varint", "npm:2.0.1"],\ - ["varint", "npm:5.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["simple-swizzle", [\ ["npm:0.2.2", {\ "packageLocation": "./.yarn/cache/simple-swizzle-npm-0.2.2-8dee37fad1-a7f3f2ab5c.zip/node_modules/simple-swizzle/",\ @@ -16536,25 +15933,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["sonic-boom", [\ - ["npm:1.4.1", {\ - "packageLocation": "./.yarn/cache/sonic-boom-npm-1.4.1-e42b921f99-189fa8fe5c.zip/node_modules/sonic-boom/",\ - "packageDependencies": [\ - ["sonic-boom", "npm:1.4.1"],\ - ["atomic-sleep", "npm:1.0.0"],\ - ["flatstr", "npm:1.0.12"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:2.3.1", {\ - "packageLocation": "./.yarn/cache/sonic-boom-npm-2.3.1-0ba04b648c-4f5022de97.zip/node_modules/sonic-boom/",\ - "packageDependencies": [\ - ["sonic-boom", "npm:2.3.1"],\ - ["atomic-sleep", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["sort-keys", [\ ["npm:4.2.0", {\ "packageLocation": "./.yarn/cache/sort-keys-npm-4.2.0-bf52ceef80-1535ffd5a7.zip/node_modules/sort-keys/",\ @@ -17135,19 +16513,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["table-layout", [\ - ["npm:1.0.2", {\ - "packageLocation": "./.yarn/cache/table-layout-npm-1.0.2-0b3fe79240-8f41b5671f.zip/node_modules/table-layout/",\ - "packageDependencies": [\ - ["table-layout", "npm:1.0.2"],\ - ["array-back", "npm:4.0.2"],\ - ["deep-extend", "npm:0.6.0"],\ - ["typical", "npm:5.2.0"],\ - ["wordwrapjs", "npm:4.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["taketalk", [\ ["npm:1.0.0", {\ "packageLocation": "./.yarn/cache/taketalk-npm-1.0.0-2fc66802cb-b9a6ae2d6e.zip/node_modules/taketalk/",\ @@ -17506,15 +16871,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:3.0.2", {\ - "packageLocation": "./.yarn/cache/through2-npm-3.0.2-403f837012-47c9586c73.zip/node_modules/through2/",\ - "packageDependencies": [\ - ["through2", "npm:3.0.2"],\ - ["inherits", "npm:2.0.4"],\ - ["readable-stream", "npm:3.6.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:4.0.2", {\ "packageLocation": "./.yarn/cache/through2-npm-4.0.2-da7b2da443-ac7430bd54.zip/node_modules/through2/",\ "packageDependencies": [\ @@ -17597,15 +16953,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["toml", [\ - ["npm:3.0.0", {\ - "packageLocation": "./.yarn/cache/toml-npm-3.0.0-f993270804-5d7f1d8413.zip/node_modules/toml/",\ - "packageDependencies": [\ - ["toml", "npm:3.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["touch", [\ ["npm:3.1.0", {\ "packageLocation": "./.yarn/cache/touch-npm-3.1.0-e2eacebbda-e0be589cb5.zip/node_modules/touch/",\ @@ -17824,15 +17171,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["ts-typed-json", [\ - ["npm:0.3.2", {\ - "packageLocation": "./.yarn/cache/ts-typed-json-npm-0.3.2-6ec963b162-141c976da0.zip/node_modules/ts-typed-json/",\ - "packageDependencies": [\ - ["ts-typed-json", "npm:0.3.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["tsconfig-paths", [\ ["npm:3.12.0", {\ "packageLocation": "./.yarn/cache/tsconfig-paths-npm-3.12.0-b78aadfb3f-4999ec6cd1.zip/node_modules/tsconfig-paths/",\ @@ -18040,22 +17378,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["typical", [\ - ["npm:4.0.0", {\ - "packageLocation": "./.yarn/cache/typical-npm-4.0.0-2255d8d515-a242081956.zip/node_modules/typical/",\ - "packageDependencies": [\ - ["typical", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:5.2.0", {\ - "packageLocation": "./.yarn/cache/typical-npm-5.2.0-d4de46c932-ccaeb151a9.zip/node_modules/typical/",\ - "packageDependencies": [\ - ["typical", "npm:5.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["ua-parser-js", [\ ["npm:1.0.33", {\ "packageLocation": "./.yarn/cache/ua-parser-js-npm-1.0.33-60ab7da777-460adef512.zip/node_modules/ua-parser-js/",\ @@ -18382,20 +17704,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["varint", [\ - ["npm:5.0.0", {\ - "packageLocation": "./.yarn/cache/varint-npm-5.0.0-c2491b868a-527c65ad87.zip/node_modules/varint/",\ - "packageDependencies": [\ - ["varint", "npm:5.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:5.0.2", {\ - "packageLocation": "./.yarn/cache/varint-npm-5.0.2-fcb43e79c5-e1a66bf9a6.zip/node_modules/varint/",\ - "packageDependencies": [\ - ["varint", "npm:5.0.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:6.0.0", {\ "packageLocation": "./.yarn/cache/varint-npm-6.0.0-a638e8f225-7684113c9d.zip/node_modules/varint/",\ "packageDependencies": [\ @@ -19127,17 +18435,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["wordwrapjs", [\ - ["npm:4.0.1", {\ - "packageLocation": "./.yarn/cache/wordwrapjs-npm-4.0.1-b6c3c84d76-3d927f3c95.zip/node_modules/wordwrapjs/",\ - "packageDependencies": [\ - ["wordwrapjs", "npm:4.0.1"],\ - ["reduce-flatten", "npm:2.0.0"],\ - ["typical", "npm:5.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["workerpool", [\ ["npm:6.2.0", {\ "packageLocation": "./.yarn/cache/workerpool-npm-6.2.0-d2a722f6bb-3493b4f0ef.zip/node_modules/workerpool/",\ diff --git a/package.json b/package.json index 92a3324b4af..813502242d9 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,6 @@ "packages/wallet-lib", "packages/js-dash-sdk", "packages/dapi", - "packages/js-drive", "packages/dashmate", "packages/platform-test-suite", "packages/masternode-reward-shares-contract", @@ -78,4 +77,4 @@ "ua-parser-js": "^1.0.33", "dns-packet": "^5.4.0" } -} \ No newline at end of file +} diff --git a/packages/js-drive/.env.example b/packages/js-drive/.env.example deleted file mode 100644 index c0afd31ff42..00000000000 --- a/packages/js-drive/.env.example +++ /dev/null @@ -1,71 +0,0 @@ -# ABCI host and port to listen -ABCI_HOST=0.0.0.0 -ABCI_PORT=26658 - -DB_PATH=./db - -# GroveDB database file -GROVEDB_LATEST_FILE=${DB_PATH}/latest_state - -# Cache size for Data Contracts -DATA_CONTRACTS_GLOBAL_CACHE_SIZE=500 -DATA_CONTRACTS_BLOCK_CACHE_SIZE=200 - -# DashCore JSON-RPC host, port and credentials -# Read more: https://dashcore.readme.io/docs/core-api-ref-remote-procedure-calls -CORE_JSON_RPC_HOST=127.0.0.1 -CORE_JSON_RPC_PORT=9998 -CORE_JSON_RPC_USERNAME=dashrpc -CORE_JSON_RPC_PASSWORD=password - -# DashCore ZMQ host and port -CORE_ZMQ_HOST=127.0.0.1 -CORE_ZMQ_PORT=29998 -CORE_ZMQ_CONNECTION_RETRIES=16 - -NETWORK=testnet - -INITIAL_CORE_CHAINLOCKED_HEIGHT= - -# https://github.com/dashevo/dashcore-lib/blob/286c33a9d29d33f05d874c47a9b33764a0be0cf1/lib/constants/index.js#L42-L57 -VALIDATOR_SET_LLMQ_TYPE=100 - -# DPNS Contract - -DPNS_MASTER_PUBLIC_KEY= -DPNS_SECOND_PUBLIC_KEY= - -# Dashpay Contract - -DASHPAY_MASTER_PUBLIC_KEY= -DASHPAY_SECOND_PUBLIC_KEY= - -# Feature flags contract - -FEATURE_FLAGS_MASTER_PUBLIC_KEY= -FEATURE_FLAGS_SECOND_PUBLIC_KEY= - -# Masternode reward shares contract - -MASTERNODE_REWARD_SHARES_MASTER_PUBLIC_KEY= -MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY= - -# Withdrawals contract - -WITHDRAWALS_MASTER_PUBLIC_KEY= -WITHDRAWALS_SECOND_PUBLIC_KEY= - -# logging -LOG_STDOUT_LEVEL=info - -LOG_PRETTY_FILE_LEVEL=silent -LOG_PRETTY_FILE_PATH=/tmp/drive-pretty.log - -LOG_JSON_FILE_LEVEL=silent -LOG_JSON_FILE_PATH=/tmp/drive-json.log - -LOG_STATE_REPOSITORY=false - -NODE_ENV=production - -TENDERDASH_P2P_PORT=26656 diff --git a/packages/js-drive/.eslintrc b/packages/js-drive/.eslintrc deleted file mode 100644 index 53708855109..00000000000 --- a/packages/js-drive/.eslintrc +++ /dev/null @@ -1,36 +0,0 @@ -{ - "extends": "airbnb-base", - "env": { - "es2021": true, - "node": true - }, - "parser": "babel-eslint", - "rules": { - "no-plusplus": 0, - "eol-last": [ - "error", - "always" - ], - "no-continue": "off", - "class-methods-use-this": "off", - "no-await-in-loop": "off", - "no-restricted-syntax": [ - "error", - { - "selector": "LabeledStatement", - "message": "Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand." - }, - { - "selector": "WithStatement", - "message": "`with` is disallowed in strict mode because it makes code impossible to predict and optimize." - } - ], - "curly": [ - "error", - "all" - ] - }, - "globals": { - "BigInt": true - } -} diff --git a/packages/js-drive/.mocharc.yml b/packages/js-drive/.mocharc.yml deleted file mode 100644 index 4f6cc77a7d5..00000000000 --- a/packages/js-drive/.mocharc.yml +++ /dev/null @@ -1,4 +0,0 @@ -exit: true -timeout: 5000 -file: - - ./lib/test/bootstrap.js diff --git a/packages/js-drive/CHANGELOG.md b/packages/js-drive/CHANGELOG.md deleted file mode 100644 index e0e0e75d9aa..00000000000 --- a/packages/js-drive/CHANGELOG.md +++ /dev/null @@ -1,509 +0,0 @@ -## [0.21.1](https://github.com/dashevo/js-drive/compare/v0.21.0...v0.21.1) (2021-10-28) - - -### Bug Fixes - -* getFeatureFlagForHeight must not try to fetch feature flags before they were created ([#575](https://github.com/dashevo/js-drive/issues/575)) - - - -# [0.21.0](https://github.com/dashevo/js-drive/compare/v0.20.0...v0.21.0) (2021-10-14) - - -### Features - -* support higher protocol version ([#571](https://github.com/dashevo/js-drive/issues/571)) -* set protocol version on `begin block` ([#558](https://github.com/dashevo/js-drive/issues/558)) -* comprehensive error codes ([#564](https://github.com/dashevo/js-drive/issues/564), [#572](https://github.com/dashevo/js-drive/issues/572)) -* multiproof for the identity non inclusion proof root tree ([#560](https://github.com/dashevo/js-drive/issues/560)) - - -### Bug Fixes - -* consensus logger wasn't set on error ([#567](https://github.com/dashevo/js-drive/issues/567)) -* previousRootTree not rebuilt on commit, resulting in a wrong proof ([#563](https://github.com/dashevo/js-drive/issues/563)) - - - -# [0.20.0](https://github.com/dashevo/js-drive/compare/v0.19.3...v0.20.0) (2021-07-22) - - -### Features - -* use latest version of Merk storage ([#546](https://github.com/dashevo/js-drive/issues/546)) -* remove chainlock SML verification in favor of more robust core verification ([#536](https://github.com/dashevo/js-drive/issues/536)) -* remove SML instant lock verification in favor of more robust core verification [#533](https://github.com/dashevo/js-drive/issues/533)) -* make compatible with Tenderdash v0.5 ([#527](https://github.com/dashevo/js-drive/issues/527)) -* add additional info to proofs ([#518](https://github.com/dashevo/js-drive/issues/518), [#523](https://github.com/dashevo/js-drive/issues/523), [#525](https://github.com/dashevo/js-drive/issues/525), [#540](https://github.com/dashevo/js-drive/issues/540), [#542](https://github.com/dashevo/js-drive/issues/542)) -* validator set rotation ([#446](https://github.com/dashevo/js-drive/issues/446), [#515](https://github.com/dashevo/js-drive/issues/515), [#517](https://github.com/dashevo/js-drive/issues/517), [#530](https://github.com/dashevo/js-drive/issues/530), [#531](https://github.com/dashevo/js-drive/issues/531), ) - - -### Bug Fixes - -* invalid instant lock if no blocks are produced ([#513](https://github.com/dashevo/js-drive/issues/513)) -* `getProofs` method was missing from `PublicKeyToIdentityIdStoreRootTreeLeaf` class ([#544](https://github.com/dashevo/js-drive/issues/544)) -* typo in trace output ([#516](https://github.com/dashevo/js-drive/issues/516)) - - -### BREAKING CHANGES - -* `document`, `dataContract`, `identity`, `identityIdsByPublicKeyHashes` and `identitiesByPublicKeyHashes` query handlers now returns Protobuf messages instead of cbor'ed data. data is not sent if a proof is requested -* `VALIDATOR_SET_LLMQ_TYPE` env is required -* due to changes in hashing algorithm `appHash` is no longer same and not reproducible for old blocks hence new nodes would not be able to sync -* removing SML IS lock verification make some previously invalid transactions valid -* not compatible with Tenderdash v0.4 -* new ABCI messages and types not compatible with previous ones - - - -## [0.19.3](https://github.com/dashevo/js-drive/compare/v0.19.2...v0.19.3) (2021-06-04) - - -### Bug Fixes - -* documents were deleted using wrong id ([#514](https://github.com/dashevo/js-drive/issues/514)) - - - -## [0.19.2](https://github.com/dashevo/js-drive/compare/v0.19.1...v0.19.2) (2021-05-25) - - -### Bug Fixes - -* InvalidQuery error due to feature flags ([#512](https://github.com/dashevo/js-drive/issues/512)) - - - -## [0.19.1](https://github.com/dashevo/js-drive/compare/v0.19.0...v0.19.1) (2021-05-13) - - -### Bug Fixes - -* feature flags contract height variable has had an invalid name ([#509](https://github.com/dashevo/js-drive/issues/509)) - - - -# [0.19.0](https://github.com/dashevo/js-drive/compare/v0.18.1...v0.19.0) (2021-05-05) - - -### Features - -* use Dash Core to verify chain locks ([#503](https://github.com/dashevo/js-drive/issues/503), [#505](https://github.com/dashevo/js-drive/issues/505), [#506](https://github.com/dashevo/js-drive/issues/506)) -* verify instant locks using Dash Core ([#499](https://github.com/dashevo/js-drive/issues/499), [#501](https://github.com/dashevo/js-drive/issues/501), [#492](https://github.com/dashevo/js-drive/issues/492), [#498](https://github.com/dashevo/js-drive/issues/498)) -* feature flags ([#491](https://github.com/dashevo/js-drive/issues/491), [#504](https://github.com/dashevo/js-drive/issues/504), [#485](https://github.com/dashevo/js-drive/issues/485)) -* output Core network on start ([#490](https://github.com/dashevo/js-drive/issues/490)) -* update js-dp-services-ctl to 0.19-dev ([#486](https://github.com/dashevo/js-drive/issues/486)) -* enable docker build npm cache ([#478](https://github.com/dashevo/js-drive/issues/478)) -* do not setup node if SKIP_TEST_SUITE option is set ([#480](https://github.com/dashevo/js-drive/issues/480)) -* remove regtest fallbacks ([#477](https://github.com/dashevo/js-drive/issues/477)) -* add `verifyInstantLock` in favor of `getSMLStore` method ([#474](https://github.com/dashevo/js-drive/issues/474)) - - -### Bug Fixes - -* error loading shared library libzmq.so.5 ([#483](https://github.com/dashevo/js-drive/issues/483)) -* blockExecutionContext header might be null ([#481](https://github.com/dashevo/js-drive/issues/481)) - - -### BREAKING CHANGES - -* running in standalone regtest mode is not supported anymore -* `fetchSMLStore` method has been removed -* See [DPP v0.19 breaking changes](https://github.com/dashevo/js-dpp/releases/tag/v0.19.0) - - -# [0.18.1](https://github.com/dashevo/js-drive/compare/v0.18.0...v0.18.1) (2021-03-08) - - -### Documentation - -* polish changelog ([ac434e](https://github.com/dashevo/dapi/commit/ac434eea9e1588077445ac13a7f4c066a710a3ec)) - - - -# [0.18.0](https://github.com/dashevo/js-drive/compare/v0.17.14...v0.18.0) (2021-03-03) - - -### Bug Fixes - -* ABCI request length error still not parsing properly ([#476](https://github.com/dashevo/js-drive/issues/476)) - - -### Features - -* output ABCI connection error message ([ff3660a](https://github.com/dashevo/js-drive/commit/ff3660a638f0f4170ff3f7242f84c256e75fa4c6)) -* getProofs ABCI query endpoint ([#451](https://github.com/dashevo/js-drive/issues/451), [#462](https://github.com/dashevo/js-drive/issues/462)) - - - -## [0.17.14](https://github.com/dashevo/js-drive/compare/v0.18.0-dev.5...v0.17.14) (2021-02-20) - - -### Bug Fixes - -* can't parse ABCI request length error ([f55fac7](https://github.com/dashevo/js-drive/commit/f55fac7aced9334cf26e930cfaf23258cec66a9d)) - - - -## [0.17.13](https://github.com/dashevo/js-drive/compare/v0.17.12...v0.17.13) (2021-02-19) - - -### Features - -* reimplemented ABCI server for better reliability ([#475](https://github.com/dashevo/js-drive/issues/475)) - - - -## [0.17.12](https://github.com/dashevo/js-drive/compare/v0.17.11...v0.17.12) (2021-02-16) - - -### Features - -* better handle abci connection errors ([f4348e9](https://github.com/dashevo/js-drive/commit/f4348e944825dc9b554eec8dcf7752e972081b2a)) - - - -## [0.17.11](https://github.com/dashevo/js-drive/compare/v0.17.8...v0.17.11) (2021-02-16) - - -### Bug Fixes - -* stack overflow due to write on write error ([cb3e0ac](https://github.com/dashevo/js-drive/commit/cb3e0ac4212d95372c2b402496125afdf5e69cea)) - - - -## [0.17.10](https://github.com/dashevo/js-drive/compare/v0.17.8...v0.17.10) (2021-02-16) - - -### Bug Fixes - -* abci connection error writes to closed stream ([41a891a](https://github.com/dashevo/js-drive/commit/41a891a922bf2f924c543410dd6d19b3a3ba03d0)) - - - -## [0.17.9](https://github.com/dashevo/js-drive/compare/v0.17.8...v0.17.9) (2021-02-15) - - -### Features - -* robust error handling ([#473](https://github.com/dashevo/js-drive/issues/473)) -* use a different handler for ABCI connection error ([#465](https://github.com/dashevo/js-drive/issues/465), [b9d452a](https://github.com/dashevo/js-drive/commit/b9d452a20bdf75699fa532eb69af7500fc985045)) - - - -## [0.17.8](https://github.com/dashevo/js-drive/compare/v0.17.7...v0.17.8) (2021-02-11) - - -### Bug Fixes - -* could not resolve `previousBlockExecutionStoreTransactions` on query ([#470](https://github.com/dashevo/js-drive/issues/470)) - - -### Features - -* add `driveVersion` to every log output ([#469](https://github.com/dashevo/js-drive/issues/469)) -* await Node logger stream to be ended ([#471](https://github.com/dashevo/js-drive/issues/471)) -* distinguishing log data ([#472](https://github.com/dashevo/js-drive/issues/472)) - - - -## [0.17.7](https://github.com/dashevo/js-drive/compare/v0.17.6...v0.17.7) (2021-02-04) - - -### Features - -* disable state repository and merk logging by default ([#467](https://github.com/dashevo/js-drive/issues/467)) - - - -## [0.17.6](https://github.com/dashevo/js-drive/compare/v0.17.5...v0.17.6) (2021-01-26) - - -### Bug Fixes - -* only info log level is present in log streams ([#463](https://github.com/dashevo/js-drive/issues/463)) - - - -## [0.17.5](https://github.com/dashevo/js-drive/compare/v0.17.4...v0.17.5) (2021-01-21) - - -### Features - -* different logging levels ([#461](https://github.com/dashevo/js-drive/issues/461)) - - -### BREAKING CHANGES - -* `LOGGING_LEVEL` is ignored. Use `LOG_STDOUT_LEVEL`. - - - -## [0.17.4](https://github.com/dashevo/js-drive/compare/v0.17.3...v0.17.4) (2021-01-20) - - -### Bug Fixes - -* logger with context is not used in some cases ([#458](https://github.com/dashevo/js-drive/issues/458)) -* tx counters and logger were not reset ([#460](https://github.com/dashevo/js-drive/issues/460)) - - -### Features - -* log to human-readable and json files ([#459](https://github.com/dashevo/js-drive/issues/459)) - - - -## [0.17.3](https://github.com/dashevo/js-drive/compare/v0.17.2...v0.17.3) (2021-01-20) - - -### Features - -* better logging ([#456](https://github.com/dashevo/js-drive/issues/456)) - - - -## [0.17.2](https://github.com/dashevo/js-drive/compare/v0.17.1...v0.17.2) (2021-01-19) - - -### Bug Fixes - -* could not resolve 'previousBlockExecutionStoreTransactions' ([5a9dbff](https://github.com/dashevo/js-drive/commit/5a9dbffb05cfb85e6e394ed79538d979eb4a73a7)) -* ST isolation leads to non-deterministic results ([#455](https://github.com/dashevo/js-drive/issues/455)) -* handle rawChainLockMessage parsing errors ([#454](https://github.com/dashevo/js-drive/issues/454)) - - - -## [0.17.1](https://github.com/dashevo/js-drive/compare/v0.17.0...v0.17.1) (2021-01-12) - - -### Bug Fixes - -* duplicate MongoDB index name ([#453](https://github.com/dashevo/js-drive/issues/453)) - - - -# [0.17.0](https://github.com/dashevo/js-drive/compare/v0.16.1...v0.17.0) (2020-12-30) - - -### Features - -* introduce `DriveStateRepository#fetchSMLStore` ([#444](https://github.com/dashevo/js-drive/issues/444), [#445](https://github.com/dashevo/js-drive/issues/445)) -* update `dashcore-lib` ([#411](https://github.com/dashevo/js-drive/issues/411), [#442](https://github.com/dashevo/js-drive/issues/442), [#443](https://github.com/dashevo/js-drive/issues/443)) -* add old zmq client from DAPI ([#439](https://github.com/dashevo/js-drive/issues/439)) -* dashpay contract support ([#441](https://github.com/dashevo/js-drive/issues/441)) -* change merk to @dashevo/merk -* gracefull shutdown on SIGINT, SIGTERM, SIGQUIT and unhandled errors ([#427](https://github.com/dashevo/js-drive/issues/427)) -* handle core chain locked height ([#428](https://github.com/dashevo/js-drive/issues/428)) -* implement verify chainlock query handler ([#402](https://github.com/dashevo/js-drive/issues/402)) -* intermediate merk tree for the current block ([#429](https://github.com/dashevo/js-drive/issues/429)) -* pass latestCoreChainLock on block end ([#434](https://github.com/dashevo/js-drive/issues/434)) -* provide proofs for getIdentitiesByPublicKeyHashes endpoint ([#422](https://github.com/dashevo/js-drive/issues/422)) -* provide proofs for getIdentitiyIdsByPublicKeyHashes endpoint ([#419](https://github.com/dashevo/js-drive/issues/419)) -* provide proofs in ABCI query and DAPI getIdentity ([#415](https://github.com/dashevo/js-drive/issues/415)) -* set IDENTITY_SKIP_ASSET_LOCK_CONFIRMATION_VALIDATION to false ([#437](https://github.com/dashevo/js-drive/issues/437)) -* sort keys for MerkDB ([#413](https://github.com/dashevo/js-drive/issues/413)) -* store ChainInfo in MerkDb ([#404](https://github.com/dashevo/js-drive/issues/404)) -* store Data Contracts in merk tree ([#405](https://github.com/dashevo/js-drive/issues/405)) -* store documents in MerkDb ([#410](https://github.com/dashevo/js-drive/issues/410)) -* store height in externalStorage instead of merkDB ([#433](https://github.com/dashevo/js-drive/issues/433)) -* store identities in merk tree ([#400](https://github.com/dashevo/js-drive/issues/400)) -* store Public Key to Identity ID in MerkDb ([#409](https://github.com/dashevo/js-drive/issues/409)) -* update `dpp` to include asset lock verification logic ([#432](https://github.com/dashevo/js-drive/issues/432)) -* introduce merkle forest ([#401](https://github.com/dashevo/js-drive/issues/401)) -* move block execution context out of blockchain state ([#403](https://github.com/dashevo/js-drive/issues/403)) -* add abstraction for MerkDb ([#407](https://github.com/dashevo/js-drive/issues/407)) - - -### Bug Fixes - -* hash was used as a Buffer where it should be hex string ([#440](https://github.com/dashevo/js-drive/issues/440)) -* documents DB transaction is already started error ([#417](https://github.com/dashevo/js-drive/issues/417)) -* e.getErrors is not a function error ([#418](https://github.com/dashevo/js-drive/issues/418)) -* missing nested indexed fields and transaction ([#426](https://github.com/dashevo/js-drive/issues/426)) - - -### BREAKING CHANGES - -* AppHash is not equal to nils anymore. -* data created with 0.16 and lower versions of Drive is not compatible anymore -* ABCI query responses are changed - - - -## [0.16.1](https://github.com/dashevo/js-drive/compare/v0.16.0...v0.16.1) (2020-10-29) - - -### Bug Fixes - -* `header` is not present in `RequestEndBlock` ([#399](https://github.com/dashevo/js-drive/issues/399)) - - - -# [0.16.0](https://github.com/dashevo/js-drive/compare/v0.15.0...v0.16.0) (2020-10-28) - - -### Bug Fixes - -* incorrect deliver state transition hash logging ([#396](https://github.com/dashevo/js-drive/issues/396)) - - -### Features - -* verify DPNS contract existence ([#397](https://github.com/dashevo/js-drive/issues/397)) -* add `LoggedStateRepositoryDecorator` ([#393](https://github.com/dashevo/js-drive/issues/393)) -* debug mode to respond internal error with message and stack ([#383](https://github.com/dashevo/js-drive/issues/383)) -* implement `fetchIdentityIdsByPublicKeys` method ([#385](https://github.com/dashevo/js-drive/issues/385)) -* implement `storeIdentityPublicKeyHashes` method ([#387](https://github.com/dashevo/js-drive/issues/387)) -* implement getting identities by multiple public keys hashes ([#388](https://github.com/dashevo/js-drive/issues/388), [#395](https://github.com/dashevo/js-drive/issues/395), [#386](https://github.com/dashevo/js-drive/issues/386)) -* update DPP to 0.16.0 ([#392](https://github.com/dashevo/js-drive/issues/392)) - - -### Refactoring - -* remove unnecessary InvalidDocumentTypeError handling ([#384](https://github.com/dashevo/js-drive/issues/384)) - - -### BREAKING CHANGES - -* If `DPNS_CONTRACT_ID` is set it requires `DPNS_CONTRACT_BLOCK_HEIGHT` to be set too. -* See [DPP v0.16 breaking changes](https://github.com/dashevo/js-dpp/releases/tag/v0.16.0) - - - -# [0.15.0](https://github.com/dashevo/js-drive/compare/v0.14.0...v0.15.0) (2020-09-04) - - -### Bug Fixes - -* internal errors are not logged ([#380](https://github.com/dashevo/js-drive/issues/380)) -* unique index throws duplicate key error (#378) - - -### Features - -* handle protocol and software versions ([#377](https://github.com/dashevo/js-drive/issues/377)) -* handle user-defined binary fields ([#373](https://github.com/dashevo/js-drive/issues/373), [#381](https://github.com/dashevo/js-drive/issues/381)) - - -### BREAKING CHANGES - -* protocol version (`AppVersion`) is required in a Tendermint block header -* the previous state is not compatible due to new DPP serialization format -* See [DPP breaking changes](https://github.com/dashevo/js-dpp/releases/tag/v0.15.0) - - - -# [0.14.0](https://github.com/dashevo/drive/compare/v0.13.2...v0.14.0) (2020-07-23) - - -### Features - -* increase MongoDB query allowed field length ([#366](https://github.com/dashevo/drive/issues/366)) -* logging of block execution process ([#365](https://github.com/dashevo/drive/issues/365)) -* use test suite to run functional and e2e tests ([#362](https://github.com/dashevo/drive/issues/362)) -* update to DPP v0.14 with timestamps ([#363](https://github.com/dashevo/drive/issues/363)) - - -### BREAKING CHANGES - -* See [DPP v0.14 breaking changes](https://github.com/dashevo/js-dpp/releases/tag/v0.14.0) - - - -## [0.13.2](https://github.com/dashevo/drive/compare/v0.13.0-dev.2...v0.13.2) (2020-06-12) - - -### Bug Fixes - -* internal errors lead to inability to fix bugs as it leads to a state inconsistency ([#360](https://github.com/dashevo/drive/issues/360)) - - - -## [0.13.1](https://github.com/dashevo/drive/compare/v0.13.0...v0.13.1) (2020-06-12) - - -### Bug Fixes - -* document repository not created properly due to missing `await` ([#358](https://github.com/dashevo/drive/issues/358)) - - - -# [0.13.0](https://github.com/dashevo/drive/compare/v0.12.1...v0.13.0) (2020-06-08) - - -### Features - -* update to DPP 0.13 ([#336](https://github.com/dashevo/drive/issues/336), [#338](https://github.com/dashevo/drive/issues/338), [#340](https://github.com/dashevo/drive/issues/340), [#344](https://github.com/dashevo/drive/issues/344), [#346](https://github.com/dashevo/drive/issues/346), [#348](https://github.com/dashevo/drive/issues/348), [#354](https://github.com/dashevo/drive/issues/354), [#357](https://github.com/dashevo/drive/issues/357)) -* wait mongoDB replica set initialization ([#349](https://github.com/dashevo/drive/issues/349)) -* wait for Core to be synced before starting ([#345](https://github.com/dashevo/drive/issues/345), [#353](https://github.com/dashevo/drive/issues/353), [#356](https://github.com/dashevo/drive/issues/356)) -* get identity by public key endpoints ([#341](https://github.com/dashevo/drive/issues/341)) -* store identity id with identity's public key as a DB key ([#337](https://github.com/dashevo/drive/issues/337), [#339](https://github.com/dashevo/drive/issues/339)) - - -### Code Refactoring - -* use async function with cache to connect and get `MongoClient` ([#350](https://github.com/dashevo/drive/issues/350)) - - -### BREAKING CHANGES - -* see [DPP breaking changes](https://github.com/dashevo/js-dpp/releases/tag/v0.13.0) - - - -## [0.12.2](https://github.com/dashevo/drive/compare/v0.12.1...v0.12.2) (2020-05-21) - - -### Bug Fixes - -* validateFee error handling expects only BalanceIsNotEnoughError ([#343](https://github.com/dashevo/drive/issues/343)) - - - -## [0.12.1](https://github.com/dashevo/drive/compare/v0.12.0...v0.12.1) (2020-04-22) - - -### Features - -* update `dpp` version to `0.12.1` ([#335](https://github.com/dashevo/drive/issues/335)) - - -# [0.12.0](https://github.com/dashevo/drive/compare/v0.11.1...v0.12.0) (2020-04-18) - -### Features - -* publish docker image with tag for every Semver segment ([#332](https://github.com/dashevo/drive/issues/332)) -* introduce ABCI and Machine logic, remove API and upgrade to DPP 0.12 ([#328](https://github.com/dashevo/drive/issues/328)) -* validate fee, reduce balance and move fees to distribution pool ([#329](https://github.com/dashevo/drive/issues/329)) - -### BREAKING CHANGES - -* JSON RPC and gRPC endpoints are removed. Use Tendermint ABCI query endpoint in order to fetch data -* see [DPP breaking changes](https://github.com/dashevo/js-dpp/releases/tag/v0.12.0) - - -## [0.11.1](https://github.com/dashevo/drive/compare/v0.11.0...v0.11.1) (2020-03-17) - -### Bug Fixes - -* do not validate ST second time in `applyStateTransition` ([d296608](https://github.com/dashevo/drive/commit/d29660886deb7e5556c5346da54506aebc005bfa)) -* check for MongoDb replica set on start ([286074f](https://github.com/dashevo/drive/commit/286074fe297bb693ffe7492523e560aeb2512330)) - -# [0.11.0](https://github.com/dashevo/drive/compare/v0.7.0...v0.11.0) (2020-03-09) - -### Bug Fixes - -* prevent to update dependencies with major version `0` to minor versions ([9f1dd95](https://github.com/dashevo/drive/commit/9f1dd95fe2294de2d0a3157807eec9598d0f0db7)) - -### Features - -* upgrade DPP to v0.11 ([9797e51](https://github.com/dashevo/drive/commit/9797e51bee6899c07aabcf733fa54650037c42cd)) - -### Chore - -* update gRPC errors ([1d31326](https://github.com/dashevo/drive/commit/1d31326977b2b5f1537426d9d31d89f459aaace6)) - -### BREAKING CHANGES - -* see [DPP breaking changes](https://github.com/dashevo/js-dpp/releases/tag/v0.11.0) diff --git a/packages/js-drive/Dockerfile b/packages/js-drive/Dockerfile deleted file mode 100644 index 0dfb7f69180..00000000000 --- a/packages/js-drive/Dockerfile +++ /dev/null @@ -1,114 +0,0 @@ -# syntax = docker/dockerfile:1.3 -FROM node:16-alpine3.16 as builder - -ARG NODE_ENV=production -ENV NODE_ENV ${NODE_ENV} - -ARG CARGO_BUILD_PROFILE=debug -ENV CARGO_BUILD_PROFILE ${CARGO_BUILD_PROFILE} - -RUN apk update && \ - apk --no-cache upgrade && \ - apk add --no-cache git \ - openssh-client \ - linux-headers \ - python3 \ - alpine-sdk \ - cmake \ - zeromq-dev \ - ca-certificates \ - gcc \ - clang \ - libc-dev \ - binutils \ - bash - -# Install Rust -ENV RUSTUP_HOME=/usr/local/rustup \ - CARGO_HOME=/usr/local/cargo \ - PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=stable - -RUN set -eux; \ - apkArch="$(apk --print-arch)"; \ - case "$apkArch" in \ - x86_64) rustArch='x86_64-unknown-linux-musl'; rustupSha256='bdf022eb7cba403d0285bb62cbc47211f610caec24589a72af70e1e900663be9' ;; \ - aarch64) rustArch='aarch64-unknown-linux-musl'; rustupSha256='89ce657fe41e83186f5a6cdca4e0fd40edab4fd41b0f9161ac6241d49fbdbbbe' ;; \ - *) echo >&2 "unsupported architecture: $apkArch"; exit 1 ;; \ - esac; \ - url="https://static.rust-lang.org/rustup/archive/1.24.3/${rustArch}/rustup-init"; \ - wget "$url"; \ - echo "${rustupSha256} *rustup-init" | sha256sum -c -; \ - chmod +x rustup-init; \ - ./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \ - rm rustup-init; \ - chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \ - rustup --version; \ - cargo --version; \ - rustc --version; - -# Enable corepack https://github.com/nodejs/corepack -RUN corepack enable - -# Print build output -RUN yarn config set enableInlineBuilds true - -WORKDIR /platform - -# Copy yarn and Cargo files -COPY .yarn /platform/.yarn -COPY .cargo /platform/.cargo -COPY package.json yarn.lock .yarnrc.yml .pnp.* Cargo.toml Cargo.lock rust-toolchain.toml ./ - -# Copy only necessary packages from monorepo -COPY packages/js-drive packages/js-drive -COPY packages/rs-dpp packages/rs-dpp -COPY packages/wasm-dpp packages/wasm-dpp -COPY packages/rs-drive packages/rs-drive -COPY packages/rs-drive-abci packages/rs-drive-abci -COPY packages/rs-platform-value packages/rs-platform-value -COPY packages/rs-drive-nodejs packages/rs-drive-nodejs -COPY packages/dapi-grpc packages/dapi-grpc -COPY packages/js-dpp packages/js-dpp -COPY packages/js-grpc-common packages/js-grpc-common -COPY packages/dashpay-contract packages/dashpay-contract -COPY packages/dpns-contract packages/dpns-contract -COPY packages/feature-flags-contract packages/feature-flags-contract -COPY packages/masternode-reward-shares-contract packages/masternode-reward-shares-contract -COPY packages/withdrawals-contract packages/withdrawals-contract -COPY packages/data-contracts packages/data-contracts - -# Build RS Drive Node.JS binding -RUN --mount=type=cache,target=target \ - --mount=type=cache,target=$CARGO_HOME/git \ - --mount=type=cache,target=$CARGO_HOME/registry \ - yarn workspace @dashevo/rs-drive build - -# Install Drive-specific dependencies using previous -# node_modules directory to reuse built binaries -RUN --mount=type=cache,target=/tmp/unplugged \ - cp -R /tmp/unplugged /platform/.yarn/ && \ - yarn workspaces focus --production @dashevo/drive && \ - cp -R /platform/.yarn/unplugged /tmp/ - -FROM node:16-alpine3.16 - -ARG NODE_ENV=production -ENV NODE_ENV ${NODE_ENV} - -LABEL maintainer="Dash Developers " -LABEL description="Drive Node.JS" - -# Install ZMQ shared library -RUN apk update && apk add --no-cache zeromq-dev - -WORKDIR /platform - -COPY --from=builder /platform /platform - -# Remove Rust sources -RUN rm -rf packages/rs-drive packages/rs-drive-abci packages/rs-dpp packages/rs-platform-value - -RUN cp /platform/packages/js-drive/.env.example /platform/packages/js-drive/.env - -EXPOSE 26658 diff --git a/packages/js-drive/LICENSE b/packages/js-drive/LICENSE deleted file mode 100644 index 54f58e74bf7..00000000000 --- a/packages/js-drive/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017-2023 Dash Core Group, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/js-drive/README.md b/packages/js-drive/README.md deleted file mode 100644 index 23763e50481..00000000000 --- a/packages/js-drive/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# Drive - -[![Latest Release](https://img.shields.io/github/v/release/dashpay/platform)](https://github.com/dashpay/platform/releases/latest) -[![Build Status](https://github.com/dashpay/platform/actions/workflows/release.yml/badge.svg)](https://github.com/dashpay/platform/actions/workflows/release.yml) -[![Release Date](https://img.shields.io/github/release-date/dashpay/platform)](https://github.com/dashpay/platform/releases/latest) -[![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen)](https://github.com/RichardLitt/standard-readme) - -Replicated state machine for Dash Platform - -Drive is the storage component of Dash Platform, allowing developers to store and secure their application data through Dash's masternode network. Application data structures are defined by a data contract, which is stored on Drive and used to verify/validate updates to your application data. - -## Table of Contents -- [Install](#install) -- [Usage](#usage) -- [Configuration](#configuration) -- [Tests](#tests) -- [Maintainer](#maintainer) -- [Contributing](#contributing) -- [License](#license) - -## Install - -1. [Install Node.JS 12 or higher](https://nodejs.org/en/download/) -2. Copy `.env.example` to `.env` file -3. Install npm dependencies: `npm install` - -## Usage - -```bash -npm run abci -``` - -## Configuration - -Drive uses environment variables for configuration. -Variables are read from `.env` file and can be overwritten by variables -defined in env or directly passed to the process. - -See all available settings in [.env.example](.env.example). - -## Tests - -[Read](test/) about tests in `test/` folder. - -## Maintainer - -[@shumkov](https://github.com/shumkov) - -## Contributing - -Feel free to dive in! [Open an issue](https://github.com/dashpay/platform/issues/new/choose) or submit PRs. - -## License - -[MIT](LICENSE) © Dash Core Group, Inc. diff --git a/packages/js-drive/db/.gitignore b/packages/js-drive/db/.gitignore deleted file mode 100644 index 593bcf0e80e..00000000000 --- a/packages/js-drive/db/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -!.gitignore -* diff --git a/packages/js-drive/lib/abci/closeAbciServerFactory.js b/packages/js-drive/lib/abci/closeAbciServerFactory.js deleted file mode 100644 index 141cdeb9b3b..00000000000 --- a/packages/js-drive/lib/abci/closeAbciServerFactory.js +++ /dev/null @@ -1,25 +0,0 @@ -const { promisify } = require('util'); - -/** - * - * @param {net.Server} abciServer - * @return {closeAbciServer} - */ -function closeAbciServerFactory(abciServer) { - /** - * @typedef {closeAbciServer} - * @return {Promise} - */ - async function closeAbciServer() { - if (!abciServer.listening) { - return; - } - - const close = promisify(abciServer.close.bind(abciServer)); - await close(); - } - - return closeAbciServer; -} - -module.exports = closeAbciServerFactory; diff --git a/packages/js-drive/lib/abci/errors/AbstractAbciError.js b/packages/js-drive/lib/abci/errors/AbstractAbciError.js deleted file mode 100644 index ae054bc477d..00000000000 --- a/packages/js-drive/lib/abci/errors/AbstractAbciError.js +++ /dev/null @@ -1,68 +0,0 @@ -const cbor = require('cbor'); - -const DriveError = require('../../errors/DriveError'); - -/** - * @abstract - */ -class AbstractAbciError extends DriveError { - /** - * - * @param {number} code - * @param {string} message - * @param {Object} data - */ - constructor(code, message, data) { - super(message); - - this.code = code; - this.data = data; - } - - /** - * @returns {string} - */ - getMessage() { - return this.message; - } - - /** - * Get error code - * - * @returns {number} - */ - getCode() { - return this.code; - } - - /** - * Get error data - * - * @returns {Object} - */ - getData() { - return this.data; - } - - /** - * @returns {{code: number, info: string}} - */ - getAbciResponse() { - const info = { - message: this.getMessage(), - }; - - const data = this.getData(); - - if (Object.keys(data).length > 0) { - info.data = data; - } - - return { - code: this.getCode(), - info: cbor.encode(info).toString('base64'), - }; - } -} - -module.exports = AbstractAbciError; diff --git a/packages/js-drive/lib/abci/errors/DPPValidationAbciError.js b/packages/js-drive/lib/abci/errors/DPPValidationAbciError.js deleted file mode 100644 index 7fcf434a5c0..00000000000 --- a/packages/js-drive/lib/abci/errors/DPPValidationAbciError.js +++ /dev/null @@ -1,44 +0,0 @@ -const cbor = require('cbor'); - -const AbstractAbciError = require('./AbstractAbciError'); - -class DPPValidationAbciError extends AbstractAbciError { - /** - * - * @param {string} message - * @param {AbstractConsensusError} consensusError - */ - constructor(message, consensusError) { - const args = consensusError.getConstructorArguments(); - - const data = { }; - if (args.length > 0) { - data.arguments = args; - } - - super(consensusError.getCode(), message, data); - } - - /** - * @returns {{code: number, info: string}} - */ - getAbciResponse() { - const info = { }; - - const data = this.getData(); - - let encodedInfo; - if (Object.keys(data).length > 0) { - info.data = data; - - encodedInfo = cbor.encode(info).toString('base64'); - } - - return { - code: this.getCode(), - info: encodedInfo, - }; - } -} - -module.exports = DPPValidationAbciError; diff --git a/packages/js-drive/lib/abci/errors/InternalAbciError.js b/packages/js-drive/lib/abci/errors/InternalAbciError.js deleted file mode 100644 index bc5ac65b1c4..00000000000 --- a/packages/js-drive/lib/abci/errors/InternalAbciError.js +++ /dev/null @@ -1,25 +0,0 @@ -const grpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); - -const AbstractAbciError = require('./AbstractAbciError'); - -class InternalAbciError extends AbstractAbciError { - /** - * - * @param {Error} error - * @param {Object} [data] - */ - constructor(error, data = {}) { - super(grpcErrorCodes.INTERNAL, 'Internal error', data); - - this.error = error; - } - - /** - * @returns {Error} - */ - getError() { - return this.error; - } -} - -module.exports = InternalAbciError; diff --git a/packages/js-drive/lib/abci/errors/InvalidArgumentAbciError.js b/packages/js-drive/lib/abci/errors/InvalidArgumentAbciError.js deleted file mode 100644 index dc66740da1f..00000000000 --- a/packages/js-drive/lib/abci/errors/InvalidArgumentAbciError.js +++ /dev/null @@ -1,16 +0,0 @@ -const grpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); - -const AbstractAbciError = require('./AbstractAbciError'); - -class InvalidArgumentAbciError extends AbstractAbciError { - /** - * - * @param {string} message - * @param {Object} [data] - */ - constructor(message, data = {}) { - super(grpcErrorCodes.INVALID_ARGUMENT, message, data); - } -} - -module.exports = InvalidArgumentAbciError; diff --git a/packages/js-drive/lib/abci/errors/NotFoundAbciError.js b/packages/js-drive/lib/abci/errors/NotFoundAbciError.js deleted file mode 100644 index 1daeb9325c1..00000000000 --- a/packages/js-drive/lib/abci/errors/NotFoundAbciError.js +++ /dev/null @@ -1,16 +0,0 @@ -const grpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); - -const AbstractAbciError = require('./AbstractAbciError'); - -class NotFoundAbciError extends AbstractAbciError { - /** - * - * @param {string} message - * @param {Object} [data] - */ - constructor(message, data = {}) { - super(grpcErrorCodes.NOT_FOUND, message, data); - } -} - -module.exports = NotFoundAbciError; diff --git a/packages/js-drive/lib/abci/errors/UnavailableAbciError.js b/packages/js-drive/lib/abci/errors/UnavailableAbciError.js deleted file mode 100644 index 227aff45fe4..00000000000 --- a/packages/js-drive/lib/abci/errors/UnavailableAbciError.js +++ /dev/null @@ -1,16 +0,0 @@ -const grpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); - -const AbstractAbciError = require('./AbstractAbciError'); - -class UnavailableAbciError extends AbstractAbciError { - /** - * - * @param {string} message - * @param {Object} [data] - */ - constructor(message, data = {}) { - super(grpcErrorCodes.UNAVAILABLE, message, data); - } -} - -module.exports = UnavailableAbciError; diff --git a/packages/js-drive/lib/abci/errors/UnimplementedAbciError.js b/packages/js-drive/lib/abci/errors/UnimplementedAbciError.js deleted file mode 100644 index 81e279f2039..00000000000 --- a/packages/js-drive/lib/abci/errors/UnimplementedAbciError.js +++ /dev/null @@ -1,16 +0,0 @@ -const grpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); - -const AbstractAbciError = require('./AbstractAbciError'); - -class UnimplementedAbciError extends AbstractAbciError { - /** - * - * @param {string} message - * @param {Object} [data] - */ - constructor(message, data = {}) { - super(grpcErrorCodes.UNIMPLEMENTED, message, data); - } -} - -module.exports = UnimplementedAbciError; diff --git a/packages/js-drive/lib/abci/errors/VerboseInternalAbciError.js b/packages/js-drive/lib/abci/errors/VerboseInternalAbciError.js deleted file mode 100644 index fe13d71c83c..00000000000 --- a/packages/js-drive/lib/abci/errors/VerboseInternalAbciError.js +++ /dev/null @@ -1,30 +0,0 @@ -const InternalAbciError = require('./InternalAbciError'); - -class VerboseInternalAbciError extends InternalAbciError { - /** - * - * @param {InternalAbciError} error - */ - constructor(error) { - const originalError = error.getError(); - let [, errorPath] = originalError.stack.toString().split(/\r\n|\n/); - - if (!errorPath) { - errorPath = originalError.stack; - } - - const message = `${originalError.message} ${errorPath.trim()}`; - - const data = error.getData() || {}; - data.stack = originalError.stack; - - super( - originalError, - data, - ); - - this.message = message; - } -} - -module.exports = VerboseInternalAbciError; diff --git a/packages/js-drive/lib/abci/errors/createContextLoggerFactory.js b/packages/js-drive/lib/abci/errors/createContextLoggerFactory.js deleted file mode 100644 index 4e9b52354f6..00000000000 --- a/packages/js-drive/lib/abci/errors/createContextLoggerFactory.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * - * @param {AsyncLocalStorage} abciAsyncLocalStorage - * @return {createContextLogger} - */ -function createContextLoggerFactory(abciAsyncLocalStorage) { - /** - * @typedef {createContextLogger} - * @param {Logger} logger - * @param {Object} context - * @return {Logger} - */ - function createContextLogger(logger, context) { - const contextLogger = logger.child(context); - - abciAsyncLocalStorage.getStore().set('logger', contextLogger); - - return contextLogger; - } - - return createContextLogger; -} - -module.exports = createContextLoggerFactory; diff --git a/packages/js-drive/lib/abci/errors/enrichErrorWithContextLoggerFactory.js b/packages/js-drive/lib/abci/errors/enrichErrorWithContextLoggerFactory.js deleted file mode 100644 index 2493c6d7c92..00000000000 --- a/packages/js-drive/lib/abci/errors/enrichErrorWithContextLoggerFactory.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Add consensus logger to an error (factory) - * - * @param {AsyncLocalStorage} abciAsyncLocalStorage - * @return {enrichErrorWithContextLogger} - */ -function enrichErrorWithContextLoggerFactory(abciAsyncLocalStorage) { - /** - * Add consensus logger to an error - * - * @typedef enrichErrorWithContextLogger - * - * @param {Function} method - * - * @return {Function} - */ - function enrichErrorWithContextLogger(method) { - /** - * @param {*[]} args - */ - async function methodHandler(...args) { - return abciAsyncLocalStorage.run( - new Map(), - () => method(...args).catch((error) => { - // eslint-disable-next-line no-param-reassign - error.contextLogger = abciAsyncLocalStorage.getStore().get('logger'); - - return Promise.reject(error); - }), - ); - } - - return methodHandler; - } - - return enrichErrorWithContextLogger; -} - -module.exports = enrichErrorWithContextLoggerFactory; diff --git a/packages/js-drive/lib/abci/errors/wrapInErrorHandlerFactory.js b/packages/js-drive/lib/abci/errors/wrapInErrorHandlerFactory.js deleted file mode 100644 index 8445605f767..00000000000 --- a/packages/js-drive/lib/abci/errors/wrapInErrorHandlerFactory.js +++ /dev/null @@ -1,63 +0,0 @@ -const AbstractAbciError = require('./AbstractAbciError'); -const InternalAbciError = require('./InternalAbciError'); -const VerboseInternalAbciError = require('./VerboseInternalAbciError'); - -/** - * @param {BaseLogger} logger - * @param {boolean} isProductionEnvironment - * - * @return wrapInErrorHandler - */ -function wrapInErrorHandlerFactory(logger, isProductionEnvironment) { - /** - * Wrap ABCI methods in error handler - * - * @typedef wrapInErrorHandler - * - * @param {Function} method - * - * @return {Function} - */ - function wrapInErrorHandler(method) { - /** - * @param {*[]} args - */ - async function methodErrorHandler(...args) { - try { - return await method(...args); - } catch (e) { - let abciError = e; - - // Wrap all non ABCI errors to an internal ABCI error - if (!(e instanceof AbstractAbciError)) { - abciError = new InternalAbciError(e); - } - - // Log only internal ABCI errors - if (abciError instanceof InternalAbciError) { - const originalError = abciError.getError(); - - const preferredLogger = originalError.contextLogger || logger; - delete originalError.contextLogger; - - preferredLogger.error( - { err: originalError }, - originalError.message, - ); - - if (!isProductionEnvironment) { - abciError = new VerboseInternalAbciError(abciError); - } - } - - return abciError.getAbciResponse(); - } - } - - return methodErrorHandler; - } - - return wrapInErrorHandler; -} - -module.exports = wrapInErrorHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/checkTxHandlerFactory.js b/packages/js-drive/lib/abci/handlers/checkTxHandlerFactory.js deleted file mode 100644 index 05057f6a239..00000000000 --- a/packages/js-drive/lib/abci/handlers/checkTxHandlerFactory.js +++ /dev/null @@ -1,44 +0,0 @@ -const { - tendermint: { - abci: { - ResponseCheckTx, - }, - }, -} = require('@dashevo/abci/types'); - -/** - * @param {unserializeStateTransition} unserializeStateTransition - * @param {AsyncLocalStorage} unserializeStateTransition - * @param {createContextLogger} createContextLogger - * @param {Logger} logger - * - * @returns {checkTxHandler} - */ -function checkTxHandlerFactory( - unserializeStateTransition, - createContextLogger, - logger, -) { - /** - * CheckTx ABCI Handler - * - * @typedef checkTxHandler - * - * @param {abci.RequestCheckTx} request - * - * @returns {Promise} - */ - async function checkTxHandler({ tx: stateTransitionByteArray }) { - createContextLogger(logger, { - abciMethod: 'checkTx', - }); - - await unserializeStateTransition(stateTransitionByteArray); - - return new ResponseCheckTx(); - } - - return checkTxHandler; -} - -module.exports = checkTxHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/errors/NetworkProtocolVersionIsNotSetError.js b/packages/js-drive/lib/abci/handlers/errors/NetworkProtocolVersionIsNotSetError.js deleted file mode 100644 index 39a8ca62828..00000000000 --- a/packages/js-drive/lib/abci/handlers/errors/NetworkProtocolVersionIsNotSetError.js +++ /dev/null @@ -1,9 +0,0 @@ -const DriveError = require('../../../errors/DriveError'); - -class NetworkProtocolVersionIsNotSetError extends DriveError { - constructor() { - super('Network protocol version is not set'); - } -} - -module.exports = NetworkProtocolVersionIsNotSetError; diff --git a/packages/js-drive/lib/abci/handlers/errors/NotSupportedNetworkProtocolVersionError.js b/packages/js-drive/lib/abci/handlers/errors/NotSupportedNetworkProtocolVersionError.js deleted file mode 100644 index 5422637b6b2..00000000000 --- a/packages/js-drive/lib/abci/handlers/errors/NotSupportedNetworkProtocolVersionError.js +++ /dev/null @@ -1,30 +0,0 @@ -const DriveError = require('../../../errors/DriveError'); - -class NotSupportedNetworkProtocolVersionError extends DriveError { - /** - * @param {Long} networkProtocolVersion - * @param {Long} latestProtocolVersion - */ - constructor(networkProtocolVersion, latestProtocolVersion) { - super(`Block protocol version ${networkProtocolVersion} not supported. Expected to be less or equal to ${latestProtocolVersion}.`); - - this.networkProtocolVersion = networkProtocolVersion; - this.latestProtocolVersion = latestProtocolVersion; - } - - /** - * @returns {Long} - */ - getNetworkProtocolVersion() { - return this.networkProtocolVersion; - } - - /** - * @returns {Long} - */ - getLatestProtocolVersion() { - return this.latestProtocolVersion; - } -} - -module.exports = NotSupportedNetworkProtocolVersionError; diff --git a/packages/js-drive/lib/abci/handlers/extendVoteHandlerFactory.js b/packages/js-drive/lib/abci/handlers/extendVoteHandlerFactory.js deleted file mode 100644 index 9d0e1ef786c..00000000000 --- a/packages/js-drive/lib/abci/handlers/extendVoteHandlerFactory.js +++ /dev/null @@ -1,67 +0,0 @@ -const { - tendermint: { - abci: { - ResponseExtendVote, - }, - types: { - VoteExtensionType, - }, - }, -} = require('@dashevo/abci/types'); - -/** - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {createContextLogger} createContextLogger - * - * @return {extendVoteHandler} - */ -function extendVoteHandlerFactory(proposalBlockExecutionContext, createContextLogger) { - /** - * @typedef extendVoteHandler - * @return {Promise} - */ - async function extendVoteHandler() { - const contextLogger = createContextLogger(proposalBlockExecutionContext.getContextLogger(), { - abciMethod: 'extendVote', - }); - - contextLogger.debug('ExtendVote ABCI method requested'); - - const unsignedWithdrawalTransactionsMap = proposalBlockExecutionContext - .getWithdrawalTransactionsMap(); - - const voteExtensions = Object.keys(unsignedWithdrawalTransactionsMap) - .sort() - .map((txHashHex) => ({ - type: VoteExtensionType.THRESHOLD_RECOVER, - extension: Buffer.from(txHashHex, 'hex'), - })); - - const voteExtensionTypeName = { - [VoteExtensionType.DEFAULT]: 'default', - [VoteExtensionType.THRESHOLD_RECOVER]: 'threshold recovery', - }; - - voteExtensions.forEach(({ extension, type }) => { - const extensionString = extension.toString('hex'); - - const extensionTruncatedString = extensionString.substring( - 0, - Math.min(30, extensionString.length), - ); - - contextLogger.debug({ - type, - extension: extensionString, - }, `Vote extended to obtain ${voteExtensionTypeName} signature for ${extensionTruncatedString}... payload`); - }); - - return new ResponseExtendVote({ - voteExtensions, - }); - } - - return extendVoteHandler; -} - -module.exports = extendVoteHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/finalizeBlockHandlerFactory.js b/packages/js-drive/lib/abci/handlers/finalizeBlockHandlerFactory.js deleted file mode 100644 index 1d3dfdaf4fb..00000000000 --- a/packages/js-drive/lib/abci/handlers/finalizeBlockHandlerFactory.js +++ /dev/null @@ -1,145 +0,0 @@ -const { - tendermint: { - abci: { - ResponseFinalizeBlock, - RequestProcessProposal, - }, - }, -} = require('@dashevo/abci/types'); - -const lodashCloneDeep = require('lodash/cloneDeep'); - -/** - * - * @return {finalizeBlockHandler} - * @param {GroveDBStore} groveDBStore - * @param {BlockExecutionContextRepository} blockExecutionContextRepository - * @param {BaseLogger} logger - * @param {ExecutionTimer} executionTimer - * @param {BlockExecutionContext} latestBlockExecutionContext - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {processProposal} processProposal - * @param {broadcastWithdrawalTransactions} broadcastWithdrawalTransactions - * @param {createContextLogger} createContextLogger - * - */ -function finalizeBlockHandlerFactory( - groveDBStore, - blockExecutionContextRepository, - logger, - executionTimer, - latestBlockExecutionContext, - proposalBlockExecutionContext, - processProposal, - broadcastWithdrawalTransactions, - createContextLogger, -) { - /** - * @typedef finalizeBlockHandler - * - * @param {abci.RequestFinalizeBlock} request - * @return {Promise} - */ - async function finalizeBlockHandler(request) { - const { - commit: commitInfo, - height, - round, - } = request; - - const contextLogger = createContextLogger(logger, { - height: height.toString(), - round, - abciMethod: 'finalizeBlock', - }); - - const requestToLog = lodashCloneDeep(request); - delete requestToLog.block.data; - - contextLogger.debug('FinalizeBlock ABCI method requested'); - contextLogger.trace({ abciRequest: requestToLog }); - - const lastProcessedRound = proposalBlockExecutionContext.getRound(); - - if (lastProcessedRound !== round) { - contextLogger.warn({ - lastProcessedRound, - round, - }, `Finalizing previously executed round ${round} instead of the last known ${lastProcessedRound}`); - - const { - block: { - header: { - time, - version, - proposerProTxHash, - proposedAppVersion, - coreChainLockedHeight, - }, - data: { - txs, - }, - }, - } = request; - - const processProposalRequest = new RequestProcessProposal({ - height, - txs, - coreChainLockedHeight, - version, - proposedLastCommit: commitInfo, - time, - proposerProTxHash, - proposedAppVersion, - round, - }); - - await processProposal(processProposalRequest, contextLogger); - } - - // Send withdrawal transactions to Core - const unsignedWithdrawalTransactionsMap = proposalBlockExecutionContext - .getWithdrawalTransactionsMap(); - - const { thresholdVoteExtensions } = commitInfo; - - await broadcastWithdrawalTransactions( - proposalBlockExecutionContext, - thresholdVoteExtensions, - unsignedWithdrawalTransactionsMap, - ); - - proposalBlockExecutionContext.setLastCommitInfo(commitInfo); - - // Store proposal block execution context - await blockExecutionContextRepository.store( - proposalBlockExecutionContext, - { - useTransaction: true, - }, - ); - - // Commit the current block db transactions into storage - await groveDBStore.commitTransaction(); - - // Update last block execution context with proposal data - latestBlockExecutionContext.populate(proposalBlockExecutionContext); - - proposalBlockExecutionContext.reset(); - - const blockExecutionTimings = executionTimer.stopTimer('blockExecution'); - - contextLogger.info( - { - timings: blockExecutionTimings, - }, - `Block #${height} finalized in ${round + 1} round(s) and ${blockExecutionTimings} seconds`, - ); - - return new ResponseFinalizeBlock(); - } - - return finalizeBlockHandler; -} - -module.exports = finalizeBlockHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/infoHandlerFactory.js b/packages/js-drive/lib/abci/handlers/infoHandlerFactory.js deleted file mode 100644 index 0d056c005d0..00000000000 --- a/packages/js-drive/lib/abci/handlers/infoHandlerFactory.js +++ /dev/null @@ -1,94 +0,0 @@ -const { - tendermint: { - abci: { - ResponseInfo, - }, - }, -} = require('@dashevo/abci/types'); - -const Long = require('long'); - -const { version: driveVersion } = require('../../../package.json'); - -/** - * @param {BlockExecutionContext} latestBlockExecutionContext - * @param {BlockExecutionContextRepository} blockExecutionContextRepository - * @param {Long} latestProtocolVersion - * @param {updateSimplifiedMasternodeList} updateSimplifiedMasternodeList - * @param {BaseLogger} logger - * @param {GroveDBStore} groveDBStore - * @param {createContextLogger} createContextLogger - * @return {infoHandler} - */ -function infoHandlerFactory( - latestBlockExecutionContext, - blockExecutionContextRepository, - latestProtocolVersion, - updateSimplifiedMasternodeList, - logger, - groveDBStore, - createContextLogger, -) { - /** - * Info ABCI handler - * - * @typedef infoHandler - * - * @param {abci.RequestInfo} request - * @return {Promise} - */ - async function infoHandler(request) { - let contextLogger = createContextLogger(logger, { - abciMethod: 'info', - }); - - contextLogger.debug('Info ABCI method requested'); - contextLogger.trace({ abciRequest: request }); - - // Initialize current heights - - let lastHeight = Long.fromNumber(0); - let lastCoreChainLockedHeight = 0; - - // Initialize latest Block Execution Context - const persistedBlockExecutionContext = await blockExecutionContextRepository.fetch(); - if (!persistedBlockExecutionContext.isEmpty()) { - latestBlockExecutionContext.populate(persistedBlockExecutionContext); - - lastHeight = latestBlockExecutionContext.getHeight(); - lastCoreChainLockedHeight = latestBlockExecutionContext.getCoreChainLockedHeight(); - - contextLogger = createContextLogger(contextLogger, { - height: lastHeight.toString(), - }); - - // Update SML store to latest saved core chain lock to make sure - // that verify chain lock handler has updated SML Store to verify signatures - await updateSimplifiedMasternodeList(lastCoreChainLockedHeight, { - logger: contextLogger, - }); - } - - const appHash = await groveDBStore.getRootHash(); - - contextLogger.info( - { - lastHeight: lastHeight.toString(), - appHash: appHash.toString('hex').toUpperCase(), - latestProtocolVersion: latestProtocolVersion.toString(), - }, - `Start processing from block #${lastHeight} with appHash ${appHash.toString('hex').toUpperCase()}`, - ); - - return new ResponseInfo({ - version: driveVersion, - appVersion: latestProtocolVersion, - lastBlockHeight: lastHeight, - lastBlockAppHash: appHash, - }); - } - - return infoHandler; -} - -module.exports = infoHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/initChainHandlerFactory.js b/packages/js-drive/lib/abci/handlers/initChainHandlerFactory.js deleted file mode 100644 index 51f1b73aa0c..00000000000 --- a/packages/js-drive/lib/abci/handlers/initChainHandlerFactory.js +++ /dev/null @@ -1,150 +0,0 @@ -const { - tendermint: { - abci: { - ResponseInitChain, - }, - }, -} = require('@dashevo/abci/types'); - -const BlockInfo = require('../../blockExecution/BlockInfo'); -const protoTimestampToMillis = require('../../util/protoTimestampToMillis'); - -/** - * Init Chain ABCI handler - * - * @param {updateSimplifiedMasternodeList} updateSimplifiedMasternodeList - * @param {number} initialCoreChainLockedHeight - * @param {ValidatorSet} validatorSet - * @param {createValidatorSetUpdate} createValidatorSetUpdate - * @param {synchronizeMasternodeIdentities} synchronizeMasternodeIdentities - * @param {BaseLogger} logger - * @param {GroveDBStore} groveDBStore - * @param {RSAbci} rsAbci - * @param {createCoreChainLockUpdate} createCoreChainLockUpdate - * @param {createContextLogger} createContextLogger - * @param {SystemIdentityPublicKeys} systemIdentityPublicKeys - * @return {initChainHandler} - */ -function initChainHandlerFactory( - updateSimplifiedMasternodeList, - initialCoreChainLockedHeight, - validatorSet, - createValidatorSetUpdate, - synchronizeMasternodeIdentities, - logger, - groveDBStore, - rsAbci, - createCoreChainLockUpdate, - createContextLogger, - systemIdentityPublicKeys, -) { - /** - * @typedef initChainHandler - * - * @param {abci.RequestInitChain} request - * @return {Promise} - */ - async function initChainHandler(request) { - const { time } = request; - const timeMs = protoTimestampToMillis(time); - - const contextLogger = createContextLogger(logger, { - height: request.initialHeight.toString(), - abciMethod: 'initChain', - }); - - contextLogger.debug('InitChain ABCI method requested'); - contextLogger.trace({ abciRequest: request }); - - await updateSimplifiedMasternodeList( - initialCoreChainLockedHeight, { - logger: contextLogger, - }, - ); - - // Create initial state - - await groveDBStore.startTransaction(); - - // Call RS ABCI - - const initChainRequest = { - genesisTimeMs: timeMs, - systemIdentityPublicKeys, - }; - - logger.debug('Request RS Drive\'s InitChain method'); - logger.trace(initChainRequest); - - await rsAbci.initChain(initChainRequest, true); - - const blockInfo = new BlockInfo( - 0, - 0, - timeMs, - ); - - const synchronizeMasternodeIdentitiesResult = await synchronizeMasternodeIdentities( - initialCoreChainLockedHeight, - blockInfo, - ); - - const { - createdEntities, updatedEntities, removedEntities, fromHeight, toHeight, - } = synchronizeMasternodeIdentitiesResult; - - contextLogger.info( - `Masternode identities are synced for heights from ${fromHeight} to ${toHeight}: ${createdEntities.length} created, ${updatedEntities.length} updated, ${removedEntities.length} removed`, - ); - - contextLogger.trace( - { - createdEntities: createdEntities.map((item) => item.toJSON()), - updatedEntities: updatedEntities.map((item) => item.toJSON()), - removedEntities: removedEntities.map((item) => item.toJSON()), - }, - 'Synchronized masternode identities', - ); - - // Set initial validator set - - await validatorSet.initialize(initialCoreChainLockedHeight); - - const { quorumHash } = validatorSet.getQuorum(); - - const validatorSetUpdate = createValidatorSetUpdate(validatorSet); - - const coreChainLockUpdate = await createCoreChainLockUpdate( - initialCoreChainLockedHeight, - 0, - contextLogger, - ); - - const appHash = await groveDBStore.getRootHash({ useTransaction: true }); - - await groveDBStore.commitTransaction(); - - contextLogger.trace(validatorSetUpdate, `Validator set initialized with ${quorumHash} quorum`); - - contextLogger.info( - { - chainId: request.chainId, - appHash: appHash.toString('hex').toUpperCase(), - initialHeight: request.initialHeight.toString(), - initialCoreHeight: initialCoreChainLockedHeight, - }, - `Init ${request.chainId} chain on block #${request.initialHeight.toString()} with app hash ${appHash.toString('hex').toUpperCase()}`, - ); - - return new ResponseInitChain({ - appHash, - validatorSetUpdate, - initialCoreHeight: initialCoreChainLockedHeight, - nextCoreChainLockUpdate: coreChainLockUpdate, - }); - } - - return initChainHandler; -} - -module.exports = initChainHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/prepareProposalHandlerFactory.js b/packages/js-drive/lib/abci/handlers/prepareProposalHandlerFactory.js deleted file mode 100644 index 9f36462f661..00000000000 --- a/packages/js-drive/lib/abci/handlers/prepareProposalHandlerFactory.js +++ /dev/null @@ -1,189 +0,0 @@ -const { - tendermint: { - abci: { - ResponsePrepareProposal, - }, - }, -} = require('@dashevo/abci/types'); - -const lodashCloneDeep = require('lodash/cloneDeep'); -const addStateTransitionFeesToBlockFees = require('./proposal/fees/addStateTransitionFeesToBlockFees'); - -const txAction = { - UNKNOWN: 0, // Unknown action - UNMODIFIED: 1, // The Application did not modify this transaction. - ADDED: 2, // The Application added this transaction. - REMOVED: 3, // The Application wants this transaction removed from the proposal and the mempool. -}; - -/** - * @param {deliverTx} wrappedDeliverTx - * @param {BaseLogger} logger - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {beginBlock} beginBlock - * @param {endBlock} endBlock - * @param {createCoreChainLockUpdate} createCoreChainLockUpdate - * @param {ExecutionTimer} executionTimer - * @param {createContextLogger} createContextLogger - * @return {prepareProposalHandler} - */ -function prepareProposalHandlerFactory( - wrappedDeliverTx, - logger, - proposalBlockExecutionContext, - beginBlock, - endBlock, - createCoreChainLockUpdate, - executionTimer, - createContextLogger, -) { - /** - * @typedef prepareProposalHandler - * @param {abci.RequestPrepareProposal} request - * @return {Promise} - */ - async function prepareProposalHandler(request) { - const { - height, - maxTxBytes, - txs, - coreChainLockedHeight, - version, - localLastCommit: lastCommitInfo, - time, - proposerProTxHash, - proposedAppVersion, - round, - quorumHash, - } = request; - - const contextLogger = createContextLogger(logger, { - height: height.toString(), - round, - abciMethod: 'prepareProposal', - }); - - const requestToLog = lodashCloneDeep(request); - delete requestToLog.txs; - - contextLogger.debug('PrepareProposal ABCI method requested'); - contextLogger.trace({ abciRequest: requestToLog }); - - contextLogger.info(`Preparing a block proposal for height #${height} round #${round}`); - - await beginBlock( - { - lastCommitInfo, - height, - coreChainLockedHeight, - version, - time, - proposerProTxHash: Buffer.from(proposerProTxHash), - proposedAppVersion, - round, - quorumHash, - }, - contextLogger, - ); - - let totalSizeBytes = 0; - - const txRecords = []; - const txResults = []; - const blockFees = { - storageFee: 0, - processingFee: 0, - refundsPerEpoch: {}, - }; - - let validTxCount = 0; - let invalidTxCount = 0; - - for (const tx of txs) { - totalSizeBytes += tx.length; - - if (totalSizeBytes > maxTxBytes) { - break; - } - - txRecords.push({ - tx, - action: txAction.UNMODIFIED, - }); - - const { - code, - info, - fees, - } = await wrappedDeliverTx(tx, round, contextLogger); - - if (code === 0) { - validTxCount += 1; - // TODO We probably should calculate fees for invalid transitions as well - addStateTransitionFeesToBlockFees(blockFees, fees); - } else { - invalidTxCount += 1; - } - - const txResult = { code }; - - if (info) { - txResult.info = info; - } - - txResults.push(txResult); - } - - const coreChainLockUpdate = await createCoreChainLockUpdate( - coreChainLockedHeight, - round, - contextLogger, - ); - - const { - consensusParamUpdates, - validatorSetUpdate, - appHash, - } = await endBlock({ - height, - round, - fees: blockFees, - coreChainLockedHeight, - }, contextLogger); - - const roundExecutionTime = executionTimer.getTimer('roundExecution', true); - - const mempoolTxCount = txs.length - validTxCount - invalidTxCount; - - contextLogger.info( - { - roundExecutionTime, - validTxCount, - invalidTxCount, - mempoolTxCount, - }, - `Prepared block proposal for height #${height} with appHash ${appHash.toString('hex').toUpperCase()}` - + ` in ${roundExecutionTime} seconds (valid txs = ${validTxCount}, invalid txs = ${invalidTxCount}, mempool txs = ${mempoolTxCount})`, - ); - - proposalBlockExecutionContext.setPrepareProposalResult({ - appHash, - txResults, - consensusParamUpdates, - validatorSetUpdate, - }); - - return new ResponsePrepareProposal({ - appHash, - txResults, - consensusParamUpdates, - validatorSetUpdate, - coreChainLockUpdate, - txRecords, - }); - } - - return prepareProposalHandler; -} - -module.exports = prepareProposalHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/processProposalHandlerFactory.js b/packages/js-drive/lib/abci/handlers/processProposalHandlerFactory.js deleted file mode 100644 index ee942a773be..00000000000 --- a/packages/js-drive/lib/abci/handlers/processProposalHandlerFactory.js +++ /dev/null @@ -1,99 +0,0 @@ -const { - tendermint: { - abci: { - ResponseProcessProposal, - }, - }, -} = require('@dashevo/abci/types'); - -const lodashCloneDeep = require('lodash/cloneDeep'); -const statuses = require('./proposal/statuses'); - -/** - * @param {BaseLogger} logger - * @param {verifyChainLock} verifyChainLock - * @param {processProposal} processProposal - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {createContextLogger} createContextLogger - * @return {processProposalHandler} - */ -function processProposalHandlerFactory( - logger, - verifyChainLock, - processProposal, - proposalBlockExecutionContext, - createContextLogger, -) { - /** - * @typedef processProposalHandler - * @param {abci.RequestProcessProposal} request - * @return {Promise} - */ - async function processProposalHandler(request) { - const { - height, - coreChainLockUpdate, - round, - } = request; - - const contextLogger = createContextLogger(logger, { - height: height.toString(), - round, - abciMethod: 'processProposal', - }); - - const requestToLog = lodashCloneDeep(request); - delete requestToLog.txs; - - contextLogger.debug('ProcessProposal ABCI method requested'); - contextLogger.trace({ abciRequest: requestToLog }); - - // Skip process proposal if it was already prepared for this height and round - const prepareProposalResult = proposalBlockExecutionContext.getPrepareProposalResult(); - - if (prepareProposalResult - && proposalBlockExecutionContext.getHeight().toNumber() === height.toNumber() - && proposalBlockExecutionContext.getRound() === round) { - contextLogger.debug('Skip processing proposal and return prepared result'); - - const { - appHash, - txResults, - consensusParamUpdates, - validatorSetUpdate, - } = prepareProposalResult; - - return new ResponseProcessProposal({ - status: statuses.ACCEPT, - appHash, - txResults, - consensusParamUpdates, - validatorSetUpdate, - }); - } - - if (coreChainLockUpdate) { - const chainLockIsValid = await verifyChainLock(coreChainLockUpdate); - - if (!chainLockIsValid) { - contextLogger.warn({ - coreChainLockUpdate, - }, `Block proposal #${height} round #${round} rejected due to invalid core chain locked height update`); - - return new ResponseProcessProposal({ - status: statuses.REJECT, - }); - } - - logger.debug({ - coreChainLockUpdate, - }, `ChainLock is valid for height ${coreChainLockUpdate.coreBlockHeight}`); - } - - return processProposal(request, contextLogger); - } - - return processProposalHandler; -} - -module.exports = processProposalHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/proposal/beginBlockFactory.js b/packages/js-drive/lib/abci/handlers/proposal/beginBlockFactory.js deleted file mode 100644 index a159db141e4..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/beginBlockFactory.js +++ /dev/null @@ -1,224 +0,0 @@ -const { hash } = require('@dashevo/dpp/lib/util/hash'); - -const NotSupportedNetworkProtocolVersionError = require('../errors/NotSupportedNetworkProtocolVersionError'); -const NetworkProtocolVersionIsNotSetError = require('../errors/NetworkProtocolVersionIsNotSetError'); - -const BlockInfo = require('../../../blockExecution/BlockInfo'); -const protoTimestampToMillis = require('../../../util/protoTimestampToMillis'); - -/** - * Begin Block - * - * @param {GroveDBStore} groveDBStore - * @param {BlockExecutionContext} latestBlockExecutionContext - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {Long} latestProtocolVersion - * @param {DashPlatformProtocol} dpp - * @param {DashPlatformProtocol} transactionalDpp - * @param {updateSimplifiedMasternodeList} updateSimplifiedMasternodeList - * @param {waitForChainLockedHeight} waitForChainLockedHeight - * @param {synchronizeMasternodeIdentities} synchronizeMasternodeIdentities - * @param {RSAbci} rsAbci - * @param {ExecutionTimer} executionTimer - * @param {LastSyncedCoreHeightRepository} lastSyncedCoreHeightRepository - * @param {SimplifiedMasternodeList} simplifiedMasternodeList - * - * @return {beginBlock} - */ -function beginBlockFactory( - groveDBStore, - latestBlockExecutionContext, - proposalBlockExecutionContext, - latestProtocolVersion, - dpp, - transactionalDpp, - updateSimplifiedMasternodeList, - waitForChainLockedHeight, - synchronizeMasternodeIdentities, - rsAbci, - executionTimer, - lastSyncedCoreHeightRepository, - simplifiedMasternodeList, -) { - /** - * @typedef beginBlock - * @param {Object} request - * @param {ILastCommitInfo} request.lastCommitInfo - * @param {Long} request.height - * @param {number} request.coreChainLockedHeight - * @param {IConsensus} request.version - * @param {Long} request.proposedAppVersion - * @param {ITimestamp} request.time - * @param {Buffer} request.proposerProTxHash - * @param {Buffer} request.quorumHash - * @param {BaseLogger} contextLogger - * - * @return {Promise} - */ - async function beginBlock(request, contextLogger) { - const { - lastCommitInfo, - height, - coreChainLockedHeight, - version, - time, - proposerProTxHash, - proposedAppVersion, - round, - quorumHash, - } = request; - - if (proposalBlockExecutionContext.isEmpty()) { - executionTimer.clearTimer('blockExecution'); - executionTimer.startTimer('blockExecution'); - } - - executionTimer.clearTimer('roundExecution'); - executionTimer.startTimer('roundExecution'); - - // Validate protocol version - - if (version.app.eq(0)) { - throw new NetworkProtocolVersionIsNotSetError(); - } - - if (version.app.gt(latestProtocolVersion)) { - throw new NotSupportedNetworkProtocolVersionError( - version.app, - latestProtocolVersion, - ); - } - - // Make sure Core has the same height as the network - - await waitForChainLockedHeight(coreChainLockedHeight); - - // Reset block execution context - proposalBlockExecutionContext.reset(); - - proposalBlockExecutionContext.setContextLogger(contextLogger); - proposalBlockExecutionContext.setHeight(height); - proposalBlockExecutionContext.setVersion(version); - proposalBlockExecutionContext.setProposedAppVersion(proposedAppVersion); - proposalBlockExecutionContext.setRound(round); - proposalBlockExecutionContext.setTimeMs(protoTimestampToMillis(time)); - proposalBlockExecutionContext.setCoreChainLockedHeight(coreChainLockedHeight); - proposalBlockExecutionContext.setLastCommitInfo(lastCommitInfo); - - // Update SML - const isSimplifiedMasternodeListUpdated = await updateSimplifiedMasternodeList( - coreChainLockedHeight, - { - logger: contextLogger, - }, - ); - - // Set protocol version to DPP - dpp.setProtocolVersion(version.app.toNumber()); - transactionalDpp.setProtocolVersion(version.app.toNumber()); - - // Restart transaction if already started - if (await groveDBStore.isTransactionStarted()) { - await groveDBStore.abortTransaction(); - } - - await groveDBStore.startTransaction(); - - const lastSyncedHeightResult = await lastSyncedCoreHeightRepository.fetch({ - useTransaction: true, - }); - - const lastSyncedCoreHeight = lastSyncedHeightResult.getValue() || 0; - - // Call RS ABCI - - /** - * @type {BlockBeginRequest} - */ - const rsRequest = { - blockHeight: height.toNumber(), - blockTimeMs: proposalBlockExecutionContext.getTimeMs(), - proposerProTxHash, - validatorSetQuorumHash: quorumHash, - coreChainLockedHeight, - lastSyncedCoreHeight, - // TODO: Since we don't have HPMNs now and every masternode can be a validator, - // we pass the whole list - totalHpmns: simplifiedMasternodeList.getStore() - .getCurrentSML() - .getValidMasternodesList() - .length, - proposedAppVersion: proposedAppVersion.toNumber(), - }; - - if (!latestBlockExecutionContext.isEmpty()) { - rsRequest.previousBlockTimeMs = latestBlockExecutionContext.getTimeMs(); - } - - contextLogger.debug(rsRequest, 'Request RS Drive\'s BlockBegin method'); - - const rsResponse = await rsAbci.blockBegin(rsRequest, true); - - const withdrawalTransactionsMap = (rsResponse.unsignedWithdrawalTransactions || []).reduce( - (map, transactionBytes) => ({ - ...map, - [hash(transactionBytes).toString('hex')]: transactionBytes, - }), - {}, - ); - - proposalBlockExecutionContext.setWithdrawalTransactionsMap(withdrawalTransactionsMap); - proposalBlockExecutionContext.setEpochInfo(rsResponse.epochInfo); - - const { currentEpochIndex, isEpochChange } = rsResponse; - - if (isEpochChange) { - const debugData = { - currentEpochIndex, - blockTime: proposalBlockExecutionContext.getTimeMs(), - }; - - if (rsRequest.previousBlockTimeMs) { - debugData.previousBlockTimeMs = rsRequest.previousBlockTimeMs; - } - - const blockTimeFormatted = new Date(proposalBlockExecutionContext.getTimeMs()).toUTCString(); - - contextLogger.info(debugData, `Epoch #${currentEpochIndex} started on block #${height} at ${blockTimeFormatted}`); - } - - // Synchronize masternode identities - - if (isSimplifiedMasternodeListUpdated) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(proposalBlockExecutionContext); - - const synchronizeMasternodeIdentitiesResult = await synchronizeMasternodeIdentities( - coreChainLockedHeight, - blockInfo, - ); - - const { - createdEntities, updatedEntities, removedEntities, fromHeight, toHeight, - } = synchronizeMasternodeIdentitiesResult; - - contextLogger.info( - `Masternode identities are synced for heights from ${fromHeight} to ${toHeight}: ${createdEntities.length} created, ${updatedEntities.length} updated, ${removedEntities.length} removed`, - ); - - if (createdEntities.length > 0 || updatedEntities.length > 0 || removedEntities.length > 0) { - contextLogger.trace( - { - createdEntities: createdEntities.map((item) => item.toJSON()), - updatedEntities: updatedEntities.map((item) => item.toJSON()), - removedEntities: removedEntities.map((item) => item.toJSON()), - }, - 'Synchronized masternode identities', - ); - } - } - } - - return beginBlock; -} - -module.exports = beginBlockFactory; diff --git a/packages/js-drive/lib/abci/handlers/proposal/broadcastWithdrawalTransactionsFactory.js b/packages/js-drive/lib/abci/handlers/proposal/broadcastWithdrawalTransactionsFactory.js deleted file mode 100644 index 3bc4818b684..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/broadcastWithdrawalTransactionsFactory.js +++ /dev/null @@ -1,64 +0,0 @@ -const BlockInfo = require('../../../blockExecution/BlockInfo'); - -/** - * @param {CoreRpcClient} coreRpcClient - * @param {updateWithdrawalTransactionIdAndStatus} updateWithdrawalTransactionIdAndStatus - * - * @return {broadcastWithdrawalTransactions} - */ -function broadcastWithdrawalTransactionsFactory( - coreRpcClient, - updateWithdrawalTransactionIdAndStatus, -) { - /** - * @typedef broadcastWithdrawalTransactions - * - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {{{ extension: Buffer, signature: Buffer }}[]} thresholdVoteExtensions - * @param {Object} unsignedWithdrawalTransactionsMap - * - * @return {Promise} - */ - async function broadcastWithdrawalTransactions( - proposalBlockExecutionContext, - thresholdVoteExtensions, - unsignedWithdrawalTransactionsMap, - ) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(proposalBlockExecutionContext); - - const transactionIdMap = {}; - - for (const { extension, signature } of (thresholdVoteExtensions || [])) { - const withdrawalTransactionHash = extension.toString('hex'); - - const unsignedWithdrawalTransactionBytes = unsignedWithdrawalTransactionsMap[ - withdrawalTransactionHash - ]; - - if (unsignedWithdrawalTransactionBytes) { - const transactionBytes = Buffer.concat([ - unsignedWithdrawalTransactionBytes, - signature, - ]); - - transactionIdMap[unsignedWithdrawalTransactionBytes.toString('hex')] = transactionBytes; - - // TODO: think about Core error handling - await coreRpcClient.sendRawTransaction(transactionBytes.toString('hex')); - } - } - - await updateWithdrawalTransactionIdAndStatus( - blockInfo, - proposalBlockExecutionContext.getCoreChainLockedHeight(), - transactionIdMap, - { - useTransaction: true, - }, - ); - } - - return broadcastWithdrawalTransactions; -} - -module.exports = broadcastWithdrawalTransactionsFactory; diff --git a/packages/js-drive/lib/abci/handlers/proposal/createConsensusParamUpdateFactory.js b/packages/js-drive/lib/abci/handlers/proposal/createConsensusParamUpdateFactory.js deleted file mode 100644 index 4ac31ad0377..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/createConsensusParamUpdateFactory.js +++ /dev/null @@ -1,69 +0,0 @@ -const { - tendermint: { - types: { - ConsensusParams, - }, - }, -} = require('@dashevo/abci/types'); - -const featureFlagTypes = require('@dashevo/feature-flags-contract/lib/featureFlagTypes'); - -/** - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {getFeatureFlagForHeight} getFeatureFlagForHeight - * @return {createConsensusParamUpdate} - */ -function createConsensusParamUpdateFactory( - proposalBlockExecutionContext, - getFeatureFlagForHeight, -) { - /** - * @typedef createConsensusParamUpdate - * @param {number} height - * @param {number} round - * @param {BaseLogger} contextLogger - * @return {Promise} - */ - async function createConsensusParamUpdate(height, round, contextLogger) { - const contextVersion = proposalBlockExecutionContext.getVersion(); - - // Update consensus params feature flag - - const updateConsensusParamsFeatureFlag = await getFeatureFlagForHeight( - featureFlagTypes.UPDATE_CONSENSUS_PARAMS, - height, - true, - ); - - let consensusParamUpdates; - if (updateConsensusParamsFeatureFlag) { - // Use previous version if we aren't going to update it - let version = { - appVersion: contextVersion.app, - }; - - if (updateConsensusParamsFeatureFlag.get('version')) { - version = updateConsensusParamsFeatureFlag.get('version'); - } - - consensusParamUpdates = new ConsensusParams({ - block: updateConsensusParamsFeatureFlag.get('block'), - evidence: updateConsensusParamsFeatureFlag.get('evidence'), - version, - }); - - contextLogger.info( - { - consensusParamUpdates, - }, - 'Update consensus params', - ); - } - - return consensusParamUpdates; - } - - return createConsensusParamUpdate; -} - -module.exports = createConsensusParamUpdateFactory; diff --git a/packages/js-drive/lib/abci/handlers/proposal/createCoreChainLockUpdateFactory.js b/packages/js-drive/lib/abci/handlers/proposal/createCoreChainLockUpdateFactory.js deleted file mode 100644 index 8a712216696..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/createCoreChainLockUpdateFactory.js +++ /dev/null @@ -1,49 +0,0 @@ -const { - tendermint: { - types: { - CoreChainLock, - }, - }, -} = require('@dashevo/abci/types'); -/** - * - * @param {LatestCoreChainLock} latestCoreChainLock - * @return {createCoreChainLockUpdate} - */ -function createCoreChainLockUpdateFactory( - latestCoreChainLock, -) { - /** - * @typedef createCoreChainLockUpdate - * @param {number} contextCoreChainLockedHeight - * @param {number} round - * @param {BaseLogger} contextLogger - * @return {Promise} - */ - async function createCoreChainLockUpdate(contextCoreChainLockedHeight, round, contextLogger) { - // Update Core Chain Locks - const coreChainLock = latestCoreChainLock.getChainLock(); - - let coreChainLockUpdate; - if (coreChainLock && coreChainLock.height > contextCoreChainLockedHeight) { - coreChainLockUpdate = new CoreChainLock({ - coreBlockHeight: coreChainLock.height, - coreBlockHash: coreChainLock.blockHash, - signature: coreChainLock.signature, - }); - - contextLogger.debug( - { - nextCoreChainLockHeight: coreChainLock.height, - }, - `Provide next chain lock for Core height ${coreChainLock.height}`, - ); - } - - return coreChainLockUpdate; - } - - return createCoreChainLockUpdate; -} - -module.exports = createCoreChainLockUpdateFactory; diff --git a/packages/js-drive/lib/abci/handlers/proposal/deliverTxFactory.js b/packages/js-drive/lib/abci/handlers/proposal/deliverTxFactory.js deleted file mode 100644 index 760c9e5e99b..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/deliverTxFactory.js +++ /dev/null @@ -1,281 +0,0 @@ -const crypto = require('crypto'); -const { FeeResult } = require('@dashevo/rs-drive'); - -const stateTransitionTypes = require('@dashevo/dpp/lib/stateTransition/stateTransitionTypes'); -const AbstractDocumentTransition = require( - '@dashevo/dpp/lib/document/stateTransition/DocumentsBatchTransition/documentTransition/AbstractDocumentTransition', -); - -const DPPValidationAbciError = require('../../errors/DPPValidationAbciError'); - -const DOCUMENT_ACTION_DESCRIPTIONS = { - [AbstractDocumentTransition.ACTIONS.CREATE]: 'Create', - [AbstractDocumentTransition.ACTIONS.REPLACE]: 'Replace', - [AbstractDocumentTransition.ACTIONS.DELETE]: 'Delete', -}; - -const DATA_CONTRACT_ACTION_DESCRIPTIONS = { - [stateTransitionTypes.DATA_CONTRACT_CREATE]: 'Create', - [stateTransitionTypes.DATA_CONTRACT_UPDATE]: 'Update', -}; - -const TIMERS = require('../timers'); - -/** - * @param {unserializeStateTransition} transactionalUnserializeStateTransition - * @param {DashPlatformProtocol} transactionalDpp - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {ExecutionTimer} executionTimer - * @param {IdentityBalanceStoreRepository} identityBalanceRepository - * @param {calculateStateTransitionFee} calculateStateTransitionFee - * @param {calculateStateTransitionFeeFromOperations} calculateStateTransitionFeeFromOperations - * @param {createContextLogger} createContextLogger - * - * @return {deliverTx} - */ -function deliverTxFactory( - transactionalUnserializeStateTransition, - transactionalDpp, - proposalBlockExecutionContext, - executionTimer, - identityBalanceRepository, - calculateStateTransitionFee, - calculateStateTransitionFeeFromOperations, - createContextLogger, -) { - /** - * @typedef deliverTx - * - * @param {Buffer} stateTransitionByteArray - * @param {number} round - * @param {BaseLogger} contextLogger - * @return {Promise<{ - * code: number, - * fees: BlockFees}>} - */ - async function deliverTx(stateTransitionByteArray, round, contextLogger) { - const blockHeight = proposalBlockExecutionContext.getHeight(); - - // Start execution timer - - executionTimer.clearTimer(TIMERS.DELIVER_TX.OVERALL); - executionTimer.clearTimer(TIMERS.DELIVER_TX.VALIDATE_BASIC); - executionTimer.clearTimer(TIMERS.DELIVER_TX.VALIDATE_FEE); - executionTimer.clearTimer(TIMERS.DELIVER_TX.VALIDATE_SIGNATURE); - executionTimer.clearTimer(TIMERS.DELIVER_TX.VALIDATE_STATE); - executionTimer.clearTimer(TIMERS.DELIVER_TX.APPLY); - - executionTimer.startTimer(TIMERS.DELIVER_TX.OVERALL); - - const stHash = crypto - .createHash('sha256') - .update(stateTransitionByteArray) - .digest() - .toString('hex') - .toUpperCase(); - - const txContextLogger = createContextLogger(contextLogger, { - txId: stHash, - }); - - txContextLogger.info(`Deliver state transition ${stHash} from block #${blockHeight}`); - - const stateTransition = await transactionalUnserializeStateTransition( - stateTransitionByteArray, - { - logger: txContextLogger, - executionTimer, - }, - ); - - // Logging - /* istanbul ignore next */ - switch (stateTransition.getType()) { - case stateTransitionTypes.DATA_CONTRACT_UPDATE: - case stateTransitionTypes.DATA_CONTRACT_CREATE: { - const dataContract = stateTransition.getDataContract(); - - // Save data contracts in order to create databases for documents on block commit - proposalBlockExecutionContext.addDataContract(dataContract); - - const description = DATA_CONTRACT_ACTION_DESCRIPTIONS[stateTransition.getType()]; - - txContextLogger.info( - { - dataContractId: dataContract.getId().toString(), - }, - `${description} Data Contract with id: ${dataContract.getId()}`, - ); - - break; - } - case stateTransitionTypes.IDENTITY_CREATE: { - const identityId = stateTransition.getIdentityId(); - - txContextLogger.info( - { - identityId: identityId.toString(), - }, - `Create Identity with id: ${identityId}`, - ); - - break; - } - case stateTransitionTypes.IDENTITY_TOP_UP: { - const identityId = stateTransition.getIdentityId(); - - txContextLogger.info( - { - identityId: identityId.toString(), - }, - `Top up Identity with id: ${identityId}`, - ); - - break; - } - case stateTransitionTypes.IDENTITY_UPDATE: { - const identityId = stateTransition.getIdentityId(); - - txContextLogger.info( - { - identityId: identityId.toString(), - }, - `Update Identity with id: ${identityId}`, - ); - break; - } - case stateTransitionTypes.DOCUMENTS_BATCH: { - stateTransition.getTransitions().forEach((transition) => { - const description = DOCUMENT_ACTION_DESCRIPTIONS[transition.getAction()]; - - txContextLogger.info( - { - documentId: transition.getId().toString(), - }, - `${description} Document with id: ${transition.getId()}`, - ); - }); - - break; - } - default: - break; - } - - // Remove dry run operations from state transition execution context - - const stateTransitionExecutionContext = stateTransition.getExecutionContext(); - - const predictedStateTransitionOperations = stateTransitionExecutionContext.getOperations(); - const predictedStateTransitionFees = calculateStateTransitionFeeFromOperations( - predictedStateTransitionOperations, - stateTransition.getOwnerId(), - ); - - stateTransitionExecutionContext.clearDryOperations(); - - // Validate against state - - executionTimer.startTimer(TIMERS.DELIVER_TX.VALIDATE_STATE); - - const result = await transactionalDpp.stateTransition.validateState(stateTransition); - - if (!result.isValid()) { - const consensusError = result.getFirstError(); - const message = 'State transition is invalid against the state'; - - txContextLogger.info(message); - txContextLogger.debug({ - consensusError, - }); - - throw new DPPValidationAbciError(message, result.getFirstError()); - } - - executionTimer.stopTimer(TIMERS.DELIVER_TX.VALIDATE_STATE, true); - - executionTimer.startTimer(TIMERS.DELIVER_TX.APPLY); - - // Apply state transition to the state - - await transactionalDpp.stateTransition.apply(stateTransition); - - executionTimer.stopTimer(TIMERS.DELIVER_TX.APPLY, true); - - // Update identity balance - - const actualStateTransitionFees = calculateStateTransitionFee(stateTransition); - - const actualStateTransitionOperations = stateTransition.getExecutionContext().getOperations(); - - if (actualStateTransitionFees.desiredAmount > predictedStateTransitionFees.desiredAmount) { - txContextLogger.warn({ - predictedFee: predictedStateTransitionFees.desiredAmount, - actualFee: actualStateTransitionFees.desiredAmount, - }, `Actual fees are greater than predicted for ${actualStateTransitionFees.desiredAmount - predictedStateTransitionFees.desiredAmount} credits`); - } - - const feeResult = FeeResult.create( - actualStateTransitionFees.storageFee, - actualStateTransitionFees.processingFee, - actualStateTransitionFees.feeRefunds, - ); - - const applyFeesToBalanceResult = await identityBalanceRepository.applyFees( - stateTransition.getOwnerId(), - feeResult, - { useTransaction: true }, - ); - - const transactionFees = applyFeesToBalanceResult.getValue(); - - const deliverTxTiming = executionTimer.stopTimer(TIMERS.DELIVER_TX.OVERALL); - - txContextLogger.trace( - { - timings: { - overall: deliverTxTiming, - validateBasic: executionTimer.getTimer(TIMERS.DELIVER_TX.VALIDATE_BASIC, true), - validateFee: executionTimer.getTimer(TIMERS.DELIVER_TX.VALIDATE_FEE, true), - validateSignature: executionTimer.getTimer(TIMERS.DELIVER_TX.VALIDATE_SIGNATURE, true), - validateState: executionTimer.getTimer(TIMERS.DELIVER_TX.VALIDATE_STATE, true), - apply: executionTimer.getTimer(TIMERS.DELIVER_TX.APPLY, true), - }, - fees: { - predicted: { - storage: predictedStateTransitionFees.storageFee, - processing: predictedStateTransitionFees.processingFee, - refunds: predictedStateTransitionFees.totalRefunds, - requiredAmount: predictedStateTransitionFees.requiredAmount, - desiredAmount: predictedStateTransitionFees.desiredAmount, - operations: predictedStateTransitionOperations.map((operation) => operation.toJSON()), - }, - actual: { - storage: actualStateTransitionFees.storageFee, - processing: actualStateTransitionFees.processingFee, - refunds: actualStateTransitionFees.totalRefunds, - requiredAmount: actualStateTransitionFees.requiredAmount, - desiredAmount: actualStateTransitionFees.desiredAmount, - operations: actualStateTransitionOperations.map((operation) => operation.toJSON()), - }, - debt: actualStateTransitionFees.desiredAmount - transactionFees.processingFee, - }, - txType: stateTransition.getType(), - }, - `${stateTransition.constructor.name} execution took ${deliverTxTiming} seconds and cost ${actualStateTransitionFees.desiredAmount} credits`, - ); - - return { - code: 0, - fees: { - storageFee: transactionFees.storageFee, - processingFee: transactionFees.processingFee, - refundsPerEpoch: transactionFees.sumFeeRefundsPerEpoch(), - }, - }; - } - - return deliverTx; -} - -module.exports = deliverTxFactory; diff --git a/packages/js-drive/lib/abci/handlers/proposal/endBlockFactory.js b/packages/js-drive/lib/abci/handlers/proposal/endBlockFactory.js deleted file mode 100644 index 307e50fd95b..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/endBlockFactory.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Begin block ABCI - * - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {ValidatorSet} validatorSet - * @param {createValidatorSetUpdate} createValidatorSetUpdate - * @param {getFeatureFlagForHeight} getFeatureFlagForHeight - * @param {RSAbci} rsAbci - * @param {createConsensusParamUpdate} createConsensusParamUpdate - * @param {rotateAndCreateValidatorSetUpdate} rotateAndCreateValidatorSetUpdate - * @param {GroveDBStore} groveDBStore - * @param {ExecutionTimer} executionTimer - * - * @return {endBlock} - */ -function endBlockFactory( - proposalBlockExecutionContext, - validatorSet, - createValidatorSetUpdate, - getFeatureFlagForHeight, - createConsensusParamUpdate, - rotateAndCreateValidatorSetUpdate, - rsAbci, - groveDBStore, - executionTimer, -) { - /** - * @typedef endBlock - * - * @param {Object} request - * @param {number} request.height - * @param {number} request.round - * @param { - * storageFee: number, - * processingFee: number, - * feeRefunds: Object, - * feeRefundsSum: number - * } request.fees - * @param {number} request.coreChainLockedHeight - * @param {BaseLogger} contextLogger - * @return {Promise<{ - * consensusParamUpdates: ConsensusParams, - * validatorSetUpdate: ValidatorSetUpdate, - * nextCoreChainLockUpdate: CoreChainLock, - * }>} - */ - async function endBlock( - request, - contextLogger, - ) { - const { - height, - round, - fees, - coreChainLockedHeight, - } = request; - - // Call RS ABCI - - const rsRequest = { - fees, - }; - - contextLogger.debug(rsRequest, 'Request RS Drive\'s BlockEnd method'); - - const rsResponse = await rsAbci.blockEnd(rsRequest, true); - - contextLogger.debug(rsResponse, 'RS Drive\'s BlockEnd method response'); - - const { currentEpochIndex } = proposalBlockExecutionContext.getEpochInfo(); - - const { - processingFee, - storageFee, - feeRefundsSum, - } = fees; - - if (processingFee > 0 || storageFee > 0) { - contextLogger.debug({ - currentEpochIndex, - processingFee, - storageFee, - feeRefundsSum, - }, `${processingFee} processing fees added to epoch #${currentEpochIndex}. ${storageFee} storage fees added to distribution pool. ${feeRefundsSum} credits refunded to identities`); - } - - if (rsResponse.proposersPaidCount) { - contextLogger.debug({ - currentEpochIndex, - proposersPaidCount: rsResponse.proposersPaidCount, - paidEpochIndex: rsResponse.paidEpochIndex, - }, `${rsResponse.proposersPaidCount} masternodes were paid for epoch #${rsResponse.paidEpochIndex}`); - } - - if (rsResponse.refundedEpochsCount) { - contextLogger.debug({ - currentEpochIndex, - refundedEpochsCount: rsResponse.refundedEpochsCount, - }, `${rsResponse.refundedEpochsCount} epochs were refunded`); - } - - const consensusParamUpdates = await createConsensusParamUpdate(height, round, contextLogger); - - const validatorSetUpdate = await rotateAndCreateValidatorSetUpdate( - height, - coreChainLockedHeight, - round, - contextLogger, - ); - - const appHash = await groveDBStore.getRootHash({ useTransaction: true }); - - executionTimer.stopTimer('roundExecution', true); - - return { - consensusParamUpdates, - validatorSetUpdate, - appHash, - }; - } - - return endBlock; -} - -module.exports = endBlockFactory; diff --git a/packages/js-drive/lib/abci/handlers/proposal/fees/addStateTransitionFeesToBlockFees.js b/packages/js-drive/lib/abci/handlers/proposal/fees/addStateTransitionFeesToBlockFees.js deleted file mode 100644 index 2e81f9c2ad5..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/fees/addStateTransitionFeesToBlockFees.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @param {BlockFees} blockFees - * @param {BlockFees} stFees - */ -function addStateTransitionFeesToBlockFees(blockFees, stFees) { - /* eslint-disable no-param-reassign */ - blockFees.storageFee += stFees.storageFee; - blockFees.processingFee += stFees.processingFee; - - for (const [epochIndex, credits] of Object.entries(stFees.refundsPerEpoch)) { - if (!blockFees.refundsPerEpoch[epochIndex]) { - blockFees.refundsPerEpoch[epochIndex] = 0; - } - - blockFees.refundsPerEpoch[epochIndex] += credits; - } - - return blockFees; -} - -module.exports = addStateTransitionFeesToBlockFees; diff --git a/packages/js-drive/lib/abci/handlers/proposal/processProposalFactory.js b/packages/js-drive/lib/abci/handlers/proposal/processProposalFactory.js deleted file mode 100644 index 85907f69401..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/processProposalFactory.js +++ /dev/null @@ -1,139 +0,0 @@ -const { - tendermint: { - abci: { - ResponseProcessProposal, - }, - }, -} = require('@dashevo/abci/types'); - -const statuses = require('./statuses'); - -const addStateTransitionFeesToBlockFees = require('./fees/addStateTransitionFeesToBlockFees'); - -/** - * - * @param {deliverTx} wrappedDeliverTx - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {beginBlock} beginBlock - * @param {endBlock} endBlock - * @param {ExecutionTimer} executionTimer - * - * @return {processProposal} - */ -function processProposalFactory( - wrappedDeliverTx, - proposalBlockExecutionContext, - beginBlock, - endBlock, - executionTimer, -) { - /** - * @param {abci.RequestProcessProposal} request - * @param {BaseLogger} contextLogger - * - * @typedef processProposal - */ - async function processProposal(request, contextLogger) { - const { - height, - txs, - coreChainLockedHeight, - version, - proposedLastCommit: lastCommitInfo, - time, - proposerProTxHash, - proposedAppVersion, - round, - quorumHash, - } = request; - - contextLogger.info(`Processing a block proposal for height #${height} round #${round}`); - - await beginBlock( - { - lastCommitInfo, - height, - coreChainLockedHeight, - version, - time, - proposerProTxHash: Buffer.from(proposerProTxHash), - proposedAppVersion, - round, - quorumHash, - }, - contextLogger, - ); - - const txResults = []; - const blockFees = { - storageFee: 0, - processingFee: 0, - refundsPerEpoch: {}, - }; - - let validTxCount = 0; - let invalidTxCount = 0; - - for (const tx of txs) { - const { - code, - info, - fees, - } = await wrappedDeliverTx(tx, round, contextLogger); - - if (code === 0) { - validTxCount += 1; - // TODO We should calculate fees for invalid transitions as well - addStateTransitionFeesToBlockFees(blockFees, fees); - } else { - invalidTxCount += 1; - } - - const txResult = { code }; - - if (info) { - txResult.info = info; - } - - txResults.push(txResult); - } - - // Revert consensus logger after deliverTx - proposalBlockExecutionContext.setContextLogger(contextLogger); - - const { - consensusParamUpdates, - validatorSetUpdate, - appHash, - } = await endBlock({ - height, - round, - fees: blockFees, - coreChainLockedHeight, - }, contextLogger); - - const roundExecutionTime = executionTimer.getTimer('roundExecution', true); - - contextLogger.info( - { - roundExecutionTime, - validTxCount, - invalidTxCount, - }, - `Processed proposal #${height} with appHash ${appHash.toString('hex').toUpperCase()}` - + ` in ${roundExecutionTime} seconds (valid txs = ${validTxCount}, invalid txs = ${invalidTxCount})`, - ); - - return new ResponseProcessProposal({ - status: statuses.ACCEPT, - appHash, - txResults, - consensusParamUpdates, - validatorSetUpdate, - }); - } - - return processProposal; -} - -module.exports = processProposalFactory; diff --git a/packages/js-drive/lib/abci/handlers/proposal/rotateAndCreateValidatorSetUpdateFactory.js b/packages/js-drive/lib/abci/handlers/proposal/rotateAndCreateValidatorSetUpdateFactory.js deleted file mode 100644 index 9307c5f05c2..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/rotateAndCreateValidatorSetUpdateFactory.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @param {ValidatorSet} validatorSet - * @param {createValidatorSetUpdate} createValidatorSetUpdate - * @return {rotateAndCreateValidatorSetUpdate} - */ -function rotateAndCreateValidatorSetUpdateFactory( - proposalBlockExecutionContext, - validatorSet, - createValidatorSetUpdate, -) { - /** - * @typedef rotateAndCreateValidatorSetUpdate - * @param {number} height - * @param {number} coreChainLockedHeight - * @param {number} round - * @param {BaseLogger} contextLogger - * @return {Promise} - */ - async function rotateAndCreateValidatorSetUpdate( - height, - coreChainLockedHeight, - round, - contextLogger, - ) { - const lastCommitInfo = proposalBlockExecutionContext.getLastCommitInfo(); - - // Rotate validators - - let validatorSetUpdate; - const rotationEntropy = Buffer.from(lastCommitInfo.blockSignature); - if (await validatorSet.rotate(height, coreChainLockedHeight, rotationEntropy)) { - validatorSetUpdate = createValidatorSetUpdate(validatorSet); - - const { quorumHash } = validatorSet.getQuorum(); - - contextLogger.debug( - { - quorumHash, - }, - `Validator set switched to ${quorumHash} quorum`, - ); - } - - return validatorSetUpdate; - } - - return rotateAndCreateValidatorSetUpdate; -} - -module.exports = rotateAndCreateValidatorSetUpdateFactory; diff --git a/packages/js-drive/lib/abci/handlers/proposal/statuses.js b/packages/js-drive/lib/abci/handlers/proposal/statuses.js deleted file mode 100644 index adb8785b6c5..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/statuses.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - UNKNOWN: 0, // Unknown status. Returning this from the application is always an error. - ACCEPT: 1, // Status that signals that the application finds the proposal valid. - REJECT: 2, // Status that signals that the application finds the proposal invalid. -}; diff --git a/packages/js-drive/lib/abci/handlers/proposal/verifyChainLockFactory.js b/packages/js-drive/lib/abci/handlers/proposal/verifyChainLockFactory.js deleted file mode 100644 index 3fb6100b860..00000000000 --- a/packages/js-drive/lib/abci/handlers/proposal/verifyChainLockFactory.js +++ /dev/null @@ -1,69 +0,0 @@ -/** - * - * @param {RpcClient} coreRpcClient - * @param {BlockExecutionContext} latestBlockExecutionContext - * @param {BaseLogger} logger - * @return {verifyChainLock} - */ -function verifyChainLockFactory( - coreRpcClient, - latestBlockExecutionContext, - logger, -) { - /** - * @typedef verifyChainLock - * @param {ChainLockUpdate} coreChainLock - * @return {Promise} - */ - async function verifyChainLock(coreChainLock) { - const serializedCoreChainLock = { - height: coreChainLock.coreBlockHeight, - signature: Buffer.from(coreChainLock.signature).toString('hex'), - blockHash: Buffer.from(coreChainLock.coreBlockHash).toString('hex'), - }; - - const lastCoreChainLockedHeight = latestBlockExecutionContext.getCoreChainLockedHeight(); - if (coreChainLock.coreBlockHeight <= lastCoreChainLockedHeight) { - logger.debug( - { - chainLock: serializedCoreChainLock, - lastCoreChainLockedHeight, - }, - 'Chainlock verification failed: coreBlockHeight must be bigger than the latest core chain locked height', - ); - - return false; - } - - let isVerified; - try { - ({ result: isVerified } = await coreRpcClient.verifyChainLock( - serializedCoreChainLock.blockHash, - serializedCoreChainLock.signature, - serializedCoreChainLock.height, - )); - } catch (e) { - // Invalid signature format - // Parse error - if ([-8, -32700].includes(e.code)) { - logger.debug( - { - err: e, - chainLock: serializedCoreChainLock, - }, - `Chainlock verification failed using verifyChainLock method: ${e.message} ${e.code}`, - ); - - return false; - } - - throw e; - } - - return isVerified; - } - - return verifyChainLock; -} - -module.exports = verifyChainLockFactory; diff --git a/packages/js-drive/lib/abci/handlers/query/dataContractQueryHandlerFactory.js b/packages/js-drive/lib/abci/handlers/query/dataContractQueryHandlerFactory.js deleted file mode 100644 index 2948bae4bcf..00000000000 --- a/packages/js-drive/lib/abci/handlers/query/dataContractQueryHandlerFactory.js +++ /dev/null @@ -1,74 +0,0 @@ -const { - tendermint: { - abci: { - ResponseQuery, - }, - }, -} = require('@dashevo/abci/types'); - -const { - v0: { - GetDataContractResponse, - }, -} = require('@dashevo/dapi-grpc'); - -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const IdentifierError = require('@dashevo/dpp/lib/identifier/errors/IdentifierError'); - -const NotFoundAbciError = require('../../errors/NotFoundAbciError'); -const InvalidArgumentAbciError = require('../../errors/InvalidArgumentAbciError'); - -/** - * - * @param {DataContractStoreRepository} dataContractRepository - * @param {createQueryResponse} createQueryResponse - * @return {dataContractQueryHandler} - */ -function dataContractQueryHandlerFactory( - dataContractRepository, - createQueryResponse, -) { - /** - * @typedef dataContractQueryHandler - * @param {Object} params - * @param {Object} data - * @param {Buffer} data.id - * @param {RequestQuery} request - * @return {Promise} - */ - async function dataContractQueryHandler(params, { id }, request) { - let contractIdIdentifier; - try { - contractIdIdentifier = new Identifier(id); - } catch (e) { - if (e instanceof IdentifierError) { - throw new InvalidArgumentAbciError('id must be a valid identifier (32 bytes long)'); - } - - throw e; - } - - const response = createQueryResponse(GetDataContractResponse, request.prove); - - if (request.prove) { - const proof = await dataContractRepository.prove(contractIdIdentifier); - - response.getProof().setMerkleProof(proof.getValue()); - } else { - const dataContract = await dataContractRepository.fetch(contractIdIdentifier); - if (dataContract.isNull()) { - throw new NotFoundAbciError('Data Contract not found'); - } - - response.setDataContract(dataContract.getValue().toBuffer()); - } - - return new ResponseQuery({ - value: response.serializeBinary(), - }); - } - - return dataContractQueryHandler; -} - -module.exports = dataContractQueryHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/query/documentQueryHandlerFactory.js b/packages/js-drive/lib/abci/handlers/query/documentQueryHandlerFactory.js deleted file mode 100644 index c78f6445dbb..00000000000 --- a/packages/js-drive/lib/abci/handlers/query/documentQueryHandlerFactory.js +++ /dev/null @@ -1,97 +0,0 @@ -const { - tendermint: { - abci: { - ResponseQuery, - }, - }, -} = require('@dashevo/abci/types'); - -const { - v0: { - GetDocumentsResponse, - }, -} = require('@dashevo/dapi-grpc'); - -const InvalidArgumentAbciError = require('../../errors/InvalidArgumentAbciError'); -const InvalidQueryError = require('../../../document/errors/InvalidQueryError'); - -/** - * - * @param {fetchDocuments} fetchDocuments - * @param {proveDocuments} proveDocuments - * @param {createQueryResponse} createQueryResponse - * @return {documentQueryHandler} - */ -function documentQueryHandlerFactory( - fetchDocuments, - proveDocuments, - createQueryResponse, -) { - /** - * @typedef {documentQueryHandler} - * @param {Object} params - * @param {Object} data - * @param {Buffer} data.contractId - * @param {string} data.type - * @param {string} [data.where] - * @param {string} [data.orderBy] - * @param {string} [data.limit] - * @param {Buffer} [data.startAfter] - * @param {Buffer} [data.startAt] - * @param {RequestQuery} request - * @return {Promise} - */ - async function documentQueryHandler( - params, - { - contractId, - type, - where, - orderBy, - limit, - startAfter, - startAt, - }, - request, - ) { - const response = createQueryResponse(GetDocumentsResponse, request.prove); - - const options = { - where, - orderBy, - limit, - startAfter: startAfter ? Buffer.from(startAfter) : startAfter, - startAt: startAt ? Buffer.from(startAt) : startAt, - }; - - try { - if (request.prove) { - const proof = await proveDocuments(contractId, type, options); - - response.getProof().setMerkleProof(proof.getValue()); - } else { - const documentsResult = await fetchDocuments(contractId, type, options); - - const documents = documentsResult.getValue(); - - response.setDocumentsList( - documents.map((document) => document.toBuffer()), - ); - } - } catch (e) { - if (e instanceof InvalidQueryError) { - throw new InvalidArgumentAbciError(`Invalid query: ${e.message}`); - } - - throw e; - } - - return new ResponseQuery({ - value: response.serializeBinary(), - }); - } - - return documentQueryHandler; -} - -module.exports = documentQueryHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/query/getProofsQueryHandlerFactory.js b/packages/js-drive/lib/abci/handlers/query/getProofsQueryHandlerFactory.js deleted file mode 100644 index 585fb8db9b4..00000000000 --- a/packages/js-drive/lib/abci/handlers/query/getProofsQueryHandlerFactory.js +++ /dev/null @@ -1,110 +0,0 @@ -const { - tendermint: { - abci: { - ResponseQuery, - }, - }, -} = require('@dashevo/abci/types'); - -const cbor = require('cbor'); -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); - -/** - * - * @param {BlockExecutionContext} latestBlockExecutionContext - * @param {IdentityStoreRepository} identityRepository - * @param {DataContractStoreRepository} dataContractRepository - * @param {DocumentRepository} documentRepository - * @return {getProofsQueryHandler} - */ -function getProofsQueryHandlerFactory( - latestBlockExecutionContext, - identityRepository, - dataContractRepository, - documentRepository, -) { - /** - * @typedef getProofsQueryHandler - * @param params - * @param callArguments - * @param {Buffer[]} callArguments.identityIds - * @param {Buffer[]} callArguments.dataContractIds - * @param {{dataContractId: Buffer, documentId: Buffer, type: string}[]} documents - * @return {Promise} - */ - async function getProofsQueryHandler(params, { - identityIds, - dataContractIds, - documents, - }) { - const blockHeight = latestBlockExecutionContext.getHeight(); - const coreChainLockedHeight = latestBlockExecutionContext.getCoreChainLockedHeight(); - const timeMs = latestBlockExecutionContext.getTimeMs(); - const version = latestBlockExecutionContext.getVersion(); - const { - quorumHash, - blockSignature: signature, - } = latestBlockExecutionContext.getLastCommitInfo(); - const round = latestBlockExecutionContext.getRound(); - - const response = { - documentsProof: null, - identitiesProof: null, - dataContractsProof: null, - metadata: { - height: blockHeight.toNumber(), - coreChainLockedHeight, - timeMs, - protocolVersion: version.app.toNumber(), - }, - }; - - if (documents && documents.length) { - const documentsProof = await documentRepository - .proveManyDocumentsFromDifferentContracts(documents); - - response.documentsProof = { - quorumHash, - signature, - merkleProof: documentsProof.getValue(), - round, - }; - } - - if (identityIds && identityIds.length) { - const identitiesProof = await identityRepository.proveMany( - identityIds.map((identityId) => Identifier.from(identityId)), - ); - - response.identitiesProof = { - quorumHash, - signature, - merkleProof: identitiesProof.getValue(), - round, - }; - } - - if (dataContractIds && dataContractIds.length) { - const dataContractsProof = await dataContractRepository.proveMany( - dataContractIds.map((dataContractId) => Identifier.from(dataContractId)), - ); - - response.dataContractsProof = { - quorumHash, - signature, - merkleProof: dataContractsProof.getValue(), - round, - }; - } - - return new ResponseQuery({ - value: await cbor.encodeAsync( - response, - ), - }); - } - - return getProofsQueryHandler; -} - -module.exports = getProofsQueryHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/query/identitiesByPublicKeyHashesQueryHandlerFactory.js b/packages/js-drive/lib/abci/handlers/query/identitiesByPublicKeyHashesQueryHandlerFactory.js deleted file mode 100644 index 3b1706bda87..00000000000 --- a/packages/js-drive/lib/abci/handlers/query/identitiesByPublicKeyHashesQueryHandlerFactory.js +++ /dev/null @@ -1,70 +0,0 @@ -const { - tendermint: { - abci: { - ResponseQuery, - }, - }, -} = require('@dashevo/abci/types'); - -const { - v0: { - GetIdentitiesByPublicKeyHashesResponse, - }, -} = require('@dashevo/dapi-grpc'); - -const InvalidArgumentAbciError = require('../../errors/InvalidArgumentAbciError'); - -/** - * - * @param {IdentityStoreRepository} identityRepository - * @param {number} maxIdentitiesPerRequest - * @param {createQueryResponse} createQueryResponse - * @return {identitiesByPublicKeyHashesQueryHandler} - */ -function identitiesByPublicKeyHashesQueryHandlerFactory( - identityRepository, - maxIdentitiesPerRequest, - createQueryResponse, -) { - /** - * @typedef identitiesByPublicKeyHashesQueryHandler - * @param {Object} params - * @param {Object} data - * @param {Buffer[]} data.publicKeyHashes - * @param {RequestQuery} request - * @return {Promise} - */ - async function identitiesByPublicKeyHashesQueryHandler(params, { publicKeyHashes }, request) { - if (publicKeyHashes && publicKeyHashes.length > maxIdentitiesPerRequest) { - throw new InvalidArgumentAbciError( - `Maximum number of ${maxIdentitiesPerRequest} requested items exceeded.`, { - maxIdentitiesPerRequest, - }, - ); - } - - const response = createQueryResponse(GetIdentitiesByPublicKeyHashesResponse, request.prove); - - if (request.prove) { - const proof = await identityRepository.proveManyByPublicKeyHashes(publicKeyHashes); - - response.getProof().setMerkleProof(proof.getValue()); - } else { - const identitiesListResult = await identityRepository.fetchManyByPublicKeyHashes( - publicKeyHashes, - ); - - response.setIdentitiesList( - identitiesListResult.getValue().map((identity) => identity.toBuffer()), - ); - } - - return new ResponseQuery({ - value: response.serializeBinary(), - }); - } - - return identitiesByPublicKeyHashesQueryHandler; -} - -module.exports = identitiesByPublicKeyHashesQueryHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/query/identityQueryHandlerFactory.js b/packages/js-drive/lib/abci/handlers/query/identityQueryHandlerFactory.js deleted file mode 100644 index 179002335b1..00000000000 --- a/packages/js-drive/lib/abci/handlers/query/identityQueryHandlerFactory.js +++ /dev/null @@ -1,75 +0,0 @@ -const { - tendermint: { - abci: { - ResponseQuery, - }, - }, -} = require('@dashevo/abci/types'); - -const { - v0: { - GetIdentityResponse, - }, -} = require('@dashevo/dapi-grpc'); - -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const IdentifierError = require('@dashevo/dpp/lib/identifier/errors/IdentifierError'); - -const NotFoundAbciError = require('../../errors/NotFoundAbciError'); -const InvalidArgumentAbciError = require('../../errors/InvalidArgumentAbciError'); - -/** - * - * @param {IdentityStoreRepository} identityRepository - * @param {createQueryResponse} createQueryResponse - * @return {identityQueryHandler} - */ -function identityQueryHandlerFactory( - identityRepository, - createQueryResponse, -) { - /** - * @typedef identityQueryHandler - * @param {Object} params - * @param {Object} options - * @param {Buffer} options.id - * @param {RequestQuery} request - * @return {Promise} - */ - async function identityQueryHandler(params, { id }, request) { - let identifier; - try { - identifier = new Identifier(id); - } catch (e) { - if (e instanceof IdentifierError) { - throw new InvalidArgumentAbciError('id must be a valid identifier (32 bytes long)'); - } - - throw e; - } - - const response = createQueryResponse(GetIdentityResponse, request.prove); - - if (request.prove) { - const proof = await identityRepository.prove(identifier); - - response.getProof().setMerkleProof(proof.getValue()); - } else { - const identityResult = await identityRepository.fetch(identifier); - - if (identityResult.isNull()) { - throw new NotFoundAbciError('Identity not found'); - } - - response.setIdentity(identityResult.getValue().toBuffer()); - } - - return new ResponseQuery({ - value: response.serializeBinary(), - }); - } - - return identityQueryHandler; -} - -module.exports = identityQueryHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/query/response/createQueryResponseFactory.js b/packages/js-drive/lib/abci/handlers/query/response/createQueryResponseFactory.js deleted file mode 100644 index cf22cf73228..00000000000 --- a/packages/js-drive/lib/abci/handlers/query/response/createQueryResponseFactory.js +++ /dev/null @@ -1,65 +0,0 @@ -const { - v0: { - Proof, - ResponseMetadata, - }, -} = require('@dashevo/dapi-grpc'); - -const UnavailableAbciError = require('../../../errors/UnavailableAbciError'); - -/** - * @param {BlockExecutionContext} latestBlockExecutionContext - * @return {createQueryResponse} - */ -function createQueryResponseFactory( - latestBlockExecutionContext, -) { - /** - * @typedef {createQueryResponse} - * @param {Function} ResponseClass - * @param {boolean} [prove=false] - */ - function createQueryResponse(ResponseClass, prove = false) { - if (latestBlockExecutionContext.isEmpty()) { - throw new UnavailableAbciError('data is not available'); - } - - const blockHeight = latestBlockExecutionContext.getHeight(); - const coreChainLockedHeight = latestBlockExecutionContext.getCoreChainLockedHeight(); - const timeMs = latestBlockExecutionContext.getTimeMs(); - const version = latestBlockExecutionContext.getVersion(); - - const response = new ResponseClass(); - - const metadata = new ResponseMetadata(); - metadata.setHeight(blockHeight); - metadata.setCoreChainLockedHeight(coreChainLockedHeight); - metadata.setTimeMs(timeMs); - metadata.setProtocolVersion(version.app); - - response.setMetadata(metadata); - - if (prove) { - const { - quorumHash, - blockSignature: signature, - } = latestBlockExecutionContext.getLastCommitInfo(); - - const round = latestBlockExecutionContext.getRound(); - - const proof = new Proof(); - - proof.setQuorumHash(quorumHash); - proof.setSignature(signature); - proof.setRound(round); - - response.setProof(proof); - } - - return response; - } - - return createQueryResponse; -} - -module.exports = createQueryResponseFactory; diff --git a/packages/js-drive/lib/abci/handlers/queryHandlerFactory.js b/packages/js-drive/lib/abci/handlers/queryHandlerFactory.js deleted file mode 100644 index 338538af6a0..00000000000 --- a/packages/js-drive/lib/abci/handlers/queryHandlerFactory.js +++ /dev/null @@ -1,58 +0,0 @@ -const cbor = require('cbor'); - -const InvalidArgumentAbciError = require('../errors/InvalidArgumentAbciError'); - -/** - * @param {Object} queryHandlerRouter - * @param {Function} sanitizeUrl - * @param {BaseLogger} logger - * @param {createContextLogger} createContextLogger - * @return {queryHandler} - */ -function queryHandlerFactory(queryHandlerRouter, sanitizeUrl, logger, createContextLogger) { - /** - * Query ABCI Handler - * - * @typedef queryHandler - * - * @param {RequestQuery} request - * @return {Promise} - */ - async function queryHandler(request) { - const { path, data } = request; - - createContextLogger(logger, { - abciMethod: 'query', - }); - - const route = queryHandlerRouter.find('GET', sanitizeUrl(path)); - - if (!route) { - throw new InvalidArgumentAbciError('Invalid path', { path }); - } - - const invalidDataMessage = 'Invalid data format: it should be cbor encoded object.'; - - let encodedData = {}; - - const decodeData = route.store && route.store.rawData === true; - - if (data.length > 0) { - try { - encodedData = decodeData ? Buffer.from(data) : cbor.decode(Buffer.from(data)); - } catch (e) { - throw new InvalidArgumentAbciError(invalidDataMessage); - } - - if (encodedData === null || typeof encodedData !== 'object') { - throw new InvalidArgumentAbciError(invalidDataMessage); - } - } - - return route.handler(route.params, encodedData, request); - } - - return queryHandler; -} - -module.exports = queryHandlerFactory; diff --git a/packages/js-drive/lib/abci/handlers/stateTransition/unserializeStateTransitionFactory.js b/packages/js-drive/lib/abci/handlers/stateTransition/unserializeStateTransitionFactory.js deleted file mode 100644 index 91433eedbbd..00000000000 --- a/packages/js-drive/lib/abci/handlers/stateTransition/unserializeStateTransitionFactory.js +++ /dev/null @@ -1,120 +0,0 @@ -const InvalidStateTransitionError = require('@dashevo/dpp/lib/stateTransition/errors/InvalidStateTransitionError'); -const InvalidArgumentAbciError = require('../../errors/InvalidArgumentAbciError'); - -const DPPValidationAbciError = require('../../errors/DPPValidationAbciError'); - -const TIMERS = require('../timers'); - -/** - * @param {DashPlatformProtocol} dpp - * @param {Object} noopLogger - * @return {unserializeStateTransition} - */ -function unserializeStateTransitionFactory(dpp, noopLogger) { - /** - * @typedef unserializeStateTransition - * @param {Uint8Array} stateTransitionByteArray - * @param {Object} [options] - * @param {BaseLogger} [options.logger] - * @param {ExecutionTimer} [options.executionTimer] - * @return {AbstractStateTransition} - */ - async function unserializeStateTransition(stateTransitionByteArray, options = {}) { - // either use a logger passed or use noop logger - const logger = (options.logger || noopLogger); - - // measure timing if timer is passed - const executionTimer = (options.executionTimer || { - startTimer: () => {}, - stopTimer: () => {}, - }); - - if (!stateTransitionByteArray) { - logger.warn('State transition is not specified'); - - throw new InvalidArgumentAbciError('State Transition is not specified'); - } - - const stateTransitionSerialized = Buffer.from(stateTransitionByteArray); - - executionTimer.startTimer(TIMERS.DELIVER_TX.VALIDATE_BASIC); - - let stateTransition; - try { - stateTransition = await dpp - .stateTransition - .createFromBuffer(stateTransitionSerialized); - } catch (e) { - if (e instanceof InvalidStateTransitionError) { - const consensusError = e.getErrors()[0]; - const message = 'Invalid state transition'; - - logger.info(message); - logger.debug({ - consensusError, - }); - - throw new DPPValidationAbciError(message, consensusError); - } - - throw e; - } - - executionTimer.stopTimer(TIMERS.DELIVER_TX.VALIDATE_BASIC, true); - - executionTimer.startTimer(TIMERS.DELIVER_TX.VALIDATE_SIGNATURE); - - let result = await dpp.stateTransition.validateSignature(stateTransition); - - if (!result.isValid()) { - const consensusError = result.getFirstError(); - const message = 'Invalid state transition signature'; - - logger.info(message); - - logger.debug({ - consensusError, - }); - - throw new DPPValidationAbciError(message, consensusError); - } - - executionTimer.stopTimer(TIMERS.DELIVER_TX.VALIDATE_SIGNATURE, true); - - executionTimer.startTimer(TIMERS.DELIVER_TX.VALIDATE_FEE); - - const executionContext = stateTransition.getExecutionContext(); - - // Pre-calculate fee for validateState and state transition apply - // with worst case costs to validate the whole state transition execution cost - executionContext.enableDryRun(); - - await dpp.stateTransition.validateState(stateTransition); - await dpp.stateTransition.apply(stateTransition); - - executionContext.disableDryRun(); - - result = await dpp.stateTransition.validateFee(stateTransition); - - if (!result.isValid()) { - const consensusError = result.getFirstError(); - const message = 'Insufficient funds to process state transition'; - - logger.info(message); - - logger.debug({ - consensusError, - }); - - throw new DPPValidationAbciError(message, consensusError); - } - - executionTimer.stopTimer(TIMERS.DELIVER_TX.VALIDATE_FEE, true); - - return stateTransition; - } - - return unserializeStateTransition; -} - -module.exports = unserializeStateTransitionFactory; diff --git a/packages/js-drive/lib/abci/handlers/timers.js b/packages/js-drive/lib/abci/handlers/timers.js deleted file mode 100644 index 8aa29e8c4cf..00000000000 --- a/packages/js-drive/lib/abci/handlers/timers.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - DELIVER_TX: { - OVERALL: 'deliverTx:overall', - VALIDATE_BASIC: 'deliverTx:validate:basic', - VALIDATE_FEE: 'deliverTx:validate:fee', - VALIDATE_SIGNATURE: 'deliverTx:validate:signature', - VALIDATE_STATE: 'deliverTx:validate:state', - APPLY: 'deliverTx:apply', - }, -}; diff --git a/packages/js-drive/lib/abci/handlers/validator/createValidatorSetUpdate.js b/packages/js-drive/lib/abci/handlers/validator/createValidatorSetUpdate.js deleted file mode 100644 index 60287f54b5e..00000000000 --- a/packages/js-drive/lib/abci/handlers/validator/createValidatorSetUpdate.js +++ /dev/null @@ -1,49 +0,0 @@ -const { - tendermint: { - abci: { - ValidatorUpdate, - ValidatorSetUpdate, - }, - crypto: { - PublicKey, - }, - }, -} = require('@dashevo/abci/types'); - -/** - * @typedef {createValidatorSetUpdate} - * @param {ValidatorSet} validatorSet - * @return {ValidatorSetUpdate} - */ -function createValidatorSetUpdate(validatorSet) { - const validatorUpdates = validatorSet.getValidators() - .map((validator) => { - const networkInfo = validator.getNetworkInfo(); - - const validatorUpdate = new ValidatorUpdate({ - power: validator.getVotingPower(), - proTxHash: validator.getProTxHash(), - nodeAddress: `tcp://${networkInfo.getHost()}:${networkInfo.getPort()}`, - }); - - if (validator.getPublicKeyShare()) { - validatorUpdate.pubKey = new PublicKey({ - bls12381: validator.getPublicKeyShare(), - }); - } - - return validatorUpdate; - }); - - const { quorumPublicKey, quorumHash } = validatorSet.getQuorum(); - - return new ValidatorSetUpdate({ - validatorUpdates, - thresholdPublicKey: new PublicKey({ - bls12381: Buffer.from(quorumPublicKey, 'hex'), - }), - quorumHash: Buffer.from(quorumHash, 'hex'), - }); -} - -module.exports = createValidatorSetUpdate; diff --git a/packages/js-drive/lib/abci/handlers/verifyVoteExtensionHandlerFactory.js b/packages/js-drive/lib/abci/handlers/verifyVoteExtensionHandlerFactory.js deleted file mode 100644 index c414ef3e4a7..00000000000 --- a/packages/js-drive/lib/abci/handlers/verifyVoteExtensionHandlerFactory.js +++ /dev/null @@ -1,92 +0,0 @@ -const { - tendermint: { - abci: { - ResponseVerifyVoteExtension, - }, - types: { - VoteExtensionType, - }, - }, -} = require('@dashevo/abci/types'); - -const verifyStatus = { - UNKNOWN: 0, // Unknown status. Returning this from the application is always an error. - ACCEPT: 1, // Status that signals that the application finds the vote extension valid. - REJECT: 2, // Status that signals that the application finds the vote extension invalid. -}; - -/** - * @param {BlockExecutionContext} proposalBlockExecutionContext - * @return {verifyVoteExtensionHandler} - */ -function verifyVoteExtensionHandlerFactory(proposalBlockExecutionContext) { - /** - * @typedef verifyVoteExtensionHandler - * - * @param {abci.RequestVerifyVoteExtension} request - * - * @return {Promise} - */ - async function verifyVoteExtensionHandler(request) { - const { - voteExtensions, - } = request; - - const contextLogger = proposalBlockExecutionContext.getContextLogger() - .child({ - abciMethod: 'verifyVoteExtension', - }); - - contextLogger.debug('VerifyVote ABCI method requested'); - contextLogger.trace({ request }); - - const unsignedWithdrawalTransactionsMap = proposalBlockExecutionContext - .getWithdrawalTransactionsMap(); - - const voteExtensionsToCheck = Object.keys(unsignedWithdrawalTransactionsMap || {}) - .sort() - .map((txHashHex) => ({ - type: VoteExtensionType.THRESHOLD_RECOVER, - extension: Buffer.from(txHashHex, 'hex'), - })); - - const numberOfVoteExtensionsMatch = ( - voteExtensionsToCheck.length === (voteExtensions || []).length - ); - - const allVoteExtensionsPresent = voteExtensionsToCheck.reduce((result, nextExtension) => { - const searchedVoteExtension = (voteExtensions || []).find((voteExtension) => ( - voteExtension.type === nextExtension.type - && Buffer.compare(voteExtension.extension, nextExtension.extension) - )); - - if (!searchedVoteExtension) { - const extensionString = nextExtension.extension.toString('hex'); - - const extensionTruncatedString = extensionString.substring( - 0, - Math.min(30, extensionString.length), - ); - - contextLogger.warn({ - type: nextExtension.type, - extension: extensionString, - }, `${nextExtension.type} vote extension ${extensionTruncatedString}... was not found in verify request`); - } - - return result && (searchedVoteExtension !== undefined); - }, true); - - const status = (numberOfVoteExtensionsMatch && allVoteExtensionsPresent) - ? verifyStatus.ACCEPT - : verifyStatus.REJECT; - - return new ResponseVerifyVoteExtension({ - status, - }); - } - - return verifyVoteExtensionHandler; -} - -module.exports = verifyVoteExtensionHandlerFactory; diff --git a/packages/js-drive/lib/blockExecution/BlockExecutionContext.js b/packages/js-drive/lib/blockExecution/BlockExecutionContext.js deleted file mode 100644 index 52df4c12f93..00000000000 --- a/packages/js-drive/lib/blockExecution/BlockExecutionContext.js +++ /dev/null @@ -1,383 +0,0 @@ -const DataContract = require('@dashevo/dpp/lib/dataContract/DataContract'); - -const { - tendermint: { - abci: { - CommitInfo, - }, - version: { - Consensus, - }, - }, -} = require('@dashevo/abci/types'); - -const Long = require('long'); - -class BlockExecutionContext { - constructor() { - this.reset(); - } - - /** - * Add Data Contract - * - * @param {DataContract|null} dataContract - */ - addDataContract(dataContract) { - this.dataContracts.push(dataContract); - } - - /** - * Check is data contract with specific ID is persistent in the context - * - * @param {Identifier} dataContractId - * @return {boolean} - */ - hasDataContract(dataContractId) { - const index = this.dataContracts - .findIndex((dataContract) => dataContractId.equals(dataContract.getId())); - - return index !== -1; - } - - /** - * Get Data Contracts - * - * @returns {DataContract[]} - */ - getDataContracts() { - return this.dataContracts; - } - - /** - * - * @param {number} coreChainLockedHeight - * @return {BlockExecutionContext} - */ - setCoreChainLockedHeight(coreChainLockedHeight) { - this.coreChainLockedHeight = coreChainLockedHeight; - - return this; - } - - /** - * - * @return {number} - */ - getCoreChainLockedHeight() { - return this.coreChainLockedHeight; - } - - /** - * @param {Long} height - * @return {BlockExecutionContext} - */ - setHeight(height) { - this.height = height; - - return this; - } - - /** - * - * @return {Long} - */ - getHeight() { - return this.height; - } - - /** - * - * @param {IConsensus} version - * @return {BlockExecutionContext} - */ - setVersion(version) { - this.version = version; - - return this; - } - - /** - * - * @return {IConsensus} - */ - getVersion() { - return this.version; - } - - /** - * - * @param {Long} version - * @return {BlockExecutionContext} - */ - setProposedAppVersion(version) { - this.proposedAppVersion = version; - - return this; - } - - /** - * - * @return {Long} - */ - getProposedAppVersion() { - return this.proposedAppVersion; - } - - /** - * @param {number} timeMs - */ - setTimeMs(timeMs) { - this.timeMs = timeMs; - } - - /** - * @returns {number} - */ - getTimeMs() { - return this.timeMs; - } - - /** - * Set current block lastCommitInfo - * @param {ILastCommitInfo} lastCommitInfo - * @return {BlockExecutionContext} - */ - setLastCommitInfo(lastCommitInfo) { - this.lastCommitInfo = lastCommitInfo; - - return this; - } - - /** - * Get block lastCommitInfo - * - * @return {ILastCommitInfo|null} - */ - getLastCommitInfo() { - return this.lastCommitInfo; - } - - /** - * Set context logger - * - * @param {BaseLogger} logger - */ - setContextLogger(logger) { - this.contextLogger = logger; - } - - /** - * Get context logger - * - * @return {BaseLogger} - */ - getContextLogger() { - if (!this.contextLogger) { - throw new Error('Consensus logger has not been set'); - } - - return this.contextLogger; - } - - /** - * @param {EpochInfo} epochInfo - */ - setEpochInfo(epochInfo) { - this.epochInfo = epochInfo; - } - - /** - * @returns {EpochInfo} - */ - getEpochInfo() { - return this.epochInfo; - } - - /** - * Set withdrawal transactions hash map - * - * @param {Object} withdrawalTransactionsMap - * - * @returns {BlockExecutionContext} - */ - setWithdrawalTransactionsMap(withdrawalTransactionsMap) { - this.withdrawalTransactionsMap = withdrawalTransactionsMap; - - return this; - } - - /** - * Get withdrawal transactions hash map - * - * @return {Object} - */ - getWithdrawalTransactionsMap() { - return this.withdrawalTransactionsMap; - } - - /** - * Set committed round - * - * @param {number} round - * - * @returns {BlockExecutionContext} - */ - setRound(round) { - this.round = round; - - return this; - } - - /** - * Get committed round - * - * @return {number} - */ - getRound() { - return this.round; - } - - /** - * Set PrepareProposal Result - * - * @param {Object} prepareProposalResult - * - * @returns {BlockExecutionContext} - */ - setPrepareProposalResult(prepareProposalResult) { - this.prepareProposalResult = prepareProposalResult; - - return this; - } - - /** - * Get PrepareProposal Result - * - * @return {Object} - */ - getPrepareProposalResult() { - return this.prepareProposalResult; - } - - /** - * Reset state - */ - reset() { - this.dataContracts = []; - this.coreChainLockedHeight = null; - this.height = null; - this.version = null; - this.time = null; - this.lastCommitInfo = null; - this.contextLogger = null; - this.withdrawalTransactionsMap = {}; - this.round = null; - this.epochInfo = null; - this.timeMs = null; - this.prepareProposalResult = null; - this.proposedAppVersion = null; - } - - /** - * Check is the context is not set - * - * @return {boolean} - */ - isEmpty() { - return this.height === null; - } - - /** - * Populate the current instance with data from another instance - * - * @param {BlockExecutionContext} blockExecutionContext - */ - populate(blockExecutionContext) { - this.dataContracts = blockExecutionContext.dataContracts; - this.lastCommitInfo = blockExecutionContext.lastCommitInfo; - this.time = blockExecutionContext.time; - this.height = blockExecutionContext.height; - this.coreChainLockedHeight = blockExecutionContext.coreChainLockedHeight; - this.version = blockExecutionContext.version; - this.contextLogger = blockExecutionContext.contextLogger || null; - this.withdrawalTransactionsMap = blockExecutionContext.withdrawalTransactionsMap; - this.round = blockExecutionContext.round; - this.epochInfo = blockExecutionContext.epochInfo; - this.timeMs = blockExecutionContext.timeMs; - this.prepareProposalResult = blockExecutionContext.prepareProposalResult || null; - this.proposedAppVersion = blockExecutionContext.proposedAppVersion; - } - - /** - * Populate the current instance with data - * - * @param {Object} object - */ - fromObject(object) { - this.dataContracts = object.dataContracts - .map((rawDataContract) => new DataContract(rawDataContract)); - this.lastCommitInfo = CommitInfo.fromObject(object.lastCommitInfo); - this.contextLogger = object.contextLogger; - this.epochInfo = object.epochInfo; - this.timeMs = object.timeMs; - this.height = Long.fromNumber(object.height); - this.coreChainLockedHeight = object.coreChainLockedHeight; - this.version = Consensus.fromObject(object.version); - this.withdrawalTransactionsMap = object.withdrawalTransactionsMap; - this.round = object.round; - this.prepareProposalResult = object.prepareProposalResult; - this.proposedAppVersion = Long.fromNumber(object.proposedAppVersion); - } - - /** - * @param {Object} options - * @param {boolean} [options.skipContextLogger=false] - * @param {boolean} [options.skipPrepareProposalResult=false] - * @return {{ - * dataContracts: Object[], - * height: number, - * version: Object, - * timeMs: number, - * coreChainLockedHeight: number, - * lastCommitInfo: number, - * epochInfo: EpochInfo, - * withdrawalTransactionsMap: Object, - * round: number, - * proposedAppVersion: number, - * }} - */ - toObject(options = {}) { - let time = null; - - if (this.time) { - time = this.time.toJSON(); - time.seconds = Number(time.seconds); - } - - const object = { - dataContracts: this.dataContracts.map((dataContract) => dataContract.toObject()), - timeMs: this.timeMs, - height: this.height ? this.height.toNumber() : null, - version: this.version ? this.version.toJSON() : null, - coreChainLockedHeight: this.coreChainLockedHeight, - lastCommitInfo: this.lastCommitInfo ? CommitInfo.toObject(this.lastCommitInfo) : null, - withdrawalTransactionsMap: this.withdrawalTransactionsMap, - round: this.round, - epochInfo: this.epochInfo, - proposedAppVersion: this.proposedAppVersion ? this.proposedAppVersion.toNumber() : null, - }; - - if (!options.skipContextLogger) { - object.contextLogger = this.contextLogger; - } - - if (!options.skipPrepareProposalResult) { - object.prepareProposalResult = this.prepareProposalResult; - } - - return object; - } -} - -module.exports = BlockExecutionContext; diff --git a/packages/js-drive/lib/blockExecution/BlockExecutionContextRepository.js b/packages/js-drive/lib/blockExecution/BlockExecutionContextRepository.js deleted file mode 100644 index e7e2800ca81..00000000000 --- a/packages/js-drive/lib/blockExecution/BlockExecutionContextRepository.js +++ /dev/null @@ -1,69 +0,0 @@ -const cbor = require('cbor'); - -const BlockExecutionContext = require('./BlockExecutionContext'); - -class BlockExecutionContextRepository { - /** - * - * @param {GroveDBStore} groveDBStore - */ - constructor(groveDBStore) { - this.db = groveDBStore; - } - - /** - * Store block execution context - * - * @param {BlockExecutionContext} blockExecutionContext - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @return {this} - */ - async store(blockExecutionContext, options = {}) { - await this.db.putAux( - BlockExecutionContextRepository.EXTERNAL_STORE_KEY_NAME, - await cbor.encodeAsync(blockExecutionContext.toObject({ - skipContextLogger: true, - skipPrepareProposalResult: true, - })), - options, - ); - - return this; - } - - /** - * Fetch block execution stack - * - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * - * @return {BlockExecutionContext} - */ - async fetch(options = {}) { - const blockExecutionContextEncodedResult = await this.db.getAux( - BlockExecutionContextRepository.EXTERNAL_STORE_KEY_NAME, - options, - ); - - const blockExecutionContextEncoded = blockExecutionContextEncodedResult.getValue(); - - const blockExecutionContext = new BlockExecutionContext(); - - if (!blockExecutionContextEncoded) { - return blockExecutionContext; - } - - const rawBlockExecutionContext = cbor.decode(blockExecutionContextEncoded); - - const context = new BlockExecutionContext(); - - context.fromObject(rawBlockExecutionContext); - - return context; - } -} - -BlockExecutionContextRepository.EXTERNAL_STORE_KEY_NAME = Buffer.from('blockExecutionContext'); - -module.exports = BlockExecutionContextRepository; diff --git a/packages/js-drive/lib/blockExecution/BlockInfo.js b/packages/js-drive/lib/blockExecution/BlockInfo.js deleted file mode 100644 index 75c5f0b553e..00000000000 --- a/packages/js-drive/lib/blockExecution/BlockInfo.js +++ /dev/null @@ -1,54 +0,0 @@ -class BlockInfo { - /** - * @type {number} - */ - height; - - /** - * @type {number} - */ - epoch; - - /** - * @type {number} - */ - timeMs; - - /** - * @param {number} height - * @param {number} epoch - * @param {number} timeMs - */ - constructor(height, epoch, timeMs) { - this.height = height; - this.epoch = epoch; - this.timeMs = timeMs; - } - - /** - * @returns {RawBlockInfo} - */ - toObject() { - return { - height: this.height, - epoch: this.epoch, - timeMs: this.timeMs, - }; - } - - /** - * @param {BlockExecutionContext} blockExecutionContext - * @returns {BlockInfo} - */ - static createFromBlockExecutionContext(blockExecutionContext) { - const epochInfo = blockExecutionContext.getEpochInfo(); - - return new BlockInfo( - blockExecutionContext.getHeight().toNumber(), - epochInfo.currentEpochIndex, - blockExecutionContext.getTimeMs(), - ); - } -} - -module.exports = BlockInfo; diff --git a/packages/js-drive/lib/blockExecution/errors/BlockExecutionContextNotFoundError.js b/packages/js-drive/lib/blockExecution/errors/BlockExecutionContextNotFoundError.js deleted file mode 100644 index 6c7a0d13698..00000000000 --- a/packages/js-drive/lib/blockExecution/errors/BlockExecutionContextNotFoundError.js +++ /dev/null @@ -1,23 +0,0 @@ -const DriveError = require('../../errors/DriveError'); - -class BlockExecutionContextNotFoundError extends DriveError { - /** - * - * @param {number} round - */ - constructor(round) { - super(`BlockExecutionContext for round ${round} not found`); - - this.round = round; - } - - /** - * - * @return {number} - */ - getRound() { - return this.round; - } -} - -module.exports = BlockExecutionContextNotFoundError; diff --git a/packages/js-drive/lib/blockExecution/errors/ContextsAreMoreThanStackMaxSizeError.js b/packages/js-drive/lib/blockExecution/errors/ContextsAreMoreThanStackMaxSizeError.js deleted file mode 100644 index a5594fd4e5b..00000000000 --- a/packages/js-drive/lib/blockExecution/errors/ContextsAreMoreThanStackMaxSizeError.js +++ /dev/null @@ -1,9 +0,0 @@ -const DriveError = require('../../errors/DriveError'); - -class ContextsAreMoreThanStackMaxSizeError extends DriveError { - constructor() { - super('Number of contexts is more than stack max size'); - } -} - -module.exports = ContextsAreMoreThanStackMaxSizeError; diff --git a/packages/js-drive/lib/core/LatestCoreChainLock.js b/packages/js-drive/lib/core/LatestCoreChainLock.js deleted file mode 100644 index 1dee1a2a642..00000000000 --- a/packages/js-drive/lib/core/LatestCoreChainLock.js +++ /dev/null @@ -1,42 +0,0 @@ -const EventEmitter = require('events'); - -class LatestCoreChainLock extends EventEmitter { - /** - * - * @param {ChainLock} [chainLock] - */ - constructor(chainLock = undefined) { - super(); - - this.chainLock = chainLock; - } - - /** - * Update latest chainlock - * - * @param {ChainLock} chainLock - * @return {LatestCoreChainLock} - */ - update(chainLock) { - this.chainLock = chainLock; - - this.emit(LatestCoreChainLock.EVENTS.update, this.chainLock); - this.emit(`${LatestCoreChainLock.EVENTS.update}:${this.chainLock.height}`, this.chainLock); - - return this; - } - - /** - * - * @return {ChainLock} - */ - getChainLock() { - return this.chainLock; - } -} - -LatestCoreChainLock.EVENTS = { - update: 'update', -}; - -module.exports = LatestCoreChainLock; diff --git a/packages/js-drive/lib/core/SimplifiedMasternodeList.js b/packages/js-drive/lib/core/SimplifiedMasternodeList.js deleted file mode 100644 index 804d55707b8..00000000000 --- a/packages/js-drive/lib/core/SimplifiedMasternodeList.js +++ /dev/null @@ -1,47 +0,0 @@ -const SimplifiedMNListStore = require('@dashevo/dashcore-lib/lib/deterministicmnlist/SimplifiedMNListStore'); - -class SimplifiedMasternodeList { - constructor(options) { - this.options = { - maxListsLimit: options.smlMaxListsLimit, - }; - - this.store = undefined; - } - - /** - * @param {SimplifiedMNListDiff[]} smlDiffs - * - * @return SimplifiedMasternodeList - */ - applyDiffs(smlDiffs) { - if (!this.store) { - this.store = new SimplifiedMNListStore([...smlDiffs], this.options); - } else { - smlDiffs.forEach((diff) => { - this.store.addDiff(diff); - }); - } - - return this; - } - - /** - * - * @return {SimplifiedMNListStore|undefined} - */ - getStore() { - return this.store; - } - - /** - * Reset the SML store - * - * @return {void} - */ - reset() { - this.store = undefined; - } -} - -module.exports = SimplifiedMasternodeList; diff --git a/packages/js-drive/lib/core/ZmqClient.js b/packages/js-drive/lib/core/ZmqClient.js deleted file mode 100644 index e3450af613d..00000000000 --- a/packages/js-drive/lib/core/ZmqClient.js +++ /dev/null @@ -1,129 +0,0 @@ -const { EventEmitter } = require('events'); -const zeromq = require('zeromq'); - -const ZMQ_TOPICS = { - hashtx: 'hashtx', - hashtxlock: 'hashtxlock', - hashblock: 'hashblock', - rawblock: 'rawblock', - rawtx: 'rawtx', - rawtxlock: 'rawtxlock', - rawtxlocksig: 'rawtxlocksig', - rawchainlock: 'rawchainlock', - rawchainlocksig: 'rawchainlocksig', -}; - -const defaultOptions = { topics: ZMQ_TOPICS, maxRetryCount: 20 }; - -class ZmqClient extends EventEmitter { - constructor(host, port, options = defaultOptions) { - super(); - this.subscriberSocket = zeromq.socket('sub'); - this.connectionString = `tcp://${host}:${port}`; - this.topics = options.topics || []; - this.maxRetryCount = options.maxRetryCount; - this.isConnected = false; - this.resetConnectionFailuresCount(); - } - - resetConnectionFailuresCount() { - this.connectionFailuresCount = 0; - } - - /** - * Starts listening to zmq messages - * @returns {Promise} - */ - start() { - return new Promise((resolve) => { - this.subscriberSocket.once('connect', () => resolve()); - this.subscriberSocket.once('connect', () => { - this.emit(ZmqClient.events.CONNECTED); - }); - this.subscriberSocket.on('connect', () => { - this.resetConnectionFailuresCount(); - }); - - this.initErrorHandlers(); - this.initMessageHandlers(); - this.startMonitor(); - this.subscriberSocket.connect(this.connectionString); - this.isConnected = true; - }); - } - - /** - * @private - * Starts connection monitor to monitor connection status - */ - startMonitor() { - this.subscriberSocket.monitor(500, 0); - } - - /** - * @private - */ - incrementErrorCount() { - this.connectionFailuresCount += 1; - if (this.connectionFailuresCount >= this.maxRetryCount) { - this.emit(ZmqClient.events.MAX_RETRIES_REACHED, `Failed to connect to ZMQ after ${this.maxRetryCount} tries`); - } - } - - /** - * Init connection error handlers. Requires connection monitor to be started - */ - initErrorHandlers() { - this.subscriberSocket.on('connect_delay', () => { - this.emit(ZmqClient.events.CONNECTION_DELAY, 'Dashcore ZMQ connection delay'); - this.incrementErrorCount(); - }); - this.subscriberSocket.on('disconnect', () => { - this.emit(ZmqClient.events.DISCONNECTED, 'Dashcore ZMQ connection is lost'); - this.incrementErrorCount(); - }); - this.subscriberSocket.on('monitor_error', (error) => { - this.emit(ZmqClient.events.MONITOR_ERROR, error); - this.incrementErrorCount(); - setTimeout(() => this.startMonitor(), 1000); - }); - } - - /** - * Subscribes to zmq messages - */ - initMessageHandlers() { - Object.keys(this.topics).forEach((key) => this.subscriberSocket.subscribe(this.topics[key])); - this.subscriberSocket.on('message', this.emit.bind(this)); - } - - subscribe(topicName, callback) { - const isAlreadySubscribed = Object.keys(this.topics).includes(topicName); - - if (!this.isConnected) { - throw new Error('Socket not connected. Wait until .start() resolves'); - } - - if (!isAlreadySubscribed) { - this.topics[topicName] = topicName; - this.subscriberSocket.subscribe(topicName); - } - - if (callback) { - this.on(topicName, callback); - } - } -} - -ZmqClient.events = { - CONNECTION_DELAY: 'CONNECTION_DELAY', - DISCONNECTED: 'DISCONNECTED', - MONITOR_ERROR: 'MONITOR_ERROR', - ERROR: 'ERROR', - MAX_RETRIES_REACHED: 'MAX_RETRIES_REACHED', - CONNECTED: 'CONNECTED', -}; - -ZmqClient.TOPICS = ZMQ_TOPICS; - -module.exports = ZmqClient; diff --git a/packages/js-drive/lib/core/ensureBlock.js b/packages/js-drive/lib/core/ensureBlock.js deleted file mode 100644 index 4b3091dcde1..00000000000 --- a/packages/js-drive/lib/core/ensureBlock.js +++ /dev/null @@ -1,35 +0,0 @@ -const ZMQClient = require('./ZmqClient'); - -/** - * - * @param {ZMQClient} zmqClient - * @param {RpcClient} rpcClient - * @param {string} hash - * @return {Promise} - */ -async function ensureBlock(zmqClient, rpcClient, hash) { - const eventPromise = new Promise((resolve) => { - const onHashBlock = (response) => { - if (hash.toString('hex') === response.toString('hex')) { - zmqClient.removeListener(ZMQClient.TOPICS.hashblock, onHashBlock); - - resolve(response); - } - }; - - zmqClient.on(ZMQClient.TOPICS.hashblock, onHashBlock); - }); - - try { - await rpcClient.getBlock(hash.toString('hex')); - } catch (e) { - // Block not found - if (e.code === -5) { - await eventPromise; - } else { - throw e; - } - } -} - -module.exports = ensureBlock; diff --git a/packages/js-drive/lib/core/errors/MissingChainLockError.js b/packages/js-drive/lib/core/errors/MissingChainLockError.js deleted file mode 100644 index ab3a2960e45..00000000000 --- a/packages/js-drive/lib/core/errors/MissingChainLockError.js +++ /dev/null @@ -1,11 +0,0 @@ -class MissingChainLockError extends Error { - constructor() { - super('ChainLock is required to obtain SML'); - - this.name = this.constructor.name; - - Error.captureStackTrace(this, this.constructor); - } -} - -module.exports = MissingChainLockError; diff --git a/packages/js-drive/lib/core/errors/NotEnoughBlocksForValidSMLError.js b/packages/js-drive/lib/core/errors/NotEnoughBlocksForValidSMLError.js deleted file mode 100644 index 9021506a9ef..00000000000 --- a/packages/js-drive/lib/core/errors/NotEnoughBlocksForValidSMLError.js +++ /dev/null @@ -1,23 +0,0 @@ -const DriveError = require('../../errors/DriveError'); - -class NotEnoughBlocksForValidSMLError extends DriveError { - /** - * @param {number} blockHeight - */ - constructor(blockHeight) { - super(`${blockHeight} blocks are not enough to obtain comprehensive SML. Needs 16 block diffs minimum`); - - this.blockHeight = blockHeight; - } - - /** - * Get block height - * - * @return {number} - */ - getBlockHeight() { - return this.blockHeight; - } -} - -module.exports = NotEnoughBlocksForValidSMLError; diff --git a/packages/js-drive/lib/core/errors/QuorumsNotFoundError.js b/packages/js-drive/lib/core/errors/QuorumsNotFoundError.js deleted file mode 100644 index 6b3e12d0ead..00000000000 --- a/packages/js-drive/lib/core/errors/QuorumsNotFoundError.js +++ /dev/null @@ -1,31 +0,0 @@ -const DriveError = require('../../errors/DriveError'); - -class QuorumsNotFoundError extends DriveError { - /** - * @param {SimplifiedMNList} simplifiedMNList - * @param {number} quorumType - */ - constructor(simplifiedMNList, quorumType) { - let message; - if (simplifiedMNList.quorumList.length === 0) { - message = `SML at block ${simplifiedMNList.blockHash} contains no quorums of any type`; - } else { - const otherQuorumTypes = [...new Set(simplifiedMNList.quorumList.map((quorumEntry) => quorumEntry.llmqType))].join(','); - message = `SML at block ${simplifiedMNList.blockHash} contains no quorums of type ${quorumType}, but contains entries for types ${otherQuorumTypes}. Please check the Drive configuration`; - } - super(message); - - this.simplifiedMNList = simplifiedMNList; - } - - /** - * Get block height - * - * @return {SimplifiedMNList} - */ - getSimplifiedMNList() { - return this.simplifiedMNList; - } -} - -module.exports = QuorumsNotFoundError; diff --git a/packages/js-drive/lib/core/fetchQuorumMembersFactory.js b/packages/js-drive/lib/core/fetchQuorumMembersFactory.js deleted file mode 100644 index bd175746c5d..00000000000 --- a/packages/js-drive/lib/core/fetchQuorumMembersFactory.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @param {RpcClient} coreRpcClient - * @return {fetchQuorumMembers} - */ -function fetchQuorumMembersFactory(coreRpcClient) { - /** - * @typedef {fetchQuorumMembers} - * @param {number} quorumType - * @param {string} quorumHash - * @return {Promise} - */ - async function fetchQuorumMembers(quorumType, quorumHash) { - try { - const { - result: { - members: validators, - }, - } = await coreRpcClient.quorum( - 'info', - quorumType, - quorumHash, - ); - - return validators; - } catch (e) { - // RPC_INVALID_PARAMETER: quorum not found - if (e.code === -8) { - throw new Error(`The quorum of type ${quorumType} and quorumHash ${quorumHash} doesn't exist`); - } - - throw e; - } - } - - return fetchQuorumMembers; -} - -module.exports = fetchQuorumMembersFactory; diff --git a/packages/js-drive/lib/core/fetchSimplifiedMNListFactory.js b/packages/js-drive/lib/core/fetchSimplifiedMNListFactory.js deleted file mode 100644 index 52d9e360a8f..00000000000 --- a/packages/js-drive/lib/core/fetchSimplifiedMNListFactory.js +++ /dev/null @@ -1,23 +0,0 @@ -const { SimplifiedMNList } = require('@dashevo/dashcore-lib'); - -/** - * @param {RpcClient} coreRpcClient - * @returns {fetchSimplifiedMNList} - */ -function fetchSimplifiedMNListFactory(coreRpcClient) { - /** - * @typedef fetchSimplifiedMNList - * @param {number} fromBlockHeight - * @param {number} toBlockHeight - * @returns {Promise} - */ - async function fetchSimplifiedMNList(fromBlockHeight, toBlockHeight) { - const { result: rawDiff } = await coreRpcClient.protx('diff', fromBlockHeight, toBlockHeight, true); - - return new SimplifiedMNList(rawDiff); - } - - return fetchSimplifiedMNList; -} - -module.exports = fetchSimplifiedMNListFactory; diff --git a/packages/js-drive/lib/core/fetchTransactionFactory.js b/packages/js-drive/lib/core/fetchTransactionFactory.js deleted file mode 100644 index 2a770150429..00000000000 --- a/packages/js-drive/lib/core/fetchTransactionFactory.js +++ /dev/null @@ -1,33 +0,0 @@ -const { Transaction } = require('@dashevo/dashcore-lib'); - -/** - * @param {RpcClient} coreRpcClient - * @returns {fetchTransaction} - */ -function fetchTransactionFactory(coreRpcClient) { - /** - * @typedef {fetchTransaction} - * @param {string} id - * @returns {Transaction} - */ - async function fetchTransaction(id) { - let rawTransaction; - - try { - ({ result: rawTransaction } = await coreRpcClient.getRawTransaction(id, 1)); - } catch (e) { - // Invalid address or key error - if (e.code === -5) { - return null; - } - - throw e; - } - - return new Transaction(rawTransaction.hex); - } - - return fetchTransaction; -} - -module.exports = fetchTransactionFactory; diff --git a/packages/js-drive/lib/core/getRandomQuorumFactory.js b/packages/js-drive/lib/core/getRandomQuorumFactory.js deleted file mode 100644 index 94af18f98eb..00000000000 --- a/packages/js-drive/lib/core/getRandomQuorumFactory.js +++ /dev/null @@ -1,113 +0,0 @@ -const BufferWriter = require('@dashevo/dashcore-lib/lib/encoding/bufferwriter'); -const Hash = require('@dashevo/dashcore-lib/lib/crypto/hash'); -const { LLMQ_TYPES } = require('@dashevo/dashcore-lib/lib/constants'); -const QuorumsNotFoundError = require('./errors/QuorumsNotFoundError'); -const ValidatorSet = require('../validator/ValidatorSet'); - -const MIN_QUORUM_VALID_MEMBERS = 90; - -const LLMQ_TYPE_TO_NAME = Object - .fromEntries(Object - .entries(LLMQ_TYPES) - .map(([key, value]) => [value, key.toLowerCase().replace('type_', '')])); - -/** - * Calculates scores for validator quorum selection - * it calculates sha256(hash, modifier) per quorumHash - * Please note that this is not a double-sha256 but a single-sha256 - * - * @param {Buffer[]} quorumHashes - * @param {Buffer} modifier - * @return {Object[]} scores - */ -function calculateQuorumHashScores(quorumHashes, modifier) { - return quorumHashes.map((hash) => { - const bufferWriter = new BufferWriter(); - - bufferWriter.write(hash); - bufferWriter.write(modifier); - - return { score: Hash.sha256(bufferWriter.toBuffer()), hash }; - }); -} - -/** - * - * @param {RpcClient} coreRpcClient - * @return {getRandomQuorum} - */ -function getRandomQuorumFactory(coreRpcClient) { - /** - * Gets the current validator set quorum hash for a particular core height - * - * @typedef {getRandomQuorum} - * @param {SimplifiedMNList} sml - * @param {number} quorumType - * @param {Buffer} entropy - the entropy to select the quorum - * @param {number} coreHeight - * @return return {Promise} - the current validator set's quorumHash - */ - async function getRandomQuorum(sml, quorumType, entropy, coreHeight) { - const validatorQuorums = sml.getQuorumsOfType(quorumType); - - if (validatorQuorums.length === 0) { - throw new QuorumsNotFoundError(sml, quorumType); - } - - const { result: allValidatorQuorumsExtendedInfo } = await coreRpcClient.quorum('listextended', coreHeight); - - // convert to object - const validatorQuorumsInfo = allValidatorQuorumsExtendedInfo[LLMQ_TYPE_TO_NAME[quorumType]] - .reduce( - (obj, item) => ({ - ...obj, - ...item, - }), - {}, - ); - - const numberOfQuorums = validatorQuorums.length; - const minTtl = ValidatorSet.ROTATION_BLOCK_INTERVAL * 3; - const dkgInterval = 24; - - // filter quorum by the number of valid members to choose the most vital ones - let filteredValidatorQuorums = validatorQuorums - .filter( - (validatorQuorum) => validatorQuorum.validMembersCount >= MIN_QUORUM_VALID_MEMBERS, - ) - .filter((validatorQuorum) => { - const validatorQuorumInfo = validatorQuorumsInfo[validatorQuorum.quorumHash]; - - if (!validatorQuorumInfo) { - return false; - } - - const quorumRemoveHeight = validatorQuorumInfo.creationHeight - + (dkgInterval * numberOfQuorums); - const howMuchInRest = quorumRemoveHeight - coreHeight; - const quorumTtl = howMuchInRest * 2.5; - - return quorumTtl > minTtl; - }); - - if (filteredValidatorQuorums.length === 0) { - // if there is no "vital" quorums, we choose among others with default min quorum size - filteredValidatorQuorums = validatorQuorums; - } - - const validatorQuorumHashes = filteredValidatorQuorums - .map((quorum) => Buffer.from(quorum.quorumHash, 'hex')); - - const scoredHashes = calculateQuorumHashScores(validatorQuorumHashes, entropy); - - scoredHashes.sort((a, b) => Buffer.compare(a.score, b.score)); - - const quorumHash = scoredHashes[0].hash.toString('hex'); - - return sml.getQuorum(quorumType, quorumHash); - } - - return getRandomQuorum; -} - -module.exports = getRandomQuorumFactory; diff --git a/packages/js-drive/lib/core/updateSimplifiedMasternodeListFactory.js b/packages/js-drive/lib/core/updateSimplifiedMasternodeListFactory.js deleted file mode 100644 index e8f6d16073a..00000000000 --- a/packages/js-drive/lib/core/updateSimplifiedMasternodeListFactory.js +++ /dev/null @@ -1,113 +0,0 @@ -const SimplifiedMNListDiff = require('@dashevo/dashcore-lib/lib/deterministicmnlist/SimplifiedMNListDiff'); - -const NotEnoughBlocksForValidSMLError = require('./errors/NotEnoughBlocksForValidSMLError'); - -/** - * Check that core is synced (factory) - * - * @param {RpcClient} coreRpcClient - * @param {SimplifiedMasternodeList} simplifiedMasternodeList - * @param {number} smlMaxListsLimit - * @param {string} network - * @param {BaseLogger} logger - * - * @returns {updateSimplifiedMasternodeList} - */ -function updateSimplifiedMasternodeListFactory( - coreRpcClient, - simplifiedMasternodeList, - smlMaxListsLimit, - network, - logger, -) { - // 1 means first block - let latestRequestedHeight = 1; - - /** - * @param {number} fromHeight - * @param {number} toHeight - * @return {Promise} - */ - async function fetchDiffsPerBlock(fromHeight, toHeight) { - const diffs = []; - - for (let height = fromHeight; height < toHeight; height += 1) { - const { result: rawDiff } = await coreRpcClient.protx('diff', height, height + 1, true); - - const diff = new SimplifiedMNListDiff(rawDiff, network); - - diffs.push(diff); - } - - return diffs; - } - - /** - * Check that core is synced - * - * @typedef updateSimplifiedMasternodeList - * @param {number} coreHeight - * @param {Object} [options] - * @param {BaseLogger} [options.logger] - * - * @returns {Promise} - */ - async function updateSimplifiedMasternodeList(coreHeight, options = {}) { - // either use a logger passed or use standard logger - const contextLogger = (options.logger || logger); - - // Should be enough to get 16 diffs - if (coreHeight < smlMaxListsLimit + 1) { - throw new NotEnoughBlocksForValidSMLError(coreHeight); - } - - // When we got more than 16 blocks of difference between last requested height - // and core height, we take only last 16 of them. - if (coreHeight - latestRequestedHeight > smlMaxListsLimit) { - latestRequestedHeight = 1; - simplifiedMasternodeList.reset(); - } - - if (latestRequestedHeight === 1) { - // Initialize SML with 16 diffs to have enough quorum information - // to be able to verify signatures - - const startHeight = coreHeight - smlMaxListsLimit; - - const { result: rawDiff } = await coreRpcClient.protx('diff', latestRequestedHeight, startHeight, true); - - const initialSmlDiffs = [ - new SimplifiedMNListDiff(rawDiff, network), - ...await fetchDiffsPerBlock(startHeight, coreHeight), - ]; - - simplifiedMasternodeList.applyDiffs(initialSmlDiffs); - - latestRequestedHeight = coreHeight; - - contextLogger.debug(`SML is initialized for core heights ${startHeight} to ${coreHeight}`); - - return true; - } - - if (latestRequestedHeight < coreHeight) { - // Update SML - - const smlDiffs = await fetchDiffsPerBlock(latestRequestedHeight, coreHeight); - - simplifiedMasternodeList.applyDiffs(smlDiffs); - - contextLogger.debug(`SML is updated for core heights ${latestRequestedHeight} to ${coreHeight}`); - - latestRequestedHeight = coreHeight; - - return true; - } - - return false; - } - - return updateSimplifiedMasternodeList; -} - -module.exports = updateSimplifiedMasternodeListFactory; diff --git a/packages/js-drive/lib/core/waitForChainLockedHeightFactory.js b/packages/js-drive/lib/core/waitForChainLockedHeightFactory.js deleted file mode 100644 index 8d01c2fdfcc..00000000000 --- a/packages/js-drive/lib/core/waitForChainLockedHeightFactory.js +++ /dev/null @@ -1,49 +0,0 @@ -const MissingChainLockError = require('./errors/MissingChainLockError'); -const LatestCoreChainLock = require('./LatestCoreChainLock'); - -/** - * - * @param {LatestCoreChainLock} latestCoreChainLock - - * @return {waitForChainLockedHeight} - */ -function waitForChainLockedHeightFactory( - latestCoreChainLock, -) { - /** - * @typedef waitForChainLockedHeight - * @param {number} coreHeight - * - * @return {Promise} - */ - async function waitForChainLockedHeight(coreHeight) { - // ChainLock is required to get finalized SML that won't be reorged - const existingChainLock = latestCoreChainLock.getChainLock(); - - if (!existingChainLock) { - throw new MissingChainLockError(); - } - - // Wait for core to be synced up to coreHeight - if (coreHeight > existingChainLock.height) { - await new Promise((resolve) => { - const listener = (chainLock) => { - // Skip if core height still not reached - if (coreHeight > chainLock.height) { - return; - } - - latestCoreChainLock.removeListener(LatestCoreChainLock.EVENTS.update, listener); - - resolve(); - }; - - latestCoreChainLock.on(LatestCoreChainLock.EVENTS.update, listener); - }); - } - } - - return waitForChainLockedHeight; -} - -module.exports = waitForChainLockedHeightFactory; diff --git a/packages/js-drive/lib/core/waitForCoreChainLockSyncFactory.js b/packages/js-drive/lib/core/waitForCoreChainLockSyncFactory.js deleted file mode 100644 index d2f05f26760..00000000000 --- a/packages/js-drive/lib/core/waitForCoreChainLockSyncFactory.js +++ /dev/null @@ -1,103 +0,0 @@ -const { ChainLock } = require('@dashevo/dashcore-lib'); - -const ChainLockSigMessage = require('@dashevo/dashcore-lib/lib/zmqMessages/ChainLockSigMessage'); -const ZMQClient = require('./ZmqClient'); - -const ensureBlock = require('./ensureBlock'); - -/** - * Wait and ensure that core chain lock stays synced (factory) - * - * @param {ZMQClient} coreZMQClient - * @param {RpcClient} coreRpcClient - * @param {LatestCoreChainLock} latestCoreChainLock - * @param {BaseLogger} logger - * - * @returns {waitForCoreSync} - */ -function waitForCoreChainLockSyncFactory( - coreZMQClient, - coreRpcClient, - latestCoreChainLock, - logger, -) { - /** - * Wait and ensure that core chain lock stays synced. - * On new ChainLock received, will also ensure that its block has been processed. - * - * @typedef waitForCoreChainLockSync - * - * @returns {Promise} - */ - async function waitForCoreChainLockSync() { - coreZMQClient.subscribe(ZMQClient.TOPICS.rawchainlocksig); - - let resolveFirstChainLockFromZMQPromise; - const firstChainLockFromZMQPromise = new Promise((resolve) => { - resolveFirstChainLockFromZMQPromise = resolve; - }); - - coreZMQClient.on(ZMQClient.TOPICS.rawchainlocksig, async (rawChainLockMessage) => { - let chainLock; - - try { - ({ chainLock } = new ChainLockSigMessage(rawChainLockMessage)); - } catch (e) { - logger.error( - { - err: e, - rawChainLockMessage: rawChainLockMessage.toString('hex'), - }, - 'Error on creating ChainLockSigMessage', - ); - - return; - } - - latestCoreChainLock.update(chainLock); - - logger.trace( - { - chainLock, - }, - `Updated latestCoreChainLock for core height ${chainLock.height}`, - ); - - if (resolveFirstChainLockFromZMQPromise) { - resolveFirstChainLockFromZMQPromise(); - resolveFirstChainLockFromZMQPromise = null; - } - }); - - // Because a ChainLock may happen before its block, we also subscribe to rawblock - coreZMQClient.subscribe(ZMQClient.TOPICS.hashblock); - - // We need to retrieve latest ChainLock from our fully synced Core instance - let rpcBestChainLockResponse; - try { - rpcBestChainLockResponse = await coreRpcClient.getBestChainLock(); - } catch (e) { - // Unable to find any ChainLock - if (e.code === -32603) { - logger.debug('There are no ChainLocks currently. Waiting for the first one...'); - - // We need to wait for a new ChainLock from ZMQ socket - await firstChainLockFromZMQPromise; - } else { - throw e; - } - } - - if (rpcBestChainLockResponse) { - const chainLock = new ChainLock(rpcBestChainLockResponse.result); - - await ensureBlock(coreZMQClient, coreRpcClient, chainLock.blockHash); - - latestCoreChainLock.update(chainLock); - } - } - - return waitForCoreChainLockSync; -} - -module.exports = waitForCoreChainLockSyncFactory; diff --git a/packages/js-drive/lib/core/waitForCoreSyncFactory.js b/packages/js-drive/lib/core/waitForCoreSyncFactory.js deleted file mode 100644 index 9a4b612101a..00000000000 --- a/packages/js-drive/lib/core/waitForCoreSyncFactory.js +++ /dev/null @@ -1,47 +0,0 @@ -const wait = require('../util/wait'); - -/** - * Check that core is synced (factory) - * - * @param {RpcClient} coreRpcClient - * - * @returns {waitForCoreSync} - */ -function waitForCoreSyncFactory(coreRpcClient) { - /** - * Check that core is synced - * - * @typedef waitForCoreSync - * - * @param {function(number, number)} progressCallback - * - * @returns {Promise} - */ - async function waitForCoreSync(progressCallback) { - let isBlockchainSynced = false; - while (!isBlockchainSynced) { - ({ - result: { - IsBlockchainSynced: isBlockchainSynced, - }, - } = await coreRpcClient.mnsync('status')); - - if (!isBlockchainSynced) { - const { - result: { - blocks: currentBlockHeight, - headers: currentHeadersNumber, - }, - } = await coreRpcClient.getBlockchainInfo(); - - progressCallback(currentBlockHeight, currentHeadersNumber); - - await wait(10000); - } - } - } - - return waitForCoreSync; -} - -module.exports = waitForCoreSyncFactory; diff --git a/packages/js-drive/lib/createDIContainer.js b/packages/js-drive/lib/createDIContainer.js deleted file mode 100644 index d87029bb822..00000000000 --- a/packages/js-drive/lib/createDIContainer.js +++ /dev/null @@ -1,894 +0,0 @@ -const { - createContainer: createAwilixContainer, - InjectionMode, - asClass, - asFunction, - asValue, -} = require('awilix'); - -const fs = require('fs'); - -const { AsyncLocalStorage } = require('node:async_hooks'); - -const Long = require('long'); - -const RSDrive = require('@dashevo/rs-drive'); - -const RpcClient = require('@dashevo/dashd-rpc/promise'); - -const { PublicKey } = require('@dashevo/dashcore-lib'); - -const DashPlatformProtocol = require('@dashevo/dpp'); - -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); - -const findMyWay = require('find-my-way'); - -const pino = require('pino'); -const pinoMultistream = require('pino-multi-stream'); - -const createABCIServer = require('@dashevo/abci'); - -const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion'); - -const calculateOperationFees = require('@dashevo/dpp/lib/stateTransition/fee/calculateOperationFees'); -const calculateStateTransitionFeeFactory = require('@dashevo/dpp/lib/stateTransition/fee/calculateStateTransitionFeeFactory'); - -const decodeProtocolEntityFactory = require('@dashevo/dpp/lib/decodeProtocolEntityFactory'); -const featureFlagsSystemIds = require('@dashevo/feature-flags-contract/lib/systemIds'); - -const featureFlagsDocuments = require('@dashevo/feature-flags-contract/schema/feature-flags-documents.json'); -const dpnsSystemIds = require('@dashevo/dpns-contract/lib/systemIds'); - -const dpnsDocuments = require('@dashevo/dpns-contract/schema/dpns-contract-documents.json'); -const masternodeRewardsSystemIds = require('@dashevo/masternode-reward-shares-contract/lib/systemIds'); - -const masternodeRewardsDocuments = require('@dashevo/masternode-reward-shares-contract/schema/masternode-reward-shares-documents.json'); -const dashpaySystemIds = require('@dashevo/dashpay-contract/lib/systemIds'); - -const dashpayDocuments = require('@dashevo/dashpay-contract/schema/dashpay.schema.json'); - -const withdrawalsSystemIds = require('@dashevo/withdrawals-contract/lib/systemIds'); -const withdrawalsDocuments = require('@dashevo/withdrawals-contract/schema/withdrawals-documents.json'); -const calculateStateTransitionFeeFromOperationsFactory = require('@dashevo/dpp/lib/stateTransition/fee/calculateStateTransitionFeeFromOperationsFactory'); - -const packageJSON = require('../package.json'); - -const ZMQClient = require('./core/ZmqClient'); - -const sanitizeUrl = require('./util/sanitizeUrl'); -const LatestCoreChainLock = require('./core/LatestCoreChainLock'); - -const GroveDBStore = require('./storage/GroveDBStore'); - -const IdentityStoreRepository = require('./identity/IdentityStoreRepository'); - -const IdentityPublicKeyStoreRepository = require( - './identity/IdentityPublicKeyStoreRepository', -); -const DataContractStoreRepository = require('./dataContract/DataContractStoreRepository'); -const fetchDocumentsFactory = require('./document/fetchDocumentsFactory'); -const proveDocumentsFactory = require('./document/proveDocumentsFactory'); - -const fetchDataContractFactory = require('./document/fetchDataContractFactory'); -const BlockExecutionContext = require('./blockExecution/BlockExecutionContext'); - -const unserializeStateTransitionFactory = require( - './abci/handlers/stateTransition/unserializeStateTransitionFactory', -); -const DriveStateRepository = require('./dpp/DriveStateRepository'); -const CachedStateRepositoryDecorator = require('./dpp/CachedStateRepositoryDecorator'); -const LoggedStateRepositoryDecorator = require('./dpp/LoggedStateRepositoryDecorator'); -const dataContractQueryHandlerFactory = require('./abci/handlers/query/dataContractQueryHandlerFactory'); -const identityQueryHandlerFactory = require('./abci/handlers/query/identityQueryHandlerFactory'); - -const documentQueryHandlerFactory = require('./abci/handlers/query/documentQueryHandlerFactory'); - -const identitiesByPublicKeyHashesQueryHandlerFactory = require('./abci/handlers/query/identitiesByPublicKeyHashesQueryHandlerFactory'); -const getProofsQueryHandlerFactory = require('./abci/handlers/query/getProofsQueryHandlerFactory'); -const wrapInErrorHandlerFactory = require('./abci/errors/wrapInErrorHandlerFactory'); -const errorHandlerFactory = require('./errorHandlerFactory'); -const checkTxHandlerFactory = require('./abci/handlers/checkTxHandlerFactory'); -const initChainHandlerFactory = require('./abci/handlers/initChainHandlerFactory'); -const infoHandlerFactory = require('./abci/handlers/infoHandlerFactory'); -const extendVoteHandlerFactory = require('./abci/handlers/extendVoteHandlerFactory'); -const finalizeBlockHandlerFactory = require('./abci/handlers/finalizeBlockHandlerFactory'); -const prepareProposalHandlerFactory = require('./abci/handlers/prepareProposalHandlerFactory'); - -const processProposalHandlerFactory = require('./abci/handlers/processProposalHandlerFactory'); -const verifyVoteExtensionHandlerFactory = require('./abci/handlers/verifyVoteExtensionHandlerFactory'); -const beginBlockFactory = require('./abci/handlers/proposal/beginBlockFactory'); -const deliverTxFactory = require('./abci/handlers/proposal/deliverTxFactory'); -const endBlockFactory = require('./abci/handlers/proposal/endBlockFactory'); -const rotateAndCreateValidatorSetUpdateFactory = require('./abci/handlers/proposal/rotateAndCreateValidatorSetUpdateFactory'); -const createConsensusParamUpdateFactory = require('./abci/handlers/proposal/createConsensusParamUpdateFactory'); - -const createCoreChainLockUpdateFactory = require('./abci/handlers/proposal/createCoreChainLockUpdateFactory'); -const verifyChainLockFactory = require('./abci/handlers/proposal/verifyChainLockFactory'); -const queryHandlerFactory = require('./abci/handlers/queryHandlerFactory'); -const waitForCoreSyncFactory = require('./core/waitForCoreSyncFactory'); -const waitForCoreChainLockSyncFactory = require('./core/waitForCoreChainLockSyncFactory'); -const updateSimplifiedMasternodeListFactory = require('./core/updateSimplifiedMasternodeListFactory'); - -const waitForChainLockedHeightFactory = require('./core/waitForChainLockedHeightFactory'); -const SimplifiedMasternodeList = require('./core/SimplifiedMasternodeList'); -const SpentAssetLockTransactionsRepository = require('./identity/SpentAssetLockTransactionsRepository'); -const enrichErrorWithConsensusErrorFactory = require('./abci/errors/enrichErrorWithContextLoggerFactory'); -const closeAbciServerFactory = require('./abci/closeAbciServerFactory'); -const getLatestFeatureFlagFactory = require('./featureFlag/getLatestFeatureFlagFactory'); -const getFeatureFlagForHeightFactory = require('./featureFlag/getFeatureFlagForHeightFactory'); -const ValidatorSet = require('./validator/ValidatorSet'); -const createValidatorSetUpdate = require('./abci/handlers/validator/createValidatorSetUpdate'); -const fetchQuorumMembersFactory = require('./core/fetchQuorumMembersFactory'); -const getRandomQuorumFactory = require('./core/getRandomQuorumFactory'); - -const createQueryResponseFactory = require('./abci/handlers/query/response/createQueryResponseFactory'); -const BlockExecutionContextRepository = require('./blockExecution/BlockExecutionContextRepository'); -const synchronizeMasternodeIdentitiesFactory = require('./identity/masternode/synchronizeMasternodeIdentitiesFactory'); -const createMasternodeIdentityFactory = require('./identity/masternode/createMasternodeIdentityFactory'); -const handleNewMasternodeFactory = require('./identity/masternode/handleNewMasternodeFactory'); -const handleUpdatedPubKeyOperatorFactory = require('./identity/masternode/handleUpdatedPubKeyOperatorFactory'); -const handleUpdatedVotingAddressFactory = require('./identity/masternode/handleUpdatedVotingAddressFactory'); -const createRewardShareDocumentFactory = require('./identity/masternode/createRewardShareDocumentFactory'); -const handleRemovedMasternodeFactory = require('./identity/masternode/handleRemovedMasternodeFactory'); -const handleUpdatedScriptPayoutFactory = require('./identity/masternode/handleUpdatedScriptPayoutFactory'); - -const getWithdrawPubKeyTypeFromPayoutScriptFactory = require('./identity/masternode/getWithdrawPubKeyTypeFromPayoutScriptFactory'); -const getPublicKeyFromPayoutScript = require('./identity/masternode/getPublicKeyFromPayoutScript'); -const updateWithdrawalTransactionIdAndStatusFactory = require('./identity/withdrawals/updateWithdrawalTransactionIdAndStatusFactory'); -const broadcastWithdrawalTransactionsFactory = require('./abci/handlers/proposal/broadcastWithdrawalTransactionsFactory'); - -const DocumentRepository = require('./document/DocumentRepository'); -const ExecutionTimer = require('./util/ExecutionTimer'); -const noopLoggerInstance = require('./util/noopLogger'); -const fetchTransactionFactory = require('./core/fetchTransactionFactory'); -const LastSyncedCoreHeightRepository = require('./identity/masternode/LastSyncedCoreHeightRepository'); -const fetchSimplifiedMNListFactory = require('./core/fetchSimplifiedMNListFactory'); -const processProposalFactory = require('./abci/handlers/proposal/processProposalFactory'); -const createContextLoggerFactory = require('./abci/errors/createContextLoggerFactory'); -const IdentityBalanceStoreRepository = require('./identity/IdentityBalanceStoreRepository'); - -/** - * - * @param {Object} options - * @param {string} options.ABCI_HOST - * @param {string} options.ABCI_PORT - * @param {string} options.DB_PATH - * @param {string} options.GROVEDB_LATEST_FILE - * @param {string} options.DATA_CONTRACTS_GLOBAL_CACHE_SIZE - * @param {string} options.DATA_CONTRACTS_BLOCK_CACHE_SIZE - * @param {string} options.CORE_JSON_RPC_HOST - * @param {string} options.CORE_JSON_RPC_PORT - * @param {string} options.CORE_JSON_RPC_USERNAME - * @param {string} options.CORE_JSON_RPC_PASSWORD - * @param {string} options.CORE_ZMQ_HOST - * @param {string} options.CORE_ZMQ_PORT - * @param {string} options.CORE_ZMQ_CONNECTION_RETRIES - * @param {string} options.NETWORK - * @param {string} options.DPNS_MASTER_PUBLIC_KEY - * @param {string} options.DPNS_SECOND_PUBLIC_KEY - * @param {string} options.DASHPAY_MASTER_PUBLIC_KEY - * @param {string} options.DASHPAY_SECOND_PUBLIC_KEY - * @param {string} options.FEATURE_FLAGS_MASTER_PUBLIC_KEY - * @param {string} options.FEATURE_FLAGS_SECOND_PUBLIC_KEY - * @param {string} options.MASTERNODE_REWARD_SHARES_MASTER_PUBLIC_KEY - * @param {string} options.MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY - * @param {string} options.WITHDRAWALS_MASTER_PUBLIC_KEY - * @param {string} options.WITHDRAWALS_SECOND_PUBLIC_KEY - * @param {string} options.INITIAL_CORE_CHAINLOCKED_HEIGHT - * @param {string} options.VALIDATOR_SET_LLMQ_TYPE - * @param {string} options.TENDERDASH_P2P_PORT - * @param {string} options.LOG_STDOUT_LEVEL - * @param {string} options.LOG_PRETTY_FILE_LEVEL - * @param {string} options.LOG_PRETTY_FILE_PATH - * @param {string} options.LOG_JSON_FILE_LEVEL - * @param {string} options.LOG_JSON_FILE_PATH - * @param {string} options.LOG_STATE_REPOSITORY - * @param {string} options.NODE_ENV - * - * @return {AwilixContainer} - */ -function createDIContainer(options) { - if (!options.DPNS_MASTER_PUBLIC_KEY) { - throw new Error('DPNS_MASTER_PUBLIC_KEY must be set'); - } - if (!options.DPNS_SECOND_PUBLIC_KEY) { - throw new Error('DPNS_SECOND_PUBLIC_KEY must be set'); - } - - if (!options.DASHPAY_MASTER_PUBLIC_KEY) { - throw new Error('DASHPAY_MASTER_PUBLIC_KEY must be set'); - } - - if (!options.DASHPAY_SECOND_PUBLIC_KEY) { - throw new Error('DASHPAY_SECOND_PUBLIC_KEY must be set'); - } - - if (!options.FEATURE_FLAGS_MASTER_PUBLIC_KEY) { - throw new Error('FEATURE_FLAGS_MASTER_PUBLIC_KEY must be set'); - } - - if (!options.FEATURE_FLAGS_SECOND_PUBLIC_KEY) { - throw new Error('FEATURE_FLAGS_SECOND_PUBLIC_KEY must be set'); - } - - if (!options.MASTERNODE_REWARD_SHARES_MASTER_PUBLIC_KEY) { - throw new Error('MASTERNODE_REWARD_SHARES_MASTER_PUBLIC_KEY must be set'); - } - - if (!options.MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY) { - throw new Error('MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY must be set'); - } - - if (!options.WITHDRAWALS_MASTER_PUBLIC_KEY) { - throw new Error('WITHDRAWALS_MASTER_PUBLIC_KEY must be set'); - } - - if (!options.WITHDRAWALS_SECOND_PUBLIC_KEY) { - throw new Error('WITHDRAWALS_SECOND_PUBLIC_KEY must be set'); - } - - const container = createAwilixContainer({ - injectionMode: InjectionMode.CLASSIC, - }); - - /** - * Register itself (usually to solve recursive dependencies) - */ - container.register({ - container: asValue(container), - }); - - /** - * Register latest protocol version - * Define highest supported protocol version - */ - container.register({ - latestProtocolVersion: asValue(Long.fromInt(protocolVersion.latestVersion)), - }); - - /** - * Register environment variables - */ - container.register({ - abciHost: asValue(options.ABCI_HOST), - abciPort: asValue(options.ABCI_PORT), - - dbPath: asValue(options.DB_PATH), - - groveDBLatestFile: asValue(options.GROVEDB_LATEST_FILE), - - dataContractsGlobalCacheSize: asValue( - parseInt(options.DATA_CONTRACTS_GLOBAL_CACHE_SIZE, 10), - ), - dataContractsBlockCacheSize: asValue( - parseInt(options.DATA_CONTRACTS_BLOCK_CACHE_SIZE, 10), - ), - - coreJsonRpcHost: asValue(options.CORE_JSON_RPC_HOST), - coreJsonRpcPort: asValue(options.CORE_JSON_RPC_PORT), - coreJsonRpcUsername: asValue(options.CORE_JSON_RPC_USERNAME), - coreJsonRpcPassword: asValue(options.CORE_JSON_RPC_PASSWORD), - coreZMQHost: asValue(options.CORE_ZMQ_HOST), - coreZMQPort: asValue(options.CORE_ZMQ_PORT), - coreZMQConnectionRetries: asValue( - parseInt(options.CORE_ZMQ_CONNECTION_RETRIES, 10), - ), - network: asValue(options.NETWORK), - logStdoutLevel: asValue(options.LOG_STDOUT_LEVEL), - logPrettyFileLevel: asValue(options.LOG_PRETTY_FILE_LEVEL), - logPrettyFilePath: asValue(options.LOG_PRETTY_FILE_PATH), - logJsonFileLevel: asValue(options.LOG_JSON_FILE_LEVEL), - logJsonFilePath: asValue(options.LOG_JSON_FILE_PATH), - logStateRepository: asValue(options.LOG_STATE_REPOSITORY === 'true'), - isProductionEnvironment: asValue(options.NODE_ENV === 'production'), - maxIdentitiesPerRequest: asValue(25), - smlMaxListsLimit: asValue(16), - initialCoreChainLockedHeight: asValue( - parseInt(options.INITIAL_CORE_CHAINLOCKED_HEIGHT, 10), - ), - validatorSetLLMQType: asValue( - parseInt(options.VALIDATOR_SET_LLMQ_TYPE, 10), - ), - masternodeRewardSharesContractId: asValue( - Identifier.from(masternodeRewardsSystemIds.contractId), - ), - masternodeRewardSharesOwnerId: asValue( - Identifier.from(masternodeRewardsSystemIds.ownerId), - ), - masternodeRewardSharesOwnerMasterPublicKey: asValue( - PublicKey.fromString( - options.MASTERNODE_REWARD_SHARES_MASTER_PUBLIC_KEY, - ), - ), - masternodeRewardSharesOwnerSecondPublicKey: asValue( - PublicKey.fromString( - options.MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY, - ), - ), - masternodeRewardSharesDocuments: asValue( - masternodeRewardsDocuments, - ), - featureFlagsContractId: asValue( - Identifier.from(featureFlagsSystemIds.contractId), - ), - featureFlagsOwnerId: asValue( - Identifier.from(featureFlagsSystemIds.ownerId), - ), - featureFlagsOwnerMasterPublicKey: asValue( - PublicKey.fromString( - options.FEATURE_FLAGS_MASTER_PUBLIC_KEY, - ), - ), - featureFlagsOwnerSecondPublicKey: asValue( - PublicKey.fromString( - options.FEATURE_FLAGS_SECOND_PUBLIC_KEY, - ), - ), - featureFlagsDocuments: asValue(featureFlagsDocuments), - dpnsContractId: asValue(Identifier.from(dpnsSystemIds.contractId)), - dpnsOwnerId: asValue(Identifier.from(dpnsSystemIds.ownerId)), - dpnsOwnerMasterPublicKey: asValue( - PublicKey.fromString( - options.DPNS_MASTER_PUBLIC_KEY, - ), - ), - dpnsOwnerSecondPublicKey: asValue( - PublicKey.fromString( - options.DPNS_SECOND_PUBLIC_KEY, - ), - ), - dpnsDocuments: asValue(dpnsDocuments), - dashpayContractId: asValue(Identifier.from(dashpaySystemIds.contractId)), - dashpayOwnerId: asValue(Identifier.from(dashpaySystemIds.ownerId)), - dashpayOwnerMasterPublicKey: asValue( - PublicKey.fromString( - options.DASHPAY_MASTER_PUBLIC_KEY, - ), - ), - dashpayOwnerSecondPublicKey: asValue( - PublicKey.fromString( - options.DASHPAY_SECOND_PUBLIC_KEY, - ), - ), - dashpayDocuments: asValue(dashpayDocuments), - withdrawalsContractId: asValue(Identifier.from(withdrawalsSystemIds.contractId)), - withdrawalsOwnerId: asValue(Identifier.from(withdrawalsSystemIds.ownerId)), - withdrawalsOwnerMasterPublicKey: asValue( - PublicKey.fromString( - options.WITHDRAWALS_MASTER_PUBLIC_KEY, - ), - ), - withdrawalsOwnerSecondPublicKey: asValue( - PublicKey.fromString( - options.WITHDRAWALS_SECOND_PUBLIC_KEY, - ), - ), - withdrawalsDocuments: asValue(withdrawalsDocuments), - tenderdashP2pPort: asValue(options.TENDERDASH_P2P_PORT), - }); - - /** - * Register global DPP options - */ - container.register({ - dppOptions: asValue({}), - }); - - /** - * Register Core related - */ - container.register({ - latestCoreChainLock: asValue(new LatestCoreChainLock()), - simplifiedMasternodeList: asClass(SimplifiedMasternodeList).proxy().singleton(), - fetchQuorumMembers: asFunction(fetchQuorumMembersFactory), - fetchSimplifiedMNList: asFunction(fetchSimplifiedMNListFactory), - getRandomQuorum: asFunction(getRandomQuorumFactory), - coreZMQClient: asFunction(( - coreZMQHost, - coreZMQPort, - coreZMQConnectionRetries, - ) => ( - new ZMQClient(coreZMQHost, coreZMQPort, { - maxRetryCount: coreZMQConnectionRetries, - }) - )).singleton(), - - coreRpcClient: asFunction(( - coreJsonRpcHost, - coreJsonRpcPort, - coreJsonRpcUsername, - coreJsonRpcPassword, - ) => ( - new RpcClient({ - protocol: 'http', - host: coreJsonRpcHost, - port: coreJsonRpcPort, - user: coreJsonRpcUsername, - pass: coreJsonRpcPassword, - }) - )).singleton(), - }); - - /** - * Register common services - */ - container.register({ - loggerPrettyfierOptions: asValue({ - translateTime: true, - }), - - logStdoutStream: asFunction((loggerPrettyfierOptions) => pinoMultistream.prettyStream({ - prettyPrint: loggerPrettyfierOptions, - })).singleton(), - - logPrettyFileStream: asFunction(( - logPrettyFilePath, - loggerPrettyfierOptions, - ) => pinoMultistream.prettyStream({ - prettyPrint: loggerPrettyfierOptions, - dest: fs.createWriteStream(logPrettyFilePath, { flags: 'a' }), - })).singleton(), - - logJsonFileStream: asFunction((logJsonFilePath) => fs.createWriteStream(logJsonFilePath, { flags: 'a' })) - .disposer(async (stream) => new Promise((resolve) => stream.end(resolve))).singleton(), - - loggerStreams: asFunction(( - logStdoutLevel, - logStdoutStream, - logPrettyFileLevel, - logPrettyFileStream, - logJsonFileLevel, - logJsonFileStream, - ) => [ - { - level: logStdoutLevel, - stream: logStdoutStream, - }, - { - level: logPrettyFileLevel, - stream: logPrettyFileStream, - }, - { - level: logJsonFileLevel, - stream: logJsonFileStream, - }, - ]), - - logger: asFunction( - (loggerStreams) => pino({ - level: 'trace', - }, pinoMultistream.multistream(loggerStreams)) - .child({ driveVersion: packageJSON.version }), - ).singleton(), - - noopLogger: asValue(noopLoggerInstance), - - sanitizeUrl: asValue(sanitizeUrl), - - executionTimer: asClass(ExecutionTimer).singleton(), - }); - - /** - * RS Drive and GroveDB - */ - - container.register({ - rsDrive: asFunction(( - groveDBLatestFile, - dataContractsGlobalCacheSize, - dataContractsBlockCacheSize, - coreJsonRpcHost, - coreJsonRpcPort, - coreJsonRpcUsername, - coreJsonRpcPassword, - ) => new RSDrive(groveDBLatestFile, { - drive: { - dataContractsGlobalCacheSize, - dataContractsBlockCacheSize, - }, - core: { - rpc: { - url: `${coreJsonRpcHost}:${coreJsonRpcPort}`, - username: coreJsonRpcUsername, - password: coreJsonRpcPassword, - }, - }, - })) - .disposer(async (rsDrive) => { - // Flush data on disk - await rsDrive.getGroveDB().flush(); - - await rsDrive.close(); - - if (process.env.NODE_ENV === 'test') { - fs.rmSync(options.GROVEDB_LATEST_FILE, { recursive: true }); - } - }).singleton(), - - groveDB: asFunction((rsDrive) => rsDrive.getGroveDB()).singleton(), - - rsAbci: asFunction((rsDrive) => rsDrive.getAbci()).singleton(), - - groveDBStore: asFunction((rsDrive) => new GroveDBStore(rsDrive)).singleton(), - }); - - /** - * Register Identity - */ - container.register({ - identityRepository: asClass(IdentityStoreRepository).singleton(), - - identityBalanceRepository: asClass(IdentityBalanceStoreRepository).singleton(), - - identityPublicKeyRepository: asClass(IdentityPublicKeyStoreRepository).singleton(), - - synchronizeMasternodeIdentities: asFunction(synchronizeMasternodeIdentitiesFactory).singleton(), - - lastSyncedCoreHeightRepository: asClass(LastSyncedCoreHeightRepository).singleton(), - - createMasternodeIdentity: asFunction(createMasternodeIdentityFactory).singleton(), - - createRewardShareDocument: asFunction(createRewardShareDocumentFactory).singleton(), - - handleNewMasternode: asFunction(handleNewMasternodeFactory).singleton(), - - handleUpdatedPubKeyOperator: asFunction(handleUpdatedPubKeyOperatorFactory).singleton(), - - handleUpdatedVotingAddress: asFunction(handleUpdatedVotingAddressFactory).singleton(), - - handleRemovedMasternode: asFunction(handleRemovedMasternodeFactory).singleton(), - - handleUpdatedScriptPayout: asFunction(handleUpdatedScriptPayoutFactory).singleton(), - - getWithdrawPubKeyTypeFromPayoutScript: asFunction(getWithdrawPubKeyTypeFromPayoutScriptFactory) - .singleton(), - - getPublicKeyFromPayoutScript: asValue(getPublicKeyFromPayoutScript), - - systemIdentityPublicKeys: asFunction(( - masternodeRewardSharesOwnerMasterPublicKey, - masternodeRewardSharesOwnerSecondPublicKey, - featureFlagsOwnerMasterPublicKey, - featureFlagsOwnerSecondPublicKey, - dpnsOwnerMasterPublicKey, - dpnsOwnerSecondPublicKey, - dashpayOwnerMasterPublicKey, - dashpayOwnerSecondPublicKey, - withdrawalsOwnerMasterPublicKey, - withdrawalsOwnerSecondPublicKey, - ) => ({ - masternodeRewardSharesContractOwner: { - master: masternodeRewardSharesOwnerMasterPublicKey.toBuffer(), - high: masternodeRewardSharesOwnerSecondPublicKey.toBuffer(), - }, - featureFlagsContractOwner: { - master: featureFlagsOwnerMasterPublicKey.toBuffer(), - high: featureFlagsOwnerSecondPublicKey.toBuffer(), - }, - dpnsContractOwner: { - master: dpnsOwnerMasterPublicKey.toBuffer(), - high: dpnsOwnerSecondPublicKey.toBuffer(), - }, - withdrawalsContractOwner: { - master: dashpayOwnerMasterPublicKey.toBuffer(), - high: dashpayOwnerSecondPublicKey.toBuffer(), - }, - dashpayContractOwner: { - master: withdrawalsOwnerMasterPublicKey.toBuffer(), - high: withdrawalsOwnerSecondPublicKey.toBuffer(), - }, - })), - }); - - /** - * Register asset lock transactions - */ - container.register({ - spentAssetLockTransactionsRepository: asClass(SpentAssetLockTransactionsRepository).singleton(), - }); - - /** - * Register Data Contract - */ - container.register({ - dataContractRepository: asFunction(( - groveDBStore, - decodeProtocolEntity, - ) => new DataContractStoreRepository(groveDBStore, decodeProtocolEntity)).singleton(), - }); - - /** - * Register Document - */ - container.register({ - documentRepository: asFunction(( - groveDBStore, - ) => new DocumentRepository(groveDBStore)).singleton(), - - fetchDocuments: asFunction(fetchDocumentsFactory).singleton(), - fetchDataContract: asFunction(fetchDataContractFactory).singleton(), - proveDocuments: asFunction(proveDocumentsFactory).singleton(), - }); - - /** - * Register block execution context - */ - container.register({ - latestBlockExecutionContext: asClass(BlockExecutionContext).singleton(), - proposalBlockExecutionContext: asClass(BlockExecutionContext).singleton(), - blockExecutionContextRepository: asClass(BlockExecutionContextRepository).singleton(), - }); - - /** - * Register DPP - */ - container.register({ - decodeProtocolEntity: asFunction(decodeProtocolEntityFactory), - - calculateOperationFees: asValue(calculateOperationFees), - - calculateStateTransitionFeeFromOperations: - asFunction(calculateStateTransitionFeeFromOperationsFactory), - - calculateStateTransitionFee: asFunction(calculateStateTransitionFeeFactory), - - stateRepository: asFunction(( - identityRepository, - identityBalanceRepository, - identityPublicKeyRepository, - dataContractRepository, - fetchDocuments, - documentRepository, - spentAssetLockTransactionsRepository, - coreRpcClient, - latestBlockExecutionContext, - simplifiedMasternodeList, - rsDrive, - ) => { - const stateRepository = new DriveStateRepository( - identityRepository, - identityBalanceRepository, - identityPublicKeyRepository, - dataContractRepository, - fetchDocuments, - documentRepository, - spentAssetLockTransactionsRepository, - coreRpcClient, - latestBlockExecutionContext, - simplifiedMasternodeList, - rsDrive, - ); - - return new CachedStateRepositoryDecorator( - stateRepository, - ); - }).singleton(), - - transactionalStateRepository: asFunction(( - identityRepository, - identityBalanceRepository, - identityPublicKeyRepository, - dataContractRepository, - fetchDocuments, - documentRepository, - spentAssetLockTransactionsRepository, - coreRpcClient, - proposalBlockExecutionContext, - simplifiedMasternodeList, - logStateRepository, - rsDrive, - ) => { - const stateRepository = new DriveStateRepository( - identityRepository, - identityBalanceRepository, - identityPublicKeyRepository, - dataContractRepository, - fetchDocuments, - documentRepository, - spentAssetLockTransactionsRepository, - coreRpcClient, - proposalBlockExecutionContext, - simplifiedMasternodeList, - rsDrive, - { - useTransaction: true, - }, - ); - - const cachedRepository = new CachedStateRepositoryDecorator( - stateRepository, - ); - - if (!logStateRepository) { - return cachedRepository; - } - - return new LoggedStateRepositoryDecorator( - cachedRepository, - proposalBlockExecutionContext, - ); - }).singleton(), - - unserializeStateTransition: asFunction(( - dpp, - noopLogger, - ) => unserializeStateTransitionFactory(dpp, noopLogger)).singleton(), - - transactionalUnserializeStateTransition: asFunction(( - transactionalDpp, - noopLogger, - ) => unserializeStateTransitionFactory(transactionalDpp, noopLogger)).singleton(), - - dpp: asFunction((stateRepository, dppOptions) => ( - new DashPlatformProtocol({ - ...dppOptions, - stateRepository, - }) - )).singleton(), - - transactionalDpp: asFunction((transactionalStateRepository, dppOptions) => ( - new DashPlatformProtocol({ - ...dppOptions, - stateRepository: transactionalStateRepository, - }) - )).singleton(), - }); - - /** - * Register validator quorums - */ - container.register({ - validatorSet: asClass(ValidatorSet), - }); - - /** - * Register withrawals stuff - */ - container.register({ - updateWithdrawalTransactionIdAndStatus: asFunction( - updateWithdrawalTransactionIdAndStatusFactory, - ), - broadcastWithdrawalTransactions: asFunction(broadcastWithdrawalTransactionsFactory), - }); - - /** - * Register feature flags stuff - */ - container.register({ - getLatestFeatureFlag: asFunction(getLatestFeatureFlagFactory), - getFeatureFlagForHeight: asFunction(getFeatureFlagForHeightFactory), - }); - - /** - * Register Core stuff - */ - container.register({ - waitForCoreSync: asFunction(waitForCoreSyncFactory).singleton(), - - updateSimplifiedMasternodeList: asFunction(updateSimplifiedMasternodeListFactory).singleton(), - - waitForChainLockedHeight: asFunction(waitForChainLockedHeightFactory).singleton(), - - waitForCoreChainLockSync: asFunction(waitForCoreChainLockSyncFactory).singleton(), - - fetchTransaction: asFunction(fetchTransactionFactory).singleton(), - }); - - /** - * Register ABCI handlers - */ - container.register({ - createContextLogger: asFunction(createContextLoggerFactory), - abciAsyncLocalStorage: asValue(new AsyncLocalStorage()), - createQueryResponse: asFunction(createQueryResponseFactory).singleton(), - createValidatorSetUpdate: asValue(createValidatorSetUpdate), - identityQueryHandler: asFunction(identityQueryHandlerFactory).singleton(), - dataContractQueryHandler: asFunction(dataContractQueryHandlerFactory).singleton(), - documentQueryHandler: asFunction(documentQueryHandlerFactory).singleton(), - getProofsQueryHandler: asFunction(getProofsQueryHandlerFactory).singleton(), - identitiesByPublicKeyHashesQueryHandler: - asFunction(identitiesByPublicKeyHashesQueryHandlerFactory).singleton(), - - queryHandlerRouter: asFunction(( - identityQueryHandler, - dataContractQueryHandler, - documentQueryHandler, - identitiesByPublicKeyHashesQueryHandler, - getProofsQueryHandler, - ) => { - const router = findMyWay({ - ignoreTrailingSlash: true, - }); - - router.on('GET', '/identities', identityQueryHandler); - router.on('GET', '/dataContracts', dataContractQueryHandler); - router.on('GET', '/dataContracts/documents', documentQueryHandler); - router.on('GET', '/proofs', getProofsQueryHandler); - router.on('GET', '/identities/by-public-key-hash', identitiesByPublicKeyHashesQueryHandler); - - return router; - }).singleton(), - - beginBlock: asFunction(beginBlockFactory).singleton(), - - processProposal: asFunction(processProposalFactory), - - deliverTx: asFunction(deliverTxFactory).singleton(), - - wrappedDeliverTx: asFunction(( - wrapInErrorHandler, - enrichErrorWithContextError, - deliverTx, - ) => wrapInErrorHandler( - enrichErrorWithContextError(deliverTx), - )).singleton(), - - endBlock: asFunction(endBlockFactory).singleton(), - - verifyChainLock: asFunction(verifyChainLockFactory).singleton(), - - rotateAndCreateValidatorSetUpdate: asFunction( - rotateAndCreateValidatorSetUpdateFactory, - ).singleton(), - - createConsensusParamUpdate: asFunction(createConsensusParamUpdateFactory).singleton(), - - createCoreChainLockUpdate: asFunction(createCoreChainLockUpdateFactory).singleton(), - - infoHandler: asFunction(infoHandlerFactory).singleton(), - - checkTxHandler: asFunction(checkTxHandlerFactory).singleton(), - - initChainHandler: asFunction(initChainHandlerFactory).singleton(), - - queryHandler: asFunction(queryHandlerFactory).singleton(), - - extendVoteHandler: asFunction(extendVoteHandlerFactory).singleton(), - - finalizeBlockHandler: asFunction(finalizeBlockHandlerFactory).singleton(), - - prepareProposalHandler: asFunction(prepareProposalHandlerFactory).singleton(), - - processProposalHandler: asFunction(processProposalHandlerFactory).singleton(), - - verifyVoteExtensionHandler: asFunction(verifyVoteExtensionHandlerFactory).singleton(), - - wrapInErrorHandler: asFunction(wrapInErrorHandlerFactory).singleton(), - enrichErrorWithContextError: asFunction(enrichErrorWithConsensusErrorFactory).singleton(), - errorHandler: asFunction(errorHandlerFactory).singleton(), - - abciHandlers: asFunction(( - infoHandler, - checkTxHandler, - initChainHandler, - wrapInErrorHandler, - enrichErrorWithContextError, - queryHandler, - extendVoteHandler, - finalizeBlockHandler, - prepareProposalHandler, - processProposalHandler, - verifyVoteExtensionHandler, - ) => ({ - info: enrichErrorWithContextError(infoHandler), - checkTx: wrapInErrorHandler(enrichErrorWithContextError(checkTxHandler)), - initChain: enrichErrorWithContextError(initChainHandler), - query: wrapInErrorHandler(enrichErrorWithContextError(queryHandler)), - extendVote: enrichErrorWithContextError(extendVoteHandler), - finalizeBlock: enrichErrorWithContextError(finalizeBlockHandler), - prepareProposal: enrichErrorWithContextError(prepareProposalHandler), - processProposal: enrichErrorWithContextError(processProposalHandler), - verifyVoteExtension: enrichErrorWithContextError(verifyVoteExtensionHandler), - })).singleton(), - - closeAbciServer: asFunction(closeAbciServerFactory).singleton(), - - abciServer: asFunction((abciHandlers) => createABCIServer(abciHandlers)) - .singleton(), - }); - - return container; -} - -module.exports = createDIContainer; diff --git a/packages/js-drive/lib/dataContract/DataContractStoreRepository.js b/packages/js-drive/lib/dataContract/DataContractStoreRepository.js deleted file mode 100644 index 0b8c33925d5..00000000000 --- a/packages/js-drive/lib/dataContract/DataContractStoreRepository.js +++ /dev/null @@ -1,181 +0,0 @@ -const { createHash } = require('crypto'); - -const PreCalculatedOperation = require('@dashevo/dpp/lib/stateTransition/fee/operations/PreCalculatedOperation'); -const StorageResult = require('../storage/StorageResult'); - -class DataContractStoreRepository { - /** - * - * @param {GroveDBStore} groveDBStore - * @param {decodeProtocolEntity} decodeProtocolEntity - * @param {BaseLogger} [logger] - */ - constructor(groveDBStore, decodeProtocolEntity, logger = undefined) { - this.storage = groveDBStore; - this.decodeProtocolEntity = decodeProtocolEntity; - this.logger = logger; - } - - /** - * Create Data Contract in database - * - * @param {DataContract} dataContract - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async create(dataContract, blockInfo, options = {}) { - try { - const feeResult = await this.storage.getDrive().createContract( - dataContract, - blockInfo.toObject(), - Boolean(options.useTransaction), - Boolean(options.dryRun), - ); - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } finally { - if (this.logger) { - this.logger.trace({ - dataContract: dataContract.toBuffer().toString('hex'), - dataContractHash: createHash('sha256') - .update( - dataContract.toBuffer(), - ).digest('hex'), - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'createContract'); - } - } - } - - /** - * Update Data Contract in database - * - * @param {DataContract} dataContract - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async update(dataContract, blockInfo, options = {}) { - try { - const feeResult = await this.storage.getDrive().updateContract( - dataContract, - blockInfo.toObject(), - Boolean(options.useTransaction), - Boolean(options.dryRun), - ); - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } finally { - if (this.logger) { - this.logger.trace({ - dataContract: dataContract.toBuffer().toString('hex'), - dataContractHash: createHash('sha256') - .update( - dataContract.toBuffer(), - ).digest('hex'), - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'updateContract'); - } - } - } - - /** - * Fetch Data Contract by ID from database - * - * @param {Identifier} id - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * @param {BlockInfo} [options.blockInfo] - * - * @return {Promise>} - */ - async fetch(id, options = {}) { - if (options.dryRun) { - return new StorageResult( - null, - [], - ); - } - - const [dataContract, feeResult] = await this.storage.getDrive().fetchContract( - id, - options && options.blockInfo ? options.blockInfo.epoch : undefined, - Boolean(options.useTransaction), - ); - - const operations = []; - if (feeResult) { - operations.push(new PreCalculatedOperation(feeResult)); - } - - return new StorageResult( - dataContract, - operations, - ); - } - - /** - * Prove Data Contract by ID from database - * - * @param {Identifier} id - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @return {Promise>} - * */ - async prove(id, options) { - return this.proveMany([id], options); - } - - /** - * Prove Data Contract by IDs from database - * - * @param {Identifier[]} ids - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @return {Promise>} - * */ - async proveMany(ids, options) { - const items = ids.map((id) => ({ - type: 'key', - key: id.toBuffer(), - })); - - return this.storage.proveQuery({ - path: DataContractStoreRepository.TREE_PATH, - query: { - query: { - items, - subqueryPath: [ - DataContractStoreRepository.DATA_CONTRACT_KEY, - ], - }, - }, - }, options); - } -} - -DataContractStoreRepository.TREE_PATH = [Buffer.from([64])]; -DataContractStoreRepository.DATA_CONTRACT_KEY = Buffer.from([0]); -DataContractStoreRepository.DOCUMENTS_TREE_KEY = Buffer.from([0]); - -module.exports = DataContractStoreRepository; diff --git a/packages/js-drive/lib/document/DocumentRepository.js b/packages/js-drive/lib/document/DocumentRepository.js deleted file mode 100644 index 0e2c7fa6183..00000000000 --- a/packages/js-drive/lib/document/DocumentRepository.js +++ /dev/null @@ -1,330 +0,0 @@ -const { createHash } = require('crypto'); - -const lodashCloneDeep = require('lodash/cloneDeep'); - -const PreCalculatedOperation = require('@dashevo/dpp/lib/stateTransition/fee/operations/PreCalculatedOperation'); -const DummyFeeResult = require('@dashevo/dpp/lib/stateTransition/fee/DummyFeeResult'); -const InvalidQueryError = require('./errors/InvalidQueryError'); -const StorageResult = require('../storage/StorageResult'); -const DataContractStoreRepository = require('../dataContract/DataContractStoreRepository'); - -class DocumentRepository { - /** - * - * @param {GroveDBStore} groveDBStore - * @param {BaseLogger} [logger] - */ - constructor( - groveDBStore, - logger = undefined, - ) { - this.storage = groveDBStore; - this.logger = logger; - } - - /** - * Create document - * - * @param {Document} document - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async create(document, blockInfo, options = {}) { - let feeResult; - - try { - (feeResult = await this.storage.getDrive() - .createDocument( - document, - blockInfo, - Boolean(options.useTransaction), - Boolean(options.dryRun), - )); - } finally { - if (this.logger) { - this.logger.info({ - document: document.toBuffer().toString('hex'), - documentHash: createHash('sha256') - .update( - document.toBuffer(), - ).digest('hex'), - useTransaction: Boolean(options.useTransaction), - dryRun: Boolean(options.dryRun), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'createDocument'); - } - } - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } - - /** - * Update document - * - * @param {Document} document - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async update(document, blockInfo, options = {}) { - let feeResult; - - try { - (feeResult = await this.storage.getDrive() - .updateDocument( - document, - blockInfo, - Boolean(options.useTransaction), - Boolean(options.dryRun), - )); - } finally { - if (this.logger) { - this.logger.info({ - document: document.toBuffer().toString('hex'), - documentHash: createHash('sha256') - .update( - document.toBuffer(), - ).digest('hex'), - useTransaction: Boolean(options.useTransaction), - dryRun: Boolean(options.dryRun), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'updateDocument'); - } - } - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } - - /** - * Find documents with query - * - * @param {DataContract} dataContract - * @param {string} documentType - * @param {Object} [options] - * @param {Array} [options.where] - * @param {number} [options.limit] - * @param {Buffer} [options.startAt] - * @param {Buffer} [options.startAfter] - * @param {Array} [options.orderBy] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * @param {BlockInfo} [options.blockInfo] - * - * @throws InvalidQueryError - * - * @returns {Promise>} - */ - async find(dataContract, documentType, options = {}) { - const query = lodashCloneDeep(options); - let useTransaction = false; - - if (typeof query === 'object' && !Array.isArray(query) && query !== null) { - ({ useTransaction } = query); - delete query.useTransaction; - delete query.dryRun; - delete query.blockInfo; - - // Remove undefined options before we pass them to RS Drive - Object.keys(query) - .forEach((queryOption) => { - if (query[queryOption] === undefined) { - // eslint-disable-next-line no-param-reassign - delete query[queryOption]; - } - }); - } - - try { - let epochIndex; - - if (options && options.blockInfo) { - epochIndex = options.blockInfo.epoch; - } - - const [documents, processingCost] = await this.storage.getDrive() - .queryDocuments( - dataContract, - documentType, - epochIndex, - query, - useTransaction, - ); - - return new StorageResult( - documents, - [ - new PreCalculatedOperation(new DummyFeeResult(0, processingCost, [])), - ], - ); - } catch (e) { - if (e.message.startsWith('query: ')) { - throw new InvalidQueryError(e.message.substring(7, e.message.length)); - } - - if (e.message.startsWith('structure: ')) { - throw new InvalidQueryError(e.message.substring(11, e.message.length)); - } - - if (e.message.startsWith('contract: ')) { - throw new InvalidQueryError(e.message.substring(10, e.message.length)); - } - - if (e.message.startsWith('protocol: ')) { - throw new InvalidQueryError(e.message.substring(10, e.message.length)); - } - - throw e; - } - } - - /** - * @param {DataContract} dataContract - * @param {string} documentType - * @param {Identifier} id - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * @return {Promise>} - */ - async delete(dataContract, documentType, id, blockInfo, options = { }) { - try { - const feeResult = await this.storage.getDrive() - .deleteDocument( - dataContract.getId(), - documentType, - id, - blockInfo, - Boolean(options.useTransaction), - Boolean(options.dryRun), - ); - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } finally { - if (this.logger) { - this.logger.info({ - dataContractId: dataContract.getId().toString(), - documentType, - id: id.toString(), - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'deleteDocument'); - } - } - } - - /** - * @param {DataContract} dataContract - * @param {string} documentType - * @param {Object} options - * @param {boolean} [options.useTransaction=false] - * @return {Promise} - */ - async prove(dataContract, documentType, options = {}) { - const query = lodashCloneDeep(options); - let useTransaction = false; - - if (typeof query === 'object' && !Array.isArray(query) && query !== null) { - ({ useTransaction } = query); - delete query.useTransaction; - delete query.dryRun; - - // Remove undefined options before we pass them to RS Drive - Object.keys(query) - .forEach((queryOption) => { - if (query[queryOption] === undefined) { - // eslint-disable-next-line no-param-reassign - delete query[queryOption]; - } - }); - } - - try { - const [prove, processingCost] = await this.storage.getDrive() - .proveDocumentsQuery( - dataContract, - documentType, - query, - useTransaction, - ); - - return new StorageResult( - prove, - [ - new PreCalculatedOperation(new DummyFeeResult(0, processingCost, [])), - ], - ); - } catch (e) { - if (e.message.startsWith('query: ')) { - throw new InvalidQueryError(e.message.substring(7, e.message.length)); - } - - if (e.message.startsWith('structure: ')) { - throw new InvalidQueryError(e.message.substring(11, e.message.length)); - } - - if (e.message.startsWith('contract: ')) { - throw new InvalidQueryError(e.message.substring(10, e.message.length)); - } - - throw e; - } - } - - /** - * Prove documents from different contracts - * - * @param {{ dataContractId: Buffer, documentId: Buffer, type: string }[]} documents - * @return {Promise>} - */ - async proveManyDocumentsFromDifferentContracts(documents) { - const queries = documents.map(({ dataContractId, documentId, type }) => { - const dataContractsDocumentsPath = [ - dataContractId, - Buffer.from([1]), - Buffer.from(type), - Buffer.from([0]), - ]; - - return { - path: DataContractStoreRepository.TREE_PATH.concat(dataContractsDocumentsPath), - query: { - query: { - items: [ - { - type: 'key', - key: documentId, - }, - ], - }, - }, - }; - }); - - return this.storage.proveQueryMany(queries); - } -} - -module.exports = DocumentRepository; diff --git a/packages/js-drive/lib/document/errors/InvalidQueryError.js b/packages/js-drive/lib/document/errors/InvalidQueryError.js deleted file mode 100644 index 899eae1a1f6..00000000000 --- a/packages/js-drive/lib/document/errors/InvalidQueryError.js +++ /dev/null @@ -1,7 +0,0 @@ -const DriveError = require('../../errors/DriveError'); - -class InvalidQueryError extends DriveError { - -} - -module.exports = InvalidQueryError; diff --git a/packages/js-drive/lib/document/fetchDataContractFactory.js b/packages/js-drive/lib/document/fetchDataContractFactory.js deleted file mode 100644 index b81b04deeee..00000000000 --- a/packages/js-drive/lib/document/fetchDataContractFactory.js +++ /dev/null @@ -1,44 +0,0 @@ -const IdentifierError = require('@dashevo/dpp/lib/identifier/errors/IdentifierError'); -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); - -const InvalidQueryError = require('./errors/InvalidQueryError'); - -/** - * @param {DataContractStoreRepository} dataContractRepository - * @returns {fetchDocuments} - */ -function fetchDataContractFactory( - dataContractRepository, -) { - /** - * Fetch Data Contract by Contract ID and type - * - * @typedef {Promise} fetchDataContract - * @param {Buffer|Identifier} contractId - * @returns {Promise>} - */ - async function fetchDataContract(contractId) { - let contractIdIdentifier; - try { - contractIdIdentifier = new Identifier(contractId); - } catch (e) { - if (e instanceof IdentifierError) { - throw new InvalidQueryError(`invalid data contract ID: ${e.message}`); - } - - throw e; - } - - const dataContractResult = await dataContractRepository.fetch(contractIdIdentifier); - - if (dataContractResult.isNull()) { - throw new InvalidQueryError(`data contract ${contractIdIdentifier} not found`); - } - - return dataContractResult; - } - - return fetchDataContract; -} - -module.exports = fetchDataContractFactory; diff --git a/packages/js-drive/lib/document/fetchDocumentsFactory.js b/packages/js-drive/lib/document/fetchDocumentsFactory.js deleted file mode 100644 index 31f4cda35d3..00000000000 --- a/packages/js-drive/lib/document/fetchDocumentsFactory.js +++ /dev/null @@ -1,46 +0,0 @@ -const InvalidQueryError = require('./errors/InvalidQueryError'); - -/** - * @param {DocumentRepository} documentRepository - * @param {fetchDataContract} fetchDataContract - * @returns {fetchDocuments} - */ -function fetchDocumentsFactory( - documentRepository, - fetchDataContract, -) { - /** - * Fetch original Documents by Contract ID and type - * - * @typedef {Promise} fetchDocuments - * @param {Buffer|Identifier} dataContractId - * @param {string} type - * @param {Object} [options] options - * @param {boolean} [options.useTransaction=false] - * @returns {Promise} - */ - async function fetchDocuments(dataContractId, type, options) { - const dataContractResult = await fetchDataContract(dataContractId); - - const dataContract = dataContractResult.getValue(); - const operations = dataContractResult.getOperations(); - - if (!dataContract.isDocumentDefined(type)) { - throw new InvalidQueryError(`document type ${type} is not defined in the data contract`); - } - - const result = await documentRepository.find( - dataContract, - type, - options, - ); - - result.addOperation(...operations); - - return result; - } - - return fetchDocuments; -} - -module.exports = fetchDocumentsFactory; diff --git a/packages/js-drive/lib/document/groveDB/createDocumentTreePath.js b/packages/js-drive/lib/document/groveDB/createDocumentTreePath.js deleted file mode 100644 index b2dc1625d57..00000000000 --- a/packages/js-drive/lib/document/groveDB/createDocumentTreePath.js +++ /dev/null @@ -1,15 +0,0 @@ -const DataContractStoreRepository = require('../../dataContract/DataContractStoreRepository'); -/** - * @param {DataContract} dataContract - * @param {string} documentType - * @return {Buffer[]} - */ -function createDocumentTypeTreePath(dataContract, documentType) { - return DataContractStoreRepository.TREE_PATH.concat([ - dataContract.getId().toBuffer(), - Buffer.from([1]), - Buffer.from(documentType), - ]); -} - -module.exports = createDocumentTypeTreePath; diff --git a/packages/js-drive/lib/document/proveDocumentsFactory.js b/packages/js-drive/lib/document/proveDocumentsFactory.js deleted file mode 100644 index 3da870652a0..00000000000 --- a/packages/js-drive/lib/document/proveDocumentsFactory.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @param {DocumentRepository} documentRepository - * @param {fetchDataContract} fetchDataContract - * @returns {fetchDocuments} - */ -function proveDocumentsFactory( - documentRepository, - fetchDataContract, -) { - /** - * - * @typedef {Promise} proveDocuments - * @param {Buffer|Identifier} dataContractId - * @param {string} type - * @param {Object} [options] options - * @param {boolean} [options.useTransaction=false] - * @returns {Promise} - */ - async function proveDocuments(dataContractId, type, options) { - const dataContractResult = await fetchDataContract(dataContractId); - - const dataContract = dataContractResult.getValue(); - const operations = dataContractResult.getOperations(); - - const result = await documentRepository.prove( - dataContract, - type, - options, - ); - - result.addOperation(...operations); - - return result; - } - - return proveDocuments; -} - -module.exports = proveDocumentsFactory; diff --git a/packages/js-drive/lib/dpp/CachedStateRepositoryDecorator.js b/packages/js-drive/lib/dpp/CachedStateRepositoryDecorator.js deleted file mode 100644 index 7313dcbb84a..00000000000 --- a/packages/js-drive/lib/dpp/CachedStateRepositoryDecorator.js +++ /dev/null @@ -1,344 +0,0 @@ -/** - * @implements StateRepository - */ -class CachedStateRepositoryDecorator { - /** - * @param {DriveStateRepository} stateRepository - */ - constructor( - stateRepository, - ) { - this.stateRepository = stateRepository; - } - - /** - * Fetch Identity by ID - * - * @param {Identifier} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async fetchIdentity(id, executionContext = undefined) { - return this.stateRepository.fetchIdentity(id, executionContext); - } - - /** - * Create identity - * - * @param {Identity} identity - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async createIdentity(identity, executionContext = undefined) { - return this.stateRepository.createIdentity(identity, executionContext); - } - - /** - * Add keys to identity - * - * @param {Identifier} identityId - * @param {IdentityPublicKey[]} keys - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async addKeysToIdentity(identityId, keys, executionContext = undefined) { - return this.stateRepository.addKeysToIdentity(identityId, keys, executionContext); - } - - /** - * Fetch identity balance - * - * @param {Identifier} identityId - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async fetchIdentityBalance(identityId, executionContext = undefined) { - return this.stateRepository.fetchIdentityBalance( - identityId, - executionContext, - ); - } - - /** - * Fetch identity balance with debt - * - * @param {Identifier} identityId - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - Balance can be negative in case of debt - */ - async fetchIdentityBalanceWithDebt(identityId, executionContext = undefined) { - return this.stateRepository.fetchIdentityBalanceWithDebt( - identityId, - executionContext, - ); - } - - /** - * Add to identity balance - * - * @param {Identifier} identityId - * @param {number} amount - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async addToIdentityBalance(identityId, amount, executionContext = undefined) { - return this.stateRepository.addToIdentityBalance( - identityId, - amount, - executionContext, - ); - } - - /** - * Add to system credits - * - * @param {number} amount - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async addToSystemCredits(amount, executionContext = undefined) { - return this.stateRepository.addToSystemCredits( - amount, - executionContext, - ); - } - - /** - * Disable identity keys - * - * @param {Identifier} identityId - * @param {number[]} keyIds - * @param {number} disableAt - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async disableIdentityKeys(identityId, keyIds, disableAt, executionContext = undefined) { - return this.stateRepository.disableIdentityKeys( - identityId, - keyIds, - disableAt, - executionContext, - ); - } - - /** - * Update identity revision - * - * @param {Identifier} identityId - * @param {number} revision - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async updateIdentityRevision(identityId, revision, executionContext = undefined) { - return this.stateRepository.updateIdentityRevision(identityId, revision, executionContext); - } - - /** - * Store spent asset lock transaction - * - * @param {Buffer} outPointBuffer - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async markAssetLockTransactionOutPointAsUsed(outPointBuffer, executionContext = undefined) { - return this.stateRepository.markAssetLockTransactionOutPointAsUsed( - outPointBuffer, - executionContext, - ); - } - - /** - * Check if spent asset lock transaction is stored - * - * @param {Buffer} outPointBuffer - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async isAssetLockTransactionOutPointAlreadyUsed(outPointBuffer, executionContext = undefined) { - return this.stateRepository.isAssetLockTransactionOutPointAlreadyUsed( - outPointBuffer, - executionContext, - ); - } - - /** - * Fetch Data Contract by ID - * - * @param {Identifier} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async fetchDataContract(id, executionContext = undefined) { - return this.stateRepository.fetchDataContract( - id, - executionContext, - ); - } - - /** - * Create Data Contract - * - * @param {DataContract} dataContract - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async createDataContract(dataContract, executionContext = undefined) { - return this.stateRepository.createDataContract(dataContract, executionContext); - } - - /** - * Update Data Contract - * - * @param {DataContract} dataContract - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async updateDataContract(dataContract, executionContext = undefined) { - return this.stateRepository.updateDataContract(dataContract, executionContext); - } - - /** - * Fetch Documents by contract ID and type - * - * @param {Identifier} contractId - * @param {string} type - * @param {{ where: Object }} [options] - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async fetchDocuments(contractId, type, options = {}, executionContext = undefined) { - return this.stateRepository.fetchDocuments(contractId, type, options, executionContext); - } - - /** - * Create document - * - * @param {Document} document - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async createDocument(document, executionContext = undefined) { - return this.stateRepository.createDocument(document, executionContext); - } - - /** - * Update document - * - * @param {Document} document - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async updateDocument(document, executionContext = undefined) { - return this.stateRepository.updateDocument(document, executionContext); - } - - /** - * Remove document - * - * @param {DataContract} dataContract - * @param {string} type - * @param {Identifier} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async removeDocument(dataContract, type, id, executionContext = undefined) { - return this.stateRepository.removeDocument(dataContract, type, id, executionContext); - } - - /** - * Fetch transaction by ID - * - * @param {string} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async fetchTransaction(id, executionContext = undefined) { - return this.stateRepository.fetchTransaction(id, executionContext); - } - - /** - * Fetch the latest platform block height - * - * @return {Promise} - */ - async fetchLatestPlatformBlockHeight() { - return this.stateRepository.fetchLatestPlatformBlockHeight(); - } - - /** - * Fetch the latest platform core chainlocked height - * - * @return {Promise} - */ - async fetchLatestPlatformCoreChainLockedHeight() { - return this.stateRepository.fetchLatestPlatformCoreChainLockedHeight(); - } - - /** - * Verify instant lock - * - * @param {InstantLock} instantLock - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async verifyInstantLock(instantLock, executionContext = undefined) { - return this.stateRepository.verifyInstantLock(instantLock, executionContext); - } - - /** - * Fetch Simplified Masternode List Store - * - * @return {Promise} - */ - async fetchSMLStore() { - return this.stateRepository.fetchSMLStore(); - } - - /** - * Fetch the latest withdrawal transaction index - * - * @returns {Promise} - */ - async fetchLatestWithdrawalTransactionIndex() { - return this.stateRepository.fetchLatestWithdrawalTransactionIndex(); - } - - /** - * Enqueue withdrawal transaction bytes into the queue - * - * @param {number} index - * @param {Buffer} transactionBytes - * - * @returns {Promise} - */ - async enqueueWithdrawalTransaction(index, transactionBytes) { - return this.stateRepository.enqueueWithdrawalTransaction( - index, - transactionBytes, - ); - } - - /** - * Returns block time - * - * @returns {Promise} - */ - async fetchLatestPlatformBlockTime() { - return this.stateRepository.fetchLatestPlatformBlockTime(); - } -} - -module.exports = CachedStateRepositoryDecorator; diff --git a/packages/js-drive/lib/dpp/DriveStateRepository.js b/packages/js-drive/lib/dpp/DriveStateRepository.js deleted file mode 100644 index 173c9f92efa..00000000000 --- a/packages/js-drive/lib/dpp/DriveStateRepository.js +++ /dev/null @@ -1,660 +0,0 @@ -const { TYPES } = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); - -const ReadOperation = require('@dashevo/dpp/lib/stateTransition/fee/operations/ReadOperation'); -const SignatureVerificationOperation = require('@dashevo/dpp/lib/stateTransition/fee/operations/SignatureVerificationOperation'); -const BlockInfo = require('../blockExecution/BlockInfo'); - -/** - * @implements StateRepository - */ -class DriveStateRepository { - #options = {}; - - /** - * @param {IdentityStoreRepository} identityRepository - * @param {IdentityBalanceStoreRepository} identityBalanceRepository - * @param {IdentityPublicKeyStoreRepository} publicKeyToToIdentitiesRepository - * @param {DataContractStoreRepository} dataContractRepository - * @param {fetchDocuments} fetchDocuments - * @param {DocumentRepository} documentRepository - * @param {SpentAssetLockTransactionsRepository} spentAssetLockTransactionsRepository - * @param {RpcClient} coreRpcClient - * @param {BlockExecutionContext} blockExecutionContext - * @param {SimplifiedMasternodeList} simplifiedMasternodeList - * @param {Drive} rsDrive - * @param {Object} [options] - * @param {Object} [options.useTransaction=false] - */ - constructor( - identityRepository, - identityBalanceRepository, - publicKeyToToIdentitiesRepository, - dataContractRepository, - fetchDocuments, - documentRepository, - spentAssetLockTransactionsRepository, - coreRpcClient, - blockExecutionContext, - simplifiedMasternodeList, - rsDrive, - options = {}, - ) { - this.identityRepository = identityRepository; - this.identityBalanceRepository = identityBalanceRepository; - this.identityPublicKeyRepository = publicKeyToToIdentitiesRepository; - this.dataContractRepository = dataContractRepository; - this.fetchDocumentsFunction = fetchDocuments; - this.documentRepository = documentRepository; - this.spentAssetLockTransactionsRepository = spentAssetLockTransactionsRepository; - this.coreRpcClient = coreRpcClient; - this.blockExecutionContext = blockExecutionContext; - this.simplifiedMasternodeList = simplifiedMasternodeList; - this.rsDrive = rsDrive; - this.#options = options; - } - - /** - * Fetch Identity by ID - * - * @param {Identifier} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async fetchIdentity(id, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.identityRepository.fetch( - id, - { - blockInfo, - ...this.#createRepositoryOptions(executionContext), - }, - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - - return result.getValue(); - } - - /** - * Create identity - * - * @param {Identity} identity - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async createIdentity(identity, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.identityRepository.create( - identity, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Add keys to identity - * - * @param {Identifier} identityId - * @param {IdentityPublicKey[]} keys - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async addKeysToIdentity(identityId, keys, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.identityPublicKeyRepository.add( - identityId, - keys, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Fetch identity balance - * - * @param {Identifier} identityId - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async fetchIdentityBalance(identityId, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.identityBalanceRepository.fetch( - identityId, - { - blockInfo, - ...this.#createRepositoryOptions(executionContext), - }, - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - - return result.getValue(); - } - - /** - * Fetch identity balance with debt - * - * @param {Identifier} identityId - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - Balance can be negative in case of debt - */ - async fetchIdentityBalanceWithDebt(identityId, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.identityBalanceRepository.fetchWithDebt( - identityId, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - - return result.getValue(); - } - - /** - * Add to identity balance - * - * @param {Identifier} identityId - * @param {number} amount - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async addToIdentityBalance(identityId, amount, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.identityBalanceRepository.add( - identityId, - amount, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Add to system credits - * - * @param {number} amount - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async addToSystemCredits(amount, executionContext = undefined) { - if (executionContext.isDryRun()) { - return; - } - - await this.rsDrive.addToSystemCredits( - amount, - this.#options.useTransaction || false, - ); - } - - /** - * Disable identity keys - * - * @param {Identifier} identityId - * @param {number[]} keyIds - * @param {number} disableAt - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async disableIdentityKeys(identityId, keyIds, disableAt, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.identityPublicKeyRepository.disable( - identityId, - keyIds, - disableAt, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Update identity revision - * - * @param {Identifier} identityId - * @param {number} revision - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async updateIdentityRevision(identityId, revision, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.identityRepository.updateRevision( - identityId, - revision, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Store spent asset lock transaction - * - * @param {Buffer} outPointBuffer - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async markAssetLockTransactionOutPointAsUsed(outPointBuffer, executionContext = undefined) { - const result = await this.spentAssetLockTransactionsRepository.store( - outPointBuffer, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Check if spent asset lock transaction is stored - * - * @param {Buffer} outPointBuffer - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async isAssetLockTransactionOutPointAlreadyUsed(outPointBuffer, executionContext = undefined) { - const result = await this.spentAssetLockTransactionsRepository.fetch( - outPointBuffer, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - - return !result.isNull(); - } - - /** - * Fetch Data Contract by ID - * - * @param {Identifier} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async fetchDataContract(id, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.dataContractRepository.fetch( - id, - { - ...this.#createRepositoryOptions(executionContext), - // This method doesn't implement dry run because we need a contract - // to proceed dry run validation and collect further operations - dryRun: false, - blockInfo, - }, - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - - return result.getValue(); - } - - /** - * Create Data Contract - * - * @param {DataContract} dataContract - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async createDataContract(dataContract, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.dataContractRepository.create( - dataContract, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Update Data Contract - * - * @param {DataContract} dataContract - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async updateDataContract(dataContract, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.dataContractRepository.update( - dataContract, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Fetch Documents by contract ID and type - * - * @param {Identifier} contractId - * @param {string} type - * @param {{ where: Object }} [options] - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async fetchDocuments(contractId, type, options = {}, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.fetchDocumentsFunction( - contractId, - type, - { - blockInfo, - ...options, - ...this.#createRepositoryOptions(executionContext), - }, - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - - return result.getValue(); - } - - /** - * Create document - * - * @param {Document} document - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async createDocument(document, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.documentRepository.create( - document, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Update document - * - * @param {Document} document - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async updateDocument(document, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.documentRepository.update( - document, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Remove document - * - * @param {DataContract} dataContract - * @param {string} type - * @param {Identifier} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async removeDocument(dataContract, type, id, executionContext = undefined) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - const result = await this.documentRepository.delete( - dataContract, - type, - id, - blockInfo, - this.#createRepositoryOptions(executionContext), - ); - - if (executionContext) { - executionContext.addOperation(...result.getOperations()); - } - } - - /** - * Fetch Core transaction by ID - * - * @param {string} id - Transaction ID hex - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async fetchTransaction(id, executionContext = undefined) { - if (executionContext && executionContext.isDryRun()) { - executionContext.addOperation( - // TODO: Revisit this value - new ReadOperation(512), - ); - - return { - data: Buffer.alloc(0), - height: 1, - }; - } - - try { - const { result: transaction } = await this.coreRpcClient.getRawTransaction(id, 1); - - const data = Buffer.from(transaction.hex, 'hex'); - - if (executionContext) { - executionContext.addOperation( - new ReadOperation(data.length), - ); - } - - return { - data, - height: transaction.height, - }; - } catch (e) { - // Invalid address or key error - if (e.code === -5) { - return null; - } - - throw e; - } - } - - /** - * Fetch the latest platform block height - * - * @return {Promise} - */ - async fetchLatestPlatformBlockHeight() { - return this.blockExecutionContext.getHeight(); - } - - /** - * Fetch the latest platform block time - * - * @return {Promise} - */ - async fetchLatestPlatformBlockTime() { - const timeMs = this.blockExecutionContext.getTimeMs(); - - if (!timeMs) { - throw new Error('Time is not set'); - } - - return timeMs; - } - - /** - * Fetch the latest platform core chainlocked height - * - * @return {Promise} - */ - async fetchLatestPlatformCoreChainLockedHeight() { - return this.blockExecutionContext.getCoreChainLockedHeight(); - } - - /** - * Verify instant lock - * - * @param {InstantLock} instantLock - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - // eslint-disable-next-line no-unused-vars - async verifyInstantLock(instantLock, executionContext = undefined) { - const coreChainLockedHeight = this.blockExecutionContext.getCoreChainLockedHeight(); - - if (coreChainLockedHeight === null) { - return false; - } - - if (executionContext) { - executionContext.addOperation( - new SignatureVerificationOperation(TYPES.ECDSA_SECP256K1), - ); - - if (executionContext.isDryRun()) { - return true; - } - } - - try { - const { result: isVerified } = await this.coreRpcClient.verifyIsLock( - instantLock.getRequestId().toString('hex'), - instantLock.txid, - instantLock.signature, - coreChainLockedHeight, - ); - - return isVerified; - } catch (e) { - // Invalid address or key error or - // Invalid, missing or duplicate parameter - // Parse error - if ([-8, -5, -32700].includes(e.code)) { - return false; - } - - throw e; - } - } - - /** - * Fetch Simplified Masternode List Store - * - * @return {Promise} - */ - async fetchSMLStore() { - return this.simplifiedMasternodeList.getStore(); - } - - /** - * Fetch the latest withdrawal transaction index - * - * @returns {Promise} - */ - async fetchLatestWithdrawalTransactionIndex() { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - return this.rsDrive.fetchLatestWithdrawalTransactionIndex( - blockInfo, - this.#options.useTransaction, - this.#options.dryRun, - ); - } - - /** - * Enqueue withdrawal transaction bytes into the queue - * - * @param {number} index - * @param {Buffer} transactionBytes - * - * @returns {Promise} - */ - async enqueueWithdrawalTransaction(index, transactionBytes) { - const blockInfo = BlockInfo.createFromBlockExecutionContext(this.blockExecutionContext); - - // TODO: handle dry run via passing state transition execution context - return this.rsDrive.enqueueWithdrawalTransaction( - index, - transactionBytes, - blockInfo, - this.#options.useTransaction, - ); - } - - /** - * @private - * @param {StateTransitionExecutionContext} [executionContext] - * @return {{dryRun: boolean, useTransaction: boolean}} - */ - #createRepositoryOptions(executionContext) { - return { - useTransaction: this.#options.useTransaction || false, - dryRun: executionContext ? executionContext.isDryRun() : false, - }; - } -} - -module.exports = DriveStateRepository; diff --git a/packages/js-drive/lib/dpp/LoggedStateRepositoryDecorator.js b/packages/js-drive/lib/dpp/LoggedStateRepositoryDecorator.js deleted file mode 100644 index c75e9b9e00b..00000000000 --- a/packages/js-drive/lib/dpp/LoggedStateRepositoryDecorator.js +++ /dev/null @@ -1,676 +0,0 @@ -/** - * @implements StateRepository - */ -class LoggedStateRepositoryDecorator { - /** - * @param {DriveStateRepository|CachedStateRepositoryDecorator} stateRepository - * @param {BlockExecutionContext} blockExecutionContext - */ - constructor( - stateRepository, - blockExecutionContext, - ) { - this.stateRepository = stateRepository; - this.blockExecutionContext = blockExecutionContext; - } - - /** - * @private - * @param {string} method - state repository method name - * @param {object} parameters - parameters of the state repository call - * @param {object} response - response of the state repository call - */ - log(method, parameters, response) { - const logger = this.blockExecutionContext.getContextLogger(); - - logger.trace({ - stateRepository: { - method, - parameters, - response, - }, - }, `StateRepository#${method}`); - } - - /** - * Fetch Identity by ID - * - * @param {Identifier} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async fetchIdentity(id, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.fetchIdentity(id, executionContext); - } finally { - this.log( - 'fetchIdentity', - { - id, - }, - response, - ); - } - - return response; - } - - /** - * Create identity - * - * @param {Identity} identity - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async createIdentity(identity, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.createIdentity(identity, executionContext); - } finally { - this.log( - 'createIdentity', - { - identity, - }, - response, - ); - } - - return response; - } - - /** - * Add keys to identity - * - * @param {Identifier} identityId - * @param {IdentityPublicKey[]} keys - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async addKeysToIdentity(identityId, keys, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.addKeysToIdentity(identityId, keys, executionContext); - } finally { - this.log( - 'addKeysToIdentity', - { - identityId, - keys, - }, - response, - ); - } - - return response; - } - - /** - * Fetch identity balance - * - * @param {Identifier} identityId - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async fetchIdentityBalance(identityId, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.fetchIdentityBalance( - identityId, - executionContext, - ); - } finally { - this.log( - 'fetchIdentityBalance', - { - identityId, - }, - response, - ); - } - - return response; - } - - /** - * Fetch identity balance with debt - * - * @param {Identifier} identityId - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - Balance can be negative in case of debt - */ - async fetchIdentityBalanceWithDebt(identityId, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.fetchIdentityBalanceWithDebt( - identityId, - executionContext, - ); - } finally { - this.log( - 'fetchIdentityBalanceWithDebt', - { - identityId, - }, - response, - ); - } - - return response; - } - - /** - * Add to identity balance - * - * @param {Identifier} identityId - * @param {number} amount - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async addToIdentityBalance(identityId, amount, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.addToIdentityBalance( - identityId, - amount, - executionContext, - ); - } finally { - this.log( - 'addToIdentityBalance', - { - identityId, - amount, - }, - response, - ); - } - - return response; - } - - /** - * Add to system credits - * - * @param {number} amount - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async addToSystemCredits(amount, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.addToSystemCredits( - amount, - executionContext, - ); - } finally { - this.log( - 'addToSystemCredits', - { - amount, - }, - response, - ); - } - - return response; - } - - /** - * Disable identity keys - * - * @param {Identifier} identityId - * @param {number[]} keyIds - * @param {number} disableAt - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async disableIdentityKeys(identityId, keyIds, disableAt, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.disableIdentityKeys( - identityId, - keyIds, - disableAt, - executionContext, - ); - } finally { - this.log( - 'disableIdentityKeys', - { - identityId, - keyIds, - disableAt, - }, - response, - ); - } - - return response; - } - - /** - * Update identity revision - * - * @param {Identifier} identityId - * @param {number} revision - * @param {StateTransitionExecutionContext} [executionContext] - * @returns {Promise} - */ - async updateIdentityRevision(identityId, revision, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.updateIdentityRevision( - identityId, - revision, - executionContext, - ); - } finally { - this.log( - 'updateIdentityRevision', - { - identityId, - revision, - }, - response, - ); - } - - return response; - } - - /** - * Store spent asset lock transaction - * - * @param {Buffer} outPointBuffer - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async markAssetLockTransactionOutPointAsUsed(outPointBuffer, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.markAssetLockTransactionOutPointAsUsed( - outPointBuffer, - executionContext, - ); - } finally { - this.log( - 'markAssetLockTransactionOutPointAsUsed', - { - outPointBuffer: outPointBuffer.toString('base64'), - }, - response, - ); - } - - return response; - } - - /** - * Check if spent asset lock transaction is stored - * - * @param {Buffer} outPointBuffer - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async isAssetLockTransactionOutPointAlreadyUsed(outPointBuffer, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.isAssetLockTransactionOutPointAlreadyUsed( - outPointBuffer, - executionContext, - ); - } finally { - this.log( - 'isAssetLockTransactionOutPointAlreadyUsed', - { - outPointBuffer: outPointBuffer.toString('base64'), - }, - response, - ); - } - - return response; - } - - /** - * Fetch Data Contract by ID - * - * @param {Identifier} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async fetchDataContract(id, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.fetchDataContract(id, executionContext); - } finally { - this.log( - 'fetchDataContract', - { - id, - }, - response, - ); - } - - return response; - } - - /** - * Store Data Contract - * - * @param {DataContract} dataContract - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async createDataContract(dataContract, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.createDataContract(dataContract, executionContext); - } finally { - this.log('createDataContract', { dataContract }, response); - } - - return response; - } - - /** - * Store Data Contract - * - * @param {DataContract} dataContract - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async updateDataContract(dataContract, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.updateDataContract(dataContract, executionContext); - } finally { - this.log('updateDataContract', { dataContract }, response); - } - - return response; - } - - /** - * Fetch Documents by contract ID and type - * - * @param {Identifier} contractId - * @param {string} type - * @param {{ where: Object }} [options] - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async fetchDocuments(contractId, type, options = {}, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.fetchDocuments( - contractId, - type, - options, - executionContext, - ); - } finally { - this.log( - 'fetchDocuments', - { - contractId, - type, - options, - }, - response, - ); - } - - return response; - } - - /** - * Create document - * - * @param {Document} document - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async createDocument(document, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.createDocument(document, executionContext); - } finally { - this.log( - 'createDocument', - { - document, - }, - response, - ); - } - - return response; - } - - /** - * Update document - * - * @param {Document} document - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async updateDocument(document, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.updateDocument(document, executionContext); - } finally { - this.log( - 'updateDocument', - { - document, - }, - response, - ); - } - - return response; - } - - /** - * Remove document - * - * @param {DataContract} dataContract - * @param {string} type - * @param {Identifier} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async removeDocument(dataContract, type, id, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.removeDocument( - dataContract, - type, - id, - executionContext, - ); - } finally { - this.log( - 'removeDocument', - { - dataContract, - type, - id, - }, - response, - ); - } - - return response; - } - - /** - * Fetch transaction by ID - * - * @param {string} id - * @param {StateTransitionExecutionContext} [executionContext] - * - * @returns {Promise} - */ - async fetchTransaction(id, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.fetchTransaction(id, executionContext); - } finally { - this.log( - 'fetchTransaction', - { - id, - }, - response, - ); - } - - return response; - } - - /** - * Fetch the latest platform block height - * - * @return {Promise} - */ - async fetchLatestPlatformBlockHeight() { - let response; - - try { - response = await this.stateRepository.fetchLatestPlatformBlockHeight(); - } finally { - this.log('fetchLatestPlatformBlockHeight', {}, response); - } - - return response; - } - - /** - * Fetch the latest platform core chainlocked height - * - * @return {Promise} - */ - async fetchLatestPlatformCoreChainLockedHeight() { - let response; - - try { - response = await this.stateRepository.fetchLatestPlatformCoreChainLockedHeight(); - } finally { - this.log('fetchLatestPlatformCoreChainLockedHeight', {}, response); - } - - return response; - } - - /** - * Verify instant lock - * - * @param {InstantLock} instantLock - * @param {StateTransitionExecutionContext} [executionContext] - * - * @return {Promise} - */ - async verifyInstantLock(instantLock, executionContext = undefined) { - let response; - - try { - response = await this.stateRepository.verifyInstantLock(instantLock, executionContext); - } finally { - this.log('verifyInstantLock', { instantLock }, response); - } - - return response; - } - - /** - * Returns block time - * - * @returns {Promise} - */ - async fetchLatestPlatformBlockTime() { - let response; - - try { - response = await this.stateRepository.fetchLatestPlatformBlockTime(); - } finally { - this.log('fetchLatestPlatformBlockTime', { }, response); - } - - return response; - } - - /** - * Fetch the latest withdrawal transaction index - * - * @returns {Promise} - */ - async fetchLatestWithdrawalTransactionIndex() { - let response; - - try { - response = await this.stateRepository.fetchLatestWithdrawalTransactionIndex(); - } finally { - this.log('fetchLatestWithdrawalTransactionIndex', {}, response); - } - - return response; - } - - /** - * Enqueue withdrawal transaction bytes into the queue - * - * @param {number} index - * @param {Buffer} transactionBytes - * - * @returns {Promise} - */ - async enqueueWithdrawalTransaction(index, transactionBytes) { - let response; - - try { - response = await this.stateRepository.enqueueWithdrawalTransaction( - index, - transactionBytes, - ); - } finally { - this.log('enqueueWithdrawalTransaction', { index, transactionBytes }, response); - } - } -} - -module.exports = LoggedStateRepositoryDecorator; diff --git a/packages/js-drive/lib/errorHandlerFactory.js b/packages/js-drive/lib/errorHandlerFactory.js deleted file mode 100644 index 7172646507a..00000000000 --- a/packages/js-drive/lib/errorHandlerFactory.js +++ /dev/null @@ -1,59 +0,0 @@ -const printErrorFace = require('./util/printErrorFace'); - -/** - * @param {BaseLogger} logger - * @param {AwilixContainer} container - * @param {closeAbciServer} closeAbciServer - */ -function errorHandlerFactory(logger, container, closeAbciServer) { - let isCalledAlready = false; - const errors = []; - - /** - * Error handler - * - * @param {Error} error - */ - async function errorHandler(error) { - // Collect all thrown errors - errors.push(error); - - // Gracefully shutdown only once - if (isCalledAlready) { - return; - } - - isCalledAlready = true; - - try { - try { - // Close all ABCI server connections - await closeAbciServer(); - - // Add further code to the end of event loop (the same as process.nextTick) - await Promise.resolve(); - - // eslint-disable-next-line no-console - console.log(printErrorFace()); - - errors.forEach((e) => { - const preferredLogger = e.contextLogger || logger; - delete e.contextLogger; - - preferredLogger.fatal({ err: e }, e.message); - }); - } finally { - await container.dispose(); - } - } catch (e) { - // eslint-disable-next-line no-console - console.error(e); - } finally { - process.exit(1); - } - } - - return errorHandler; -} - -module.exports = errorHandlerFactory; diff --git a/packages/js-drive/lib/errors/DriveError.js b/packages/js-drive/lib/errors/DriveError.js deleted file mode 100644 index ba5dc360532..00000000000 --- a/packages/js-drive/lib/errors/DriveError.js +++ /dev/null @@ -1,23 +0,0 @@ -class DriveError extends Error { - /** - * @param {string} message - */ - constructor(message) { - super(message); - - this.name = this.constructor.name; - - Error.captureStackTrace(this, this.constructor); - } - - /** - * Get message - * - * @return {string} - */ - getMessage() { - return this.message; - } -} - -module.exports = DriveError; diff --git a/packages/js-drive/lib/featureFlag/getFeatureFlagForHeightFactory.js b/packages/js-drive/lib/featureFlag/getFeatureFlagForHeightFactory.js deleted file mode 100644 index c15175c48da..00000000000 --- a/packages/js-drive/lib/featureFlag/getFeatureFlagForHeightFactory.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @param {Identifier} featureFlagsContractId - * @param {fetchDocuments} fetchDocuments - * - * @return {getFeatureFlagForHeight} - */ -function getFeatureFlagForHeightFactory( - featureFlagsContractId, - fetchDocuments, -) { - /** - * @typedef getFeatureFlagForHeight - * - * @param {string} flagType - * @param {Long} blockHeight - * @param {boolean} [useTransaction=false] - * - * @return {Promise} - */ - async function getFeatureFlagForHeight(flagType, blockHeight, useTransaction = false) { - if (!featureFlagsContractId) { - return null; - } - - const query = { - where: [ - ['enableAtHeight', '==', blockHeight.toNumber()], - ], - }; - - const result = await fetchDocuments( - featureFlagsContractId, - flagType, - { - ...query, - useTransaction, - }, - ); - - const [document] = result.getValue(); - - return document; - } - - return getFeatureFlagForHeight; -} - -module.exports = getFeatureFlagForHeightFactory; diff --git a/packages/js-drive/lib/featureFlag/getLatestFeatureFlagFactory.js b/packages/js-drive/lib/featureFlag/getLatestFeatureFlagFactory.js deleted file mode 100644 index 56e1dfcd885..00000000000 --- a/packages/js-drive/lib/featureFlag/getLatestFeatureFlagFactory.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @param {Identifier} featureFlagsContractId - * @param {fetchDocuments} fetchDocuments - * - * @return {getLatestFeatureFlag} - */ -function getLatestFeatureFlagFactory( - featureFlagsContractId, - fetchDocuments, -) { - /** - * @typedef getLatestFeatureFlag - * - * @param {string} flagType - * @param {Long} blockHeight - * @param {boolean} [useTransaction=false] - * - * @return {Promise} - */ - async function getLatestFeatureFlag(flagType, blockHeight, useTransaction = false) { - if (!featureFlagsContractId) { - return null; - } - - const query = { - where: [ - ['enableAtHeight', '<=', blockHeight.toNumber()], - ], - orderBy: [ - ['enableAtHeight', 'desc'], - ], - limit: 1, - }; - - const result = await fetchDocuments( - featureFlagsContractId, - flagType, - { - ...query, - useTransaction, - }, - ); - - const [document] = result.getValue(); - - return document; - } - - return getLatestFeatureFlag; -} - -module.exports = getLatestFeatureFlagFactory; diff --git a/packages/js-drive/lib/identity/IdentityBalanceStoreRepository.js b/packages/js-drive/lib/identity/IdentityBalanceStoreRepository.js deleted file mode 100644 index 7c745a4fb06..00000000000 --- a/packages/js-drive/lib/identity/IdentityBalanceStoreRepository.js +++ /dev/null @@ -1,200 +0,0 @@ -const PreCalculatedOperation = require('@dashevo/dpp/lib/stateTransition/fee/operations/PreCalculatedOperation'); -const StorageResult = require('../storage/StorageResult'); - -class IdentityBalanceStoreRepository { - /** - * - * @param {GroveDBStore} groveDBStore - * @param {decodeProtocolEntity} decodeProtocolEntity - */ - constructor(groveDBStore, decodeProtocolEntity) { - this.storage = groveDBStore; - this.decodeProtocolEntity = decodeProtocolEntity; - } - - /** - * Fetch balance by id from database - * - * @param {Identifier} id - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {BlockInfo} [options.blockInfo] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async fetch(id, options = { }) { - if (options && options.blockInfo) { - const [balance, feeResult] = await this.storage.getDrive().fetchIdentityBalanceWithCosts( - id, - options.blockInfo.toObject(), - Boolean(options.useTransaction), - ); - - return new StorageResult( - balance, - [new PreCalculatedOperation(feeResult)], - ); - } - - const balance = await this.storage.getDrive().fetchIdentityBalance( - id, - Boolean(options.useTransaction), - ); - - return new StorageResult( - balance, - [], - ); - } - - /** - * Fetch identity by id from database - * - * @param {Identifier} id - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async fetchWithDebt(id, blockInfo, options = {}) { - const [ - balance, - feeResult, - ] = await this.storage.getDrive().fetchIdentityBalanceIncludeDebtWithCosts( - id, - blockInfo.toObject(), - Boolean(options.useTransaction), - Boolean(options.dryRun), - ); - - return new StorageResult( - balance, - [new PreCalculatedOperation(feeResult)], - ); - } - - /** - * Add to identity balance in database - * - * @param {Identifier} identityId - * @param {number} amount - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async add(identityId, amount, blockInfo, options = {}) { - try { - const feeResult = await this.storage.getDrive().addToIdentityBalance( - identityId, - amount, - blockInfo.toObject(), - Boolean(options.useTransaction), - Boolean(options.dryRun), - ); - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } finally { - if (this.logger) { - this.logger.trace({ - identity_id: identityId.toString(), - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'add'); - } - } - } - - /** - * Apply fees to identity balance in database - * - * @param {Identifier} identityId - * @param {FeeResult} fees - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * - * @return {Promise>} - */ - async applyFees( - identityId, - fees, - options = {}, - ) { - try { - const feeResult = await this.storage.getDrive().applyFeesToIdentityBalance( - identityId, - fees, - Boolean(options.useTransaction), - ); - - return new StorageResult( - feeResult, - [], - ); - } finally { - if (this.logger) { - this.logger.trace({ - identity_id: identityId.toString(), - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'applyFees'); - } - } - } - - /** - * Remove balance from identity in database - * - * @param {Identifier} identityId - * @param {number} amount - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async remove( - identityId, - amount, - blockInfo, - options = {}, - ) { - try { - const feeResult = await this.storage.getDrive().removeFromIdentityBalance( - identityId, - amount, - blockInfo.toObject(), - Boolean(options.useTransaction), - Boolean(options.dryRun), - ); - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } finally { - if (this.logger) { - this.logger.trace({ - identity_id: identityId.toString(), - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'remove'); - } - } - } -} - -module.exports = IdentityBalanceStoreRepository; diff --git a/packages/js-drive/lib/identity/IdentityPublicKeyStoreRepository.js b/packages/js-drive/lib/identity/IdentityPublicKeyStoreRepository.js deleted file mode 100644 index 52f7131c43d..00000000000 --- a/packages/js-drive/lib/identity/IdentityPublicKeyStoreRepository.js +++ /dev/null @@ -1,109 +0,0 @@ -const PreCalculatedOperation = require('@dashevo/dpp/lib/stateTransition/fee/operations/PreCalculatedOperation'); -const StorageResult = require('../storage/StorageResult'); - -class IdentityPublicKeyStoreRepository { - /** - * - * @param {GroveDBStore} groveDBStore - * @param {decodeProtocolEntity} decodeProtocolEntity - */ - constructor(groveDBStore, decodeProtocolEntity) { - this.storage = groveDBStore; - this.decodeProtocolEntity = decodeProtocolEntity; - } - - /** - * Add keys to an already existing Identity - * - * @param {Identifier} identityId - * @param {IdentityPublicKey[]} keys - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async add( - identityId, - keys, - blockInfo, - options = {}, - ) { - try { - const feeResult = await this.storage.getDrive().addKeysToIdentity( - identityId, - keys, - blockInfo.toObject(), - Boolean(options.useTransaction), - Boolean(options.dryRun), - ); - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } finally { - if (this.logger) { - this.logger.trace({ - identity_id: identityId.toString(), - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'add'); - } - } - } - - /** - * Disable keys in already existing Identity - * - * @param {Identifier} identityId - * @param {number[]} keyIds - * @param {number} disabledAt - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async disable( - identityId, - keyIds, - disabledAt, - blockInfo, - options = {}, - ) { - try { - const feeResult = await this.storage.getDrive().disableIdentityKeys( - identityId, - keyIds, - disabledAt, - blockInfo.toObject(), - Boolean(options.useTransaction), - Boolean(options.dryRun), - ); - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } finally { - if (this.logger) { - this.logger.trace({ - identity_id: identityId.toString(), - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'disable'); - } - } - } -} - -IdentityPublicKeyStoreRepository.TREE_PATH = [Buffer.from([2])]; - -module.exports = IdentityPublicKeyStoreRepository; diff --git a/packages/js-drive/lib/identity/IdentityStoreRepository.js b/packages/js-drive/lib/identity/IdentityStoreRepository.js deleted file mode 100644 index 2bb339ee4e5..00000000000 --- a/packages/js-drive/lib/identity/IdentityStoreRepository.js +++ /dev/null @@ -1,295 +0,0 @@ -const PreCalculatedOperation = require('@dashevo/dpp/lib/stateTransition/fee/operations/PreCalculatedOperation'); -const StorageResult = require('../storage/StorageResult'); - -class IdentityStoreRepository { - /** - * - * @param {GroveDBStore} groveDBStore - * @param {decodeProtocolEntity} decodeProtocolEntity - */ - constructor(groveDBStore, decodeProtocolEntity) { - this.storage = groveDBStore; - this.decodeProtocolEntity = decodeProtocolEntity; - } - - /** - * Fetch identity by id from database - * - * @param {Identifier} id - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {BlockInfo} [options.blockInfo] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async fetch(id, options = { }) { - if (options.dryRun) { - return new StorageResult( - null, - [], - ); - } - - if (options && options.blockInfo) { - const [identity, feeResult] = await this.storage.getDrive().fetchIdentityWithCosts( - id, - options.blockInfo.epoch, - Boolean(options.useTransaction), - ); - - return new StorageResult( - identity, - [new PreCalculatedOperation(feeResult)], - ); - } - - const identity = await this.storage.getDrive().fetchIdentity( - id, - Boolean(options.useTransaction), - ); - - return new StorageResult( - identity, - [], - ); - } - - /** - * Fetch identity by public key hash - * - * @param {Buffer} hash - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * - * @return {Promise>} - */ - async fetchByPublicKeyHash(hash, options = {}) { - try { - const [identity] = await this.storage.getDrive().fetchIdentitiesByPublicKeyHashes( - [hash], - Boolean(options.useTransaction), - ); - - return new StorageResult( - identity, - [], - ); - } finally { - if (this.logger) { - this.logger.trace({ - hash, - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'fetchManyByPublicKeyHashes'); - } - } - } - - /** - * Fetch many identities by public key hashes - * - * @param {Buffer[]} hashes - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * - * @return {Promise>>} - */ - async fetchManyByPublicKeyHashes(hashes, options = {}) { - try { - const identities = await this.storage.getDrive().fetchIdentitiesByPublicKeyHashes( - hashes, - Boolean(options.useTransaction), - ); - - return new StorageResult( - identities, - [], - ); - } finally { - if (this.logger) { - this.logger.trace({ - hashes, - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'fetchManyByPublicKeyHashes'); - } - } - } - - /** - * Prove identities by multiple public key hashes - * - * @param {Buffer[]} hashes - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * - * @return {Promise>} - */ - async proveManyByPublicKeyHashes(hashes, options = {}) { - try { - const proof = await this.storage.getDrive().proveIdentitiesByPublicKeyHashes( - hashes, - Boolean(options.useTransaction), - ); - - return new StorageResult( - proof, - [], - ); - } finally { - if (this.logger) { - this.logger.trace({ - hashes, - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'proveManyByPublicKeyHashes'); - } - } - } - - /** - * Create Identity in database - * - * @param {Identity} identity - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async create(identity, blockInfo, options = {}) { - try { - const feeResult = await this.storage.getDrive().insertIdentity( - identity, - blockInfo.toObject(), - Boolean(options.useTransaction), - Boolean(options.dryRun), - ); - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } finally { - if (this.logger) { - this.logger.trace({ - identity_id: identity.id.toString(), - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'create'); - } - } - } - - /** - * Update identity revision in database - * - * @param {Identifier} identityId - * @param {number} revision - * @param {BlockInfo} blockInfo - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async updateRevision( - identityId, - revision, - blockInfo, - options = {}, - ) { - try { - const feeResult = await this.storage.getDrive().updateIdentityRevision( - identityId, - revision, - blockInfo.toObject(), - Boolean(options.useTransaction), - Boolean(options.dryRun), - ); - - return new StorageResult( - undefined, - [ - new PreCalculatedOperation(feeResult), - ], - ); - } finally { - if (this.logger) { - this.logger.trace({ - identity_id: identityId.toString(), - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'updateRevision'); - } - } - } - - /** - * Prove identity by id - * - * @param {Identifier} id - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * - * @return {Promise>} - * */ - async prove(id, options = {}) { - try { - const proof = await this.storage.getDrive().proveIdentity( - id, - Boolean(options.useTransaction), - ); - - return new StorageResult( - proof, - [], - ); - } finally { - if (this.logger) { - this.logger.trace({ - id, - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'prove'); - } - } - } - - /** - * Prove identity by ids - * - * @param {Identifier[]} ids - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * - * @return {Promise>} - * */ - async proveMany(ids, options = {}) { - try { - const proof = await this.storage.getDrive().proveManyIdentities( - ids, - Boolean(options.useTransaction), - ); - - return new StorageResult( - proof, - [], - ); - } finally { - if (this.logger) { - this.logger.trace({ - ids, - useTransaction: Boolean(options.useTransaction), - appHash: (await this.storage.getRootHash(options)).toString('hex'), - }, 'proveMany'); - } - } - } -} - -module.exports = IdentityStoreRepository; diff --git a/packages/js-drive/lib/identity/SpentAssetLockTransactionsRepository.js b/packages/js-drive/lib/identity/SpentAssetLockTransactionsRepository.js deleted file mode 100644 index 081954da391..00000000000 --- a/packages/js-drive/lib/identity/SpentAssetLockTransactionsRepository.js +++ /dev/null @@ -1,73 +0,0 @@ -const StorageResult = require('../storage/StorageResult'); - -class SpentAssetLockTransactionsRepository { - /** - * @param {GroveDBStore} groveDBStore - */ - constructor(groveDBStore) { - this.storage = groveDBStore; - } - - /** - * Store the outPoint - * - * @param {Buffer} outPointBuffer - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async store(outPointBuffer, options = {}) { - if (options.dryRun) { - return new StorageResult(undefined, []); - } - - const emptyValue = Buffer.from([0]); - - const result = await this.storage.put( - SpentAssetLockTransactionsRepository.TREE_PATH, - outPointBuffer, - emptyValue, - options, - ); - - return new StorageResult( - undefined, - result.getOperations(), - ); - } - - /** - * Fetch the outPoint - * - * @param {Buffer} outPointBuffer - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * - * @return {Promise>} - */ - async fetch(outPointBuffer, options = {}) { - if (options.dryRun) { - return new StorageResult(null, []); - } - - const result = await this.storage.get( - SpentAssetLockTransactionsRepository.TREE_PATH, - outPointBuffer, - options, - ); - - return new StorageResult( - result.getValue(), - result.getOperations(), - ); - } -} - -SpentAssetLockTransactionsRepository.TREE_PATH = [ - Buffer.from([72]), -]; - -module.exports = SpentAssetLockTransactionsRepository; diff --git a/packages/js-drive/lib/identity/masternode/LastSyncedCoreHeightRepository.js b/packages/js-drive/lib/identity/masternode/LastSyncedCoreHeightRepository.js deleted file mode 100644 index 13ad4d4d140..00000000000 --- a/packages/js-drive/lib/identity/masternode/LastSyncedCoreHeightRepository.js +++ /dev/null @@ -1,68 +0,0 @@ -const StorageResult = require('../../storage/StorageResult'); - -class LastSyncedCoreHeightRepository { - /** - * - * @param {GroveDBStore} groveDBStore - */ - constructor(groveDBStore) { - this.storage = groveDBStore; - } - - /** - * Store last synced core height - * - * @param {number} height - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * @return {Promise>} - */ - async store(height, options = {}) { - const value = Buffer.alloc(4); - - value.writeUInt32BE(height); - - return this.storage.put( - LastSyncedCoreHeightRepository.TREE_PATH, - LastSyncedCoreHeightRepository.KEY, - value, - options, - ); - } - - /** - * Fetch last synced core height - * - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * @return {Promise>} - */ - async fetch(options = {}) { - const encodedHeightResult = await this.storage.get( - LastSyncedCoreHeightRepository.TREE_PATH, - LastSyncedCoreHeightRepository.KEY, - { - ...options, - predictedValueSize: 4, - }, - ); - - if (encodedHeightResult.isNull()) { - return encodedHeightResult; - } - - const encodedHeight = encodedHeightResult.getValue(); - - return new StorageResult( - encodedHeight.readUInt32BE(), - encodedHeightResult.getOperations(), - ); - } -} - -LastSyncedCoreHeightRepository.TREE_PATH = [Buffer.from([112])]; -LastSyncedCoreHeightRepository.KEY = Buffer.from('lastSyncedCoreHeight'); - -module.exports = LastSyncedCoreHeightRepository; diff --git a/packages/js-drive/lib/identity/masternode/createMasternodeIdentityFactory.js b/packages/js-drive/lib/identity/masternode/createMasternodeIdentityFactory.js deleted file mode 100644 index 9a8b006618b..00000000000 --- a/packages/js-drive/lib/identity/masternode/createMasternodeIdentityFactory.js +++ /dev/null @@ -1,83 +0,0 @@ -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const Identity = require('@dashevo/dpp/lib/identity/Identity'); -const InvalidMasternodeIdentityError = require('./errors/InvalidMasternodeIdentityError'); - -/** - * @param {DashPlatformProtocol} dpp - * @param {IdentityStoreRepository} identityRepository - * @param {getWithdrawPubKeyTypeFromPayoutScript} getWithdrawPubKeyTypeFromPayoutScript - * @param {getPublicKeyFromPayoutScript} getPublicKeyFromPayoutScript - * @return {createMasternodeIdentity} - */ -function createMasternodeIdentityFactory( - dpp, - identityRepository, - // getWithdrawPubKeyTypeFromPayoutScript, - // getPublicKeyFromPayoutScript, -) { - /** - * @typedef createMasternodeIdentity - * @param {BlockInfo} blockInfo - * @param {Identifier} identifier - * @param {Buffer} pubKeyData - * @param {number} pubKeyType - * @param {Script} [payoutScript] - * @return {Promise} - */ - async function createMasternodeIdentity( - blockInfo, - identifier, - pubKeyData, - pubKeyType, - // payoutScript, - ) { - const publicKeys = [{ - id: 0, - type: pubKeyType, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, - readOnly: true, - // Copy data buffer - data: Buffer.from(pubKeyData), - }]; - - // TODO: Enable keys when we have support of non unique keys in DPP - // if (payoutScript) { - // const withdrawPubKeyType = getWithdrawPubKeyTypeFromPayoutScript(payoutScript); - // - // publicKeys.push({ - // id: 1, - // type: withdrawPubKeyType, - // purpose: IdentityPublicKey.PURPOSES.WITHDRAW, - // securityLevel: IdentityPublicKey.SECURITY_LEVELS.CRITICAL, - // readOnly: false, - // data: getPublicKeyFromPayoutScript(payoutScript, withdrawPubKeyType), - // }); - // } - - const identity = new Identity({ - protocolVersion: dpp.getProtocolVersion(), - id: identifier.toBuffer(), - publicKeys, - balance: 0, - revision: 0, - }); - - const validationResult = await dpp.identity.validate(identity); - if (!validationResult.isValid()) { - const validationError = validationResult.getFirstError(); - - throw new InvalidMasternodeIdentityError(validationError); - } - - await identityRepository.create(identity, blockInfo, { - useTransaction: true, - }); - - return identity; - } - - return createMasternodeIdentity; -} - -module.exports = createMasternodeIdentityFactory; diff --git a/packages/js-drive/lib/identity/masternode/createOperatorIdentifier.js b/packages/js-drive/lib/identity/masternode/createOperatorIdentifier.js deleted file mode 100644 index 4effefbf931..00000000000 --- a/packages/js-drive/lib/identity/masternode/createOperatorIdentifier.js +++ /dev/null @@ -1,20 +0,0 @@ -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const { hash } = require('@dashevo/dpp/lib/util/hash'); - -/** - * @param {SimplifiedMNListEntry} smlEntry - */ -function createOperatorIdentifier(smlEntry) { - const operatorPubKey = Buffer.from(smlEntry.pubKeyOperator, 'hex'); - - return Identifier.from( - hash( - Buffer.concat([ - Buffer.from(smlEntry.proRegTxHash, 'hex'), - operatorPubKey, - ]), - ), - ); -} - -module.exports = createOperatorIdentifier; diff --git a/packages/js-drive/lib/identity/masternode/createRewardShareDocumentFactory.js b/packages/js-drive/lib/identity/masternode/createRewardShareDocumentFactory.js deleted file mode 100644 index d1462448dcc..00000000000 --- a/packages/js-drive/lib/identity/masternode/createRewardShareDocumentFactory.js +++ /dev/null @@ -1,88 +0,0 @@ -const { hash } = require('@dashevo/dpp/lib/util/hash'); -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); - -const MAX_DOCUMENTS = 16; - -/** - * @param {DashPlatformProtocol} dpp - * @param {DocumentRepository} documentRepository - * @return {createRewardShareDocument} - */ -function createRewardShareDocumentFactory( - dpp, - documentRepository, -) { - /** - * @typedef {createRewardShareDocument} - * @param {DataContract} dataContract - * @param {Identifier} masternodeIdentifier - * @param {Identifier} operatorIdentifier - * @param {number} percentage - * @param {BlockInfo} blockInfo - * @returns {Promise} - */ - async function createRewardShareDocument( - dataContract, - masternodeIdentifier, - operatorIdentifier, - percentage, - blockInfo, - ) { - const documentsResult = await documentRepository.find( - dataContract, - 'rewardShare', - { - where: [ - ['$ownerId', '==', masternodeIdentifier.toBuffer()], - ], - useTransaction: true, - }, - ); - - // Do not create a share if it's exist already - // or max shares limit is reached - if (!documentsResult.isEmpty()) { - if (documentsResult.getValue().length > MAX_DOCUMENTS) { - return null; - } - - const operatorShare = documentsResult.getValue().find((shareDocument) => ( - shareDocument.get('payToId').equals(operatorIdentifier) - )); - - if (operatorShare) { - return null; - } - } - - const rewardShareDocument = dpp.document.create( - dataContract, - masternodeIdentifier, - 'rewardShare', - { - payToId: operatorIdentifier, - percentage, - }, - ); - - // Create an identity for operator - const rewardShareDocumentIdSeed = hash( - Buffer.concat([ - masternodeIdentifier.toBuffer(), - operatorIdentifier.toBuffer(), - ]), - ); - - rewardShareDocument.id = Identifier.from(rewardShareDocumentIdSeed); - - await documentRepository.create(rewardShareDocument, blockInfo, { - useTransaction: true, - }); - - return rewardShareDocument; - } - - return createRewardShareDocument; -} - -module.exports = createRewardShareDocumentFactory; diff --git a/packages/js-drive/lib/identity/masternode/createVotingIdentifier.js b/packages/js-drive/lib/identity/masternode/createVotingIdentifier.js deleted file mode 100644 index 69e61c89d2f..00000000000 --- a/packages/js-drive/lib/identity/masternode/createVotingIdentifier.js +++ /dev/null @@ -1,21 +0,0 @@ -const { hash } = require('@dashevo/dpp/lib/util/hash'); -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const Address = require('@dashevo/dashcore-lib/lib/address'); - -/** - * @param {SimplifiedMNListEntry} smlEntry - */ -function createVotingIdentifier(smlEntry) { - const votingPubKeyHash = Address.fromString(smlEntry.votingAddress).hashBuffer; - - return Identifier.from( - hash( - Buffer.concat([ - Buffer.from(smlEntry.proRegTxHash, 'hex'), - votingPubKeyHash, - ]), - ), - ); -} - -module.exports = createVotingIdentifier; diff --git a/packages/js-drive/lib/identity/masternode/errors/InvalidIdentityPublicKeyTypeError.js b/packages/js-drive/lib/identity/masternode/errors/InvalidIdentityPublicKeyTypeError.js deleted file mode 100644 index 59b2a671f58..00000000000 --- a/packages/js-drive/lib/identity/masternode/errors/InvalidIdentityPublicKeyTypeError.js +++ /dev/null @@ -1,22 +0,0 @@ -const DriveError = require('../../../errors/DriveError'); - -class InvalidIdentityPublicKeyTypeError extends DriveError { - /** - * @param {number} type - */ - constructor(type) { - super('Invalid Identity Public Key type'); - - this.type = type; - } - - /** - * - * @return {number} - */ - getType() { - return this.type; - } -} - -module.exports = InvalidIdentityPublicKeyTypeError; diff --git a/packages/js-drive/lib/identity/masternode/errors/InvalidMasternodeIdentityError.js b/packages/js-drive/lib/identity/masternode/errors/InvalidMasternodeIdentityError.js deleted file mode 100644 index ad1a8fe7ba7..00000000000 --- a/packages/js-drive/lib/identity/masternode/errors/InvalidMasternodeIdentityError.js +++ /dev/null @@ -1,23 +0,0 @@ -const DriveError = require('../../../errors/DriveError'); - -class InvalidMasternodeIdentityError extends DriveError { - /** - * @param {Error} validationError - */ - constructor(validationError) { - super('Invalid masternode identity'); - - this.validationError = validationError; - } - - /** - * Get validation error - * - * @return {Error} - */ - getValidationError() { - return this.validationError; - } -} - -module.exports = InvalidMasternodeIdentityError; diff --git a/packages/js-drive/lib/identity/masternode/errors/InvalidPayoutScriptError.js b/packages/js-drive/lib/identity/masternode/errors/InvalidPayoutScriptError.js deleted file mode 100644 index 2a224ff0661..00000000000 --- a/packages/js-drive/lib/identity/masternode/errors/InvalidPayoutScriptError.js +++ /dev/null @@ -1,22 +0,0 @@ -const DriveError = require('../../../errors/DriveError'); - -class InvalidPayoutScriptError extends DriveError { - /** - * @param {Buffer} payoutScript - */ - constructor(payoutScript) { - super('Invalid payout script'); - - this.payoutScript = payoutScript; - } - - /** - * - * @return {Buffer} - */ - getPayoutScript() { - return this.payoutScript; - } -} - -module.exports = InvalidPayoutScriptError; diff --git a/packages/js-drive/lib/identity/masternode/getPublicKeyFromPayoutScript.js b/packages/js-drive/lib/identity/masternode/getPublicKeyFromPayoutScript.js deleted file mode 100644 index e6dc34d4bd1..00000000000 --- a/packages/js-drive/lib/identity/masternode/getPublicKeyFromPayoutScript.js +++ /dev/null @@ -1,21 +0,0 @@ -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const InvalidIdentityPublicKeyTypeError = require('@dashevo/dpp/lib/stateTransition/errors/InvalidIdentityPublicKeyTypeError'); - -/** - * @typedef getPublicKeyFromPayoutScript - * @param {Script} payoutScript - * @param {number} type - * @returns {Buffer} - */ -function getPublicKeyFromPayoutScript(payoutScript, type) { - switch (type) { - case IdentityPublicKey.TYPES.ECDSA_HASH160: - return payoutScript.toBuffer().slice(3, 23); - case IdentityPublicKey.TYPES.BIP13_SCRIPT_HASH: - return payoutScript.toBuffer().slice(2, 22); - default: - throw new InvalidIdentityPublicKeyTypeError(type); - } -} - -module.exports = getPublicKeyFromPayoutScript; diff --git a/packages/js-drive/lib/identity/masternode/getWithdrawPubKeyTypeFromPayoutScriptFactory.js b/packages/js-drive/lib/identity/masternode/getWithdrawPubKeyTypeFromPayoutScriptFactory.js deleted file mode 100644 index 402fd45f45f..00000000000 --- a/packages/js-drive/lib/identity/masternode/getWithdrawPubKeyTypeFromPayoutScriptFactory.js +++ /dev/null @@ -1,38 +0,0 @@ -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); - -const InvalidPayoutScriptError = require('./errors/InvalidPayoutScriptError'); - -/** - * - * @param {string} network - * @returns {getWithdrawPubKeyTypeFromPayoutScript} - */ -function getWithdrawPubKeyTypeFromPayoutScriptFactory(network) { - /** - * @typedef getWithdrawPubKeyTypeFromPayoutScript - * @param {Script} payoutScript - * @returns {number} - */ - function getWithdrawPubKeyTypeFromPayoutScript(payoutScript) { - const address = payoutScript.toAddress(network); - - if (address === false) { - throw new InvalidPayoutScriptError(payoutScript); - } - - let withdrawPubKeyType; - if (address.isPayToScriptHash()) { - withdrawPubKeyType = IdentityPublicKey.TYPES.BIP13_SCRIPT_HASH; - } else if (address.isPayToPublicKeyHash()) { - withdrawPubKeyType = IdentityPublicKey.TYPES.ECDSA_HASH160; - } else { - throw new InvalidPayoutScriptError(payoutScript); - } - - return withdrawPubKeyType; - } - - return getWithdrawPubKeyTypeFromPayoutScript; -} - -module.exports = getWithdrawPubKeyTypeFromPayoutScriptFactory; diff --git a/packages/js-drive/lib/identity/masternode/handleNewMasternodeFactory.js b/packages/js-drive/lib/identity/masternode/handleNewMasternodeFactory.js deleted file mode 100644 index 8303b2ab78a..00000000000 --- a/packages/js-drive/lib/identity/masternode/handleNewMasternodeFactory.js +++ /dev/null @@ -1,128 +0,0 @@ -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const Address = require('@dashevo/dashcore-lib/lib/address'); -const Script = require('@dashevo/dashcore-lib/lib/script'); -const createOperatorIdentifier = require('./createOperatorIdentifier'); -const createVotingIdentifier = require('./createVotingIdentifier'); - -/** - * - * @param {DashPlatformProtocol} transactionalDpp - * @param {createMasternodeIdentity} createMasternodeIdentity - * @param {createRewardShareDocument} createRewardShareDocument - * @param {fetchTransaction} fetchTransaction - * @return {handleNewMasternode} - */ -function handleNewMasternodeFactory( - transactionalDpp, - createMasternodeIdentity, - createRewardShareDocument, - fetchTransaction, -) { - /** - * @typedef handleNewMasternode - * @param {SimplifiedMNListEntry} masternodeEntry - * @param {DataContract} dataContract - * @param {BlockInfo} blockInfo - * @return {Promise<{ - * createdEntities: Array, - * updatedEntities: Array, - * removedEntities: Array, - * }>} - */ - async function handleNewMasternode(masternodeEntry, dataContract, blockInfo) { - const createdEntities = []; - - const { extraPayload: proRegTxPayload } = await fetchTransaction(masternodeEntry.proRegTxHash); - - const proRegTxHash = Buffer.from(masternodeEntry.proRegTxHash, 'hex'); - - let payoutScript; - - if (masternodeEntry.payoutAddress) { - const payoutAddress = Address.fromString(masternodeEntry.payoutAddress); - payoutScript = new Script(payoutAddress); - } - - // Create a masternode identity - const masternodeIdentifier = Identifier.from( - proRegTxHash, - ); - - const ownerPublicKeyHash = Buffer.from(proRegTxPayload.keyIDOwner, 'hex').reverse(); - - createdEntities.push( - await createMasternodeIdentity( - blockInfo, - masternodeIdentifier, - ownerPublicKeyHash, - IdentityPublicKey.TYPES.ECDSA_HASH160, - payoutScript, - ), - ); - - // we need to crate reward shares only if it's enabled in proRegTx - - if (proRegTxPayload.operatorReward > 0) { - const operatorPubKey = Buffer.from(masternodeEntry.pubKeyOperator, 'hex'); - - let operatorPayoutScript; - if (masternodeEntry.operatorPayoutAddress) { - const operatorPayoutAddress = Address.fromString(masternodeEntry.operatorPayoutAddress); - operatorPayoutScript = new Script(operatorPayoutAddress); - } - - const operatorIdentifier = createOperatorIdentifier(masternodeEntry); - - createdEntities.push( - await createMasternodeIdentity( - blockInfo, - operatorIdentifier, - operatorPubKey, - IdentityPublicKey.TYPES.BLS12_381, - operatorPayoutScript, - ), - ); - - // Create a document in rewards data contract with percentage - const rewardShareDocument = await createRewardShareDocument( - dataContract, - masternodeIdentifier, - operatorIdentifier, - proRegTxPayload.operatorReward, - blockInfo, - ); - - if (rewardShareDocument) { - createdEntities.push(rewardShareDocument); - } - } - - const votingPubKeyHash = Buffer.from(proRegTxPayload.keyIDVoting, 'hex').reverse(); - - // don't need to create a separate Identity in case we don't have - // voting public key (keyIDVoting === keyIDOwner) - if (!votingPubKeyHash.equals(ownerPublicKeyHash)) { - const votingIdentifier = createVotingIdentifier(masternodeEntry); - - createdEntities.push( - await createMasternodeIdentity( - blockInfo, - votingIdentifier, - votingPubKeyHash, - IdentityPublicKey.TYPES.ECDSA_HASH160, - ), - ); - } - - return { - createdEntities, - updatedEntities: [], - removedEntities: [], - }; - } - - return handleNewMasternode; -} - -module.exports = handleNewMasternodeFactory; diff --git a/packages/js-drive/lib/identity/masternode/handleRemovedMasternodeFactory.js b/packages/js-drive/lib/identity/masternode/handleRemovedMasternodeFactory.js deleted file mode 100644 index 97f298451a6..00000000000 --- a/packages/js-drive/lib/identity/masternode/handleRemovedMasternodeFactory.js +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @param {DocumentRepository} documentRepository - * - * @returns {handleRemovedMasternode} - */ -function handleRemovedMasternodeFactory( - documentRepository, -) { - /** - * @typedef {handleRemovedMasternode} - * - * @param {Identifier} masternodeIdentifier - * @param {DataContract} dataContract - * @param {BlockInfo} blockInfo - * @return {Promise<{ - * createdEntities: Array, - * updatedEntities: Array, - * removedEntities: Array, - * }>} - */ - async function handleRemovedMasternode(masternodeIdentifier, dataContract, blockInfo) { - // Delete documents belongs to masternode identity (ownerId) from rewards contract - // since max amount is 16, we can fetch all of them in one request - const removedEntities = []; - - const fetchedDocumentsResult = await documentRepository.find( - dataContract, - 'rewardShare', - { - where: [ - ['$ownerId', '==', masternodeIdentifier], - ], - useTransaction: true, - }, - ); - - const documentsToDelete = fetchedDocumentsResult.getValue(); - - for (const document of documentsToDelete) { - await documentRepository.delete( - dataContract, - 'rewardShare', - document.getId(), - blockInfo, - { useTransaction: true }, - ); - - removedEntities.push( - document, - ); - } - - return { - createdEntities: [], - updatedEntities: [], - removedEntities, - }; - } - - return handleRemovedMasternode; -} - -module.exports = handleRemovedMasternodeFactory; diff --git a/packages/js-drive/lib/identity/masternode/handleUpdatedPubKeyOperatorFactory.js b/packages/js-drive/lib/identity/masternode/handleUpdatedPubKeyOperatorFactory.js deleted file mode 100644 index 663e990662b..00000000000 --- a/packages/js-drive/lib/identity/masternode/handleUpdatedPubKeyOperatorFactory.js +++ /dev/null @@ -1,145 +0,0 @@ -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const Address = require('@dashevo/dashcore-lib/lib/address'); -const Script = require('@dashevo/dashcore-lib/lib/script'); -const createOperatorIdentifier = require('./createOperatorIdentifier'); - -/** - * - * @param {DashPlatformProtocol} transactionalDpp - * @param {createMasternodeIdentity} createMasternodeIdentity - * @param {Identifier} masternodeRewardSharesContractId - * @param {createRewardShareDocument} createRewardShareDocument - * @param {DocumentRepository} documentRepository - * @param {IdentityStoreRepository} identityRepository - * @param {fetchTransaction} fetchTransaction - * @return {handleUpdatedPubKeyOperator} - */ -function handleUpdatedPubKeyOperatorFactory( - transactionalDpp, - createMasternodeIdentity, - masternodeRewardSharesContractId, - createRewardShareDocument, - documentRepository, - identityRepository, - fetchTransaction, -) { - /** - * @typedef handleUpdatedPubKeyOperator - * @param {SimplifiedMNListEntry} masternodeEntry - * @param {SimplifiedMNListEntry} previousMasternodeEntry - * @param {DataContract} dataContract - * @param {BlockInfo} blockInfo - * @return Promise<{ - * createdEntities: Array, - * removedEntities: Array, - * }> - */ - async function handleUpdatedPubKeyOperator( - masternodeEntry, - previousMasternodeEntry, - dataContract, - blockInfo, - ) { - const createdEntities = []; - const removedEntities = []; - - const { extraPayload: proRegTxPayload } = await fetchTransaction(masternodeEntry.proRegTxHash); - - // we need to crate reward shares only if it's enabled in proRegTx - if (proRegTxPayload.operatorReward === 0) { - return { - createdEntities, - removedEntities, - }; - } - - const proRegTxHash = Buffer.from(masternodeEntry.proRegTxHash, 'hex'); - const operatorPublicKey = Buffer.from(masternodeEntry.pubKeyOperator, 'hex'); - - const operatorIdentifier = createOperatorIdentifier(masternodeEntry); - - const operatorIdentityResult = await identityRepository.fetch( - operatorIdentifier, - { useTransaction: true }, - ); - - let operatorPayoutPubKey; - if (masternodeEntry.operatorPayoutAddress) { - const operatorPayoutAddress = Address.fromString(masternodeEntry.operatorPayoutAddress); - operatorPayoutPubKey = new Script(operatorPayoutAddress); - } - - // Create an identity for operator if there is no identity exist with the same ID - if (operatorIdentityResult.isNull()) { - createdEntities.push( - await createMasternodeIdentity( - blockInfo, - operatorIdentifier, - operatorPublicKey, - IdentityPublicKey.TYPES.BLS12_381, - operatorPayoutPubKey, - ), - ); - } - - // Create a document in rewards data contract with percentage defined - // in corresponding ProRegTx - - const masternodeIdentifier = Identifier.from( - proRegTxHash, - ); - - const rewardShareDocument = await createRewardShareDocument( - dataContract, - masternodeIdentifier, - operatorIdentifier, - proRegTxPayload.operatorReward, - blockInfo, - ); - - if (rewardShareDocument) { - createdEntities.push(rewardShareDocument); - } - - // Delete document from reward shares data contract with ID corresponding to the - // masternode identity (ownerId) and previous operator identity (payToId) - - const previousOperatorIdentifier = createOperatorIdentifier(previousMasternodeEntry); - - const previousDocumentsResult = await documentRepository.find( - dataContract, - 'rewardShare', - { - where: [ - ['$ownerId', '==', masternodeIdentifier], - ['payToId', '==', previousOperatorIdentifier], - ], - useTransaction: true, - }, - ); - - if (!previousDocumentsResult.isEmpty()) { - const [previousDocument] = previousDocumentsResult.getValue(); - - await documentRepository.delete( - dataContract, - 'rewardShare', - previousDocument.getId(), - blockInfo, - { useTransaction: true }, - ); - - removedEntities.push(previousDocument); - } - - return { - createdEntities, - removedEntities, - }; - } - - return handleUpdatedPubKeyOperator; -} - -module.exports = handleUpdatedPubKeyOperatorFactory; diff --git a/packages/js-drive/lib/identity/masternode/handleUpdatedScriptPayoutFactory.js b/packages/js-drive/lib/identity/masternode/handleUpdatedScriptPayoutFactory.js deleted file mode 100644 index 2d2fd03a103..00000000000 --- a/packages/js-drive/lib/identity/masternode/handleUpdatedScriptPayoutFactory.js +++ /dev/null @@ -1,117 +0,0 @@ -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const identitySchema = require('@dashevo/dpp/schema/identity/identity.json'); - -/** - * - * @param {IdentityStoreRepository} identityRepository - * @param {IdentityPublicKeyStoreRepository} identityPublicKeyRepository - * @param {getWithdrawPubKeyTypeFromPayoutScript} getWithdrawPubKeyTypeFromPayoutScript - * @param {getPublicKeyFromPayoutScript} getPublicKeyFromPayoutScript - * @returns {handleUpdatedScriptPayout} - */ -function handleUpdatedScriptPayoutFactory( - identityRepository, - identityPublicKeyRepository, - getWithdrawPubKeyTypeFromPayoutScript, - getPublicKeyFromPayoutScript, -) { - /** - * @typedef handleUpdatedScriptPayout - * @param {Identifier} identityId - * @param {Script} newPayoutScript - * @param {BlockInfo} blockInfo - * @param {Script} [previousPayoutScript] - * @return {Promise<{ - * createdEntities: Array, - * updatedEntities: Array, - * removedEntities: Array, - * }>} - */ - async function handleUpdatedScriptPayout( - identityId, - newPayoutScript, - blockInfo, - previousPayoutScript, - ) { - const result = { - createdEntities: [], - updatedEntities: [], - removedEntities: [], - }; - - const identityResult = await identityRepository.fetch(identityId, { useTransaction: true }); - - const identity = identityResult.getValue(); - - const identityPublicKeys = identity - .getPublicKeys(); - - if (identityPublicKeys.length === identitySchema.properties.publicKeys.maxItems) { - // do not add new public key - return result; - } - - // disable previous - if (previousPayoutScript) { - const previousPubKeyType = getWithdrawPubKeyTypeFromPayoutScript(previousPayoutScript); - const previousPubKeyData = getPublicKeyFromPayoutScript( - previousPayoutScript, - previousPubKeyType, - ); - - const keyIds = identityPublicKeys - .filter((pk) => pk.getData().equals(previousPubKeyData)) - .map((pk) => pk.getId()); - - if (keyIds.length > 0) { - await identityPublicKeyRepository.disable( - identityId, - keyIds, - blockInfo.timeMs, - blockInfo, - { useTransaction: true }, - ); - - result.updatedEntities.push({ disabledKeys: keyIds }); - } - } - - // add new - const withdrawPubKeyType = getWithdrawPubKeyTypeFromPayoutScript(newPayoutScript); - const pubKeyData = getPublicKeyFromPayoutScript(newPayoutScript, withdrawPubKeyType); - - const newWithdrawalIdentityPublicKey = new IdentityPublicKey() - .setId(identity.getPublicKeyMaxId() + 1) - .setType(withdrawPubKeyType) - .setData(pubKeyData) - .setPurpose(IdentityPublicKey.PURPOSES.WITHDRAW) - .setReadOnly(true) - .setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MASTER); - - await identityPublicKeyRepository.add( - identityId, - [newWithdrawalIdentityPublicKey], - blockInfo, - { useTransaction: true }, - ); - - result.createdEntities.push(newWithdrawalIdentityPublicKey); - - identity.setRevision(identity.getRevision() + 1); - - await identityRepository.updateRevision( - identityId, - identity.getRevision(), - blockInfo, - { useTransaction: true }, - ); - - result.updatedEntities.push(identity); - - return result; - } - - return handleUpdatedScriptPayout; -} - -module.exports = handleUpdatedScriptPayoutFactory; diff --git a/packages/js-drive/lib/identity/masternode/handleUpdatedVotingAddressFactory.js b/packages/js-drive/lib/identity/masternode/handleUpdatedVotingAddressFactory.js deleted file mode 100644 index b86e45db12e..00000000000 --- a/packages/js-drive/lib/identity/masternode/handleUpdatedVotingAddressFactory.js +++ /dev/null @@ -1,77 +0,0 @@ -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const Address = require('@dashevo/dashcore-lib/lib/address'); -const createVotingIdentifier = require('./createVotingIdentifier'); - -/** - * - * @param {IdentityStoreRepository} identityRepository - * @param {createMasternodeIdentity} createMasternodeIdentity - * @param {fetchTransaction} fetchTransaction - * @return {handleUpdatedVotingAddress} - */ -function handleUpdatedVotingAddressFactory( - identityRepository, - createMasternodeIdentity, - fetchTransaction, -) { - /** - * @typedef handleUpdatedVotingAddress - * @param {SimplifiedMNListEntry} masternodeEntry - * @param {BlockInfo} blockInfo - * @return {Promise<{ - * createdEntities: Array, - * updatedEntities: Array, - * removedEntities: Array, - * }>} - */ - async function handleUpdatedVotingAddress( - masternodeEntry, - blockInfo, - ) { - const result = { - createdEntities: [], - updatedEntities: [], - removedEntities: [], - }; - - const { extraPayload: proRegTxPayload } = await fetchTransaction(masternodeEntry.proRegTxHash); - - const ownerPublicKeyHash = Buffer.from(proRegTxPayload.keyIDOwner, 'hex').reverse(); - const votingPubKeyHash = Buffer.from(proRegTxPayload.keyIDVoting, 'hex').reverse(); - - // don't need to create a separate Identity in case we don't have - // public key used for proposal voting (keyIDVoting === keyIDOwner) - if (ownerPublicKeyHash.equals(votingPubKeyHash)) { - return result; - } - - // Create a voting identity if there is no identity exist with the same ID - const votingIdentifier = createVotingIdentifier(masternodeEntry); - - const votingIdentityResult = await identityRepository.fetch( - votingIdentifier, - { useTransaction: true }, - ); - - // Create an identity for operator if there is no identity exist with the same ID - if (votingIdentityResult.isNull()) { - const votingAddress = Address.fromString(masternodeEntry.votingAddress); - const votingPublicKeyHash = votingAddress.hashBuffer; - - result.createdEntities.push( - await createMasternodeIdentity( - blockInfo, - votingIdentifier, - votingPublicKeyHash, - IdentityPublicKey.TYPES.ECDSA_HASH160, - ), - ); - } - - return result; - } - - return handleUpdatedVotingAddress; -} - -module.exports = handleUpdatedVotingAddressFactory; diff --git a/packages/js-drive/lib/identity/masternode/synchronizeMasternodeIdentitiesFactory.js b/packages/js-drive/lib/identity/masternode/synchronizeMasternodeIdentitiesFactory.js deleted file mode 100644 index 0e288f59fe0..00000000000 --- a/packages/js-drive/lib/identity/masternode/synchronizeMasternodeIdentitiesFactory.js +++ /dev/null @@ -1,258 +0,0 @@ -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const Address = require('@dashevo/dashcore-lib/lib/address'); -const Script = require('@dashevo/dashcore-lib/lib/script'); -const createOperatorIdentifier = require('./createOperatorIdentifier'); - -/** - * - * @param result {{ - * createdEntities: Array, - * updatedEntities: Array, - * removedEntities: Array, - * }} - * @param newData {{ - * createdEntities: Array, - * updatedEntities: Array, - * removedEntities: Array, - * }} - * @return {{ - * createdEntities: Array, - * updatedEntities: Array, - * removedEntities: Array, - * }} - */ -function mergeEntities(result, newData) { - return { - ...result, - createdEntities: result.createdEntities.concat(newData.createdEntities), - updatedEntities: result.updatedEntities.concat(newData.updatedEntities), - removedEntities: result.removedEntities.concat(newData.removedEntities), - }; -} - -/** - * - * @param {DataContractStoreRepository} dataContractRepository - * @param {SimplifiedMasternodeList} simplifiedMasternodeList - * @param {Identifier} masternodeRewardSharesContractId - * @param {handleNewMasternode} handleNewMasternode - * @param {handleUpdatedPubKeyOperator} handleUpdatedPubKeyOperator - * @param {handleRemovedMasternode} handleRemovedMasternode - * @param {handleUpdatedScriptPayout} handleUpdatedScriptPayout - * @param {handleUpdatedVotingAddress} handleUpdatedVotingAddress - * @param {number} smlMaxListsLimit - * @param {LastSyncedCoreHeightRepository} lastSyncedCoreHeightRepository - * @param {fetchSimplifiedMNList} fetchSimplifiedMNList - * @return {synchronizeMasternodeIdentities} - */ -function synchronizeMasternodeIdentitiesFactory( - dataContractRepository, - simplifiedMasternodeList, - masternodeRewardSharesContractId, - handleNewMasternode, - handleUpdatedPubKeyOperator, - handleRemovedMasternode, - handleUpdatedScriptPayout, - handleUpdatedVotingAddress, - smlMaxListsLimit, - lastSyncedCoreHeightRepository, - fetchSimplifiedMNList, -) { - let lastSyncedCoreHeight = 0; - - /** - * @typedef synchronizeMasternodeIdentities - * @param {number} coreHeight - * @param {BlockInfo} blockInfo - * @return {Promise<{ - * createdEntities: Array, - * updatedEntities: Array, - * removedEntities: Array, - * fromHeight: number, - * toHeight: number, - * }>} - */ - async function synchronizeMasternodeIdentities(coreHeight, blockInfo) { - let result = { - createdEntities: [], - updatedEntities: [], - removedEntities: [], - }; - - if (!lastSyncedCoreHeight) { - const lastSyncedHeightResult = await lastSyncedCoreHeightRepository.fetch({ - useTransaction: true, - }); - - lastSyncedCoreHeight = lastSyncedHeightResult.getValue() || 0; - } - - let newMasternodes; - let previousMNList = []; - - const currentMNList = simplifiedMasternodeList.getStore() - .getSMLbyHeight(coreHeight) - .mnList; - - const dataContractResult = await dataContractRepository.fetch( - masternodeRewardSharesContractId, - { - useTransaction: true, - }, - ); - - const dataContract = dataContractResult.getValue(); - - if (lastSyncedCoreHeight === 0) { - // Create identities for all masternodes on the first sync - newMasternodes = currentMNList; - } else { - // simplifiedMasternodeList contains sml only for the last `smlMaxListsLimit` number of blocks - if (coreHeight - lastSyncedCoreHeight >= smlMaxListsLimit) { - // get diff directly from core - ({ mnList: previousMNList } = await fetchSimplifiedMNList(1, lastSyncedCoreHeight)); - } else { - previousMNList = simplifiedMasternodeList.getStore() - .getSMLbyHeight(lastSyncedCoreHeight) - .mnList; - } - - // Get the difference between last sync and requested core height - newMasternodes = currentMNList.filter((currentMnListEntry) => ( - !previousMNList.find((previousMnListEntry) => ( - previousMnListEntry.proRegTxHash === currentMnListEntry.proRegTxHash - )) - )); - - // Update operator identities (PubKeyOperator is changed) - for (const mnEntry of currentMNList) { - const previousMnEntry = previousMNList.find((previousMnListEntry) => ( - previousMnListEntry.proRegTxHash === mnEntry.proRegTxHash - && previousMnListEntry.pubKeyOperator !== mnEntry.pubKeyOperator - )); - - if (previousMnEntry) { - const affectedEntities = await handleUpdatedPubKeyOperator( - mnEntry, - previousMnEntry, - dataContract, - blockInfo, - ); - - result = mergeEntities(result, affectedEntities); - } - - const previousVotingMnEntry = previousMNList.find((previousMnListEntry) => ( - previousMnListEntry.proRegTxHash === mnEntry.proRegTxHash - && previousMnListEntry.votingAddress !== mnEntry.votingAddress - )); - - if (previousVotingMnEntry) { - const affectedEntities = await handleUpdatedVotingAddress( - mnEntry, - blockInfo, - ); - - result = mergeEntities(result, affectedEntities); - } - - if (mnEntry.payoutAddress) { - const mnEntryWithChangedPayoutAddress = previousMNList.find((previousMnListEntry) => ( - previousMnListEntry.proRegTxHash === mnEntry.proRegTxHash - && previousMnListEntry.payoutAddress !== mnEntry.payoutAddress - )); - - if (mnEntryWithChangedPayoutAddress) { - const newPayoutScript = new Script(Address.fromString(mnEntry.payoutAddress)); - const previousPayoutScript = mnEntryWithChangedPayoutAddress.payoutAddress - ? new Script(Address.fromString(mnEntryWithChangedPayoutAddress.payoutAddress)) - : undefined; - - const affectedEntities = await handleUpdatedScriptPayout( - Identifier.from(Buffer.from(mnEntry.proRegTxHash, 'hex')), - newPayoutScript, - blockInfo, - previousPayoutScript, - ); - - result = mergeEntities(result, affectedEntities); - } - } - - if (mnEntry.operatorPayoutAddress) { - const mnEntryWithChangedOperatorPayoutAddress = previousMNList - .find((previousMnListEntry) => ( - previousMnListEntry.proRegTxHash === mnEntry.proRegTxHash - && previousMnListEntry.operatorPayoutAddress !== mnEntry.operatorPayoutAddress - )); - - if (mnEntryWithChangedOperatorPayoutAddress) { - const newOperatorPayoutAddress = Address.fromString(mnEntry.operatorPayoutAddress); - - const { operatorPayoutAddress } = mnEntryWithChangedOperatorPayoutAddress; - - const previousOperatorPayoutScript = operatorPayoutAddress - ? new Script(Address.fromString(operatorPayoutAddress)) - : undefined; - - const affectedEntities = await handleUpdatedScriptPayout( - createOperatorIdentifier(mnEntry), - new Script(newOperatorPayoutAddress), - blockInfo, - previousOperatorPayoutScript, - ); - - result = mergeEntities(result, affectedEntities); - } - } - } - } - - // Create identities and shares for new masternodes - - for (const newMasternodeEntry of newMasternodes) { - const affectedEntities = await handleNewMasternode( - newMasternodeEntry, - dataContract, - blockInfo, - ); - - result = mergeEntities(result, affectedEntities); - } - - // Remove masternode reward shares for invalid/removed masternodes - - const disappearedOrInvalidMasterNodes = previousMNList - .filter((previousMnListEntry) => - // eslint-disable-next-line max-len,implicit-arrow-linebreak - (!currentMNList.find((currentMnListEntry) => currentMnListEntry.proRegTxHash === previousMnListEntry.proRegTxHash))) - .concat(currentMNList.filter((currentMnListEntry) => !currentMnListEntry.isValid)); - - for (const masternodeEntry of disappearedOrInvalidMasterNodes) { - const masternodeIdentifier = Identifier.from( - Buffer.from(masternodeEntry.proRegTxHash, 'hex'), - ); - - const affectedEntities = await handleRemovedMasternode( - masternodeIdentifier, - dataContract, - blockInfo, - ); - - result = mergeEntities(result, affectedEntities); - } - - result.fromHeight = lastSyncedCoreHeight; - result.toHeight = coreHeight; - - await lastSyncedCoreHeightRepository.store(coreHeight, { - useTransaction: true, - }); - - return result; - } - - return synchronizeMasternodeIdentities; -} - -module.exports = synchronizeMasternodeIdentitiesFactory; diff --git a/packages/js-drive/lib/identity/withdrawals/updateWithdrawalTransactionIdAndStatusFactory.js b/packages/js-drive/lib/identity/withdrawals/updateWithdrawalTransactionIdAndStatusFactory.js deleted file mode 100644 index abd8b2c562e..00000000000 --- a/packages/js-drive/lib/identity/withdrawals/updateWithdrawalTransactionIdAndStatusFactory.js +++ /dev/null @@ -1,76 +0,0 @@ -const WITHDRAWALS_DOCUMENT_TYPE = 'withdrawal'; - -const WITHDRAWALS_STATUS_POOLED = 1; -const WITHDRAWALS_STATUS_BROADCASTED = 2; - -/** - * @param {DocumentRepository} documentRepository - * @param {fetchDocuments} fetchDocuments - * @param {Identifier} withdrawalsContractId - * - * @returns {updateWithdrawalTransactionIdAndStatus} - */ -function updateWithdrawalTransactionIdAndStatusFactory( - documentRepository, - fetchDocuments, - withdrawalsContractId, -) { - /** - * Update withdrawal transactionId and set status to BROADCASTED - * - * @typedef updateWithdrawalTransactionIdAndStatus - * - * @param {BlockInfo} blockInfo - * @param {number} coreChainLockedHeight - * @param {Object} transactionIdMap - * @param {Object} options - * - * @returns {Promise} - */ - async function updateWithdrawalTransactionIdAndStatus( - blockInfo, - coreChainLockedHeight, - transactionIdMap, - options, - ) { - const originalTransactionIds = Object.keys(transactionIdMap).map((key) => Buffer.from(key, 'hex')); - - if (originalTransactionIds.length === 0) { - return; - } - - const fetchOptions = { - where: [ - ['status', '==', WITHDRAWALS_STATUS_POOLED], - ['transactionId', 'in', originalTransactionIds], - ], - orderBy: [ - ['transactionId', 'asc'], - ], - ...options, - }; - - const documents = await fetchDocuments( - withdrawalsContractId, - WITHDRAWALS_DOCUMENT_TYPE, - fetchOptions, - ); - - for (const document of documents) { - const originalTransactionIdHex = document.get('transactionId').toString('hex'); - - const updatedTransactionId = transactionIdMap[originalTransactionIdHex]; - - document.set('transactionId', updatedTransactionId); - document.set('transactionSignHeight', coreChainLockedHeight); - document.set('status', WITHDRAWALS_STATUS_BROADCASTED); - document.setRevision(document.getRevision() + 1); - - await documentRepository.update(document, blockInfo, options); - } - } - - return updateWithdrawalTransactionIdAndStatus; -} - -module.exports = updateWithdrawalTransactionIdAndStatusFactory; diff --git a/packages/js-drive/lib/storage/GroveDBStore.js b/packages/js-drive/lib/storage/GroveDBStore.js deleted file mode 100644 index 35a1eb474d9..00000000000 --- a/packages/js-drive/lib/storage/GroveDBStore.js +++ /dev/null @@ -1,519 +0,0 @@ -const { createHash } = require('crypto'); -const StorageResult = require('./StorageResult'); - -class GroveDBStore { - /** - * @param {Drive} rsDrive - * @param {Object} [logger] - */ - constructor(rsDrive, logger = undefined) { - this.rsDrive = rsDrive; - this.db = rsDrive.getGroveDB(); - this.logger = logger; - } - - /** - * Store a key - * - * @param {Buffer[]} path - * @param {Buffer} key - * @param {Buffer} value - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.skipIfExists=false] - * - * @return {Promise>} - */ - async put(path, key, value, options = {}) { - const method = options.skipIfExists ? 'insertIfNotExists' : 'insert'; - - try { - await this.db[method]( - path, - key, - { - type: 'item', - value, - }, - options.useTransaction || false, - ); - } finally { - if (this.logger) { - this.logger.info({ - path: path.map((segment) => segment.toString('hex')), - pathHash: createHash('sha256') - .update( - path.reduce((segment, buffer) => Buffer.concat([segment, buffer]), Buffer.alloc(0)), - ).digest('hex'), - key: key.toString('hex'), - value: value.toString('hex'), - valueHash: createHash('sha256') - .update(value) - .digest('hex'), - useTransaction: Boolean(options.useTransaction), - type: 'item', - method, - appHash: (await this.getRootHash(options)).toString('hex'), - }, 'put'); - } - } - - return new StorageResult( - undefined, - [], - ); - } - - /** - * Store a reference to the specified key - * - * @param {Buffer[]} path - * @param {Buffer} key - * @param {Buffer[]} referencePath - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.skipIfExists=false] - * @return {Promise>} - */ - async putReference(path, key, referencePath, options = {}) { - const method = options.skipIfExists ? 'insertIfNotExists' : 'insert'; - - try { - await this.db[method]( - path, - key, - { - type: 'reference', - value: { - type: 'absolutePathReference', - path: referencePath, - }, - }, - options.useTransaction || false, - ); - } finally { - if (this.logger) { - this.logger.info({ - path: path.map((segment) => segment.toString('hex')), - pathHash: createHash('sha256') - .update( - path.reduce((segment, buffer) => Buffer.concat([segment, buffer]), Buffer.alloc(0)), - ) - .digest('hex'), - key: key.toString('hex'), - value: referencePath.map((segment) => segment.toString('hex')), - valueHash: createHash('sha256') - .update( - referencePath.reduce((segment, buffer) => ( - Buffer.concat([segment, buffer]) - ), Buffer.alloc(0)), - ) - .digest('hex'), - useTransaction: Boolean(options.useTransaction), - type: 'reference', - method, - appHash: (await this.getRootHash(options)).toString('hex'), - }, 'putReference'); - } - } - - return new StorageResult( - undefined, - [], - ); - } - - /** - * Create empty key - * - * @param {Buffer[]} path - * @param {Buffer} key - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.skipIfExists=false] - * @return {Promise>} - */ - async createTree(path, key, options = { }) { - const method = options.skipIfExists ? 'insertIfNotExists' : 'insert'; - - try { - await this.db[method]( - path, - key, - { - type: 'tree', - }, - options.useTransaction || false, - ); - } finally { - if (this.logger) { - this.logger.info({ - path: path.map((segment) => segment.toString('hex')), - pathHash: createHash('sha256') - .update( - path.reduce((segment, buffer) => Buffer.concat([segment, buffer]), Buffer.alloc(0)), - ).digest('hex'), - key: key.toString('hex'), - value: Buffer.alloc(32).toString('hex'), - valueHash: createHash('sha256') - .update(Buffer.alloc(32)) - .digest('hex'), - useTransaction: Boolean(options.useTransaction), - type: 'tree', - method, - appHash: (await this.getRootHash(options)).toString('hex'), - }, 'createTree'); - } - } - - return new StorageResult( - undefined, - [], - ); - } - - /** - * Get a value by key - * - * @param {Buffer[]} path - * @param {Buffer} key - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {number} [options.predictedValueSize] - * @return {Promise>} - */ - async get(path, key, options = { }) { - let type; - let value; - - try { - ({ - type, - value, - } = await this.db.get( - path, - key, - options.useTransaction || false, - )); - } catch (e) { - if ( - e.message.startsWith('grovedb: path key not found') - || e.message.startsWith('grovedb: path not found') - ) { - return new StorageResult( - null, - [], - ); - } - - throw e; - } - - if (type === undefined) { - return new StorageResult( - null, - [], - ); - } - - if (type !== 'item') { - throw new Error('Key should point to item element type'); - } - - return new StorageResult( - value, - [], - ); - } - - /** - * Query keys and values - * - * @param {PathQuery} query - * @param {Object} [options] - * @param {boolean} [options.skipCache=false] - * @param {boolean} [options.useTransaction=false] - * @return {Promise>} - */ - async query(query, options = { }) { - let items; - - try { - [items] = await this.db.query( - query, - options.skipCache || false, - options.useTransaction || false, - ); - } catch (e) { - if ( - e.message.startsWith('grovedb: path key not found') - || e.message.startsWith('grovedb: path not found') - ) { - return new StorageResult( - null, - [], - ); - } - - throw e; - } - - return new StorageResult( - items, - [], - ); - } - - /** - * Prove query - * - * @param {PathQuery} query - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @return {Promise>} - * */ - async proveQuery(query, options = {}) { - const proof = await this.db.proveQuery( - query, - options.useTransaction || false, - ); - - return new StorageResult( - proof, - [], - ); - } - - /** - * Prove many queries - * - * @param {PathQuery[]} queries - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @return {Promise>} - * */ - async proveQueryMany(queries, options = {}) { - const proof = await this.db.proveQueryMany( - queries, - options.useTransaction || false, - ); - - return new StorageResult( - proof, - [], - ); - } - - /** - * Delete value by key - * - * @param {Buffer[]} path - * @param {Buffer} key - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @return {Promise>} - */ - async delete(path, key, options = {}) { - try { - await this.db.delete( - path, - key, - options.useTransaction || false, - ); - } finally { - if (this.logger) { - this.logger.info({ - path: path.map((segment) => segment.toString('hex')), - pathHash: createHash('sha256') - .update( - path.reduce((segment, buffer) => Buffer.concat([segment, buffer]), Buffer.alloc(0)), - ).digest('hex'), - key: key.toString('hex'), - useTransaction: Boolean(options.useTransaction), - method: 'delete', - appHash: (await this.getRootHash(options)).toString('hex'), - }, 'delete'); - } - } - - return new StorageResult( - undefined, - [], - ); - } - - /** - * Get auxiliary value by key - * - * @param {Buffer} key - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.predictedValueSize] - * @return {Promise>} - */ - async getAux(key, options = {}) { - let result = null; - - try { - result = await this.db.getAux( - key, - options.useTransaction || false, - ); - } catch (e) { - if (e.message.startsWith('grovedb: path key not found')) { - return new StorageResult( - null, - [], - ); - } - - throw e; - } - - return new StorageResult( - result, - [], - ); - } - - /** - * Store auxiliary value by key - * - * @param {Buffer} key - * @param {Buffer} value - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * @return {Promise>} - */ - async putAux(key, value, options = {}) { - try { - await this.db.putAux( - key, - value, - options.useTransaction || false, - ); - } finally { - if (this.logger) { - this.logger.info({ - key: key.toString('hex'), - value: value.toString('hex'), - valueHash: createHash('sha256') - .update(value) - .digest('hex'), - useTransaction: Boolean(options.useTransaction), - method: 'putAux', - appHash: (await this.getRootHash(options)).toString('hex'), - }, 'putAux'); - } - } - - return new StorageResult( - undefined, - [], - ); - } - - /** - * Delete auxiliary value by key - * - * @param {Buffer} key - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @param {boolean} [options.dryRun=false] - * @return {Promise>} - */ - async deleteAux(key, options = {}) { - try { - await this.db.deleteAux( - key, - options.useTransaction || false, - ); - } finally { - if (this.logger) { - this.logger.info({ - key: key.toString('hex'), - useTransaction: Boolean(options.useTransaction), - method: 'deleteAux', - appHash: (await this.getRootHash(options)).toString('hex'), - }, 'deleteAux'); - } - } - - return new StorageResult( - undefined, - [], - ); - } - - /** - * Get tree root hash - * - * @param {Object} [options] - * @param {boolean} [options.useTransaction=false] - * @return {Buffer} - */ - async getRootHash(options = {}) { - return this.db.getRootHash(options.useTransaction || false); - } - - /** - * @return {Promise} - */ - async startTransaction() { - return this.db.startTransaction(); - } - - /** - * @return {Promise} - */ - async isTransactionStarted() { - return this.db.isTransactionStarted(); - } - - /** - * Rollback transaction to this initial state when it was created - * - * @returns {Promise} - */ - async rollbackTransaction() { - return this.db.rollbackTransaction(); - } - - /** - * @return {Promise} - */ - async commitTransaction() { - return this.db.commitTransaction(); - } - - /** - * @return {Promise} - */ - async abortTransaction() { - return this.db.abortTransaction(); - } - - /** - * @return {Drive} - */ - getDrive() { - return this.rsDrive; - } - - /** - * @returns {GroveDB} - */ - getDB() { - return this.db; - } - - /** - * @param {GroveDB} db - */ - setDB(db) { - this.db = db; - } -} - -module.exports = GroveDBStore; diff --git a/packages/js-drive/lib/storage/StorageResult.js b/packages/js-drive/lib/storage/StorageResult.js deleted file mode 100644 index fb548802ef5..00000000000 --- a/packages/js-drive/lib/storage/StorageResult.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @template T - */ -class StorageResult { - /** - * @type {T} - */ - #value; - - /** - * @type {AbstractOperation[]} - */ - #operations; - - /** - * @template T - * @param {T} value - * @param {AbstractOperation[]} operations - */ - constructor(value, operations = []) { - this.#value = value; - this.#operations = operations; - } - - /** - * @return {T} - */ - getValue() { - return this.#value; - } - - /** - * @param {T} value - */ - setValue(value) { - this.#value = value; - } - - /** - * @return {AbstractOperation[]} - */ - getOperations() { - return this.#operations; - } - - /** - * @return {boolean} - */ - isNull() { - return this.#value === null || this.#value === undefined; - } - - /** - * @return {boolean} - */ - isEmpty() { - return this.isNull() || (Array.isArray(this.#value) && this.#value.length === 0); - } - - /** - * @param {AbstractOperation} operation - */ - addOperation(...operation) { - this.#operations.push(...operation); - } -} - -module.exports = StorageResult; diff --git a/packages/js-drive/lib/test/.eslintrc b/packages/js-drive/lib/test/.eslintrc deleted file mode 100644 index 4c2b11fe817..00000000000 --- a/packages/js-drive/lib/test/.eslintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "env": { - "node": true, - "mocha": true - }, - "rules": { - "import/no-extraneous-dependencies": "off" - } -} diff --git a/packages/js-drive/lib/test/bootstrap.js b/packages/js-drive/lib/test/bootstrap.js deleted file mode 100644 index 2393794a2de..00000000000 --- a/packages/js-drive/lib/test/bootstrap.js +++ /dev/null @@ -1,78 +0,0 @@ -const path = require('path'); -const dotenvSafe = require('dotenv-safe'); -const dotenvExpand = require('dotenv-expand'); -const { expect, use } = require('chai'); -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); -const dirtyChai = require('dirty-chai'); -const chaiAsPromised = require('chai-as-promised'); -const chaiString = require('chai-string'); -const DashCoreOptions = require('@dashevo/dp-services-ctl/lib/services/dashCore/DashCoreOptions'); - -use(sinonChai); -use(chaiAsPromised); -use(chaiString); -use(dirtyChai); - -process.env.NODE_ENV = 'test'; - -// Workaround for dotenv-safe -if (process.env.INITIAL_CORE_CHAINLOCKED_HEIGHT === undefined) { - process.env.INITIAL_CORE_CHAINLOCKED_HEIGHT = 0; -} -if (process.env.DPNS_MASTER_PUBLIC_KEY === undefined) { - process.env.DPNS_MASTER_PUBLIC_KEY = '037d074eb00aa286c438b5d12b7c6ca25104d61b03e6601b6ace7d5eb036fbbc23'; -} -if (process.env.DPNS_SECOND_PUBLIC_KEY === undefined) { - process.env.DPNS_SECOND_PUBLIC_KEY = '025852df611a228b0e7fbccff4eaa117500ead84622809ea7fc05dcf6d2dbbc1d4'; -} -if (process.env.DASHPAY_MASTER_PUBLIC_KEY === undefined) { - process.env.DASHPAY_MASTER_PUBLIC_KEY = '02c571ff0cdb72634de4fd23f40c4ed530b3d31defc987a55479d65e7e8c1e249a'; -} -if (process.env.DASHPAY_SECOND_PUBLIC_KEY === undefined) { - process.env.DASHPAY_SECOND_PUBLIC_KEY = '03834f92a2132e55273cb713e855a6fbf2179704830c19094470720d6434ce4547'; -} -if (process.env.FEATURE_FLAGS_MASTER_PUBLIC_KEY === undefined) { - process.env.FEATURE_FLAGS_MASTER_PUBLIC_KEY = '022393486382a5bb262856c49f869827a1c79a3a3c38747f3cb8c32dd7bd191797'; -} -if (process.env.FEATURE_FLAGS_SECOND_PUBLIC_KEY === undefined) { - process.env.FEATURE_FLAGS_SECOND_PUBLIC_KEY = '03c10ac08a77dfdfcdc706ea43d9651ac0866181b835411587eca4d2d5477f39f7'; -} -if (process.env.MASTERNODE_REWARD_SHARES_MASTER_PUBLIC_KEY === undefined) { - process.env.MASTERNODE_REWARD_SHARES_MASTER_PUBLIC_KEY = '0333a42c628e8c93ce0386856f8f2239c84bf816cf8590716c7891fdc981a4df0b'; -} -if (process.env.MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY === undefined) { - process.env.MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY = '03a3002856ad91662dc34b6650a2c7f8b2726c947a419e0b880fb3acc38763a271'; -} -if (process.env.WITHDRAWALS_MASTER_PUBLIC_KEY === undefined) { - process.env.WITHDRAWALS_MASTER_PUBLIC_KEY = '02ee6d9b15ed1c310535297739e69973406dbd1a679be7fad2bdd2e08685033077'; -} -if (process.env.WITHDRAWALS_SECOND_PUBLIC_KEY === undefined) { - process.env.WITHDRAWALS_SECOND_PUBLIC_KEY = '02711ce1fedafde67694d771950c474fe300e464d4f67c2a6447f9b61e90fa01f3'; -} - -const dotenvConfig = dotenvSafe.config({ - path: path.resolve(__dirname, '..', '..', '.env'), -}); - -dotenvExpand(dotenvConfig); - -DashCoreOptions.setDefaultCustomOptions({ - container: { - image: 'dashpay/dashd:18.1.0-rc.1', - }, -}); - -beforeEach(function beforeEach() { - if (!this.sinon) { - this.sinon = sinon.createSandbox(); - } else { - this.sinon.restore(); - } -}); - -afterEach(function afterEach() { - this.sinon.restore(); -}); - -global.expect = expect; diff --git a/packages/js-drive/lib/test/createTestDIContainer.js b/packages/js-drive/lib/test/createTestDIContainer.js deleted file mode 100644 index ade6458f5e3..00000000000 --- a/packages/js-drive/lib/test/createTestDIContainer.js +++ /dev/null @@ -1,30 +0,0 @@ -const createDIContainer = require('../createDIContainer'); - -async function createTestDIContainer(dashCore = undefined) { - let coreOptions = {}; - if (dashCore) { - coreOptions = { - CORE_JSON_RPC_HOST: '127.0.0.1', - CORE_JSON_RPC_PORT: dashCore.options.getRpcPort(), - CORE_JSON_RPC_USERNAME: dashCore.options.getRpcUser(), - CORE_JSON_RPC_PASSWORD: dashCore.options.getRpcPassword(), - }; - } - - const container = createDIContainer({ - ...process.env, - GROVEDB_LATEST_FILE: './db/latest_state_test', - EXTERNAL_STORE_LEVEL_DB_FILE: './db/external_leveldb_test', - ...coreOptions, - }); - - const dpp = container.resolve('dpp'); - const transactionalDpp = container.resolve('transactionalDpp'); - - await dpp.initialize(); - await transactionalDpp.initialize(); - - return container; -} - -module.exports = createTestDIContainer; diff --git a/packages/js-drive/lib/test/fixtures/createDataContractDocuments.js b/packages/js-drive/lib/test/fixtures/createDataContractDocuments.js deleted file mode 100644 index 42aa2c7976c..00000000000 --- a/packages/js-drive/lib/test/fixtures/createDataContractDocuments.js +++ /dev/null @@ -1,28 +0,0 @@ -const dataContractMetaSchema = require('@dashevo/dpp/schema/dataContract/dataContractMeta.json'); -const createIndices = require('./createIndices'); -const createProperties = require('./createProperties'); - -/** - * - * @param {number} count - * @returns {Object} - */ -function createDataContractDocuments(count = 2) { - const documents = {}; - - for (let i = 0; i < count; i++) { - documents[`doc${i}`] = { - type: 'object', - indices: createIndices(dataContractMetaSchema.$defs.documentProperties.maxProperties, true), - properties: createProperties(dataContractMetaSchema.$defs.documentProperties.maxProperties, { - type: 'string', - maxLength: 63, - }), - additionalProperties: false, - }; - } - - return documents; -} - -module.exports = createDataContractDocuments; diff --git a/packages/js-drive/lib/test/fixtures/createIndices.js b/packages/js-drive/lib/test/fixtures/createIndices.js deleted file mode 100644 index 9cca689b728..00000000000 --- a/packages/js-drive/lib/test/fixtures/createIndices.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @param {number} count - * @param {boolean} [unique=false] - */ -function createIndices(count, unique = false) { - const indices = []; - - const indexCount = (count < 10 ? count : 10); - - let propertyIndex = 0; - - const basePropertyCount = Math.floor(count / indexCount); - const propertyLeftovers = count % indexCount; - - for (let i = 0; i < indexCount; i++) { - const properties = []; - - for (let x = 0; x < basePropertyCount + ((i < propertyLeftovers) ? 1 : 0); x++) { - const name = `property${propertyIndex}`; - - propertyIndex++; - - properties.push({ [name]: 'asc' }); - } - - indices.push({ - name: `index${i}`, - properties, - unique: unique && i < 3, - }); - } - - return indices; -} - -module.exports = createIndices; diff --git a/packages/js-drive/lib/test/fixtures/createProperties.js b/packages/js-drive/lib/test/fixtures/createProperties.js deleted file mode 100644 index 11ba4876908..00000000000 --- a/packages/js-drive/lib/test/fixtures/createProperties.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @param {number} count - * @param {Object} subSchema - */ -function createProperties(count, subSchema) { - const properties = {}; - - for (let i = 0; i < count; i++) { - const name = `property${i}`; - - properties[name] = subSchema; - } - - return properties; -} - -module.exports = createProperties; diff --git a/packages/js-drive/lib/test/fixtures/getBlockExecutionContextObjectFixture.js b/packages/js-drive/lib/test/fixtures/getBlockExecutionContextObjectFixture.js deleted file mode 100644 index ada7cbc0d35..00000000000 --- a/packages/js-drive/lib/test/fixtures/getBlockExecutionContextObjectFixture.js +++ /dev/null @@ -1,90 +0,0 @@ -const { - tendermint: { - abci: { - CommitInfo, - ValidatorSetUpdate, - }, - types: { - ConsensusParams, - }, - }, -} = require('@dashevo/abci/types'); - -const pino = require('pino'); - -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const { hash } = require('@dashevo/dpp/lib/util/hash'); - -/** - * @param {DataContract} [dataContract] - * @return {{ - * dataContracts: Object[], - * lastCommitInfo, - * coreChainLockedHeight: number, - * height: number, - * version: number, - * timeMs: number, - * validTxs: number, - * contextLogger: Logger, - * withdrawalTransactionsMap: Object, - * round: number, - * }} - */ -function getBlockExecutionContextObjectFixture(dataContract = getDataContractFixture()) { - const lastCommitInfo = new CommitInfo({ - quorumHash: Buffer.from('000003c60ecd9576a05a7e15d93baae18729cb4477d44246093bd2cf8d4f53d8', 'hex'), - blockSignature: Buffer.from('003657bb44d74c371d14485117de43313ca5c2848f3622d691c2b1bf3576a64bdc2538efab24854eb82ae7db38482dbd15a1cb3bc98e55173817c9d05c86e47a5d67614a501414aae6dd1565e59422d1d77c41ae9b38de34ecf1e9f778b2a97b', 'hex'), - }); - - const version = { - app: '1', - block: '2', - }; - - const [txOneBytes, txTwoBytes] = [ - Buffer.alloc(32, 0), - Buffer.alloc(32, 1), - ]; - - return { - dataContracts: [dataContract.toObject()], - lastCommitInfo: CommitInfo.toObject(lastCommitInfo), - height: 10, - proposedAppVersion: 42, - coreChainLockedHeight: 10, - version, - contextLogger: pino(), - epochInfo: { - height: 1, - timeMs: 100, - epoch: 0, - }, - timeMs: Date.now(), - withdrawalTransactionsMap: { - [hash(txOneBytes).toString('hex')]: txOneBytes, - [hash(txTwoBytes).toString('hex')]: txTwoBytes, - }, - round: 42, - prepareProposalResult: { - appHash: Buffer.alloc(32, 3), - txResults: new Array(3).fill({ code: 0 }), - consensusParamUpdates: new ConsensusParams({ - block: { - maxBytes: 1, - maxGas: 2, - }, - evidence: { - maxAgeDuration: null, - maxAgeNumBlocks: 1, - maxBytes: 2, - }, - version: { - appVersion: 1, - }, - }), - validatorSetUpdate: new ValidatorSetUpdate(), - }, - }; -} - -module.exports = getBlockExecutionContextObjectFixture; diff --git a/packages/js-drive/lib/test/fixtures/getSmlFixture.js b/packages/js-drive/lib/test/fixtures/getSmlFixture.js deleted file mode 100644 index 8fed978d62e..00000000000 --- a/packages/js-drive/lib/test/fixtures/getSmlFixture.js +++ /dev/null @@ -1,87 +0,0 @@ -module.exports = function getSmlFixture() { - return [ - { - baseBlockHash: '36d8cdedb8b2a0a8e893a26cbfd2234fb7eb3deee722f12f9f22605fba5bca91', - blockHash: '12d4bffbb6323da88ac6d35d742e33dec01d7f324dd44a5c5758cbf64d3ef024', - cbTxMerkleTree: '0100000001100322c9aa95701ed2b345e2a65e42d50e126ee6e6d2e2d7e4480140ab259bf40101', - cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff05029b040101ffffffff02aa8b4e1e030000001976a914331d5c5153b6599e256c61fc1da7905b43fbbd6788aca28b4e1e030000001976a914b7661283b68f07579114ac58aad96345acaaf2b488ac000000004602009b040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e80000000000000000000000000000000000000000000000000000000000000000', - deletedMNs: [], - mnList: [{ - proRegTxHash: 'f5ec54aed788c434da2fc535ea6b125ec6fc54e58bc0a00a005d1a8d5e477a90', confirmedHash: '53125505b0e9d11b371cf3e12c92d164296dfa215fde6201d28ea44bed992187', service: '192.168.65.2:20101', pubKeyOperator: '951a3208ba531ea75aedd2dc0a9efc75f2c4d9492f1ee0a989b593bcd9722b1a101774d80a426552a9f91d24eb55af6e', votingAddress: 'yYH1rgZsgvkmT8bSSSw1cKCjyVPnFpTBCw', isValid: true, nVersion: 2, nType: 0, payoutAddress: 'yZv7wf496sjqJVgnEUAtYKozWQhVpoHRh9', - }, { - proRegTxHash: 'a2c9b34ef525271d84f70a0d4d2c107e8a2f81cd4d8256dc7b3911ed253d5611', confirmedHash: '29ff8afb463604ba7d984b483e92dfefa4e80e12de3acae6d75f9b910df9eab6', service: '192.168.65.2:20201', pubKeyOperator: 'a5ad6d8cad7b233210b718a5fc9ec3cea18aeebe38b2e3122deb581e430aa28875fe7336c283871db42808f8d4107745', votingAddress: 'yRXtaRmQ7LCmT5XcgzQdLwPEf31dycBaeY', isValid: true, nVersion: 2, nType: 0, payoutAddress: 'yiBP17AgHGit2TE9p9FpHEh4ouowNSxMxg', - }, { - proRegTxHash: '1c81a5faa2c0e0d96eb59c58a10fcbc87f431bb6cd880d960b43b269e682d2d2', confirmedHash: '03cc2acc135ab51304d3cff42215c7a8041902fa3f19451d5562a03b38143e8f', service: '192.168.65.2:20001', pubKeyOperator: '96f83eedc8a7b87663e591987f051ce341a6fb88989322c64bbbf56d205e4e77d2cb7d839d8b4106a8a1f5d5cf7cfa57', votingAddress: 'ybJfuKs59MJWkPEnS8qNmtvdisHrCy7Njn', isValid: true, nVersion: 2, nType: 0, payoutAddress: 'yd3AnRA5YRtN1jsv7jqUK8egA6Mk9e8HoS', - }], - nVersion: 2, - deletedQuorums: [], - newQuorums: [], - merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', - merkleRootQuorums: '0000000000000000000000000000000000000000000000000000000000000000', - }, - { - baseBlockHash: '12d4bffbb6323da88ac6d35d742e33dec01d7f324dd44a5c5758cbf64d3ef024', blockHash: '4fa3b35537280a5ff0f8adbc966960bb0cd95ecb4782444ec9f9b62d72afd571', cbTxMerkleTree: '01000000010cc244c3b969a94ab809d87c2f31c9d9feeae5798a4afcd80191f605580367770101', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff05029c040101ffffffff02aa8b4e1e030000001976a91419dbb5e39a9c9bce01849dbbf4193929506e0f4588aca28b4e1e030000001976a914efcc3a89faf4df61f3ba4f65f2e742a6c6e3453088ac000000004602009c040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e80000000000000000000000000000000000000000000000000000000000000000', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '0000000000000000000000000000000000000000000000000000000000000000', - }, - { - baseBlockHash: '4fa3b35537280a5ff0f8adbc966960bb0cd95ecb4782444ec9f9b62d72afd571', blockHash: '62ec67e46a2c9710381e28f34c9c7f6605766b394cef156643ea906bb3b6701a', cbTxMerkleTree: '0100000001979a5826b0065b8dee4632c7f1d45c862c302d339e11656d58bdfc17b62b966e0101', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff05029d040101ffffffff02aa8b4e1e030000001976a914fbbc45c3fdbd26d51f8558f152b6f772d3260a7488aca28b4e1e030000001976a9149528697532e5e020c44aebaa1b6d0b66e239b3fe88ac000000004602009d040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e80000000000000000000000000000000000000000000000000000000000000000', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '0000000000000000000000000000000000000000000000000000000000000000', - }, - { - baseBlockHash: '62ec67e46a2c9710381e28f34c9c7f6605766b394cef156643ea906bb3b6701a', blockHash: '0b00be86c561b54e4dfc661815ed107627fd7f29693b2a46f8c769c3504c16f1', cbTxMerkleTree: '01000000015d6ccc29f288527e8c800218385587382e2216fd2508058fb6e98fca91e08e6f0101', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff05029e040101ffffffff02aa8b4e1e030000001976a9142cb7b39eabcf81b31457806c9499a2d596f8a55788aca28b4e1e030000001976a914b7661283b68f07579114ac58aad96345acaaf2b488ac000000004602009e040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e80000000000000000000000000000000000000000000000000000000000000000', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '0000000000000000000000000000000000000000000000000000000000000000', - }, - { - baseBlockHash: '0b00be86c561b54e4dfc661815ed107627fd7f29693b2a46f8c769c3504c16f1', blockHash: '42adcd0b2b330c842754489a9f6cb1a0d1dcc6113229b14574696c5b87e6debe', cbTxMerkleTree: '0100000001ded16207cc61edee7129967c8ecf22de5de9c4035c63f72bf6582ff6aaa70c0e0101', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff05029f040101ffffffff02aa8b4e1e030000001976a914b87e86cab49d5ce4c6f2e3927f1f46acc2b0391188aca28b4e1e030000001976a914efcc3a89faf4df61f3ba4f65f2e742a6c6e3453088ac000000004602009f040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e80000000000000000000000000000000000000000000000000000000000000000', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '0000000000000000000000000000000000000000000000000000000000000000', - }, - { - baseBlockHash: '42adcd0b2b330c842754489a9f6cb1a0d1dcc6113229b14574696c5b87e6debe', blockHash: '22f50323777d6544e614ccd3bd7c4c52122974cf9fa34bf9330ddca7b76ded37', cbTxMerkleTree: '0100000001f09a49ac7c163ee6d92aee33d675665ef0f720720b5c84559ed1875ed99f5fc00101', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502a0040101ffffffff02aa8b4e1e030000001976a91405f5fd0cc306a3a826bd58b379429c44eb44b47c88aca28b4e1e030000001976a9149528697532e5e020c44aebaa1b6d0b66e239b3fe88ac00000000460200a0040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e80000000000000000000000000000000000000000000000000000000000000000', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '0000000000000000000000000000000000000000000000000000000000000000', - }, - { - baseBlockHash: '22f50323777d6544e614ccd3bd7c4c52122974cf9fa34bf9330ddca7b76ded37', blockHash: '2ec79cb473fd23457f284c7635264cf5b4df7d6d232357f280a728c5beb28484', cbTxMerkleTree: '01000000014421d1126fef6d6dc7ba20db021397c73f5b702654b50fa6acc0c38712b799db0101', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502a1040101ffffffff02aa8b4e1e030000001976a9143f17462c6fd90af0e1fb5dd53e404ded6f4c09a688aca28b4e1e030000001976a914b7661283b68f07579114ac58aad96345acaaf2b488ac00000000460200a1040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e80000000000000000000000000000000000000000000000000000000000000000', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '0000000000000000000000000000000000000000000000000000000000000000', - }, - { - baseBlockHash: '2ec79cb473fd23457f284c7635264cf5b4df7d6d232357f280a728c5beb28484', blockHash: '2482fb1720e54dea0243b7797ce5c3c44eb5ab9827916a97f6960e34210d4dc9', cbTxMerkleTree: '0500000004a6b029eb4dfa6fc655e0680e1e997e54fad8670ea332b7257118c7e960e5060ce2f09f1b5015b4eed4884246004df64d3f6d5fff1191b460a56801294036197bc9d3da79f4768cdb70282d9f96b82c345a082eb84229d4d3bd2fedb428770496d663ddda0ccd66f5cdd47a51403fe89c1d06982401c05c3c021c85995301e243010f', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502a2040101ffffffff02aa8b4e1e030000001976a914d6dc361352264c01c1d439dab42cf67896971ced88aca28b4e1e030000001976a914efcc3a89faf4df61f3ba4f65f2e742a6c6e3453088ac00000000460200a2040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e80000000000000000000000000000000000000000000000000000000000000000', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '0000000000000000000000000000000000000000000000000000000000000000', - }, - { - baseBlockHash: '2482fb1720e54dea0243b7797ce5c3c44eb5ab9827916a97f6960e34210d4dc9', - blockHash: '52422c1f4ead389b73ca34fb786fab4c22663ef015e766010b635a99de993770', - cbTxMerkleTree: '0500000004bba36da8fd518b33d346625d330a924616b19ecf452f69bf200a4a7313299061a90f2604811e6794cace64f71ec8e5e11ad2e033272cfbbfb43c0fb522476148d5d2f1559de709b3e97569cb405476f46950bdc64dc7280d1734f0e0398f6002b3bd98c64208dc0cb3546e878e15e875f82a641c86cdf5a0fbe5d1146b90d767010f', - cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502a3040101ffffffff02aa8b4e1e030000001976a91409bba8d0a9569d1332a98dcbecf1719165b01f1788aca28b4e1e030000001976a9149528697532e5e020c44aebaa1b6d0b66e239b3fe88ac00000000460200a3040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e82302877d6dd07fc54bf2f8c160ee1d74b37c7b4d866d674c097c4eddb6db6775', - deletedMNs: [], - mnList: [], - nVersion: 2, - deletedQuorums: [], - newQuorums: [{ - version: 3, llmqType: 100, quorumHash: '53834140bf3774419d424b88de6e9d6e7bcea9e0b59c03110b561b8622a15f71', quorumIndex: 0, signersCount: 3, signers: '07', validMembersCount: 3, validMembers: '07', quorumPublicKey: '94ef4696184537701850d5b5ccc6d1e253cce668680327bea7329feb63f0de8db0cd85708f10cdeda33aaf17362a71a3', quorumVvecHash: 'e899b8cd254edc2389a40c114a5a75920e16e8ad29dc5da0a3cb1e228180ec4b', quorumSig: '936f0db22feee7e72d7a130635d25e64b1300595ff335b88b330271abc74c789f92248c26a9fef696e1eac72da7ac4f90620aa7aaadfdd0b4e923d1cc6dcc1aff99f8cd456e84fe2405bad614b79d9230f0f7df39f7d63e283443a2b734e0672', membersSig: '93970da789c60a2c070be0a57d7e25e29eff943581be9967aaa81d544f9ded4512182b03664a407b05de3a682c27b9a305499618bee7550329612a05aeddb591854b03fb23203d8ef1afbd9bb2ce3f874a8afa77ca69a12b4bc77d8d0e4d936f', - }, { - version: 3, llmqType: 102, quorumHash: '53834140bf3774419d424b88de6e9d6e7bcea9e0b59c03110b561b8622a15f71', quorumIndex: 0, signersCount: 3, signers: '07', validMembersCount: 3, validMembers: '07', quorumPublicKey: '902f14411145221b2c7333c9ea5b24b02771583b571b32496251b87cbf9f4421c50c7608d785ceae0e8e8774befb1bbe', quorumVvecHash: '1ff155a5a27490d92db5fba42bfaf8bfd0b73d651d80f19b76a1d1377f9901ab', quorumSig: 'a2cdd139c6a0be507f04712a1a38bc76942b8b8631ede0fa8797156576c4a82016316b5ed3ed8042dc1f77971f305f7306ad7333c761d9f3d4471a27ce964dd0ef66b8591b3f406eda25745466c31b9feb5a52e2fd3ee124142bc96579c1a853', membersSig: 'a9118d64f72443d525de207e64bcc02b1d26961de73f89a052c5c01d8fbfab18fecb29b9f714722c1eb4e61b3e58133507d5a065534a82df16dbd917ccad1b2c1175026a242a44f69713f5a9a5ef0b10956272a1b17880c7d1173e47e068f352', - }, { - version: 3, llmqType: 104, quorumHash: '53834140bf3774419d424b88de6e9d6e7bcea9e0b59c03110b561b8622a15f71', quorumIndex: 0, signersCount: 3, signers: '07', validMembersCount: 3, validMembers: '07', quorumPublicKey: 'aa1067497034c595f85f783a69be6d9bb1a139555e990ee6f60ddb2886ae52bff2c90f2669ea254204011940b8da92d3', quorumVvecHash: '79ac426c3cac22d0a8790df583424a319064f778df47bcedae9aa8cd00c09819', quorumSig: '97283c23faac0939a06ee1b959fe913eab816c3e1d924798ecf23094a1b711c7e8dd129e1ea082f995d40aa63d1eb7431402c306bc7d8a86105bbf07b6228f8c5ab76cab52c18a5c0d91d673afae199ca10e7dbb4f513bf47551f4b6d7e9a484', membersSig: 'b6712c9db9694da6986edd2c89b9ee912c08a06fad9ced811aae536f37eacf3196891ef9a0b319c0d27948b84cf42da00006a74daefb05e5b17995f2784f9ba2ceeedf9cbc205971d1d64401258cf9050da70d16af0533e9398188287e3dd165', - }], - merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', - merkleRootQuorums: '7567dbb6dd4e7c094c676d864d7b7cb3741dee60c1f8f24bc57fd06d7d870223', - }, - { - baseBlockHash: '52422c1f4ead389b73ca34fb786fab4c22663ef015e766010b635a99de993770', blockHash: '401f9127185c81245d92ae9e93b2fc571e99bcdaf89404c61e1a918729a16a1f', cbTxMerkleTree: '04000000034bbfebdc0500a6403256d717c3d26c56334bd70175bf1c05675a247865bed851e277025a4cfb9b398ffaa5e7736d30bca29fae3cebf839d1ac94001f056b87f9d59d34522656a8ee3b2f4f0c7ee52d34f9c143665193bf3cd0ec6266945eb9d00107', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502a4040101ffffffff02aa8b4e1e030000001976a914e826d8130e37c9fc09641ee95f7255786c34234188aca28b4e1e030000001976a914b7661283b68f07579114ac58aad96345acaaf2b488ac00000000460200a4040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e82302877d6dd07fc54bf2f8c160ee1d74b37c7b4d866d674c097c4eddb6db6775', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '7567dbb6dd4e7c094c676d864d7b7cb3741dee60c1f8f24bc57fd06d7d870223', - }, - { - baseBlockHash: '401f9127185c81245d92ae9e93b2fc571e99bcdaf89404c61e1a918729a16a1f', blockHash: '7618f37265698bac8944b075e259974e10844d4e03f8febc5d19c663369e27d4', cbTxMerkleTree: '0400000003e4c7d33cbf8f3577d7154391b4dbb7bf606202d97d2a7c119e61808f5274b0af8fcc5f70790cd0c9a2e3803fcbd368e80352f9a2dae07c6d91c98e29809c42b2d9cecbf65eadcd9d1c573181852bcbf5e2d54e166bc0a269585b776c4cdc129f0107', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502a5040101ffffffff02aa8b4e1e030000001976a914e826d8130e37c9fc09641ee95f7255786c34234188aca28b4e1e030000001976a914efcc3a89faf4df61f3ba4f65f2e742a6c6e3453088ac00000000460200a5040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e82302877d6dd07fc54bf2f8c160ee1d74b37c7b4d866d674c097c4eddb6db6775', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '7567dbb6dd4e7c094c676d864d7b7cb3741dee60c1f8f24bc57fd06d7d870223', - }, - { - baseBlockHash: '7618f37265698bac8944b075e259974e10844d4e03f8febc5d19c663369e27d4', blockHash: '5c5a00c6bdfcbdfbf6d8bf97de5b3364701c2f7bbd62ea5a84611e746d662e85', cbTxMerkleTree: '0400000003631e7d56314d01d605f57a231fdc5c45ec8d41f9efa917426fae8da5891a34fd6189bf0e09922b2b865c5b520cd5bbb32530955d08b598d9c8776e213f66b5ad8c478bf186219418a2110f1ee300c2397559b9a2907aac8521653733b745fa2b0107', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502a6040101ffffffff02aa8b4e1e030000001976a914e826d8130e37c9fc09641ee95f7255786c34234188aca28b4e1e030000001976a9149528697532e5e020c44aebaa1b6d0b66e239b3fe88ac00000000460200a6040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e82302877d6dd07fc54bf2f8c160ee1d74b37c7b4d866d674c097c4eddb6db6775', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '7567dbb6dd4e7c094c676d864d7b7cb3741dee60c1f8f24bc57fd06d7d870223', - }, - { - baseBlockHash: '5c5a00c6bdfcbdfbf6d8bf97de5b3364701c2f7bbd62ea5a84611e746d662e85', blockHash: '1d86bfae61ae28380425327fda49aed105dabe1a584bf31b9e2fa18af5e63c05', cbTxMerkleTree: '040000000343017a1282bb74dc8078da1f458d7bb9c94c9f14c80c83edcbef02a782409c23d8d4eb59d1a3ce68f2fa3ea0bac2d4635db38a68f2582c409a1f161d7ff046dfc1b9c42b11a3f8d1a48e67a6f838de7a0a66cfcf5e01eeb249137b1385088f3d0107', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502a7040101ffffffff02aa8b4e1e030000001976a914e826d8130e37c9fc09641ee95f7255786c34234188aca28b4e1e030000001976a914b7661283b68f07579114ac58aad96345acaaf2b488ac00000000460200a7040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e82302877d6dd07fc54bf2f8c160ee1d74b37c7b4d866d674c097c4eddb6db6775', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '7567dbb6dd4e7c094c676d864d7b7cb3741dee60c1f8f24bc57fd06d7d870223', - }, - { - baseBlockHash: '1d86bfae61ae28380425327fda49aed105dabe1a584bf31b9e2fa18af5e63c05', blockHash: '0ac9982e6cb21e568d409e0f52e45c74b174c9d6bc8866b07697fc55389332c4', cbTxMerkleTree: '04000000032e6d48f3ef9588579cc73bf48349f81423856314d31a37be9db34ca9b524c41fe8ec194cbf921e081bb9ece166ab9fe2d468eb52b913b030d24a51d8bfdba77834cf47adc014dd341f21d46aa7d527468d87e1a266ed9e3ed8609ac6d41c66120107', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502a8040101ffffffff02aa8b4e1e030000001976a914e826d8130e37c9fc09641ee95f7255786c34234188aca28b4e1e030000001976a914efcc3a89faf4df61f3ba4f65f2e742a6c6e3453088ac00000000460200a8040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e82302877d6dd07fc54bf2f8c160ee1d74b37c7b4d866d674c097c4eddb6db6775', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '7567dbb6dd4e7c094c676d864d7b7cb3741dee60c1f8f24bc57fd06d7d870223', - }, - { - baseBlockHash: '0ac9982e6cb21e568d409e0f52e45c74b174c9d6bc8866b07697fc55389332c4', blockHash: '3bb27b4b4426019de01af80efdc751b8060a6fefbfadc4c9ccd8dac1b64a3740', cbTxMerkleTree: '04000000032a2da104b6d7ee01cccd5c91ec10d0714db0f0c2783dfd27a5ca51dbdbf58ee76d923b90c571ef8affe8228cba4ad7260753a43e7ce6089082dac63dca3b178a2b99e5f5aca8ffa045fd0d4ec5ee6fff3b77a07842681639222a02ae6c0aec990107', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502a9040101ffffffff02aa8b4e1e030000001976a914e826d8130e37c9fc09641ee95f7255786c34234188aca28b4e1e030000001976a9149528697532e5e020c44aebaa1b6d0b66e239b3fe88ac00000000460200a9040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e82302877d6dd07fc54bf2f8c160ee1d74b37c7b4d866d674c097c4eddb6db6775', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '7567dbb6dd4e7c094c676d864d7b7cb3741dee60c1f8f24bc57fd06d7d870223', - }, - { - baseBlockHash: '3bb27b4b4426019de01af80efdc751b8060a6fefbfadc4c9ccd8dac1b64a3740', blockHash: '78a209f1187ddd2a9c674831be1dd024f7a61ea3ba48a48eac5b142f23193476', cbTxMerkleTree: '040000000355777cf283c0254f0171448b13c210bb0fea0bbfbf5158d19408aa093ccf71efbc30690a8d7d5ad9ad6bf34b5e71a3c66bd0e26b4e61b0817fd8783c258103074e129ef70b857be58c4dcef5bef8dae4b04c161553ad4c277d2c50219a3b3f970107', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502aa040101ffffffff02aa8b4e1e030000001976a914e826d8130e37c9fc09641ee95f7255786c34234188aca28b4e1e030000001976a914b7661283b68f07579114ac58aad96345acaaf2b488ac00000000460200aa040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e82302877d6dd07fc54bf2f8c160ee1d74b37c7b4d866d674c097c4eddb6db6775', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '7567dbb6dd4e7c094c676d864d7b7cb3741dee60c1f8f24bc57fd06d7d870223', - }, - { - baseBlockHash: '78a209f1187ddd2a9c674831be1dd024f7a61ea3ba48a48eac5b142f23193476', blockHash: '48302f2c3d408228bf155b83600fac1e8e10a0f1b1b672116a0519c73807ddb2', cbTxMerkleTree: '030000000346ced9f4fd1379736bf9f20eec8b4b95d64227810da7fdee8ffe61b1fc62c7bbf0fbe0b62e41650587c00f65bc38d2ac2dc0724c7acf476b1148af625fde735bbc0eeae765e610a5808a88bf4ae18b8ad1318c0262e3f7edfcfd4ae76afd14290107', cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502ab040101ffffffff02aa8b4e1e030000001976a914e826d8130e37c9fc09641ee95f7255786c34234188aca28b4e1e030000001976a914efcc3a89faf4df61f3ba4f65f2e742a6c6e3453088ac00000000460200ab040000471ac09f6c873ae56b9e49de07efaf3f7b46fecbf64ba01eff65c3c3d755a4e82302877d6dd07fc54bf2f8c160ee1d74b37c7b4d866d674c097c4eddb6db6775', deletedMNs: [], mnList: [], nVersion: 2, deletedQuorums: [], newQuorums: [], merkleRootMNList: 'e8a455d7c3c365ff1ea04bf6cbfe467b3fafef07de499e6be53a876c9fc01a47', merkleRootQuorums: '7567dbb6dd4e7c094c676d864d7b7cb3741dee60c1f8f24bc57fd06d7d870223', - }, - ]; -}; diff --git a/packages/js-drive/lib/test/fixtures/getSystemIdentityPublicKeysFixture.js b/packages/js-drive/lib/test/fixtures/getSystemIdentityPublicKeysFixture.js deleted file mode 100644 index 16b1d1557a5..00000000000 --- a/packages/js-drive/lib/test/fixtures/getSystemIdentityPublicKeysFixture.js +++ /dev/null @@ -1,28 +0,0 @@ -const { PublicKey } = require('@dashevo/dashcore-lib'); - -function getSystemIdentityPublicKeysFixture() { - return { - masternodeRewardSharesContractOwner: { - master: new PublicKey(process.env.MASTERNODE_REWARD_SHARES_MASTER_PUBLIC_KEY).toBuffer(), - high: new PublicKey(process.env.MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY).toBuffer(), - }, - featureFlagsContractOwner: { - master: new PublicKey(process.env.FEATURE_FLAGS_MASTER_PUBLIC_KEY).toBuffer(), - high: new PublicKey(process.env.FEATURE_FLAGS_SECOND_PUBLIC_KEY).toBuffer(), - }, - dpnsContractOwner: { - master: new PublicKey(process.env.DPNS_MASTER_PUBLIC_KEY).toBuffer(), - high: new PublicKey(process.env.DPNS_SECOND_PUBLIC_KEY).toBuffer(), - }, - withdrawalsContractOwner: { - master: new PublicKey(process.env.WITHDRAWALS_MASTER_PUBLIC_KEY).toBuffer(), - high: new PublicKey(process.env.WITHDRAWALS_SECOND_PUBLIC_KEY).toBuffer(), - }, - dashpayContractOwner: { - master: new PublicKey(process.env.DASHPAY_MASTER_PUBLIC_KEY).toBuffer(), - high: new PublicKey(process.env.DASHPAY_SECOND_PUBLIC_KEY).toBuffer(), - }, - }; -} - -module.exports = getSystemIdentityPublicKeysFixture; diff --git a/packages/js-drive/lib/test/mock/BlockExecutionContextMock.js b/packages/js-drive/lib/test/mock/BlockExecutionContextMock.js deleted file mode 100644 index f35a0e7553a..00000000000 --- a/packages/js-drive/lib/test/mock/BlockExecutionContextMock.js +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @method addDataContract - * @method hasDataContract - * @method getDataContracts - * @method reset - * @method setHeight - * @method getHeight - * @method setVersion - * @method getVersion - * @method setProposedAppVersion - * @method getProposedAppVersion - * @method setLastCommitInfo - * @method getLastCommitInfo - * @method getValidTxCount - * @method getInvalidTxCount - * @method setContextLogger - * @method getContextLogger - * @method getRound - * @method fromObject - * @method toObject - * @method getEpochInfo - * @method setEpochInfo - * @method setTimeMs - * @method getTimeMs - * @method getRound - * @method setRound - */ -class BlockExecutionContextMock { - /** - * @param {SinonSandbox} sinon - */ - constructor(sinon) { - this.addDataContract = sinon.stub(); - this.hasDataContract = sinon.stub(); - this.getDataContracts = sinon.stub(); - this.setCoreChainLockedHeight = sinon.stub(); - this.getCoreChainLockedHeight = sinon.stub(); - this.setHeight = sinon.stub(); - this.getHeight = sinon.stub(); - this.reset = sinon.stub(); - this.setVersion = sinon.stub(); - this.getVersion = sinon.stub(); - this.setProposedAppVersion = sinon.stub(); - this.getProposedAppVersion = sinon.stub(); - this.setLastCommitInfo = sinon.stub(); - this.getLastCommitInfo = sinon.stub(); - this.setContextLogger = sinon.stub(); - this.getContextLogger = sinon.stub(); - this.setWithdrawalTransactionsMap = sinon.stub(); - this.getWithdrawalTransactionsMap = sinon.stub(); - this.getRound = sinon.stub(); - this.populate = sinon.stub(); - this.isEmpty = sinon.stub(); - this.fromObject = sinon.stub(); - this.toObject = sinon.stub(); - this.setEpochInfo = sinon.stub(); - this.getEpochInfo = sinon.stub(); - this.setTimeMs = sinon.stub(); - this.getTimeMs = sinon.stub(); - this.setRound = sinon.stub(); - this.getRound = sinon.stub(); - this.getPrepareProposalResult = sinon.stub(); - this.setPrepareProposalResult = sinon.stub(); - } -} - -module.exports = BlockExecutionContextMock; diff --git a/packages/js-drive/lib/test/mock/BlockExecutionContextRepositoryMock.js b/packages/js-drive/lib/test/mock/BlockExecutionContextRepositoryMock.js deleted file mode 100644 index 23af323c9f2..00000000000 --- a/packages/js-drive/lib/test/mock/BlockExecutionContextRepositoryMock.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * @method store - * @method fetch - */ -class BlockExecutionContextRepositoryMock { - /** - * @param {SinonSandbox} sinon - */ - constructor(sinon) { - this.store = sinon.stub(); - this.fetch = sinon.stub(); - } -} - -module.exports = BlockExecutionContextRepositoryMock; diff --git a/packages/js-drive/lib/test/mock/BlockExecutionStoreTransactionsMock.js b/packages/js-drive/lib/test/mock/BlockExecutionStoreTransactionsMock.js deleted file mode 100644 index 44b2f87f360..00000000000 --- a/packages/js-drive/lib/test/mock/BlockExecutionStoreTransactionsMock.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @method start - * @method commit - * @method abort - * @method getTransaction - */ -class BlockExecutionStoreTransactionsMock { - /** - * @param {SinonSandbox} sinon - */ - constructor(sinon) { - this.start = sinon.stub(); - this.commit = sinon.stub(); - this.abort = sinon.stub(); - this.getTransaction = sinon.stub(); - this.clone = sinon.stub(); - this.isStarted = sinon.stub(); - } -} - -module.exports = BlockExecutionStoreTransactionsMock; diff --git a/packages/js-drive/lib/test/mock/DriveMock.js b/packages/js-drive/lib/test/mock/DriveMock.js deleted file mode 100644 index 322cdfb5543..00000000000 --- a/packages/js-drive/lib/test/mock/DriveMock.js +++ /dev/null @@ -1,29 +0,0 @@ -class DriveMock { - /** - * @param {Sandbox} sinon - * @method getGroveDB - * @method close - * @method createRootTree - * @method fetchContract - * @method createContract - * @method updateContract - * @method createDocument - * @method updateDocument - * @method deleteDocument - * @method queryDocuments - */ - constructor(sinon) { - this.getGroveDB = sinon.stub(); - this.close = sinon.stub(); - this.createRootTree = sinon.stub(); - this.fetchContract = sinon.stub(); - this.createContract = sinon.stub(); - this.createContract = sinon.stub(); - this.createDocument = sinon.stub(); - this.updateDocument = sinon.stub(); - this.deleteDocument = sinon.stub(); - this.queryDocuments = sinon.stub(); - } -} - -module.exports = DriveMock; diff --git a/packages/js-drive/lib/test/mock/GroveDBStoreMock.js b/packages/js-drive/lib/test/mock/GroveDBStoreMock.js deleted file mode 100644 index 795a3ea6ece..00000000000 --- a/packages/js-drive/lib/test/mock/GroveDBStoreMock.js +++ /dev/null @@ -1,43 +0,0 @@ -class GroveDBStoreMock { - /** - * @param {Sandbox} sinon - * @method put - * @method putReference - * @method createTree - * @method get - * @method delete - * @method getAux - * @method putAux - * @method deleteAux - * @method getRootHash - * @method startTransaction - * @method isTransactionStarted - * @method rollbackTransaction - * @method commitTransaction - * @method abortTransaction - * @method getDrive - * @method getDB - * @method setDB - */ - constructor(sinon) { - this.put = sinon.stub(); - this.putReference = sinon.stub(); - this.createTree = sinon.stub(); - this.get = sinon.stub(); - this.delete = sinon.stub(); - this.getAux = sinon.stub(); - this.putAux = sinon.stub(); - this.deleteAux = sinon.stub(); - this.getRootHash = sinon.stub(); - this.startTransaction = sinon.stub(); - this.isTransactionStarted = sinon.stub(); - this.rollbackTransaction = sinon.stub(); - this.commitTransaction = sinon.stub(); - this.abortTransaction = sinon.stub(); - this.getDrive = sinon.stub(); - this.getDB = sinon.stub(); - this.setDB = sinon.stub(); - } -} - -module.exports = GroveDBStoreMock; diff --git a/packages/js-drive/lib/test/mock/LoggerMock.js b/packages/js-drive/lib/test/mock/LoggerMock.js deleted file mode 100644 index ad45d080d92..00000000000 --- a/packages/js-drive/lib/test/mock/LoggerMock.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @method trace - * @method debug - * @method info - * @method warn - * @method error - * @method fatal - * @method child - */ -class LoggerMock { - /** - * @param {SinonSandbox} sinon - */ - constructor(sinon) { - this.trace = sinon.stub(); - this.debug = sinon.stub(); - this.info = sinon.stub(); - this.warn = sinon.stub(); - this.error = sinon.stub(); - this.fatal = sinon.stub(); - this.child = () => this; - } -} - -module.exports = LoggerMock; diff --git a/packages/js-drive/lib/test/mock/RootTreeMock.js b/packages/js-drive/lib/test/mock/RootTreeMock.js deleted file mode 100644 index 2347b53ba25..00000000000 --- a/packages/js-drive/lib/test/mock/RootTreeMock.js +++ /dev/null @@ -1,11 +0,0 @@ -class RootTreeMock { - /** - * @param {Sandbox} sinon - */ - constructor(sinon) { - this.getRootHash = sinon.stub(); - this.rebuild = sinon.stub(); - } -} - -module.exports = RootTreeMock; diff --git a/packages/js-drive/lib/test/mock/StateViewTransactionMock.js b/packages/js-drive/lib/test/mock/StateViewTransactionMock.js deleted file mode 100644 index 4c8b767ba04..00000000000 --- a/packages/js-drive/lib/test/mock/StateViewTransactionMock.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @method start - * @method commit - * @method abort - * @property {boolean} isTransactionStarted - */ -class StateViewTransactionMock { - /** - * @param {Sandbox} sinon - */ - constructor(sinon) { - this.start = sinon.stub(); - this.commit = sinon.stub(); - this.abort = sinon.stub(); - - this.isTransactionStarted = false; - } -} - -module.exports = StateViewTransactionMock; diff --git a/packages/js-drive/lib/test/mock/StoreMock.js b/packages/js-drive/lib/test/mock/StoreMock.js deleted file mode 100644 index 6a5c77d74b3..00000000000 --- a/packages/js-drive/lib/test/mock/StoreMock.js +++ /dev/null @@ -1,13 +0,0 @@ -class StoreMock { - /** - * @param {Sandbox} sinon - */ - constructor(sinon) { - this.put = sinon.stub(); - this.get = sinon.stub(); - this.delete = sinon.stub(); - this.createTransaction = sinon.stub(); - } -} - -module.exports = StoreMock; diff --git a/packages/js-drive/lib/test/mock/StoreRepositoryMock.js b/packages/js-drive/lib/test/mock/StoreRepositoryMock.js deleted file mode 100644 index d37a99001ee..00000000000 --- a/packages/js-drive/lib/test/mock/StoreRepositoryMock.js +++ /dev/null @@ -1,17 +0,0 @@ -class StoreRepositoryMock { - /** - * @param {Sandbox} sinon - * @method store - * @method fetch - * @method createTree - */ - constructor(sinon) { - this.store = sinon.stub(); - this.fetch = sinon.stub(); - this.prove = sinon.stub(); - this.proveMany = sinon.stub(); - this.createTree = sinon.stub(); - } -} - -module.exports = StoreRepositoryMock; diff --git a/packages/js-drive/lib/test/mock/getBiggestPossibleIdentity.js b/packages/js-drive/lib/test/mock/getBiggestPossibleIdentity.js deleted file mode 100644 index 98a69715569..00000000000 --- a/packages/js-drive/lib/test/mock/getBiggestPossibleIdentity.js +++ /dev/null @@ -1,46 +0,0 @@ -const identityCreateTransitionSchema = require('@dashevo/dpp/schema/identity/stateTransition/identityCreate.json'); - -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); - -const Identity = require('@dashevo/dpp/lib/identity/Identity'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); - -let identity; - -/** - * @return {Identity} - */ -function getBiggestPossibleIdentity() { - if (identity) { - return identity; - } - - const publicKeys = []; - - for (let i = 0; i < identityCreateTransitionSchema.properties.publicKeys.maxItems; i++) { - const securityLevel = i === 0 - ? IdentityPublicKey.SECURITY_LEVELS.MASTER - : IdentityPublicKey.SECURITY_LEVELS.HIGH; - - publicKeys.push({ - id: i, - type: IdentityPublicKey.TYPES.BLS12_381, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel, - readOnly: false, - data: Buffer.alloc(48).fill(255), - }); - } - - identity = new Identity({ - protocolVersion: 1, - id: generateRandomIdentifier().toBuffer(), - publicKeys, - balance: Math.floor(9223372036854775807 / 10000), // credits (i64) max + room for tests - revision: Math.floor(18446744073709551615 / 10000), // u64 max + room for tests - }); - - return identity; -} - -module.exports = getBiggestPossibleIdentity; diff --git a/packages/js-drive/lib/test/util/allocateRandomMemory.js b/packages/js-drive/lib/test/util/allocateRandomMemory.js deleted file mode 100644 index 4fda2848440..00000000000 --- a/packages/js-drive/lib/test/util/allocateRandomMemory.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * - * @param {number} sizeInBytes - size of memory to allocate - * @returns {number[]} - result of the allocation - array filled with random doubles - */ -/* istanbul ignore next */ -module.exports = function allocateRandomMemory(sizeInBytes) { - // This constant is inside of this function because - // it's easier to pass the whole function to the isolate in this case - const NUMBER_SIZE_IN_BYTES = 64 / 8; - const storage = []; - while ((storage.length * NUMBER_SIZE_IN_BYTES) < sizeInBytes) { - storage.push(Math.random()); - } - return storage; -}; diff --git a/packages/js-drive/lib/test/util/setTimeoutShim.js b/packages/js-drive/lib/test/util/setTimeoutShim.js deleted file mode 100644 index 976a0d47fe1..00000000000 --- a/packages/js-drive/lib/test/util/setTimeoutShim.js +++ /dev/null @@ -1,14 +0,0 @@ -/* istanbul ignore next */ -async function wait(timeout) { - const timeStarted = Date.now(); - let finished = false; - - while (!finished) { - if (Date.now() > timeStarted + timeout) { - finished = true; - } - await Promise.resolve(); - } -} - -module.exports = wait; diff --git a/packages/js-drive/lib/util/ExecutionTimer.js b/packages/js-drive/lib/util/ExecutionTimer.js deleted file mode 100644 index baead9caa20..00000000000 --- a/packages/js-drive/lib/util/ExecutionTimer.js +++ /dev/null @@ -1,95 +0,0 @@ -const process = require('process'); - -class ExecutionTimer { - /** - * @type {Object.} - */ - #started = {}; - - /** - * @type {Object.} - */ - #stopped = {}; - - /** - * Start named timer - * - * @param {string} name - * - * @return {void} - */ - startTimer(name) { - if (this.isStarted(name)) { - throw new Error(`${name} timer is already started`); - } - - this.#started[name] = process.hrtime(); - } - - /** - * Clear timer - * - * @param {string} name - */ - clearTimer(name) { - delete this.#started[name]; - delete this.#stopped[name]; - } - - /** - * Get timer - * - * @param {string} name - * @param {boolean} clear - clear timer after getting - * @returns {string} - */ - getTimer(name, clear = false) { - if (!this.#stopped[name]) { - throw new Error(`${name} timer is not stopped`); - } - - const timing = this.#stopped[name]; - - if (clear) { - this.clearTimer(name); - } - - return timing; - } - - /** - * Stop named timer and get timings - * - * @param {string} name - * @param {boolean} keep - do not delete timer - * - * @return {string} - */ - stopTimer(name, keep = false) { - if (!this.isStarted(name)) { - throw new Error(`${name} timer is not started`); - } - - const timings = process.hrtime(this.#started[name]); - - const result = ( - parseFloat(timings[0].toString()) + timings[1] / 1000000000 - ).toFixed(3); - - if (keep) { - this.#stopped[name] = result; - } - - return result; - } - - /** - * @param {string} name - * @return {boolean} - */ - isStarted(name) { - return this.#started[name] !== undefined; - } -} - -module.exports = ExecutionTimer; diff --git a/packages/js-drive/lib/util/millisToProtoTimestamp.js b/packages/js-drive/lib/util/millisToProtoTimestamp.js deleted file mode 100644 index 49f076b62b2..00000000000 --- a/packages/js-drive/lib/util/millisToProtoTimestamp.js +++ /dev/null @@ -1,28 +0,0 @@ -const { - google: { - protobuf: { - Timestamp, - }, - }, -} = require('@dashevo/abci/types'); - -const Long = require('long'); - -/** - * Get milliseconds time from seconds and nanoseconds - * - * @param {number} milliseconds - * - * @returns {number} - */ -function millisToProtoTimestamp(milliseconds) { - const seconds = Math.floor(milliseconds / 1000); - const nanos = (milliseconds - (seconds * 1000)) * (10 ** 6); - - return new Timestamp({ - seconds: Long.fromNumber(seconds), - nanos, - }); -} - -module.exports = millisToProtoTimestamp; diff --git a/packages/js-drive/lib/util/noopLogger.js b/packages/js-drive/lib/util/noopLogger.js deleted file mode 100644 index a1593e9d71c..00000000000 --- a/packages/js-drive/lib/util/noopLogger.js +++ /dev/null @@ -1,8 +0,0 @@ -const pino = require('pino'); - -const noopLogger = Object.keys(pino.levels.values).reduce((logger, functionName) => ({ - ...logger, - [functionName]: () => {}, -}), {}); - -module.exports = noopLogger; diff --git a/packages/js-drive/lib/util/printErrorFace.js b/packages/js-drive/lib/util/printErrorFace.js deleted file mode 100644 index b6e745d647a..00000000000 --- a/packages/js-drive/lib/util/printErrorFace.js +++ /dev/null @@ -1,35 +0,0 @@ -const chalk = require('chalk'); - -// Faces https://github.com/maxogden/cool-ascii-faces -const faces = [ - '\\_(ʘ_ʘ)_/', - '(•̀o•́)ง', - 'ヽ༼° ͟ل͜ ͡°༽ノ', - 'ノ( ゜-゜ノ)', - '༼ ºل͟º ༽', - '(ಥ﹏ಥ)', - '¯\\_(ツ)_/¯', - '(╯°□°)╯︵ ┻━┻', // https://looks.wtf/flipping-tables -]; - -/** - * @return {string} - */ -function printErrorFace() { - let face = ''; - - // top padding - face += '\n\n'; - - // face - face += chalk.red( - faces[Math.floor(Math.random() * faces.length)], - ); - - // bottom padding - face += '\n\n'; - - return face; -} - -module.exports = printErrorFace; diff --git a/packages/js-drive/lib/util/protoTimestampToMillis.js b/packages/js-drive/lib/util/protoTimestampToMillis.js deleted file mode 100644 index 79e47a8bf1d..00000000000 --- a/packages/js-drive/lib/util/protoTimestampToMillis.js +++ /dev/null @@ -1,11 +0,0 @@ -const timeToMillis = require('./timeToMillis'); - -/** - * @param {google.protobuf.ITimestamp} timestamp - * @returns {number} - */ -function protoTimestampToMillis(timestamp) { - return timeToMillis(timestamp.seconds.toNumber(), timestamp.nanos); -} - -module.exports = protoTimestampToMillis; diff --git a/packages/js-drive/lib/util/rejectAfter.js b/packages/js-drive/lib/util/rejectAfter.js deleted file mode 100644 index 4701716d38f..00000000000 --- a/packages/js-drive/lib/util/rejectAfter.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Reject with @param error if @param promise is not resolved in @param ms - * - * @param {Promise} promise - * @param {Error} error - * @param {number} ms - * @return {Promise} - */ -module.exports = async function rejectAfter(promise, error, ms) { - let timeout; - let res; - try { - res = await Promise.race([ - promise, - new Promise((resolve, reject) => { - timeout = setTimeout(() => reject(error), ms); - }), - ]); - } finally { - // noinspection JSUnusedAssignment - clearTimeout(timeout); - } - - return res; -}; diff --git a/packages/js-drive/lib/util/sanitizeUrl.js b/packages/js-drive/lib/util/sanitizeUrl.js deleted file mode 100644 index d3fedd42249..00000000000 --- a/packages/js-drive/lib/util/sanitizeUrl.js +++ /dev/null @@ -1,15 +0,0 @@ -function sanitizeUrl(url) { - for (let i = 0, len = url.length; i < len; i++) { - const charCode = url.charCodeAt(i); - // Some systems do not follow RFC and separate the path and query - // string with a `;` character (code 59), e.g. `/foo;jsessionid=123456`. - // Thus, we need to split on `;` as well as `?` and `#`. - if (charCode === 63 || charCode === 59 || charCode === 35) { - return url.slice(0, i); - } - } - - return url; -} - -module.exports = sanitizeUrl; diff --git a/packages/js-drive/lib/util/shuffleArray.js b/packages/js-drive/lib/util/shuffleArray.js deleted file mode 100644 index 1e6c97f9102..00000000000 --- a/packages/js-drive/lib/util/shuffleArray.js +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable no-param-reassign */ -/** - * Shuffle the given array in place - * - * @param {Array} array - * @returns {Array} - */ -module.exports = function shuffleArray(array) { - for (let i = array.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [array[i], array[j]] = [array[j], array[i]]; - } - return array; -}; diff --git a/packages/js-drive/lib/util/timeToMillis.js b/packages/js-drive/lib/util/timeToMillis.js deleted file mode 100644 index 49037e73bfd..00000000000 --- a/packages/js-drive/lib/util/timeToMillis.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Get milliseconds time from seconds and nanoseconds - * - * @param {number} seconds - * @param {number} nanoseconds - * - * @returns {number} - */ -function timeToMillis(seconds, nanoseconds) { - const overallNanos = nanoseconds + seconds * (10 ** 9); - - return Math.floor(overallNanos / (10 ** 6)); -} - -module.exports = timeToMillis; diff --git a/packages/js-drive/lib/util/wait.js b/packages/js-drive/lib/util/wait.js deleted file mode 100644 index b0d45b4c5ce..00000000000 --- a/packages/js-drive/lib/util/wait.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Asynchronously wait for a specified number of milliseconds. - * @param {Number} ms - Number of milliseconds to wait. - * @return {Promise} The promise to await on. - */ -async function wait(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -module.exports = wait; diff --git a/packages/js-drive/lib/validator/Validator.js b/packages/js-drive/lib/validator/Validator.js deleted file mode 100644 index daefdb63af4..00000000000 --- a/packages/js-drive/lib/validator/Validator.js +++ /dev/null @@ -1,72 +0,0 @@ -const PublicKeyShareIsNotPresentError = require('./errors/PublicKeyShareIsNotPresentError'); - -class Validator { - /** - * @param {Buffer} proTxHash - * @param {ValidatorNetworkInfo} networkInfo - * @param {Buffer} [pubKeyShare] - */ - constructor(proTxHash, networkInfo, pubKeyShare = undefined) { - this.proTxHash = proTxHash; - this.networkInfo = networkInfo; - this.pubKeyShare = pubKeyShare; - } - - /** - * Get validator pro tx hash - * - * @return {Buffer} - */ - getProTxHash() { - return this.proTxHash; - } - - /** - * Get validator public key share - * @return {Buffer} - */ - getPublicKeyShare() { - return this.pubKeyShare; - } - - /** - * Get validator voting power - * - * @return {number} - */ - getVotingPower() { - return Validator.DEFAULT_DASH_VOTING_POWER; - } - - /** - * Get network info - * - * @returns {ValidatorNetworkInfo} - */ - getNetworkInfo() { - return this.networkInfo; - } - - /** - * @param {Object} member - * @param {ValidatorNetworkInfo} networkInfo - * @param {boolean} [pubKeyShareRequired=false] - * @return {Validator} - */ - static createFromQuorumMember(member, networkInfo, pubKeyShareRequired = false) { - const proTxHash = Buffer.from(member.proTxHash, 'hex'); - - let pubKeyShare; - if (member.pubKeyShare) { - pubKeyShare = Buffer.from(member.pubKeyShare, 'hex'); - } else if (pubKeyShareRequired) { - throw new PublicKeyShareIsNotPresentError(member); - } - - return new Validator(proTxHash, networkInfo, pubKeyShare); - } -} - -Validator.DEFAULT_DASH_VOTING_POWER = 100; - -module.exports = Validator; diff --git a/packages/js-drive/lib/validator/ValidatorNetworkInfo.js b/packages/js-drive/lib/validator/ValidatorNetworkInfo.js deleted file mode 100644 index 91593bd4f8f..00000000000 --- a/packages/js-drive/lib/validator/ValidatorNetworkInfo.js +++ /dev/null @@ -1,29 +0,0 @@ -class ValidatorNetworkInfo { - /** - * - * @param {string} host - * @param {number} port - */ - constructor(host, port) { - this.host = host; - this.port = port; - } - - /** - * Get validator host - * @returns {string} - */ - getHost() { - return this.host; - } - - /** - * Get validator port - * @returns {number} - */ - getPort() { - return this.port; - } -} - -module.exports = ValidatorNetworkInfo; diff --git a/packages/js-drive/lib/validator/ValidatorSet.js b/packages/js-drive/lib/validator/ValidatorSet.js deleted file mode 100644 index ca3d0616bff..00000000000 --- a/packages/js-drive/lib/validator/ValidatorSet.js +++ /dev/null @@ -1,171 +0,0 @@ -const Validator = require('./Validator'); -const ValidatorSetIsNotInitializedError = require('./errors/ValidatorSetIsNotInitializedError'); -const ValidatorNetworkInfo = require('./ValidatorNetworkInfo'); - -class ValidatorSet { - /** - * @param {SimplifiedMasternodeList} simplifiedMasternodeList - * @param {getRandomQuorum} getRandomQuorum - * @param {fetchQuorumMembers} fetchQuorumMembers - * @param {number} validatorSetLLMQType - * @param {RpcClient} coreRpcClient - * @param {number} tenderdashP2pPort - */ - constructor( - simplifiedMasternodeList, - getRandomQuorum, - fetchQuorumMembers, - validatorSetLLMQType, - coreRpcClient, - tenderdashP2pPort, - ) { - this.simplifiedMasternodeList = simplifiedMasternodeList; - this.getRandomQuorum = getRandomQuorum; - this.fetchQuorumMembers = fetchQuorumMembers; - this.validatorSetLLMQType = validatorSetLLMQType; - this.coreRpcClient = coreRpcClient; - this.tenderdashP2pPort = tenderdashP2pPort; - - this.quorum = null; - this.validators = []; - } - - /** - * Chooses an active validator set from among all active validator quorums for the first time - * - * @param {number} coreHeight - */ - async initialize(coreHeight) { - const sml = this.simplifiedMasternodeList.getStore().getSMLbyHeight(coreHeight); - - // using the block hash at the first core height as entropy - const rotationEntropy = Buffer.from(sml.toSimplifiedMNListDiff().blockHash, 'hex'); - - await this.switchToRandomQuorum( - sml, - coreHeight, - rotationEntropy, - ); - } - - /** - * Rotates to a new active validator set from among all active validator quorums - * - * @param {Long} height - * @param {number} coreHeight - * @param {Buffer} rotationEntropy - */ - async rotate(height, coreHeight, rotationEntropy) { - const sml = this.simplifiedMasternodeList.getStore().getSMLbyHeight(coreHeight); - - // validator set is rotated every ROTATION_BLOCK_INTERVAL blocks - if (height.toNumber() % ValidatorSet.ROTATION_BLOCK_INTERVAL !== 0) { - return false; - } - - await this.switchToRandomQuorum( - sml, - coreHeight, - rotationEntropy, - ); - - return true; - } - - /** - * Get Validator Set Quorum - * - * @return {QuorumEntry} - */ - getQuorum() { - if (!this.quorum) { - throw new ValidatorSetIsNotInitializedError(); - } - - return this.quorum; - } - - /** - * Get validators - * - * @return {Validator[]} - */ - getValidators() { - if (this.validators.length === 0) { - throw new ValidatorSetIsNotInitializedError(); - } - - return this.validators; - } - - /** - * @private - * @param {SimplifiedMNList} sml - * @param {number} coreHeight - * @param {Buffer} rotationEntropy - * @return {Promise} - */ - async switchToRandomQuorum(sml, coreHeight, rotationEntropy) { - this.quorum = await this.getRandomQuorum( - sml, - this.validatorSetLLMQType, - rotationEntropy, - coreHeight, - ); - - const quorumMembers = await this.fetchQuorumMembers( - this.validatorSetLLMQType, - this.quorum.quorumHash, - ); - - // If the node is a quorum member and doesn't receive public key share for members - // it should throw an error - let proTxHash; - - try { - ({ - result: { - proTxHash, - }, - } = await this.coreRpcClient.masternode('status')); - } catch (e) { - // This node is not a masternode - if (e.code !== -32603) { - throw e; - } - } - - const isThisNodeMember = !!quorumMembers - .find((member) => member.valid && member.proTxHash === proTxHash); - - const validMasternodesList = this.simplifiedMasternodeList - .getStore() - .getCurrentSML() - .getValidMasternodesList(); - - const masternodes = {}; - - this.validators = quorumMembers.filter((member) => { - // Ignore invalid quorum members - if (!member.valid) { - return false; - } - - // Ignore members which are not part of SML - masternodes[member.proTxHash] = validMasternodesList - .find((mnEntry) => mnEntry.proRegTxHash === member.proTxHash); - - return Boolean(masternodes[member.proTxHash]); - }).map((member) => { - const masternode = masternodes[member.proTxHash]; - - const networkInfo = new ValidatorNetworkInfo(masternode.getIp(), this.tenderdashP2pPort); - - return Validator.createFromQuorumMember(member, networkInfo, isThisNodeMember); - }); - } -} - -ValidatorSet.ROTATION_BLOCK_INTERVAL = 15; - -module.exports = ValidatorSet; diff --git a/packages/js-drive/lib/validator/errors/PublicKeyShareIsNotPresentError.js b/packages/js-drive/lib/validator/errors/PublicKeyShareIsNotPresentError.js deleted file mode 100644 index aebcec4b46b..00000000000 --- a/packages/js-drive/lib/validator/errors/PublicKeyShareIsNotPresentError.js +++ /dev/null @@ -1,23 +0,0 @@ -const DriveError = require('../../errors/DriveError'); - -class PublicKeyShareIsNotPresentError extends DriveError { - /** - * @param {Object} member - */ - constructor(member) { - super('Public key share is not present for validator'); - - this.member = member; - } - - /** - * Get quorum member info - * - * @return {Object} - */ - getMember() { - return this.member; - } -} - -module.exports = PublicKeyShareIsNotPresentError; diff --git a/packages/js-drive/lib/validator/errors/ValidatorSetIsNotInitializedError.js b/packages/js-drive/lib/validator/errors/ValidatorSetIsNotInitializedError.js deleted file mode 100644 index c6a2b1c0ea7..00000000000 --- a/packages/js-drive/lib/validator/errors/ValidatorSetIsNotInitializedError.js +++ /dev/null @@ -1,9 +0,0 @@ -const DriveError = require('../../errors/DriveError'); - -class ValidatorSetIsNotInitializedError extends DriveError { - constructor() { - super('Validator Set is not initialized'); - } -} - -module.exports = ValidatorSetIsNotInitializedError; diff --git a/packages/js-drive/package.json b/packages/js-drive/package.json deleted file mode 100644 index 019ff95d9b0..00000000000 --- a/packages/js-drive/package.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "name": "@dashevo/drive", - "private": true, - "version": "0.24.0-dev.16", - "description": "Replicated state machine for Dash Platform", - "engines": { - "node": ">=12" - }, - "contributors": [ - { - "name": "Ivan Shumkov", - "email": "ivan@shumkov.ru", - "url": "https://github.com/shumkov" - }, - { - "name": "Djavid Gabibiyan", - "email": "djavid@dash.org", - "url": "https://github.com/jawid-h" - }, - { - "name": "Anton Suprunchuk", - "email": "anton.suprunchuk@dash.org", - "url": "https://github.com/antouhou" - }, - { - "name": "Konstantin Shuplenkov", - "email": "konstantin.shuplenkov@dash.org", - "url": "https://github.com/shuplenkov" - } - ], - "scripts": { - "abci": "node scripts/abci", - "echo": "node scripts/echo", - "lint": "eslint .", - "test": "yarn run test:coverage", - "test:coverage": "nyc --check-coverage --stmts=93 --branch=85 --funcs=90 --lines=88 yarn run mocha './test/unit/**/*.spec.js' './test/integration/**/*.spec.js'", - "test:unit": "mocha './test/unit/**/*.spec.js'", - "test:integration": "mocha './test/integration/**/*.spec.js'" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/dashevo/js-drive.git" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/dashevo/js-drive/issues" - }, - "homepage": "https://github.com/dashevo/js-drive", - "devDependencies": { - "@dashevo/dp-services-ctl": "github:dashevo/js-dp-services-ctl#v0.19-dev", - "@types/pino": "^6.3.0", - "babel-eslint": "^10.1.0", - "chai": "^4.3.4", - "chai-as-promised": "^7.1.1", - "chai-string": "^1.5.0", - "dirty-chai": "^2.0.1", - "eslint": "^7.32.0", - "eslint-config-airbnb-base": "^14.2.1", - "eslint-plugin-import": "^2.24.2", - "levelup": "^4.4.0", - "memdown": "^5.1.0", - "mocha": "^9.1.2", - "moment": "^2.29.4", - "nyc": "^15.1.0", - "rimraf": "^3.0.2", - "sinon": "^11.1.2", - "sinon-chai": "^3.7.0" - }, - "dependencies": { - "@dashevo/abci": "github:dashpay/js-abci#09f72120bc2059144f72eb7a246d632ead3fc3c6", - "@dashevo/dapi-grpc": "workspace:*", - "@dashevo/dashcore-lib": "~0.20.0", - "@dashevo/dashd-rpc": "^18.2.0", - "@dashevo/dashpay-contract": "workspace:*", - "@dashevo/dpns-contract": "workspace:*", - "@dashevo/dpp": "workspace:*", - "@dashevo/feature-flags-contract": "workspace:*", - "@dashevo/grpc-common": "workspace:*", - "@dashevo/masternode-reward-shares-contract": "workspace:*", - "@dashevo/rs-drive": "workspace:*", - "@dashevo/withdrawals-contract": "workspace:*", - "ajv": "^8.6.0", - "ajv-keywords": "^5.0.0", - "awilix": "^4.2.6", - "blake3": "^2.1.4", - "bs58": "^4.0.1", - "cbor": "^8.0.0", - "chalk": "^4.1.0", - "dotenv-expand": "^5.1.0", - "dotenv-safe": "^8.2.0", - "find-my-way": "^2.2.2", - "js-merkle": "^0.1.5", - "lodash": "^4.17.21", - "long": "^5.2.0", - "node-graceful": "^3.0.1", - "pino": "^6.4.0", - "pino-multi-stream": "^5.2.0", - "pino-pretty": "^4.0.3", - "rimraf": "^3.0.2", - "setimmediate": "^1.0.5", - "through2": "^3.0.1", - "zeromq": "^5.2.8" - } -} diff --git a/packages/js-drive/scripts/abci.js b/packages/js-drive/scripts/abci.js deleted file mode 100644 index 4d577e27e22..00000000000 --- a/packages/js-drive/scripts/abci.js +++ /dev/null @@ -1,181 +0,0 @@ -require('dotenv-expand')(require('dotenv-safe').config()); - -const graceful = require('node-graceful'); - -const chalk = require('chalk'); - -const ZMQClient = require('../lib/core/ZmqClient'); - -const createDIContainer = require('../lib/createDIContainer'); - -const { version: driveVersion } = require('../package.json'); - -const banner = '\n ____ ______ ____ __ __ ____ ____ ______ __ __ ____ \n' -+ '/\\ _`\\ /\\ _ \\ /\\ _`\\ /\\ \\/\\ \\ /\\ _`\\ /\\ _`\\ /\\__ _\\ /\\ \\/\\ \\ /\\ _`\\ \n' -+ '\\ \\ \\/\\ \\ \\ \\ \\L\\ \\ \\ \\,\\L\\_\\ \\ \\ \\_\\ \\ \\ \\ \\/\\ \\ \\ \\ \\L\\ \\ \\/_/\\ \\/ \\ \\ \\ \\ \\ \\ \\ \\L\\_\\ \n' -+ ' \\ \\ \\ \\ \\ \\ \\ __ \\ \\/_\\__ \\ \\ \\ _ \\ \\ \\ \\ \\ \\ \\ \\ , / \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ _\\L \n' -+ ' \\ \\ \\_\\ \\ \\ \\ \\/\\ \\ /\\ \\L\\ \\ \\ \\ \\ \\ \\ \\ \\ \\_\\ \\ \\ \\ \\\\ \\ \\_\\ \\__ \\ \\ \\_/ \\ \\ \\ \\L\\ \\\n' -+ ' \\ \\____/ \\ \\_\\ \\_\\ \\ `\\____\\ \\ \\_\\ \\_\\ \\ \\____/ \\ \\_\\ \\_\\ /\\_____\\ \\ `\\___/ \\ \\____/\n' -+ ' \\/___/ \\/_/\\/_/ \\/_____/ \\/_/\\/_/ \\/___/ \\/_/\\/ / \\/_____/ `\\/__/ \\/___/\n\n\n'; - -// eslint-disable-next-line no-console -console.log(chalk.hex('#008de4')(banner)); - -(async function main() { - const container = createDIContainer(process.env); - const logger = container.resolve('logger'); - const dpp = container.resolve('dpp'); - const transactionalDpp = container.resolve('transactionalDpp'); - const errorHandler = container.resolve('errorHandler'); - const latestProtocolVersion = container.resolve('latestProtocolVersion'); - const closeAbciServer = container.resolve('closeAbciServer'); - - logger.info(`Starting Drive ABCI application v${driveVersion} (latest protocol v${latestProtocolVersion})`); - - /** - * Ensure graceful shutdown - */ - - process - .on('unhandledRejection', errorHandler) - .on('uncaughtException', errorHandler); - - graceful.DEADLY_SIGNALS.push('SIGQUIT'); - - graceful.on('exit', async (signal) => { - logger.info({ signal }, `Received ${signal}. Stopping Drive ABCI application...`); - - await closeAbciServer(); - - await container.dispose(); - }); - - /** - * Initialize DPP - */ - - await dpp.initialize(); - await transactionalDpp.initialize(); - - /** - * Make sure Core is synced - */ - - const network = container.resolve('network'); - - logger.info(`Connecting to Core in ${network} network...`); - - const waitForCoreSync = container.resolve('waitForCoreSync'); - await waitForCoreSync((currentBlockHeight, currentHeaderNumber) => { - let message = `waiting for core to finish sync ${currentBlockHeight}/${currentHeaderNumber}...`; - - if (currentBlockHeight === 0 && currentHeaderNumber === 0) { - message = 'waiting for core to connect to peers...'; - } - - logger.info(message); - }); - - /** - * Connect to Core ZMQ socket - */ - - const coreZMQClient = container.resolve('coreZMQClient'); - - coreZMQClient.on(ZMQClient.events.CONNECTED, () => { - logger.debug('Connected to core ZMQ socket'); - }); - - coreZMQClient.on(ZMQClient.events.DISCONNECTED, () => { - logger.debug('Disconnected from core ZMQ socket'); - }); - - coreZMQClient.on(ZMQClient.events.MAX_RETRIES_REACHED, async () => { - const error = new Error('Can\'t connect to core ZMQ'); - - await errorHandler(error); - }); - - try { - await coreZMQClient.start(); - } catch (e) { - const error = new Error(`Can't connect to core ZMQ socket: ${e.message}`); - - await errorHandler(error); - } - - /** - * Obtain chain lock - */ - - logger.info('Obtaining the latest chain lock...'); - - const waitForCoreChainLockSync = container.resolve('waitForCoreChainLockSync'); - await waitForCoreChainLockSync(); - - /** - * Wait for initial core chain locked height - */ - const initialCoreChainLockedHeight = container.resolve('initialCoreChainLockedHeight'); - - logger.info(`Waiting for initial core chain locked height #${initialCoreChainLockedHeight}...`); - - const waitForChainLockedHeight = container.resolve('waitForChainLockedHeight'); - await waitForChainLockedHeight(initialCoreChainLockedHeight); - - /** - * Start ABCI server - */ - - const abciServer = container.resolve('abciServer'); - - abciServer.on('connection', (socket) => { - logger.debug( - { - abciConnectionId: socket.connection.id, - }, - `Accepted new ABCI connection #${socket.connection.id} from ${socket.remoteAddress}:${socket.remotePort}`, - ); - - socket.on('error', (e) => { - logger.error( - { - err: e, - abciConnectionId: socket.connection.id, - }, - `ABCI connection #${socket.connection.id} error: ${e.message}`, - ); - }); - - socket.once('close', (hasError) => { - let message = `ABCI connection #${socket.connection.id} is closed`; - if (hasError) { - message += ' with error'; - } - - logger.debug( - { - abciConnectionId: socket.connection.id, - }, - message, - ); - }); - }); - - abciServer.once('close', () => { - logger.info('ABCI server and all connections are closed'); - }); - - abciServer.on('error', async (e) => { - await errorHandler(e); - }); - - abciServer.on('listening', () => { - logger.info(`ABCI server is waiting for connection on port ${container.resolve('abciPort')}`); - }); - - abciServer.listen( - container.resolve('abciPort'), - container.resolve('abciHost'), - ); -}()); diff --git a/packages/js-drive/scripts/echo.js b/packages/js-drive/scripts/echo.js deleted file mode 100644 index efd6d7f8353..00000000000 --- a/packages/js-drive/scripts/echo.js +++ /dev/null @@ -1,34 +0,0 @@ -const net = require('net'); - -async function sendEcho(ip) { - const echoRequestBytes = Buffer.from('0a0a080a0668656c6c6f21', 'hex'); - - return new Promise((resolve, reject) => { - const client = net.connect(26658, ip); - - client.on('connect', () => { - client.write(echoRequestBytes); - }); - - client.on('data', () => { - client.destroy(); - - resolve('ok'); - }); - - client.on('error', reject); - - setTimeout(() => { - reject(new Error('Can\'t connect to ABCI port: timeout.')); - }, 2000); - }); -} - -sendEcho('127.0.0.1') - // eslint-disable-next-line no-console - .then(console.log) - .catch((e) => { - // eslint-disable-next-line no-console - console.error(e); - process.exit(1); - }); diff --git a/packages/js-drive/test/.eslintrc b/packages/js-drive/test/.eslintrc deleted file mode 100644 index 720ced73852..00000000000 --- a/packages/js-drive/test/.eslintrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "env": { - "node": true, - "mocha": true - }, - "rules": { - "import/no-extraneous-dependencies": "off" - }, - "globals": { - "expect": true - } -} diff --git a/packages/js-drive/test/README.md b/packages/js-drive/test/README.md deleted file mode 100644 index ce3a86a76af..00000000000 --- a/packages/js-drive/test/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# Drive Tests - -We believe in [Test Pyramid](http://verraes.net/2015/01/economy-of-tests/). - -## Structure - - - `integration/` - [Integration tests](https://en.wikipedia.org/wiki/Integration_testing) - - `unit/` - [Unit tests](https://en.wikipedia.org/wiki/Unit_testing) - -A subsequent paths the same as the structure of the code in the [lib/](../lib) directory. - -## How to run tests - -Run all tests: - -```bash -npm test -``` - -Run unit tests: - -```bash -npm run test:unit -``` - -Run integration tests: - -```bash -npm run test:integration -``` - -## How to write tests - -We use: - - [Mocha](https://mochajs.org) as testing framework - - [Sinon.JS](http://sinonjs.org/) for stubs and spies - - [Chai](http://chaijs.com/) with several plugins for assertions: - - [Sinon Chai](https://github.com/domenic/sinon-chai) for Sinon.JS assertions - - [Chai as promised](https://github.com/domenic/chai-as-promised) for assertions about promises - - [Dirty Chai](https://github.com/prodatakey/dirty-chai) for lint-friendly terminating assertions - -We prefer `expect` assertions syntax instead of `should`. - -All tools are [bootstrapped](../lib/test/bootstrap.js) before tests: - - `expect` function is available in global context - - Sinon sandbox is created before each test and available as `this.sinon` property in the test's context - - Envs from `.env` are loaded before all tests - -## Evolution helpers -We use [js-evo-services-ctl](https://github.com/dashevo/js-evo-services-ctl) library to manipulate Evolution's services. - -## Other tools - -You may find other useful tools for testing in [lib/test](../lib/test) directory. diff --git a/packages/js-drive/test/integration/abci/handlers/queryHandlerFactory.spec.js b/packages/js-drive/test/integration/abci/handlers/queryHandlerFactory.spec.js deleted file mode 100644 index a06c3c3e9a4..00000000000 --- a/packages/js-drive/test/integration/abci/handlers/queryHandlerFactory.spec.js +++ /dev/null @@ -1,150 +0,0 @@ -const cbor = require('cbor'); - -const { - asValue, -} = require('awilix'); - -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); - -const createTestDIContainer = require('../../../../lib/test/createTestDIContainer'); -const InvalidArgumentAbciError = require('../../../../lib/abci/errors/InvalidArgumentAbciError'); - -describe('queryHandlerFactory', function main() { - this.timeout(90000); - - let container; - let queryHandler; - let identityQueryHandlerMock; - let dataContractQueryHandlerMock; - let documentQueryHandlerMock; - let dataContract; - let documents; - let identity; - let proof; - - beforeEach(async function beforeEach() { - proof = Buffer.from('GbYYWuLCU6u7nb4pdnMM1uzAeURhE7ZPxGqAbUARBsb3', 'hex'); - - container = await createTestDIContainer(); - - dataContract = getDataContractFixture(); - documents = getDocumentsFixture(dataContract); - identity = getIdentityFixture(); - - identityQueryHandlerMock = this.sinon.stub(); - identityQueryHandlerMock.resolves({ - value: identity, - proof, - }); - - dataContractQueryHandlerMock = this.sinon.stub(); - dataContractQueryHandlerMock.resolves(dataContract); - - documentQueryHandlerMock = this.sinon.stub(); - documentQueryHandlerMock.resolves(documents); - - container.register('identityQueryHandler', asValue(identityQueryHandlerMock)); - container.register('dataContractQueryHandler', asValue(dataContractQueryHandlerMock)); - container.register('documentQueryHandler', asValue(documentQueryHandlerMock)); - - const enrichErrorWithContextError = container.resolve('enrichErrorWithContextError'); - queryHandler = enrichErrorWithContextError(container.resolve('queryHandler')); - }); - - afterEach(async () => { - if (container) { - await container.dispose(); - } - }); - - describe('/identities', () => { - it('should call identity handler and return an identity with proof', async () => { - const result = await queryHandler({ - path: '/identities', - data: cbor.encode({ - id: 1, - }), - prove: 'true', - }); - - expect(identityQueryHandlerMock).to.have.been.calledOnceWithExactly( - {}, - { id: 1 }, - { - path: '/identities', - data: cbor.encode({ - id: 1, - }), - prove: 'true', - }, - ); - - expect(result).to.deep.equal({ - value: identity, - proof, - }); - }); - }); - - describe('/dataContracts', () => { - it('should call data contract handler and return data contract', async () => { - const result = await queryHandler({ - path: '/dataContracts', - data: cbor.encode({ - id: 1, - }), - }); - - expect(dataContractQueryHandlerMock).to.have.been.calledOnceWithExactly( - {}, - { id: 1 }, - { - path: '/dataContracts', - data: cbor.encode({ - id: 1, - }), - }, - ); - expect(result).to.deep.equal(dataContract); - }); - }); - - describe('/dataContracts/documents', () => { - it('should call documents handler and return documents', async () => { - const result = await queryHandler({ - path: '/dataContracts/documents', - data: cbor.encode({ - contractId: 1, - type: 'someType', - }), - }); - - expect(documentQueryHandlerMock).to.have.been.calledOnceWithExactly( - {}, - { contractId: 1, type: 'someType' }, - { - path: '/dataContracts/documents', - data: cbor.encode({ - contractId: 1, - type: 'someType', - }), - }, - ); - expect(result).to.deep.equal(documents); - }); - }); - - it('should throw an error if invalid path is submitted', async () => { - try { - await queryHandler({ - path: '/unknownPath', - data: Buffer.alloc(0), - }); - } catch (e) { - expect(e).to.be.an.instanceOf(InvalidArgumentAbciError); - expect(e.getMessage()).to.equal('Invalid path'); - } - }); -}); diff --git a/packages/js-drive/test/integration/blockExecution/BlockExecutionContextRepository.spec.js b/packages/js-drive/test/integration/blockExecution/BlockExecutionContextRepository.spec.js deleted file mode 100644 index 0044355bc3c..00000000000 --- a/packages/js-drive/test/integration/blockExecution/BlockExecutionContextRepository.spec.js +++ /dev/null @@ -1,121 +0,0 @@ -const rimraf = require('rimraf'); -const cbor = require('cbor'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const Drive = require('@dashevo/rs-drive'); -const getBlockExecutionContextObjectFixture = require('../../../lib/test/fixtures/getBlockExecutionContextObjectFixture'); -const BlockExecutionContext = require('../../../lib/blockExecution/BlockExecutionContext'); -const GroveDBStore = require('../../../lib/storage/GroveDBStore'); -const noopLogger = require('../../../lib/util/noopLogger'); -const BlockExecutionContextRepository = require('../../../lib/blockExecution/BlockExecutionContextRepository'); - -describe('BlockExecutionContextRepository', () => { - // let container; - let blockExecutionContextRepository; - let blockExecutionContext; - let rsDrive; - let store; - let options; - - beforeEach(async () => { - const dataContract = getDataContractFixture(); - delete dataContract.entropy; - - const plainObject = getBlockExecutionContextObjectFixture(dataContract); - - blockExecutionContext = new BlockExecutionContext(); - blockExecutionContext.fromObject(plainObject); - - rsDrive = new Drive('./db/grovedb_test', { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - store = new GroveDBStore(rsDrive, noopLogger); - - blockExecutionContextRepository = new BlockExecutionContextRepository(store); - - options = {}; - }); - - afterEach(async () => { - await rsDrive.close(); - rimraf.sync('./db/grovedb_test'); - }); - - it('should store blockExecutionContext', async () => { - const result = await blockExecutionContextRepository.store(blockExecutionContext, options); - - expect(result).to.be.instanceOf(BlockExecutionContextRepository); - - const encodedResult = await store.getAux( - BlockExecutionContextRepository.EXTERNAL_STORE_KEY_NAME, - options, - ); - - const blockExecutionContextEncoded = encodedResult.getValue(); - - const rawBlockExecutionContext = cbor.decode(blockExecutionContextEncoded); - - expect(rawBlockExecutionContext).to.deep.equal(blockExecutionContext.toObject({ - skipContextLogger: true, - skipPrepareProposalResult: true, - })); - }); - - it('should fetch blockExecutionContext', async () => { - await store.putAux( - BlockExecutionContextRepository.EXTERNAL_STORE_KEY_NAME, - await cbor.encodeAsync(blockExecutionContext.toObject({ - skipContextLogger: true, - })), - options, - ); - - const fetchedBlockExecutionContext = await blockExecutionContextRepository.fetch(options); - - expect(fetchedBlockExecutionContext).to.be.instanceOf(BlockExecutionContext); - - expect(fetchedBlockExecutionContext.toObject({ - skipContextLogger: true, - skipPrepareProposalResult: true, - })).to.deep.equal(blockExecutionContext.toObject({ - skipContextLogger: true, - skipPrepareProposalResult: true, - })); - }); - - it('should fetch blockExecutionContext stored in transaction', async () => { - await store.startTransaction(); - - await blockExecutionContextRepository.store(blockExecutionContext, { useTransaction: true }); - - let fetchedBlockExecutionContext = await blockExecutionContextRepository.fetch(); - - expect(fetchedBlockExecutionContext).to.be.instanceOf(BlockExecutionContext); - - expect(fetchedBlockExecutionContext.isEmpty()).to.be.true(); - - await store.commitTransaction(); - - fetchedBlockExecutionContext = await blockExecutionContextRepository.fetch(); - - expect(fetchedBlockExecutionContext).to.be.instanceOf(BlockExecutionContext); - - expect(fetchedBlockExecutionContext.toObject({ - skipContextLogger: true, - skipPrepareProposalResult: true, - })).to.deep.equal(blockExecutionContext.toObject({ - skipContextLogger: true, - skipPrepareProposalResult: true, - })); - }); -}); diff --git a/packages/js-drive/test/integration/core/SimplifiedMasternodeList.spec.js b/packages/js-drive/test/integration/core/SimplifiedMasternodeList.spec.js deleted file mode 100644 index b9794d449e4..00000000000 --- a/packages/js-drive/test/integration/core/SimplifiedMasternodeList.spec.js +++ /dev/null @@ -1,103 +0,0 @@ -const getSmlFixture = require('../../../lib/test/fixtures/getSmlFixture'); -const SimplifiedMasternodeList = require('../../../lib/core/SimplifiedMasternodeList'); - -describe('SimplifiedMasternodeList', function SimplifiedMasternodeListTest() { - let simplifiedMasternodeList; - let smlMaxListsLimit; - let initialSmlDiffs; - let updatedSmlDiffs; - - this.timeout(10000); - - beforeEach(() => { - simplifiedMasternodeList = new SimplifiedMasternodeList({ - smlMaxListsLimit, - }); - - initialSmlDiffs = getSmlFixture().slice(0, 16); - updatedSmlDiffs = getSmlFixture().slice(16, 17); - }); - - it('should set options', async () => { - expect(simplifiedMasternodeList.options).to.deep.equal({ maxListsLimit: smlMaxListsLimit }); - }); - - describe('#applyDiffs', () => { - it('should create simplifiedMNList', async () => { - let simplifiedMNList = simplifiedMasternodeList.getStore(); - - expect(simplifiedMNList).to.deep.equal(undefined); - - simplifiedMasternodeList.applyDiffs(initialSmlDiffs); - - simplifiedMNList = simplifiedMasternodeList.getStore(); - - expect(simplifiedMNList.baseSimplifiedMNList.baseBlockHash).to.equal( - initialSmlDiffs[0].baseBlockHash, - ); - expect(simplifiedMNList.baseSimplifiedMNList.blockHash).to.equal( - initialSmlDiffs[0].blockHash, - ); - expect(simplifiedMNList.currentSML.baseBlockHash).to.equal( - initialSmlDiffs[0].baseBlockHash, - ); - expect(simplifiedMNList.currentSML.blockHash).to.equal( - initialSmlDiffs[initialSmlDiffs.length - 1].blockHash, - ); - }); - - it('should add diff to simplifiedMNList', async () => { - let simplifiedMNList = simplifiedMasternodeList.getStore(); - - expect(simplifiedMNList).to.deep.equal(undefined); - - simplifiedMasternodeList.applyDiffs(initialSmlDiffs); - - simplifiedMNList = simplifiedMasternodeList.getStore(); - - expect(simplifiedMNList.baseSimplifiedMNList.baseBlockHash).to.equal( - initialSmlDiffs[0].baseBlockHash, - ); - expect(simplifiedMNList.baseSimplifiedMNList.blockHash).to.equal( - initialSmlDiffs[0].blockHash, - ); - expect(simplifiedMNList.currentSML.baseBlockHash).to.equal( - initialSmlDiffs[0].baseBlockHash, - ); - expect(simplifiedMNList.currentSML.blockHash).to.equal( - initialSmlDiffs[initialSmlDiffs.length - 1].blockHash, - ); - - simplifiedMasternodeList.applyDiffs(updatedSmlDiffs); - - simplifiedMNList = simplifiedMasternodeList.getStore(); - - expect(simplifiedMNList.baseSimplifiedMNList.baseBlockHash).to.equal( - initialSmlDiffs[0].baseBlockHash, - ); - expect(simplifiedMNList.baseSimplifiedMNList.blockHash).to.equal( - initialSmlDiffs[0].blockHash, - ); - expect(simplifiedMNList.currentSML.baseBlockHash).to.equal( - initialSmlDiffs[0].baseBlockHash, - ); - expect(simplifiedMNList.currentSML.blockHash).to.equal( - updatedSmlDiffs[0].blockHash, - ); - }); - }); - - describe('#getStore', () => { - it('should return simplifiedMNList', async () => { - let simplifiedMNList = simplifiedMasternodeList.getStore(); - - expect(simplifiedMNList).to.deep.equal(undefined); - - simplifiedMasternodeList.applyDiffs(initialSmlDiffs); - - simplifiedMNList = simplifiedMasternodeList.getStore(); - - expect(simplifiedMNList).to.deep.equal(simplifiedMasternodeList.store); - }); - }); -}); diff --git a/packages/js-drive/test/integration/core/updateSimplifiedMasternodeListFactory.spec.js b/packages/js-drive/test/integration/core/updateSimplifiedMasternodeListFactory.spec.js deleted file mode 100644 index f494a542d87..00000000000 --- a/packages/js-drive/test/integration/core/updateSimplifiedMasternodeListFactory.spec.js +++ /dev/null @@ -1,92 +0,0 @@ -const { startDashCore } = require('@dashevo/dp-services-ctl'); -const SimplifiedMNListStore = require('@dashevo/dashcore-lib/lib/deterministicmnlist/SimplifiedMNListStore'); - -const createTestDIContainer = require('../../../lib/test/createTestDIContainer'); - -describe('updateSimplifiedMasternodeListFactory', function main() { - this.timeout(190000); - - let container; - let dashCore; - let dashCoreOptions; - - after(async () => { - if (dashCore) { - await dashCore.remove(); - } - }); - - afterEach(async () => { - if (container) { - await container.dispose(); - } - }); - - it('should wait until SML will be retrieved', async () => { - dashCore = await startDashCore(dashCoreOptions); - - container = await createTestDIContainer(dashCore); - - const simplifiedMasternodeList = container.resolve('simplifiedMasternodeList'); - - expect(simplifiedMasternodeList.getStore()).to.equal(undefined); - - const { result: randomAddress } = await dashCore.getApi().getNewAddress({ wallet: 'main' }); - - await dashCore.getApi().generateToAddress(1000, randomAddress); - - const updateSimplifiedMasternodeList = container.resolve('updateSimplifiedMasternodeList'); - - await updateSimplifiedMasternodeList(1000); - - expect(simplifiedMasternodeList.getStore()) - .to.be.an.instanceOf(SimplifiedMNListStore); - }); - - it('should update SML Store so other consumers can use it', async () => { - dashCore = await startDashCore(dashCoreOptions); - - container = await createTestDIContainer(dashCore); - - // Create initial state - const groveDBStore = container.resolve('groveDBStore'); - await groveDBStore.startTransaction(); - - const rsDrive = container.resolve('rsDrive'); - await rsDrive.createInitialStateStructure(true); - - const simplifiedMasternodeList = container.resolve('simplifiedMasternodeList'); - const updateSimplifiedMasternodeList = container.resolve('updateSimplifiedMasternodeList'); - const synchronizeMasternodeIdentities = container.resolve('synchronizeMasternodeIdentities'); - const smlMaxListsLimit = container.resolve('smlMaxListsLimit'); - - const api = dashCore.getApi(); - const { result: randomAddress } = await api.getNewAddress({ wallet: 'main' }); - - await api.generateToAddress(600, randomAddress); - - let blockNumber = 500; - - await updateSimplifiedMasternodeList(blockNumber); - await synchronizeMasternodeIdentities(blockNumber); - - expect(simplifiedMasternodeList.getStore()) - .to.be.an.instanceOf(SimplifiedMNListStore); - - blockNumber += smlMaxListsLimit; - - await updateSimplifiedMasternodeList(blockNumber); - await synchronizeMasternodeIdentities(blockNumber); - - expect(simplifiedMasternodeList.getStore()) - .to.be.an.instanceOf(SimplifiedMNListStore); - - blockNumber += smlMaxListsLimit; - - await updateSimplifiedMasternodeList(blockNumber); - await synchronizeMasternodeIdentities(blockNumber); - - expect(simplifiedMasternodeList.getStore()) - .to.be.an.instanceOf(SimplifiedMNListStore); - }); -}); diff --git a/packages/js-drive/test/integration/core/waitForCoreSyncFactory.spec.js b/packages/js-drive/test/integration/core/waitForCoreSyncFactory.spec.js deleted file mode 100644 index 9859e6d8c96..00000000000 --- a/packages/js-drive/test/integration/core/waitForCoreSyncFactory.spec.js +++ /dev/null @@ -1,54 +0,0 @@ -const { startDashCore } = require('@dashevo/dp-services-ctl'); - -const createTestDIContainer = require('../../../lib/test/createTestDIContainer'); - -describe('waitForCoreSyncFactory', function main() { - this.timeout(90000); - - let firstDashCore; - let secondDashCore; - let container; - let waitForCoreSync; - - after(async () => { - if (firstDashCore) { - await firstDashCore.remove(); - } - - if (secondDashCore) { - await secondDashCore.remove(); - } - }); - - afterEach(async () => { - if (container) { - await container.dispose(); - } - }); - - it('should wait until Dash Core in regtest mode with peers is synced', async () => { - firstDashCore = await startDashCore(); - const { result: randomAddress } = await firstDashCore.getApi().getNewAddress({ wallet: 'main' }); - await firstDashCore.getApi().generateToAddress(1000, randomAddress); - - secondDashCore = await startDashCore(); - await secondDashCore.connect(firstDashCore); - - container = await createTestDIContainer(secondDashCore); - waitForCoreSync = container.resolve('waitForCoreSync'); - - await waitForCoreSync(() => {}); - - const secondApi = secondDashCore.getApi(); - - const { - result: { - blocks: currentBlockHeight, - headers: currentHeadersNumber, - }, - } = await secondApi.getBlockchainInfo(); - - expect(currentHeadersNumber).to.equal(1000); - expect(currentBlockHeight).to.equal(1000); - }); -}); diff --git a/packages/js-drive/test/integration/createDIContainer.spec.js b/packages/js-drive/test/integration/createDIContainer.spec.js deleted file mode 100644 index 13112ee7935..00000000000 --- a/packages/js-drive/test/integration/createDIContainer.spec.js +++ /dev/null @@ -1,40 +0,0 @@ -const { expect } = require('chai'); - -const createTestDIContainer = require('../../lib/test/createTestDIContainer'); - -describe('createDIContainer', function describeContainer() { - this.timeout(25000); - - let container; - - beforeEach(async () => { - container = await createTestDIContainer(); - }); - - afterEach(async () => { - if (container) { - await container.dispose(); - } - }); - - it('should create DI container', async () => { - expect(container).to.respondTo('register'); - expect(container).to.respondTo('resolve'); - }); - - describe('container', () => { - it('should resolve abciHandlers', () => { - const abciHandlers = container.resolve('abciHandlers'); - - expect(abciHandlers).to.have.property('info'); - expect(abciHandlers).to.have.property('checkTx'); - expect(abciHandlers).to.have.property('finalizeBlock'); - expect(abciHandlers).to.have.property('extendVote'); - expect(abciHandlers).to.have.property('initChain'); - expect(abciHandlers).to.have.property('prepareProposal'); - expect(abciHandlers).to.have.property('processProposal'); - expect(abciHandlers).to.have.property('verifyVoteExtension'); - expect(abciHandlers).to.have.property('query'); - }); - }); -}); diff --git a/packages/js-drive/test/integration/dataContract/DataContractStoreRepository.spec.js b/packages/js-drive/test/integration/dataContract/DataContractStoreRepository.spec.js deleted file mode 100644 index a8be383ef27..00000000000 --- a/packages/js-drive/test/integration/dataContract/DataContractStoreRepository.spec.js +++ /dev/null @@ -1,438 +0,0 @@ -const rimraf = require('rimraf'); -const Drive = require('@dashevo/rs-drive'); -const decodeProtocolEntityFactory = require('@dashevo/dpp/lib/decodeProtocolEntityFactory'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const DataContract = require('@dashevo/dpp/lib/dataContract/DataContract'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); -const GroveDBStore = require('../../../lib/storage/GroveDBStore'); -const DataContractStoreRepository = require('../../../lib/dataContract/DataContractStoreRepository'); -const noopLogger = require('../../../lib/util/noopLogger'); -const StorageResult = require('../../../lib/storage/StorageResult'); -const BlockInfo = require('../../../lib/blockExecution/BlockInfo'); - -describe('DataContractStoreRepository', () => { - let rsDrive; - let store; - let repository; - let decodeProtocolEntity; - let dataContract; - let blockInfo; - - beforeEach(async () => { - rsDrive = new Drive('./db/grovedb_test', { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - store = new GroveDBStore(rsDrive, noopLogger); - - await rsDrive.createInitialStateStructure(); - - decodeProtocolEntity = decodeProtocolEntityFactory(); - - repository = new DataContractStoreRepository(store, decodeProtocolEntity, noopLogger); - - dataContract = getDataContractFixture(); - - blockInfo = new BlockInfo(1, 1, Date.now()); - }); - - afterEach(async () => { - await rsDrive.close(); - rimraf.sync('./db/grovedb_test'); - }); - - describe('#create', () => { - it('should store Data Contract', async () => { - const result = await repository.create( - dataContract, - blockInfo, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const encodedDataContractResult = await store.get( - DataContractStoreRepository.TREE_PATH.concat([dataContract.getId().toBuffer()]), - DataContractStoreRepository.DATA_CONTRACT_KEY, - ); - - const [protocolVersion, rawDataContract] = decodeProtocolEntity( - encodedDataContractResult.getValue(), - ); - - rawDataContract.protocolVersion = protocolVersion; - - const fetchedDataContract = new DataContract(rawDataContract); - - expect(dataContract.toObject()).to.deep.equal(fetchedDataContract.toObject()); - }); - - it('should store Data Contract using transaction', async () => { - await store.startTransaction(); - - const result = await repository.create( - dataContract, - blockInfo, - { useTransaction: true }, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const notFoundDataContractResult = await store.get( - DataContractStoreRepository.TREE_PATH, - dataContract.getId().toBuffer(), - { useTransaction: false }, - ); - - expect(notFoundDataContractResult.getValue()).to.be.null(); - - const dataFromTransactionResult = await store.get( - DataContractStoreRepository.TREE_PATH.concat([dataContract.getId().toBuffer()]), - DataContractStoreRepository.DATA_CONTRACT_KEY, - { useTransaction: true }, - ); - - let [protocolVersion, rawDataContract] = decodeProtocolEntity( - dataFromTransactionResult.getValue(), - ); - - rawDataContract.protocolVersion = protocolVersion; - - const fetchedDataContract = new DataContract(rawDataContract); - - expect(dataContract.toObject()).to.deep.equal(fetchedDataContract.toObject()); - - await store.commitTransaction(); - - const committedDataResult = await store.get( - DataContractStoreRepository.TREE_PATH.concat([dataContract.getId().toBuffer()]), - DataContractStoreRepository.DATA_CONTRACT_KEY, - ); - - [protocolVersion, rawDataContract] = decodeProtocolEntity(committedDataResult.getValue()); - - rawDataContract.protocolVersion = protocolVersion; - - const fetchedOneMoreDataContract = new DataContract(rawDataContract); - - expect(dataContract.toObject()).to.deep.equal(fetchedOneMoreDataContract.toObject()); - }); - - it('should not store Data Contract with dry run', async () => { - const result = await repository.create( - dataContract, - blockInfo, - { dryRun: true }, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const encodedDataContractResult = await store.get( - DataContractStoreRepository.TREE_PATH, - dataContract.getId().toBuffer(), - ); - - expect(encodedDataContractResult.isNull()).to.be.true(); - }); - }); - - describe('#update', () => { - beforeEach(async () => { - await repository.create(dataContract, blockInfo); - }); - - it('should store Data Contract', async () => { - const result = await repository.update( - dataContract, - blockInfo, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const encodedDataContractResult = await store.get( - DataContractStoreRepository.TREE_PATH.concat([dataContract.getId().toBuffer()]), - DataContractStoreRepository.DATA_CONTRACT_KEY, - ); - - const [protocolVersion, rawDataContract] = decodeProtocolEntity( - encodedDataContractResult.getValue(), - ); - - rawDataContract.protocolVersion = protocolVersion; - - const fetchedDataContract = new DataContract(rawDataContract); - - expect(dataContract.toObject()).to.deep.equal(fetchedDataContract.toObject()); - }); - - it('should store Data Contract using transaction', async () => { - await store.startTransaction(); - - dataContract.incrementVersion(); - - const result = await repository.update( - dataContract, - blockInfo, - { useTransaction: true }, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const dataContractWithoutTransactionResult = await repository.fetch(dataContract.getId()); - - expect(dataContractWithoutTransactionResult.isNull()).to.be.false(); - expect(dataContractWithoutTransactionResult.getValue().getVersion()).to.equals(1); - - const dataContractWithTransactionResult = await repository.fetch(dataContract.getId(), { - useTransaction: true, - }); - - expect(dataContractWithTransactionResult.isNull()).to.be.false(); - - const fetchedDataContract = dataContractWithTransactionResult.getValue(); - - expect(fetchedDataContract.getVersion()).to.equals(2); - - expect(fetchedDataContract.toObject()).to.deep.equal(dataContract.toObject()); - }); - - it('should not store Data Contract with dry run', async () => { - dataContract.incrementVersion(); - - const result = await repository.update( - dataContract, - blockInfo, - { dryRun: true }, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const dataContractResult = await repository.fetch(dataContract.getId()); - - expect(dataContractResult.isNull()).to.be.false(); - - const fetchedDataContract = dataContractResult.getValue(); - - expect(fetchedDataContract.getVersion()).to.equals(1); - - expect(fetchedDataContract.toObject()).to.not.deep.equal(dataContract.toObject()); - }); - }); - - describe('#fetch', () => { - it('should should fetch null if Data Contract not found', async () => { - const result = await repository.fetch(dataContract.getId()); - - expect(result).to.be.instanceOf(StorageResult); - // TODO: Processing fees are ignored for v0.23 - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.null(); - }); - - it('should fetch Data Contract', async () => { - await store.getDrive().createContract(dataContract, blockInfo, false); - - const result = await repository.fetch(dataContract.getId()); - - expect(result).to.be.instanceOf(StorageResult); - - // TODO: Processing fees are ignored for v0.23 - expect(result.getOperations().length).to.equal(0); - - const storedDataContract = result.getValue(); - - expect(storedDataContract).to.be.an.instanceof(DataContract); - expect(storedDataContract.toObject()).to.deep.equal(storedDataContract.toObject()); - }); - - it('should fetch Data Contract using transaction', async () => { - await store.startTransaction(); - - await store.getDrive().createContract(dataContract, blockInfo, true); - - const notFoundDataContractResult = await repository.fetch(dataContract.getId(), { - useTransaction: false, - }); - - expect(notFoundDataContractResult.isNull()).to.be.true(); - - const transactionalDataContractResult = await repository.fetch(dataContract.getId(), { - useTransaction: true, - }); - - const transactionalDataContract = transactionalDataContractResult.getValue(); - - expect(transactionalDataContract).to.be.an.instanceof(DataContract); - expect(transactionalDataContract.toObject()).to.deep.equal(dataContract.toObject()); - - await store.commitTransaction(); - - const storedDataContractResult = await repository.fetch(dataContract.getId()); - - const storedDataContract = storedDataContractResult.getValue(); - - expect(storedDataContract).to.be.an.instanceof(DataContract); - expect(storedDataContract.toObject()).to.deep.equal(dataContract.toObject()); - }); - - it('should fetch null on dry run', async () => { - await store.getDrive().createContract(dataContract, blockInfo, false); - - const result = await repository.fetch(dataContract.getId(), { dryRun: true }); - - expect(result).to.be.instanceOf(StorageResult); - // TODO: Processing fees are ignored for v0.23 - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.null(); - }); - }); - - describe('#prove', () => { - it('should should return proof if Data Contract not found', async () => { - const result = await repository.prove(dataContract.getId()); - - expect(result).to.be.instanceOf(StorageResult); - // TODO: Processing fees are ignored for v0.23 - expect(result.getOperations().length).to.equal(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceof(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should return proof', async () => { - await store.getDrive().createContract(dataContract, blockInfo, false); - - const result = await repository.prove(dataContract.getId()); - - expect(result).to.be.instanceOf(StorageResult); - // TODO: Processing fees are ignored for v0.23 - expect(result.getOperations().length).to.equal(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceof(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - // TODO enable this test when we support transactions - it.skip('should return proof using transaction', async () => { - await store.startTransaction(); - - await store.getDrive().createContract(dataContract, blockInfo, true); - - const notFoundDataContractResult = await repository.prove(dataContract.getId(), { - useTransaction: false, - }); - - expect(notFoundDataContractResult.isNull()).to.be.true(); - - const transactionalDataContractResult = await repository.prove(dataContract.getId(), { - useTransaction: true, - }); - - const transactionalDataContract = transactionalDataContractResult.getValue(); - - expect(transactionalDataContract).to.be.an.instanceof(Buffer); - - await store.commitTransaction(); - - const storedDataContractResult = await repository.prove(dataContract.getId()); - - const storedDataContract = storedDataContractResult.getValue(); - - expect(storedDataContract).to.be.an.instanceof(Buffer); - }); - }); - - describe('#proveMany', () => { - let dataContract2; - - beforeEach(async () => { - dataContract2 = new DataContract(dataContract.toObject()); - dataContract2.id = generateRandomIdentifier(); - }); - - it('should should return proof if Data Contract not found', async () => { - const result = await repository.proveMany([dataContract.getId(), dataContract2.getId()]); - - expect(result).to.be.instanceOf(StorageResult); - // TODO: Processing fees are ignored for v0.23 - expect(result.getOperations().length).to.equal(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceof(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should return proof', async () => { - await store.getDrive().createContract(dataContract, blockInfo, false); - await store.getDrive().createContract(dataContract2, blockInfo, false); - - const result = await repository.proveMany([dataContract.getId(), dataContract2.getId()]); - - expect(result).to.be.instanceOf(StorageResult); - // TODO: Processing fees are ignored for v0.23 - expect(result.getOperations().length).to.equals(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceof(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - // TODO enable this test when we support transactions - it.skip('should return proof using transaction', async () => { - await store.startTransaction(); - - await store.getDrive().createContract(dataContract, blockInfo, true); - await store.getDrive().createContract(dataContract2, blockInfo, true); - - const notFoundDataContractResult = await repository.prove( - [dataContract.getId(), dataContract2.getId()], { - useTransaction: false, - }, - ); - - expect(notFoundDataContractResult.getValue()).to.be.null(); - - const transactionalDataContractResult = await repository.proveMany( - [dataContract.getId(), dataContract2.getId()], - { useTransaction: true }, - ); - - const transactionalDataContract = transactionalDataContractResult.getValue(); - - expect(transactionalDataContract).to.be.an.instanceof(Buffer); - - await store.commitTransaction(); - - const storedDataContractResult = await repository.proveMany( - [dataContract.getId(), dataContract2.getId()], - ); - - const storedDataContract = storedDataContractResult.getValue(); - - expect(storedDataContract).to.be.an.instanceof(Buffer); - }); - }); -}); diff --git a/packages/js-drive/test/integration/document/DocumentRepository.spec.js b/packages/js-drive/test/integration/document/DocumentRepository.spec.js deleted file mode 100644 index 803e6673f77..00000000000 --- a/packages/js-drive/test/integration/document/DocumentRepository.spec.js +++ /dev/null @@ -1,3408 +0,0 @@ -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const Document = require('@dashevo/dpp/lib/document/Document'); -const DataContractFactory = require('@dashevo/dpp/lib/dataContract/DataContractFactory'); -const createDPPMock = require('@dashevo/dpp/lib/test/mocks/createDPPMock'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); -const createTestDIContainer = require('../../../lib/test/createTestDIContainer'); -const createDocumentTypeTreePath = require('../../../lib/document/groveDB/createDocumentTreePath'); -const InvalidQueryError = require('../../../lib/document/errors/InvalidQueryError'); -const StorageResult = require('../../../lib/storage/StorageResult'); -const BlockInfo = require('../../../lib/blockExecution/BlockInfo'); - -function ucFirst(string) { - return string.charAt(0).toUpperCase() + string.slice(1); -} - -const typesTestCases = { - number: { - type: 'number', - value: 1, - }, - boolean: { - type: 'boolean', - value: true, - }, - string: { - type: 'string', - value: 'test', - }, - null: { - type: 'null', - value: null, - }, - undefined: { - type: 'undefined', - value: undefined, - }, - object: { - type: 'object', - value: {}, - }, - buffer: { - type: 'buffer', - value: Buffer.alloc(32), - }, -}; - -const notObjectTestCases = [ - typesTestCases.number, - typesTestCases.boolean, - typesTestCases.string, - typesTestCases.null, -]; - -const notArrayTestCases = [ - typesTestCases.number, - typesTestCases.boolean, - typesTestCases.string, - typesTestCases.null, - typesTestCases.object, -]; - -const nonScalarTestCases = [ - typesTestCases.null, - typesTestCases.undefined, - typesTestCases.object, -]; - -const scalarTestCases = [ - typesTestCases.number, - typesTestCases.string, - typesTestCases.boolean, - typesTestCases.buffer, -]; - -const nonNumberTestCases = [ - typesTestCases.string, - typesTestCases.boolean, - typesTestCases.null, - typesTestCases.undefined, - typesTestCases.object, - typesTestCases.buffer, -]; - -const nonNumberNullAndUndefinedTestCases = [ - typesTestCases.string, - typesTestCases.boolean, - typesTestCases.object, - typesTestCases.buffer, -]; - -const validFieldNameTestCases = [ - 'a', - 'a.b', - 'a.b.c', - 'array.element', - 'a.0', - 'a.0.b', - 'a_._b', - 'a-b.c_', - '$id', - '$ownerId', - '$createdAt', - '$updatedAt', -]; - -const invalidFieldNameTestCases = [ - '$a', - '$#1321', - 'a...', - '.a', - 'a.b.c.', -]; - -const validOrderByOperators = [ - { - operator: '>', - value: 42, - documentType: 'documentNumber', - }, - { - operator: '<', - value: 42, - documentType: 'documentNumber', - }, - { - operator: 'startsWith', - value: 'rt-', - documentType: 'documentString', - }, - { - operator: 'in', - value: [1, 2], - documentType: 'documentNumber', - }, -]; - -const queryDocumentSchema = { - testDocument: { - type: 'object', - properties: { - firstName: { - type: 'string', - }, - lastName: { - type: 'string', - }, - a: { - type: 'integer', - }, - b: { - type: 'integer', - }, - c: { - type: 'integer', - }, - d: { - type: 'integer', - }, - e: { - type: 'integer', - }, - }, - required: ['$createdAt'], - additionalProperties: false, - indices: [ - { - name: 'one', - properties: [ - { firstName: 'asc' }, - ], - }, - { - name: 'two', - properties: [ - { a: 'asc' }, - { b: 'asc' }, - { c: 'asc' }, - { d: 'asc' }, - { e: 'asc' }, - ], - }, - { - name: 'three', - properties: [ - { firstName: 'asc' }, - { lastName: 'asc' }, - ], - }, - ], - }, - documentA: { - type: 'object', - properties: { - firstName: { - type: 'string', - }, - }, - additionalProperties: false, - indices: [ - { - name: 'one', - properties: [{ $id: 'asc' }], - }, - ], - }, - documentB: { - type: 'object', - additionalProperties: false, - properties: { - firstName: { - type: 'string', - }, - }, - indices: [ - { - properties: [{ $id: 'asc' }], - unique: true, - }, - ], - }, - documentC: { - type: 'object', - additionalProperties: false, - properties: { - a: { - type: 'integer', - }, - b: { - type: 'integer', - }, - }, - indices: [ - { - properties: [{ a: 'asc' }, { b: 'asc' }], - }, - ], - }, - documentD: { - // no index - type: 'object', - additionalProperties: false, - properties: { - firstName: { - type: 'string', - }, - }, - }, - documentE: { - type: 'object', - additionalProperties: false, - properties: { - a: { - type: 'string', - }, - b: { - type: 'string', - }, - }, - indices: [ - { - properties: [{ a: 'asc' }, { b: 'asc' }], - }, - ], - }, - documentF: { - type: 'object', - additionalProperties: false, - properties: { - a: { - type: 'integer', - }, - b: { - type: 'integer', - }, - c: { - type: 'integer', - }, - }, - indices: [ - { - properties: [{ a: 'asc' }, { b: 'asc' }, { c: 'asc' }], - }, - ], - }, - documentG: { - type: 'object', - additionalProperties: false, - properties: { - a: { - type: 'integer', - }, - b: { - type: 'integer', - }, - }, - indices: [ - { - properties: [{ b: 'asc' }, { a: 'asc' }], - }, - { - properties: [{ a: 'asc' }, { b: 'asc' }], - }, - ], - }, - documentH: { - type: 'object', - additionalProperties: false, - properties: { - firstName: { - type: 'string', - }, - }, - indices: [ - { - properties: [{ $updatedAt: 'asc' }], - }, - ], - required: ['$updatedAt'], - }, - documentI: { - type: 'object', - additionalProperties: false, - properties: { - firstName: { - type: 'string', - }, - }, - indices: [ - { - properties: [{ $createdAt: 'asc' }], - }, - ], - required: ['$createdAt'], - }, - documentJ: { - type: 'object', - additionalProperties: false, - properties: { - a: { - type: 'integer', - }, - b: { - type: 'integer', - }, - c: { - type: 'integer', - }, - d: { - type: 'integer', - }, - e: { - type: 'integer', - }, - }, - indices: [ - { - name: 'index1', - properties: [ - { a: 'asc' }, - { b: 'asc' }, - { c: 'asc' }, - { d: 'asc' }, - { e: 'asc' }, - ], - unique: true, - }, - ], - }, - documentK: { - type: 'object', - additionalProperties: false, - properties: { - a: { - type: 'string', - }, - b: { - type: 'string', - }, - }, - indices: [ - { - properties: [{ b: 'asc' }], - }, - ], - }, - documentL: { - type: 'object', - additionalProperties: false, - properties: { - a: { - type: 'integer', - }, - b: { - type: 'integer', - }, - c: { - type: 'integer', - }, - d: { - type: 'integer', - }, - }, - indices: [ - { - name: 'index1', - properties: [ - { a: 'asc' }, - { b: 'asc' }, - { c: 'asc' }, - { d: 'asc' }, - ], - unique: true, - }, - ], - }, -}; - -for (const fieldName of validFieldNameTestCases) { - queryDocumentSchema[`document${fieldName}`] = { - type: 'object', - properties: { - [fieldName]: { - type: 'integer', - }, - }, - additionalProperties: false, - indices: [ - { - name: 'one', - properties: [{ [fieldName]: 'asc' }], - }, - ], - }; -} - -for (const type of ['number', 'string', 'boolean', 'buffer']) { - const properties = { - a: { - type, - }, - }; - - if (type === 'buffer') { - properties.a.type = 'array'; - properties.a.byteArray = true; - } - - queryDocumentSchema[`document${ucFirst(type)}`] = { - type: 'object', - properties, - additionalProperties: false, - indices: [ - { - name: 'one', - properties: [{ a: 'asc' }], - }, - ], - }; -} - -queryDocumentSchema.documentBig = { - type: 'object', - properties: Array(256).fill().map((v, i) => `a${i}`).reduce((res, key) => { - res[key] = { - type: 'integer', - }; - - return res; - }, {}), - additionalProperties: false, - indices: Array(256).fill().map((v, i) => ({ - properties: [{ [`a${i}`]: 'asc' }], - })), -}; - -const validQueries = [ - {}, - { - where: [['$id', 'in', [ - generateRandomIdentifier(), - generateRandomIdentifier(), - generateRandomIdentifier(), - ]]], - orderBy: [['$id', 'asc']], - }, - { - where: [ - ['a', '==', 1], - ['b', '==', 2], - ['c', '==', 3], - ['d', 'in', [1, 2]], - ], - orderBy: [ - ['d', 'desc'], - ['e', 'asc'], - ], - }, - { - where: [ - ['a', '==', 1], - ['b', '==', 2], - ['c', '==', 3], - ['d', 'in', [1, 2]], - ['e', '>', 3], - ], - orderBy: [ - ['d', 'desc'], - ['e', 'asc'], - ], - }, - { - where: [ - ['firstName', '>', 'Chris'], - ['firstName', '<=', 'Noellyn'], - ], - orderBy: [ - ['firstName', 'asc'], - ], - }, - { - where: [ - ['firstName', '==', '1'], - ['lastName', '==', '2'], - ], - limit: 1, - }, -]; - -const invalidQueries = [ - { - query: { - where: [ - ['a', '==', 1], - ['b', '==', 2], - ], - }, - error: 'query is too far from index: query must better match an existing index', - }, - { - query: { - where: [ - ['a', '==', 1], - ['b', '==', 2], - ['c', 'in', [1, 2]], - ], - orderBy: [ - ['c', 'desc'], - ], - }, - error: 'where clause on non indexed property error: query must be for valid indexes', - }, - { - query: { - where: [ - ['a', '==', 1], - ['b', '==', 2], - ['b', 'in', [1, 2]], - ], - orderBy: [ - ['b', 'desc'], - ], - }, - error: 'duplicate non groupable clause on same field error: in clause has same field as an equality clause', - }, - { - query: { - where: [ - ['z', '==', 1], - ], - }, - error: 'where clause on non indexed property error: query must be for valid indexes', - }, - { - query: { - where: [ - ['a', '==', 1], - ['b', '==', 2], - ['c', '>', 3], - ['d', 'in', [1, 2]], - ['e', '>', 3], - ], - }, - error: 'multiple range clauses error: all ranges must be on same field', - }, - { - query: { - where: [ - ['a', '==', 1], - ['b', '==', 2], - ['c', '>', 3], - ['d', '>', 3], - ], - orderBy: [ - ['c', 'asc'], - ['d', 'desc'], - ], - }, - error: 'multiple range clauses error: all ranges must be on same field', - }, - { - query: { - where: [ - ['a', '==', 3], - ['b', '==', 2], - ['c', '>', 1], - ], - }, - error: 'missing order by for range error: query must have an orderBy field for each range element', - }, - { - query: { - where: [ - ['a', '==', 3], - ['b', '==', 2], - ['c', '==', 3], - ['d', 'in', [1, 2]], - ['e', '<', 1], - ], - orderBy: [ - ['e', 'asc'], - ['d', 'asc'], - ], - }, - error: 'where clause on non indexed property error: query must be for valid indexes', - }, - { - query: 'abc', - error: 'deserialization error: unable to decode query from cbor', - }, - { - query: [], - error: 'deserialization error: unable to decode query from cbor', - }, - { - query: { where: [1, 2, 3] }, - error: 'query invalid format for where clause error: where clause must be an array', - }, - { - query: { invalid: 'query' }, - error: 'unsupported error: unsupported syntax in where clause', - }, -]; - -const invalidOperators = ['<<', '<==', '===', '!>', '>>=']; - -async function createDocuments(documentRepository, documents, blockInfo) { - return Promise.all( - documents.map(async (o) => { - const result = await documentRepository.create(o, blockInfo); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - }), - ); -} - -describe('DocumentRepository', function main() { - this.timeout(30000); - - let documentRepository; - let dataContractRepository; - let container; - let dataContract; - let queryDataContract; - let documents; - let document; - let documentSchema; - let blockInfo; - - beforeEach(async function beforeEach() { - const now = 86400; - container = await createTestDIContainer(); - - dataContract = getDataContractFixture(); - documents = getDocumentsFixture(dataContract).slice(0, 5); - - [document] = documents; - - // Modify documents for the test cases - documents = documents.map((doc, i) => { - const currentDocument = doc; - // const arrayItem = { item: i + 1, flag: true }; - - currentDocument.set('order', i); - currentDocument.set('$createdAt', now); - // currentDocument.set('arrayWithScalar', Array(i + 1) - // .fill(1) - // .map((item, index) => i + index)); - // currentDocument.set('arrayWithObjects', Array(i + 1).fill(arrayItem)); - currentDocument.type = document.getType(); - - return currentDocument; - }); - - [document] = documents; - - dataContract.documents[document.getType()].properties = { - ...dataContract.documents[document.getType()].properties, - name: { - type: 'string', - maxLength: 63, - }, - order: { - type: 'number', - }, - lastName: { - type: 'string', - maxLength: 63, - }, - // arrayWithScalar: { - // type: 'array', - // items: [ - // { type: 'string' }, - // ], - // }, - // arrayWithObjects: { - // type: 'array', - // items: { - // type: 'object', - // properties: { - // flag: { - // type: 'string', - // }, - // }, - // }, - // }, - }; - - const documentsSchema = dataContract.getDocuments(); - - documentSchema = documentsSchema[document.getType()]; - - // redeclare indices - const indices = documentSchema.indices || []; - documentSchema.indices = indices.concat([ - { - name: 'index1', - properties: [{ name: 'asc' }], - }, - // { - // name: 'index2', - // - // properties: [{ name: 'asc' }, { 'arrayWithObjects.item': 'asc' }], - // }, - { - name: 'index3', - properties: [{ order: 'asc' }], - }, - { - name: 'index4', - properties: [{ lastName: 'asc' }], - }, - // { - // name: 'index5', - // properties: [{ arrayWithScalar: 'asc' }], - // }, - // { - // name: 'index6', - // properties: [{ arrayWithObjects: 'asc' }], - // }, - // { - // name: 'index7', - // properties: [{ 'arrayWithObjects.item': 'asc' }], - // }, - // { - // name: 'index8', - // properties: [{ 'arrayWithObjects.flag': 'asc' }], - // }, - // { - // name: 'index9', - // properties: [{ primaryOrder: 'asc' }, { order: 'desc' }], - // }, - { - name: 'index10', - properties: [{ $ownerId: 'asc' }], - }, - ]); - - const dpp = container.resolve('dpp'); - queryDataContract = dpp.dataContract.create(generateRandomIdentifier(), queryDocumentSchema); - - documentRepository = container.resolve('documentRepository'); - documentRepository.logger = { - info: this.sinon.stub(), - }; - - /** - * @type {Drive} - */ - const rsDrive = container.resolve('rsDrive'); - await rsDrive.createInitialStateStructure(); - - dataContractRepository = container.resolve('dataContractRepository'); - - blockInfo = new BlockInfo(1, 1, Date.now()); - - await dataContractRepository.create(dataContract, blockInfo); - await dataContractRepository.create(queryDataContract, blockInfo); - }); - - afterEach(async () => { - if (container) { - await container.dispose(); - } - }); - - describe('#create', () => { - beforeEach(async () => { - await createDocuments(documentRepository, documents, blockInfo); - }); - - it('should create Document', async () => { - const documentTypeTreePath = createDocumentTypeTreePath( - document.getDataContract(), - document.getType(), - ); - - const documentTreePath = documentTypeTreePath.concat( - [Buffer.from([0])], - ); - - const result = await documentRepository - .storage - .db - .get(documentTreePath, document.getId().toBuffer(), false); - - expect(document.toBuffer()).to.deep.equal(result.value); - }); - - it('should create Document in transaction', async () => { - await documentRepository.delete( - dataContract, - document.getType(), - document.getId(), - blockInfo, - ); - - await documentRepository - .storage - .startTransaction(); - - await documentRepository.create(document, blockInfo, { - useTransaction: true, - }); - - const documentTypeTreePath = createDocumentTypeTreePath( - document.getDataContract(), - document.getType(), - ); - - const documentTreePath = documentTypeTreePath.concat( - [Buffer.from([0])], - ); - - const transactionDocument = await documentRepository - .storage - .db - .get(documentTreePath, document.getId().toBuffer(), true); - - try { - await documentRepository - .storage - .db - .get(documentTreePath, document.getId().toBuffer(), false); - - expect.fail('should fail with NotFoundError error'); - } catch (e) { - expect(e.message.startsWith('grovedb: path key not found: key not found in Merk')).to.be.true(); - } - - await documentRepository.storage.commitTransaction(); - - const createdDocument = await documentRepository - .storage - .db - .get(documentTreePath, document.getId().toBuffer(), false); - - expect(document.toBuffer()).to.deep.equal(transactionDocument.value); - expect(document.toBuffer()).to.deep.equal(createdDocument.value); - }); - - it('should not create Document on dry run', async () => { - await documentRepository.delete( - dataContract, - document.getType(), - document.getId(), - blockInfo, - ); - - await documentRepository.create(document, blockInfo, { - dryRun: true, - }); - - const documentTypeTreePath = createDocumentTypeTreePath( - document.getDataContract(), - document.getType(), - ); - - const documentTreePath = documentTypeTreePath.concat( - [Buffer.from([0])], - ); - - try { - await documentRepository - .storage - .db - .get(documentTreePath, document.getId().toBuffer()); - - expect.fail('should fail with NotFoundError error'); - } catch (e) { - expect(e.message.startsWith('grovedb: path key not found: key not found in Merk')).to.be.true(); - } - }); - }); - - describe('#update', () => { - let replaceDocument; - - beforeEach(async () => { - await createDocuments(documentRepository, documents, blockInfo); - - replaceDocument = new Document({ - ...documents[1].toObject(), - lastName: 'NotSoShiny', - }, dataContract); - }); - - it('should update Document', async () => { - const updateResult = await documentRepository.update(replaceDocument, blockInfo); - - expect(updateResult).to.be.instanceOf(StorageResult); - expect(updateResult.getOperations().length).to.be.greaterThan(0); - - const documentTypeTreePath = createDocumentTypeTreePath( - replaceDocument.getDataContract(), - replaceDocument.getType(), - ); - - const documentTreePath = documentTypeTreePath.concat( - [Buffer.from([0])], - ); - - const result = await documentRepository - .storage - .db - .get(documentTreePath, replaceDocument.getId().toBuffer(), false); - - expect(replaceDocument.toBuffer()).to.deep.equal(result.value); - }); - - it('should store Document in transaction', async () => { - await documentRepository - .storage - .startTransaction(); - - const updateResult = await documentRepository.update(replaceDocument, blockInfo, { - useTransaction: true, - }); - - expect(updateResult).to.be.instanceOf(StorageResult); - expect(updateResult.getOperations().length).to.be.greaterThan(0); - - const documentTypeTreePath = createDocumentTypeTreePath( - replaceDocument.getDataContract(), - replaceDocument.getType(), - ); - - const documentTreePath = documentTypeTreePath.concat( - [Buffer.from([0])], - ); - - const transactionDocument = await documentRepository - .storage - .db - .get(documentTreePath, replaceDocument.getId().toBuffer(), true); - - const notUpdatedDocument = await documentRepository - .storage - .db - .get(documentTreePath, replaceDocument.getId().toBuffer(), false); - - await documentRepository.storage.commitTransaction(); - - const createdDocument = await documentRepository - .storage - .db - .get(documentTreePath, replaceDocument.getId().toBuffer(), false); - - expect(replaceDocument.toBuffer()).to.deep.equal(transactionDocument.value); - expect(replaceDocument.toBuffer()).to.deep.equal(createdDocument.value); - expect(documents[1].toBuffer()).to.deep.equal(notUpdatedDocument.value); - }); - - it('should not update Document on dry run', async () => { - const updateResult = await documentRepository.update(replaceDocument, blockInfo, { - dryRun: true, - }); - - expect(updateResult).to.be.instanceOf(StorageResult); - expect(updateResult.getOperations().length).to.be.greaterThan(0); - - const documentTypeTreePath = createDocumentTypeTreePath( - replaceDocument.getDataContract(), - replaceDocument.getType(), - ); - - const documentTreePath = documentTypeTreePath.concat( - [Buffer.from([0])], - ); - - const notUpdatedDocument = await documentRepository - .storage - .db - .get(documentTreePath, replaceDocument.getId().toBuffer(), false); - - expect(documents[1].toBuffer()).to.deep.equal(notUpdatedDocument.value); - }); - }); - - describe('#find', () => { - beforeEach(async () => { - await createDocuments(documentRepository, documents, blockInfo); - }); - - it('should find all existing documents', async () => { - const result = await documentRepository.find(dataContract, document.getType()); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.have.lengthOf(documents.length); - - const foundDocumentsBuffers = foundDocuments.map((doc) => doc.toBuffer()); - - expect(foundDocumentsBuffers).to.have.deep.members(documents.map((doc) => doc.toBuffer())); - }); - - it('should find all existing documents in transaction', async () => { - await documentRepository - .storage - .startTransaction(); - - const foundDocumentsResult = await documentRepository - .find(dataContract, document.getType(), { - useTransaction: true, - }); - - expect(foundDocumentsResult).to.be.instanceOf(StorageResult); - expect(foundDocumentsResult.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = foundDocumentsResult.getValue(); - - await documentRepository.storage.commitTransaction(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.have.lengthOf(documents.length); - - const foundDocumentsBuffers = foundDocuments.map((doc) => doc.toBuffer()); - - expect(foundDocumentsBuffers).to.have.deep.members(documents.map((doc) => doc.toBuffer())); - }); - - it('should fetch Documents with dry run', async () => { - await documentRepository - .storage - .startTransaction(); - - const foundDocumentsResult = await documentRepository - .find(dataContract, document.getType(), { - dryRun: true, - }); - - expect(foundDocumentsResult).to.be.instanceOf(StorageResult); - expect(foundDocumentsResult.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = foundDocumentsResult.getValue(); - - await documentRepository.storage.commitTransaction(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.have.lengthOf(documents.length); - - const foundDocumentsBuffers = foundDocuments.map((doc) => doc.toBuffer()); - - expect(foundDocumentsBuffers).to.have.deep.members(documents.map((doc) => doc.toBuffer())); - }); - - describe('queries', () => { - describe('valid queries', () => { - validQueries.forEach((query) => { - it(`should return valid result for query "${JSON.stringify(query)}"`, async () => { - const result = await documentRepository.find(queryDataContract, 'testDocument', query); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - - it('should return valid result if data contract has only system properties', async () => { - const schema = { - chat: { - type: 'object', - indices: [ - { - name: 'ownerAndCreatedAt', - properties: [ - { - $ownerId: 'asc', - }, - { - $createdAt: 'asc', - }, - ], - }, - ], - properties: { - test: { - type: 'string', - }, - }, - required: ['$createdAt'], - additionalProperties: false, - }, - }; - - const factory = new DataContractFactory(createDPPMock(), () => {}); - const ownerId = generateRandomIdentifier(); - const myDataContract = factory.create(ownerId, schema); - await dataContractRepository.create(myDataContract, blockInfo); - - const result = await documentRepository.find(myDataContract, 'chat', { - where: [ - ['$ownerId', '==', ownerId], - ['$createdAt', '>', new Date().getTime()], - ], - orderBy: [['$createdAt', 'asc']], - }); - - expect(result).to.be.instanceOf(StorageResult); - }); - - it('should return valid result for DPNS contract', async () => { - const schema = { - label: { - type: 'object', - properties: { - normalizedLabel: { - type: 'string', - }, - normalizedParentDomainName: { - type: 'string', - }, - }, - indices: [ - { - name: 'index1', - properties: [ - { - normalizedParentDomainName: 'asc', - }, - { - normalizedLabel: 'asc', - }, - ], - unique: true, - }, - ], - }, - }; - - const factory = new DataContractFactory(createDPPMock(), () => {}); - const ownerId = generateRandomIdentifier(); - const myDataContract = factory.create(ownerId, schema); - await dataContractRepository.create(myDataContract, blockInfo); - - const result = await documentRepository.find(myDataContract, 'label', { - where: [ - ['normalizedParentDomainName', '==', 'dash'], - ], - orderBy: [['normalizedLabel', 'asc']], - }); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - - describe('invalid queries', () => { - invalidQueries.forEach(({ query, error }) => { - it(`should throw InvalidQueryError for query "${JSON.stringify(query)}"`, async () => { - try { - await documentRepository.find(queryDataContract, 'testDocument', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(error); - } - }); - }); - - notObjectTestCases.forEach(({ type, value: query }) => { - it(`should return invalid result if query is a ${type}`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentA', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('deserialization error: unable to decode query from cbor'); - } - }); - }); - }); - - describe('where', () => { - it('should return empty array if where clause conditions do not match', async () => { - const query = { - where: [['name', '==', 'Dash enthusiast']], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.have.lengthOf(0); - }); - - it.skip('should find documents by nested object fields', async () => { - const query = { - where: [ - ['arrayWithObjects.item', '==', 2], - ], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.an('array'); - expect(result).to.be.lengthOf(1); - - const [expectedDocument] = result; - - expect(expectedDocument.toBuffer()).to.deep.equal(documents[1].toBuffer()); - }); - - it.skip('should return documents by several conditions', async () => { - const query = { - where: [ - ['name', '==', 'Cutie'], - ['arrayWithObjects.item', '==', 1], - ], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.an('array'); - expect(result).to.be.lengthOf(1); - - const [expectedDocument] = result; - - expect(expectedDocument.toBuffer()).to.deep.equal(documents[0].toBuffer()); - }); - - notArrayTestCases.forEach(({ type, value: query }) => { - it(`should return invalid result if "where" is not an array, but ${type}`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentA', { where: query }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('query invalid format for where clause error: where clause must be an array'); - } - }); - }); - - it('should return invalid result if "where" contains more than 10 conditions', async () => { - const where = Array(11).fill(['a', '<', 1]); - try { - await documentRepository.find(queryDataContract, 'documentA', { where }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('multiple range clauses error: there can only be at most 2 range clauses that must be on the same field'); - } - }); - - it('should return invalid result if "where" contains conflicting conditions', async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', '<', 1], - ['a', '>', 1], - ], - orderBy: [['a', 'asc']], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - } - }); - - it('should return invalid result if number of properties queried does not match number of indexed ones minus 2', async () => { - try { - await documentRepository.find(queryDataContract, 'documentL', { - where: [ - ['a', '==', 1], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('query is too far from index: query must better match an existing index'); - } - }); - - describe('condition', () => { - describe('property', () => { - it('should return valid result if condition contains "$id" field', async () => { - const result = await documentRepository.find(queryDataContract, 'documentB', { - where: - [['$id', '==', generateRandomIdentifier()]], - }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.isEmpty()).to.be.true(); - }); - - it('should return valid result if condition contains top-level field', async () => { - const result = await documentRepository.find(queryDataContract, 'documentE', { - where: [ - ['a', '==', '1'], - ], - }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.isEmpty()).to.be.true(); - }); - - it.skip('should return valid result if condition contains nested path field', async () => { - const result = await documentRepository.find(queryDataContract, 'documentD', { - where: - [['a.b', '==', '1']], - }); - - expect(result).to.be.instanceOf(StorageResult); - }); - - it('should return invalid result if property is not specified in document indices', async () => { - try { - await documentRepository.find(queryDataContract, 'documentD', { - where: [ - ['a', '==', '1'], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('where clause on non indexed property error: query must be for valid indexes'); - } - }); - }); - - it('should return invalid result if condition array has less than 3 elements (field, operator, value)', async () => { - try { - await documentRepository.find(queryDataContract, 'documentA', { - where: - [['a', '==']], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('invalid where clause components error: where clauses should have at most 3 components'); - } - }); - - it('should return invalid result if condition array has more than 3 elements (field, operator, value)', async () => { - try { - await documentRepository.find(queryDataContract, 'documentA', { - where: [ - [['a', '==', '1', '2']], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('invalid where clause components error: where clauses should have at most 3 components'); - } - }); - - describe('operators', () => { - describe('comparisons', () => { - invalidOperators.forEach((operator) => { - it('should return invalid result if condition contains invalid comparison operator', async () => { - const query = { where: [['a', operator, '1']] }; - if (operator !== '===') { - query.orderBy = [['a', 'asc']]; - } - - try { - await documentRepository.find(queryDataContract, 'documentE', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('invalid where clause components error: second field of where component should be a known operator'); - } - }); - }); - - describe('<', () => { - it('should find documents with "<" operator', async () => { - const query = { - where: [['order', '<', documents[1].get('order')]], - orderBy: [['order', 'asc']], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(1); - - const [expectedDocument] = foundDocuments; - - expect(expectedDocument.toBuffer()).to.deep.equal(documents[0].toBuffer()); - }); - - it('should return invalid result if "<" operator used with a string value longer than 255 bytes', async () => { - const longString = 't'.repeat(255); - - const result = await documentRepository.find( - queryDataContract, - 'documentString', - { - where: [['a', '<', longString]], - orderBy: [['a', 'asc']], - }, - ); - - expect(result).to.be.instanceOf(StorageResult); - - const veryLongString = 't'.repeat(256); - - try { - await documentRepository.find( - queryDataContract, - 'documentString', - { - where: [['a', '<', veryLongString]], - orderBy: [['a', 'asc']], - }, - ); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('field requirement unmet: value must be less than 256 bytes long'); - } - }); - - nonScalarTestCases.forEach(({ type, value }) => { - it(`should return invalid result if "<" operator used with a not scalar value, but ${type}`, async function it() { - if ((typeof value === 'object' && value === null) || typeof value === 'undefined') { - this.skip('will be implemented later'); - } - - try { - await documentRepository.find(queryDataContract, 'documentNumber', { where: [['a', '<', value]], orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('value error: structure error: value is not a float'); - } - }); - }); - - scalarTestCases.forEach(({ type, value }) => { - it(`should return valid result if "<" operator used with a scalar value ${type}`, async () => { - const docType = `document${ucFirst(type)}`; - - const result = await documentRepository.find(queryDataContract, docType, { where: [['a', '<', value]], orderBy: [['a', 'asc']] }); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - }); - - describe('<=', () => { - scalarTestCases.forEach(({ type, value }) => { - it(`should return valid result if "<=" operator used with a scalar value ${type}`, async () => { - const result = await documentRepository.find(queryDataContract, `document${ucFirst(type)}`, { where: [['a', '<=', value]], orderBy: [['a', 'asc']] }); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - - it('should find Documents using "<=" operator', async () => { - const query = { - where: [['order', '<=', documents[1].get('order')]], - orderBy: [['order', 'asc']], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(2); - - const expectedDocuments = documents.slice(0, 2).map((doc) => doc.toBuffer()); - - expect(foundDocuments.map((doc) => doc.toBuffer())).to.deep.members( - expectedDocuments, - ); - }); - }); - - describe('==', () => { - it('should find existing documents using "==" operator', async () => { - const query = { - where: [['name', '==', document.get('name')]], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(1); - - const [expectedDocument] = foundDocuments; - - expect(expectedDocument.toBuffer()).to.deep.equal(document.toBuffer()); - }); - - scalarTestCases.forEach(({ type, value }) => { - it(`should return valid result if "==" operator used with a scalar value ${type}`, async () => { - const result = await documentRepository.find(queryDataContract, `document${ucFirst(type)}`, { where: [['a', '==', value]] }); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - }); - - describe('=>', () => { - it('should find existing documents using ">=" operator', async () => { - const query = { - where: [['order', '>=', documents[1].get('order')]], - orderBy: [['order', 'asc']], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(documents.length - 1); - - documents.shift(); - const expectedDocuments = documents - .map((doc) => doc.toBuffer()); - - expect(foundDocuments.map((doc) => doc.toBuffer())).to.deep.members( - expectedDocuments, - ); - }); - - scalarTestCases.forEach(({ type, value }) => { - it(`should return valid result if ">=" operator used with a scalar value ${type}`, async () => { - const result = await documentRepository.find(queryDataContract, `document${ucFirst(type)}`, { where: [['a', '>=', value]], orderBy: [['a', 'asc']] }); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - }); - - describe('>', () => { - it('should find existing documents using ">" operator', async () => { - const query = { - where: [['order', '>', documents[1].get('order')]], - orderBy: [['order', 'asc']], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(documents.length - 2); - - const expectedDocuments = documents - .splice(2, documents.length) - .map((doc) => doc.toBuffer()); - - expect(foundDocuments.map((doc) => doc.toBuffer())).to.deep.members( - expectedDocuments, - ); - }); - - scalarTestCases.forEach(({ type, value }) => { - it(`should return valid result if ">" operator used with a scalar value ${type}`, async () => { - const result = await documentRepository.find(queryDataContract, `document${ucFirst(type)}`, { where: [['a', '>', value]], orderBy: [['a', 'asc']] }); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - }); - - ['>', '<', '<=', '>='].forEach((operator) => { - it(`should return invalid results if "${operator}" used not in the last 2 where conditions`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', operator, 1], - ['a', 'startsWith', 'rt-'], - ['a', 'startsWith', 'r-'], - ], - orderBy: [['a', 'asc']], - }); - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('range clauses not groupable error: clauses are not groupable'); - } - }); - }); - - describe('ranges', () => { - describe('multiple ranges', () => { - ['>', '<', '<=', '>='].forEach((firstOperator) => { - ['>', '<', '>=', '<='].forEach((secondOperator) => { - it(`should return invalid result if ${firstOperator} operator used with ${secondOperator} operator`, async () => { - const query = { where: [['a', firstOperator, '1'], ['b', secondOperator, 'a']] }; - - try { - await documentRepository.find(queryDataContract, 'documentE', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('multiple range clauses error: all ranges must be on same field'); - } - }); - }); - }); - - ['>', '<', '<=', '>='].forEach((firstOperator) => { - it(`should return invalid result if ${firstOperator} operator used with startsWith operator`, async () => { - const query = { where: [['a', firstOperator, '1'], ['b', 'startsWith', 'a']] }; - - try { - await documentRepository.find(queryDataContract, 'documentE', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('range clauses not groupable error: clauses are not groupable'); - } - }); - }); - - it('should return invalid result if startsWith operator used with startsWith operator', async () => { - const query = { where: [['a', 'startsWith', '1'], ['b', 'startsWith', 'a']] }; - - try { - await documentRepository.find(queryDataContract, 'documentE', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('multiple range clauses error: there can not be more than 1 non groupable range clause'); - } - }); - }); - - describe('conflicting operators', () => { - const conflictingOperators = [ - { - operators: ['>', '>'], - errorMessage: 'multiple range clauses error: there can only at most one range clause with a lower bound', - }, - { - operators: ['>', '=>'], - errorMessage: 'invalid where clause components error: second field of where component should be a known operator', - }, - { - operators: ['<', '<'], - errorMessage: 'range clauses not groupable error: lower and upper bounds must be passed if providing 2 ranges', - }, - { - operators: ['<', '<='], - errorMessage: 'range clauses not groupable error: lower and upper bounds must be passed if providing 2 ranges', - }, - ]; - - conflictingOperators.forEach(({ errorMessage, operators }) => { - it(`should return invalid result if ${operators[0]} operator used with ${operators[1]} operator`, async () => { - const query = { - where: [['a', operators[0], '1'], ['a', operators[1], 'a']], - orderBy: [['a', 'asc']], - }; - - try { - await documentRepository.find(queryDataContract, 'documentE', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(errorMessage); - } - }); - }); - }); - - it('should return invalid result if "in" operator is used before last two indexed conditions', async () => { - const query = { where: [['a', 'in', [1, 2]]] }; - - try { - await documentRepository.find(queryDataContract, 'documentF', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - // TODO is it correct ?????? - expect(e.message).to.equal('where clause on non indexed property error: query must be for valid indexes'); - } - }); - - ['>', '<', '>=', '<='].forEach((operator) => { - it(`should return invalid result if ${operator} operator is used before "=="`, async () => { - const query = { where: [['a', operator, 2], ['b', '==', 1]], orderBy: [['a', 'asc']] }; - - try { - await documentRepository.find(queryDataContract, 'documentF', query); - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - // TODO is it correct? - expect(e.message).to.equal('where clause on non indexed property error: query must be for valid indexes'); - } - }); - }); - - ['>', '<', '>=', '<='].forEach((operator) => { - it(`should return valid result if ${operator} operator is used before "in"`, async () => { - const query = { where: [['a', operator, 2], ['b', 'in', [1, 2]]], orderBy: [['a', 'asc'], ['b', 'asc']] }; - - const result = await documentRepository.find(queryDataContract, 'documentG', query); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - - it('should return invalid result if "in" or range operators are not in orderBy', async () => { - const query = { - where: [ - ['a', '==', 1], - ['b', '>', 1], - ], - orderBy: [['b', 'asc']], - }; - - delete query.orderBy; - - try { - await documentRepository.find(queryDataContract, 'documentF', query); - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('missing order by for range error: query must have an orderBy field for each range element'); - } - }); - }); - }); - - describe('timestamps', () => { - nonNumberNullAndUndefinedTestCases.forEach(({ type, value }) => { - it(`should return invalid result if $createdAt timestamp used with ${type} value`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentI', { where: [['$createdAt', '>', value]], orderBy: [['$createdAt', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e.message).to.startsWith( - 'value error: structure error: value is not an integer', - ); - expect(e).to.be.instanceOf(InvalidQueryError); - } - }); - }); - - nonNumberNullAndUndefinedTestCases.forEach(({ type, value }) => { - it(`should return invalid result if $updatedAt timestamp used with ${type} value`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentH', { where: [['$updatedAt', '>', value]], orderBy: [['$updatedAt', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.startsWith( - 'value error: structure error: value is not an integer', - ); - } - }); - }); - - it('should return valid result if condition contains "$createdAt" field', async () => { - const result = await documentRepository.find(queryDataContract, 'documentI', { where: [['$createdAt', '==', Date.now()]] }); - - expect(result).to.be.instanceOf(StorageResult); - }); - - it('should return valid result if condition contains "$updatedAt" field', async () => { - const result = await documentRepository.find(queryDataContract, 'documentH', { where: [['$updatedAt', '==', Date.now()]] }); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - - describe('in', () => { - it('should return valid result if "in" operator used with an array value', async () => { - const query = { - where: [ - ['$id', 'in', [ - documents[0].getId(), - documents[1].getId(), - ]], - ], - orderBy: [['$id', 'asc']], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(2); - - const expectedDocuments = documents.slice(0, 2).map((doc) => doc.toBuffer()); - - expect(foundDocuments.map((doc) => doc.toBuffer())).to.deep.members( - expectedDocuments, - ); - }); - - notArrayTestCases.forEach(({ type, value }) => { - it(`should return invalid result if "in" operator used with not an array value, but ${type}`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { where: [['a', 'in', value]], orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('invalid IN clause error: when using in operator you must provide an array of values'); - } - }); - }); - - it('should return invalid result if "in" operator used with an empty array value', async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { where: [['a', 'in', []]], orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('invalid IN clause error: in clause must at least 1 value'); - } - }); - - it('should return invalid result if "in" operator used with an array value which contains more than 100 elements', async () => { - const arr = []; - - for (let i = 0; i < 100; i++) { - arr.push(i); - } - - const result = await documentRepository.find(queryDataContract, 'documentNumber', { where: [['a', 'in', arr]], orderBy: [['a', 'asc']] }); - - expect(result).to.be.instanceOf(StorageResult); - - arr.push(101); - - try { - await documentRepository.find(queryDataContract, 'documentNumber', { where: [['a', 'in', arr]], orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('invalid IN clause error: in clause must at most 100 values'); - } - }); - - it('should return invalid result if "in" operator used with an array which contains not unique elements', async () => { - const arr = [1, 1]; - try { - await documentRepository.find(queryDataContract, 'documentNumber', { where: [['a', 'in', arr]], orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('invalid IN clause error: there should be no duplicates values for In query'); - } - }); - - it('should return invalid results if "in" condition contains an array as an element', async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { where: [['a', 'in', [[]]]], orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('value error: structure error: value is not a float'); - } - }); - }); - - describe('startsWith', () => { - it('should return valid result if "startsWith" operator used with a string value', async () => { - const query = { - where: [['lastName', 'startsWith', 'Swe']], - orderBy: [['lastName', 'asc']], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(1); - - const [expectedDocument] = foundDocuments; - - expect(expectedDocument.toBuffer()).to.deep.equal(documents[2].toBuffer()); - }); - - it('should return invalid result if "startsWith" operator used with an empty string value', async () => { - try { - await documentRepository.find(queryDataContract, 'documentString', { where: [['a', 'startsWith', '']], orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('starts with illegal string error: starts with can not start with an empty string'); - } - }); - - it('should return invalid result if "startsWith" operator used with a string value which is more than 255 bytes long', async () => { - const value = 'b'.repeat(256); - try { - await documentRepository.find(queryDataContract, 'documentString', { where: [['a', 'startsWith', value]], orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('field requirement unmet: value must be less than 256 bytes long'); - } - }); - - [ - typesTestCases.number, - typesTestCases.boolean, - typesTestCases.object, - typesTestCases.buffer, - ].forEach(({ type, value }) => { - it(`should return invalid result if "startWith" operator used with a not string value, but ${type}`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentString', { where: [['a', 'startsWith', value]], orderBy: [['a', 'asc']] }); - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('value wrong type error: document field type doesn\'t match document value'); - } - }); - }); - - [ - typesTestCases.null, - typesTestCases.undefined, - ].forEach(({ type, value }) => { - it(`should return invalid result if "startWith" operator used with a not string value, but ${type}`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentString', { where: [['a', 'startsWith', value]], orderBy: [['a', 'asc']] }); - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('invalid STARTSWITH clause error: starts with must have at least one character'); - } - }); - }); - }); - - describe.skip('elementMatch', () => { - it('should return valid result if "elementMatch" operator used with "where" conditions', async () => { - const query = { - where: [ - ['arrayWithObjects', 'elementMatch', [ - ['item', '==', 2], ['flag', '==', true], - ]], - ], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(1); - - const [expectedDocument] = foundDocuments; - - expect(expectedDocument.toBuffer()).to.deep.equal(documents[1].toBuffer()); - }); - - it('should return invalid result if "elementMatch" operator used with invalid "where" conditions', async () => { - const query = { - where: [ - ['arr', 'elementMatch', - [['elem', 'startsWith', 1], ['elem', '<', 3]], - ], - ], - }; - - try { - await documentRepository.find(queryDataContract, 'document', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - it('should return invalid result if "elementMatch" operator used with less than 2 "where" conditions', async () => { - const query = { - where: [ - ['arr', 'elementMatch', - [['elem', '>', 1]], - ], - ], - }; - - try { - await documentRepository.find(queryDataContract, 'document', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - it('should return invalid result if value contains conflicting conditions', async () => { - const query = { - where: [ - ['arr', 'elementMatch', - [['elem', '>', 1], ['elem', '>', 1]], - ], - ], - }; - - try { - await documentRepository.find(queryDataContract, 'document', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - it('should return invalid result if $id field is specified', async () => { - const query = { - where: [ - ['arr', 'elementMatch', - [['$id', '>', 1], ['$id', '<', 3]], - ], - ], - }; - - try { - await documentRepository.find(queryDataContract, 'document', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - it('should return invalid result if $ownerId field is specified', async () => { - const query = { - where: [ - ['arr', 'elementMatch', - [['$ownerId', '>', 1], ['$ownerId', '<', 3]], - ], - ], - }; - - try { - await documentRepository.find(queryDataContract, 'document', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - it('should return invalid result if value contains nested "elementMatch" operator', async () => { - const query = { - where: [ - ['arr', 'elementMatch', - [['subArr', 'elementMatch', [ - ['subArrElem', '>', 1], ['subArrElem', '<', 3], - ]], ['subArr', '<', 3]], - ], - ], - }; - - try { - await documentRepository.find(queryDataContract, 'document', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - }); - - describe.skip('length', () => { - it('should return valid result if "length" operator used with a positive numeric value', async () => { - const query = { - where: [['arrayWithObjects', 'length', 2]], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(1); - - const [expectedDocument] = foundDocuments; - - expect(expectedDocument.toBuffer()).to.deep.equal(documents[1].toBuffer()); - }); - - it('should return valid result if "length" operator used with zero', async () => { - const result = await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'length', 0], - ], - }); - - expect(result).to.be.instanceOf(StorageResult); - }); - - it('should return invalid result if "length" operator used with a float numeric value', async () => { - try { - await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'length', 1.2], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - it('should return invalid result if "length" operator used with a NaN', async () => { - try { - await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'length', NaN], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - it('should return invalid result if "length" operator used with a numeric value which is less than 0', async () => { - try { - await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'length', -1], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - nonNumberTestCases.forEach(({ type, value }) => { - it(`should return invalid result if "length" operator used with a ${type} instead of numeric value`, async () => { - try { - await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'length', value], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - }); - }); - - describe.skip('contains', () => { - it('should find Documents using "contains" operator and array value', async () => { - const query = { - where: [ - ['arrayWithScalar', 'contains', [2, 3]], - ], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(1); - - const [expectedDocument] = foundDocuments; - - expect(expectedDocument.toBuffer()).to.deep.equal(documents[2].toBuffer()); - }); - - it('should find Documents using "contains" operator and scalar value', async () => { - const query = { - where: [ - ['arrayWithScalar', 'contains', 2], - ], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(2); - - const expectedDocuments = documents.slice(1, 3).map((doc) => doc.toBuffer()); - - expect(foundDocuments.map((doc) => doc.toBuffer())).to.deep.members( - expectedDocuments, - ); - }); - - scalarTestCases.forEach(({ type, value }) => { - it(`should return valid result if "contains" operator used with a scalar value ${type}`, async () => { - const result = await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'contains', value], - ], - }); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - - scalarTestCases.forEach(({ type, value }) => { - it(`should return valid result if "contains" operator used with an array of scalar values ${type}`, async () => { - const result = await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'contains', [value]], - ], - }); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - - it('should return invalid result if "contains" operator used with an array which has ' - + ' more than 100 elements', async () => { - const arr = []; - for (let i = 0; i < 100; i++) { - arr.push(i); - } - - const result = await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'contains', arr], - ], - }); - - expect(result).to.be.instanceOf(StorageResult); - - arr.push(101); - - try { - await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'contains', arr], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - it('should return invalid result if "contains" operator used with an empty array', async () => { - try { - await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'contains', []], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - it('should return invalid result if "contains" operator used with an array which contains not unique' - + ' elements', async () => { - try { - await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'contains', [1, 1]], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - - nonScalarTestCases.forEach(({ type, value }) => { - it(`should return invalid result if used with non-scalar value ${type}`, async () => { - try { - await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'contains', value], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - }); - - nonScalarTestCases.forEach(({ type, value }) => { - it(`should return invalid result if used with an array of non-scalar values ${type}`, async () => { - try { - await documentRepository.find(queryDataContract, 'document', { - where: [ - ['arr', 'contains', [value]], - ], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(''); - } - }); - }); - }); - }); - }); - }); - - describe('limit', () => { - it('should limit return to 1 Document if limit is set', async () => { - const options = { - limit: 1, - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - options, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.have.lengthOf(1); - }); - - it('should limit result to 100 Documents if limit is not set', async () => { - // Store 101 document - for (let i = 0; i < 101; i++) { - const svDoc = document; - - svDoc.id = Identifier.from(Buffer.alloc(32, i + 1)); - await documentRepository.create(svDoc, blockInfo); - } - - const result = await documentRepository.find(dataContract, document.getType()); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.have.lengthOf(100); - }); - - it('should return valid result if "limit" is a number', async () => { - const result = await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', '>', 1], - ], - orderBy: [['a', 'asc']], - limit: 1, - }); - - expect(result).to.be.instanceOf(StorageResult); - }); - - it('should return invalid result if "limit" is less than 0', async () => { - const where = [ - ['a', '>', 1], - ]; - - try { - await documentRepository.find(queryDataContract, 'documentNumber', { where, limit: -1, orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('value error: integer out of bounds'); - } - }); - - it('should return invalid result if "limit" is 0', async () => { - const where = [ - ['a', '>', 1], - ]; - - try { - await documentRepository.find(queryDataContract, 'documentNumber', { where, limit: 0, orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('query invalid limit error: limit should be a integer from 1 to 100'); - } - }); - - it('should return invalid result if "limit" is bigger than 100', async () => { - const where = [ - ['a', '>', 1], - ]; - - const result = await documentRepository.find(queryDataContract, 'documentNumber', { where, limit: 100, orderBy: [['a', 'asc']] }); - - expect(result).to.be.instanceOf(StorageResult); - - try { - await documentRepository.find(queryDataContract, 'documentNumber', { where, limit: 101, orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('query invalid limit error: limit should be a integer from 1 to 100'); - } - }); - - it('should return invalid result if "limit" is a float number', async () => { - const where = [ - ['a', '>', 1], - ]; - - try { - await documentRepository.find(queryDataContract, 'documentNumber', { where, limit: 1.5, orderBy: [['a', 'asc']] }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('value error: structure error: value is not an integer'); - } - }); - - nonNumberNullAndUndefinedTestCases.forEach(({ type, value }) => { - it(`should return invalid result if "limit" is not a number, but ${type}`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', '>', 1], - ], - limit: value, - orderBy: [['a', 'asc']], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('value error: structure error: value is not an integer'); - } - }); - }); - }); - - describe('startAt', () => { - it('should return the second document using identifier', async () => { - const query = { - where: [ - ['order', '>=', 0], - ], - orderBy: [ - ['order', 'asc'], - ], - startAt: documents[1].getId(), - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - - const expectedDocuments = documents.splice(1).map((doc) => doc.toBuffer()); - - expect(foundDocuments.map((doc) => doc.toBuffer())).to.deep.members(expectedDocuments); - }); - - it('should return the second document using base58', async () => { - const query = { - where: [ - ['order', '>=', 0], - ], - orderBy: [ - ['order', 'asc'], - ], - startAt: documents[1].getId().toString(), - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - - const expectedDocuments = documents.splice(1).map((doc) => doc.toBuffer()); - - expect(foundDocuments.map((doc) => doc.toBuffer())).to.deep.members(expectedDocuments); - }); - - it('should throw InvalidQuery if document not found', async () => { - const options = { - startAt: Buffer.alloc(0), - }; - - try { - await documentRepository.find(dataContract, document.getType(), options); - - expect.fail('should throw InvalidQueryError'); - } catch (e) { - expect(e).to.be.an.instanceOf(InvalidQueryError); - expect(e.message).to.equal('start document not found error: startAt document not found'); - } - }); - - [ - typesTestCases.boolean, - typesTestCases.null, - typesTestCases.object, - typesTestCases.number, - ].forEach(({ type, value }) => { - it(`should return invalid result if "startAt" is not a buffer, but ${type}`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - startAt: value, - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - } - }); - }); - }); - - describe('startAfter', () => { - it('should return Documents after 1 document', async () => { - const options = { - where: [ - ['order', '>=', 0], - ], - orderBy: [ - ['order', 'asc'], - ], - startAfter: documents[0].id, - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - options, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - - const expectedDocuments = documents.splice(1).map((doc) => doc.toBuffer()); - - expect(foundDocuments.map((doc) => doc.toBuffer())).to.deep.members(expectedDocuments); - }); - - it('should throw InvalidQuery if document not found', async () => { - const options = { - startAfter: Buffer.alloc(0), - }; - - try { - await documentRepository.find(dataContract, document.getType(), options); - - expect.fail('should throw InvalidQueryError'); - } catch (e) { - expect(e).to.be.an.instanceOf(InvalidQueryError); - expect(e.message).to.equal('start document not found error: startAfter document not found'); - } - }); - - it('should return invalid result if both "startAt" and "startAfter" are present', async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - startAfter: documents[1].getId(), - startAt: documents[1].getId(), - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('duplicate start conditions error: only one of startAt or startAfter should be provided'); - } - }); - - [ - typesTestCases.boolean, - typesTestCases.null, - typesTestCases.object, - typesTestCases.number, - ].forEach(({ type, value }) => { - it(`should return invalid result if "startAfter" is not a buffer, but ${type}`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - startAfter: value, - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('value error: structure error: value are not bytes, a string, or an array of values representing bytes'); - } - }); - }); - }); - - describe('orderBy', () => { - it('should sort Documents in descending order', async () => { - const query = { - where: [ - ['order', '>=', 0], - ], - orderBy: [ - ['order', 'desc'], - ], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - - const expectedDocuments = documents.reverse().map((doc) => doc.toBuffer()); - - expect(foundDocuments.map((doc) => doc.toBuffer())).to.deep.equal(expectedDocuments); - }); - - it('should sort Documents in ascending order', async () => { - const query = { - where: [ - ['order', '>=', 0], - ], - orderBy: [ - ['order', 'asc'], - ], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - - const expectedDocuments = documents.map((doc) => doc.toBuffer()); - - expect(foundDocuments.map((doc) => doc.toBuffer())).to.deep.equal(expectedDocuments); - }); - - it('should sort Documents by $id', async () => { - await Promise.all( - documents.map((d) => documentRepository - .delete(dataContract, document.getType(), d.getId(), blockInfo)), - ); - - const createdIds = []; - let i = 0; - for (const svDoc of documents) { - svDoc.id = Identifier.from(Buffer.alloc(32, i + 1)); - await documentRepository.create(svDoc, blockInfo); - i++; - createdIds.push(svDoc.id); - } - - const query = { - where: [ - ['$id', 'in', createdIds], - ], - orderBy: [ - ['$id', 'desc'], - ], - }; - - const result = await documentRepository.find( - dataContract, - document.getType(), - query, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.be.lengthOf(documents.length); - - expect(foundDocuments[0].getId()).to.deep.equal(createdIds[4]); - expect(foundDocuments[1].getId()).to.deep.equal(createdIds[3]); - expect(foundDocuments[2].getId()).to.deep.equal(createdIds[2]); - expect(foundDocuments[3].getId()).to.deep.equal(createdIds[1]); - expect(foundDocuments[4].getId()).to.deep.equal(createdIds[0]); - }); - - it('should return valid result if "orderBy" contains 1 sorting field', async () => { - const result = await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', '>', 1], - ], - orderBy: [['a', 'asc']], - }); - - expect(result).to.be.instanceOf(StorageResult); - }); - - it('should return valid result if "orderBy" contains a second fields not used in where clause', async () => { - const result = await documentRepository.find(queryDataContract, 'documentC', { - where: [ - ['a', '>', 1], - ], - orderBy: [['a', 'asc'], ['b', 'desc']], - }); - - expect(result).to.be.an.instanceOf(StorageResult); - }); - - it('should return invalid result if "orderBy" is an empty array', async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', '>', 1], - ], - orderBy: [], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('missing order by for range error: query must have an orderBy field for each range element'); - } - }); - - it('should return invalid result if sorting applied to not range condition', async function it() { - this.skip('will be implemented later'); - - try { - await documentRepository.find(queryDataContract, 'documentString', { - where: [['a', '==', 'b']], - orderBy: [['a', 'asc']], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - } - }); - - it('should return valid result if there is no where conditions', async () => { - const result = await documentRepository.find(queryDataContract, 'documentNumber', { - orderBy: [['a', 'asc']], - }); - - expect(result).to.be.instanceOf(StorageResult); - }); - - it('should return invalid result if the field inside an "orderBy" is an empty array', async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', '>', 1], - ], - orderBy: [[]], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('missing order by for range error: query must have an orderBy field for each range element'); - } - }); - - it('should return invalid result if order of three of two properties after indexed one is not preserved', async () => { - try { - await documentRepository.find(queryDataContract, 'documentL', { - where: [ - ['b', '>', 1], - ], - orderBy: [['b', 'desc'], ['e', 'asc']], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('where clause on non indexed property error: query must be for valid indexes'); - } - }); - - it('should return invalid result if order of properties does not match index', async () => { - try { - await documentRepository.find(queryDataContract, 'documentJ', { - where: [ - ['b', '>', 1], - ], - orderBy: [['b', 'desc'], ['d', 'asc']], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('where clause on non indexed property error: query must be for valid indexes'); - } - }); - - validFieldNameTestCases.forEach((fieldName) => { - it(`should return valid result if "orderBy" has valid field format, ${fieldName}`, async () => { - const result = await documentRepository.find(queryDataContract, `document${fieldName}`, { - where: [ - [fieldName, '>', fieldName.startsWith('$') && !fieldName.endsWith('At') ? generateRandomIdentifier() : 1], - ], - orderBy: [[fieldName, 'asc']], - }); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - - invalidFieldNameTestCases.forEach((fieldName) => { - it(`should return invalid result if "orderBy" has invalid field format, ${fieldName}`, async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', '>', 1], - ], - orderBy: [['$a', 'asc']], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('where clause on non indexed property error: query must be for valid indexes'); - } - }); - }); - - it('should return invalid result if "orderBy" has wrong direction', async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', '>', 1], - ], - orderBy: [['a', 'a']], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('missing order by for range error: query must have an orderBy field for each range element'); - } - }); - - it('should return invalid result if "orderBy" field array has less than 2 elements (field, direction)', async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', '>', 1], - ], - orderBy: [['a']], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('missing order by for range error: query must have an orderBy field for each range element'); - } - }); - - it('should return invalid result if "orderBy" field array has more than 2 elements (field, direction)', async () => { - try { - await documentRepository.find(queryDataContract, 'documentNumber', { - where: [ - ['a', '>', 1], - ], - orderBy: [['a', 'asc', 'desc']], - }); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('missing order by for range error: query must have an orderBy field for each range element'); - } - }); - - validOrderByOperators.forEach(({ operator, value, documentType }) => { - it(`should return valid result if "orderBy" has valid field with valid operator (${operator}) and value (${value})" in "where" clause`, async () => { - const result = await documentRepository.find( - queryDataContract, - documentType, - { - where: [ - ['a', operator, value], - ], - orderBy: [['a', 'asc']], - }, - ); - - expect(result).to.be.instanceOf(StorageResult); - }); - }); - - it('should return invalid result if "orderBy" was not used with range operator', async () => { - const query = { - where: [['a', '==', 1]], - orderBy: [['b', 'asc']], - }; - - try { - await documentRepository.find(queryDataContract, 'documentK', query); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('where clause on non indexed property error: query must be for valid indexes'); - } - }); - }); - }); - }); - - describe('#delete', () => { - beforeEach(async () => { - await createDocuments(documentRepository, documents, blockInfo); - }); - - it('should delete Document', async () => { - let result = await documentRepository.delete( - dataContract, - document.getType(), - document.getId(), - blockInfo, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - result = await documentRepository.find(dataContract, document.getType(), { - where: [['$id', '==', document.getId()]], - }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.have.lengthOf(0); - }); - - it('should delete Document in transaction', async () => { - await documentRepository - .storage - .startTransaction(); - - const result = await documentRepository.delete( - dataContract, - document.getType(), - document.getId(), - blockInfo, - { - useTransaction: true, - }, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const query = { - where: [['$id', '==', document.getId()]], - }; - - const removedDocumentResult = await documentRepository - .find( - dataContract, - document.getType(), - { - ...query, - useTransaction: true, - }, - ); - - const removedDocument = removedDocumentResult.getValue(); - - const notRemovedDocumentsResult = await documentRepository - .find(dataContract, document.getType(), query); - - const notRemovedDocuments = notRemovedDocumentsResult.getValue(); - - await documentRepository - .storage.commitTransaction(); - - const completelyRemovedDocumentResult = await documentRepository - .find(dataContract, document.getType(), query); - - const completelyRemovedDocument = completelyRemovedDocumentResult.getValue(); - - expect(removedDocument).to.have.lengthOf(0); - expect(notRemovedDocuments).to.be.not.null(); - expect(notRemovedDocuments[0].toBuffer()).to.deep.equal(document.toBuffer()); - expect(completelyRemovedDocument).to.have.lengthOf(0); - }); - - it('should restore document if transaction aborted', async () => { - await documentRepository - .storage - .startTransaction(); - - await documentRepository.delete( - dataContract, - document.getType(), - document.getId(), - blockInfo, - { - useTransaction: true, - }, - ); - - const query = { - where: [['$id', '==', document.getId()]], - }; - - // Document should be removed in transaction - - const removedDocumentsResult = await documentRepository.find( - dataContract, - document.getType(), - { - ...query, - useTransaction: true, - }, - ); - - const removedDocuments = removedDocumentsResult.getValue(); - - expect(removedDocuments).to.have.lengthOf(0); - - // But still exists in main database - - const removedDocumentsWithoutTransactionResult = await documentRepository - .find(dataContract, document.getType(), query); - - const removedDocumentsWithoutTransaction = removedDocumentsWithoutTransactionResult - .getValue(); - - expect(removedDocumentsWithoutTransaction).to.not.have.lengthOf(0); - expect(removedDocumentsWithoutTransaction[0].toBuffer()).to.deep.equal(document.toBuffer()); - - await documentRepository - .storage - .abortTransaction(); - - const restoredDocumentsResult = await documentRepository - .find(dataContract, document.getType(), query); - - const restoredDocuments = restoredDocumentsResult.getValue(); - - expect(restoredDocuments).to.not.have.lengthOf(0); - expect(restoredDocuments[0].toBuffer()).to.deep.equal(document.toBuffer()); - }); - - it('should not delete Document on dry run', async () => { - const result = await documentRepository.delete( - dataContract, - document.getType(), - document.getId(), - blockInfo, - { - dryRun: true, - }, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const query = { - where: [['$id', '==', document.getId()]], - }; - - const removedDocumentsResult = await documentRepository - .find(dataContract, document.getType(), query); - - const removedDocuments = removedDocumentsResult - .getValue(); - - expect(removedDocuments).to.not.have.lengthOf(0); - expect(removedDocuments[0].toBuffer()).to.deep.equal(document.toBuffer()); - }); - }); - - describe('#prove', () => { - // TODO do we need to check prove result with every single find test request? - - beforeEach(async () => { - await createDocuments(documentRepository, documents, blockInfo); - }); - - it('should return proof for all existing documents', async () => { - const result = await documentRepository.prove(dataContract, document.getType()); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - // TODO enable this test when we support transactions for proofs - it.skip('should return proof for all existing documents in transaction', async () => { - await documentRepository - .storage - .startTransaction(); - - const result = await documentRepository - .prove(dataContract, document.getType(), { - useTransaction: true, - }); - - await documentRepository - .storage - .abortTransaction(); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - }); - - describe('#proveManyDocumentsFromDifferentContracts', () => { - beforeEach(async () => { - await createDocuments(documentRepository, documents, blockInfo); - }); - - it('should return proof for all existing documents', async () => { - const documentsToProve = documents.map((doc) => ({ - dataContractId: doc.getDataContractId().toBuffer(), - documentId: doc.getId().toBuffer(), - type: doc.getType(), - })); - - const result = await documentRepository.proveManyDocumentsFromDifferentContracts( - documentsToProve, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should return proof non existing documents', async () => { - const documentsToProve = [{ - dataContractId: generateRandomIdentifier().toBuffer(), - documentId: generateRandomIdentifier().toBuffer(), - type: 'unknownType', - }]; - - const result = await documentRepository.proveManyDocumentsFromDifferentContracts( - documentsToProve, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should return proof for existing and non existing documents', async () => { - const documentsToProve = documents.map((doc) => ({ - dataContractId: doc.getDataContractId().toBuffer(), - documentId: doc.getId().toBuffer(), - type: doc.getType(), - })); - - documentsToProve.push({ - dataContractId: generateRandomIdentifier().toBuffer(), - documentId: generateRandomIdentifier().toBuffer(), - type: 'unknownType', - }); - - const result = await documentRepository.proveManyDocumentsFromDifferentContracts( - documentsToProve, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - }); -}); diff --git a/packages/js-drive/test/integration/document/fetchDataContractFactory.spec.js b/packages/js-drive/test/integration/document/fetchDataContractFactory.spec.js deleted file mode 100644 index ad2f04c9eb4..00000000000 --- a/packages/js-drive/test/integration/document/fetchDataContractFactory.spec.js +++ /dev/null @@ -1,83 +0,0 @@ -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); - -const InvalidQueryError = require('../../../lib/document/errors/InvalidQueryError'); - -const createTestDIContainer = require('../../../lib/test/createTestDIContainer'); -const StorageResult = require('../../../lib/storage/StorageResult'); -const BlockInfo = require('../../../lib/blockExecution/BlockInfo'); - -describe('fetchDataContractFactory', () => { - let fetchDataContract; - let contractId; - let dataContractRepository; - let dataContract; - let container; - let blockInfo; - - beforeEach(async () => { - container = await createTestDIContainer(); - - dataContractRepository = container.resolve('dataContractRepository'); - - dataContract = getDataContractFixture(); - - contractId = dataContract.getId(); - - blockInfo = new BlockInfo(1, 1, Date.now()); - - /** - * @type {Drive} - */ - const rsDrive = container.resolve('rsDrive'); - await rsDrive.createInitialStateStructure(); - - await dataContractRepository.create(dataContract, blockInfo); - - fetchDataContract = container.resolve('fetchDataContract'); - }); - - afterEach(async () => { - if (container) { - await container.dispose(); - } - }); - - it('should fetch DataContract for specified contract ID and document type', async () => { - const result = await fetchDataContract(contractId); - - expect(result).to.be.instanceOf(StorageResult); - // TODO: Processing fees are ignored for v0.23 - expect(result.getOperations().length).to.equals(0); - - const foundDataContract = result.getValue(); - - expect(foundDataContract.toObject()).to.deep.equal(dataContract.toObject()); - }); - - it('should throw InvalidQueryError if contract ID is not valid', async () => { - contractId = 'something'; - - try { - await fetchDataContract(contractId); - - expect.fail('should throw InvalidQueryError'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('invalid data contract ID: Identifier expects Buffer'); - } - }); - - it('should throw InvalidQueryError if contract ID does not exist', async () => { - contractId = generateRandomIdentifier(); - - try { - await fetchDataContract(contractId); - - expect.fail('should throw InvalidQueryError'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal(`data contract ${contractId} not found`); - } - }); -}); diff --git a/packages/js-drive/test/integration/document/fetchDocumentsFactory.spec.js b/packages/js-drive/test/integration/document/fetchDocumentsFactory.spec.js deleted file mode 100644 index f10ec5f54dc..00000000000 --- a/packages/js-drive/test/integration/document/fetchDocumentsFactory.spec.js +++ /dev/null @@ -1,221 +0,0 @@ -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); - -const InvalidQueryError = require('../../../lib/document/errors/InvalidQueryError'); - -const createTestDIContainer = require('../../../lib/test/createTestDIContainer'); -const StorageResult = require('../../../lib/storage/StorageResult'); -const BlockInfo = require('../../../lib/blockExecution/BlockInfo'); - -describe('fetchDocumentsFactory', () => { - let fetchDocuments; - let documentType; - let contractId; - let document; - let dataContractRepository; - let documentRepository; - let dataContract; - let container; - let blockInfo; - - beforeEach(async () => { - container = await createTestDIContainer(); - - dataContractRepository = container.resolve('dataContractRepository'); - documentRepository = container.resolve('documentRepository'); - - dataContract = getDataContractFixture(); - - contractId = dataContract.getId(); - - [document] = getDocumentsFixture(dataContract); - - documentType = document.getType(); - - dataContract.documents[documentType].indices = [ - { - properties: [ - { name: 'asc' }, - ], - }, - ]; - - blockInfo = new BlockInfo(1, 0, Date.now()); - - /** - * @type {Drive} - */ - const rsDrive = container.resolve('rsDrive'); - await rsDrive.createInitialStateStructure(); - - await dataContractRepository.create(dataContract, blockInfo); - - fetchDocuments = container.resolve('fetchDocuments'); - }); - - afterEach(async () => { - if (container) { - await container.dispose(); - } - }); - - it('should fetch Documents for specified contract ID and document type', async () => { - await documentRepository.create(document, blockInfo); - - const result = await fetchDocuments(contractId, documentType); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.have.lengthOf(1); - - const [actualDocument] = foundDocuments; - - expect(actualDocument.toObject()).to.deep.equal(document.toObject()); - }); - - it('should fetch Documents for specified contract id, document type and name', async () => { - await documentRepository.create(document, blockInfo); - - const query = { where: [['name', '==', document.get('name')]] }; - - const result = await fetchDocuments(contractId, documentType, query); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.be.an('array'); - expect(foundDocuments).to.have.lengthOf(1); - - const [actualDocument] = foundDocuments; - - expect(actualDocument.toObject()).to.deep.equal(document.toObject()); - }); - - it('should return empty array for specified contract ID, document type and name not exist', async () => { - await documentRepository.create(document, blockInfo); - - const query = { where: [['name', '==', 'unknown']] }; - - const result = await fetchDocuments(contractId, documentType, query); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.deep.equal([]); - }); - - it('should fetch documents by an equal date', async () => { - const indexedDocument = getDocumentsFixture(dataContract)[3]; - - await documentRepository.create(indexedDocument, blockInfo); - - const query = { - where: [ - ['$createdAt', '==', indexedDocument.getCreatedAt().getTime()], - ], - }; - - const result = await fetchDocuments(contractId, 'indexedDocument', query); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments[0].toObject()).to.deep.equal( - indexedDocument.toObject(), - ); - }); - - it('should fetch documents by a date range', async () => { - const [, , , indexedDocument] = getDocumentsFixture(dataContract); - - await documentRepository.create(indexedDocument, blockInfo); - - const startDate = new Date(); - startDate.setSeconds(startDate.getSeconds() - 10); - - const endDate = new Date(); - endDate.setSeconds(endDate.getSeconds() + 10); - - const query = { - where: [ - ['$createdAt', '>', startDate.getTime()], - ['$createdAt', '<=', endDate.getTime()], - ], - orderBy: [['$createdAt', 'asc']], - }; - - const result = await fetchDocuments(contractId, 'indexedDocument', query); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments[0].toObject()).to.deep.equal( - indexedDocument.toObject(), - ); - }); - - it('should fetch empty array in case date is out of range', async () => { - const [, , , indexedDocument] = getDocumentsFixture(dataContract); - - await documentRepository.create(indexedDocument, blockInfo); - - const startDate = new Date(); - startDate.setSeconds(startDate.getSeconds() + 10); - - const endDate = new Date(); - endDate.setSeconds(endDate.getSeconds() + 20); - - const query = { - where: [ - ['$createdAt', '>', startDate.getTime()], - ['$createdAt', '<=', endDate.getTime()], - ], - orderBy: [['$createdAt', 'asc']], - }; - - const result = await fetchDocuments(contractId, 'indexedDocument', query); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const foundDocuments = result.getValue(); - - expect(foundDocuments).to.have.length(0); - }); - - it('should throw InvalidQueryError if searching by non indexed fields', async () => { - await documentRepository.create(document, blockInfo); - - const query = { where: [['lastName', '==', 'unknown']] }; - - try { - await fetchDocuments(contractId, documentType, blockInfo, query); - - expect.fail('should throw InvalidQueryError'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - } - }); - - it('should throw InvalidQueryError if type does not exist', async () => { - documentType = 'Unknown'; - - try { - await fetchDocuments(contractId, documentType); - - expect.fail('should throw InvalidQueryError'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - expect(e.message).to.equal('document type Unknown is not defined in the data contract'); - } - }); -}); diff --git a/packages/js-drive/test/integration/document/proveDocumentsFactory.spec.js b/packages/js-drive/test/integration/document/proveDocumentsFactory.spec.js deleted file mode 100644 index cf4bea8abc3..00000000000 --- a/packages/js-drive/test/integration/document/proveDocumentsFactory.spec.js +++ /dev/null @@ -1,198 +0,0 @@ -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const createTestDIContainer = require('../../../lib/test/createTestDIContainer'); -const StorageResult = require('../../../lib/storage/StorageResult'); -const InvalidQueryError = require('../../../lib/document/errors/InvalidQueryError'); -const BlockInfo = require('../../../lib/blockExecution/BlockInfo'); - -describe('proveDocumentsFactory', () => { - let proveDocuments; - let documentType; - let contractId; - let document; - let dataContractRepository; - let documentRepository; - let dataContract; - let container; - let blockInfo; - - beforeEach(async () => { - container = await createTestDIContainer(); - - dataContractRepository = container.resolve('dataContractRepository'); - documentRepository = container.resolve('documentRepository'); - - dataContract = getDataContractFixture(); - - contractId = dataContract.getId(); - - [document] = getDocumentsFixture(dataContract); - - documentType = document.getType(); - - dataContract.documents[documentType].indices = [ - { - properties: [ - { name: 'asc' }, - ], - }, - ]; - - blockInfo = new BlockInfo(1, 0, Date.now()); - - /** - * @type {Drive} - */ - const rsDrive = container.resolve('rsDrive'); - await rsDrive.createInitialStateStructure(); - - await dataContractRepository.create(dataContract, blockInfo); - - proveDocuments = container.resolve('proveDocuments'); - }); - - afterEach(async () => { - if (container) { - await container.dispose(); - } - }); - - it('should return proof for specified contract ID and document type', async () => { - await documentRepository.create(document, blockInfo); - - const result = await proveDocuments(contractId, documentType); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should return proof for specified contract id, document type and name', async () => { - await documentRepository.create(document, blockInfo); - - const query = { where: [['name', '==', document.get('name')]] }; - - const result = await proveDocuments(contractId, documentType, query); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should return proof for specified contract ID, document type and name not exist', async () => { - await documentRepository.create(document, blockInfo); - - const query = { where: [['name', '==', 'unknown']] }; - - const result = await proveDocuments(contractId, documentType, query); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should return proof by an equal date', async () => { - const indexedDocument = getDocumentsFixture(dataContract)[3]; - - await documentRepository.create(indexedDocument, blockInfo); - - const query = { - where: [ - ['$createdAt', '==', indexedDocument.getCreatedAt().getTime()], - ], - }; - - const result = await proveDocuments(contractId, 'indexedDocument', query); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should return proof by a date range', async () => { - const [, , , indexedDocument] = getDocumentsFixture(dataContract); - - await documentRepository.create(indexedDocument, blockInfo); - - const startDate = new Date(); - startDate.setSeconds(startDate.getSeconds() - 10); - - const endDate = new Date(); - endDate.setSeconds(endDate.getSeconds() + 10); - - const query = { - where: [ - ['$createdAt', '>', startDate.getTime()], - ['$createdAt', '<=', endDate.getTime()], - ], - orderBy: [['$createdAt', 'asc']], - }; - - const result = await proveDocuments(contractId, 'indexedDocument', query); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should fetch empty array in case date is out of range', async () => { - const [, , , indexedDocument] = getDocumentsFixture(dataContract); - - await documentRepository.create(indexedDocument, blockInfo); - - const startDate = new Date(); - startDate.setSeconds(startDate.getSeconds() + 10); - - const endDate = new Date(); - endDate.setSeconds(endDate.getSeconds() + 20); - - const query = { - where: [ - ['$createdAt', '>', startDate.getTime()], - ['$createdAt', '<=', endDate.getTime()], - ], - orderBy: [['$createdAt', 'asc']], - }; - - const result = await proveDocuments(contractId, 'indexedDocument', query); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.be.greaterThan(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceOf(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should throw InvalidQueryError if searching by non indexed fields', async () => { - await documentRepository.create(document, blockInfo); - - const query = { where: [['lastName', '==', 'unknown']] }; - - try { - await proveDocuments(contractId, documentType, query); - - expect.fail('should throw InvalidQueryError'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidQueryError); - } - }); -}); diff --git a/packages/js-drive/test/integration/fee/feesPrediction.spec.js b/packages/js-drive/test/integration/fee/feesPrediction.spec.js deleted file mode 100644 index b50b8432b03..00000000000 --- a/packages/js-drive/test/integration/fee/feesPrediction.spec.js +++ /dev/null @@ -1,549 +0,0 @@ -const crypto = require('crypto'); - -const Long = require('long'); - -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const Identity = require('@dashevo/dpp/lib/identity/Identity'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); - -const getInstantAssetLockProofFixture = require('@dashevo/dpp/lib/test/fixtures/getInstantAssetLockProofFixture'); -const identityUpdateTransitionSchema = require('@dashevo/dpp/schema/identity/stateTransition/identityUpdate.json'); -const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext'); -const PrivateKey = require('@dashevo/dashcore-lib/lib/privatekey'); - -const BlsSignatures = require('@dashevo/dpp/lib/bls/bls'); - -const getBiggestPossibleIdentity = require('../../../lib/test/mock/getBiggestPossibleIdentity'); - -const createTestDIContainer = require('../../../lib/test/createTestDIContainer'); -const createDataContractDocuments = require('../../../lib/test/fixtures/createDataContractDocuments'); -const BlockInfo = require('../../../lib/blockExecution/BlockInfo'); - -/** - * @param {DashPlatformProtocol} dpp - * @param {AbstractStateTransition} stateTransition - * @return {Promise} - */ -async function validateStateTransition(dpp, stateTransition) { - const validateBasicResult = await dpp.stateTransition.validateBasic(stateTransition); - expect(validateBasicResult.isValid()).to.be.true(); - - const validateSignatureResult = await dpp.stateTransition.validateSignature(stateTransition); - expect(validateSignatureResult.isValid()).to.be.true(); - - const validateFeeResult = await dpp.stateTransition.validateFee(stateTransition); - expect(validateFeeResult.isValid()).to.be.true(); - - const validateStateResult = await dpp.stateTransition.validateState(stateTransition); - expect(validateStateResult.isValid()).to.be.true(); - - const applyResult = await dpp.stateTransition.validateState(stateTransition); - expect(applyResult.isValid()).to.be.true(); -} - -/** - * @param {DashPlatformProtocol} dpp - * @param {GroveDBStore} groveDBStore - * @param {AbstractStateTransition} stateTransition - * @return {Promise} - */ -async function expectPredictedFeeHigherOrEqualThanActual(dpp, groveDBStore, stateTransition) { - // Execute state transition without dry run - - const actualExecutionContext = new StateTransitionExecutionContext(); - - stateTransition.setExecutionContext(actualExecutionContext); - - await validateStateTransition(dpp, stateTransition); - - // Execute state transition with dry run enabled - - const predictedExecutionContext = new StateTransitionExecutionContext(); - - predictedExecutionContext.enableDryRun(); - - stateTransition.setExecutionContext(predictedExecutionContext); - - const initialAppHash = await groveDBStore.getRootHash(); - - await validateStateTransition(dpp, stateTransition); - - // AppHash shouldn't be changed after dry run - const appHashAfterDryRun = await groveDBStore.getRootHash(); - - expect(appHashAfterDryRun).to.deep.equal(initialAppHash); - - // Compare operations - - // TODO: Processing fees are disabled for v0.23 - // const actualOperations = actualExecutionContext.getOperations(); - // const predictedOperations = predictedExecutionContext.getOperations(); - - // expect(predictedOperations).to.have.lengthOf(actualOperations.length); - - // Compare fees - - // stateTransition.setExecutionContext(actualExecutionContext); - // const actualFees = calculateStateTransitionFee(stateTransition); - // - // stateTransition.setExecutionContext(predictedExecutionContext); - // const predictedFees = calculateStateTransitionFee(stateTransition); - // - // expect(predictedFees).to.be.greaterThanOrEqual(actualFees); - // - // predictedOperations.forEach((predictedOperation, i) => { - // expect(predictedOperation.getStorageCost()).to.be.greaterThanOrEqual( - // actualOperations[i].getStorageCost(), - // ); - // - // expect(predictedOperation.getProcessingCost()).to.be.greaterThanOrEqual( - // actualOperations[i].getProcessingCost(), - // ); - // }); -} - -describe('feesPrediction', () => { - let dpp; - let container; - let stateRepository; - let identity; - let groveDBStore; - let blockInfo; - - beforeEach(async function beforeEach() { - container = await createTestDIContainer(); - - const latestBlockExecutionContext = container.resolve('latestBlockExecutionContext'); - - blockInfo = new BlockInfo(1, 0, Date.now()); - - latestBlockExecutionContext.getEpochInfo = this.sinon.stub().returns({ - currentEpochIndex: blockInfo.epoch, - }); - - latestBlockExecutionContext.getTimeMs = this.sinon.stub().returns(blockInfo.timeMs); - latestBlockExecutionContext.getHeight = this.sinon.stub().returns(Long.fromNumber(0)); - - dpp = container.resolve('dpp'); - - stateRepository = container.resolve('stateRepository'); - groveDBStore = container.resolve('groveDBStore'); - - /** - * @type {Drive} - */ - const rsDrive = container.resolve('rsDrive'); - await rsDrive.createInitialStateStructure(); - }); - - afterEach(async () => { - if (container) { - await container.dispose(); - } - }); - - describe('Identity', () => { - let assetLockPrivateKey; - let instantAssetLockProof; - let privateKeys; - - beforeEach(async function beforeEachFunction() { - assetLockPrivateKey = new PrivateKey(); - - instantAssetLockProof = getInstantAssetLockProofFixture(assetLockPrivateKey); - - identity = getBiggestPossibleIdentity(); - identity.id = instantAssetLockProof.createIdentifier(); - identity.setAssetLockProof(instantAssetLockProof); - - // Generate real keys - const { BasicSchemeMPL } = await BlsSignatures.getInstance(); - - privateKeys = identity.getPublicKeys().map((identityPublicKey) => { - const randomBytes = new Uint8Array(crypto.randomBytes(256)); - - const privateKey = BasicSchemeMPL.keyGen(randomBytes); - const publicKey = privateKey.getG1(); - const publicKeyBuffer = Buffer.from(publicKey.serialize()); - - identityPublicKey.setData(publicKeyBuffer); - - const result = Buffer.from(privateKey.serialize()); - - privateKey.delete(); - publicKey.delete(); - - return result; - }); - - stateRepository.verifyInstantLock = this.sinon.stub().resolves(true); - }); - - describe('IdentityCreateTransition', () => { - it('should have predicted fee more than actual fee', async () => { - const stateTransition = dpp.identity.createIdentityCreateTransition(identity); - - // Sign public keys - const publicKeys = stateTransition.getPublicKeys(); - - for (let i = 0; i < publicKeys.length; i++) { - await stateTransition.signByPrivateKey( - privateKeys[i], - IdentityPublicKey.TYPES.BLS12_381, - ); - - publicKeys[i].setSignature(stateTransition.getSignature()); - - stateTransition.setSignature(undefined); - } - - // Sign state transition - await stateTransition.signByPrivateKey( - assetLockPrivateKey, - IdentityPublicKey.TYPES.ECDSA_SECP256K1, - ); - - await expectPredictedFeeHigherOrEqualThanActual(dpp, groveDBStore, stateTransition); - }); - }); - - describe('IdentityTopUpTransition', () => { - it('should have predicted fee more than actual fee', async () => { - await stateRepository.createIdentity(identity); - - const stateTransition = dpp.identity.createIdentityTopUpTransition( - identity.getId(), - instantAssetLockProof, - ); - - await stateTransition.signByPrivateKey( - assetLockPrivateKey, - IdentityPublicKey.TYPES.ECDSA_SECP256K1, - ); - - await expectPredictedFeeHigherOrEqualThanActual(dpp, groveDBStore, stateTransition); - }); - }); - - describe('IdentityUpdateTransition', () => { - it('should have predicted fee more than actual fee', async () => { - await stateRepository.createIdentity(identity); - - const newIdentityPublicKeys = []; - const disableIdentityPublicKeys = []; - - const { BasicSchemeMPL } = await BlsSignatures.getInstance(); - - const newPrivateKeys = []; - for (let i = 0; i < identityUpdateTransitionSchema.properties.addPublicKeys.maxItems; i++) { - const randomBytes = new Uint8Array(crypto.randomBytes(256)); - const privateKey = BasicSchemeMPL.keyGen(randomBytes); - const publicKey = privateKey.getG1(); - const publicKeyBuffer = Buffer.from(publicKey.serialize()); - - newPrivateKeys.push(privateKey); - - newIdentityPublicKeys.push( - new IdentityPublicKey({ - id: i + identity.getPublicKeys().length, - type: IdentityPublicKey.TYPES.BLS12_381, - data: publicKeyBuffer, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: i === 0 - ? IdentityPublicKey.SECURITY_LEVELS.MASTER : IdentityPublicKey.SECURITY_LEVELS.HIGH, - readOnly: false, - }), - ); - - disableIdentityPublicKeys.push(identity.getPublicKeyById(i)); - - publicKey.delete(); - } - - const stateTransition = dpp.identity.createIdentityUpdateTransition( - identity, - { - add: newIdentityPublicKeys, - disable: disableIdentityPublicKeys, - }, - ); - - const [signerKey] = identity.getPublicKeys(); - - const starterPromise = Promise.resolve(null); - - await stateTransition.getPublicKeysToAdd().reduce( - (previousPromise, publicKey) => previousPromise.then(async () => { - const privateKey = newPrivateKeys[publicKey.getId() - identity.getPublicKeys().length]; - - if (!privateKey) { - throw new Error(`Private key for key ${publicKey.getId()} not found`); - } - - stateTransition.setSignaturePublicKeyId(signerKey.getId()); - - await stateTransition.signByPrivateKey(privateKey, publicKey.getType()); - - publicKey.setSignature(stateTransition.getSignature()); - - stateTransition.setSignature(undefined); - stateTransition.setSignaturePublicKeyId(undefined); - }), - starterPromise, - ); - - await stateTransition.sign( - identity.getPublicKeyById(0), - privateKeys[0], - ); - - await expectPredictedFeeHigherOrEqualThanActual(dpp, groveDBStore, stateTransition); - }); - }); - }); - - describe('DataContract', () => { - let dataContract; - let privateKey; - - beforeEach(async () => { - // Create identity - - privateKey = new PrivateKey(); - - identity = new Identity({ - protocolVersion: 1, - id: generateRandomIdentifier().toBuffer(), - publicKeys: [ - { - id: 0, - type: IdentityPublicKey.TYPES.BLS12_381, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, - readOnly: false, - data: Buffer.alloc(48).fill(255), - }, - { - id: 1, - type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.HIGH, - readOnly: false, - data: privateKey.toPublicKey().toBuffer(), - }, - ], - balance: Math.floor(9223372036854775807 / 10000), - revision: 0, - }); - - await stateRepository.createIdentity(identity); - - // Generate Data Contract - - const documents = createDataContractDocuments(); - - dataContract = dpp.dataContract.create(identity.getId(), documents); - }); - - describe('DataContractCreate', () => { - it('should have predicted fee more than actual fee', async () => { - const stateTransition = dpp.dataContract.createDataContractCreateTransition(dataContract); - - await stateTransition.sign( - identity.getPublicKeyById(1), - privateKey, - ); - - await expectPredictedFeeHigherOrEqualThanActual(dpp, groveDBStore, stateTransition); - }); - }); - - describe('DataContractUpdate', () => { - it('should have predicted fee more than actual fee', async () => { - await stateRepository.createDataContract(dataContract); - - dataContract.incrementVersion(); - - const documents = dataContract.getDocuments(); - - documents.newDoc = { - type: 'object', - indices: [ - { - name: 'onwerIdToUser', - properties: [ - { $ownerId: 'asc' }, - { user: 'asc' }, - ], - unique: true, - }, - ], - properties: { - user: { - type: 'string', - maxLength: 63, - }, - publicKey: { - type: 'array', - byteArray: true, - maxItems: 33, - }, - }, - required: ['user', 'publicKey'], - additionalProperties: false, - }; - - dataContract.setDocuments(documents); - - const stateTransition = dpp.dataContract.createDataContractUpdateTransition(dataContract); - - await stateTransition.sign( - identity.getPublicKeyById(1), - privateKey, - ); - - await expectPredictedFeeHigherOrEqualThanActual(dpp, groveDBStore, stateTransition); - }); - }); - }); - - describe('Document', () => { - let documents; - let dataContract; - let privateKey; - - beforeEach(async () => { - // Create Identity - - privateKey = new PrivateKey(); - - identity = new Identity({ - protocolVersion: 1, - id: generateRandomIdentifier().toBuffer(), - publicKeys: [ - { - id: 0, - type: IdentityPublicKey.TYPES.BLS12_381, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, - readOnly: false, - data: Buffer.alloc(48).fill(255), - }, - { - id: 1, - type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.HIGH, - readOnly: false, - data: privateKey.toPublicKey().toBuffer(), - }, - ], - balance: Math.floor(9223372036854775807 / 10000), - revision: 0, - }); - - await stateRepository.createIdentity(identity); - - // Create Data Contract - - const documentTypes = createDataContractDocuments(); - - dataContract = dpp.dataContract.create(identity.getId(), documentTypes); - - await stateRepository.createDataContract(dataContract); - - // Create documents - - documents = []; - - let i = 0; - for (const documentType of Object.keys(documentTypes)) { - const data = {}; - - for (const propertyName of Object.keys(documentTypes[documentType].properties)) { - data[propertyName] = `${crypto.randomBytes(31).toString('hex')}a`; - } - - const document = dpp.document.create( - dataContract, - identity.getId(), - documentType, - data, - ); - - documents.push(document); - - i += 1; - - if (i === 10) { - break; - } - } - }); - - describe('DocumentsBatchTransition', () => { - context('create', () => { - it('should have predicted fee more than actual fee', async () => { - const stateTransition = dpp.document.createStateTransition({ - create: documents, - }); - - await stateTransition.sign( - identity.getPublicKeyById(1), - privateKey, - ); - - await expectPredictedFeeHigherOrEqualThanActual(dpp, groveDBStore, stateTransition); - }); - }); - - context('replace', () => { - it('should have predicted fee more than actual fee', async () => { - for (const document of documents) { - await stateRepository.createDocument(document); - } - - for (const document of documents) { - const data = document.getData(); - - for (const propertyName of Object.keys(data)) { - data[propertyName] = `${crypto.randomBytes(31).toString('hex')}b`; - } - - document.setData(data); - } - - const stateTransition = dpp.document.createStateTransition({ - replace: documents, - }); - - await stateTransition.sign( - identity.getPublicKeyById(1), - privateKey, - ); - - await expectPredictedFeeHigherOrEqualThanActual(dpp, groveDBStore, stateTransition); - }); - }); - - context('delete', () => { - it('should have predicted fee more than actual fee', async () => { - for (const document of documents) { - await stateRepository.createDocument(document); - } - - const stateTransition = dpp.document.createStateTransition({ - delete: documents, - }); - - await stateTransition.sign( - identity.getPublicKeyById(1), - privateKey, - ); - - await expectPredictedFeeHigherOrEqualThanActual(dpp, groveDBStore, stateTransition); - }); - }); - }); - }); -}); diff --git a/packages/js-drive/test/integration/groveDB/GroveDBStore.spec.js b/packages/js-drive/test/integration/groveDB/GroveDBStore.spec.js deleted file mode 100644 index 162c155e7fd..00000000000 --- a/packages/js-drive/test/integration/groveDB/GroveDBStore.spec.js +++ /dev/null @@ -1,423 +0,0 @@ -const rimraf = require('rimraf'); - -const Drive = require('@dashevo/rs-drive'); -const GroveDBStore = require('../../../lib/storage/GroveDBStore'); -const logger = require('../../../lib/util/noopLogger'); -const StorageResult = require('../../../lib/storage/StorageResult'); - -describe('GroveDBStore', () => { - let rsDrive; - let store; - let key; - let value; - let testTreePath; - let otherTreePath; - - beforeEach(async () => { - rsDrive = new Drive('./db/grovedb_test', { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - store = new GroveDBStore(rsDrive, logger); - - testTreePath = [Buffer.from('testTree')]; - otherTreePath = [Buffer.from('otherTree')]; - - await store.createTree([], testTreePath[0]); - await store.createTree([], otherTreePath[0]); - - key = Buffer.alloc(32).fill(1); - value = Buffer.alloc(32).fill(2); - }); - - afterEach(async () => { - await rsDrive.close(); - rimraf.sync('./db/grovedb_test'); - }); - - describe('#put', () => { - it('should store value', async () => { - const result = await store.put(testTreePath, key, value); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const actualValue = await rsDrive.getGroveDB().get(testTreePath, key); - - expect(actualValue).to.be.deep.equal({ - type: 'item', - value, - }); - }); - - it('should store value in transaction', async () => { - await store.startTransaction(); - - // store data in transaction - await store.put(testTreePath, key, value, { - useTransaction: true, - }); - - // check we don't have data in db before commit - try { - await rsDrive.getGroveDB().get(testTreePath, key); - - expect.fail('Should fail with NotFoundError error'); - } catch (e) { - expect(e.message.startsWith('grovedb: path key not found: key not found in Merk')).to.be.true(); - } - - // check we can't fetch data without transaction - const notFoundValueResult = await store.get(testTreePath, key); - - expect(notFoundValueResult.getValue()).to.be.null(); - - // check we can fetch data inside transaction - const valueFromTransactionResult = await store.get(testTreePath, key, { - useTransaction: true, - }); - - expect(valueFromTransactionResult).to.be.instanceOf(StorageResult); - expect(valueFromTransactionResult.getOperations().length).to.equal(0); - - expect(valueFromTransactionResult.getValue()).to.deep.equal(value); - - await store.commitTransaction(); - - // check we have data in db after commit - const storedValue = await rsDrive.getGroveDB().get(testTreePath, key); - - expect(storedValue).to.deep.equal({ - type: 'item', - value, - }); - }); - }); - - describe('#get', () => { - it('should return null if key was not found', async () => { - const result = await store.get(testTreePath, key); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.null(); - }); - - it('should return stored value', async () => { - await rsDrive.getGroveDB().insert( - testTreePath, - key, - { type: 'item', value }, - false, - ); - - const result = await store.get(testTreePath, key); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.deep.equal(value); - }); - - it('should return stored value with transaction', async () => { - await store.put(testTreePath, key, value); - - await store.startTransaction(); - - const result = await store.get(testTreePath, key, { - useTransaction: true, - }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.deep.equal(value); - }); - }); - - describe('#putReference', () => { - it('should put an item by reference', async () => { - await store.put(otherTreePath, key, value); - - const result = await store.putReference(testTreePath, key, [otherTreePath[0], key]); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const getResult = await store.get(testTreePath, key); - - expect(getResult.getValue()).to.deep.equal(value); - }); - - it('should put an item by reference in transaction', async () => { - await store.put(otherTreePath, key, value); - - await store.startTransaction(); - - const result = await store.putReference(testTreePath, key, [otherTreePath[0], key], { - useTransaction: true, - }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const nonTxResult = await store.get(testTreePath, key); - - expect(nonTxResult.getValue()).to.be.null(); - - const txResult = await store.get(testTreePath, key, { - useTransaction: true, - }); - - expect(txResult.getValue()).to.deep.equal(value); - }); - }); - - describe('#query', () => { - it('should return results', async () => { - await store.put(testTreePath, key, value); - - const result = await store.query({ - path: testTreePath, - query: { - query: { - items: [ - { - type: 'rangeFull', - }, - ], - }, - }, - }); - - expect(result).to.have.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.have.lengthOf(1); - - const [item] = result.getValue(); - - expect(item).to.deep.equal(value); - }); - }); - - describe('#proveQuery', () => { - it('should return proof', async () => { - await store.put(testTreePath, key, value); - - const result = await store.proveQuery({ - path: testTreePath, - query: { - query: { - items: [ - { - type: 'rangeFull', - }, - ], - }, - }, - }); - - expect(result).to.have.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.an.instanceOf(Buffer); - expect(result.getValue().length).to.be.greaterThan(0); - }); - }); - - describe('#delete', () => { - it('should delete value', async () => { - await store.put(testTreePath, key, value); - - const result = await store.delete(testTreePath, key); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - try { - await rsDrive.getGroveDB().get(testTreePath, key); - - expect.fail('should throw no value found for key error'); - } catch (e) { - expect(e.message.startsWith('grovedb: path key not found: key not found in Merk')).to.be.true(); - } - }); - - it('should delete value in transaction', async () => { - await store.put(testTreePath, key, value); - - await store.startTransaction(); - - // Delete a value from transaction - const result = await store.delete(testTreePath, key, { - useTransaction: true, - }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - // Now it should be absent there - const valueFromTransactionResult = await store.get(testTreePath, key, { - useTransaction: true, - }); - - expect(valueFromTransactionResult.getValue()).to.be.null(); - - // But should be still present in store - const valueFromStoreResult = await store.get(testTreePath, key); - expect(valueFromStoreResult.getValue()).to.deep.equal(value); - - await store.commitTransaction(); - - // When we commit transaction this key should disappear from store too - const valueFromStoreAfterCommitResult = await store.get(testTreePath, key); - expect(valueFromStoreAfterCommitResult.getValue()).to.be.null(); - }); - }); - - describe('#getAux', () => { - it('should get an auxiliary data from db', async () => { - await rsDrive.getGroveDB().putAux(key, value); - - const result = await store.getAux(key); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.deep.equal(value); - }); - - it('should get an auxiliary data from db with transaction', async () => { - await rsDrive.getGroveDB().putAux(key, value); - - await store.startTransaction(); - - const result = await store.getAux(key, { - useTransaction: true, - }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.deep.equal(value); - }); - }); - - describe('#putAux', () => { - it('should put an auxiliary data', async () => { - await store.putAux(key, value); - - const result = await rsDrive.getGroveDB().getAux(key); - - expect(result).to.deep.equal(value); - }); - - it('should put an auxiliary data using transaction', async () => { - await store.startTransaction(); - - await store.putAux(key, value, { - useTransaction: true, - }); - - const nonTxResult = await rsDrive.getGroveDB().getAux(key); - - expect(nonTxResult).to.be.null(); - - const txResult = await rsDrive.getGroveDB().getAux(key, true); - - expect(txResult).to.deep.equal(value); - }); - }); - - describe('#deleteAux', () => { - it('should delete an auxiliary data', async () => { - await store.putAux(key, value); - - const getResult = await store.getAux(key); - - expect(getResult.getValue()).to.deep.equal(value); - - const deleteResult = await store.deleteAux(key); - - expect(deleteResult).to.be.instanceOf(StorageResult); - expect(deleteResult.getOperations().length).to.equal(0); - - const deletedValue = await rsDrive.getGroveDB().getAux(key); - - expect(deletedValue).to.be.null(); - }); - - it('should delete an auxiliary data within transaction', async () => { - await store.putAux(key, value); - - await store.startTransaction(); - - const deleteResult = await store.deleteAux(key, { - useTransaction: true, - }); - - expect(deleteResult).to.be.instanceOf(StorageResult); - expect(deleteResult.getOperations().length).to.equal(0); - - const nonTxResult = await store.getAux(key); - - expect(nonTxResult.getValue()).to.deep.equal(value); - - const txResult = await store.getAux(key, { - useTransaction: true, - }); - - expect(txResult.getValue()).to.be.null(); - }); - }); - - describe('#getRootHash', () => { - it('should return a null hash for empty store', async () => { - await rsDrive.close(); - - rimraf.sync('./db/grovedb_test'); - - rsDrive = new Drive('./db/grovedb_test', { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - store = new GroveDBStore(rsDrive, logger); - - const result = await store.getRootHash(); - - expect(result).to.deep.equal(Buffer.alloc(32).fill(0)); - }); - - it('should return a root hash for store with value', async () => { - await store.put(testTreePath, key, value); - - const valueHash = Buffer.from('9522321fe08ddbbd5a37cf875cdd7f7a104ac9b9e9246f1454b7360341b29124', 'hex'); - - const result = await store.getRootHash(); - - expect(result).to.deep.equal(valueHash); - }); - }); -}); diff --git a/packages/js-drive/test/integration/identity/IdentityBalanceStoreRepository.spec.js b/packages/js-drive/test/integration/identity/IdentityBalanceStoreRepository.spec.js deleted file mode 100644 index 86e79eca563..00000000000 --- a/packages/js-drive/test/integration/identity/IdentityBalanceStoreRepository.spec.js +++ /dev/null @@ -1,452 +0,0 @@ -const fs = require('fs'); -const Drive = require('@dashevo/rs-drive'); -const { FeeResult } = require('@dashevo/rs-drive'); -const decodeProtocolEntityFactory = require('@dashevo/dpp/lib/decodeProtocolEntityFactory'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const GroveDBStore = require('../../../lib/storage/GroveDBStore'); -const IdentityBalanceStoreRepository = require('../../../lib/identity/IdentityBalanceStoreRepository'); -const IdentityStoreRepository = require('../../../lib/identity/IdentityStoreRepository'); -const logger = require('../../../lib/util/noopLogger'); -const StorageResult = require('../../../lib/storage/StorageResult'); -const BlockInfo = require('../../../lib/blockExecution/BlockInfo'); - -describe('IdentityStoreRepository', () => { - let rsDrive; - let store; - let balanceRepository; - let identityRepository; - let decodeProtocolEntity; - let identity; - let blockInfo; - - beforeEach(async () => { - rsDrive = new Drive('./db/grovedb_test', { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - await rsDrive.createInitialStateStructure(); - - store = new GroveDBStore(rsDrive, logger); - - decodeProtocolEntity = decodeProtocolEntityFactory(); - - balanceRepository = new IdentityBalanceStoreRepository(store, decodeProtocolEntity); - identityRepository = new IdentityStoreRepository(store, decodeProtocolEntity); - identity = getIdentityFixture(); - - blockInfo = new BlockInfo(1, 1, Date.now()); - }); - - afterEach(async () => { - await rsDrive.close(); - - fs.rmSync('./db/grovedb_test', { recursive: true, force: true }); - }); - - describe('#add', () => { - beforeEach(async () => { - await identityRepository.create( - identity, - blockInfo, - ); - }); - - it('should add to balance', async () => { - const amount = 100; - - const result = await balanceRepository.add( - identity.getId(), - amount, - blockInfo, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - const fetchedIdentityResult = await identityRepository.fetch( - identity.getId(), - ); - - const fetchedIdentity = fetchedIdentityResult.getValue(); - - expect(fetchedIdentity.getBalance()).to.equal(identity.getBalance() + amount); - }); - - it('should add to balance using transaction', async () => { - await store.startTransaction(); - - const amount = 100; - - await balanceRepository.add( - identity.getId(), - amount, - blockInfo, - { useTransaction: true }, - ); - - const previousIdentityResult = await identityRepository.fetch( - identity.getId(), - ); - - const previousIdentity = previousIdentityResult.getValue(); - - expect(previousIdentity.getBalance()).to.equal(identity.getBalance()); - - const transactionalIdentityResult = await identityRepository.fetch( - identity.getId(), - { useTransaction: true }, - ); - - const transactionalIdentity = transactionalIdentityResult.getValue(); - - expect(transactionalIdentity.getBalance()).to.equal(identity.getBalance() + amount); - - await store.commitTransaction(); - - const committedIdentityResult = await identityRepository.fetch( - identity.getId(), - ); - - const committedIdentity = committedIdentityResult.getValue(); - - expect(committedIdentity.getBalance()).to.equal(identity.getBalance() + amount); - }); - }); - - describe('#applyFees', () => { - beforeEach(async () => { - identity.setBalance(10000); - - await identityRepository.create( - identity, - blockInfo, - ); - }); - - it('should apply fees to balance', async () => { - const feeResult = FeeResult.create(1000, 100, []); - - const result = await balanceRepository.applyFees( - identity.getId(), - feeResult, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.instanceOf(FeeResult); - - const fetchedIdentityResult = await identityRepository.fetch( - identity.getId(), - ); - - const fetchedIdentity = fetchedIdentityResult.getValue(); - - expect(fetchedIdentity.getBalance()).to.equal( - identity.getBalance() - feeResult.storageFee - feeResult.processingFee, - ); - }); - - it('should add to balance using transaction', async () => { - await store.startTransaction(); - - const feeResult = FeeResult.create(1000, 100, []); - - await balanceRepository.applyFees( - identity.getId(), - feeResult, - { useTransaction: true }, - ); - - const previousIdentityResult = await identityRepository.fetch( - identity.getId(), - ); - - const previousIdentity = previousIdentityResult.getValue(); - - expect(previousIdentity.getBalance()).to.equal(identity.getBalance()); - - const transactionalIdentityResult = await identityRepository.fetch( - identity.getId(), - { useTransaction: true }, - ); - - const transactionalIdentity = transactionalIdentityResult.getValue(); - - expect(transactionalIdentity.getBalance()).to.equal( - identity.getBalance() - feeResult.storageFee - feeResult.processingFee, - ); - - await store.commitTransaction(); - - const committedIdentityResult = await identityRepository.fetch( - identity.getId(), - ); - - const committedIdentity = committedIdentityResult.getValue(); - - expect(committedIdentity.getBalance()).to.equal( - identity.getBalance() - feeResult.storageFee - feeResult.processingFee, - ); - }); - }); - - describe('#remove', () => { - beforeEach(async () => { - await identityRepository.create( - identity, - blockInfo, - ); - }); - - it('should remove from balance', async () => { - const amount = 5; - - const result = await balanceRepository.remove( - identity.getId(), - amount, - blockInfo, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - const fetchedIdentityResult = await identityRepository.fetch( - identity.getId(), - ); - - const fetchedIdentity = fetchedIdentityResult.getValue(); - - expect(fetchedIdentity.getBalance()).to.equal(identity.getBalance() - amount); - }); - - it('should remove from balance using transaction', async () => { - await store.startTransaction(); - - const amount = 5; - - await balanceRepository.remove( - identity.getId(), - amount, - blockInfo, - { useTransaction: true }, - ); - - const previousIdentityResult = await identityRepository.fetch( - identity.getId(), - ); - - const previousIdentity = previousIdentityResult.getValue(); - - expect(previousIdentity.getBalance()).to.equal(identity.getBalance()); - - const transactionalIdentityResult = await identityRepository.fetch( - identity.getId(), - { useTransaction: true }, - ); - - const transactionalIdentity = transactionalIdentityResult.getValue(); - - expect(transactionalIdentity.getBalance()).to.equal(identity.getBalance() - amount); - - await store.commitTransaction(); - - const committedIdentityResult = await identityRepository.fetch( - identity.getId(), - ); - - const committedIdentity = committedIdentityResult.getValue(); - - expect(committedIdentity.getBalance()).to.equal(identity.getBalance() - amount); - }); - }); - - describe('#fetch', () => { - context('without block info', () => { - it('should fetch null if identity not found', async () => { - const result = await balanceRepository.fetch(identity.getId()); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.null(); - }); - - it('should fetch balance', async () => { - await identityRepository.create(identity, blockInfo); - - const result = await balanceRepository.fetch(identity.getId()); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const balance = result.getValue(); - - expect(balance).to.equals(identity.getBalance()); - }); - - it('should fetch an identity using transaction', async () => { - await store.startTransaction(); - - await identityRepository.create(identity, blockInfo, { - useTransaction: true, - }); - - const notFoundBalanceResult = await balanceRepository.fetch(identity.getId(), { - useTransaction: false, - }); - - expect(notFoundBalanceResult.getValue()).to.be.null(); - - const transactionalBalanceResult = await balanceRepository.fetch(identity.getId(), { - useTransaction: true, - }); - - const transactionalBalance = transactionalBalanceResult.getValue(); - - expect(transactionalBalance).to.equals(identity.getBalance()); - - await store.commitTransaction(); - - const storedBalanceResult = await balanceRepository.fetch(identity.getId()); - - const storedBalance = storedBalanceResult.getValue(); - - expect(storedBalance).to.equals(identity.getBalance()); - }); - }); - - context('with block info', () => { - it('should fetch null if identity not found', async () => { - const result = await balanceRepository.fetch(identity.getId(), { blockInfo }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - expect(result.getValue()).to.be.null(); - }); - - it('should fetch an identity', async () => { - await identityRepository.create(identity, blockInfo); - - const result = await balanceRepository.fetch(identity.getId(), { blockInfo }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - const storedBalance = result.getValue(); - - expect(storedBalance).to.equals(identity.getBalance()); - }); - - it('should fetch an identity using transaction', async () => { - await store.startTransaction(); - - await identityRepository.create(identity, blockInfo, { - useTransaction: true, - }); - - const notFoundBalanceResult = await balanceRepository.fetch(identity.getId(), { - blockInfo, - useTransaction: false, - }); - - expect(notFoundBalanceResult.getValue()).to.be.null(); - - const transactionalBalanceResult = await balanceRepository.fetch(identity.getId(), { - blockInfo, - useTransaction: true, - }); - - const transactionalBalance = transactionalBalanceResult.getValue(); - - expect(transactionalBalance).to.equals(identity.getBalance()); - - await store.commitTransaction(); - - const storedBalanceResult = await balanceRepository.fetch(identity.getId(), { - blockInfo, - }); - - const storedBalance = storedBalanceResult.getValue(); - - expect(storedBalance).to.equals(identity.getBalance()); - }); - }); - }); - - describe('#fetchWithDebt', () => { - it('should fetch null if identity not found', async () => { - const result = await balanceRepository.fetchWithDebt(identity.getId(), blockInfo); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - expect(result.getValue()).to.be.null(); - }); - - it('should fetch an identity', async () => { - await identityRepository.create(identity, blockInfo); - - const result = await balanceRepository.fetchWithDebt(identity.getId(), blockInfo); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - const storedBalance = result.getValue(); - - expect(storedBalance).to.equals(identity.getBalance()); - }); - - it('should fetch an identity using transaction', async () => { - await store.startTransaction(); - - await identityRepository.create(identity, blockInfo, { - useTransaction: true, - }); - - const notFoundBalanceResult = await balanceRepository.fetchWithDebt( - identity.getId(), - blockInfo, - { - useTransaction: false, - }, - ); - - expect(notFoundBalanceResult.getValue()).to.be.null(); - - const transactionalBalanceResult = await balanceRepository.fetchWithDebt( - identity.getId(), - blockInfo, - { - useTransaction: true, - }, - ); - - const transactionalBalance = transactionalBalanceResult.getValue(); - - expect(transactionalBalance).to.equals(identity.getBalance()); - - await store.commitTransaction(); - - const storedBalanceResult = await balanceRepository.fetchWithDebt( - identity.getId(), - blockInfo, - ); - - const storedBalance = storedBalanceResult.getValue(); - - expect(storedBalance).to.equals(identity.getBalance()); - }); - }); -}); diff --git a/packages/js-drive/test/integration/identity/IdentityPublicKeyStoreRepository.spec.js b/packages/js-drive/test/integration/identity/IdentityPublicKeyStoreRepository.spec.js deleted file mode 100644 index b51a68f8c25..00000000000 --- a/packages/js-drive/test/integration/identity/IdentityPublicKeyStoreRepository.spec.js +++ /dev/null @@ -1,177 +0,0 @@ -const fs = require('fs'); -const Drive = require('@dashevo/rs-drive'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const decodeProtocolEntityFactory = require('@dashevo/dpp/lib/decodeProtocolEntityFactory'); -const IdentityPublicKeyStoreRepository = require('../../../lib/identity/IdentityPublicKeyStoreRepository'); -const GroveDBStore = require('../../../lib/storage/GroveDBStore'); -const logger = require('../../../lib/util/noopLogger'); -const StorageResult = require('../../../lib/storage/StorageResult'); -const IdentityStoreRepository = require('../../../lib/identity/IdentityStoreRepository'); -const BlockInfo = require('../../../lib/blockExecution/BlockInfo'); - -describe('IdentityPublicKeyStoreRepository', () => { - let rsDrive; - let store; - let publicKeyRepository; - let identityRepository; - let identity; - let blockInfo; - - beforeEach(async () => { - rsDrive = new Drive('./db/grovedb_test', { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - store = new GroveDBStore(rsDrive, logger); - - await rsDrive.createInitialStateStructure(); - - const decodeProtocolEntity = decodeProtocolEntityFactory(); - - identityRepository = new IdentityStoreRepository(store, decodeProtocolEntity); - - publicKeyRepository = new IdentityPublicKeyStoreRepository(store, decodeProtocolEntity); - - identity = getIdentityFixture(); - - blockInfo = new BlockInfo(1, 1, Date.now()); - }); - - afterEach(async () => { - await rsDrive.close(); - - fs.rmSync('./db/grovedb_test', { recursive: true, force: true }); - }); - - describe('#add', () => { - it('should add public keys to identity', async () => { - const publicKey = identity.getPublicKeys().pop(); - - await identityRepository.create(identity, blockInfo); - - const result = await publicKeyRepository.add( - identity.getId(), - [publicKey], - blockInfo, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - const fetchedIdentityResult = await identityRepository.fetch(identity.getId()); - - const fetchedIdentity = fetchedIdentityResult.getValue(); - - identity.getPublicKeys().push(publicKey); - - expect(fetchedIdentity.toObject()).to.deep.equals(identity.toObject()); - }); - - it('should store public key to identities using transaction', async () => { - const publicKey = identity.getPublicKeys().pop(); - - await identityRepository.create(identity, blockInfo); - - await store.startTransaction(); - - await publicKeyRepository.add( - identity.getId(), - [publicKey], - blockInfo, - { useTransaction: true }, - ); - - const noKeyIdentityResult = await identityRepository.fetch(identity.getId()); - - const noKeyIdentity = noKeyIdentityResult.getValue(); - - expect(noKeyIdentity.toObject()).to.deep.equals(identity.toObject()); - - const transactionalIdentityResult = await identityRepository.fetch(identity.getId(), { - useTransaction: true, - }); - - const transactionalIdentity = transactionalIdentityResult.getValue(); - - identity.getPublicKeys().push(publicKey); - - expect(transactionalIdentity.toObject()).to.deep.equals(identity.toObject()); - - await store.commitTransaction(); - - const committedIdentityResult = await identityRepository.fetch(identity.getId()); - - const committedIdentity = committedIdentityResult.getValue(); - - expect(committedIdentity.toObject()).to.deep.equals(identity.toObject()); - }); - }); - - describe('#disable', () => { - it('should disable public keys in identity', async () => { - await identityRepository.create(identity, blockInfo); - - const result = await publicKeyRepository.disable( - identity.getId(), - [0, 1], - Date.now(), - blockInfo, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - const fetchedIdentityResult = await identityRepository.fetch(identity.getId()); - - const fetchedIdentity = fetchedIdentityResult.getValue(); - - expect(fetchedIdentity.toObject()).to.not.deep.equals(identity.toObject()); - }); - - it('should store public key to identities using transaction', async () => { - await identityRepository.create(identity, blockInfo); - - await store.startTransaction(); - - await publicKeyRepository.disable( - identity.getId(), - [0, 1], - Date.now(), - blockInfo, - { useTransaction: true }, - ); - - const noChangeIdentityResult = await identityRepository.fetch(identity.getId()); - - const noChangeIdentity = noChangeIdentityResult.getValue(); - - expect(noChangeIdentity.toObject()).to.deep.equals(identity.toObject()); - - const transactionalIdentityResult = await identityRepository.fetch(identity.getId(), { - useTransaction: true, - }); - - const transactionalIdentity = transactionalIdentityResult.getValue(); - - expect(transactionalIdentity.toObject()).to.not.deep.equals(identity.toObject()); - - await store.commitTransaction(); - - const committedIdentityResult = await identityRepository.fetch(identity.getId()); - - const committedIdentity = committedIdentityResult.getValue(); - - expect(committedIdentity.toObject()).to.not.deep.equals(identity.toObject()); - }); - }); -}); diff --git a/packages/js-drive/test/integration/identity/IdentityStoreRepository.spec.js b/packages/js-drive/test/integration/identity/IdentityStoreRepository.spec.js deleted file mode 100644 index dce6fe8f74b..00000000000 --- a/packages/js-drive/test/integration/identity/IdentityStoreRepository.spec.js +++ /dev/null @@ -1,544 +0,0 @@ -const fs = require('fs'); -const Drive = require('@dashevo/rs-drive'); -const decodeProtocolEntityFactory = require('@dashevo/dpp/lib/decodeProtocolEntityFactory'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const Identity = require('@dashevo/dpp/lib/identity/Identity'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const GroveDBStore = require('../../../lib/storage/GroveDBStore'); -const IdentityStoreRepository = require('../../../lib/identity/IdentityStoreRepository'); -const logger = require('../../../lib/util/noopLogger'); -const StorageResult = require('../../../lib/storage/StorageResult'); -const BlockInfo = require('../../../lib/blockExecution/BlockInfo'); - -describe('IdentityStoreRepository', () => { - let rsDrive; - let store; - let repository; - let decodeProtocolEntity; - let identity; - let blockInfo; - let publicKeyHashes; - - beforeEach(async () => { - rsDrive = new Drive('./db/grovedb_test', { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - await rsDrive.createInitialStateStructure(); - - store = new GroveDBStore(rsDrive, logger); - - decodeProtocolEntity = decodeProtocolEntityFactory(); - - repository = new IdentityStoreRepository(store, decodeProtocolEntity); - identity = getIdentityFixture(); - - blockInfo = new BlockInfo(1, 1, Date.now()); - - publicKeyHashes = identity.getPublicKeys().map((k) => k.hash()); - }); - - afterEach(async () => { - await rsDrive.close(); - - fs.rmSync('./db/grovedb_test', { recursive: true, force: true }); - }); - - describe('#create', () => { - it('should create an identity', async () => { - const result = await repository.create( - identity, - blockInfo, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - const fetchedResult = await rsDrive.fetchIdentity( - identity.getId(), - ); - - expect(fetchedResult.toObject()).to.be.deep.equal(identity.toObject()); - }); - - it('should store identity using transaction', async () => { - await store.startTransaction(); - - await repository.create( - identity, - blockInfo, - { useTransaction: true }, - ); - - const notFoundIdentity = await rsDrive.fetchIdentity( - identity.getId(), - ); - - expect(notFoundIdentity).to.be.null(); - - const identityTransaction = await rsDrive.fetchIdentity( - identity.getId(), - true, - ); - - expect(identityTransaction.toObject()).to.deep.equal(identity.toObject()); - - await store.commitTransaction(); - - const committedIdentity = await rsDrive.fetchIdentity( - identity.getId(), - ); - - expect(committedIdentity.toObject()).to.deep.equal(identity.toObject()); - }); - }); - - describe('#updateRevision', () => { - beforeEach(async () => { - await repository.create( - identity, - blockInfo, - ); - }); - - it('should update revision', async () => { - const revision = 2; - - const result = await repository.updateRevision( - identity.getId(), - revision, - blockInfo, - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - const fetchedIdentity = await rsDrive.fetchIdentity( - identity.getId(), - ); - - expect(fetchedIdentity.getRevision()).to.equal(revision); - }); - - it('should remove from balance using transaction', async () => { - await store.startTransaction(); - - const revision = 2; - - await repository.updateRevision( - identity.getId(), - revision, - blockInfo, - { useTransaction: true }, - ); - - const previousIdentity = await rsDrive.fetchIdentity( - identity.getId(), - ); - - expect(previousIdentity.getRevision()).to.equal(identity.getRevision()); - - const transactionalIdentity = await rsDrive.fetchIdentity( - identity.getId(), - true, - ); - - expect(transactionalIdentity.getRevision()).to.equal(revision); - - await store.commitTransaction(); - - const commitedIdentity = await rsDrive.fetchIdentity( - identity.getId(), - ); - - expect(commitedIdentity.getRevision()).to.equal(revision); - }); - }); - - describe('#fetch', () => { - context('without block info', () => { - it('should fetch null if identity not found', async () => { - const result = await repository.fetch(identity.getId()); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.null(); - }); - - it('should fetch an identity', async () => { - await rsDrive.insertIdentity(identity, blockInfo); - - const result = await repository.fetch(identity.getId()); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const storedIdentity = result.getValue(); - - expect(storedIdentity).to.be.an.instanceof(Identity); - expect(storedIdentity.toObject()).to.deep.equal(identity.toObject()); - }); - - it('should fetch an identity using transaction', async () => { - await store.startTransaction(); - - await rsDrive.insertIdentity(identity, blockInfo, true); - - const notFoundIdentityResult = await repository.fetch(identity.getId(), { - useTransaction: false, - }); - - expect(notFoundIdentityResult.getValue()).to.be.null(); - - const transactionalIdentityResult = await repository.fetch(identity.getId(), { - useTransaction: true, - }); - - const transactionalIdentity = transactionalIdentityResult.getValue(); - - expect(transactionalIdentity).to.be.an.instanceof(Identity); - expect(transactionalIdentity.toObject()).to.deep.equal(identity.toObject()); - - await store.commitTransaction(); - - const storedIdentityResult = await repository.fetch(identity.getId()); - - const storedIdentity = storedIdentityResult.getValue(); - - expect(storedIdentity).to.be.an.instanceof(Identity); - expect(storedIdentity.toObject()).to.deep.equal(identity.toObject()); - }); - }); - - context('with block info', () => { - it('should fetch null if identity not found', async () => { - const result = await repository.fetch(identity.getId(), { blockInfo }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - expect(result.getValue()).to.be.null(); - }); - - it('should fetch an identity', async () => { - await rsDrive.insertIdentity(identity, blockInfo); - - const result = await repository.fetch(identity.getId(), { blockInfo }); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(1); - - const storedIdentity = result.getValue(); - - expect(storedIdentity).to.be.an.instanceof(Identity); - expect(storedIdentity.toObject()).to.deep.equal(identity.toObject()); - }); - - it('should fetch an identity using transaction', async () => { - await store.startTransaction(); - - await rsDrive.insertIdentity(identity, blockInfo, true); - - const notFoundIdentityResult = await repository.fetch(identity.getId(), { - blockInfo, - useTransaction: false, - }); - - expect(notFoundIdentityResult.getValue()).to.be.null(); - - const transactionalIdentityResult = await repository.fetch(identity.getId(), { - blockInfo, - useTransaction: true, - }); - - const transactionalIdentity = transactionalIdentityResult.getValue(); - - expect(transactionalIdentity).to.be.an.instanceof(Identity); - expect(transactionalIdentity.toObject()).to.deep.equal(identity.toObject()); - - await store.commitTransaction(); - - const storedIdentityResult = await repository.fetch(identity.getId(), { - blockInfo, - }); - - const storedIdentity = storedIdentityResult.getValue(); - - expect(storedIdentity).to.be.an.instanceof(Identity); - expect(storedIdentity.toObject()).to.deep.equal(identity.toObject()); - }); - }); - }); - - describe('#fetchByPublicKeyHashes', () => { - it('should fetch an identities by public key hashes', async () => { - await rsDrive.insertIdentity(identity, blockInfo); - - const result = await repository.fetchManyByPublicKeyHashes( - publicKeyHashes.concat([Buffer.alloc(20)]), - ); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const fetchedIdentities = result.getValue(); - - for (let i = 0; i < identity.getPublicKeys().length; i++) { - const fetchedIdentity = fetchedIdentities[i]; - - expect(fetchedIdentity).to.be.instanceOf(Identity); - expect(fetchedIdentity).to.deep.equal(identity.toObject()); - } - }); - }); - - describe('#proveManyByPublicKeyHashes', () => { - it('should fetch proof if public key to identities map not found', async () => { - const result = await repository.proveManyByPublicKeyHashes([ - Buffer.alloc(20, 1), - Buffer.alloc(20, 2), - ]); - - expect(result).to.be.instanceOf(StorageResult); - - expect(result.getValue()).to.be.an.instanceOf(Buffer); - expect(result.getValue().length).to.be.greaterThan(0); - }); - - it('should return proof', async () => { - await repository.create(identity, blockInfo); - - const result = await repository.proveManyByPublicKeyHashes(publicKeyHashes); - - expect(result).to.be.instanceOf(StorageResult); - - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.an.instanceOf(Buffer); - expect(result.getValue().length).to.be.greaterThan(0); - }); - - // TODO: Enable when transactions will be supported for queries with proofs - it.skip('should return proof map using transaction', async () => { - await store.startTransaction(); - - await repository.create(identity, blockInfo, { useTransaction: true }); - - // Should return proof of non-existence - let result = await repository.proveManyByPublicKeyHashes(publicKeyHashes); - - expect(result).to.be.instanceOf(StorageResult); - - expect(result.getValue()).to.be.an.instanceOf(Buffer); - expect(result.getValue().length).to.be.greaterThan(0); - - // Should return proof of existence - result = await repository.proveManyByPublicKeyHashes( - publicKeyHashes, - { useTransaction: true }, - ); - - expect(result).to.be.instanceOf(StorageResult); - - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.an.instanceOf(Buffer); - expect(result.getValue().length).to.be.greaterThan(0); - - await store.commitTransaction(); - - // Should return proof of existence - result = await repository.proveManyByPublicKeyHashes(publicKeyHashes); - - expect(result).to.be.instanceOf(StorageResult); - - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.an.instanceOf(Buffer); - expect(result.getValue().length).to.be.greaterThan(0); - }); - }); - - describe('#prove', () => { - it('should return prove if identity does not exist', async () => { - const result = await repository.prove(identity.getId()); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceof(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should return proof', async () => { - await repository.create(identity, blockInfo); - - const result = await repository.prove(identity.getId()); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceof(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - // TODO enable this test when we support transactions - it.skip('should return proof using transaction', async () => { - await store.startTransaction(); - - await store.createTree( - IdentityStoreRepository.TREE_PATH, - identity.getId().toBuffer(), - { useTransaction: true }, - ); - - await store.put( - IdentityStoreRepository.TREE_PATH.concat([identity.getId().toBuffer()]), - IdentityStoreRepository.IDENTITY_KEY, - identity.toBuffer(), - { useTransaction: true }, - ); - - const notFoundProof = await repository.prove(identity.getId(), { - useTransaction: false, - }); - - expect(notFoundProof.getValue()).to.be.null(); - - const transactionalIdentityResult = await repository.prove(identity.getId(), { - useTransaction: true, - }); - - const transactionalProof = transactionalIdentityResult.getValue(); - - expect(transactionalProof).to.be.an.instanceof(Buffer); - expect(transactionalProof.length).to.be.greaterThan(0); - - await store.commitTransaction(); - - const storedIdentityResult = await repository.prove(identity.getId()); - - const storedProof = storedIdentityResult.getValue(); - - expect(storedProof).to.be.an.instanceof(Buffer); - expect(storedProof.length).to.be.greaterThan(0); - }); - }); - - describe('#proveMany', () => { - let identity2; - - beforeEach(async () => { - // Set correct but unique public key data - const data = Buffer.from(identity.getPublicKeys()[0].getData()); - data[data.length - 1] = 2; - - identity2 = new Identity({ - protocolVersion: 1, - id: generateRandomIdentifier().toBuffer(), - publicKeys: [ - { - id: 0, - type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, - readOnly: false, - data, - }, - ], - balance: 10, - revision: 0, - }); - }); - - it('should return proof if identity does not exist', async () => { - await repository.create(identity, blockInfo); - - const result = await repository.proveMany([identity.getId(), identity2.getId()]); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceof(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - it('should return proof', async () => { - await repository.create(identity, blockInfo); - await repository.create(identity2, blockInfo); - - const result = await repository.proveMany([identity.getId(), identity2.getId()]); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const proof = result.getValue(); - - expect(proof).to.be.an.instanceof(Buffer); - expect(proof.length).to.be.greaterThan(0); - }); - - // TODO enable this test when we support transactions - it.skip('should return proof using transaction', async () => { - await store.startTransaction(); - - await store.createTree( - IdentityStoreRepository.TREE_PATH, - identity.getId().toBuffer(), - { useTransaction: true }, - ); - - await store.put( - IdentityStoreRepository.TREE_PATH.concat([identity.getId().toBuffer()]), - IdentityStoreRepository.IDENTITY_KEY, - identity.toBuffer(), - { useTransaction: true }, - ); - - const notFoundProof = await repository.proveMany([identity.getId(), identity2.getId()], { - useTransaction: false, - }); - - expect(notFoundProof.getValue()).to.be.null(); - - const transactionalIdentityResult = await repository.proveMany( - [identity.getId(), identity2.getId()], - { useTransaction: true }, - ); - - const transactionalProof = transactionalIdentityResult.getValue(); - - expect(transactionalProof).to.be.an.instanceof(Buffer); - expect(transactionalProof.length).to.be.greaterThan(0); - - await store.commitTransaction(); - - const storedIdentityResult = await repository.proveMany( - [identity.getId(), identity2.getId()], - ); - - const storedProof = storedIdentityResult.getValue(); - - expect(storedProof).to.be.an.instanceof(Buffer); - expect(storedProof.length).to.be.greaterThan(0); - }); - }); -}); diff --git a/packages/js-drive/test/integration/identity/SpentAssetLockTransactionsRepository.spec.js b/packages/js-drive/test/integration/identity/SpentAssetLockTransactionsRepository.spec.js deleted file mode 100644 index b21ab1687fc..00000000000 --- a/packages/js-drive/test/integration/identity/SpentAssetLockTransactionsRepository.spec.js +++ /dev/null @@ -1,85 +0,0 @@ -const Drive = require('@dashevo/rs-drive'); -const fs = require('fs'); - -const SpentAssetLockTransactionsRepository = require('../../../lib/identity/SpentAssetLockTransactionsRepository'); -const StorageResult = require('../../../lib/storage/StorageResult'); -const GroveDBStore = require('../../../lib/storage/GroveDBStore'); -const logger = require('../../../lib/util/noopLogger'); - -describe('SpentAssetLockTransactionsRepository', () => { - let outPointBuffer; - let repository; - let store; - let rsDrive; - - beforeEach(async () => { - outPointBuffer = Buffer.from([42]); - - rsDrive = new Drive('./db/grovedb_test', { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - store = new GroveDBStore(rsDrive, logger); - - await rsDrive.createInitialStateStructure(); - - repository = new SpentAssetLockTransactionsRepository(store); - }); - - afterEach(async () => { - await rsDrive.close(); - fs.rmSync('./db/grovedb_test', { recursive: true }); - }); - - describe('#store', () => { - it('should store outpoint', async () => { - const result = await repository.store(outPointBuffer); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const placeholderResult = await store.get( - SpentAssetLockTransactionsRepository.TREE_PATH, - outPointBuffer, - ); - - expect(placeholderResult.getValue()).to.deep.equal(Buffer.from([0])); - }); - }); - - describe('#fetch', () => { - it('should return null if outpoint is not present', async () => { - const result = await repository.fetch(outPointBuffer); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.null(); - }); - - it('should return buffer containing [0]', async () => { - await store.put( - SpentAssetLockTransactionsRepository.TREE_PATH, - outPointBuffer, - Buffer.from([0]), - ); - - const result = await repository.fetch(outPointBuffer); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.deep.equal(Buffer.from([0])); - }); - }); -}); diff --git a/packages/js-drive/test/integration/identity/masternode/LastSyncedCoreHeightRepository.spec.js b/packages/js-drive/test/integration/identity/masternode/LastSyncedCoreHeightRepository.spec.js deleted file mode 100644 index d9c75f95503..00000000000 --- a/packages/js-drive/test/integration/identity/masternode/LastSyncedCoreHeightRepository.spec.js +++ /dev/null @@ -1,89 +0,0 @@ -const Drive = require('@dashevo/rs-drive'); -const fs = require('fs'); - -const LastSyncedSmlHeightRepository = require('../../../../lib/identity/masternode/LastSyncedCoreHeightRepository'); -const StorageResult = require('../../../../lib/storage/StorageResult'); -const GroveDBStore = require('../../../../lib/storage/GroveDBStore'); -const logger = require('../../../../lib/util/noopLogger'); - -describe('LastSyncedSmlHeightRepository', () => { - let repository; - let store; - let rsDrive; - - beforeEach(async () => { - rsDrive = new Drive('./db/grovedb_test', { - drive: { - dataContractsGlobalCacheSize: 500, - dataContractsBlockCacheSize: 500, - }, - core: { - rpc: { - url: '127.0.0.1', - username: '', - password: '', - }, - }, - }); - - store = new GroveDBStore(rsDrive, logger); - - repository = new LastSyncedSmlHeightRepository(store); - - // Create initial structure - await rsDrive.createInitialStateStructure(false); - }); - - afterEach(async () => { - await rsDrive.close(); - fs.rmSync('./db/grovedb_test', { recursive: true }); - }); - - describe('#store', () => { - it('should store last synced height', async () => { - const result = await repository.store(1); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - const placeholderResult = await store.get( - LastSyncedSmlHeightRepository.TREE_PATH, - LastSyncedSmlHeightRepository.KEY, - ); - - const encodedValue = placeholderResult.getValue(); - - expect(encodedValue.readUInt32BE()).to.deep.equal(1); - }); - }); - - describe('#fetch', () => { - it('should return null if last synced height is not present', async () => { - const result = await repository.fetch(); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.null(); - }); - - it('should return last synced height', async () => { - const encodedValue = Buffer.alloc(4); - - encodedValue.writeUInt32BE(1); - - await store.put( - LastSyncedSmlHeightRepository.TREE_PATH, - LastSyncedSmlHeightRepository.KEY, - encodedValue, - ); - - const result = await repository.fetch(); - - expect(result).to.be.instanceOf(StorageResult); - expect(result.getOperations().length).to.equal(0); - - expect(result.getValue()).to.be.deep.equal(1); - }); - }); -}); diff --git a/packages/js-drive/test/integration/identity/masternode/synchronizeMasternodeIdentitiesFactory.spec.js b/packages/js-drive/test/integration/identity/masternode/synchronizeMasternodeIdentitiesFactory.spec.js deleted file mode 100644 index 78a548b476c..00000000000 --- a/packages/js-drive/test/integration/identity/masternode/synchronizeMasternodeIdentitiesFactory.spec.js +++ /dev/null @@ -1,1093 +0,0 @@ -const { - asValue, -} = require('awilix'); - -const SimplifiedMNListEntry = require('@dashevo/dashcore-lib/lib/deterministicmnlist/SimplifiedMNListEntry'); -const { hash } = require('@dashevo/dpp/lib/util/hash'); -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); - -const Address = require('@dashevo/dashcore-lib/lib/address'); -const Script = require('@dashevo/dashcore-lib/lib/script'); -const createTestDIContainer = require('../../../../lib/test/createTestDIContainer'); -const createOperatorIdentifier = require('../../../../lib/identity/masternode/createOperatorIdentifier'); -const BlockInfo = require('../../../../lib/blockExecution/BlockInfo'); -const createVotingIdentifier = require('../../../../lib/identity/masternode/createVotingIdentifier'); -const getSystemIdentityPublicKeysFixture = require('../../../../lib/test/fixtures/getSystemIdentityPublicKeysFixture'); - -/** - * @param {IdentityStoreRepository} identityRepository - * @param {IdentityPublicKeyStoreRepository} identityPublicKeyRepository - * @param {getWithdrawPubKeyTypeFromPayoutScript} getWithdrawPubKeyTypeFromPayoutScript - * @param {getPublicKeyFromPayoutScript} getPublicKeyFromPayoutScript - * @returns {expectOperatorIdentity} - */ -function expectOperatorIdentityFactory( - identityRepository, - identityPublicKeyRepository, - getWithdrawPubKeyTypeFromPayoutScript, - getPublicKeyFromPayoutScript, -) { - /** - * @typedef {expectOperatorIdentity} - * @param {SimplifiedMNListEntry} smlEntry - * @param {Address} [previousPayoutAddress] - * @param {Address} [payoutAddress] - * @returns {Promise} - */ - async function expectOperatorIdentity( - smlEntry, - previousPayoutAddress, - payoutAddress, - ) { - // Validate operator identity - - const operatorIdentifier = createOperatorIdentifier(smlEntry); - - const operatorIdentityResult = await identityRepository.fetch( - operatorIdentifier, - { useTransaction: true }, - ); - - const operatorIdentity = operatorIdentityResult.getValue(); - - expect(operatorIdentity).to.exist(); - - // Validate operator public keys - - const operatorPubKey = Buffer.from(smlEntry.pubKeyOperator, 'hex'); - - let publicKeysNum = 1; - if (payoutAddress) { - publicKeysNum += 1; - } - if (previousPayoutAddress) { - publicKeysNum += 1; - } - - expect(operatorIdentity.getPublicKeys()) - .to - .have - .lengthOf(publicKeysNum); - - const firstOperatorMasternodePublicKey = operatorIdentity.getPublicKeyById(0); - expect(firstOperatorMasternodePublicKey.getType()) - .to - .equal(IdentityPublicKey.TYPES.BLS12_381); - expect(firstOperatorMasternodePublicKey.getData()) - .to - .deep - .equal(operatorPubKey); - - const firstOperatorIdentityByPublicKeyHashResult = await identityRepository - .fetchByPublicKeyHash(firstOperatorMasternodePublicKey.hash(), { useTransaction: true }); - - const firstOperatorIdentityByPublicKeyHash = firstOperatorIdentityByPublicKeyHashResult - .getValue(); - - expect(firstOperatorIdentityByPublicKeyHash).to.be.not.null(); - expect(firstOperatorIdentityByPublicKeyHash.getId()) - .to - .deep - .equal(operatorIdentifier); - - let i = 0; - - if (previousPayoutAddress) { - i += 1; - const payoutScript = new Script(previousPayoutAddress); - const publicKeyType = getWithdrawPubKeyTypeFromPayoutScript(payoutScript); - - const payoutPublicKey = operatorIdentity.getPublicKeyById(i); - expect(payoutPublicKey.getType()).to.equal(publicKeyType); - expect(payoutPublicKey.getData()).to.deep.equal( - getPublicKeyFromPayoutScript(payoutScript, publicKeyType), - ); - - const masternodeIdentityByPayoutPublicKeyHashResult = await identityPublicKeyRepository - .fetch(payoutPublicKey.hash(), { useTransaction: true }); - - const masternodeIdentityByPayoutPublicKeyHash = masternodeIdentityByPayoutPublicKeyHashResult - .getValue(); - - expect(masternodeIdentityByPayoutPublicKeyHash).to.have.lengthOf(1); - expect(masternodeIdentityByPayoutPublicKeyHash[0].toBuffer()) - .to.deep.equal(operatorIdentifier); - } - - if (payoutAddress) { - i += 1; - const payoutScript = new Script(payoutAddress); - const publicKeyType = getWithdrawPubKeyTypeFromPayoutScript(payoutScript); - - const payoutPublicKey = operatorIdentity.getPublicKeyById(i); - expect(payoutPublicKey.getType()).to.equal(publicKeyType); - expect(payoutPublicKey.getData()).to.deep.equal( - getPublicKeyFromPayoutScript(payoutScript, publicKeyType), - ); - - const masternodeIdentityByPayoutPublicKeyHashResult = await identityRepository - .fetchByPublicKeyHash(payoutPublicKey.hash(), { useTransaction: true }); - - const masternodeIdentityByPayoutPublicKeyHash = masternodeIdentityByPayoutPublicKeyHashResult - .getValue(); - - expect(masternodeIdentityByPayoutPublicKeyHash).to.be.not.null(); - expect(masternodeIdentityByPayoutPublicKeyHash.getId()) - .to.deep.equal(operatorIdentifier); - } - } - - return expectOperatorIdentity; -} - -/** - * @param {IdentityStoreRepository} identityRepository - * @returns {expectVotingIdentity} - */ -function expectVotingIdentityFactory( - identityRepository, -) { - /** - * @typedef {expectVotingIdentity} - * @param {SimplifiedMNListEntry} smlEntry - * @param {Buffer} proRegTx - * @returns {Promise} - */ - async function expectVotingIdentity( - smlEntry, - proRegTx, - ) { - // Validate voting identity - - const votingIdentifier = createVotingIdentifier(smlEntry); - - const votingIdentityResult = await identityRepository.fetch(votingIdentifier, { - useTransaction: true, - }); - - const votingIdentity = votingIdentityResult.getValue(); - - expect(votingIdentity) - .to - .exist(); - - // Validate voting public keys - - expect(votingIdentity.getPublicKeys()) - .to - .have - .lengthOf(1); - - const masternodePublicKey = votingIdentity.getPublicKeyById(0); - expect(masternodePublicKey.getType()).to.equal(IdentityPublicKey.TYPES.ECDSA_HASH160); - expect(masternodePublicKey.getData()).to.deep.equal( - Buffer.from(proRegTx.extraPayload.keyIDVoting, 'hex').reverse(), - ); - - const masternodeIdentityByPublicKeyHashResult = await identityRepository - .fetchByPublicKeyHash(masternodePublicKey.hash(), { - useTransaction: true, - }); - - const masternodeIdentityByPublicKeyHash = masternodeIdentityByPublicKeyHashResult.getValue(); - - expect(masternodeIdentityByPublicKeyHash).to.be.not.null(); - expect(masternodeIdentityByPublicKeyHash.getId()) - .to.deep.equal(votingIdentifier); - } - - return expectVotingIdentity; -} - -/** - * @param {IdentityStoreRepository} identityRepository - * @param {IdentityPublicKeyStoreRepository} identityPublicKeyRepository - * @param {getWithdrawPubKeyTypeFromPayoutScript} getWithdrawPubKeyTypeFromPayoutScript - * @param {getPublicKeyFromPayoutScript} getPublicKeyFromPayoutScript - * @returns {expectMasternodeIdentity} - */ -function expectMasternodeIdentityFactory( - identityRepository, - identityPublicKeyRepository, - getWithdrawPubKeyTypeFromPayoutScript, - getPublicKeyFromPayoutScript, -) { - /** - * @typedef {expectMasternodeIdentity} - * @param {SimplifiedMNListEntry} smlEntry - * @param {Object} proRegTx - * @param {Address} [previousPayoutAddress] - * @param {Address} [payoutAddress] - * @returns {Promise} - */ - async function expectMasternodeIdentity( - smlEntry, - proRegTx, - previousPayoutAddress, - payoutAddress, - ) { - const masternodeIdentifier = Identifier.from( - Buffer.from(smlEntry.proRegTxHash, 'hex'), - ); - - const masternodeIdentityResult = await identityRepository.fetch( - masternodeIdentifier, - { useTransaction: true }, - ); - - const masternodeIdentity = masternodeIdentityResult.getValue(); - - expect(masternodeIdentity).to.be.not.null(); - - // Validate masternode identity public keys - let publicKeysNum = 1; - if (payoutAddress) { - publicKeysNum += 1; - } - if (previousPayoutAddress) { - publicKeysNum += 1; - } - - expect(masternodeIdentity.getPublicKeys()).to.have.lengthOf(publicKeysNum); - - const masternodePublicKey = masternodeIdentity.getPublicKeyById(0); - expect(masternodePublicKey.getType()).to.equal(IdentityPublicKey.TYPES.ECDSA_HASH160); - expect(masternodePublicKey.getData()).to.deep.equal( - Buffer.from(proRegTx.extraPayload.keyIDOwner, 'hex').reverse(), - ); - - const masternodeIdentityByPublicKeyHashResult = await identityRepository - .fetchManyByPublicKeyHashes([masternodePublicKey.hash()], { useTransaction: true }); - - const masternodeIdentityByPublicKeyHash = masternodeIdentityByPublicKeyHashResult.getValue(); - - expect(masternodeIdentityByPublicKeyHash).to.have.lengthOf(1); - expect(masternodeIdentityByPublicKeyHash[0].getId()) - .to.deep.equal(masternodeIdentifier); - - let i = 0; - - if (previousPayoutAddress) { - i += 1; - const payoutScript = new Script(previousPayoutAddress); - const publicKeyType = getWithdrawPubKeyTypeFromPayoutScript(payoutScript); - - const payoutPublicKey = masternodeIdentity.getPublicKeyById(i); - expect(payoutPublicKey.getType()).to.equal(publicKeyType); - expect(payoutPublicKey.getData()).to.deep.equal( - getPublicKeyFromPayoutScript(payoutScript, publicKeyType), - ); - - const masternodeIdentityByPayoutPublicKeyHashResult = await identityRepository - .fetchByPublicKeyHash(payoutPublicKey.hash(), { useTransaction: true }); - - const masternodeIdentityByPayoutPublicKeyHash = masternodeIdentityByPayoutPublicKeyHashResult - .getValue(); - - expect(masternodeIdentityByPayoutPublicKeyHash).to.not.be.null(); - expect(masternodeIdentityByPayoutPublicKeyHash.getId()) - .to.deep.equal(masternodeIdentifier); - } - - if (payoutAddress) { - i += 1; - const payoutScript = new Script(payoutAddress); - const publicKeyType = getWithdrawPubKeyTypeFromPayoutScript(payoutScript); - - const payoutPublicKey = masternodeIdentity.getPublicKeyById(i); - expect(payoutPublicKey.getType()).to.equal(publicKeyType); - expect(payoutPublicKey.getData()).to.deep.equal( - getPublicKeyFromPayoutScript(payoutScript, publicKeyType), - ); - - const masternodeIdentityByPayoutPublicKeyHashResult = await identityRepository - .fetchByPublicKeyHash(payoutPublicKey.hash(), { useTransaction: true }); - - const masternodeIdentityByPayoutPublicKeyHash = masternodeIdentityByPayoutPublicKeyHashResult - .getValue(); - - expect(masternodeIdentityByPayoutPublicKeyHash).to.not.be.null(); - expect(masternodeIdentityByPayoutPublicKeyHash.getId()) - .to.deep.equal(masternodeIdentifier); - } - } - - return expectMasternodeIdentity; -} - -/** - * @param {GroveDBStore} groveDBStore - * @returns {expectDeterministicAppHash} - */ -function expectDeterministicAppHashFactory(groveDBStore) { - /** - * @typedef {expectDeterministicAppHash} - * @param {string} appHash - * @returns {Promise} - */ - async function expectDeterministicAppHash(appHash) { - const actualAppHash = await groveDBStore.getRootHash({ useTransaction: true }); - - const actualAppHashHex = actualAppHash.toString('hex'); - - expect(actualAppHashHex).to.deep.equal(appHash); - } - - return expectDeterministicAppHash; -} - -// TODO: Enable keys when we have support of non unique keys in DPP -describe.skip('synchronizeMasternodeIdentitiesFactory', function main() { - this.timeout(10000); - let container; - let coreHeight; - let fetchSimplifiedMNListMock; - let fetchedSimplifiedMNList; - let fetchTransactionMock; - let smlStoreMock; - let smlFixture; - let newSmlFixture; - let transaction1; - let transaction2; - let transaction3; - let synchronizeMasternodeIdentities; - let rewardsDataContract; - let identityRepository; - let documentRepository; - let identityPublicKeyRepository; - let expectOperatorIdentity; - let expectVotingIdentity; - let expectMasternodeIdentity; - let expectDeterministicAppHash; - let firstSyncAppHash; - let blockInfo; - - beforeEach(async function beforeEach() { - coreHeight = 3; - firstSyncAppHash = 'c55de453e3ea4481f20225efdc12d671f715f0618cf3084bb32e56e75123bfdd'; - blockInfo = new BlockInfo(10, 0, 1668702100799); - - container = await createTestDIContainer(); - - // Mock Core RPC - - fetchedSimplifiedMNList = { - mnList: [], - }; - - fetchSimplifiedMNListMock = this.sinon.stub().resolves(fetchedSimplifiedMNList); - - container.register('fetchSimplifiedMNList', asValue(fetchSimplifiedMNListMock)); - - // Mock SML - - smlFixture = [ - new SimplifiedMNListEntry({ - proRegTxHash: 'a2c9b34ef525271d84f70a0d4d2c107e8a2f81cd4d8256dc7b3911ed253d5611', - confirmedHash: '29ff8afb463604ba7d984b483e92dfefa4e80e12de3acae6d75f9b910df9eab6', - service: '192.168.65.2:20201', - pubKeyOperator: 'a5ad6d8cad7b233210b718a5fc9ec3cea18aeebe38b2e3122deb581e430aa28875fe7336c283871db42808f8d4107745', - votingAddress: 'yRXtaRmQ7LCmT5XcgzQdLwPEf31dycBaeY', - isValid: true, - payoutAddress: 'yR843jN58m5dubmQjfUmKDDJMJzNatFV9M', - payoutOperatorAddress: 'yNjsnYM16J5NZPA2P8BKJG3MKfUD7XHAFE', - nType: 0, - }), - new SimplifiedMNListEntry({ - proRegTxHash: 'f5ec54aed788c434da2fc535ea6b125ec6fc54e58bc0a00a005d1a8d5e477a90', - confirmedHash: '53125505b0e9d11b371cf3e12c92d164296dfa215fde6201d28ea44bed992187', - service: '192.168.65.2:20101', - pubKeyOperator: '951a3208ba531ea75aedd2dc0a9efc75f2c4d9492f1ee0a989b593bcd9722b1a101774d80a426552a9f91d24eb55af6e', - votingAddress: 'yYH1rgZsgvkmT8bSSSw1cKCjyVPnFpTBCw', - isValid: true, - payoutAddress: 'ycL7L4mhYoaZdm9TH85svvpfeKtdfo249u', - nType: 0, - }), - ]; - - newSmlFixture = [ - new SimplifiedMNListEntry({ - proRegTxHash: '1c81a5faa2c0e0d96eb59c58a10fcbc87f431bb6cd880d960b43b269e682d2d2', - confirmedHash: '03cc2acc135ab51304d3cff42215c7a8041902fa3f19451d5562a03b38143e8f', - service: '192.168.65.2:20001', - pubKeyOperator: '96f83eedc8a7b87663e591987f051ce341a6fb88989322c64bbbf56d205e4e77d2cb7d839d8b4106a8a1f5d5cf7cfa57', - votingAddress: 'ybJfuKs59MJWkPEnS8qNmtvdisHrCy7Njn', - isValid: true, - payoutAddress: '7UkJidhNjEPJCQnCTXeaJKbJmL4JuyV66w', - payoutOperatorAddress: 'yPDBTHAjPwJfZSSQYczccA78XRS2tZ5fZF', - nType: 0, - }), - ]; - - smlStoreMock = { - getSMLbyHeight: this.sinon.stub().returns({ mnList: smlFixture }), - }; - - const simplifiedMasternodeListMock = { - getStore: this.sinon.stub().returns(smlStoreMock), - }; - - container.register('simplifiedMasternodeList', asValue(simplifiedMasternodeListMock)); - - // Mock fetchTransaction - - fetchTransactionMock = this.sinon.stub(); - - transaction1 = { - extraPayload: { - operatorReward: 100, - keyIDOwner: Buffer.alloc(20).fill('a').toString('hex'), - keyIDVoting: Buffer.alloc(20).fill('b').toString('hex'), - }, - }; - - transaction2 = { - extraPayload: { - operatorReward: 0, - keyIDOwner: Buffer.alloc(20).fill('c').toString('hex'), - keyIDVoting: Buffer.alloc(20).fill('d').toString('hex'), - }, - }; - - transaction3 = { - extraPayload: { - operatorReward: 200, - keyIDOwner: Buffer.alloc(20).fill('e').toString('hex'), - keyIDVoting: Buffer.alloc(20).fill('f').toString('hex'), - }, - }; - - fetchTransactionMock.withArgs('a2c9b34ef525271d84f70a0d4d2c107e8a2f81cd4d8256dc7b3911ed253d5611').resolves(transaction1); - fetchTransactionMock.withArgs('f5ec54aed788c434da2fc535ea6b125ec6fc54e58bc0a00a005d1a8d5e477a90').resolves(transaction2); - fetchTransactionMock.withArgs('1c81a5faa2c0e0d96eb59c58a10fcbc87f431bb6cd880d960b43b269e682d2d2').resolves(transaction3); - - container.register('fetchTransaction', asValue(fetchTransactionMock)); - - const groveDBStore = container.resolve('groveDBStore'); - await groveDBStore.startTransaction(); - - /** - * @type {Drive} - */ - const rsDrive = container.resolve('rsDrive'); - await rsDrive.getAbci().initChain({ - genesisTimeMs: 0, - systemIdentityPublicKeys: getSystemIdentityPublicKeysFixture(), - }, true); - - const masternodeRewardSharesContractId = container.resolve('masternodeRewardSharesContractId'); - - [rewardsDataContract] = await rsDrive.fetchContract(masternodeRewardSharesContractId, 0, true); - - /** - * @type {synchronizeMasternodeIdentities} - */ - synchronizeMasternodeIdentities = container.resolve('synchronizeMasternodeIdentities'); - - identityRepository = container.resolve('identityRepository'); - documentRepository = container.resolve('documentRepository'); - identityPublicKeyRepository = container.resolve('identityPublicKeyRepository'); - const getWithdrawPubKeyTypeFromPayoutScript = container.resolve('getWithdrawPubKeyTypeFromPayoutScript'); - const getPublicKeyFromPayoutScript = container.resolve('getPublicKeyFromPayoutScript'); - - expectOperatorIdentity = expectOperatorIdentityFactory( - identityRepository, - identityPublicKeyRepository, - getWithdrawPubKeyTypeFromPayoutScript, - getPublicKeyFromPayoutScript, - ); - - expectVotingIdentity = expectVotingIdentityFactory( - identityRepository, - ); - - expectMasternodeIdentity = expectMasternodeIdentityFactory( - identityRepository, - identityPublicKeyRepository, - getWithdrawPubKeyTypeFromPayoutScript, - getPublicKeyFromPayoutScript, - ); - - expectDeterministicAppHash = expectDeterministicAppHashFactory( - container.resolve('groveDBStore'), - ); - }); - - afterEach(async () => { - if (container) { - await container.dispose(); - } - }); - - it('should create identities for all masternodes on the first sync', async () => { - const result = await synchronizeMasternodeIdentities(coreHeight, blockInfo); - - expect(result.fromHeight).to.be.equal(0); - expect(result.toHeight).to.be.equal(3); - expect(result.createdEntities).to.have.lengthOf(6); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(0); - - await expectDeterministicAppHash(firstSyncAppHash); - - /** - * Validate first masternode - */ - - // Masternode identity should be created - - await expectMasternodeIdentity( - smlFixture[0], - transaction1, - undefined, - Address.fromString(smlFixture[0].payoutAddress), - ); - - // voting identity should be created - await expectVotingIdentity( - smlFixture[0], - transaction1, - ); - - // Operator identity should be created - - await expectOperatorIdentity(smlFixture[0]); - - // Masternode reward shares should be created - - const firstMasternodeIdentifier = Identifier.from( - Buffer.from(smlFixture[0].proRegTxHash, 'hex'), - ); - - const firstOperatorIdentifier = createOperatorIdentifier(smlFixture[0]); - - let documentsResult = await documentRepository.find( - rewardsDataContract, - 'rewardShare', - { - where: [ - ['$ownerId', '==', firstMasternodeIdentifier], - ['payToId', '==', firstOperatorIdentifier], - ], - useTransaction: true, - }, - ); - - let documents = documentsResult.getValue(); - - expect(documents).to.have.lengthOf(1); - - const expectedDocumentId = Identifier.from( - hash( - Buffer.concat([ - firstMasternodeIdentifier, - firstOperatorIdentifier, - ]), - ), - ); - - expect(documents[0].getId()).to.deep.equal(expectedDocumentId); - expect(documents[0].getOwnerId()).to.deep.equal(firstMasternodeIdentifier); - expect(documents[0].get('percentage')).to.equal(100); - expect(documents[0].get('payToId')).to.deep.equal(firstOperatorIdentifier); - - /** - * Validate second masternode - */ - - // Masternode identity should be created - - await expectMasternodeIdentity( - smlFixture[1], - transaction2, - undefined, - Address.fromString(smlFixture[1].payoutAddress), - ); - - // Voting identity should be created - await expectVotingIdentity( - smlFixture[1], - transaction2, - ); - - // Operator identity shouldn't be created - - const secondOperatorPubKey = Buffer.from(smlFixture[1].pubKeyOperator, 'hex'); - - const secondOperatorIdentifier = Identifier.from( - hash( - Buffer.concat([ - Buffer.from(smlFixture[1].proRegTxHash, 'hex'), - secondOperatorPubKey, - ]), - ), - ); - - const secondOperatorIdentityResult = await identityRepository.fetch( - secondOperatorIdentifier, - { useTransaction: true }, - ); - - const secondOperatorIdentity = secondOperatorIdentityResult.getValue(); - - expect(secondOperatorIdentity).to.be.null(); - - // Masternode reward shares shouldn't be created - - const secondMasternodeIdentifier = Identifier.from( - Buffer.from(smlFixture[1].proRegTxHash, 'hex'), - ); - - documentsResult = await documentRepository.find( - rewardsDataContract, - 'rewardShare', - { - where: [ - ['$ownerId', '==', secondMasternodeIdentifier], - ['payToId', '==', secondOperatorIdentifier], - ], - useTransaction: true, - }, - ); - - documents = documentsResult.getValue(); - - expect(documents).to.have.lengthOf(0); - }); - - it('should sync identities if the gap between coreHeight and lastSyncedCoreHeight > smlMaxListsLimit', async () => { - // Sync initial list - - await synchronizeMasternodeIdentities(coreHeight, blockInfo); - - await expectDeterministicAppHash(firstSyncAppHash); - - const nextCoreHeight = coreHeight + 42; - - // Mock SML - - smlStoreMock.getSMLbyHeight.withArgs(nextCoreHeight).returns({ - mnList: smlFixture.concat(newSmlFixture), - }); - - fetchedSimplifiedMNList.mnList = smlFixture; - - // Second call - - const result = await synchronizeMasternodeIdentities(nextCoreHeight, blockInfo); - - expect(result.fromHeight).to.be.equal(3); - expect(result.toHeight).to.be.equal(45); - expect(result.createdEntities).to.have.lengthOf(4); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(0); - - // Nothing happened - - await expectDeterministicAppHash('a789fe73ceea6769634b98ae82dddad5013c4711b2a8353d2150b813fb953cb3'); - - // Core RPC should be called - - expect(fetchSimplifiedMNListMock).to.have.been.calledOnceWithExactly(1, coreHeight); - }); - - it('should create masternode identities if new masternode appeared', async () => { - // Sync initial list - - const result = await synchronizeMasternodeIdentities(coreHeight, blockInfo); - - expect(result.fromHeight).to.be.equal(0); - expect(result.toHeight).to.be.equal(coreHeight); - expect(result.createdEntities).to.have.lengthOf(6); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(0); - - await expectDeterministicAppHash(firstSyncAppHash); - - // Mock SML - - smlStoreMock.getSMLbyHeight.withArgs(coreHeight + 1).returns( - { mnList: smlFixture.concat(newSmlFixture) }, - ); - - // Second call - - const result2 = await synchronizeMasternodeIdentities(coreHeight + 1, blockInfo); - - expect(result2.fromHeight).to.be.equal(3); - expect(result2.toHeight).to.be.equal(4); - expect(result2.createdEntities).to.have.lengthOf(4); - expect(result2.updatedEntities).to.have.lengthOf(0); - expect(result2.removedEntities).to.have.lengthOf(0); - - await expectDeterministicAppHash('b58bc0499156caea9b930ab0e357f56b20bb191bc7ba97a2eb8941d9ba7a8183'); - - // New masternode identity should be created - - await expectMasternodeIdentity( - newSmlFixture[0], - transaction3, - undefined, - Address.fromString(newSmlFixture[0].payoutAddress), - ); - - // New voting identity should be created - - await expectVotingIdentity( - newSmlFixture[0], - transaction3, - ); - - // New operator should be created - - await expectOperatorIdentity(newSmlFixture[0]); - - // Masternode reward shares should be created - - const newMasternodeIdentifier = Identifier.from( - Buffer.from(newSmlFixture[0].proRegTxHash, 'hex'), - ); - - const newOperatorIdentifier = createOperatorIdentifier(newSmlFixture[0]); - - const documentsResult = await documentRepository.find( - rewardsDataContract, - 'rewardShare', - { - where: [ - ['$ownerId', '==', newMasternodeIdentifier], - ['payToId', '==', newOperatorIdentifier], - ], - useTransaction: true, - }, - ); - - const documents = documentsResult.getValue(); - - expect(documents).to.have.lengthOf(1); - - const expectedDocumentId = Identifier.from( - hash( - Buffer.concat([ - newMasternodeIdentifier, - newOperatorIdentifier, - ]), - ), - ); - - expect(documents[0].getId()).to.deep.equal(expectedDocumentId); - expect(documents[0].getOwnerId()).to.deep.equal(newMasternodeIdentifier); - expect(documents[0].get('percentage')).to.equal(200); - expect(documents[0].get('payToId')).to.deep.equal(newOperatorIdentifier); - }); - - it('should remove reward shares if masternode disappeared', async () => { - // Sync initial list - - await synchronizeMasternodeIdentities(coreHeight, blockInfo); - - await expectDeterministicAppHash(firstSyncAppHash); - - // Mock SML - - smlStoreMock.getSMLbyHeight.withArgs(coreHeight + 1).returns( - { mnList: [smlFixture[1]] }, - ); - - // Second call - - const result = await synchronizeMasternodeIdentities(coreHeight + 1, blockInfo); - - expect(result.fromHeight).to.be.equal(3); - expect(result.toHeight).to.be.equal(4); - expect(result.createdEntities).to.have.lengthOf(0); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(1); - - await expectDeterministicAppHash('ea28d7339efd80984e53bd06b0d3708611f24862f401997e9cd69328af6a54c2'); - - // Masternode identity should stay - - await expectMasternodeIdentity( - smlFixture[0], - transaction1, - undefined, - Address.fromString(smlFixture[0].payoutAddress), - ); - - // Voting identity should stay - - await expectVotingIdentity( - smlFixture[0], - transaction1, - ); - - // Operator identity should stay - - await expectOperatorIdentity(smlFixture[0]); - - // Masternode reward shares should be removed - - const removedMasternodeIdentifier = Buffer.from(smlFixture[0].proRegTxHash, 'hex'); - - const documentsResult = await documentRepository.find( - rewardsDataContract, - 'rewardShare', - { - where: [ - ['$ownerId', '==', removedMasternodeIdentifier], - ], - useTransaction: true, - }, - ); - - const documents = documentsResult.getValue(); - - expect(documents).to.have.lengthOf(0); - }); - - it('should remove reward shares if masternode is not valid', async () => { - // Sync initial list - - await synchronizeMasternodeIdentities(coreHeight, blockInfo); - - await expectDeterministicAppHash(firstSyncAppHash); - - // Mock SML - - const invalidSmlEntry = smlFixture[0].copy(); - invalidSmlEntry.isValid = false; - - smlStoreMock.getSMLbyHeight.withArgs(coreHeight + 1).returns( - { mnList: [smlFixture[1], invalidSmlEntry] }, - ); - - // Second call - - const result = await synchronizeMasternodeIdentities(coreHeight + 1, blockInfo); - - expect(result.fromHeight).to.be.equal(3); - expect(result.toHeight).to.be.equal(4); - expect(result.createdEntities).to.have.lengthOf(0); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(1); - - await expectDeterministicAppHash('ea28d7339efd80984e53bd06b0d3708611f24862f401997e9cd69328af6a54c2'); - - const invalidMasternodeIdentifier = Identifier.from( - Buffer.from(invalidSmlEntry.proRegTxHash, 'hex'), - ); - - // Masternode reward shares should be removed - - const documentsResult = await documentRepository.find( - rewardsDataContract, - 'rewardShare', - { - where: [ - ['$ownerId', '==', invalidMasternodeIdentifier], - ], - useTransaction: true, - }, - ); - - const documents = documentsResult.getValue(); - - expect(documents).to.have.lengthOf(0); - }); - - it('should create operator identity and reward shares if PubKeyOperator was changed', async () => { - // Initial sync - - await synchronizeMasternodeIdentities(coreHeight, blockInfo); - - await expectDeterministicAppHash(firstSyncAppHash); - - // Mock SML - - const changedSmlEntry = smlFixture[0].copy(); - changedSmlEntry.pubKeyOperator = '96f83eedc8a7b87663e591987f051ce341a6fb88989322c64bbbf56d205e4e77d2cb7d839d8b4106a8a1f5d5cf7cfa57'; - - smlStoreMock.getSMLbyHeight.withArgs(coreHeight + 1).returns( - { mnList: [smlFixture[1], changedSmlEntry] }, - ); - - // Second call - - const result = await synchronizeMasternodeIdentities(coreHeight + 1, blockInfo); - - expect(result.fromHeight).to.be.equal(3); - expect(result.toHeight).to.be.equal(4); - expect(result.createdEntities).to.have.lengthOf(2); - expect(result.updatedEntities).to.have.lengthOf(1); - expect(result.removedEntities).to.have.lengthOf(1); - - await expectDeterministicAppHash('d80a3bbf5e699a0295e4ba734e3729d12bef3001bdd9cdd295673832d05454cf'); - - // Masternode identity should stay - - await expectMasternodeIdentity( - smlFixture[0], - transaction1, - undefined, - Address.fromString(smlFixture[0].payoutAddress), - ); - - // Previous voting identity should stay - - await expectVotingIdentity( - smlFixture[0], - transaction1, - ); - - // Previous operator identity should stay - - await expectOperatorIdentity(smlFixture[0]); - - // New operator identity should be created - - await expectOperatorIdentity(changedSmlEntry); - - // Only new masternode reward shares should exist - - const changedMasternodeIdentifier = Identifier.from( - Buffer.from(changedSmlEntry.proRegTxHash, 'hex'), - ); - - const documentsResult = await documentRepository.find( - rewardsDataContract, - 'rewardShare', - { - where: [ - ['$ownerId', '==', changedMasternodeIdentifier], - ], - useTransaction: true, - }, - ); - - const documents = documentsResult.getValue(); - - expect(documents).to.have.lengthOf(1); - - const [document] = documents; - - const newOperatorIdentifier = createOperatorIdentifier(changedSmlEntry); - - expect(document.get('payToId')).to.deep.equal(newOperatorIdentifier); - }); - - it('should handle changed payout, voting and operator payout addresses', async () => { - // Sync initial list - - await synchronizeMasternodeIdentities(coreHeight, blockInfo); - - await expectDeterministicAppHash(firstSyncAppHash); - - // Mock SML - - const changedSmlEntry = smlFixture[0].copy(); - changedSmlEntry.payoutAddress = 'yMLrhooXyJtpV3R2ncsxvkrh6wRennNPoG'; - changedSmlEntry.operatorPayoutAddress = 'yT8DDY5NkX4ZtBkUVz7y1RgzbakCnMPogh'; - - smlStoreMock.getSMLbyHeight.withArgs(coreHeight + 1).returns( - { mnList: [smlFixture[1], changedSmlEntry] }, - ); - - // Second call - - await synchronizeMasternodeIdentities(coreHeight + 1, blockInfo); - - await expectDeterministicAppHash('cfc8c439d00c2afab01594dc699ef71c8b23cff66b0302794d3c6b88c44d687c'); - - // Masternode identity should contain new public key - - await expectMasternodeIdentity( - smlFixture[0], - transaction1, - Address.fromString(smlFixture[0].payoutAddress), - Address.fromString(changedSmlEntry.payoutAddress), - ); - - // Previous voting identity should stay - - await expectVotingIdentity( - smlFixture[0], - transaction1, - ); - - // Previous operator identity should stay - - await expectOperatorIdentity( - smlFixture[0], - undefined, - Address.fromString(changedSmlEntry.operatorPayoutAddress), - ); - - // New operator identity should be created - - await expectOperatorIdentity( - changedSmlEntry, - undefined, - Address.fromString(changedSmlEntry.operatorPayoutAddress), - ); - - // new voting Identity should exist - await expectVotingIdentity( - changedSmlEntry, - transaction1, - ); - - // Only new masternode reward shares should exist - - const changedMasternodeIdentifier = Identifier.from( - Buffer.from(changedSmlEntry.proRegTxHash, 'hex'), - ); - - const documentsResult = await documentRepository.find( - rewardsDataContract, - 'rewardShare', - { - where: [ - ['$ownerId', '==', changedMasternodeIdentifier], - ], - useTransaction: true, - }, - ); - - const documents = documentsResult.getValue(); - - expect(documents).to.have.lengthOf(1); - - const [document] = documents; - - const newOperatorIdentifier = createOperatorIdentifier(changedSmlEntry); - - expect(document.get('payToId')).to.deep.equal(newOperatorIdentifier); - }); - - it('should not create voting Identity if owner and voting keys are the same', async () => { - transaction1 = { - extraPayload: { - operatorReward: 100, - keyIDOwner: Buffer.alloc(20).fill('a').toString('hex'), - keyIDVoting: Buffer.alloc(20).fill('a').toString('hex'), - }, - }; - - fetchTransactionMock.withArgs('a2c9b34ef525271d84f70a0d4d2c107e8a2f81cd4d8256dc7b3911ed253d5611').resolves(transaction1); - - // Initial sync - - await synchronizeMasternodeIdentities(coreHeight, blockInfo); - await expectDeterministicAppHash('7a5729e3511c5cc98e8452faa6132f0d600e04fef85df0f95f56e59c776de170'); - const votingIdentifier = createVotingIdentifier(smlFixture[0]); - - const votingIdentityResult = await identityRepository.fetch( - votingIdentifier, - { useTransaction: true }, - ); - - expect(votingIdentityResult.isNull()).to.be.true(); - }); -}); diff --git a/packages/js-drive/test/unit/abci/closeAbciServerFactory.spec.js b/packages/js-drive/test/unit/abci/closeAbciServerFactory.spec.js deleted file mode 100644 index 37f0f6b4d0e..00000000000 --- a/packages/js-drive/test/unit/abci/closeAbciServerFactory.spec.js +++ /dev/null @@ -1,29 +0,0 @@ -const closeAbciServerFactory = require('../../../lib/abci/closeAbciServerFactory'); - -describe('closeAbciServerFactory', () => { - let closeAbciServer; - let abciServerMock; - - beforeEach(function beforeEach() { - abciServerMock = { - close: this.sinon.spy((resolve) => { - resolve(); - }), - listening: true, - }; - - closeAbciServer = closeAbciServerFactory(abciServerMock); - }); - - it('should close server if it\'s listening', async () => { - await closeAbciServer(); - - expect(abciServerMock.close).to.be.calledOnce(); - }); - - it('should not close server if not listening', async () => { - abciServerMock.listening = false; - - expect(abciServerMock.close).to.not.be.called(); - }); -}); diff --git a/packages/js-drive/test/unit/abci/errors/enrichErrorWithContextLoggerFactory.spec.js b/packages/js-drive/test/unit/abci/errors/enrichErrorWithContextLoggerFactory.spec.js deleted file mode 100644 index d182a4caf3b..00000000000 --- a/packages/js-drive/test/unit/abci/errors/enrichErrorWithContextLoggerFactory.spec.js +++ /dev/null @@ -1,38 +0,0 @@ -const { AsyncLocalStorage } = require('node:async_hooks'); -const enrichErrorWithContextLoggerFactory = require('../../../../lib/abci/errors/enrichErrorWithContextLoggerFactory'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); - -describe('enrichErrorWithContextLoggerFactory', () => { - let enrichErrorWithContextLogger; - let loggerMock; - let asyncLocalStorage; - - beforeEach(function beforeEach() { - loggerMock = new LoggerMock(this.sinon); - - asyncLocalStorage = new AsyncLocalStorage(); - - enrichErrorWithContextLogger = enrichErrorWithContextLoggerFactory(asyncLocalStorage); - }); - - it('should add contextLogger from BlockExecutionContext to thrown error', async () => { - const error = new Error('my error'); - - const method = async () => { - asyncLocalStorage.getStore().set('logger', loggerMock); - - throw error; - }; - - const methodHandler = enrichErrorWithContextLogger(method); - - try { - await methodHandler(); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.equal(error); - expect(e.contextLogger).to.equal(loggerMock); - } - }); -}); diff --git a/packages/js-drive/test/unit/abci/errors/wrapInErrorHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/errors/wrapInErrorHandlerFactory.spec.js deleted file mode 100644 index cfda8a6f1d8..00000000000 --- a/packages/js-drive/test/unit/abci/errors/wrapInErrorHandlerFactory.spec.js +++ /dev/null @@ -1,109 +0,0 @@ -const SomeConsensusError = require('@dashevo/dpp/lib/test/mocks/SomeConsensusError'); -const wrapInErrorHandlerFactory = require('../../../../lib/abci/errors/wrapInErrorHandlerFactory'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); -const InternalAbciError = require('../../../../lib/abci/errors/InternalAbciError'); -const InvalidArgumentAbciError = require('../../../../lib/abci/errors/InvalidArgumentAbciError'); -const VerboseInternalAbciError = require('../../../../lib/abci/errors/VerboseInternalAbciError'); -const DPPValidationAbciError = require('../../../../lib/abci/errors/DPPValidationAbciError'); - -describe('wrapInErrorHandlerFactory', () => { - let loggerMock; - let methodMock; - let request; - let handler; - let wrapInErrorHandler; - - beforeEach(function beforeEach() { - request = { - tx: Buffer.alloc(0), - }; - - loggerMock = new LoggerMock(this.sinon); - - wrapInErrorHandler = wrapInErrorHandlerFactory(loggerMock, true); - methodMock = this.sinon.stub(); - - handler = wrapInErrorHandler( - methodMock, - ); - }); - - it('should respond with internal error code if any Error is thrown in handler and respondWithInternalError enabled', async () => { - handler = wrapInErrorHandler( - methodMock, { respondWithInternalError: true }, - ); - - const error = new Error('Custom error'); - - methodMock.throws(error); - - const response = await handler(request); - - const expectedError = new InternalAbciError(error); - - expect(response).to.deep.equal(expectedError.getAbciResponse()); - }); - - it('should respond with internal error code if an InternalAbciError is thrown in handler and respondWithInternalError enabled', async () => { - handler = wrapInErrorHandler( - methodMock, { respondWithInternalError: true }, - ); - - const data = { sample: 'data' }; - const error = new InternalAbciError(new Error(), data); - - methodMock.throws(error); - - const response = await handler(request); - - expect(response).to.deep.equal(error.getAbciResponse()); - }); - - it('should respond with invalid argument error if it is thrown in handler', async () => { - const data = { sample: 'data' }; - const error = new InvalidArgumentAbciError('test', data); - - methodMock.throws(error); - - const response = await handler(request); - - expect(response).to.deep.equal(error.getAbciResponse()); - }); - - it('should respond with verbose error containing message and stack in debug mode', async () => { - wrapInErrorHandler = wrapInErrorHandlerFactory(loggerMock, false); - - const error = new Error('Custom error'); - - methodMock.throws(error); - - handler = wrapInErrorHandler( - methodMock, { respondWithInternalError: true }, - ); - - const response = await handler(request); - - const expectedError = new VerboseInternalAbciError( - new InternalAbciError(error), - ); - - expect(response).to.deep.equal(expectedError.getAbciResponse()); - }); - - it('should respond with error if method throws DPPValidationAbciError', async () => { - const dppValidationError = new DPPValidationAbciError( - 'Some error', - new SomeConsensusError('Consensus error'), - ); - - methodMock.throws(dppValidationError); - - handler = wrapInErrorHandler( - methodMock, { respondWithInternalError: true }, - ); - - const response = await handler(request); - - expect(response).to.deep.equal(dppValidationError.getAbciResponse()); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/checkTxHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/checkTxHandlerFactory.spec.js deleted file mode 100644 index fd4a5621278..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/checkTxHandlerFactory.spec.js +++ /dev/null @@ -1,54 +0,0 @@ -const { - tendermint: { - abci: { - ResponseCheckTx, - }, - }, -} = require('@dashevo/abci/types'); - -const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); - -const checkTxHandlerFactory = require('../../../../lib/abci/handlers/checkTxHandlerFactory'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); - -describe('checkTxHandlerFactory', () => { - let checkTxHandler; - let request; - let stateTransitionFixture; - let unserializeStateTransitionMock; - let loggerMock; - let createContextLoggerMock; - - beforeEach(function beforeEach() { - stateTransitionFixture = getIdentityCreateTransitionFixture(); - - request = { - tx: stateTransitionFixture.toBuffer(), - }; - - unserializeStateTransitionMock = this.sinon.stub() - .resolves(stateTransitionFixture); - - loggerMock = new LoggerMock(this.sinon); - createContextLoggerMock = this.sinon.stub(); - - checkTxHandler = checkTxHandlerFactory( - unserializeStateTransitionMock, - createContextLoggerMock, - loggerMock, - ); - }); - - it('should validate a State Transition and return response', async () => { - const response = await checkTxHandler(request); - - expect(response).to.be.an.instanceOf(ResponseCheckTx); - expect(response.code).to.equal(0); - - expect(unserializeStateTransitionMock).to.be.calledOnceWith(request.tx); - - expect(createContextLoggerMock).to.be.calledOnceWithExactly(loggerMock, { - abciMethod: 'checkTx', - }); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/extendVoteHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/extendVoteHandlerFactory.spec.js deleted file mode 100644 index 3d646e40a31..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/extendVoteHandlerFactory.spec.js +++ /dev/null @@ -1,68 +0,0 @@ -const { - tendermint: { - abci: { - ResponseExtendVote, - }, - }, -} = require('@dashevo/abci/types'); - -const { hash } = require('@dashevo/dpp/lib/util/hash'); - -const extendVoteHandlerFactory = require('../../../../lib/abci/handlers/extendVoteHandlerFactory'); - -const BlockExecutionContextMock = require('../../../../lib/test/mock/BlockExecutionContextMock'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); - -describe('extendVoteHandlerFactory', () => { - let extendVoteHandler; - let blockExecutionContextMock; - let createContextLoggerMock; - let loggerMock; - - beforeEach(function beforeEach() { - blockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - loggerMock = new LoggerMock(this.sinon); - - blockExecutionContextMock.getContextLogger.returns(loggerMock); - - blockExecutionContextMock.getWithdrawalTransactionsMap.returns({}); - - createContextLoggerMock = this.sinon.stub().returns(loggerMock); - - extendVoteHandler = extendVoteHandlerFactory( - blockExecutionContextMock, - createContextLoggerMock, - ); - }); - - it('should return ResponseExtendVote with vote extensions if withdrawal transactions are present', async () => { - const [txOneBytes, txTwoBytes] = [ - Buffer.alloc(32, 0), - Buffer.alloc(32, 1), - ]; - - blockExecutionContextMock.getWithdrawalTransactionsMap.returns({ - [hash(txOneBytes).toString('hex')]: txOneBytes, - [hash(txTwoBytes).toString('hex')]: txTwoBytes, - }); - - const result = await extendVoteHandler(); - - expect(result).to.be.an.instanceOf(ResponseExtendVote); - expect(result.voteExtensions).to.deep.equal([ - { - type: 1, - extension: hash(txOneBytes), - }, - { - type: 1, - extension: hash(txTwoBytes), - }, - ]); - - expect(createContextLoggerMock).to.be.calledOnceWith(loggerMock, { - abciMethod: 'extendVote', - }); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/finalizeBlockHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/finalizeBlockHandlerFactory.spec.js deleted file mode 100644 index fe254bd9555..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/finalizeBlockHandlerFactory.spec.js +++ /dev/null @@ -1,217 +0,0 @@ -const { - tendermint: { - abci: { - ResponseFinalizeBlock, - RequestProcessProposal, - }, - }, -} = require('@dashevo/abci/types'); - -const Long = require('long'); - -const { hash } = require('@dashevo/dpp/lib/util/hash'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const finalizeBlockHandlerFactory = require('../../../../lib/abci/handlers/finalizeBlockHandlerFactory'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); -const BlockExecutionContextMock = require('../../../../lib/test/mock/BlockExecutionContextMock'); -const GroveDBStoreMock = require('../../../../lib/test/mock/GroveDBStoreMock'); -const BlockExecutionContextRepositoryMock = require('../../../../lib/test/mock/BlockExecutionContextRepositoryMock'); - -describe('finalizeBlockHandlerFactory', () => { - let finalizeBlockHandler; - let executionTimerMock; - let latestBlockExecutionContextMock; - let loggerMock; - let requestMock; - let appHash; - let groveDBStoreMock; - let blockExecutionContextRepositoryMock; - let dataContract; - let proposalBlockExecutionContextMock; - let round; - let block; - let processProposalMock; - let broadcastWithdrawalTransactions; - let createContextLoggerMock; - - beforeEach(function beforeEach() { - round = 0; - appHash = Buffer.alloc(0); - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - latestBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - loggerMock = new LoggerMock(this.sinon); - executionTimerMock = { - clearTimer: this.sinon.stub(), - startTimer: this.sinon.stub(), - stopTimer: this.sinon.stub(), - }; - - const commit = {}; - - const height = new Long(42); - - const time = { - seconds: Math.ceil(new Date().getTime() / 1000), - }; - - const coreChainLockedHeight = 10; - - block = { - header: { - time, - version: { - app: Long.fromInt(1), - }, - proposerProTxHash: Uint8Array.from([1, 2, 3, 4]), - coreChainLockedHeight, - }, - data: { - txs: new Array(3).fill(Buffer.alloc(5, 0)), - }, - }; - - requestMock = { - commit, - height, - time, - coreChainLockedHeight, - round, - block, - }; - - dataContract = getDataContractFixture(); - - proposalBlockExecutionContextMock.getHeight.returns(new Long(42)); - proposalBlockExecutionContextMock.getRound.returns(round); - proposalBlockExecutionContextMock.getDataContracts.returns([dataContract]); - proposalBlockExecutionContextMock.getEpochInfo.returns({ - currentEpochIndex: 1, - }); - proposalBlockExecutionContextMock.getTimeMs.returns((new Date()).getTime()); - - groveDBStoreMock = new GroveDBStoreMock(this.sinon); - groveDBStoreMock.getRootHash.resolves(appHash); - - blockExecutionContextRepositoryMock = new BlockExecutionContextRepositoryMock( - this.sinon, - ); - - processProposalMock = this.sinon.stub(); - createContextLoggerMock = this.sinon.stub().returns(loggerMock); - - broadcastWithdrawalTransactions = this.sinon.stub(); - - finalizeBlockHandler = finalizeBlockHandlerFactory( - groveDBStoreMock, - blockExecutionContextRepositoryMock, - loggerMock, - executionTimerMock, - latestBlockExecutionContextMock, - proposalBlockExecutionContextMock, - processProposalMock, - broadcastWithdrawalTransactions, - createContextLoggerMock, - ); - }); - - it('should commit db transactions, create document dbs and return ResponseFinalizeBlock', async () => { - const result = await finalizeBlockHandler(requestMock); - - expect(result).to.be.an.instanceOf(ResponseFinalizeBlock); - - expect(executionTimerMock.stopTimer).to.be.calledOnceWithExactly('blockExecution'); - - expect(proposalBlockExecutionContextMock.reset).to.be.calledOnce(); - - expect(blockExecutionContextRepositoryMock.store).to.be.calledOnceWithExactly( - proposalBlockExecutionContextMock, - { - useTransaction: true, - }, - ); - - expect(groveDBStoreMock.commitTransaction).to.be.calledOnceWithExactly(); - - expect(latestBlockExecutionContextMock.populate).to.be.calledOnce(); - expect(processProposalMock).to.be.not.called(); - - expect(broadcastWithdrawalTransactions).to.have.been.calledOnceWith( - proposalBlockExecutionContextMock, - undefined, - undefined, - ); - - expect(createContextLoggerMock).to.be.calledOnceWithExactly( - loggerMock, { - height: '42', - round, - abciMethod: 'finalizeBlock', - }, - ); - }); - - it('should send withdrawal transaction if vote extensions are present', async () => { - const [txOneBytes, txTwoBytes] = [ - Buffer.alloc(32, 0), - Buffer.alloc(32, 1), - ]; - - proposalBlockExecutionContextMock.getWithdrawalTransactionsMap.returns({ - [hash(txOneBytes).toString('hex')]: txOneBytes, - [hash(txTwoBytes).toString('hex')]: txTwoBytes, - }); - - const thresholdVoteExtensions = [ - { - extension: hash(txOneBytes), - signature: Buffer.alloc(96, 3), - }, - { - extension: hash(txTwoBytes), - signature: Buffer.alloc(96, 4), - }, - ]; - - requestMock.commit = { thresholdVoteExtensions }; - - await finalizeBlockHandler(requestMock); - - expect(processProposalMock).to.be.not.called(); - expect(createContextLoggerMock).to.be.calledOnceWithExactly( - loggerMock, { - height: '42', - round, - abciMethod: 'finalizeBlock', - }, - ); - }); - - it('should call processProposal if round is not equal to execution context', async () => { - proposalBlockExecutionContextMock.getRound.returns(round + 1); - - const result = await finalizeBlockHandler(requestMock); - - expect(result).to.be.an.instanceOf(ResponseFinalizeBlock); - - const processProposalRequest = new RequestProcessProposal({ - height: requestMock.height, - txs: block.data.txs, - coreChainLockedHeight: block.header.coreChainLockedHeight, - version: block.header.version, - proposedLastCommit: requestMock.commit, - time: block.header.time, - proposerProTxHash: block.header.proposerProTxHash, - round, - }); - - expect(processProposalMock).to.be.calledOnceWithExactly(processProposalRequest, loggerMock); - expect(createContextLoggerMock).to.be.calledOnceWithExactly( - loggerMock, { - height: '42', - round, - abciMethod: 'finalizeBlock', - }, - ); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/infoHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/infoHandlerFactory.spec.js deleted file mode 100644 index c97411142b7..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/infoHandlerFactory.spec.js +++ /dev/null @@ -1,129 +0,0 @@ -const Long = require('long'); - -const { - tendermint: { - abci: { - ResponseInfo, - }, - }, -} = require('@dashevo/abci/types'); - -const infoHandlerFactory = require('../../../../lib/abci/handlers/infoHandlerFactory'); - -const packageJson = require('../../../../package.json'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); - -const BlockExecutionContextMock = require('../../../../lib/test/mock/BlockExecutionContextMock'); -const GroveDBStoreMock = require('../../../../lib/test/mock/GroveDBStoreMock'); -const BlockExecutionContextRepositoryMock = require('../../../../lib/test/mock/BlockExecutionContextRepositoryMock'); - -describe('infoHandlerFactory', () => { - let protocolVersion; - let lastBlockHeight; - let lastBlockAppHash; - let infoHandler; - let updateSimplifiedMasternodeListMock; - let lastCoreChainLockedHeight; - let loggerMock; - let blockExecutionContextMock; - let blockExecutionContextRepositoryMock; - let groveDBStoreMock; - let createContextLoggerMock; - - beforeEach(function beforeEach() { - lastBlockHeight = Long.fromInt(0); - lastBlockAppHash = Buffer.alloc(0); - protocolVersion = Long.fromInt(1); - lastCoreChainLockedHeight = 0; - - updateSimplifiedMasternodeListMock = this.sinon.stub(); - - loggerMock = new LoggerMock(this.sinon); - - blockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - blockExecutionContextMock.getHeight.returns(lastBlockHeight); - blockExecutionContextMock.getCoreChainLockedHeight.returns(lastCoreChainLockedHeight); - blockExecutionContextRepositoryMock = new BlockExecutionContextRepositoryMock( - this.sinon, - ); - groveDBStoreMock = new GroveDBStoreMock(this.sinon); - - blockExecutionContextRepositoryMock.fetch.resolves(blockExecutionContextMock); - - groveDBStoreMock.getRootHash.resolves(lastBlockAppHash); - - createContextLoggerMock = this.sinon.stub().returns(loggerMock); - - infoHandler = infoHandlerFactory( - blockExecutionContextMock, - blockExecutionContextRepositoryMock, - protocolVersion, - updateSimplifiedMasternodeListMock, - loggerMock, - groveDBStoreMock, - createContextLoggerMock, - ); - }); - - it('should return respond with genesis heights and app hash on the first run', async () => { - blockExecutionContextRepositoryMock.fetch.resolves(blockExecutionContextMock); - blockExecutionContextMock.getHeight.returns(null); - blockExecutionContextMock.isEmpty.returns(true); - - const response = await infoHandler(); - - expect(response).to.be.an.instanceOf(ResponseInfo); - - expect(response).to.deep.include({ - version: packageJson.version, - appVersion: protocolVersion, - lastBlockHeight, - lastBlockAppHash, - }); - - expect(blockExecutionContextRepositoryMock.fetch).to.be.calledOnce(); - expect(blockExecutionContextMock.populate).to.not.be.called(); - expect(blockExecutionContextMock.getHeight).to.not.be.called(); - expect(blockExecutionContextMock.getCoreChainLockedHeight).to.not.be.called(); - expect(updateSimplifiedMasternodeListMock).to.not.be.called(); - expect(groveDBStoreMock.getRootHash).to.be.calledOnce(); - expect(createContextLoggerMock).to.be.calledOnceWithExactly( - loggerMock, { - abciMethod: 'info', - }, - ); - }); - - it('should populate context and update SML on subsequent runs', async () => { - const response = await infoHandler(); - - expect(response).to.be.an.instanceOf(ResponseInfo); - - expect(ResponseInfo.toObject(response)).to.deep.equal({ - version: packageJson.version, - appVersion: protocolVersion, - lastBlockHeight, - lastBlockAppHash, - }); - - expect(blockExecutionContextMock.getHeight).to.be.calledOnce(); - - expect(updateSimplifiedMasternodeListMock).to.be.calledOnceWithExactly( - lastCoreChainLockedHeight, - { - logger: loggerMock, - }, - ); - expect(createContextLoggerMock).to.be.calledTwice(); - expect(createContextLoggerMock.getCall(0)).to.be.calledWithExactly( - loggerMock, { - abciMethod: 'info', - }, - ); - expect(createContextLoggerMock.getCall(1)).to.be.calledWithExactly( - loggerMock, { - height: lastBlockHeight.toString(), - }, - ); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/initChainHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/initChainHandlerFactory.spec.js deleted file mode 100644 index 99c3807aea8..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/initChainHandlerFactory.spec.js +++ /dev/null @@ -1,164 +0,0 @@ -const Long = require('long'); - -const { - tendermint: { - abci: { - ResponseInitChain, - ValidatorSetUpdate, - }, - types: { - CoreChainLock, - }, - }, -} = require('@dashevo/abci/types'); - -const initChainHandlerFactory = require('../../../../lib/abci/handlers/initChainHandlerFactory'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); -const GroveDBStoreMock = require('../../../../lib/test/mock/GroveDBStoreMock'); -const millisToProtoTimestamp = require('../../../../lib/util/millisToProtoTimestamp'); -const BlockInfo = require('../../../../lib/blockExecution/BlockInfo'); -const getSystemIdentityPublicKeysFixture = require('../../../../lib/test/fixtures/getSystemIdentityPublicKeysFixture'); -const protoTimestampToMillis = require('../../../../lib/util/protoTimestampToMillis'); - -describe('initChainHandlerFactory', () => { - let initChainHandler; - let updateSimplifiedMasternodeListMock; - let initialCoreChainLockedHeight; - let validatorSetMock; - let createValidatorSetUpdateMock; - let loggerMock; - let validatorSetUpdate; - let synchronizeMasternodeIdentitiesMock; - let groveDBStoreMock; - let appHashFixture; - let rsAbciMock; - let createCoreChainLockUpdateMock; - let coreChainLockUpdate; - let createContextLoggerMock; - let genesisTimeMs; - let systemIdentityPublicKeysFixture; - - beforeEach(function beforeEach() { - initialCoreChainLockedHeight = 1; - - appHashFixture = Buffer.alloc(0); - - genesisTimeMs = Date.now(); - - updateSimplifiedMasternodeListMock = this.sinon.stub(); - - const quorumHash = Buffer.alloc(64).fill(1).toString('hex'); - validatorSetMock = { - initialize: this.sinon.stub(), - getQuorum: this.sinon.stub().returns({ - quorumHash, - }), - }; - - validatorSetUpdate = new ValidatorSetUpdate(); - - createValidatorSetUpdateMock = this.sinon.stub().returns(validatorSetUpdate); - synchronizeMasternodeIdentitiesMock = this.sinon.stub().resolves({ - createdEntities: [], - updatedEntities: [], - removedEntities: [], - fromHeight: 1, - toHeight: 42, - }); - - loggerMock = new LoggerMock(this.sinon); - - rsAbciMock = { - initChain: this.sinon.stub(), - }; - - groveDBStoreMock = new GroveDBStoreMock(this.sinon); - groveDBStoreMock.getRootHash.resolves(appHashFixture); - - coreChainLockUpdate = new CoreChainLock({ - coreBlockHeight: 42, - coreBlockHash: '1528e523f4c20fa84ba70dd96372d34e00ce260f357d53ad1a8bc892ebf20e2d', - signature: '1897ce8f54d2070f44ca5c29983b68b391e8137c25e44f67416e579f3e3bdfef7b4fd22db7818399147e52907998857b0fbc8edfdc40a64f2c7df0e88544d31d12ca8c15e73d50dda25ca23f754ed3f789ed4bcb392161995f464017c10df404', - }); - - createCoreChainLockUpdateMock = this.sinon.stub().resolves(coreChainLockUpdate); - createContextLoggerMock = this.sinon.stub().returns(loggerMock); - - systemIdentityPublicKeysFixture = getSystemIdentityPublicKeysFixture(); - - initChainHandler = initChainHandlerFactory( - updateSimplifiedMasternodeListMock, - initialCoreChainLockedHeight, - validatorSetMock, - createValidatorSetUpdateMock, - synchronizeMasternodeIdentitiesMock, - loggerMock, - groveDBStoreMock, - rsAbciMock, - createCoreChainLockUpdateMock, - createContextLoggerMock, - systemIdentityPublicKeysFixture, - ); - }); - - it('should initialize the chain', async () => { - const request = { - initialHeight: Long.fromInt(1), - chainId: 'test', - time: millisToProtoTimestamp(genesisTimeMs), - }; - - const blockInfo = new BlockInfo(0, 0, protoTimestampToMillis(request.time)); - - const response = await initChainHandler(request); - - expect(response).to.be.an.instanceOf(ResponseInitChain); - expect(response.validatorSetUpdate).to.be.equal(validatorSetUpdate); - expect(response.initialCoreHeight).to.be.equal(initialCoreChainLockedHeight); - expect(response.appHash).to.deep.equal(appHashFixture); - - // Update SML - - expect(updateSimplifiedMasternodeListMock).to.be.calledOnceWithExactly( - initialCoreChainLockedHeight, - { - logger: loggerMock, - }, - ); - - // Create initial state - - expect(groveDBStoreMock.startTransaction).to.be.calledOnce(); - - expect(rsAbciMock.initChain).to.be.calledOnceWithExactly({ - genesisTimeMs: protoTimestampToMillis(request.time), - systemIdentityPublicKeys: systemIdentityPublicKeysFixture, - }, true); - - expect(synchronizeMasternodeIdentitiesMock).to.be.calledOnceWithExactly( - initialCoreChainLockedHeight, - blockInfo, - ); - - expect(groveDBStoreMock.commitTransaction).to.be.calledOnce(); - - expect(groveDBStoreMock.getRootHash).to.be.calledOnce(); - - // Initialize VS - - expect(validatorSetMock.initialize).to.be.calledOnceWithExactly( - initialCoreChainLockedHeight, - ); - - expect(validatorSetMock.getQuorum).to.be.calledOnce(); - - expect(createValidatorSetUpdateMock).to.be.calledOnceWithExactly(validatorSetMock); - - expect(createCoreChainLockUpdateMock) - .to.be.calledOnceWithExactly(initialCoreChainLockedHeight, 0, loggerMock); - expect(createContextLoggerMock).to.be.calledOnceWithExactly(loggerMock, { - height: request.initialHeight.toString(), - abciMethod: 'initChain', - }); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/prepareProposalHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/prepareProposalHandlerFactory.spec.js deleted file mode 100644 index 61b9a4bf56a..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/prepareProposalHandlerFactory.spec.js +++ /dev/null @@ -1,232 +0,0 @@ -const { - tendermint: { - abci: { - ResponsePrepareProposal, - ValidatorSetUpdate, - }, - types: { - ConsensusParams, - CoreChainLock, - }, - }, -} = require('@dashevo/abci/types'); - -const Long = require('long'); - -const prepareProposalHandlerFactory = require('../../../../lib/abci/handlers/prepareProposalHandlerFactory'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); -const BlockExecutionContextMock = require('../../../../lib/test/mock/BlockExecutionContextMock'); - -describe('prepareProposalHandlerFactory', () => { - let prepareProposalHandler; - let request; - let deliverTxMock; - let loggerMock; - let beginBlockMock; - let endBlockMock; - let updateCoreChainLockMock; - let appHash; - let consensusParamUpdates; - let validatorSetUpdate; - let coreChainLockUpdate; - let endBlockResult; - let proposalBlockExecutionContextMock; - let round; - let executionTimerMock; - let createContextLoggerMock; - let quorumHash; - - beforeEach(function beforeEach() { - round = 1; - appHash = Buffer.alloc(1, 1); - coreChainLockUpdate = new CoreChainLock({ - coreBlockHeight: 42, - coreBlockHash: '1528e523f4c20fa84ba70dd96372d34e00ce260f357d53ad1a8bc892ebf20e2d', - signature: '1897ce8f54d2070f44ca5c29983b68b391e8137c25e44f67416e579f3e3bdfef7b4fd22db7818399147e52907998857b0fbc8edfdc40a64f2c7df0e88544d31d12ca8c15e73d50dda25ca23f754ed3f789ed4bcb392161995f464017c10df404', - }); - - consensusParamUpdates = new ConsensusParams({ - block: { - maxBytes: 1, - maxGas: 2, - }, - evidence: { - maxAgeDuration: null, - maxAgeNumBlocks: 1, - maxBytes: 2, - }, - version: { - appVersion: 1, - }, - }); - - validatorSetUpdate = new ValidatorSetUpdate(); - - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - loggerMock = new LoggerMock(this.sinon); - - endBlockResult = { - consensusParamUpdates, - appHash, - validatorSetUpdate, - }; - - beginBlockMock = this.sinon.stub(); - - deliverTxMock = this.sinon.stub().resolves({ - code: 0, - fees: { - processingFee: 10, - storageFee: 100, - refundsPerEpoch: { - 1: 15, - }, - }, - }); - - endBlockMock = this.sinon.stub().resolves( - endBlockResult, - ); - - updateCoreChainLockMock = this.sinon.stub().resolves(coreChainLockUpdate); - - executionTimerMock = { - getTimer: this.sinon.stub().returns(0.1), - }; - createContextLoggerMock = this.sinon.stub().returns(loggerMock); - - prepareProposalHandler = prepareProposalHandlerFactory( - deliverTxMock, - loggerMock, - proposalBlockExecutionContextMock, - beginBlockMock, - endBlockMock, - updateCoreChainLockMock, - executionTimerMock, - createContextLoggerMock, - ); - - const maxTxBytes = 42; - const txs = new Array(3).fill(Buffer.alloc(5, 0)); - - const height = new Long(42); - - const time = { - seconds: Math.ceil(new Date().getTime() / 1000), - }; - - const version = { - app: Long.fromInt(1), - }; - - const proposerProTxHash = Uint8Array.from([1, 2, 3, 4]); - - const proposedAppVersion = Long.fromInt(1); - - const coreChainLockedHeight = 10; - - const localLastCommit = {}; - - quorumHash = Buffer.alloc(32, 0); - - request = { - height, - maxTxBytes, - txs, - coreChainLockedHeight, - version, - localLastCommit, - time, - proposerProTxHash, - proposedAppVersion, - round, - quorumHash, - }; - }); - - it('should return proposal', async () => { - const result = await prepareProposalHandler(request); - - expect(result).to.be.an.instanceOf(ResponsePrepareProposal); - - const txRecords = request.txs.map((tx) => ({ - tx, - action: 1, - })); - - expect(result).to.be.an.instanceOf(ResponsePrepareProposal); - expect(result.appHash).to.be.equal(appHash); - expect(result.txResults).to.be.deep.equal(new Array(3).fill({ code: 0 })); - expect(result.consensusParamUpdates).to.be.equal(consensusParamUpdates); - expect(result.validatorSetUpdate).to.be.equal(validatorSetUpdate); - expect(result.coreChainLockUpdate).to.be.equal(coreChainLockUpdate); - expect(result.txRecords).to.be.deep.equal(txRecords); - - expect(beginBlockMock).to.be.calledOnceWithExactly( - { - lastCommitInfo: request.localLastCommit, - height: request.height, - coreChainLockedHeight: request.coreChainLockedHeight, - version: request.version, - time: request.time, - proposerProTxHash: Buffer.from(request.proposerProTxHash), - proposedAppVersion: request.proposedAppVersion, - round, - quorumHash, - }, - loggerMock, - ); - - expect(deliverTxMock).to.be.calledThrice(); - - expect(updateCoreChainLockMock).to.be.calledOnceWithExactly( - request.coreChainLockedHeight, - round, - loggerMock, - ); - - expect(endBlockMock).to.be.calledOnceWithExactly( - { - height: request.height, - round, - fees: { - processingFee: 10 * 3, - storageFee: 100 * 3, - refundsPerEpoch: { - 1: 15 * 3, - }, - }, - coreChainLockedHeight: request.coreChainLockedHeight, - }, - loggerMock, - ); - - expect(proposalBlockExecutionContextMock.setPrepareProposalResult).to.be.calledOnceWithExactly({ - appHash, - txResults: new Array(3).fill({ code: 0 }), - consensusParamUpdates, - validatorSetUpdate, - }); - expect(createContextLoggerMock).to.be.calledOnceWithExactly(loggerMock, { - height: '42', - round, - abciMethod: 'prepareProposal', - }); - }); - - it('should cut txs that are not fit into the size limit', async () => { - request.maxTxBytes = 9; - - const result = await prepareProposalHandler(request); - - expect(result).to.be.an.instanceOf(ResponsePrepareProposal); - expect(result.txRecords).to.have.lengthOf(1); - expect(result.txRecords).to.deep.equal( - [{ - tx: request.txs[0], - action: 1, - }], - ); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/processProposalHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/processProposalHandlerFactory.spec.js deleted file mode 100644 index ccb4b0deb5f..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/processProposalHandlerFactory.spec.js +++ /dev/null @@ -1,160 +0,0 @@ -const { - tendermint: { - abci: { - ResponseProcessProposal, - ValidatorSetUpdate, - }, - types: { - ConsensusParams, - }, - }, -} = require('@dashevo/abci/types'); - -const Long = require('long'); - -const processProposalHandlerFactory = require('../../../../lib/abci/handlers/processProposalHandlerFactory'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); -const BlockExecutionContextMock = require('../../../../lib/test/mock/BlockExecutionContextMock'); - -describe('processProposalHandlerFactory', () => { - let processProposalHandler; - let request; - let loggerMock; - let verifyChainLockMock; - let coreChainLockUpdate; - let processProposalMock; - let round; - let appHash; - let proposalBlockExecutionContextMock; - let consensusParamUpdates; - let validatorSetUpdate; - let createContextLoggerMock; - - beforeEach(function beforeEach() { - round = 0; - - appHash = Buffer.alloc(1, 1); - - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - consensusParamUpdates = new ConsensusParams({ - block: { - maxBytes: 1, - maxGas: 2, - }, - evidence: { - maxAgeDuration: null, - maxAgeNumBlocks: 1, - maxBytes: 2, - }, - version: { - appVersion: 1, - }, - }); - validatorSetUpdate = new ValidatorSetUpdate(); - - loggerMock = new LoggerMock(this.sinon); - - verifyChainLockMock = this.sinon.stub().resolves(true); - - processProposalMock = this.sinon.stub().resolves(new ResponseProcessProposal({ status: 1 })); - createContextLoggerMock = this.sinon.stub().returns(loggerMock); - - processProposalHandler = processProposalHandlerFactory( - loggerMock, - verifyChainLockMock, - processProposalMock, - proposalBlockExecutionContextMock, - createContextLoggerMock, - ); - - const txs = new Array(3).fill(Buffer.alloc(5, 0)); - - const height = new Long(42); - - const time = { - seconds: Math.ceil(new Date().getTime() / 1000), - }; - const version = { - app: Long.fromInt(1), - }; - const proposerProTxHash = Uint8Array.from([1, 2, 3, 4]); - const coreChainLockedHeight = 10; - const proposedLastCommit = {}; - - coreChainLockUpdate = { - coreBlockHeight: 42, - coreBlockHash: '1528e523f4c20fa84ba70dd96372d34e00ce260f357d53ad1a8bc892ebf20e2d', - signature: '1897ce8f54d2070f44ca5c29983b68b391e8137c25e44f67416e579f3e3bdfef7b4fd22db7818399147e52907998857b0fbc8edfdc40a64f2c7df0e88544d31d12ca8c15e73d50dda25ca23f754ed3f789ed4bcb392161995f464017c10df404', - }; - - request = { - round, - height, - txs, - coreChainLockedHeight, - version, - proposedLastCommit, - time, - proposerProTxHash, - coreChainLockUpdate, - }; - }); - - it('should return ResponseProcessProposal', async () => { - const result = await processProposalHandler(request); - - expect(result).to.be.an.instanceOf(ResponseProcessProposal); - - expect(result.status).to.equal(1); - - expect(processProposalMock).to.be.calledOnceWithExactly(request, loggerMock); - - expect(verifyChainLockMock).to.be.calledOnceWithExactly( - coreChainLockUpdate, - ); - }); - - it('should return rejected ResponseProcessProposal if chainlock can\'t be verified', async () => { - verifyChainLockMock.resolves(false); - - const result = await processProposalHandler(request); - - expect(result).to.be.an.instanceOf(ResponseProcessProposal); - expect(result.status).to.equal(2); - - expect(processProposalMock).to.not.be.called(); - }); - - it('should return already prepared result for this height and round', async () => { - proposalBlockExecutionContextMock.getHeight.returns(request.height); - proposalBlockExecutionContextMock.getRound.returns(request.round); - - proposalBlockExecutionContextMock.getPrepareProposalResult.returns({ - appHash, - txResults: new Array(3).fill({ code: 0 }), - consensusParamUpdates, - validatorSetUpdate, - }); - - const result = await processProposalHandler(request); - - expect(proposalBlockExecutionContextMock.getPrepareProposalResult).to.be.calledOnce(); - - expect(result).to.be.an.instanceOf(ResponseProcessProposal); - expect(result.status).to.equal(1); - expect(result.appHash).to.equal(appHash); - expect(result.txResults).to.be.deep.equal(new Array(3).fill({ code: 0 })); - expect(result.consensusParamUpdates).to.be.equal(consensusParamUpdates); - expect(result.validatorSetUpdate).to.be.equal(validatorSetUpdate); - - expect(processProposalMock).to.not.be.called(); - - expect(verifyChainLockMock).to.not.be.called(); - expect(createContextLoggerMock).to.be.calledOnceWithExactly(loggerMock, { - height: '42', - round, - abciMethod: 'processProposal', - }); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/proposal/beginBlockFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/proposal/beginBlockFactory.spec.js deleted file mode 100644 index c91301cc649..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/proposal/beginBlockFactory.spec.js +++ /dev/null @@ -1,278 +0,0 @@ -const Long = require('long'); -const { - tendermint: { - version: { - Consensus, - }, - }, -} = require('@dashevo/abci/types'); - -const { hash } = require('@dashevo/dpp/lib/util/hash'); - -const beginBlockFactory = require('../../../../../lib/abci/handlers/proposal/beginBlockFactory'); - -const BlockExecutionContextMock = require('../../../../../lib/test/mock/BlockExecutionContextMock'); -const LoggerMock = require('../../../../../lib/test/mock/LoggerMock'); -const NotSupportedNetworkProtocolVersionError = require('../../../../../lib/abci/handlers/errors/NotSupportedNetworkProtocolVersionError'); -const NetworkProtocolVersionIsNotSetError = require('../../../../../lib/abci/handlers/errors/NetworkProtocolVersionIsNotSetError'); -const GroveDBStoreMock = require('../../../../../lib/test/mock/GroveDBStoreMock'); -const millisToProtoTimestamp = require('../../../../../lib/util/millisToProtoTimestamp'); -const protoTimestampToMillis = require('../../../../../lib/util/protoTimestampToMillis'); -const BlockInfo = require('../../../../../lib/blockExecution/BlockInfo'); - -describe('beginBlockFactory', () => { - let protocolVersion; - let beginBlock; - let request; - let blockHeight; - let coreChainLockedHeight; - let updateSimplifiedMasternodeListMock; - let waitForChainLockedHeightMock; - let loggerMock; - let lastCommitInfo; - let dppMock; - let transactionalDppMock; - let synchronizeMasternodeIdentitiesMock; - let groveDBStoreMock; - let version; - let rsAbciMock; - let proposerProTxHash; - let proposedAppVersion; - let round; - let executionTimerMock; - let latestBlockExecutionContextMock; - let proposalBlockExecutionContextMock; - let rsResponseMock; - let blockInfo; - let timeMs; - let epochInfo; - let time; - let lastSyncedCoreHeightRepositoryMock; - let simplifyMasternodeListMock; - let validMasternodesListLength; - - beforeEach(function beforeEach() { - round = 0; - protocolVersion = Long.fromInt(1); - proposedAppVersion = Long.fromInt(1); - blockHeight = Long.fromNumber(1); - time = millisToProtoTimestamp(Date.now()); - timeMs = protoTimestampToMillis(time); - epochInfo = { - currentEpochIndex: 1, - isEpochChange: false, - }; - blockInfo = new BlockInfo( - blockHeight.toNumber(), - epochInfo.currentEpochIndex, - timeMs, - ); - - latestBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - proposalBlockExecutionContextMock.isEmpty.returns(true); - proposalBlockExecutionContextMock.getHeight.returns(blockHeight); - proposalBlockExecutionContextMock.getEpochInfo.returns(epochInfo); - proposalBlockExecutionContextMock.getTimeMs.returns(timeMs); - - loggerMock = new LoggerMock(this.sinon); - - dppMock = { - setProtocolVersion: this.sinon.stub(), - }; - transactionalDppMock = { - setProtocolVersion: this.sinon.stub(), - }; - - executionTimerMock = { - clearTimer: this.sinon.stub(), - startTimer: this.sinon.stub(), - stopTimer: this.sinon.stub(), - }; - - updateSimplifiedMasternodeListMock = this.sinon.stub().resolves(false); - waitForChainLockedHeightMock = this.sinon.stub(); - synchronizeMasternodeIdentitiesMock = this.sinon.stub().resolves({ - createdEntities: [], - updatedEntities: [], - removedEntities: [], - fromHeight: 1, - toHeight: 42, - }); - - groveDBStoreMock = new GroveDBStoreMock(this.sinon); - - rsResponseMock = { - epochInfo, - }; - - rsAbciMock = { - blockBegin: this.sinon.stub().resolves(rsResponseMock), - }; - - lastSyncedCoreHeightRepositoryMock = { - fetch: this.sinon.stub().resolves({ - getValue: () => undefined, - }), - }; - - validMasternodesListLength = 400; - - simplifyMasternodeListMock = { - getStore() { - return { - getCurrentSML() { - return { - getValidMasternodesList() { - return validMasternodesListLength; - }, - }; - }, - }; - }, - }; - - beginBlock = beginBlockFactory( - groveDBStoreMock, - latestBlockExecutionContextMock, - proposalBlockExecutionContextMock, - protocolVersion, - dppMock, - transactionalDppMock, - updateSimplifiedMasternodeListMock, - waitForChainLockedHeightMock, - synchronizeMasternodeIdentitiesMock, - rsAbciMock, - executionTimerMock, - lastSyncedCoreHeightRepositoryMock, - simplifyMasternodeListMock, - ); - - lastCommitInfo = {}; - - version = Consensus.fromObject({ - app: protocolVersion, - }); - - proposerProTxHash = Buffer.alloc(32, 1); - - request = { - height: blockHeight, - lastCommitInfo, - coreChainLockedHeight, - version, - time: millisToProtoTimestamp(timeMs), - proposerProTxHash, - proposedAppVersion, - round, - }; - }); - - it('should reset previous block state and prepare everything for for a next one', async () => { - await beginBlock(request, loggerMock); - - // Wait for chain locked core block height - expect(waitForChainLockedHeightMock).to.be.calledOnceWithExactly(coreChainLockedHeight); - - // Set current protocol version - expect(dppMock.setProtocolVersion).to.have.been.calledOnceWithExactly( - protocolVersion.toNumber(), - ); - expect(transactionalDppMock.setProtocolVersion).to.have.been.calledOnceWithExactly( - protocolVersion.toNumber(), - ); - - // Start new transaction - expect(groveDBStoreMock.startTransaction).to.be.calledOnceWithExactly(); - - // Update SML - expect(updateSimplifiedMasternodeListMock).to.be.calledOnceWithExactly( - coreChainLockedHeight, { logger: loggerMock }, - ); - - expect(synchronizeMasternodeIdentitiesMock).to.not.been.called(); - - expect(executionTimerMock.clearTimer).to.be.calledTwice(); - expect(executionTimerMock.clearTimer.getCall(1)).to.be.calledWithExactly('roundExecution'); - expect(executionTimerMock.clearTimer.getCall(0)).to.be.calledWithExactly('blockExecution'); - - expect(executionTimerMock.startTimer).to.be.calledTwice(); - expect(executionTimerMock.startTimer.getCall(1)).to.be.calledWithExactly('roundExecution'); - expect(executionTimerMock.startTimer.getCall(0)).to.be.calledWithExactly('blockExecution'); - - expect(proposalBlockExecutionContextMock.setContextLogger) - .to.be.calledOnceWithExactly(loggerMock); - expect(proposalBlockExecutionContextMock.setHeight) - .to.be.calledOnceWithExactly(blockHeight); - expect(proposalBlockExecutionContextMock.setVersion) - .to.be.calledOnceWithExactly(version); - expect(proposalBlockExecutionContextMock.setProposedAppVersion) - .to.be.calledOnceWithExactly(proposedAppVersion); - expect(proposalBlockExecutionContextMock.setTimeMs) - .to.be.calledOnceWithExactly(timeMs); - expect(proposalBlockExecutionContextMock.setCoreChainLockedHeight) - .to.be.calledOnceWithExactly(coreChainLockedHeight); - expect(proposalBlockExecutionContextMock.setLastCommitInfo) - .to.be.calledOnceWithExactly(lastCommitInfo); - expect(proposalBlockExecutionContextMock.setEpochInfo) - .to.be.calledOnceWithExactly(epochInfo); - }); - - it('should synchronize masternode identities if SML is updated', async () => { - updateSimplifiedMasternodeListMock.resolves(true); - - await beginBlock(request, loggerMock); - - expect(synchronizeMasternodeIdentitiesMock).to.have.been.calledOnceWithExactly( - coreChainLockedHeight, - blockInfo, - ); - }); - - it('should throw NotSupportedNetworkProtocolVersionError if protocol version is not supported', async () => { - request.version.app = Long.fromInt(42); - - try { - await beginBlock(request, loggerMock); - - expect.fail('should throw NotSupportedNetworkProtocolVersionError'); - } catch (e) { - expect(e).to.be.instanceOf(NotSupportedNetworkProtocolVersionError); - expect(e.getNetworkProtocolVersion()).to.equal(request.version.app); - expect(e.getLatestProtocolVersion()).to.equal(protocolVersion); - } - }); - - it('should throw an NetworkProtocolVersionIsNotSetError if network protocol version is not set', async () => { - request.version.app = Long.fromInt(0); - - try { - await beginBlock(request, loggerMock); - - expect.fail('should throw NetworkProtocolVersionIsNotSetError'); - } catch (err) { - expect(err).to.be.an.instanceOf(NetworkProtocolVersionIsNotSetError); - } - }); - - it('should set withdrawal transactions map if present', async () => { - const [txOneBytes, txTwoBytes] = [ - Buffer.alloc(32, 0), - Buffer.alloc(32, 1), - ]; - - rsAbciMock.blockBegin.resolves({ - unsignedWithdrawalTransactions: [txOneBytes, txTwoBytes], - }); - - await beginBlock(request, loggerMock); - - expect( - proposalBlockExecutionContextMock.setWithdrawalTransactionsMap, - ).to.have.been.calledOnceWithExactly({ - [hash(txOneBytes).toString('hex')]: txOneBytes, - [hash(txTwoBytes).toString('hex')]: txTwoBytes, - }); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/proposal/broadcastWithdrawalTransactionsFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/proposal/broadcastWithdrawalTransactionsFactory.spec.js deleted file mode 100644 index 11e775a082c..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/proposal/broadcastWithdrawalTransactionsFactory.spec.js +++ /dev/null @@ -1,69 +0,0 @@ -const Long = require('long'); - -const BlockExecutionContextMock = require('../../../../../lib/test/mock/BlockExecutionContextMock'); - -const broadcastWithdrawalTransactionsFactory = require('../../../../../lib/abci/handlers/proposal/broadcastWithdrawalTransactionsFactory'); -const BlockInfo = require('../../../../../lib/blockExecution/BlockInfo'); - -describe('broadcastWithdrawalTransactionsFactory', () => { - let broadcastWithdrawalTransactions; - let proposalBlockExecutionContextMock; - let coreRpcMock; - let updateWithdrawalTransactionIdAndStatusMock; - - beforeEach(function beforeEach() { - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - proposalBlockExecutionContextMock.getEpochInfo.returns({ - currentEpochIndex: 1, - }); - proposalBlockExecutionContextMock.getHeight.returns(new Long(1)); - proposalBlockExecutionContextMock.getTimeMs.returns(1); - proposalBlockExecutionContextMock.getCoreChainLockedHeight.returns(42); - - coreRpcMock = { - sendRawTransaction: this.sinon.stub(), - }; - - updateWithdrawalTransactionIdAndStatusMock = this.sinon.stub(); - - broadcastWithdrawalTransactions = broadcastWithdrawalTransactionsFactory( - coreRpcMock, - updateWithdrawalTransactionIdAndStatusMock, - ); - }); - - it('should call Core RPC and call document update function', async () => { - const extension = Buffer.alloc(32, 2); - const signature = Buffer.alloc(32, 3); - - const txBytes = Buffer.alloc(32, 1); - - const thresholdVoteExtensions = [ - { extension, signature }, - ]; - const unsignedWithdrawalTransactionsMap = { - [extension.toString('hex')]: txBytes, - }; - - await broadcastWithdrawalTransactions( - proposalBlockExecutionContextMock, - thresholdVoteExtensions, - unsignedWithdrawalTransactionsMap, - ); - - const expectedMap = { [txBytes.toString('hex')]: Buffer.concat([txBytes, signature]) }; - - expect(coreRpcMock.sendRawTransaction).to.have.been.calledOnceWithExactly( - Buffer.concat([txBytes, signature]).toString('hex'), - ); - expect(updateWithdrawalTransactionIdAndStatusMock).to.have.been.calledOnceWithExactly( - BlockInfo.createFromBlockExecutionContext(proposalBlockExecutionContextMock), - 42, - expectedMap, - { - useTransaction: true, - }, - ); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/proposal/createConsensusParamUpdateFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/proposal/createConsensusParamUpdateFactory.spec.js deleted file mode 100644 index 0e9482be77f..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/proposal/createConsensusParamUpdateFactory.spec.js +++ /dev/null @@ -1,90 +0,0 @@ -const { - tendermint: { - types: { - ConsensusParams, - }, - }, -} = require('@dashevo/abci/types'); -const Long = require('long'); -const createConsensusParamUpdateFactory = require('../../../../../lib/abci/handlers/proposal/createConsensusParamUpdateFactory'); -const BlockExecutionContextMock = require('../../../../../lib/test/mock/BlockExecutionContextMock'); -const LoggerMock = require('../../../../../lib/test/mock/LoggerMock'); - -describe('createConsensusParamUpdateFactory', () => { - let createConsensusParamUpdate; - let getFeatureFlagForHeightMock; - let loggerMock; - let height; - let version; - let getLatestFeatureFlagGetMock; - let proposalBlockExecutionContextMock; - let round; - - beforeEach(function beforeEach() { - round = 42; - loggerMock = new LoggerMock(this.sinon); - height = Long.fromInt(15); - version = { - app: Long.fromInt(1), - }; - - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - proposalBlockExecutionContextMock.getVersion.returns(version); - - getFeatureFlagForHeightMock = this.sinon.stub().resolves(null); - getLatestFeatureFlagGetMock = this.sinon.stub(); - - createConsensusParamUpdate = createConsensusParamUpdateFactory( - proposalBlockExecutionContextMock, - getFeatureFlagForHeightMock, - ); - }); - - it('should return consensusParamUpdates if request contains update consensus features flag', async () => { - getLatestFeatureFlagGetMock.withArgs('block').returns({ - maxBytes: 1, - maxGas: 2, - }); - getLatestFeatureFlagGetMock.withArgs('evidence').returns({ - maxAgeNumBlocks: 1, - maxAgeDuration: null, - maxBytes: 2, - }); - getLatestFeatureFlagGetMock.withArgs('version').returns({ - appVersion: 1, - }); - - getFeatureFlagForHeightMock.resolves({ - get: getLatestFeatureFlagGetMock, - }); - - const response = await createConsensusParamUpdate(height, round, loggerMock); - - expect(response).to.deep.equal(new ConsensusParams({ - block: { - maxBytes: 1, - maxGas: 2, - }, - evidence: { - maxAgeDuration: null, - maxAgeNumBlocks: 1, - maxBytes: 2, - }, - version: { - appVersion: 1, - }, - })); - - expect(getFeatureFlagForHeightMock).to.be.calledOnce(); - }); - - it('should return undefined', async () => { - getFeatureFlagForHeightMock.resolves(null); - - const response = await createConsensusParamUpdate(height, round, loggerMock); - - expect(response).to.be.undefined(); - - expect(getFeatureFlagForHeightMock).to.be.calledOnce(); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/proposal/createCoreChainLockUpdateFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/proposal/createCoreChainLockUpdateFactory.spec.js deleted file mode 100644 index 7e52c580dfc..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/proposal/createCoreChainLockUpdateFactory.spec.js +++ /dev/null @@ -1,65 +0,0 @@ -const { - tendermint: { - types: { - CoreChainLock, - }, - }, -} = require('@dashevo/abci/types'); -const createCoreChainLockUpdateFactory = require('../../../../../lib/abci/handlers/proposal/createCoreChainLockUpdateFactory'); -const LoggerMock = require('../../../../../lib/test/mock/LoggerMock'); - -describe('createCoreChainLockUpdateFactory', () => { - let createCoreChainLockUpdate; - let latestCoreChainLockMock; - let chainLockMock; - let coreChainLockedHeight; - let loggerMock; - let round; - - beforeEach(function beforeEach() { - round = 0; - loggerMock = new LoggerMock(this.sinon); - - chainLockMock = { - height: 1, - blockHash: Buffer.alloc(0), - signature: Buffer.alloc(0), - }; - - coreChainLockedHeight = 2; - - latestCoreChainLockMock = { - getChainLock: this.sinon.stub().returns(chainLockMock), - }; - - createCoreChainLockUpdate = createCoreChainLockUpdateFactory( - latestCoreChainLockMock, - ); - }); - - it('should return nextCoreChainLockUpdate if latestCoreChainLock above header height', async () => { - chainLockMock.height = 3; - - const response = await createCoreChainLockUpdate(coreChainLockedHeight, round, loggerMock); - - expect(latestCoreChainLockMock.getChainLock).to.have.been.calledOnceWithExactly(); - - const expectedCoreChainLock = new CoreChainLock({ - coreBlockHeight: chainLockMock.height, - coreBlockHash: chainLockMock.blockHash, - signature: chainLockMock.signature, - }); - - expect(response).to.deep.equal(expectedCoreChainLock); - }); - - it('should return undefined', async () => { - chainLockMock.height = 1; - - const response = await createCoreChainLockUpdate(coreChainLockedHeight, round, loggerMock); - - expect(latestCoreChainLockMock.getChainLock).to.have.been.calledOnceWithExactly(); - - expect(response).to.be.undefined(); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/proposal/deliverTxFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/proposal/deliverTxFactory.spec.js deleted file mode 100644 index 2f882d057fc..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/proposal/deliverTxFactory.spec.js +++ /dev/null @@ -1,319 +0,0 @@ -const Long = require('long'); - -const crypto = require('crypto'); - -const DashPlatformProtocol = require('@dashevo/dpp'); - -const { FeeResult } = require('@dashevo/rs-drive'); - -const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult'); - -const createDPPMock = require('@dashevo/dpp/lib/test/mocks/createDPPMock'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); - -const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext'); - -const SomeConsensusError = require('@dashevo/dpp/lib/test/mocks/SomeConsensusError'); - -const BlockExecutionContextMock = require('../../../../../lib/test/mock/BlockExecutionContextMock'); - -const deliverTxFactory = require('../../../../../lib/abci/handlers/proposal/deliverTxFactory'); -const LoggerMock = require('../../../../../lib/test/mock/LoggerMock'); -const DPPValidationAbciError = require('../../../../../lib/abci/errors/DPPValidationAbciError'); -const InvalidArgumentAbciError = require('../../../../../lib/abci/errors/InvalidArgumentAbciError'); -const StorageResult = require('../../../../../lib/storage/StorageResult'); - -describe('deliverTxFactory', () => { - let deliverTx; - let documentTx; - let dataContractTx; - let dppMock; - let documentsBatchTransitionFixture; - let dataContractCreateTransitionFixture; - let dpp; - let unserializeStateTransitionMock; - let validationResult; - let executionTimerMock; - let loggerMock; - let round; - let proposalBlockExecutionContextMock; - let stateTransitionExecutionContextMock; - let identityBalanceRepositoryMock; - let processingFee; - let storageFee; - let refundsPerEpoch; - let feeRefunds; - let createContextLoggerMock; - let calculateStateTransitionFeeMock; - let calculateStateTransitionFeeFromOperationsMock; - - beforeEach(async function beforeEach() { - round = 42; - const dataContractFixture = getDataContractFixture(); - const documentFixture = getDocumentsFixture(); - - dpp = new DashPlatformProtocol(); - await dpp.initialize(); - - documentsBatchTransitionFixture = dpp.document.createStateTransition({ - create: documentFixture, - }); - - dataContractCreateTransitionFixture = dpp - .dataContract.createDataContractCreateTransition(dataContractFixture); - - loggerMock = new LoggerMock(this.sinon); - - stateTransitionExecutionContextMock = new StateTransitionExecutionContext(); - - processingFee = 10; - storageFee = 100; - const totalRefunds = 15; - refundsPerEpoch = { - 1: totalRefunds, - }; - feeRefunds = [ - { - identifier: Buffer.alloc(32), - creditsPerEpoch: { 1: totalRefunds }, - }, - ]; - - const actualSTFees = FeeResult.create(storageFee, processingFee, feeRefunds); - - identityBalanceRepositoryMock = { - applyFees: this.sinon.stub().resolves( - new StorageResult(actualSTFees), - ), - }; - - documentsBatchTransitionFixture.setExecutionContext(stateTransitionExecutionContextMock); - dataContractCreateTransitionFixture.setExecutionContext(stateTransitionExecutionContextMock); - - documentTx = documentsBatchTransitionFixture.toBuffer(); - - dataContractTx = dataContractCreateTransitionFixture.toBuffer(); - - dppMock = createDPPMock(this.sinon); - - validationResult = new ValidationResult(); - - dppMock - .stateTransition - .validateState - .resolves(validationResult); - - unserializeStateTransitionMock = this.sinon.stub(); - - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - proposalBlockExecutionContextMock.getHeight.returns(Long.fromNumber(42)); - proposalBlockExecutionContextMock.getEpochInfo.returns({ - currentEpochIndex: 0, - }); - - executionTimerMock = { - clearTimer: this.sinon.stub(), - getTimer: this.sinon.stub(), - startTimer: this.sinon.stub(), - stopTimer: this.sinon.stub(), - isStarted: this.sinon.stub(), - }; - - createContextLoggerMock = this.sinon.stub().returns(loggerMock); - - calculateStateTransitionFeeMock = this.sinon.stub().returns({ - storageFee, - processingFee, - feeRefunds, - totalRefunds, - requiredAmount: processingFee - totalRefunds, - desiredAmount: storageFee + processingFee - totalRefunds, - }); - - calculateStateTransitionFeeFromOperationsMock = this.sinon.stub().returns({ - storageFee, - processingFee, - feeRefunds, - totalRefunds, - requiredAmount: processingFee - totalRefunds, - desiredAmount: storageFee + processingFee - totalRefunds, - }); - - deliverTx = deliverTxFactory( - unserializeStateTransitionMock, - dppMock, - proposalBlockExecutionContextMock, - executionTimerMock, - identityBalanceRepositoryMock, - calculateStateTransitionFeeMock, - calculateStateTransitionFeeFromOperationsMock, - createContextLoggerMock, - ); - }); - - it('should execute a state transition and return result', async () => { - unserializeStateTransitionMock.resolves(documentsBatchTransitionFixture); - - const response = await deliverTx(documentTx, round, loggerMock); - - expect(response).to.deep.equal({ - code: 0, - fees: { - processingFee, - storageFee, - refundsPerEpoch, - }, - }); - - expect(unserializeStateTransitionMock).to.be.calledOnceWithExactly( - documentsBatchTransitionFixture.toBuffer(), - { - logger: loggerMock, - executionTimer: executionTimerMock, - }, - ); - - expect(dppMock.stateTransition.validateState).to.be.calledOnceWithExactly( - documentsBatchTransitionFixture, - ); - - expect(dppMock.stateTransition.apply).to.be.calledOnceWithExactly( - documentsBatchTransitionFixture, - ); - - expect(identityBalanceRepositoryMock.applyFees).to.be.calledOnce(); - - const applyFeesToBalanceArgs = identityBalanceRepositoryMock.applyFees.getCall(0).args; - - expect(applyFeesToBalanceArgs).to.have.lengthOf(3); - - const identifier = applyFeesToBalanceArgs[0]; - - expect(identifier).to.equals(documentsBatchTransitionFixture.getOwnerId()); - - const feeResult = applyFeesToBalanceArgs[1]; - - expect(feeResult).to.be.an.instanceOf(FeeResult); - - expect(feeResult.storageFee).to.equals(storageFee); - expect(feeResult.processingFee).to.equals(processingFee); - expect(feeResult.feeRefunds).to.deep.equals(feeRefunds); - - expect(applyFeesToBalanceArgs[2]).to.deep.equals({ useTransaction: true }); - - expect(proposalBlockExecutionContextMock.addDataContract).to.not.be.called(); - - expect( - dataContractCreateTransitionFixture.getExecutionContext().dryOperations, - ).to.have.length(0); - - const stHash = crypto - .createHash('sha256') - .update(documentTx) - .digest() - .toString('hex') - .toUpperCase(); - expect(createContextLoggerMock).to.be.calledOnceWithExactly(loggerMock, { - txId: stHash, - }); - }); - - it('should execute a DataContractCreateTransition', async () => { - unserializeStateTransitionMock.resolves(dataContractCreateTransitionFixture); - - const response = await deliverTx(dataContractTx, round, loggerMock); - - expect(response).to.deep.equal({ - code: 0, - fees: { - processingFee, - storageFee, - refundsPerEpoch, - }, - }); - - expect(unserializeStateTransitionMock).to.be.calledOnceWithExactly( - dataContractCreateTransitionFixture.toBuffer(), - { - logger: loggerMock, - executionTimer: executionTimerMock, - }, - ); - - expect(dppMock.stateTransition.validateState).to.be.calledOnceWithExactly( - dataContractCreateTransitionFixture, - ); - - expect(dppMock.stateTransition.apply).to.be.calledOnceWithExactly( - dataContractCreateTransitionFixture, - ); - - expect(identityBalanceRepositoryMock.applyFees).to.be.calledOnce(); - - const applyFeesToBalanceArgs = identityBalanceRepositoryMock.applyFees.getCall(0).args; - - expect(applyFeesToBalanceArgs).to.have.lengthOf(3); - - const identifier = applyFeesToBalanceArgs[0]; - - expect(identifier).to.equals(dataContractCreateTransitionFixture.getOwnerId()); - - const feeResult = applyFeesToBalanceArgs[1]; - - expect(feeResult).to.be.an.instanceOf(FeeResult); - - expect(feeResult.storageFee).to.equals(storageFee); - expect(feeResult.processingFee).to.equals(processingFee); - expect(feeResult.feeRefunds).to.deep.equals(feeRefunds); - - expect(applyFeesToBalanceArgs[2]).to.deep.equals({ useTransaction: true }); - - expect( - dataContractCreateTransitionFixture.getExecutionContext().dryOperations, - ).to.have.length(0); - - expect(proposalBlockExecutionContextMock.addDataContract).to.be.calledOnceWith( - dataContractCreateTransitionFixture.getDataContract(), - ); - }); - - it('should throw DPPValidationAbciError if a state transition is invalid against state', async () => { - unserializeStateTransitionMock.resolves(dataContractCreateTransitionFixture); - - const error = new SomeConsensusError('Consensus error'); - - validationResult.addError(error); - - try { - await deliverTx(documentTx, round, loggerMock); - - expect.fail('should throw InvalidArgumentAbciError error'); - } catch (e) { - expect(e).to.be.instanceOf(DPPValidationAbciError); - expect(e.getCode()).to.equal(error.getCode()); - expect(e.getData()).to.deep.equal({ - arguments: ['Consensus error'], - }); - } - }); - - it('should throw DPPValidationAbciError if a state transition is not valid', async () => { - const errorMessage = 'Invalid structure'; - const error = new InvalidArgumentAbciError(errorMessage); - - unserializeStateTransitionMock.throws(error); - - try { - await deliverTx(documentTx, round, loggerMock); - - expect.fail('should throw InvalidArgumentAbciError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentAbciError); - expect(e.getMessage()).to.equal(errorMessage); - expect(e.getCode()).to.equal(GrpcErrorCodes.INVALID_ARGUMENT); - expect(dppMock.stateTransition.validate).to.not.be.called(); - } - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/proposal/endBlockFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/proposal/endBlockFactory.spec.js deleted file mode 100644 index cbb0ca7a2cc..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/proposal/endBlockFactory.spec.js +++ /dev/null @@ -1,134 +0,0 @@ -const Long = require('long'); - -const endBlockFactory = require('../../../../../lib/abci/handlers/proposal/endBlockFactory'); -const BlockExecutionContextMock = require('../../../../../lib/test/mock/BlockExecutionContextMock'); -const LoggerMock = require('../../../../../lib/test/mock/LoggerMock'); -const GroveDBStoreMock = require('../../../../../lib/test/mock/GroveDBStoreMock'); - -describe('endBlockFactory', () => { - let endBlock; - let height; - let dpnsContractBlockHeight; - let loggerMock; - let createValidatorSetUpdateMock; - let validatorSetMock; - let getFeatureFlagForHeightMock; - let rsAbciMock; - let blockEndMock; - let time; - let createConsensusParamUpdateMock; - let rotateAndCreateValidatorSetUpdateMock; - let groveDBStoreMock; - let appHashFixture; - let validatorSetUpdateFixture; - let consensusParamUpdatesFixture; - let executionTimerMock; - let proposalBlockExecutionContextMock; - let round; - let coreChainLockedHeight; - let fees; - - beforeEach(function beforeEach() { - round = 42; - coreChainLockedHeight = 41; - time = Date.now(); - fees = { - processingFee: 10, - storageFee: 100, - feeRefunds: { - 1: 15, - }, - feeRefundsSum: 15, - }; - - executionTimerMock = { - clearTimer: this.sinon.stub(), - startTimer: this.sinon.stub(), - stopTimer: this.sinon.stub(), - }; - - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - proposalBlockExecutionContextMock.hasDataContract.returns(true); - proposalBlockExecutionContextMock.getTimeMs.returns(time); - - proposalBlockExecutionContextMock.getEpochInfo.returns({ - currentEpochIndex: 42, - isEpochChange: true, - }); - - loggerMock = new LoggerMock(this.sinon); - - dpnsContractBlockHeight = 2; - - validatorSetMock = { - rotate: this.sinon.stub(), - getQuorum: this.sinon.stub(), - }; - - createValidatorSetUpdateMock = this.sinon.stub(); - - getFeatureFlagForHeightMock = this.sinon.stub().resolves(null); - - blockEndMock = this.sinon.stub(); - - rsAbciMock = { - blockEnd: blockEndMock, - }; - - blockEndMock.resolves({ - currentEpochIndex: 42, - isEpochChange: true, - }); - - consensusParamUpdatesFixture = Buffer.alloc(1); - validatorSetUpdateFixture = Buffer.alloc(2); - appHashFixture = Buffer.alloc(0); - - createConsensusParamUpdateMock = this.sinon.stub().resolves(consensusParamUpdatesFixture); - rotateAndCreateValidatorSetUpdateMock = this.sinon.stub().resolves(validatorSetUpdateFixture); - - groveDBStoreMock = new GroveDBStoreMock(this.sinon); - groveDBStoreMock.getRootHash.resolves(appHashFixture); - - endBlock = endBlockFactory( - proposalBlockExecutionContextMock, - validatorSetMock, - createValidatorSetUpdateMock, - getFeatureFlagForHeightMock, - createConsensusParamUpdateMock, - rotateAndCreateValidatorSetUpdateMock, - rsAbciMock, - groveDBStoreMock, - executionTimerMock, - ); - - height = Long.fromInt(dpnsContractBlockHeight); - }); - - it('should end block', async () => { - const response = await endBlock({ - height, round, fees, coreChainLockedHeight, - }, loggerMock); - - expect(response).to.deep.equal({ - consensusParamUpdates: consensusParamUpdatesFixture, - validatorSetUpdate: validatorSetUpdateFixture, - appHash: appHashFixture, - }); - - expect(proposalBlockExecutionContextMock.hasDataContract).to.not.have.been.called(); - expect(createConsensusParamUpdateMock).to.be.calledOnceWithExactly(height, round, loggerMock); - expect(rotateAndCreateValidatorSetUpdateMock).to.be.calledOnceWithExactly( - height, - coreChainLockedHeight, - round, - loggerMock, - ); - expect(groveDBStoreMock.getRootHash).to.be.calledOnceWithExactly({ useTransaction: true }); - - expect(rsAbciMock.blockEnd).to.be.calledOnceWithExactly({ fees }, true); - - expect(executionTimerMock.stopTimer).to.be.calledOnceWithExactly('roundExecution', true); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/proposal/processProposalFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/proposal/processProposalFactory.spec.js deleted file mode 100644 index c114a5e676a..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/proposal/processProposalFactory.spec.js +++ /dev/null @@ -1,170 +0,0 @@ -const { - tendermint: { - abci: { - ResponseProcessProposal, - ValidatorSetUpdate, - }, - types: { - ConsensusParams, - }, - }, -} = require('@dashevo/abci/types'); - -const Long = require('long'); - -const processProposalHandlerFactory = require('../../../../../lib/abci/handlers/proposal/processProposalFactory'); -const LoggerMock = require('../../../../../lib/test/mock/LoggerMock'); -const BlockExecutionContextMock = require('../../../../../lib/test/mock/BlockExecutionContextMock'); - -describe('processProposalFactory', () => { - let processProposalHandler; - let request; - let loggerMock; - let beginBlockMock; - let endBlockMock; - let deliverTxMock; - let appHash; - let validatorSetUpdate; - let consensusParamUpdates; - let coreChainLockUpdate; - let proposalBlockExecutionContextMock; - let round; - let executionTimerMock; - let quorumHash; - - beforeEach(function beforeEach() { - round = 0; - appHash = Buffer.alloc(1, 1); - - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - loggerMock = new LoggerMock(this.sinon); - - consensusParamUpdates = new ConsensusParams({ - block: { - maxBytes: 1, - maxGas: 2, - }, - evidence: { - maxAgeDuration: null, - maxAgeNumBlocks: 1, - maxBytes: 2, - }, - version: { - appVersion: 1, - }, - }); - - validatorSetUpdate = new ValidatorSetUpdate(); - - beginBlockMock = this.sinon.stub(); - - endBlockMock = this.sinon.stub().resolves({ - consensusParamUpdates, - appHash, - validatorSetUpdate, - }); - - deliverTxMock = this.sinon.stub().resolves({ - code: 0, - fees: { - processingFee: 10, - storageFee: 100, - refundsPerEpoch: { - 1: 15, - }, - }, - }); - - beginBlockMock = this.sinon.stub(); - - executionTimerMock = { - getTimer: this.sinon.stub().returns(0.1), - }; - - processProposalHandler = processProposalHandlerFactory( - deliverTxMock, - proposalBlockExecutionContextMock, - beginBlockMock, - endBlockMock, - executionTimerMock, - ); - - const txs = new Array(3).fill(Buffer.alloc(5, 0)); - - const height = new Long(42); - - const time = { - seconds: Math.ceil(new Date().getTime() / 1000), - }; - const version = { - app: Long.fromInt(1), - }; - const proposerProTxHash = Uint8Array.from([1, 2, 3, 4]); - const coreChainLockedHeight = 10; - const proposedLastCommit = {}; - - coreChainLockUpdate = { - coreBlockHeight: 42, - coreBlockHash: '1528e523f4c20fa84ba70dd96372d34e00ce260f357d53ad1a8bc892ebf20e2d', - signature: '1897ce8f54d2070f44ca5c29983b68b391e8137c25e44f67416e579f3e3bdfef7b4fd22db7818399147e52907998857b0fbc8edfdc40a64f2c7df0e88544d31d12ca8c15e73d50dda25ca23f754ed3f789ed4bcb392161995f464017c10df404', - }; - - quorumHash = Buffer.alloc(32, 0); - - request = { - round, - height, - txs, - coreChainLockedHeight, - version, - proposedLastCommit, - time, - proposerProTxHash, - coreChainLockUpdate, - quorumHash, - }; - }); - - it('should return ResponseProcessProposal', async () => { - const result = await processProposalHandler(request, loggerMock); - - expect(result).to.be.an.instanceOf(ResponseProcessProposal); - expect(result.status).to.equal(1); - expect(result.appHash).to.equal(appHash); - expect(result.txResults).to.be.deep.equal(new Array(3).fill({ code: 0 })); - expect(result.consensusParamUpdates).to.be.equal(consensusParamUpdates); - expect(result.validatorSetUpdate).to.be.equal(validatorSetUpdate); - - expect(beginBlockMock).to.be.calledOnceWithExactly( - { - lastCommitInfo: request.proposedLastCommit, - height: request.height, - coreChainLockedHeight: request.coreChainLockedHeight, - version: request.version, - time: request.time, - proposerProTxHash: Buffer.from(request.proposerProTxHash), - proposedAppVersion: request.proposedAppVersion, - round, - quorumHash, - }, - loggerMock, - ); - - expect(deliverTxMock).to.be.calledThrice(); - - expect(endBlockMock).to.be.calledOnceWithExactly({ - height: request.height, - round, - fees: { - processingFee: 10 * 3, - storageFee: 100 * 3, - refundsPerEpoch: { - 1: 15 * 3, - }, - }, - coreChainLockedHeight: request.coreChainLockedHeight, - }, - loggerMock); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/proposal/rotateAndCreateValidatorSetUpdateFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/proposal/rotateAndCreateValidatorSetUpdateFactory.spec.js deleted file mode 100644 index e404f70cdec..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/proposal/rotateAndCreateValidatorSetUpdateFactory.spec.js +++ /dev/null @@ -1,103 +0,0 @@ -const { - tendermint: { - abci: { - ValidatorSetUpdate, - }, - }, -} = require('@dashevo/abci/types'); -const Long = require('long'); -const rotateAndCreateValidatorSetUpdateFactory = require('../../../../../lib/abci/handlers/proposal/rotateAndCreateValidatorSetUpdateFactory'); -const BlockExecutionContextMock = require('../../../../../lib/test/mock/BlockExecutionContextMock'); -const LoggerMock = require('../../../../../lib/test/mock/LoggerMock'); - -describe('rotateAndCreateValidatorSetUpdateFactory', () => { - let rotateAndCreateValidatorSetUpdate; - let validatorSetMock; - let createValidatorSetUpdateMock; - let height; - let loggerMock; - let lastCommitInfoMock; - let round; - let proposalBlockExecutionContextMock; - let coreChainLockedHeight; - - beforeEach(function beforeEach() { - round = 0; - coreChainLockedHeight = 1; - - lastCommitInfoMock = { - blockSignature: Uint8Array.from('003657bb44d74c371d14485117de43313ca5c2848f3622d691c2b1bf3576a64bdc2538efab24854eb82ae7db38482dbd15a1cb3bc98e55173817c9d05c86e47a5d67614a501414aae6dd1565e59422d1d77c41ae9b38de34ecf1e9f778b2a97b'), - }; - - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - proposalBlockExecutionContextMock.getLastCommitInfo.returns(lastCommitInfoMock); - - validatorSetMock = { - rotate: this.sinon.stub(), - getQuorum: this.sinon.stub(), - }; - - createValidatorSetUpdateMock = this.sinon.stub(); - - loggerMock = new LoggerMock(this.sinon); - - rotateAndCreateValidatorSetUpdate = rotateAndCreateValidatorSetUpdateFactory( - proposalBlockExecutionContextMock, - validatorSetMock, - createValidatorSetUpdateMock, - ); - }); - - it('should rotate validator set and return ValidatorSetUpdate if height is divisible by ROTATION_BLOCK_INTERVAL', async () => { - height = Long.fromInt(15); - - const quorumHash = Buffer.alloc(64).fill(1).toString('hex'); - - validatorSetMock.rotate.resolves(true); - validatorSetMock.getQuorum.resolves({ quorumHash }); - - const validatorSetUpdate = new ValidatorSetUpdate(); - - createValidatorSetUpdateMock.returns(validatorSetUpdate); - - const response = await rotateAndCreateValidatorSetUpdate( - height, - coreChainLockedHeight, - round, - loggerMock, - ); - - expect(validatorSetMock.rotate).to.be.calledOnceWithExactly( - height, - coreChainLockedHeight, - Buffer.from(lastCommitInfoMock.blockSignature), - ); - - expect(createValidatorSetUpdateMock).to.be.calledOnceWithExactly(validatorSetMock); - - expect(response).to.be.equal(validatorSetUpdate); - }); - - it('should return undefined', async () => { - height = Long.fromInt(15); - - validatorSetMock.rotate.resolves(false); - - const response = await rotateAndCreateValidatorSetUpdate( - height, - coreChainLockedHeight, - round, - loggerMock, - ); - - expect(validatorSetMock.rotate).to.be.calledOnceWithExactly( - height, - coreChainLockedHeight, - Buffer.from(lastCommitInfoMock.blockSignature), - ); - - expect(createValidatorSetUpdateMock).to.not.be.called(); - - expect(response).to.be.undefined(); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/proposal/verifyChainLockFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/proposal/verifyChainLockFactory.spec.js deleted file mode 100644 index d8debd3330b..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/proposal/verifyChainLockFactory.spec.js +++ /dev/null @@ -1,117 +0,0 @@ -const verifyChainLockFactory = require('../../../../../lib/abci/handlers/proposal/verifyChainLockFactory'); - -const LoggerMock = require('../../../../../lib/test/mock/LoggerMock'); -const BlockExecutionContextMock = require('../../../../../lib/test/mock/BlockExecutionContextMock'); - -describe('verifyChainLockFactory', () => { - let verifyChainLock; - let chainLockMock; - let loggerMock; - let coreRpcClientMock; - let latestBlockExecutionContextMock; - - beforeEach(function beforeEach() { - latestBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - latestBlockExecutionContextMock.getCoreChainLockedHeight.returns(41); - - chainLockMock = { - coreBlockHash: Buffer.alloc(1, 1).toString(), - signature: Buffer.alloc(1, 2).toString(), - coreBlockHeight: 42, - }; - - loggerMock = new LoggerMock(this.sinon); - - coreRpcClientMock = { - verifyChainLock: this.sinon.stub(), - }; - coreRpcClientMock.verifyChainLock.resolves({ result: true }); - - verifyChainLock = verifyChainLockFactory( - coreRpcClientMock, - latestBlockExecutionContextMock, - loggerMock, - ); - }); - - it('should verify chain lock though Core', async () => { - const result = await verifyChainLock(chainLockMock); - - expect(result).to.be.true(); - expect(coreRpcClientMock.verifyChainLock).to.be.calledOnceWithExactly( - Buffer.from(chainLockMock.coreBlockHash).toString('hex'), - Buffer.from(chainLockMock.signature).toString('hex'), - chainLockMock.coreBlockHeight, - ); - - expect(latestBlockExecutionContextMock.getCoreChainLockedHeight).to.be.calledOnce(); - }); - - it('should return false if chainLock is not valid', async () => { - coreRpcClientMock.verifyChainLock.resolves({ result: false }); - - const result = await verifyChainLock(chainLockMock); - - expect(result).to.be.false(); - }); - - it('should return false if Core returns parse error', async () => { - const error = new Error('parse error'); - error.code = -32700; - - coreRpcClientMock.verifyChainLock.throws(error); - - const result = await verifyChainLock(chainLockMock); - - expect(result).to.be.false(); - expect(coreRpcClientMock.verifyChainLock).to.be.calledOnceWithExactly( - Buffer.from(chainLockMock.coreBlockHash).toString('hex'), - Buffer.from(chainLockMock.signature).toString('hex'), - chainLockMock.coreBlockHeight, - ); - }); - - it('should return false if Core returns invalid signature format error', async () => { - const error = new Error('invalid signature format'); - error.code = -8; - - coreRpcClientMock.verifyChainLock.throws(error); - - const result = await verifyChainLock(chainLockMock); - - expect(result).to.be.false(); - expect(coreRpcClientMock.verifyChainLock).to.be.calledOnceWithExactly( - Buffer.from(chainLockMock.coreBlockHash).toString('hex'), - Buffer.from(chainLockMock.signature).toString('hex'), - chainLockMock.coreBlockHeight, - ); - }); - - it('should throw an error if Core throws error', async () => { - const error = new Error(); - - coreRpcClientMock.verifyChainLock.throws(error); - - try { - await verifyChainLock(chainLockMock); - - expect.fail('error was not thrown'); - } catch (e) { - expect(e).to.deep.equal(error); - } - - expect(coreRpcClientMock.verifyChainLock).to.be.calledOnceWithExactly( - Buffer.from(chainLockMock.coreBlockHash).toString('hex'), - Buffer.from(chainLockMock.signature).toString('hex'), - chainLockMock.coreBlockHeight, - ); - }); - - it('should return false if coreBlockHeight >= lastCoreChainLockedHeight', async () => { - latestBlockExecutionContextMock.getCoreChainLockedHeight.returns(42); - const result = await verifyChainLock(chainLockMock); - - expect(result).to.be.false(); - expect(coreRpcClientMock.verifyChainLock).to.not.be.called(); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/query/dataContractQueryHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/query/dataContractQueryHandlerFactory.spec.js deleted file mode 100644 index bafac7aa54f..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/query/dataContractQueryHandlerFactory.spec.js +++ /dev/null @@ -1,124 +0,0 @@ -const { - tendermint: { - abci: { - ResponseQuery, - }, - }, -} = require('@dashevo/abci/types'); - -const { - v0: { - GetDataContractResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); - -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const dataContractQueryHandlerFactory = require('../../../../../lib/abci/handlers/query/dataContractQueryHandlerFactory'); - -const NotFoundAbciError = require('../../../../../lib/abci/errors/NotFoundAbciError'); -const StoreRepositoryMock = require('../../../../../lib/test/mock/StoreRepositoryMock'); -const InvalidArgumentAbciError = require('../../../../../lib/abci/errors/InvalidArgumentAbciError'); -const StorageResult = require('../../../../../lib/storage/StorageResult'); - -describe('dataContractQueryHandlerFactory', () => { - let dataContractQueryHandler; - let dataContract; - let params; - let data; - let createQueryResponseMock; - let responseMock; - let dataContractRepositoryMock; - - beforeEach(function beforeEach() { - dataContract = getDataContractFixture(); - - createQueryResponseMock = this.sinon.stub(); - - responseMock = new GetDataContractResponse(); - responseMock.setProof(new Proof()); - - createQueryResponseMock.returns(responseMock); - - dataContractRepositoryMock = new StoreRepositoryMock(this.sinon); - - dataContractQueryHandler = dataContractQueryHandlerFactory( - dataContractRepositoryMock, - createQueryResponseMock, - ); - - params = { }; - data = { - id: dataContract.getId(), - }; - }); - - it('should throw NotFoundAbciError if Data Contract not found', async () => { - dataContractRepositoryMock.fetch.resolves( - new StorageResult(null), - ); - - try { - await dataContractQueryHandler(params, data, {}); - - expect.fail('should throw NotFoundAbciError'); - } catch (e) { - expect(e).to.be.an.instanceOf(NotFoundAbciError); - expect(dataContractRepositoryMock.fetch).to.be.calledOnce(); - } - }); - - it('should return data contract', async () => { - dataContractRepositoryMock.fetch.resolves( - new StorageResult(dataContract), - ); - - const result = await dataContractQueryHandler(params, data, {}); - - expect(result).to.be.an.instanceof(ResponseQuery); - expect(result.code).to.equal(0); - expect(result.value).to.deep.equal(responseMock.serializeBinary()); - }); - - it('should InvalidArgumentAbciError on wrong Id', async () => { - data.id = Buffer.alloc(0); - - try { - await dataContractQueryHandler(params, data, {}); - - expect.fail('should throw InvalidArgumentAbciError'); - } catch (e) { - expect(e).to.be.an.instanceOf(InvalidArgumentAbciError); - } - }); - - it('should return proof if it was requested', async () => { - // const proof = { - // rootTreeProof: Buffer.from('0100000001f0faf5f55674905a68eba1be2f946e667c1cb5010101', 'hex'), - // storeTreeProof: Buffer.from('03046b657931060076616c75653103046b657932060076616c75653210', - // 'hex'), - // }; - - const proof = Buffer.alloc(20, 255); - - dataContractRepositoryMock.fetch.resolves( - new StorageResult(dataContract), - ); - - dataContractRepositoryMock.prove.resolves( - new StorageResult(proof), - ); - - const result = await dataContractQueryHandler(params, data, { prove: true }); - - expect(dataContractRepositoryMock.prove).to.be.calledOnceWithExactly( - new Identifier(data.id), - ); - - expect(result).to.be.an.instanceof(ResponseQuery); - expect(result.code).to.equal(0); - expect(result.value).to.deep.equal(responseMock.serializeBinary()); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/query/documentQueryHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/query/documentQueryHandlerFactory.spec.js deleted file mode 100644 index cb56c5aefbe..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/query/documentQueryHandlerFactory.spec.js +++ /dev/null @@ -1,167 +0,0 @@ -const { - tendermint: { - abci: { - ResponseQuery, - }, - }, -} = require('@dashevo/abci/types'); - -const { - v0: { - GetDocumentsResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); - -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); - -const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); -const documentQueryHandlerFactory = require('../../../../../lib/abci/handlers/query/documentQueryHandlerFactory'); -const InvalidQueryError = require('../../../../../lib/document/errors/InvalidQueryError'); - -const UnavailableAbciError = require('../../../../../lib/abci/errors/UnavailableAbciError'); -const InvalidArgumentAbciError = require('../../../../../lib/abci/errors/InvalidArgumentAbciError'); -const StorageResult = require('../../../../../lib/storage/StorageResult'); - -describe('documentQueryHandlerFactory', () => { - let documentQueryHandler; - let fetchSignedDocumentsMock; - let proveSignedDocumentsMock; - let documents; - let params; - let data; - let options; - let createQueryResponseMock; - let responseMock; - - beforeEach(function beforeEach() { - documents = getDocumentsFixture(); - - fetchSignedDocumentsMock = this.sinon.stub(); - proveSignedDocumentsMock = this.sinon.stub(); - createQueryResponseMock = this.sinon.stub(); - - responseMock = new GetDocumentsResponse(); - responseMock.setProof(new Proof()); - - createQueryResponseMock.returns(responseMock); - - documentQueryHandler = documentQueryHandlerFactory( - fetchSignedDocumentsMock, - proveSignedDocumentsMock, - createQueryResponseMock, - ); - - params = {}; - data = { - contractId: generateRandomIdentifier(), - type: 'documentType', - orderBy: [{ sort: 'asc' }], - limit: 2, - startAt: undefined, - startAfter: undefined, - where: [['field', '==', 'value']], - }; - options = { - orderBy: data.orderBy, - limit: data.limit, - startAt: data.startAt, - startAfter: data.startAfter, - where: data.where, - }; - }); - - it('should return serialized documents', async () => { - fetchSignedDocumentsMock.resolves( - new StorageResult(documents), - ); - - const result = await documentQueryHandler(params, data, {}); - - expect(createQueryResponseMock).to.be.calledOnceWith(GetDocumentsResponse, undefined); - expect(fetchSignedDocumentsMock).to.be.calledOnceWith( - data.contractId, - data.type, - options, - ); - expect(proveSignedDocumentsMock).to.not.be.called(); - expect(result).to.be.an.instanceof(ResponseQuery); - expect(result.code).to.equal(0); - - expect(result.value).to.deep.equal(responseMock.serializeBinary()); - }); - - it('should return proof if it was requested', async () => { - // const proof = { - // rootTreeProof: Buffer.from('0100000001f0faf5f55674905a68eba1be2f946e667c1cb5010101', - // 'hex'), - // storeTreeProof: Buffer.from('03046b657931060076616c75653103046b657932060076616c75653210', - // 'hex'), - // }; - - const proof = Buffer.alloc(20, 255); - - fetchSignedDocumentsMock.resolves(new StorageResult(documents)); - proveSignedDocumentsMock.resolves( - new StorageResult(proof), - ); - - const result = await documentQueryHandler(params, data, { prove: true }); - - expect(createQueryResponseMock).to.be.calledOnceWith(GetDocumentsResponse, true); - expect(fetchSignedDocumentsMock).to.not.be.called(); - expect(proveSignedDocumentsMock).to.be.calledOnceWith(data.contractId, data.type, options); - - expect(result).to.be.an.instanceof(ResponseQuery); - expect(result.code).to.equal(0); - - expect(result.value).to.deep.equal(responseMock.serializeBinary()); - }); - - it('should throw InvalidArgumentAbciError on invalid query', async () => { - fetchSignedDocumentsMock.throws(new InvalidQueryError('invalid')); - - try { - await documentQueryHandler(params, data, {}); - - expect.fail('should throw UnavailableAbciError'); - } catch (e) { - expect(e).to.be.an.instanceof(InvalidArgumentAbciError); - expect(e.getCode()).to.equal(GrpcErrorCodes.INVALID_ARGUMENT); - expect(e.getMessage()).to.equal('Invalid query: invalid'); - expect(fetchSignedDocumentsMock).to.be.calledOnceWith(data.contractId, data.type); - } - }); - - it('should not proceed forward if createQueryResponse throws UnavailableAbciError', async () => { - createQueryResponseMock.throws(new UnavailableAbciError('message')); - - try { - await documentQueryHandler(params, data, {}); - - expect.fail('should throw UnavailableAbciError'); - } catch (e) { - expect(e).to.be.an.instanceof(UnavailableAbciError); - expect(e.getCode()).to.equal(GrpcErrorCodes.UNAVAILABLE); - expect(e.getMessage()).to.equal('message'); - expect(fetchSignedDocumentsMock).to.not.be.called(); - } - }); - - it('should throw error if fetchSignedDocuments throws unknown error', async () => { - const error = new Error('Some error'); - - fetchSignedDocumentsMock.throws(error); - - try { - await documentQueryHandler(params, data, {}); - - expect.fail('should throw any error'); - } catch (e) { - expect(e).to.deep.equal(error); - expect(fetchSignedDocumentsMock).to.be.calledOnceWith(data.contractId, data.type); - } - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/query/getProofsQueryHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/query/getProofsQueryHandlerFactory.spec.js deleted file mode 100644 index ca2970a27b5..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/query/getProofsQueryHandlerFactory.spec.js +++ /dev/null @@ -1,122 +0,0 @@ -const { - tendermint: { - abci: { - ResponseQuery, - }, - }, -} = require('@dashevo/abci/types'); - -const Long = require('long'); -const cbor = require('cbor'); - -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); - -const getProofsQueryHandlerFactory = require('../../../../../lib/abci/handlers/query/getProofsQueryHandlerFactory'); -const BlockExecutionContextMock = require('../../../../../lib/test/mock/BlockExecutionContextMock'); -const StorageResult = require('../../../../../lib/storage/StorageResult'); - -describe('getProofsQueryHandlerFactory', () => { - let getProofsQueryHandler; - let dataContract; - let identity; - let documents; - let dataContractData; - let documentsData; - let identityData; - let blockExecutionContextMock; - let identityRepositoryMock; - let dataContractRepositoryMock; - let documentRepository; - let timeMs; - - beforeEach(function beforeEach() { - dataContract = getDataContractFixture(); - identity = getIdentityFixture(); - documents = getDocumentsFixture(); - - const version = { - app: Long.fromInt(1), - }; - - timeMs = Date.now(); - - blockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - blockExecutionContextMock.getHeight.returns(new Long(42)); - blockExecutionContextMock.getCoreChainLockedHeight.returns(41); - blockExecutionContextMock.getTimeMs.returns(timeMs); - blockExecutionContextMock.getVersion.returns(version); - blockExecutionContextMock.getRound.returns(42); - blockExecutionContextMock.getLastCommitInfo.returns({ - quorumHash: Buffer.alloc(32, 1), - blockSignature: Buffer.alloc(32, 1), - }); - - identityRepositoryMock = { - proveMany: this.sinon.stub().resolves(new StorageResult(Buffer.from([1]))), - }; - dataContractRepositoryMock = { - proveMany: this.sinon.stub().resolves(new StorageResult(Buffer.from([1]))), - }; - - documentRepository = { - proveManyDocumentsFromDifferentContracts: this.sinon.stub().resolves( - new StorageResult(Buffer.from([1])), - ), - }; - - getProofsQueryHandler = getProofsQueryHandlerFactory( - blockExecutionContextMock, - identityRepositoryMock, - dataContractRepositoryMock, - documentRepository, - ); - - dataContractData = { - id: dataContract.getId(), - }; - identityData = { - id: identity.getId(), - }; - documentsData = documents.map((doc) => ({ - documentId: doc.getId(), - dataContractId: doc.getDataContractId(), - type: doc.getType(), - })); - }); - - it('should return proof for passed data contract ids', async () => { - const expectedProof = { - quorumHash: Buffer.alloc(32, 1), - signature: Buffer.alloc(32, 1), - merkleProof: Buffer.from([1]), - round: 42, - }; - - const result = await getProofsQueryHandler({}, { - dataContractIds: [dataContractData.id], - identityIds: [identityData.id], - documents: documentsData, - }); - - const expectedResult = new ResponseQuery({ - value: cbor.encode( - { - documentsProof: expectedProof, - identitiesProof: expectedProof, - dataContractsProof: expectedProof, - metadata: { - height: 42, - coreChainLockedHeight: 41, - timeMs, - protocolVersion: 1, - }, - }, - ), - }); - - expect(result).to.be.deep.equal(expectedResult); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/query/identitiesByPublicKeyHashesQueryHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/query/identitiesByPublicKeyHashesQueryHandlerFactory.spec.js deleted file mode 100644 index 9d4571ea4a4..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/query/identitiesByPublicKeyHashesQueryHandlerFactory.spec.js +++ /dev/null @@ -1,135 +0,0 @@ -const { - tendermint: { - abci: { - ResponseQuery, - }, - }, -} = require('@dashevo/abci/types'); - -const { - v0: { - GetIdentitiesByPublicKeyHashesResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); - -const identitiesByPublicKeyHashesQueryHandlerFactory = require( - '../../../../../lib/abci/handlers/query/identitiesByPublicKeyHashesQueryHandlerFactory', -); -const InvalidArgumentAbciError = require('../../../../../lib/abci/errors/InvalidArgumentAbciError'); -const StorageResult = require('../../../../../lib/storage/StorageResult'); - -describe('identitiesByPublicKeyHashesQueryHandlerFactory', () => { - let identitiesByPublicKeyHashesQueryHandler; - let identityRepositoryMock; - let publicKeyHashes; - let identities; - let maxIdentitiesPerRequest; - let createQueryResponseMock; - let responseMock; - let params; - let data; - - beforeEach(function beforeEach() { - identityRepositoryMock = { - proveManyByPublicKeyHashes: this.sinon.stub(), - fetchManyByPublicKeyHashes: this.sinon.stub(), - }; - - maxIdentitiesPerRequest = 5; - - createQueryResponseMock = this.sinon.stub(); - - responseMock = new GetIdentitiesByPublicKeyHashesResponse(); - responseMock.setProof(new Proof()); - - createQueryResponseMock.returns(responseMock); - - identitiesByPublicKeyHashesQueryHandler = identitiesByPublicKeyHashesQueryHandlerFactory( - identityRepositoryMock, - maxIdentitiesPerRequest, - createQueryResponseMock, - ); - - publicKeyHashes = [ - Buffer.from('784ca12495d2e61f992db9e55d1f9599b0cf1328', 'hex'), - Buffer.from('784ca12495d2e61f992db9e55d1f9599b0cf1329', 'hex'), - Buffer.from('784ca12495d2e61f992db9e55d1f9599b0cf1330', 'hex'), - ]; - - identities = [ - getIdentityFixture(), - getIdentityFixture(), - ]; - - identityRepositoryMock - .fetchManyByPublicKeyHashes.resolves( - new StorageResult([identities[0], identities[1]]), - ); - - params = {}; - data = { publicKeyHashes }; - }); - - it('should throw an error if maximum requested items exceeded', async () => { - maxIdentitiesPerRequest = 1; - - identitiesByPublicKeyHashesQueryHandler = identitiesByPublicKeyHashesQueryHandlerFactory( - identityRepositoryMock, - maxIdentitiesPerRequest, - createQueryResponseMock, - ); - - try { - await identitiesByPublicKeyHashesQueryHandler(params, data, {}); - - expect.fail('Error was not thrown'); - } catch (e) { - expect(e).to.be.an.instanceOf(InvalidArgumentAbciError); - expect(e.getData()).to.deep.equal({ - maxIdentitiesPerRequest, - }); - } - }); - - it('should return identities', async () => { - params = publicKeyHashes; - - const result = await identitiesByPublicKeyHashesQueryHandler(params, data, {}); - - expect(identityRepositoryMock.fetchManyByPublicKeyHashes).to.be.calledOnceWithExactly( - publicKeyHashes, - ); - - expect(result).to.be.an.instanceof(ResponseQuery); - expect(result.code).to.equal(0); - expect(result.value).to.deep.equal(responseMock.serializeBinary()); - }); - - it('should return proof if it was requested', async () => { - // const proof = { - // rootTreeProof: Buffer.from('0100000001f0faf5f55674905a68eba1be2f946e667c1cb5010101', - // 'hex'), - // storeTreeProof: Buffer.from('03046b657931060076616c75653103046b657932060076616c75653210', - // 'hex'), - // }; - - const proof = Buffer.alloc(20, 1); - - identityRepositoryMock.proveManyByPublicKeyHashes.resolves( - new StorageResult(proof), - ); - - const result = await identitiesByPublicKeyHashesQueryHandler(params, data, { prove: true }); - - expect(result).to.be.an.instanceof(ResponseQuery); - expect(result.code).to.equal(0); - expect(result.value).to.deep.equal(responseMock.serializeBinary()); - - expect(identityRepositoryMock.proveManyByPublicKeyHashes).to.be.calledOnceWithExactly( - data.publicKeyHashes, - ); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/query/identityQueryHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/query/identityQueryHandlerFactory.spec.js deleted file mode 100644 index d0e9167fee5..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/query/identityQueryHandlerFactory.spec.js +++ /dev/null @@ -1,112 +0,0 @@ -const { - tendermint: { - abci: { - ResponseQuery, - }, - }, -} = require('@dashevo/abci/types'); - -const { - v0: { - GetIdentityResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); - -const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); -const identityQueryHandlerFactory = require('../../../../../lib/abci/handlers/query/identityQueryHandlerFactory'); -const NotFoundAbciError = require('../../../../../lib/abci/errors/NotFoundAbciError'); -const StorageResult = require('../../../../../lib/storage/StorageResult'); - -describe('identityQueryHandlerFactory', () => { - let identityQueryHandler; - let identityRepositoryMock; - let identity; - let params; - let data; - let createQueryResponseMock; - let responseMock; - - beforeEach(function beforeEach() { - identityRepositoryMock = { - fetch: this.sinon.stub(), - prove: this.sinon.stub(), - }; - - createQueryResponseMock = this.sinon.stub(); - - responseMock = new GetIdentityResponse(); - responseMock.setProof(new Proof()); - - createQueryResponseMock.returns(responseMock); - - identityQueryHandler = identityQueryHandlerFactory( - identityRepositoryMock, - createQueryResponseMock, - ); - - identity = getIdentityFixture(); - - params = {}; - data = { - id: identity.getId(), - }; - }); - - it('should return serialized identity', async () => { - identityRepositoryMock.fetch.resolves( - new StorageResult(identity), - ); - - const result = await identityQueryHandler(params, data, {}); - - expect(identityRepositoryMock.fetch).to.be.calledOnceWith(data.id); - expect(result).to.be.an.instanceof(ResponseQuery); - expect(result.code).to.equal(0); - expect(result.value).to.deep.equal(responseMock.serializeBinary()); - }); - - it('should throw NotFoundAbciError if identity not found', async () => { - identityRepositoryMock.fetch.resolves( - new StorageResult(null), - ); - - try { - await identityQueryHandler(params, data, {}); - - expect.fail('should throw NotFoundAbciError'); - } catch (e) { - expect(e).to.be.an.instanceof(NotFoundAbciError); - expect(e.getCode()).to.equal(GrpcErrorCodes.NOT_FOUND); - expect(e.message).to.equal('Identity not found'); - expect(identityRepositoryMock.fetch).to.be.calledOnceWith(data.id); - } - }); - - it('should return proof if it was requested', async () => { - // const proof = { - // rootTreeProof: Buffer.from('0100000001f0faf5f55674905a68eba1be2f946e667c1cb5010101', - // 'hex'), - // storeTreeProof: Buffer.from('03046b657931060076616c75653103046b657932060076616c75653210', - // 'hex'), - // }; - const proof = Buffer.alloc(20, 1); - - identityRepositoryMock.fetch.resolves( - new StorageResult(null), - ); - identityRepositoryMock.prove.resolves( - new StorageResult(proof), - ); - - const result = await identityQueryHandler(params, data, { prove: true }); - - expect(identityRepositoryMock.fetch).to.not.be.called(); - expect(identityRepositoryMock.prove).to.be.calledOnceWith(data.id); - expect(result).to.be.an.instanceof(ResponseQuery); - expect(result.code).to.equal(0); - expect(result.value).to.deep.equal(responseMock.serializeBinary()); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/query/response/createQueryResponseFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/query/response/createQueryResponseFactory.spec.js deleted file mode 100644 index e87bfa35555..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/query/response/createQueryResponseFactory.spec.js +++ /dev/null @@ -1,77 +0,0 @@ -const { - v0: { - GetDataContractResponse, - }, -} = require('@dashevo/dapi-grpc'); - -const BlockExecutionContextMock = require('../../../../../../lib/test/mock/BlockExecutionContextMock'); -const createQueryResponseFactory = require('../../../../../../lib/abci/handlers/query/response/createQueryResponseFactory'); - -describe('createQueryResponseFactory', () => { - let createQueryResponse; - let metadata; - let lastCommitInfo; - let blockExecutionContextMock; - let timeMs; - - beforeEach(function beforeEach() { - const version = { - app: 1, - }; - - timeMs = Date.now(); - - lastCommitInfo = { - quorumHash: Buffer.alloc(12).fill(1), - blockSignature: Buffer.alloc(12).fill(2), - }; - - metadata = { - height: 1, - coreChainLockedHeight: 1, - timeMs, - protocolVersion: version.app, - }; - - blockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - blockExecutionContextMock.getHeight.returns(metadata.height); - blockExecutionContextMock.getCoreChainLockedHeight.returns(metadata.coreChainLockedHeight); - blockExecutionContextMock.getTimeMs.returns(timeMs); - blockExecutionContextMock.getVersion.returns(version); - blockExecutionContextMock.getLastCommitInfo.returns(lastCommitInfo); - blockExecutionContextMock.isEmpty.returns(false); - blockExecutionContextMock.getRound.returns(42); - - createQueryResponse = createQueryResponseFactory( - blockExecutionContextMock, - ); - }); - - it('should create a response', () => { - const response = createQueryResponse(GetDataContractResponse); - - response.serializeBinary(); - - expect(response).to.be.instanceOf(GetDataContractResponse); - expect(response.getMetadata().toObject()).to.deep.equal(metadata); - expect(response.getProof()).to.undefined(); - }); - - it('should create a response with proof if requested', () => { - const response = createQueryResponse(GetDataContractResponse, true); - - response.serializeBinary(); - - expect(response).to.be.instanceOf(GetDataContractResponse); - - expect(response.getMetadata().toObject()).to.deep.equal(metadata); - - expect(response.getProof().toObject()).to.deep.equal({ - quorumHash: lastCommitInfo.quorumHash.toString('base64'), - signature: lastCommitInfo.blockSignature.toString('base64'), - merkleProof: '', - round: 42, - }); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/queryHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/queryHandlerFactory.spec.js deleted file mode 100644 index bac844658ee..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/queryHandlerFactory.spec.js +++ /dev/null @@ -1,129 +0,0 @@ -const cbor = require('cbor'); - -const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); -const queryHandlerFactory = require('../../../../lib/abci/handlers/queryHandlerFactory'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); -const InvalidArgumentAbciError = require('../../../../lib/abci/errors/InvalidArgumentAbciError'); - -describe('queryHandlerFactory', () => { - let queryHandler; - let queryHandlerRouterMock; - let sanitizeUrlMock; - let request; - let routeMock; - let loggerMock; - let createContextLoggerMock; - - beforeEach(function beforeEach() { - request = { - path: '/identity', - data: cbor.encode(Buffer.from('data')), - }; - - loggerMock = new LoggerMock(this.sinon); - - sanitizeUrlMock = this.sinon.stub(); - - routeMock = { - handler: this.sinon.stub(), - params: 'params', - }; - - queryHandlerRouterMock = { - find: this.sinon.stub().returns(routeMock), - }; - - createContextLoggerMock = this.sinon.stub(); - - queryHandler = queryHandlerFactory( - queryHandlerRouterMock, - sanitizeUrlMock, - loggerMock, - createContextLoggerMock, - ); - }); - - it('should throw InvalidArgumentAbciError if route was not found', async () => { - const sanitizedUrl = 'sanitizedUrl'; - - sanitizeUrlMock.returns(sanitizedUrl); - queryHandlerRouterMock.find.returns(false); - - try { - await queryHandler(request); - - expect.fail('should throw InvalidArgumentAbciError'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentAbciError); - expect(e.getCode()).to.equal(GrpcErrorCodes.INVALID_ARGUMENT); - - expect(sanitizeUrlMock).to.be.calledOnceWith(request.path); - expect(queryHandlerRouterMock.find).to.be.calledOnceWith('GET', sanitizedUrl); - expect(routeMock.handler).to.be.not.called(); - } - }); - - it('should throw InvalidArgumentAbciError if fail to decode request data', async () => { - const sanitizedUrl = 'sanitizedUrl'; - - sanitizeUrlMock.returns(sanitizedUrl); - - request.data = Buffer.from('bb'); - - try { - await queryHandler(request); - - expect.fail('should throw InvalidArgumentAbciError'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentAbciError); - expect(e.getCode()).to.equal(GrpcErrorCodes.INVALID_ARGUMENT); - - expect(sanitizeUrlMock).to.be.calledOnceWith(request.path); - expect(queryHandlerRouterMock.find).to.be.calledOnceWith('GET', sanitizedUrl); - expect(routeMock.handler).to.be.not.called(); - } - }); - - it('should throw InvalidArgumentAbciError on invalid request data', async () => { - const sanitizedUrl = 'sanitizedUrl'; - - sanitizeUrlMock.returns(sanitizedUrl); - - request.data = cbor.encode(null); - - try { - await queryHandler(request); - - expect.fail('should throw InvalidArgumentAbciError'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentAbciError); - expect(e.getCode()).to.equal(GrpcErrorCodes.INVALID_ARGUMENT); - - expect(sanitizeUrlMock).to.be.calledOnceWith(request.path); - expect(queryHandlerRouterMock.find).to.be.calledOnceWith('GET', sanitizedUrl); - expect(routeMock.handler).to.be.not.called(); - } - }); - - it('should call route handler without data'); - - it('should call route handler and return response', async () => { - const data = 'some data'; - const encodedData = cbor.decode(Buffer.from(request.data)); - const sanitizedUrl = 'sanitizedUrl'; - - sanitizeUrlMock.returns(sanitizedUrl); - routeMock.handler.resolves(data); - queryHandlerRouterMock.find.returns(routeMock); - - const result = await queryHandler(request); - - expect(sanitizeUrlMock).to.be.calledOnceWith(request.path); - expect(queryHandlerRouterMock.find).to.be.calledOnceWith('GET', sanitizedUrl); - expect(routeMock.handler).to.be.calledOnceWith(routeMock.params, encodedData, request); - expect(result).to.equal(data); - expect(createContextLoggerMock).to.be.calledOnceWithExactly(loggerMock, { - abciMethod: 'query', - }); - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/stateTransition/unserializeStateTransitionFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/stateTransition/unserializeStateTransitionFactory.spec.js deleted file mode 100644 index d582ded796f..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/stateTransition/unserializeStateTransitionFactory.spec.js +++ /dev/null @@ -1,204 +0,0 @@ -const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); - -const InvalidStateTransitionTypeError = require('@dashevo/dpp/lib/errors/consensus/basic/stateTransition/InvalidStateTransitionTypeError'); -const InvalidStateTransitionError = require('@dashevo/dpp/lib/stateTransition/errors/InvalidStateTransitionError'); -const BalanceNotEnoughError = require('@dashevo/dpp/lib/errors/consensus/fee/BalanceIsNotEnoughError'); -const ValidatorResult = require('@dashevo/dpp/lib/validation/ValidationResult'); - -const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); -const IdentityNotFoundError = require('@dashevo/dpp/lib/errors/consensus/signature/IdentityNotFoundError'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const unserializeStateTransitionFactory = require('../../../../../lib/abci/handlers/stateTransition/unserializeStateTransitionFactory'); -const LoggerMock = require('../../../../../lib/test/mock/LoggerMock'); -const DPPValidationAbciError = require('../../../../../lib/abci/errors/DPPValidationAbciError'); -const InvalidArgumentAbciError = require('../../../../../lib/abci/errors/InvalidArgumentAbciError'); - -describe('unserializeStateTransitionFactory', () => { - let unserializeStateTransition; - let stateTransitionFixture; - let dppMock; - let noopLoggerMock; - let stateTransition; - - beforeEach(function beforeEach() { - stateTransition = getIdentityCreateTransitionFixture(); - stateTransitionFixture = stateTransition.toBuffer(); - - dppMock = { - dispose: this.sinon.stub(), - stateTransition: { - createFromBuffer: this.sinon.stub(), - validateFee: this.sinon.stub(), - validateSignature: this.sinon.stub(), - validateState: this.sinon.stub(), - apply: this.sinon.stub(), - }, - }; - - dppMock.stateTransition.validateSignature.resolves(new ValidatorResult()); - - noopLoggerMock = new LoggerMock(this.sinon); - - unserializeStateTransition = unserializeStateTransitionFactory(dppMock, noopLoggerMock); - }); - - it('should throw InvalidArgumentAbciError if State Transition is not specified', async () => { - try { - await unserializeStateTransition(); - - expect.fail('should throw InvalidArgumentAbciError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentAbciError); - expect(e.getMessage()).to.equal('State Transition is not specified'); - expect(e.getCode()).to.equal(GrpcErrorCodes.INVALID_ARGUMENT); - - expect(dppMock.stateTransition.validateFee).to.not.be.called(); - } - }); - - it('should throw InvalidArgumentAbciError if State Transition is invalid', async () => { - const dppError = new InvalidStateTransitionTypeError(-1); - const error = new InvalidStateTransitionError( - [dppError], - stateTransitionFixture, - ); - - dppMock.stateTransition.createFromBuffer.throws(error); - - try { - await unserializeStateTransition(stateTransitionFixture); - - expect.fail('should throw InvalidArgumentAbciError error'); - } catch (e) { - expect(e).to.be.instanceOf(DPPValidationAbciError); - expect(e.getCode()).to.equal(dppError.getCode()); - expect(e.getData()).to.deep.equal({ - arguments: [-1], - }); - - expect(dppMock.stateTransition.createFromBuffer).to.be.calledOnce(); - expect(dppMock.stateTransition.validateFee).to.not.be.called(); - } - }); - - it('should throw the error from createFromBuffer if throws not InvalidStateTransitionError', async () => { - const error = new Error('Custom error'); - dppMock.stateTransition.createFromBuffer.throws(error); - - try { - await unserializeStateTransition(stateTransitionFixture); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.equal(error); - - expect(dppMock.stateTransition.createFromBuffer).to.be.calledOnce(); - expect(dppMock.stateTransition.validateFee).to.not.be.called(); - } - }); - - it('should throw InsufficientFundsError in case if identity has not enough credits', async () => { - const balance = 1000; - const fee = 1; - const error = new BalanceNotEnoughError(balance, fee); - - dppMock.stateTransition.validateFee.resolves( - new ValidatorResult([error]), - ); - - dppMock.stateTransition.createFromBuffer.resolves(stateTransition); - - try { - await unserializeStateTransition(stateTransitionFixture); - - expect.fail('should throw an InsufficientFundsError'); - } catch (e) { - expect(e).to.be.instanceOf(DPPValidationAbciError); - expect(e.getCode()).to.equal(error.getCode()); - expect(e.getData()).to.deep.equal({ - arguments: [balance, fee], - }); - - expect(dppMock.stateTransition.createFromBuffer).to.be.calledOnce(); - expect(dppMock.stateTransition.validateFee).to.be.calledOnce(); - } - }); - - it('should return invalid result if validateSignature failed', async () => { - const identity = getIdentityFixture(); - const error = new IdentityNotFoundError(identity.getId()); - - dppMock.stateTransition.validateSignature.resolves( - new ValidatorResult([error]), - ); - - try { - await unserializeStateTransition(stateTransitionFixture); - - expect.fail('should throw an InsufficientFundsError'); - } catch (e) { - expect(e).to.be.instanceOf(DPPValidationAbciError); - expect(e.getCode()).to.equal(error.getCode()); - expect(e.getData()).to.deep.equal({ - arguments: [identity.getId()], - }); - - expect(dppMock.stateTransition.createFromBuffer).to.be.calledOnce(); - expect(dppMock.stateTransition.validateFee).to.have.not.been.called(); - } - }); - - it('should return stateTransition', async () => { - dppMock.stateTransition.createFromBuffer.resolves(stateTransition); - - dppMock.stateTransition.validateFee.resolves(new ValidatorResult()); - - const result = await unserializeStateTransition(stateTransitionFixture); - - expect(result).to.deep.equal(stateTransition); - - // TODO: Enable fee validation when RS Drive is ready - // expect(dppMock.stateTransition.validateFee).to.be.calledOnceWith(stateTransition); - // expect(dppMock.stateTransition.validateState).to.be.calledOnceWithExactly(stateTransition); - // expect(dppMock.stateTransition.apply).to.be.calledOnceWithExactly(stateTransition); - }); - - it('should use provided logger', async function it() { - const loggerMock = new LoggerMock(this.sinon); - - const balance = 1000; - const fee = 1000; - const error = new BalanceNotEnoughError(balance, fee); - - dppMock.stateTransition.createFromBuffer.resolves(stateTransition); - - dppMock.stateTransition.validateFee.resolves( - new ValidatorResult([error]), - ); - - try { - await unserializeStateTransition(stateTransitionFixture, { logger: loggerMock }); - - expect.fail('should throw an InsufficientFundsError'); - } catch (e) { - expect(e).to.be.instanceOf(DPPValidationAbciError); - expect(e.getCode()).to.equal(error.getCode()); - expect(e.getData()).to.deep.equal({ - arguments: [balance, fee], - }); - - expect(dppMock.stateTransition.createFromBuffer).to.be.calledOnce(); - expect(dppMock.stateTransition.validateFee).to.be.calledOnce(); - - expect(noopLoggerMock.info).to.not.have.been.called(); - expect(noopLoggerMock.debug).to.not.have.been.called(); - - expect(loggerMock.info).to.have.been.calledOnceWithExactly( - 'Insufficient funds to process state transition', - ); - expect(loggerMock.debug).to.have.been.calledOnceWithExactly({ - consensusError: error, - }); - } - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/validator/createValidatorSetUpdate.spec.js b/packages/js-drive/test/unit/abci/handlers/validator/createValidatorSetUpdate.spec.js deleted file mode 100644 index 30c170d277f..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/validator/createValidatorSetUpdate.spec.js +++ /dev/null @@ -1,57 +0,0 @@ -const { - tendermint: { - abci: { - ValidatorSetUpdate, - }, - }, -} = require('@dashevo/abci/types'); -const { expect } = require('chai'); - -const createValidatorSetUpdate = require('../../../../../lib/abci/handlers/validator/createValidatorSetUpdate'); -const ValidatorNetworkInfo = require('../../../../../lib/validator/ValidatorNetworkInfo'); - -describe('createValidatorSetUpdate', () => { - let validatorSetMock; - let validatorMock; - let quorumHash; - let quorumPublicKey; - - beforeEach(function beforeEach() { - validatorMock = { - getPublicKeyShare: this.sinon.stub(), - getVotingPower: this.sinon.stub(), - getProTxHash: this.sinon.stub(), - getNetworkInfo: this.sinon.stub(), - }; - - validatorMock.getVotingPower.returns(Buffer.alloc(2, 32)); - validatorMock.getProTxHash.returns(Buffer.alloc(3, 32)); - validatorMock.getNetworkInfo.returns(new ValidatorNetworkInfo('192.168.65.2', 26656)); - - validatorSetMock = { - getValidators: this.sinon.stub(), - getQuorum: this.sinon.stub(), - }; - - quorumHash = Buffer.alloc(1, 32).toString('hex'); - quorumPublicKey = 'a7e75af9dd4d868a41ad2f5a5b021d653e31084261724fb40ae2f1b1c31c778d3b9464502d599cf6720723ec5c68b59d'; - - validatorMock.getPublicKeyShare.returns( - Buffer.from(quorumPublicKey, 'hex'), - ); - - validatorSetMock.getValidators.returns([validatorMock]); - validatorSetMock.getQuorum.returns({ - quorumHash, - quorumPublicKey, - }); - }); - - it('should create ValidatorSetUpdate object from specified ValidatorSet instance', () => { - const result = createValidatorSetUpdate(validatorSetMock); - - expect(result).to.be.an.instanceOf(ValidatorSetUpdate); - - // TODO: check something else? - }); -}); diff --git a/packages/js-drive/test/unit/abci/handlers/verifyVoteExtensionHandlerFactory.spec.js b/packages/js-drive/test/unit/abci/handlers/verifyVoteExtensionHandlerFactory.spec.js deleted file mode 100644 index ab558ad9639..00000000000 --- a/packages/js-drive/test/unit/abci/handlers/verifyVoteExtensionHandlerFactory.spec.js +++ /dev/null @@ -1,98 +0,0 @@ -const { - tendermint: { - abci: { - ResponseVerifyVoteExtension, - }, - types: { - VoteExtensionType, - }, - }, -} = require('@dashevo/abci/types'); -const verifyVoteExtensionHandlerFactory = require('../../../../lib/abci/handlers/verifyVoteExtensionHandlerFactory'); -const BlockExecutionContextMock = require('../../../../lib/test/mock/BlockExecutionContextMock'); -const LoggerMock = require('../../../../lib/test/mock/LoggerMock'); - -describe('verifyVoteExtensionHandlerFactory', () => { - let verifyVoteExtensionHandler; - let proposalBlockExecutionContextMock; - let unsignedWithdrawalTransactionsMapMock; - - beforeEach(function beforeEach() { - proposalBlockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - const loggerMock = new LoggerMock(this.sinon); - proposalBlockExecutionContextMock.getContextLogger.returns(loggerMock); - - unsignedWithdrawalTransactionsMapMock = {}; - proposalBlockExecutionContextMock.getWithdrawalTransactionsMap.returns( - unsignedWithdrawalTransactionsMapMock, - ); - - verifyVoteExtensionHandler = verifyVoteExtensionHandlerFactory( - proposalBlockExecutionContextMock, - ); - }); - - it('should return ResponseVerifyVoteExtension with REJECT status if vote extensions length not match', async () => { - const voteExtensions = [ - { type: VoteExtensionType.THRESHOLD_RECOVER, extension: Buffer.alloc(32, 1) }, - { type: VoteExtensionType.THRESHOLD_RECOVER, extension: Buffer.alloc(32, 2) }, - { type: VoteExtensionType.THRESHOLD_RECOVER, extension: Buffer.alloc(32, 3) }, - ]; - - const unsignedWithdrawalTransactionsMap = { - [Buffer.alloc(32, 1).toString('hex')]: undefined, - [Buffer.alloc(32, 2).toString('hex')]: undefined, - }; - - proposalBlockExecutionContextMock.getWithdrawalTransactionsMap.returns( - unsignedWithdrawalTransactionsMap, - ); - - const result = await verifyVoteExtensionHandler({ voteExtensions }); - - expect(result).to.be.an.instanceOf(ResponseVerifyVoteExtension); - expect(result.status).to.equal(2); - }); - - it('should return ResponseVerifyVoteExtension with REJECT status if vote extension is missing', async () => { - const voteExtensions = [ - { type: VoteExtensionType.THRESHOLD_RECOVER, extension: Buffer.alloc(32, 1) }, - ]; - - const unsignedWithdrawalTransactionsMap = { - [Buffer.alloc(32, 1).toString('hex')]: undefined, - [Buffer.alloc(32, 2).toString('hex')]: undefined, - }; - - proposalBlockExecutionContextMock.getWithdrawalTransactionsMap.returns( - unsignedWithdrawalTransactionsMap, - ); - - const result = await verifyVoteExtensionHandler({ voteExtensions }); - - expect(result).to.be.an.instanceOf(ResponseVerifyVoteExtension); - expect(result.status).to.equal(2); - }); - - it('should return ACCEPT if everything is fine', async () => { - const voteExtensions = [ - { type: VoteExtensionType.THRESHOLD_RECOVER, extension: Buffer.alloc(32, 1) }, - { type: VoteExtensionType.THRESHOLD_RECOVER, extension: Buffer.alloc(32, 2) }, - ]; - - const unsignedWithdrawalTransactionsMap = { - [Buffer.alloc(32, 1).toString('hex')]: undefined, - [Buffer.alloc(32, 2).toString('hex')]: undefined, - }; - - proposalBlockExecutionContextMock.getWithdrawalTransactionsMap.returns( - unsignedWithdrawalTransactionsMap, - ); - - const result = await verifyVoteExtensionHandler({ voteExtensions }); - - expect(result).to.be.an.instanceOf(ResponseVerifyVoteExtension); - expect(result.status).to.equal(1); - }); -}); diff --git a/packages/js-drive/test/unit/blockExecution/BlockExecutionContext.spec.js b/packages/js-drive/test/unit/blockExecution/BlockExecutionContext.spec.js deleted file mode 100644 index 96bb1b8fd34..00000000000 --- a/packages/js-drive/test/unit/blockExecution/BlockExecutionContext.spec.js +++ /dev/null @@ -1,427 +0,0 @@ -const { - tendermint: { - abci: { - CommitInfo, - }, - version: { - Consensus, - }, - }, -} = require('@dashevo/abci/types'); - -const Long = require('long'); - -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const BlockExecutionContext = require('../../../lib/blockExecution/BlockExecutionContext'); -const getBlockExecutionContextObjectFixture = require('../../../lib/test/fixtures/getBlockExecutionContextObjectFixture'); - -describe('BlockExecutionContext', () => { - let blockExecutionContext; - let dataContract; - let lastCommitInfo; - let logger; - let plainObject; - let height; - let coreChainLockedHeight; - let version; - let epochInfo; - let timeMs; - let prepareProposalResult; - let proposedAppVersion; - - beforeEach(() => { - blockExecutionContext = new BlockExecutionContext(); - dataContract = getDataContractFixture(); - delete dataContract.entropy; - - plainObject = getBlockExecutionContextObjectFixture(dataContract); - - lastCommitInfo = CommitInfo.fromObject(plainObject.lastCommitInfo); - - logger = plainObject.contextLogger; - height = Long.fromNumber(plainObject.height); - proposedAppVersion = Long.fromNumber(plainObject.proposedAppVersion); - coreChainLockedHeight = plainObject.coreChainLockedHeight; - version = Consensus.fromObject(plainObject.version); - epochInfo = plainObject.epochInfo; - timeMs = plainObject.timeMs; - prepareProposalResult = plainObject.prepareProposalResult; - }); - - describe('#addDataContract', () => { - it('should add a Data Contract', async () => { - expect(blockExecutionContext.getDataContracts()).to.have.lengthOf(0); - - blockExecutionContext.addDataContract(dataContract); - const contracts = blockExecutionContext.getDataContracts(); - - expect(contracts).to.have.lengthOf(1); - expect(contracts[0]).to.deep.equal(dataContract); - }); - }); - - describe('#hasDataContract', () => { - it('should respond with false if data contract with specified ID is not present', async () => { - const result = blockExecutionContext.hasDataContract(dataContract.getId()); - - expect(result).to.be.false(); - }); - - it('should respond with true if data contract with specified ID is present', async () => { - blockExecutionContext.addDataContract(dataContract); - - const result = blockExecutionContext.hasDataContract(dataContract.getId()); - - expect(result).to.be.true(); - }); - }); - - describe('#getDataContracts', () => { - it('should get data contracts', async () => { - blockExecutionContext.addDataContract(dataContract); - blockExecutionContext.addDataContract(dataContract); - - const contracts = blockExecutionContext.getDataContracts(); - - expect(contracts).to.have.lengthOf(2); - expect(contracts[0]).to.deep.equal(dataContract); - expect(contracts[1]).to.deep.equal(dataContract); - }); - }); - - describe('#reset', () => { - it('should reset state', () => { - blockExecutionContext.addDataContract(dataContract); - - expect(blockExecutionContext.getDataContracts()).to.have.lengthOf(1); - - blockExecutionContext.reset(); - - expect(blockExecutionContext.getDataContracts()).to.have.lengthOf(0); - - expect(blockExecutionContext.getHeight()).to.be.null(); - expect(blockExecutionContext.getCoreChainLockedHeight()).to.be.null(); - expect(blockExecutionContext.getVersion()).to.be.null(); - expect(blockExecutionContext.getTimeMs()).to.be.null(); - expect(blockExecutionContext.getLastCommitInfo()).to.be.null(); - expect(blockExecutionContext.getProposedAppVersion()).to.be.null(); - expect(blockExecutionContext.getWithdrawalTransactionsMap()).to.deep.equal({}); - }); - }); - - describe('#setCoreChainLockedHeight', () => { - it('should set coreChainLockedHeight', async () => { - const result = blockExecutionContext.setCoreChainLockedHeight(coreChainLockedHeight); - - expect(result).to.equal(blockExecutionContext); - - expect(blockExecutionContext.coreChainLockedHeight).to.deep.equal(coreChainLockedHeight); - }); - }); - - describe('#getCoreChainLockedHeight', () => { - it('should get coreChainLockedHeight', async () => { - blockExecutionContext.coreChainLockedHeight = coreChainLockedHeight; - - expect(blockExecutionContext.getCoreChainLockedHeight()).to.deep.equal(coreChainLockedHeight); - }); - }); - - describe('#setHeight', () => { - it('should set height', async () => { - const result = blockExecutionContext.setHeight(height); - - expect(result).to.equal(blockExecutionContext); - - expect(blockExecutionContext.height).to.deep.equal(height); - }); - }); - - describe('#getHeight', () => { - it('should get height', async () => { - blockExecutionContext.height = height; - - expect(blockExecutionContext.getHeight()).to.deep.equal(height); - }); - }); - - describe('#setProposedAppVersion', () => { - it('should set proposed app version', async () => { - const result = blockExecutionContext.setProposedAppVersion(proposedAppVersion); - - expect(result).to.equal(blockExecutionContext); - - expect(blockExecutionContext.proposedAppVersion).to.deep.equal(proposedAppVersion); - }); - }); - - describe('#getProposedAppVersion', () => { - it('should get proposed app version', async () => { - blockExecutionContext.proposedAppVersion = proposedAppVersion; - - expect(blockExecutionContext.getProposedAppVersion()).to.deep.equal(proposedAppVersion); - }); - }); - - describe('#setVersion', () => { - it('should set version', async () => { - const result = blockExecutionContext.setVersion(version); - - expect(result).to.equal(blockExecutionContext); - - expect(blockExecutionContext.version).to.deep.equal(version); - }); - }); - - describe('#getVersion', () => { - it('should get version', async () => { - blockExecutionContext.version = version; - - expect(blockExecutionContext.getVersion()).to.deep.equal(version); - }); - }); - - describe('#setLastCommitInfo', () => { - it('should set lastCommitInfo', async () => { - const result = blockExecutionContext.setLastCommitInfo(lastCommitInfo); - - expect(result).to.equal(blockExecutionContext); - - expect(blockExecutionContext.lastCommitInfo).to.deep.equal(lastCommitInfo); - }); - }); - - describe('#getLastCommitInfo', () => { - it('should get lastCommitInfo', async () => { - blockExecutionContext.lastCommitInfo = lastCommitInfo; - - expect(blockExecutionContext.getLastCommitInfo()).to.deep.equal(lastCommitInfo); - }); - }); - - describe('#setWithdrawalTransactionsMap', () => { - it('should set withdrawalTransactionsMap', async () => { - const result = blockExecutionContext.setWithdrawalTransactionsMap( - plainObject.withdrawalTransactionsMap, - ); - - expect(result).to.equal(blockExecutionContext); - - expect(blockExecutionContext.withdrawalTransactionsMap).to.deep.equal( - plainObject.withdrawalTransactionsMap, - ); - }); - }); - - describe('#getWithdrawalTransactionsMap', () => { - it('should get withdrawalTransactionsMap', async () => { - blockExecutionContext.withdrawalTransactionsMap = plainObject.withdrawalTransactionsMap; - - expect(blockExecutionContext.getWithdrawalTransactionsMap()).to.deep.equal( - plainObject.withdrawalTransactionsMap, - ); - }); - }); - - describe('#setRound', () => { - it('should set round', async () => { - const result = blockExecutionContext.setRound( - plainObject.round, - ); - - expect(result).to.equal(blockExecutionContext); - - expect(blockExecutionContext.round).to.deep.equal( - plainObject.round, - ); - }); - }); - - describe('#getRound', () => { - it('should get round', async () => { - blockExecutionContext.round = plainObject.round; - - expect(blockExecutionContext.getRound()).to.deep.equal( - plainObject.round, - ); - }); - }); - - describe('#setPrepareProposalResult', () => { - it('should set PrepareProposal result', async () => { - const result = blockExecutionContext.setPrepareProposalResult( - plainObject.prepareProposalResult, - ); - - expect(result).to.equal(blockExecutionContext); - - expect(blockExecutionContext.prepareProposalResult).to.deep.equal( - plainObject.prepareProposalResult, - ); - }); - }); - - describe('#getPrepareProposalResult', () => { - it('should get PrepareProposal result', async () => { - blockExecutionContext.prepareProposalResult = plainObject.prepareProposalResult; - - expect(blockExecutionContext.getPrepareProposalResult()).to.deep.equal( - plainObject.prepareProposalResult, - ); - }); - }); - - describe('#setTimeMs', () => { - it('should set time', async () => { - blockExecutionContext.setTimeMs(timeMs); - - expect(blockExecutionContext.timeMs).to.deep.equal(timeMs); - }); - }); - - describe('#getTimeMs', () => { - it('should get time', async () => { - blockExecutionContext.timeMs = timeMs; - - expect(blockExecutionContext.getTimeMs()).to.deep.equal(timeMs); - }); - }); - - describe('#setEpochInfo', () => { - it('should set epoch info'); - }); - - describe('#getEpochInfo', () => { - it('should return epoch info'); - }); - - describe('#populate', () => { - it('should populate instance from another instance', () => { - const anotherBlockExecutionContext = new BlockExecutionContext(); - - anotherBlockExecutionContext.dataContracts = [dataContract]; - anotherBlockExecutionContext.lastCommitInfo = lastCommitInfo; - anotherBlockExecutionContext.height = height; - anotherBlockExecutionContext.version = version; - anotherBlockExecutionContext.coreChainLockedHeight = coreChainLockedHeight; - anotherBlockExecutionContext.contextLogger = logger; - anotherBlockExecutionContext.withdrawalTransactionsMap = plainObject - .withdrawalTransactionsMap; - anotherBlockExecutionContext.epochInfo = epochInfo; - anotherBlockExecutionContext.timeMs = timeMs; - - blockExecutionContext.populate(anotherBlockExecutionContext); - - expect(blockExecutionContext.dataContracts).to.equal( - anotherBlockExecutionContext.dataContracts, - ); - expect(blockExecutionContext.lastCommitInfo).to.equal( - anotherBlockExecutionContext.lastCommitInfo, - ); - expect(blockExecutionContext.height).to.equal( - anotherBlockExecutionContext.height, - ); - expect(blockExecutionContext.version).to.equal( - anotherBlockExecutionContext.version, - ); - expect(blockExecutionContext.coreChainLockedHeight).to.equal( - anotherBlockExecutionContext.coreChainLockedHeight, - ); - expect(blockExecutionContext.contextLogger).to.equal( - anotherBlockExecutionContext.contextLogger, - ); - expect(blockExecutionContext.withdrawalTransactionsMap).to.equal( - anotherBlockExecutionContext.withdrawalTransactionsMap, - ); - expect(blockExecutionContext.epochInfo).to.equal( - anotherBlockExecutionContext.epochInfo, - ); - expect(blockExecutionContext.timeMs).to.equal( - anotherBlockExecutionContext.timeMs, - ); - }); - }); - - describe('#toObject', () => { - it('should return a plain object', () => { - blockExecutionContext.dataContracts = [dataContract]; - blockExecutionContext.lastCommitInfo = lastCommitInfo; - blockExecutionContext.height = height; - blockExecutionContext.coreChainLockedHeight = coreChainLockedHeight; - blockExecutionContext.version = version; - blockExecutionContext.contextLogger = logger; - blockExecutionContext.epochInfo = epochInfo; - blockExecutionContext.timeMs = timeMs; - blockExecutionContext.withdrawalTransactionsMap = plainObject.withdrawalTransactionsMap; - blockExecutionContext.round = plainObject.round; - blockExecutionContext.prepareProposalResult = plainObject.prepareProposalResult; - blockExecutionContext.proposedAppVersion = proposedAppVersion; - - expect(blockExecutionContext.toObject()).to.deep.equal(plainObject); - }); - - it('should skipContextLogger if the option passed', () => { - blockExecutionContext.dataContracts = [dataContract]; - blockExecutionContext.lastCommitInfo = lastCommitInfo; - blockExecutionContext.height = height; - blockExecutionContext.coreChainLockedHeight = coreChainLockedHeight; - blockExecutionContext.version = version; - blockExecutionContext.contextLogger = logger; - blockExecutionContext.withdrawalTransactionsMap = plainObject.withdrawalTransactionsMap; - blockExecutionContext.round = plainObject.round; - blockExecutionContext.epochInfo = epochInfo; - blockExecutionContext.timeMs = timeMs; - blockExecutionContext.prepareProposalResult = prepareProposalResult; - blockExecutionContext.proposedAppVersion = proposedAppVersion; - - const result = blockExecutionContext.toObject({ skipContextLogger: true }); - - delete plainObject.contextLogger; - - expect(result).to.deep.equal(plainObject); - }); - - it('should skipPrepareProposalResult if the option passed', () => { - blockExecutionContext.dataContracts = [dataContract]; - blockExecutionContext.lastCommitInfo = lastCommitInfo; - blockExecutionContext.height = height; - blockExecutionContext.coreChainLockedHeight = coreChainLockedHeight; - blockExecutionContext.version = version; - blockExecutionContext.contextLogger = logger; - blockExecutionContext.withdrawalTransactionsMap = plainObject.withdrawalTransactionsMap; - blockExecutionContext.round = plainObject.round; - blockExecutionContext.epochInfo = epochInfo; - blockExecutionContext.timeMs = timeMs; - blockExecutionContext.proposedAppVersion = proposedAppVersion; - - const result = blockExecutionContext.toObject({ skipPrepareProposalResult: true }); - - delete plainObject.prepareProposalResult; - - expect(result).to.deep.equal(plainObject); - }); - }); - - describe('#fromObject', () => { - it('should populate instance from a plain object', () => { - blockExecutionContext.fromObject(plainObject); - - if (blockExecutionContext.dataContracts[0].$defs === undefined) { - blockExecutionContext.dataContracts[0].$defs = {}; - } - - expect(blockExecutionContext.dataContracts).to.have.deep.members( - [dataContract], - ); - expect(blockExecutionContext.lastCommitInfo).to.deep.equal(lastCommitInfo); - expect(blockExecutionContext.height).to.deep.equal(height); - expect(blockExecutionContext.version).to.deep.equal(version); - expect(blockExecutionContext.coreChainLockedHeight).to.deep.equal(coreChainLockedHeight); - expect(blockExecutionContext.contextLogger).to.equal(logger); - expect(blockExecutionContext.withdrawalTransactionsMap).to.deep.equal( - plainObject.withdrawalTransactionsMap, - ); - expect(blockExecutionContext.timeMs).to.equal(timeMs); - }); - }); -}); diff --git a/packages/js-drive/test/unit/core/LatestCoreChainLock.spec.js b/packages/js-drive/test/unit/core/LatestCoreChainLock.spec.js deleted file mode 100644 index 2ab24a6db1e..00000000000 --- a/packages/js-drive/test/unit/core/LatestCoreChainLock.spec.js +++ /dev/null @@ -1,44 +0,0 @@ -const LatestCoreChainLock = require('../../../lib/core/LatestCoreChainLock'); - -describe('LatestCoreChainLock', () => { - describe('#constructor', () => { - it('should instantiate', () => { - const latestCoreChainLock = new LatestCoreChainLock(); - expect(latestCoreChainLock.chainLock).to.equal(undefined); - const latestCoreChainLockWithValue = new LatestCoreChainLock('someValue'); - expect(latestCoreChainLockWithValue.chainLock).to.equal('someValue'); - }); - }); - - describe('#update', () => { - it('should update', () => { - const latestCoreChainLock = new LatestCoreChainLock(); - latestCoreChainLock.update('someValue'); - expect(latestCoreChainLock.chainLock).to.equal('someValue'); - }); - - it('should emit updated chainLock', (done) => { - const chainLock = 'someValue'; - const latestCoreChainLock = new LatestCoreChainLock(); - - latestCoreChainLock.on(LatestCoreChainLock.EVENTS.update, (data) => { - expect(data).to.equal(chainLock); - - done(); - }); - - latestCoreChainLock.update(chainLock); - }); - }); - - describe('#getChainLock', () => { - it('should return chainLock', async () => { - const chainLock = 'someValue'; - - const latestCoreChainLock = new LatestCoreChainLock(); - latestCoreChainLock.update(chainLock); - - expect(latestCoreChainLock.getChainLock()).to.equal(chainLock); - }); - }); -}); diff --git a/packages/js-drive/test/unit/core/ensureBlock.spec.js b/packages/js-drive/test/unit/core/ensureBlock.spec.js deleted file mode 100644 index a9b86156f94..00000000000 --- a/packages/js-drive/test/unit/core/ensureBlock.spec.js +++ /dev/null @@ -1,66 +0,0 @@ -const chai = require('chai'); -const chaiAsPromised = require('chai-as-promised'); - -chai.use(chaiAsPromised); -chai.should(); - -const EventEmitter = require('events'); -const ZMQClient = require('../../../lib/core/ZmqClient'); -const ensureBlock = require('../../../lib/core/ensureBlock'); - -describe('ensureBlock', () => { - const hash = '00000'; - const otherHash = '00001'; - const socketClient = new EventEmitter(); - let rpcClient; - - beforeEach(function beforeEach() { - socketClient.subscribe = this.sinon.stub(); - - rpcClient = { - getBlock: this.sinon.stub().resolves(true), - }; - }); - - it('should ensure a block exist before returning promise', async () => { - await ensureBlock(socketClient, rpcClient, hash); - - expect(rpcClient.getBlock).to.be.calledOnceWithExactly(hash); - }); - - it('should wait for block if not found before returning promise', (done) => { - const err = new Error(); - err.code = -5; - err.message = 'Block not found'; - - rpcClient.getBlock.throws(err); - - ensureBlock(socketClient, rpcClient, hash).then(done); - - setImmediate(() => { - socketClient.emit(ZMQClient.TOPICS.hashblock, otherHash); - }); - - setImmediate(() => { - socketClient.emit(ZMQClient.TOPICS.hashblock, hash); - }); - - expect(rpcClient.getBlock).to.be.calledOnceWithExactly(hash); - }); - - it('should throw on unexpected error', async () => { - const err = new Error(); - err.code = -6; - err.message = 'Another error'; - - rpcClient.getBlock.throws(err); - - try { - await ensureBlock(socketClient, rpcClient, hash); - expect.fail('Internal error must be thrown'); - } catch (e) { - expect(e).to.equal(err); - expect(rpcClient.getBlock).to.be.calledOnceWithExactly(hash); - } - }); -}); diff --git a/packages/js-drive/test/unit/core/getRandomQuorumFactory.spec.js b/packages/js-drive/test/unit/core/getRandomQuorumFactory.spec.js deleted file mode 100644 index d75a5c2aea4..00000000000 --- a/packages/js-drive/test/unit/core/getRandomQuorumFactory.spec.js +++ /dev/null @@ -1,196 +0,0 @@ -const { expect } = require('chai'); -const getRandomQuorumFactory = require('../../../lib/core/getRandomQuorumFactory'); - -describe('getRandomQuorumFactory', () => { - let smlMock; - let quorumType; - let getRandomQuorum; - let coreRpcClientMock; - let randomQuorum; - let coreHeight; - - beforeEach(function beforeEach() { - smlMock = { - getQuorumsOfType: this.sinon.stub(), - getQuorum: this.sinon.stub(), - quorumList: [], - blockHash: '0'.repeat(32), - }; - - coreHeight = 690; - - quorumType = 102; - - smlMock.getQuorum.resolves(randomQuorum); - - smlMock.getQuorumsOfType.returns([ - { - quorumHash: '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c', - validMembersCount: 90, - }, - { - quorumHash: '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce', - getAllQuorumMembers: 90, - }, - ]); - - const quorumListExtended = { - llmq_test: [ - { - '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c': { - creationHeight: 672, - minedBlockHash: '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce', - }, - }, - { - '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce': { - creationHeight: 672, - minedBlockHash: '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c', - }, - }, - ], - llmq_test_instantsend: [ - { - '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c': { - creationHeight: 672, - minedBlockHash: '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce', - }, - }, - { - '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce': { - creationHeight: 672, - minedBlockHash: '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c', - }, - }, - ], - llmq_test_v17: [ - { - '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c': { - creationHeight: 672, - minedBlockHash: '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce', - }, - }, - { - '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce': { - creationHeight: 672, - minedBlockHash: '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c', - }, - }, - ], - }; - - coreRpcClientMock = { - quorum: this.sinon.stub().resolves({ result: quorumListExtended }), - }; - - getRandomQuorum = getRandomQuorumFactory(coreRpcClientMock); - }); - - it('should return random quorum based on entropy', async () => { - const result = await getRandomQuorum(smlMock, quorumType, Buffer.alloc(1), coreHeight); - - expect(smlMock.getQuorumsOfType).to.have.been.calledOnceWithExactly(quorumType); - expect(smlMock.getQuorum).to.have.been.calledOnceWithExactly( - quorumType, '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c', - ); - expect(result).to.equals(randomQuorum); - }); - - it('should throw an error if SML does not contain any quorums', async () => { - smlMock.getQuorumsOfType.returns([]); - - try { - await getRandomQuorum(smlMock, quorumType, Buffer.alloc(1), coreHeight); - - expect.fail('should throw an error'); - } catch (e) { - expect(e.message).to.be.equal(`SML at block ${'0'.repeat(32)} contains no quorums of any type`); - } - }); - - it('should throw an error if SML contains quorums that differ from the specified quorum type', async () => { - smlMock.getQuorumsOfType.returns([]); - smlMock.quorumList = [{ llmqType: 999 }]; - - try { - await getRandomQuorum(smlMock, quorumType, Buffer.alloc(1), coreHeight); - - expect.fail('should throw an error'); - } catch (e) { - expect(e.message).to.be.equal(`SML at block ${'0'.repeat(32)} contains no quorums of type ${quorumType}, but contains entries for types 999. Please check the Drive configuration`); - } - }); - - it('should filter quorums by minQuorumMembers', async () => { - smlMock.getQuorumsOfType.returns([ - { - quorumHash: '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce', - validMembersCount: 90, - }, - { - quorumHash: '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c', - validMembersCount: 89, - }, - ]); - - const result = await getRandomQuorum(smlMock, quorumType, Buffer.alloc(1), coreHeight); - - expect(smlMock.getQuorumsOfType).to.have.been.calledOnceWithExactly(quorumType); - expect(smlMock.getQuorum).to.have.been.calledOnceWithExactly( - quorumType, '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce', - ); - expect(result).to.equals(randomQuorum); - }); - - it('should filter quorums by ttl', async () => { - coreRpcClientMock.quorum.resolves({ - result: { - llmq_test_v17: [ - { - '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c': { - creationHeight: 100, - minedBlockHash: '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce', - }, - }, - { - '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce': { - creationHeight: 672, - minedBlockHash: '251fae1f7fe89d38c4ce71781685c96291cc3852e9586c8eb6d5a71b73d6285c', - }, - }, - ], - }, - }); - - const result = await getRandomQuorum(smlMock, quorumType, Buffer.alloc(1), coreHeight); - - expect(smlMock.getQuorumsOfType).to.have.been.calledOnceWithExactly(quorumType); - expect(smlMock.getQuorum).to.have.been.calledOnceWithExactly( - quorumType, '1af5ffbdb862a18b454106b6b99e30bb683fa5bab8278b19a6e91bf742405cce', - ); - - expect(coreRpcClientMock.quorum).to.be.calledOnceWithExactly('listextended', coreHeight); - expect(result).to.equals(randomQuorum); - }); - - it('should choose from all quorums if filtered list is empty', async () => { - smlMock.getQuorumsOfType.returns([ - { - quorumHash: Buffer.alloc(1, 64).toString('hex'), - validMembersCount: 10, - }, - { - quorumHash: Buffer.alloc(1, 32).toString('hex'), - validMembersCount: 10, - }, - ]); - - const result = await getRandomQuorum(smlMock, quorumType, Buffer.alloc(1), coreHeight); - - expect(smlMock.getQuorumsOfType).to.have.been.calledOnceWithExactly(quorumType); - expect(smlMock.getQuorum).to.have.been.calledOnceWithExactly( - quorumType, '20', - ); - expect(result).to.equals(randomQuorum); - }); -}); diff --git a/packages/js-drive/test/unit/core/updateSimplifiedMasternodeListFactory.spec.js b/packages/js-drive/test/unit/core/updateSimplifiedMasternodeListFactory.spec.js deleted file mode 100644 index b058e0743c2..00000000000 --- a/packages/js-drive/test/unit/core/updateSimplifiedMasternodeListFactory.spec.js +++ /dev/null @@ -1,195 +0,0 @@ -const SimplifiedMNListDiff = require('@dashevo/dashcore-lib/lib/deterministicmnlist/SimplifiedMNListDiff'); -const { expect } = require('chai'); -const updateSimplifiedMasternodeListFactory = require('../../../lib/core/updateSimplifiedMasternodeListFactory'); -const NotEnoughBlocksForValidSMLError = require('../../../lib/core/errors/NotEnoughBlocksForValidSMLError'); -const LoggerMock = require('../../../lib/test/mock/LoggerMock'); - -describe('updateSimplifiedMasternodeListFactory', () => { - let updateSimplifiedMasternodeList; - let coreRpcClientMock; - let network; - let smlMaxListsLimit; - let simplifiedMasternodeListMock; - let rawDiff; - let coreHeight; - - beforeEach(function beforeEach() { - network = 'regtest'; - - rawDiff = { - baseBlockHash: '644bd9dcbc0537026af6d31181570f934d868f121c55513009bb36f509ec816e', - blockHash: '23beac1b700c4a49855a9653e036219384ac2fab7eeba2ec45b3e2d0063d1285', - cbTxMerkleTree: '03000000032f7f142e19bee0c595dac9f900695d1e428a4db70a805fda6c834cfec0de506a0d39baea39dbbaf9827a1f3b8f381a65ebcf4c2ef415025bc4d20afd372e680d12c226f084a6e28e421fbedff22b13aa1191d6a80744d104fa75ede12332467d0107', - cbTx: '03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502e9030101ffffffff01a2567a76070000001976a914f713c2fa5ef0e7c48f0d1b3ad2a79150037c72d788ac00000000460200e90300003fdbe53b9a4cd0b62284195cbd4f4c1655ebdd70e9117ed3c0e49c37bfce46060000000000000000000000000000000000000000000000000000000000000000', - deletedMNs: [], - mnList: [ - { - proRegTxHash: 'e57402007ca10454d77437d9c1156b1c4ff8af86d699c08e9a31dbd1dfe3c991', - confirmedHash: '0000000000000000000000000000000000000000000000000000000000000000', - service: '127.0.0.1:20001', - pubKeyOperator: '906d84cb88f532145d8838414f777b971c976ffcf8ccfc57413a13cf2f8a7750a92f9b997a5a741f1afa34d989f4312b', - votingAddress: 'ydC3Qkhq6qc1qgHD8PVSHyAB6t3NYa7aw4', - nType: 0, - isValid: true, - }, - ], - deletedQuorums: [], - newQuorums: [], - merkleRootMNList: '0646cebf379ce4c0d37e11e970ddeb55164c4fbd5c198422b6d04c9a3be5db3f', - merkleRootQuorums: '0000000000000000000000000000000000000000000000000000000000000000', - }; - - coreHeight = 84202; - - coreRpcClientMock = { - protx: this.sinon.stub(), - }; - - coreRpcClientMock.protx.resolves({ - result: rawDiff, - }); - - simplifiedMasternodeListMock = { - applyDiffs: this.sinon.stub(), - reset: this.sinon.stub(), - }; - - smlMaxListsLimit = 2; - - const loggerMock = new LoggerMock(this.sinon); - - updateSimplifiedMasternodeList = updateSimplifiedMasternodeListFactory( - coreRpcClientMock, - simplifiedMasternodeListMock, - smlMaxListsLimit, - network, - loggerMock, - ); - }); - - it('should throw error if not enough blocks for valid SML', async () => { - try { - await updateSimplifiedMasternodeList(smlMaxListsLimit); - - expect.fail('should throw NotEnoughBlocksForValidSMLError'); - } catch (e) { - expect(e).to.be.instanceOf(NotEnoughBlocksForValidSMLError); - expect(e.getBlockHeight()).to.be.equal(smlMaxListsLimit); - } - }); - - it('should obtain 16 latest diffs according to core height on first call', async () => { - const isUpdated = await updateSimplifiedMasternodeList(coreHeight); - - expect(isUpdated).to.be.true(); - - const proTxCallCount = coreHeight - (coreHeight - smlMaxListsLimit) + 1; - - expect(coreRpcClientMock.protx.callCount).to.equal(proTxCallCount); - - expect(coreRpcClientMock.protx.getCall(0).args).to.have.deep.members( - [ - 'diff', - 1, - (coreHeight - smlMaxListsLimit), - true, - ], - ); - - for (let i = 1; i < proTxCallCount; i++) { - expect(coreRpcClientMock.protx.getCall(i).args).to.have.deep.members( - [ - 'diff', - (coreHeight - smlMaxListsLimit) + (i - 1), - (coreHeight - smlMaxListsLimit) + (i - 1) + 1, - true, - ], - ); - } - - const smlDiffs = []; - for (let i = 0; i < proTxCallCount; i++) { - smlDiffs.push(new SimplifiedMNListDiff(rawDiff, network)); - } - - const argsDiffBuffers = simplifiedMasternodeListMock.applyDiffs.getCall(0).args[0].map( - (item) => item.toBuffer(), - ); - - const smlDiffBuffers = smlDiffs.map((item) => item.toBuffer()); - - expect(argsDiffBuffers).to.deep.equal(smlDiffBuffers); - }); - - it('should update diffs since last call and up to passed core height', async () => { - let isUpdated = await updateSimplifiedMasternodeList(coreHeight); - - expect(isUpdated).to.be.true(); - - isUpdated = await updateSimplifiedMasternodeList(coreHeight + 1); - - expect(isUpdated).to.be.true(); - - const proTxCallCount = smlMaxListsLimit + 2; - - expect(coreRpcClientMock.protx.callCount).to.equal(proTxCallCount); - - expect(coreRpcClientMock.protx.getCall(0).args).to.have.deep.members( - [ - 'diff', - 1, - (coreHeight - smlMaxListsLimit), - true, - ], - ); - - for (let i = 1; i < proTxCallCount; i++) { - expect(coreRpcClientMock.protx.getCall(i).args).to.have.deep.members( - [ - 'diff', - (coreHeight - smlMaxListsLimit) + (i - 1), - (coreHeight - smlMaxListsLimit) + (i - 1) + 1, - true, - ], - ); - } - - const simplifiedMNListDiffArray = []; - - for (let i = 0; i < proTxCallCount - 1; i++) { - simplifiedMNListDiffArray.push(new SimplifiedMNListDiff(rawDiff, network)); - } - - const argsDiffsBuffers = simplifiedMasternodeListMock.applyDiffs.getCall(0).args[0].map( - (item) => item.toBuffer(), - ); - - const smlDiffBuffers = simplifiedMNListDiffArray.map((item) => item.toBuffer()); - - expect(argsDiffsBuffers).to.deep.equal(smlDiffBuffers); - }); - - it('should not update more than 16 diffs', async () => { - let isUpdated = await updateSimplifiedMasternodeList(coreHeight); // 3 - - expect(isUpdated).to.be.true(); - - isUpdated = await updateSimplifiedMasternodeList(coreHeight + 10); // 3 - - expect(isUpdated).to.be.true(); - - const proTxCallCount = 3 + 3; - - expect(coreRpcClientMock.protx.callCount).to.equal(proTxCallCount); - }); - - it('should return false if SML was not updated', async () => { - let isUpdated = await updateSimplifiedMasternodeList(coreHeight); - - expect(isUpdated).to.be.true(); - - isUpdated = await updateSimplifiedMasternodeList(coreHeight); - - expect(isUpdated).to.be.false(); - }); -}); diff --git a/packages/js-drive/test/unit/core/waitForChainLockedHeightFactory.spec.js b/packages/js-drive/test/unit/core/waitForChainLockedHeightFactory.spec.js deleted file mode 100644 index 6226680bf53..00000000000 --- a/packages/js-drive/test/unit/core/waitForChainLockedHeightFactory.spec.js +++ /dev/null @@ -1,63 +0,0 @@ -const EventEmitter = require('events'); -const waitForChainLockedHeightFactory = require('../../../lib/core/waitForChainLockedHeightFactory'); -const MissingChainlockError = require('../../../lib/core/errors/MissingChainLockError'); -const LatestCoreChainLock = require('../../../lib/core/LatestCoreChainLock'); - -describe('waitForChainLockedHeightFactory', () => { - let waitForChainLockedHeight; - let latestCoreChainLockMock; - let chainLock; - let coreHeight; - - beforeEach(function beforeEach() { - coreHeight = 84202; - - chainLock = { - height: coreHeight, - signature: '0a43f1c3e5b3e8dbd670bca8d437dc25572f72d8e1e9be673e9ebbb606570307c3e5f5d073f7beb209dd7e0b8f96c751060ab3a7fb69a71d5ccab697b8cfa5a91038a6fecf76b7a827d75d17f01496302942aa5e2c7f4a48246efc8d3941bf6c', - }; - - latestCoreChainLockMock = new EventEmitter(); - latestCoreChainLockMock.getChainLock = this.sinon.stub().returns(chainLock); - - waitForChainLockedHeight = waitForChainLockedHeightFactory( - latestCoreChainLockMock, - ); - }); - - it('should throw MissingChainlockError if chainlock is empty', async () => { - latestCoreChainLockMock.getChainLock.returns(null); - - try { - await waitForChainLockedHeight(coreHeight); - - expect.fail(); - } catch (e) { - expect(e).to.be.an.instanceOf(MissingChainlockError); - } - }); - - it('should resolve promise if existing chainlock on the same height or higher', async () => { - latestCoreChainLockMock.getChainLock.returns(chainLock); - - await waitForChainLockedHeight(coreHeight); - }); - - it('should resolve when chainLock height to be equal or higher', (done) => { - coreHeight = chainLock.height + 1; - - waitForChainLockedHeight(coreHeight) - .then(() => { - expect(latestCoreChainLockMock.getChainLock).to.have.been.calledOnce(); - - done(); - }); - - setImmediate(() => { - latestCoreChainLockMock.emit(LatestCoreChainLock.EVENTS.update, { - ...chainLock, - height: chainLock.height + 1, - }); - }); - }); -}); diff --git a/packages/js-drive/test/unit/core/waitForCoreChainLockSyncFactory.spec.js b/packages/js-drive/test/unit/core/waitForCoreChainLockSyncFactory.spec.js deleted file mode 100644 index d88d7801873..00000000000 --- a/packages/js-drive/test/unit/core/waitForCoreChainLockSyncFactory.spec.js +++ /dev/null @@ -1,86 +0,0 @@ -const EventEmitter = require('events'); -const LatestCoreChainLock = require('../../../lib/core/LatestCoreChainLock'); -const ZMQClient = require('../../../lib/core/ZmqClient'); -const waitForCoreChainLockSyncFactory = require('../../../lib/core/waitForCoreChainLockSyncFactory'); -const LoggerMock = require('../../../lib/test/mock/LoggerMock'); - -describe('waitForCoreChainLockSyncFactory', () => { - let waitForCoreChainLockHandler; - let coreRpcClientMock; - let coreZMQClientMock; - let latestCoreChainLock; - let chainLock; - let rawChainLockSigMessage; - - beforeEach(function beforeEach() { - chainLock = { - blockHash: '0000003df90e1cec3fea6bd17508f653cea093c536199e9d50a05bd69ee23b5d', - height: 3887, - signature: '1770e35c281ebfcf14b8a62071f76146eb0a5ede6fb43543a9c0ccddf3cf87fcdd0a96eea867595bb980dcea13e6283f16744631df895404434c7840f9b3d9c1069790a0459a0d35b7ae353519f5d437ded547f8d65f6c4916e988c842488e7a', - }; - - rawChainLockSigMessage = Buffer.from('00000020fd0ab0fc0fb0cbecb62cf7555aee6a8ce18564a9bbed8b22585d9f8563000000ee131c25019aaee0f1bdde2a5d6eb99ec0b4497e68776f18916951e8ddb6b922dd3be45f62f6011ed18800000103000500010000000000000000000000000000000000000000000000000000000000000000ffffffff05024c0f010bffffffff0200c817a8040000001976a91416b93a3b9168a20605cc3cda62f6135a3baa531a88ac00ac23fc060000001976a91416b93a3b9168a20605cc3cda62f6135a3baa531a88ac000000004602004c0f00003d8e273bf286d48ccba5a87b5adf332ed070a15e4e2d81eeb9ff685373be5656961e0b73ea855fdac9cc530782a7f0a22d25d1eaab4b2068efa647e9da0915d02f0f00005d3be29ed65ba0509d9e1936c593a0ce53f60875d16bea3fec1c0ef93d0000001770e35c281ebfcf14b8a62071f76146eb0a5ede6fb43543a9c0ccddf3cf87fcdd0a96eea867595bb980dcea13e6283f16744631df895404434c7840f9b3d9c1069790a0459a0d35b7ae353519f5d437ded547f8d65f6c4916e988c842488e7a', 'hex'); - - latestCoreChainLock = new LatestCoreChainLock(); - coreRpcClientMock = { - getBestChainLock: this.sinon.stub().resolves({ - result: chainLock, - error: null, - id: 5, - }), - getBlock: this.sinon.stub(), - }; - coreZMQClientMock = new EventEmitter(); - coreZMQClientMock.subscribe = this.sinon.stub(); - - const loggerMock = new LoggerMock(this.sinon); - - waitForCoreChainLockHandler = waitForCoreChainLockSyncFactory( - coreZMQClientMock, - coreRpcClientMock, - latestCoreChainLock, - loggerMock, - ); - }); - - it('should wait for chainlock to be synced', async () => { - expect(latestCoreChainLock.chainLock).to.equal(undefined); - - await waitForCoreChainLockHandler(); - - expect(latestCoreChainLock.chainLock.toJSON()).to.deep.equal(chainLock); - - expect(coreZMQClientMock.subscribe).to.be.calledTwice(); - expect(coreZMQClientMock.subscribe).to.be.calledWith(ZMQClient.TOPICS.rawchainlocksig); - expect(coreZMQClientMock.subscribe).to.be.calledWith(ZMQClient.TOPICS.hashblock); - expect(coreRpcClientMock.getBestChainLock).to.be.calledOnce(); - }); - - it('should handle when no chainlock is found via RPC', (done) => { - expect(latestCoreChainLock.chainLock).to.equal(undefined); - - const err = new Error(); - err.code = -32603; - err.message = 'Chainlock not found'; - - coreRpcClientMock.getBestChainLock.throws(err); - - waitForCoreChainLockHandler() - .then(() => { - expect(latestCoreChainLock.chainLock.toJSON()).to.deep.equal(chainLock); - - expect(coreZMQClientMock.subscribe).to.be.calledTwice(); - expect(coreZMQClientMock.subscribe).to.be.calledWith(ZMQClient.TOPICS.rawchainlocksig); - expect(coreZMQClientMock.subscribe).to.be.calledWith(ZMQClient.TOPICS.hashblock); - expect(coreRpcClientMock.getBestChainLock).to.be.calledOnce(); - done(); - }); - - setImmediate(() => { - coreZMQClientMock.emit( - ZMQClient.TOPICS.rawchainlocksig, - rawChainLockSigMessage, - ); - }); - }); -}); diff --git a/packages/js-drive/test/unit/dpp/CachedStateRepositoryDecorator.spec.js b/packages/js-drive/test/unit/dpp/CachedStateRepositoryDecorator.spec.js deleted file mode 100644 index 00f40a8ba79..00000000000 --- a/packages/js-drive/test/unit/dpp/CachedStateRepositoryDecorator.spec.js +++ /dev/null @@ -1,247 +0,0 @@ -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); - -const CachedStateRepositoryDecorator = require('../../../lib/dpp/CachedStateRepositoryDecorator'); - -describe('CachedStateRepositoryDecorator', () => { - let stateRepositoryMock; - let cachedStateRepository; - let id; - let identity; - let documents; - let dataContract; - - beforeEach(function beforeEach() { - id = 'id'; - identity = getIdentityFixture(); - documents = getDocumentsFixture(); - dataContract = getDataContractFixture(); - - stateRepositoryMock = createStateRepositoryMock(this.sinon); - - cachedStateRepository = new CachedStateRepositoryDecorator( - stateRepositoryMock, - ); - }); - - describe('#fetchIdentity', () => { - it('should fetch identity from state repository', async () => { - stateRepositoryMock.fetchIdentity.resolves(identity); - - const result = await cachedStateRepository.fetchIdentity(id); - - expect(result).to.deep.equal(identity); - expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWith(id); - }); - }); - - describe('#createIdentity', () => { - it('should store identity to repository', async () => { - await cachedStateRepository.createIdentity(identity); - - expect(stateRepositoryMock.createIdentity).to.be.calledOnceWith(identity); - }); - }); - - describe('#addKeysToIdentity', () => { - it('should store identity to repository', async () => { - await cachedStateRepository.addKeysToIdentity(identity.getId(), identity.getPublicKeys()); - - expect(stateRepositoryMock.addKeysToIdentity).to.be.calledOnceWith( - identity.getId(), - identity.getPublicKeys(), - ); - }); - }); - - describe('#fetchIdentityBalance', () => { - it('should store identity to repository', async () => { - await cachedStateRepository.fetchIdentityBalance(identity.getId()); - - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWith( - identity.getId(), - ); - }); - }); - - describe('#fetchIdentityBalanceWithDebt', () => { - it('should store identity to repository', async () => { - await cachedStateRepository.fetchIdentityBalanceWithDebt(identity.getId()); - - expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnceWith( - identity.getId(), - ); - }); - }); - - describe('#addToIdentityBalance', () => { - it('should store identity to repository', async () => { - await cachedStateRepository.addToIdentityBalance(identity.getId(), 100); - - expect(stateRepositoryMock.addToIdentityBalance).to.be.calledOnceWith( - identity.getId(), - 100, - ); - }); - }); - - describe('#disableIdentityKeys', () => { - it('should store identity to repository', async () => { - await cachedStateRepository.disableIdentityKeys(identity.getId(), [100], 100); - - expect(stateRepositoryMock.disableIdentityKeys).to.be.calledOnceWith( - identity.getId(), - [100], - 100, - ); - }); - }); - - describe('#updateIdentityRevision', () => { - it('should store identity to repository', async () => { - await cachedStateRepository.updateIdentityRevision(identity.getId(), 1); - - expect(stateRepositoryMock.updateIdentityRevision).to.be.calledOnceWith( - identity.getId(), - 1, - ); - }); - }); - - describe('#fetchDocuments', () => { - it('should fetch documents from state repository', async () => { - const contractId = 'contractId'; - const type = 'documentType'; - const options = {}; - - stateRepositoryMock.fetchDocuments.resolves(documents); - - const result = await cachedStateRepository.fetchDocuments(contractId, type, options); - - expect(result).to.equal(documents); - expect(stateRepositoryMock.fetchDocuments).to.be.calledOnceWith(contractId, type, options); - }); - }); - - describe('#createDocument', () => { - it('should create document in repository', async () => { - const [document] = documents; - - await cachedStateRepository.createDocument(document); - - expect(stateRepositoryMock.createDocument).to.be.calledOnceWith(document); - }); - }); - - describe('#updateDocument', () => { - it('should update document in repository', async () => { - const [document] = documents; - - await cachedStateRepository.updateDocument(document); - - expect(stateRepositoryMock.updateDocument).to.be.calledOnceWith(document); - }); - }); - - describe('#removeDocument', () => { - it('should delete document from repository', async () => { - const type = 'documentType'; - - await cachedStateRepository.removeDocument(dataContract, type, id); - - expect(stateRepositoryMock.removeDocument).to.be.calledOnceWith(dataContract, type, id); - }); - }); - - describe('fetchTransaction', () => { - it('should fetch transaction from state repository', async () => { - stateRepositoryMock.fetchTransaction.resolves(dataContract); - - const result = await cachedStateRepository.fetchTransaction(id); - - expect(result).to.equal(dataContract); - expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWith(id); - }); - }); - - describe('#fetchDataContract', () => { - it('should fetch data contract from state repository if it is not present in cache', async () => { - stateRepositoryMock.fetchDataContract.resolves(dataContract); - - const result = await cachedStateRepository.fetchDataContract(id); - - expect(result).to.equal(dataContract); - expect(stateRepositoryMock.fetchDataContract).to.be.calledOnceWith(id); - }); - }); - - describe('#fetchLatestPlatformBlockHeight', () => { - it('should fetch latest platform height from state repository', async () => { - stateRepositoryMock.fetchLatestPlatformBlockHeight.resolves(10); - - const result = await cachedStateRepository.fetchLatestPlatformBlockHeight(id); - - expect(result).to.equal(10); - expect(stateRepositoryMock.fetchLatestPlatformBlockHeight).to.be.calledOnce(); - }); - }); - - describe('#fetchLatestPlatformBlockTime', () => { - it('should fetch latest platform block time from state repository', async () => { - const timeMs = Date.now(); - - stateRepositoryMock.fetchLatestPlatformBlockTime.returns(timeMs); - - const result = await cachedStateRepository.fetchLatestPlatformBlockTime(); - - expect(result).to.deep.equal(timeMs); - expect(stateRepositoryMock.fetchLatestPlatformBlockTime).to.be.calledOnce(); - }); - }); - - describe('#fetchLatestPlatformCoreChainLockedHeight', () => { - it('should fetch latest platform core chain locked height from state repository', async () => { - const height = 42; - - stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.resolves(height); - - const result = await cachedStateRepository.fetchLatestPlatformCoreChainLockedHeight(id); - - expect(result).to.deep.equal(height); - expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.be.calledOnce(); - }); - }); - - describe('#fetchLatestWithdrawalTransactionIndex', () => { - it('should call fetchLatestWithdrawalTransactionIndex', async () => { - stateRepositoryMock.fetchLatestWithdrawalTransactionIndex.resolves(42); - - const result = await cachedStateRepository.fetchLatestWithdrawalTransactionIndex(); - - expect(result).to.equal(42); - expect( - stateRepositoryMock.fetchLatestWithdrawalTransactionIndex, - ).to.have.been.calledOnce(); - }); - }); - - describe('#enqueueWithdrawalTransaction', () => { - it('should call enqueueWithdrawalTransaction', async () => { - const index = 42; - const transactionBytes = Buffer.alloc(32, 1); - - await cachedStateRepository.enqueueWithdrawalTransaction( - index, transactionBytes, - ); - - expect( - stateRepositoryMock.enqueueWithdrawalTransaction, - ).to.have.been.calledOnceWithExactly( - index, - transactionBytes, - ); - }); - }); -}); diff --git a/packages/js-drive/test/unit/dpp/DriveStateRepository.spec.js b/packages/js-drive/test/unit/dpp/DriveStateRepository.spec.js deleted file mode 100644 index a974f8522a7..00000000000 --- a/packages/js-drive/test/unit/dpp/DriveStateRepository.spec.js +++ /dev/null @@ -1,732 +0,0 @@ -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); - -const ReadOperation = require('@dashevo/dpp/lib/stateTransition/fee/operations/ReadOperation'); -const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext'); - -const Long = require('long'); - -const DriveStateRepository = require('../../../lib/dpp/DriveStateRepository'); -const StorageResult = require('../../../lib/storage/StorageResult'); -const BlockExecutionContextMock = require('../../../lib/test/mock/BlockExecutionContextMock'); -const BlockInfo = require('../../../lib/blockExecution/BlockInfo'); - -describe('DriveStateRepository', () => { - let stateRepository; - let identityRepositoryMock; - let identityBalanceRepositoryMock; - let identityPublicKeyRepositoryMock; - let dataContractRepositoryMock; - let fetchDocumentsMock; - let documentsRepositoryMock; - let spentAssetLockTransactionsRepositoryMock; - let coreRpcClientMock; - let id; - let identity; - let documents; - let dataContract; - let blockExecutionContextMock; - let simplifiedMasternodeListMock; - let instantLockMock; - let repositoryOptions; - let executionContext; - let operations; - let blockInfo; - let rsDriveMock; - let blockHeight; - let timeMs; - - beforeEach(function beforeEach() { - identity = getIdentityFixture(); - documents = getDocumentsFixture(); - dataContract = getDataContractFixture(); - id = generateRandomIdentifier(); - - coreRpcClientMock = { - getRawTransaction: this.sinon.stub(), - verifyIsLock: this.sinon.stub(), - }; - - dataContractRepositoryMock = { - fetch: this.sinon.stub(), - create: this.sinon.stub(), - update: this.sinon.stub(), - }; - - identityRepositoryMock = { - fetch: this.sinon.stub(), - create: this.sinon.stub(), - updateRevision: this.sinon.stub(), - }; - - identityBalanceRepositoryMock = { - add: this.sinon.stub(), - fetch: this.sinon.stub(), - fetchWithDebt: this.sinon.stub(), - }; - - identityPublicKeyRepositoryMock = { - fetch: this.sinon.stub(), - add: this.sinon.stub(), - disable: this.sinon.stub(), - }; - - fetchDocumentsMock = this.sinon.stub(); - - documentsRepositoryMock = { - create: this.sinon.stub(), - update: this.sinon.stub(), - find: this.sinon.stub(), - delete: this.sinon.stub(), - }; - - spentAssetLockTransactionsRepositoryMock = { - store: this.sinon.stub(), - find: this.sinon.stub(), - delete: this.sinon.stub(), - }; - - blockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - - timeMs = Date.now(); - - blockHeight = Long.fromNumber(1); - - blockInfo = new BlockInfo(blockHeight.toNumber(), 0, timeMs); - - blockExecutionContextMock.getEpochInfo.returns({ - currentEpochIndex: blockInfo.epoch, - }); - blockExecutionContextMock.getHeight.returns(blockHeight); - blockExecutionContextMock.getTimeMs.returns(timeMs); - - simplifiedMasternodeListMock = { - getStore: this.sinon.stub(), - }; - - repositoryOptions = { useTransaction: true }; - - rsDriveMock = { - fetchLatestWithdrawalTransactionIndex: this.sinon.stub(), - enqueueWithdrawalTransaction: this.sinon.stub(), - }; - - rsDriveMock.fetchLatestWithdrawalTransactionIndex.resolves(42); - - stateRepository = new DriveStateRepository( - identityRepositoryMock, - identityBalanceRepositoryMock, - identityPublicKeyRepositoryMock, - dataContractRepositoryMock, - fetchDocumentsMock, - documentsRepositoryMock, - spentAssetLockTransactionsRepositoryMock, - coreRpcClientMock, - blockExecutionContextMock, - simplifiedMasternodeListMock, - rsDriveMock, - repositoryOptions, - ); - - instantLockMock = { - getRequestId: () => 'someRequestId', - txid: 'someTxId', - signature: 'signature', - verify: this.sinon.stub(), - }; - - executionContext = new StateTransitionExecutionContext(); - operations = [new ReadOperation(1)]; - }); - - describe('#fetchIdentity', () => { - it('should fetch identity from repository', async () => { - identityRepositoryMock.fetch.resolves( - new StorageResult(identity, operations), - ); - - const result = await stateRepository.fetchIdentity(id, executionContext); - - expect(result).to.equal(identity); - expect(identityRepositoryMock.fetch).to.be.calledOnceWith( - id, - { - blockInfo, - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#createIdentity', () => { - it('should create identity', async () => { - identityRepositoryMock.create.resolves( - new StorageResult(undefined, operations), - ); - - await stateRepository.createIdentity(identity, executionContext); - - expect(identityRepositoryMock.create).to.be.calledOnceWith( - identity, - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#fetchIdentityBalance', () => { - it('should fetch identity balance', async () => { - identityBalanceRepositoryMock.fetch.resolves( - new StorageResult(1, operations), - ); - - const result = await stateRepository.fetchIdentityBalance(identity.getId(), executionContext); - - expect(result).to.equals(1); - - expect(identityBalanceRepositoryMock.fetch).to.be.calledOnceWith( - identity.getId(), - { - blockInfo, - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#fetchIdentityBalanceWithDebt', () => { - it('should fetch identity balance', async () => { - identityBalanceRepositoryMock.fetchWithDebt.resolves( - new StorageResult(1, operations), - ); - - const result = await stateRepository.fetchIdentityBalanceWithDebt( - identity.getId(), - executionContext, - ); - - expect(result).to.equals(1); - - expect(identityBalanceRepositoryMock.fetchWithDebt).to.be.calledOnceWith( - identity.getId(), - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#addToIdentityBalance', () => { - it('should update identity balance', async () => { - identityBalanceRepositoryMock.add.resolves( - new StorageResult(undefined, operations), - ); - - await stateRepository.addToIdentityBalance(identity.getId(), 1, executionContext); - - expect(identityBalanceRepositoryMock.add).to.be.calledOnceWith( - identity.getId(), - 1, - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#updateIdentityRevision', () => { - it('should update identity revision', async () => { - identityRepositoryMock.updateRevision.resolves( - new StorageResult(undefined, operations), - ); - - await stateRepository.updateIdentityRevision(identity.getId(), 1, executionContext); - - expect(identityRepositoryMock.updateRevision).to.be.calledOnceWith( - identity.getId(), - 1, - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#addKeysToIdentity', () => { - it('should add keys to identity', async () => { - identityPublicKeyRepositoryMock.add.resolves( - new StorageResult(undefined, operations), - ); - - await stateRepository.addKeysToIdentity( - identity.getId(), - identity.getPublicKeys(), - executionContext, - ); - - expect(identityPublicKeyRepositoryMock.add).to.be.calledOnceWith( - identity.getId(), - identity.getPublicKeys(), - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#disableIdentityKeys', () => { - it('should disable identity keys', async () => { - identityPublicKeyRepositoryMock.disable.resolves( - new StorageResult(undefined, operations), - ); - - await stateRepository.disableIdentityKeys( - identity.getId(), - [1, 2], - 123, - executionContext, - ); - - expect(identityPublicKeyRepositoryMock.disable).to.be.calledOnceWith( - identity.getId(), - [1, 2], - 123, - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#fetchDataContract', () => { - it('should fetch data contract from repository', async () => { - dataContractRepositoryMock.fetch.resolves( - new StorageResult(dataContract, operations), - ); - - const result = await stateRepository.fetchDataContract(id, executionContext); - - expect(result).to.equal(dataContract); - expect(dataContractRepositoryMock.fetch).to.be.calledOnceWithExactly( - id, - { - blockInfo, - dryRun: false, - useTransaction: repositoryOptions.useTransaction, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#createDataContract', () => { - it('should create data contract to repository', async () => { - dataContractRepositoryMock.create.resolves( - new StorageResult(undefined, operations), - ); - - await stateRepository.createDataContract(dataContract, executionContext); - - expect(dataContractRepositoryMock.create).to.be.calledOnceWith( - dataContract, - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#updateDataContract', () => { - it('should store data contract to repository', async () => { - dataContractRepositoryMock.update.resolves( - new StorageResult(undefined, operations), - ); - - await stateRepository.updateDataContract(dataContract, executionContext); - - expect(dataContractRepositoryMock.update).to.be.calledOnceWith( - dataContract, - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#fetchDocuments', () => { - it('should fetch documents from repository', async () => { - const type = 'documentType'; - const options = {}; - - fetchDocumentsMock.resolves( - new StorageResult(documents, operations), - ); - - const result = await stateRepository.fetchDocuments( - id, - type, - options, - executionContext, - ); - - expect(result).to.equal(documents); - expect(fetchDocumentsMock).to.be.calledOnceWith( - id, - type, - { - blockInfo, - ...options, - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#createDocument', () => { - it('should create document in repository', async () => { - documentsRepositoryMock.create.resolves( - new StorageResult(undefined, operations), - ); - - const [document] = documents; - - await stateRepository.createDocument(document, executionContext); - - expect(documentsRepositoryMock.create).to.be.calledOnceWith( - document, - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#updateDocument', () => { - it('should store document in repository', async () => { - documentsRepositoryMock.update.resolves( - new StorageResult(undefined, operations), - ); - - const [document] = documents; - - await stateRepository.updateDocument(document, executionContext); - - expect(documentsRepositoryMock.update).to.be.calledOnceWith( - document, - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#removeDocument', () => { - it('should delete document from repository', async () => { - documentsRepositoryMock.delete.resolves( - new StorageResult(undefined, operations), - ); - - const type = 'documentType'; - - await stateRepository.removeDocument(dataContract, type, id, executionContext); - - expect(documentsRepositoryMock.delete).to.be.calledOnceWith( - dataContract, - type, - id, - blockInfo, - { - useTransaction: repositoryOptions.useTransaction, - dryRun: false, - }, - ); - - expect(executionContext.getOperations()).to.deep.equals(operations); - }); - }); - - describe('#fetchTransaction', () => { - it('should fetch transaction from core', async () => { - const rawTransaction = { - hex: 'some result', - height: 1, - }; - - coreRpcClientMock.getRawTransaction.resolves({ result: rawTransaction }); - - const result = await stateRepository.fetchTransaction(id, executionContext); - - expect(result).to.deep.equal({ - data: Buffer.from(rawTransaction.hex, 'hex'), - height: rawTransaction.height, - }); - - expect(coreRpcClientMock.getRawTransaction).to.be.calledOnceWithExactly(id, 1); - - const operation = new ReadOperation(Buffer.from(rawTransaction.hex, 'hex').length); - - expect(executionContext.getOperations()).to.deep.equals([operation]); - }); - - it('should return null if core throws Invalid address or key error', async () => { - const error = new Error('Some error'); - error.code = -5; - - coreRpcClientMock.getRawTransaction.throws(error); - - const result = await stateRepository.fetchTransaction(id); - - expect(result).to.equal(null); - expect(coreRpcClientMock.getRawTransaction).to.be.calledOnceWith(id); - }); - - it('should throw an error if core throws an unknown error', async () => { - const error = new Error('Some error'); - - coreRpcClientMock.getRawTransaction.throws(error); - - try { - await stateRepository.fetchTransaction(id); - - expect.fail('should throw error'); - } catch (e) { - expect(e).to.equal(error); - expect(coreRpcClientMock.getRawTransaction).to.be.calledOnceWith(id); - } - }); - - it('should return mocked transaction on dry run', async () => { - executionContext.enableDryRun(); - - const result = await stateRepository.fetchTransaction(id, executionContext); - - executionContext.disableDryRun(); - - expect(result).to.deep.equal({ - data: Buffer.alloc(0), - height: 1, - }); - - expect(coreRpcClientMock.getRawTransaction).to.not.be.called(id); - }); - }); - - describe('#fetchLatestPlatformBlockHeight', () => { - it('should fetch latest platform block height', async () => { - blockExecutionContextMock.getHeight.resolves(10); - - const result = await stateRepository.fetchLatestPlatformBlockHeight(); - - expect(result).to.equal(10); - expect(blockExecutionContextMock.getHeight).to.be.calledOnce(); - }); - }); - - describe('#fetchLatestPlatformBlockTime', () => { - it('should fetch latest platform block time', async () => { - const result = await stateRepository.fetchLatestPlatformBlockTime(); - - expect(result).to.deep.equal(timeMs); - expect(blockExecutionContextMock.getTimeMs).to.be.calledOnce(); - }); - }); - - describe('#fetchLatestPlatformCoreChainLockedHeight', () => { - it('should fetch latest platform core chainlocked height', async () => { - blockExecutionContextMock.getCoreChainLockedHeight.returns(10); - - const result = await stateRepository.fetchLatestPlatformCoreChainLockedHeight(); - - expect(result).to.equal(10); - expect(blockExecutionContextMock.getCoreChainLockedHeight).to.be.calledOnce(); - }); - }); - - describe('#verifyInstantLock', () => { - let smlStore; - - beforeEach(() => { - blockExecutionContextMock.getHeight.returns(41); - blockExecutionContextMock.getCoreChainLockedHeight.returns(42); - - smlStore = {}; - - simplifiedMasternodeListMock.getStore.returns(smlStore); - }); - - it('it should verify instant lock using Core', async () => { - coreRpcClientMock.verifyIsLock.resolves({ result: true }); - - const result = await stateRepository.verifyInstantLock(instantLockMock); - - expect(result).to.equal(true); - expect(coreRpcClientMock.verifyIsLock).to.have.been.calledOnceWithExactly( - 'someRequestId', - 'someTxId', - 'signature', - 42, - ); - expect(instantLockMock.verify).to.have.not.been.called(); - }); - - it('should return false if core throws Invalid address or key error', async () => { - const error = new Error('Some error'); - error.code = -5; - - coreRpcClientMock.verifyIsLock.throws(error); - - const result = await stateRepository.verifyInstantLock(instantLockMock); - - expect(result).to.equal(false); - expect(coreRpcClientMock.verifyIsLock).to.have.been.calledOnceWithExactly( - 'someRequestId', - 'someTxId', - 'signature', - 42, - ); - expect(instantLockMock.verify).to.have.not.been.called(); - }); - - it('should return false if core throws Invalid parameter', async () => { - const error = new Error('Some error'); - error.code = -8; - - coreRpcClientMock.verifyIsLock.throws(error); - - const result = await stateRepository.verifyInstantLock(instantLockMock); - - expect(result).to.equal(false); - expect(coreRpcClientMock.verifyIsLock).to.have.been.calledOnceWithExactly( - 'someRequestId', - 'someTxId', - 'signature', - 42, - ); - expect(instantLockMock.verify).to.have.not.been.called(); - }); - - it('should return false if coreChainLockedHeight is null', async () => { - blockExecutionContextMock.getCoreChainLockedHeight.returns(null); - - const result = await stateRepository.verifyInstantLock(instantLockMock); - - expect(result).to.be.false(); - }); - - it('should return true on dry run', async () => { - const error = new Error('Some error'); - error.code = -5; - - coreRpcClientMock.verifyIsLock.throws(error); - - executionContext.enableDryRun(); - - const result = await stateRepository.verifyInstantLock(instantLockMock, executionContext); - - executionContext.disableDryRun(); - - expect(result).to.be.true(); - expect(instantLockMock.verify).to.have.not.been.called(); - expect(coreRpcClientMock.verifyIsLock).to.have.not.been.called(); - }); - }); - - describe('#fetchSMLStore', () => { - it('should fetch SML store', async () => { - simplifiedMasternodeListMock.getStore.resolves('store'); - - const result = await stateRepository.fetchSMLStore(); - - expect(result).to.equal('store'); - expect(simplifiedMasternodeListMock.getStore).to.be.calledOnce(); - }); - }); - - describe('#fetchLatestWithdrawalTransactionIndex', () => { - it('should call fetchLatestWithdrawalTransactionIndex', async () => { - const result = await stateRepository.fetchLatestWithdrawalTransactionIndex(); - - expect(result).to.equal(42); - expect( - rsDriveMock.fetchLatestWithdrawalTransactionIndex, - ).to.have.been.calledOnceWithExactly( - blockInfo, - repositoryOptions.useTransaction, - repositoryOptions.dryRun, - ); - }); - }); - - describe('#enqueueWithdrawalTransaction', () => { - it('should call enqueueWithdrawalTransaction', async () => { - const index = 42; - const transactionBytes = Buffer.alloc(32, 1); - - await stateRepository.enqueueWithdrawalTransaction( - index, transactionBytes, - ); - - expect( - rsDriveMock.enqueueWithdrawalTransaction, - ).to.have.been.calledOnceWithExactly( - index, - transactionBytes, - blockInfo, - repositoryOptions.useTransaction, - ); - }); - }); -}); diff --git a/packages/js-drive/test/unit/dpp/LoggedStateRepositoryDecorator.spec.js b/packages/js-drive/test/unit/dpp/LoggedStateRepositoryDecorator.spec.js deleted file mode 100644 index 0e1344b80e5..00000000000 --- a/packages/js-drive/test/unit/dpp/LoggedStateRepositoryDecorator.spec.js +++ /dev/null @@ -1,983 +0,0 @@ -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); - -const LoggedStateRepositoryDecorator = require('../../../lib/dpp/LoggedStateRepositoryDecorator'); -const LoggerMock = require('../../../lib/test/mock/LoggerMock'); -const BlockExecutionContextMock = require('../../../lib/test/mock/BlockExecutionContextMock'); - -describe('LoggedStateRepositoryDecorator', () => { - let loggedStateRepositoryDecorator; - let stateRepositoryMock; - let loggerMock; - let blockExecutionContextMock; - - beforeEach(function beforeEach() { - stateRepositoryMock = createStateRepositoryMock(this.sinon); - loggerMock = new LoggerMock(this.sinon); - - blockExecutionContextMock = new BlockExecutionContextMock(this.sinon); - blockExecutionContextMock.getContextLogger.returns(loggerMock); - - loggedStateRepositoryDecorator = new LoggedStateRepositoryDecorator( - stateRepositoryMock, - blockExecutionContextMock, - ); - }); - - describe('#fetchIdentity', () => { - let id; - - beforeEach(() => { - id = generateRandomIdentifier(); - }); - - it('should call logger with proper params', async () => { - const response = getIdentityFixture(); - - stateRepositoryMock.fetchIdentity.resolves(response); - - await loggedStateRepositoryDecorator.fetchIdentity(id); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchIdentity', - parameters: { id }, - response, - }, - }, 'StateRepository#fetchIdentity'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.fetchIdentity.throws(error); - - try { - await loggedStateRepositoryDecorator.fetchIdentity(id); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchIdentity', - parameters: { id }, - response: undefined, - }, - }, 'StateRepository#fetchIdentity'); - }); - }); - - describe('#storeIdentity', () => { - let identity; - - beforeEach(() => { - identity = getIdentityFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.createIdentity.resolves(response); - - await loggedStateRepositoryDecorator.createIdentity(identity); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'createIdentity', - parameters: { identity }, - response, - }, - }, 'StateRepository#createIdentity'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.createIdentity.throws(error); - - try { - await loggedStateRepositoryDecorator.createIdentity(identity); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'createIdentity', - parameters: { identity }, - response: undefined, - }, - }, 'StateRepository#createIdentity'); - }); - }); - - describe('#addKeysToIdentity', () => { - let identity; - - beforeEach(() => { - identity = getIdentityFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.addKeysToIdentity.resolves(response); - - await loggedStateRepositoryDecorator.addKeysToIdentity( - identity.getId(), - identity.getPublicKeys(), - ); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'addKeysToIdentity', - parameters: { identityId: identity.getId(), keys: identity.getPublicKeys() }, - response, - }, - }, 'StateRepository#addKeysToIdentity'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.addKeysToIdentity.throws(error); - - try { - await loggedStateRepositoryDecorator.addKeysToIdentity( - identity.getId(), - identity.getPublicKeys(), - ); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'addKeysToIdentity', - parameters: { identityId: identity.getId(), keys: identity.getPublicKeys() }, - response: undefined, - }, - }, 'StateRepository#addKeysToIdentity'); - }); - }); - - describe('#fetchIdentityBalance', () => { - let identity; - - beforeEach(() => { - identity = getIdentityFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.fetchIdentityBalance.resolves(response); - - await loggedStateRepositoryDecorator.fetchIdentityBalance( - identity.getId(), - ); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchIdentityBalance', - parameters: { identityId: identity.getId() }, - response, - }, - }, 'StateRepository#fetchIdentityBalance'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.fetchIdentityBalance.throws(error); - - try { - await loggedStateRepositoryDecorator.fetchIdentityBalance(identity.getId()); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchIdentityBalance', - parameters: { identityId: identity.getId() }, - response: undefined, - }, - }, 'StateRepository#fetchIdentityBalance'); - }); - }); - - describe('#fetchIdentityBalanceWithDebt', () => { - let identity; - - beforeEach(() => { - identity = getIdentityFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.fetchIdentityBalanceWithDebt.resolves(response); - - await loggedStateRepositoryDecorator.fetchIdentityBalanceWithDebt( - identity.getId(), - ); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchIdentityBalanceWithDebt', - parameters: { identityId: identity.getId() }, - response, - }, - }, 'StateRepository#fetchIdentityBalanceWithDebt'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.fetchIdentityBalanceWithDebt.throws(error); - - try { - await loggedStateRepositoryDecorator.fetchIdentityBalanceWithDebt(identity.getId()); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchIdentityBalanceWithDebt', - parameters: { identityId: identity.getId() }, - response: undefined, - }, - }, 'StateRepository#fetchIdentityBalanceWithDebt'); - }); - }); - - describe('#addToIdentityBalance', () => { - let identity; - - beforeEach(() => { - identity = getIdentityFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.addToIdentityBalance.resolves(response); - - const amount = 200; - - await loggedStateRepositoryDecorator.addToIdentityBalance( - identity.getId(), - amount, - ); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'addToIdentityBalance', - parameters: { identityId: identity.getId(), amount }, - response, - }, - }, 'StateRepository#addToIdentityBalance'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.addToIdentityBalance.throws(error); - - const amount = 100; - - try { - await loggedStateRepositoryDecorator.addToIdentityBalance(identity.getId(), amount); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'addToIdentityBalance', - parameters: { identityId: identity.getId(), amount }, - response: undefined, - }, - }, 'StateRepository#addToIdentityBalance'); - }); - }); - - describe('#disableIdentityKeys', () => { - let identity; - - beforeEach(() => { - identity = getIdentityFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.disableIdentityKeys.resolves(response); - - const keyIds = [1, 2]; - const disableAt = 123; - - await loggedStateRepositoryDecorator.disableIdentityKeys( - identity.getId(), - keyIds, - disableAt, - ); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'disableIdentityKeys', - parameters: { identityId: identity.getId(), keyIds, disableAt }, - response, - }, - }, 'StateRepository#disableIdentityKeys'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.disableIdentityKeys.throws(error); - - const keyIds = [1, 2]; - const disableAt = 123; - - try { - await loggedStateRepositoryDecorator.disableIdentityKeys( - identity.getId(), - keyIds, - disableAt, - ); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'disableIdentityKeys', - parameters: { identityId: identity.getId(), keyIds, disableAt }, - response: undefined, - }, - }, 'StateRepository#disableIdentityKeys'); - }); - }); - - describe('#updateIdentityRevision', () => { - let identity; - - beforeEach(() => { - identity = getIdentityFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.updateIdentityRevision.resolves(response); - - const revision = 1; - - await loggedStateRepositoryDecorator.updateIdentityRevision( - identity.getId(), - revision, - ); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'updateIdentityRevision', - parameters: { identityId: identity.getId(), revision }, - response, - }, - }, 'StateRepository#updateIdentityRevision'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.updateIdentityRevision.throws(error); - - const revision = 1; - - try { - await loggedStateRepositoryDecorator.updateIdentityRevision( - identity.getId(), - revision, - ); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'updateIdentityRevision', - parameters: { identityId: identity.getId(), revision }, - response: undefined, - }, - }, 'StateRepository#updateIdentityRevision'); - }); - }); - - describe('#fetchDataContract', () => { - let id; - - beforeEach(() => { - id = generateRandomIdentifier(); - }); - - it('should call logger with proper params', async () => { - const response = getDataContractFixture(); - - stateRepositoryMock.fetchDataContract.resolves(response); - - await loggedStateRepositoryDecorator.fetchDataContract(id); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchDataContract', - parameters: { id }, - response, - }, - }, 'StateRepository#fetchDataContract'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.fetchDataContract.throws(error); - - try { - await loggedStateRepositoryDecorator.fetchDataContract(id); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchDataContract', - parameters: { id }, - response: undefined, - }, - }, 'StateRepository#fetchDataContract'); - }); - }); - - describe('#createDataContract', () => { - let dataContract; - - beforeEach(() => { - dataContract = getDataContractFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.createDataContract.resolves(response); - - await loggedStateRepositoryDecorator.createDataContract(dataContract); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'createDataContract', - parameters: { dataContract }, - response, - }, - }, 'StateRepository#createDataContract'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.createDataContract.throws(error); - - try { - await loggedStateRepositoryDecorator.createDataContract(dataContract); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'createDataContract', - parameters: { dataContract }, - response: undefined, - }, - }, 'StateRepository#createDataContract'); - }); - }); - - describe('#updateDataContract', () => { - let dataContract; - - beforeEach(() => { - dataContract = getDataContractFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.updateDataContract.resolves(response); - - await loggedStateRepositoryDecorator.updateDataContract(dataContract); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'updateDataContract', - parameters: { dataContract }, - response, - }, - }, 'StateRepository#updateDataContract'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.updateDataContract.throws(error); - - try { - await loggedStateRepositoryDecorator.updateDataContract(dataContract); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'updateDataContract', - parameters: { dataContract }, - response: undefined, - }, - }, 'StateRepository#updateDataContract'); - }); - }); - - describe('#fetchDocuments', () => { - let contractId; - let type; - let options; - - beforeEach(() => { - contractId = generateRandomIdentifier(); - type = 'type'; - options = { - where: [['field', '==', 'value']], - }; - }); - - it('should call logger with proper params', async () => { - const response = getDocumentsFixture(); - - stateRepositoryMock.fetchDocuments.resolves(response); - - await loggedStateRepositoryDecorator.fetchDocuments(contractId, type, options); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchDocuments', - parameters: { contractId, type, options }, - response, - }, - }, 'StateRepository#fetchDocuments'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.fetchDocuments.throws(error); - - try { - await loggedStateRepositoryDecorator.fetchDocuments(contractId, type, options); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchDocuments', - parameters: { contractId, type, options }, - response: undefined, - }, - }, 'StateRepository#fetchDocuments'); - }); - }); - - describe('#createDocument', () => { - let document; - - beforeEach(() => { - [document] = getDocumentsFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.createDocument.resolves(response); - - await loggedStateRepositoryDecorator.createDocument(document); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'createDocument', - parameters: { document }, - response, - }, - }, 'StateRepository#createDocument'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.createDocument.throws(error); - - try { - await loggedStateRepositoryDecorator.createDocument(document); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'createDocument', - parameters: { document }, - response: undefined, - }, - }, 'StateRepository#createDocument'); - }); - }); - - describe('#updateDocument', () => { - let document; - - beforeEach(() => { - [document] = getDocumentsFixture(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.updateDocument.resolves(response); - - await loggedStateRepositoryDecorator.updateDocument(document); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'updateDocument', - parameters: { document }, - response, - }, - }, 'StateRepository#updateDocument'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.updateDocument.throws(error); - - try { - await loggedStateRepositoryDecorator.updateDocument(document); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'updateDocument', - parameters: { document }, - response: undefined, - }, - }, 'StateRepository#updateDocument'); - }); - }); - - describe('#removeDocument', () => { - let dataContract; - let type; - let id; - - beforeEach(() => { - dataContract = getDataContractFixture(); - type = 'type'; - id = generateRandomIdentifier(); - }); - - it('should call logger with proper params', async () => { - const response = undefined; - - stateRepositoryMock.removeDocument.resolves(response); - - await loggedStateRepositoryDecorator.removeDocument(dataContract, type, id); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'removeDocument', - parameters: { dataContract, type, id }, - response, - }, - }, 'StateRepository#removeDocument'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.removeDocument.throws(error); - - try { - await loggedStateRepositoryDecorator.removeDocument(dataContract, type, id); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'removeDocument', - parameters: { dataContract, type, id }, - response: undefined, - }, - }, 'StateRepository#removeDocument'); - }); - }); - - describe('#fetchTransaction', () => { - let id; - - beforeEach(() => { - id = 'id'; - }); - - it('should call logger with proper params', async () => { - const response = { hex: '123' }; - - stateRepositoryMock.fetchTransaction.resolves(response); - - await loggedStateRepositoryDecorator.fetchTransaction(id); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchTransaction', - parameters: { id }, - response, - }, - }, 'StateRepository#fetchTransaction'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.fetchTransaction.throws(error); - - try { - await loggedStateRepositoryDecorator.fetchTransaction(id); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchTransaction', - parameters: { id }, - response: undefined, - }, - }, 'StateRepository#fetchTransaction'); - }); - }); - - describe('#fetchLatestPlatformBlockHeight', () => { - it('should call logger with proper params', async () => { - const response = {}; - - stateRepositoryMock.fetchLatestPlatformBlockHeight.resolves(response); - - await loggedStateRepositoryDecorator.fetchLatestPlatformBlockHeight(); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchLatestPlatformBlockHeight', - parameters: {}, - response, - }, - }, 'StateRepository#fetchLatestPlatformBlockHeight'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.fetchLatestPlatformBlockHeight.throws(error); - - try { - await loggedStateRepositoryDecorator.fetchLatestPlatformBlockHeight(); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchLatestPlatformBlockHeight', - parameters: {}, - response: undefined, - }, - }, 'StateRepository#fetchLatestPlatformBlockHeight'); - }); - }); - - describe('#fetchLatestPlatformBlockTime', () => { - it('should call logger with proper params', async () => { - const response = {}; - - stateRepositoryMock.fetchLatestPlatformBlockTime.resolves(response); - - await loggedStateRepositoryDecorator.fetchLatestPlatformBlockTime(); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchLatestPlatformBlockTime', - parameters: {}, - response, - }, - }, 'StateRepository#fetchLatestPlatformBlockTime'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.fetchLatestPlatformBlockTime.throws(error); - - try { - await loggedStateRepositoryDecorator.fetchLatestPlatformBlockTime(); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchLatestPlatformBlockTime', - parameters: {}, - response: undefined, - }, - }, 'StateRepository#fetchLatestPlatformBlockTime'); - }); - }); - - describe('#fetchLatestPlatformCoreChainLockedHeight', () => { - it('should call logger with proper params', async () => { - const response = {}; - - stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.resolves(response); - - await loggedStateRepositoryDecorator.fetchLatestPlatformCoreChainLockedHeight(); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchLatestPlatformCoreChainLockedHeight', - parameters: {}, - response, - }, - }, 'StateRepository#fetchLatestPlatformCoreChainLockedHeight'); - }); - - it('should call logger in case of error', async () => { - const error = new Error('unknown error'); - - stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.throws(error); - - try { - await loggedStateRepositoryDecorator.fetchLatestPlatformCoreChainLockedHeight(); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).equals(error); - } - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchLatestPlatformCoreChainLockedHeight', - parameters: {}, - response: undefined, - }, - }, 'StateRepository#fetchLatestPlatformCoreChainLockedHeight'); - }); - }); - - describe('#fetchLatestWithdrawalTransactionIndex', () => { - it('should call fetchLatestWithdrawalTransactionIndex', async () => { - stateRepositoryMock.fetchLatestWithdrawalTransactionIndex.resolves(42); - - const result = await loggedStateRepositoryDecorator.fetchLatestWithdrawalTransactionIndex(); - - expect(result).to.equal(42); - expect( - stateRepositoryMock.fetchLatestWithdrawalTransactionIndex, - ).to.have.been.calledOnce(); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'fetchLatestWithdrawalTransactionIndex', - parameters: {}, - response: 42, - }, - }, 'StateRepository#fetchLatestWithdrawalTransactionIndex'); - }); - }); - - describe('#enqueueWithdrawalTransaction', () => { - it('should call enqueueWithdrawalTransaction', async () => { - const index = 42; - const transactionBytes = Buffer.alloc(32, 1); - - await loggedStateRepositoryDecorator.enqueueWithdrawalTransaction( - index, transactionBytes, - ); - - expect( - stateRepositoryMock.enqueueWithdrawalTransaction, - ).to.have.been.calledOnceWithExactly( - index, - transactionBytes, - ); - - expect(loggerMock.trace).to.be.calledOnceWithExactly({ - stateRepository: { - method: 'enqueueWithdrawalTransaction', - parameters: { index, transactionBytes }, - response: undefined, - }, - }, 'StateRepository#enqueueWithdrawalTransaction'); - }); - }); -}); diff --git a/packages/js-drive/test/unit/featureFlag/getFeatureFlagForHeightFactory.spec.js b/packages/js-drive/test/unit/featureFlag/getFeatureFlagForHeightFactory.spec.js deleted file mode 100644 index 508fa99878d..00000000000 --- a/packages/js-drive/test/unit/featureFlag/getFeatureFlagForHeightFactory.spec.js +++ /dev/null @@ -1,65 +0,0 @@ -const Long = require('long'); - -const Identifier = require('@dashevo/dpp/lib/Identifier'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); - -const getFeatureFlagForHeightFactory = require('../../../lib/featureFlag/getFeatureFlagForHeightFactory'); -const StorageResult = require('../../../lib/storage/StorageResult'); - -describe('getFeatureFlagForHeightFactory', () => { - let featureFlagDataContractId; - let fetchDocumentsMock; - let getFeatureFlagForHeight; - let document; - let featureFlagDataContractBlockHeight; - - beforeEach(function beforeEach() { - featureFlagDataContractId = Identifier.from(Buffer.alloc(32, 1)); - - ([document] = getDocumentsFixture()); - - fetchDocumentsMock = this.sinon.stub().resolves( - new StorageResult([document]), - ); - - featureFlagDataContractBlockHeight = 42; - - getFeatureFlagForHeight = getFeatureFlagForHeightFactory( - featureFlagDataContractId, - fetchDocumentsMock, - ); - }); - - it('should call `fetchDocuments` and return first item from the result', async () => { - const result = await getFeatureFlagForHeight('someType', new Long(43)); - - const query = { - where: [ - ['enableAtHeight', '==', 43], - ], - }; - - expect(fetchDocumentsMock).to.have.been.calledOnceWithExactly( - featureFlagDataContractId, - 'someType', - { - ...query, - useTransaction: false, - }, - ); - expect(result).to.deep.equal(document); - }); - - it('should return null if featureFlagDataContractId is undefined', async () => { - getFeatureFlagForHeight = getFeatureFlagForHeightFactory( - undefined, - featureFlagDataContractBlockHeight, - fetchDocumentsMock, - ); - - const result = await getFeatureFlagForHeight('someType', new Long(42)); - - expect(result).to.equal(null); - expect(fetchDocumentsMock).to.not.be.called(); - }); -}); diff --git a/packages/js-drive/test/unit/featureFlag/getLatestFeatureFlagFactory.spec.js b/packages/js-drive/test/unit/featureFlag/getLatestFeatureFlagFactory.spec.js deleted file mode 100644 index d0db783d48f..00000000000 --- a/packages/js-drive/test/unit/featureFlag/getLatestFeatureFlagFactory.spec.js +++ /dev/null @@ -1,53 +0,0 @@ -const Identifier = require('@dashevo/dpp/lib/Identifier'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const { expect } = require('chai'); - -const Long = require('long'); - -const getLatestFeatureFlagFactory = require('../../../lib/featureFlag/getLatestFeatureFlagFactory'); -const StorageResult = require('../../../lib/storage/StorageResult'); - -describe('getLatestFeatureFlagFactory', () => { - let featureFlagDataContractId; - let fetchDocumentsMock; - let getLatestFeatureFlag; - let document; - - beforeEach(function beforeEach() { - featureFlagDataContractId = Identifier.from(Buffer.alloc(32, 1)); - - ([document] = getDocumentsFixture()); - - fetchDocumentsMock = this.sinon.stub(); - fetchDocumentsMock.resolves( - new StorageResult([document]), - ); - - getLatestFeatureFlag = getLatestFeatureFlagFactory( - featureFlagDataContractId, - fetchDocumentsMock, - ); - }); - - it('should call `fetchDocuments` and return first item from the result', async () => { - const result = await getLatestFeatureFlag('someType', new Long(42)); - - const query = { - where: [ - ['enableAtHeight', '<=', 42], - ], - orderBy: [ - ['enableAtHeight', 'desc'], - ], - limit: 1, - useTransaction: false, - }; - - expect(fetchDocumentsMock).to.have.been.calledOnceWithExactly( - featureFlagDataContractId, - 'someType', - query, - ); - expect(result).to.deep.equal(document); - }); -}); diff --git a/packages/js-drive/test/unit/identity/masternode/createMasternodeIdentityFactory.spec.js b/packages/js-drive/test/unit/identity/masternode/createMasternodeIdentityFactory.spec.js deleted file mode 100644 index 31fed3011d5..00000000000 --- a/packages/js-drive/test/unit/identity/masternode/createMasternodeIdentityFactory.spec.js +++ /dev/null @@ -1,191 +0,0 @@ -const createDPPMock = require('@dashevo/dpp/lib/test/mocks/createDPPMock'); -const Identity = require('@dashevo/dpp/lib/identity/Identity'); -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); -const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult'); -const Address = require('@dashevo/dashcore-lib/lib/address'); -const Script = require('@dashevo/dashcore-lib/lib/script'); -const createMasternodeIdentityFactory = require('../../../../lib/identity/masternode/createMasternodeIdentityFactory'); -const InvalidMasternodeIdentityError = require('../../../../lib/identity/masternode/errors/InvalidMasternodeIdentityError'); -const BlockInfo = require('../../../../lib/blockExecution/BlockInfo'); - -describe('createMasternodeIdentityFactory', () => { - let createMasternodeIdentity; - let dppMock; - let validationResult; - let getWithdrawPubKeyTypeFromPayoutScriptMock; - let getPublicKeyFromPayoutScriptMock; - let identityRepositoryMock; - let blockInfo; - - beforeEach(function beforeEach() { - dppMock = createDPPMock(this.sinon); - - getWithdrawPubKeyTypeFromPayoutScriptMock = this.sinon.stub().returns( - IdentityPublicKey.TYPES.BIP13_SCRIPT_HASH, - ); - - getPublicKeyFromPayoutScriptMock = this.sinon.stub().returns( - Buffer.alloc(20, 1), - ); - - validationResult = new ValidationResult(); - - dppMock.identity.validate.resolves(validationResult); - - identityRepositoryMock = { - create: this.sinon.stub(), - }; - - createMasternodeIdentity = createMasternodeIdentityFactory( - dppMock, - identityRepositoryMock, - getWithdrawPubKeyTypeFromPayoutScriptMock, - getPublicKeyFromPayoutScriptMock, - ); - - blockInfo = new BlockInfo(1, 0, Date.now()); - }); - - it('should create masternode identity', async () => { - const identityId = generateRandomIdentifier(); - const pubKeyData = Buffer.from([0]); - const pubKeyType = IdentityPublicKey.TYPES.ECDSA_HASH160; - - const result = await createMasternodeIdentity(blockInfo, identityId, pubKeyData, pubKeyType); - - const identity = new Identity({ - protocolVersion: 1, - id: identityId, - publicKeys: [{ - id: 0, - type: pubKeyType, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, - readOnly: true, - // Copy data buffer - data: Buffer.from([0]), - }], - balance: 0, - revision: 0, - }); - - expect(result).to.deep.equal(identity); - - expect(identityRepositoryMock.create).to.have.been.calledOnceWithExactly( - identity, - blockInfo, - { useTransaction: true }, - ); - - expect(getWithdrawPubKeyTypeFromPayoutScriptMock).to.not.be.called(); - - expect(getPublicKeyFromPayoutScriptMock).to.not.be.called(); - - expect(dppMock.identity.validate).to.be.calledOnceWithExactly(identity); - }); - - it('should store identity and public key hashed to the previous store', async () => { - const identityId = generateRandomIdentifier(); - const pubKeyData = Buffer.from([0]); - const pubKeyType = IdentityPublicKey.TYPES.ECDSA_HASH160; - - const result = await createMasternodeIdentity(blockInfo, identityId, pubKeyData, pubKeyType); - - const identity = new Identity({ - protocolVersion: 1, - id: identityId, - publicKeys: [{ - id: 0, - type: pubKeyType, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, - readOnly: true, - // Copy data buffer - data: Buffer.from([0]), - }], - balance: 0, - revision: 0, - }); - - expect(result).to.deep.equal(identity); - - expect(identityRepositoryMock.create).to.have.been.calledOnceWithExactly( - identity, - blockInfo, - { useTransaction: true }, - ); - }); - - it('should throw DPPValidationAbciError if identity is not valid', async () => { - const validationError = new Error('Validation error'); - - validationResult.addError(validationError); - - const identityId = generateRandomIdentifier(); - const pubKeyData = Buffer.from([0]); - const pubKeyType = IdentityPublicKey.TYPES.ECDSA_HASH160; - - try { - await createMasternodeIdentity(blockInfo, identityId, pubKeyData, pubKeyType); - - expect.fail('should fail with an error'); - } catch (e) { - expect(e).to.be.an.instanceof(InvalidMasternodeIdentityError); - expect(e.message).to.be.equal('Invalid masternode identity'); - expect(e.getValidationError()).to.be.deep.equal(validationError); - } - }); - - // TODO: Enable keys when we have support of non unique keys in DPP - it.skip('should create masternode identity with payoutScript public key', async () => { - const identityId = generateRandomIdentifier(); - const pubKeyData = Buffer.from([0]); - const pubKeyType = IdentityPublicKey.TYPES.ECDSA_HASH160; - const payoutScript = new Script(Address.fromString('7UkJidhNjEPJCQnCTXeaJKbJmL4JuyV66w')); - - const result = await createMasternodeIdentity( - blockInfo, - identityId, - pubKeyData, - pubKeyType, - payoutScript, - ); - - const identity = new Identity({ - protocolVersion: 1, - id: identityId, - publicKeys: [{ - id: 0, - type: pubKeyType, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, - readOnly: true, - data: Buffer.from([0]), - }, { - id: 1, - type: IdentityPublicKey.TYPES.BIP13_SCRIPT_HASH, - purpose: IdentityPublicKey.PURPOSES.WITHDRAW, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.CRITICAL, - readOnly: false, - data: Buffer.alloc(20, 1), - }], - balance: 0, - revision: 0, - }); - - expect(result).to.deep.equal(identity); - - expect(identityRepositoryMock.create).to.have.been.calledOnceWithExactly( - identity, - blockInfo, - { useTransaction: true }, - ); - - expect(getWithdrawPubKeyTypeFromPayoutScriptMock).to.be.calledOnce(); - - expect(getPublicKeyFromPayoutScriptMock).to.be.calledOnce(); - - expect(dppMock.identity.validate).to.be.calledOnceWithExactly(identity); - }); -}); diff --git a/packages/js-drive/test/unit/identity/masternode/createOperatorIdentifier.spec.js b/packages/js-drive/test/unit/identity/masternode/createOperatorIdentifier.spec.js deleted file mode 100644 index 59815f056d5..00000000000 --- a/packages/js-drive/test/unit/identity/masternode/createOperatorIdentifier.spec.js +++ /dev/null @@ -1,23 +0,0 @@ -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const createOperatorIdentifier = require('../../../../lib/identity/masternode/createOperatorIdentifier'); - -describe('createOperatorIdentifier', () => { - let smlEntry; - - beforeEach(() => { - smlEntry = { - proRegTxHash: '5557273f5922d9925e2327908ddb128bcf8e055a04d86e23431809bedd077060', - confirmedHash: '0000003da09fd100c60ad5743c44257bb9220ad8162a9b6cae9d005c8e465dba', - service: '95.222.25.60:19997', - pubKeyOperator: '08b66151b81bd6a08bad2e68810ea07014012d6d804859219958a7fbc293689aa902bd0cd6db7a4699c9e88a4ae8c2c0', - votingAddress: 'yZRteAQ51BoeD3sJL1iGdt6HJLgkWGurw5', - isValid: false, - }; - }); - - it('should return operator identifier from smlEntry', () => { - const identifier = createOperatorIdentifier(smlEntry); - - expect(identifier).to.deep.equal(Identifier.from('EwLi1FgGwvmLQ9nkfnttpXzv4SfC7XGBvs61QBCtnHEL')); - }); -}); diff --git a/packages/js-drive/test/unit/identity/masternode/createVotingIdentifier.spec.js b/packages/js-drive/test/unit/identity/masternode/createVotingIdentifier.spec.js deleted file mode 100644 index 7d65de4353d..00000000000 --- a/packages/js-drive/test/unit/identity/masternode/createVotingIdentifier.spec.js +++ /dev/null @@ -1,23 +0,0 @@ -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const createVotingIdentifier = require('../../../../lib/identity/masternode/createVotingIdentifier'); - -describe('createVotingIdentifier', () => { - let smlEntry; - - beforeEach(() => { - smlEntry = { - proRegTxHash: '5557273f5922d9925e2327908ddb128bcf8e055a04d86e23431809bedd077060', - confirmedHash: '0000003da09fd100c60ad5743c44257bb9220ad8162a9b6cae9d005c8e465dba', - service: '95.222.25.60:19997', - pubKeyOperator: '08b66151b81bd6a08bad2e68810ea07014012d6d804859219958a7fbc293689aa902bd0cd6db7a4699c9e88a4ae8c2c0', - votingAddress: 'yZRteAQ51BoeD3sJL1iGdt6HJLgkWGurw5', - isValid: false, - }; - }); - - it('should return voting identifier from smlEntry', () => { - const identifier = createVotingIdentifier(smlEntry); - - expect(identifier).to.deep.equal(Identifier.from('G1p14MYdpNRLNWuKgQ9SjJUPxfuaJMTwYjdRWu9sLzvL')); - }); -}); diff --git a/packages/js-drive/test/unit/identity/masternode/getPublicKeyFromPayoutScript.spec.js b/packages/js-drive/test/unit/identity/masternode/getPublicKeyFromPayoutScript.spec.js deleted file mode 100644 index 9239624e377..00000000000 --- a/packages/js-drive/test/unit/identity/masternode/getPublicKeyFromPayoutScript.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const Address = require('@dashevo/dashcore-lib/lib/address'); -const Script = require('@dashevo/dashcore-lib/lib/script'); -const InvalidIdentityPublicKeyTypeError = require('@dashevo/dpp/lib/stateTransition/errors/InvalidIdentityPublicKeyTypeError'); -const getPublicKeyFromPayoutScript = require('../../../../lib/identity/masternode/getPublicKeyFromPayoutScript'); - -describe('getPublicKeyFromPayoutScript', () => { - it('should return public key for ECDSA_HASH160 script', () => { - const payoutAddress = Address.fromString('yLceJztHVZFbeqE9v86sLD9bDKFBmNqHQD'); - const scriptBuffer = new Script(payoutAddress); - - const type = IdentityPublicKey.TYPES.ECDSA_HASH160; - - const result = getPublicKeyFromPayoutScript(scriptBuffer, type); - - expect(result).to.deep.equal(Buffer.from('0340a3abf7e6eccf42b4dd71ef8c20ed53a78d1f', 'hex')); - }); - - it('should return public key for BIP13_SCRIPT_HASH script', () => { - const payoutAddress = Address.fromString('7UkJidhNjEPJCQnCTXeaJKbJmL4JuyV66w'); - const scriptBuffer = new Script(payoutAddress); - - const type = IdentityPublicKey.TYPES.BIP13_SCRIPT_HASH; - - const result = getPublicKeyFromPayoutScript(scriptBuffer, type); - - expect(result).to.deep.equal(Buffer.from('19a7d869032368fd1f1e26e5e73a4ad0e474960e', 'hex')); - }); - - it('should throw InvalidIdentityPublicKeyTypeError if type is unknown', () => { - const payoutAddress = Address.fromString('7UkJidhNjEPJCQnCTXeaJKbJmL4JuyV66w'); - const scriptBuffer = new Script(payoutAddress); - - try { - getPublicKeyFromPayoutScript(scriptBuffer, -1); - - expect.fail('should throw InvalidIdentityPublicKeyTypeError'); - } catch (e) { - expect(e).to.be.an.instanceof(InvalidIdentityPublicKeyTypeError); - expect(e.getPublicKeyType()).to.equal(-1); - } - }); -}); diff --git a/packages/js-drive/test/unit/identity/masternode/getWithdrawPubKeyTypeFromPayoutScriptFactory.spec.js b/packages/js-drive/test/unit/identity/masternode/getWithdrawPubKeyTypeFromPayoutScriptFactory.spec.js deleted file mode 100644 index 5b2950fec34..00000000000 --- a/packages/js-drive/test/unit/identity/masternode/getWithdrawPubKeyTypeFromPayoutScriptFactory.spec.js +++ /dev/null @@ -1,44 +0,0 @@ -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const Address = require('@dashevo/dashcore-lib/lib/address'); -const Script = require('@dashevo/dashcore-lib/lib/script'); -const getWithdrawPubKeyTypeFromPayoutScriptFactory = require('../../../../lib/identity/masternode/getWithdrawPubKeyTypeFromPayoutScriptFactory'); -const InvalidPayoutScriptError = require('../../../../lib/identity/masternode/errors/InvalidPayoutScriptError'); - -describe('getWithdrawPubKeyTypeFromPayoutScriptFactory', () => { - let getWithdrawPubKeyTypeFromPayoutScript; - let network; - - beforeEach(() => { - network = 'testnet'; - getWithdrawPubKeyTypeFromPayoutScript = getWithdrawPubKeyTypeFromPayoutScriptFactory( - network, - ); - }); - - it('should return ECDSA_HASH160 if address has p2pkh type', () => { - const payoutScript = Script(Address.fromString('yTsGq4wV8WF5GKLaYV2C43zrkr2sfTtysT')); - const type = getWithdrawPubKeyTypeFromPayoutScript(payoutScript); - - expect(type).to.be.equal(IdentityPublicKey.TYPES.ECDSA_HASH160); - }); - - it('should return BIP13_SCRIPT_HASH if address has p2sh type', () => { - const payoutScript = Script(Address.fromString('7UkJidhNjEPJCQnCTXeaJKbJmL4JuyV66w')); - const type = getWithdrawPubKeyTypeFromPayoutScript(payoutScript); - - expect(type).to.be.equal(IdentityPublicKey.TYPES.BIP13_SCRIPT_HASH); - }); - - it('should throw InvalidPayoutScriptError if address is not p2sh or p2pkh', () => { - const payoutScript = new Script(); - - try { - getWithdrawPubKeyTypeFromPayoutScript(payoutScript); - - expect.fail('should throw InvalidPayoutScriptError'); - } catch (e) { - expect(e).to.be.an.instanceOf(InvalidPayoutScriptError); - expect(e.getPayoutScript()).to.deep.equal(payoutScript); - } - }); -}); diff --git a/packages/js-drive/test/unit/identity/masternode/handleNewMasternodeFactory.spec.js b/packages/js-drive/test/unit/identity/masternode/handleNewMasternodeFactory.spec.js deleted file mode 100644 index 84e5b382fbf..00000000000 --- a/packages/js-drive/test/unit/identity/masternode/handleNewMasternodeFactory.spec.js +++ /dev/null @@ -1,178 +0,0 @@ -const createDPPMock = require('@dashevo/dpp/lib/test/mocks/createDPPMock'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const Address = require('@dashevo/dashcore-lib/lib/address'); -const Script = require('@dashevo/dashcore-lib/lib/script'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const handleNewMasternodeFactory = require('../../../../lib/identity/masternode/handleNewMasternodeFactory'); -const getSmlFixture = require('../../../../lib/test/fixtures/getSmlFixture'); -const createOperatorIdentifier = require('../../../../lib/identity/masternode/createOperatorIdentifier'); -const BlockInfo = require('../../../../lib/blockExecution/BlockInfo'); -const createVotingIdentifier = require('../../../../lib/identity/masternode/createVotingIdentifier'); - -describe('handleNewMasternodeFactory', () => { - let handleNewMasternode; - let dppMock; - let createMasternodeIdentityMock; - let createRewardShareDocumentMock; - let fetchTransactionMock; - let transactionFixture; - let masternodeEntry; - let dataContract; - let blockInfo; - let identityFixture; - - beforeEach(function beforeEach() { - const smlFixture = getSmlFixture(); - [masternodeEntry] = smlFixture[0].mnList; - masternodeEntry.operatorPayoutAddress = 'yTCALGQTFNsA4pMPLTKAWdaLRmxfGpbujY'; - - dataContract = getDataContractFixture(); - - dppMock = createDPPMock(this.sinon); - - identityFixture = getIdentityFixture(); - - createMasternodeIdentityMock = this.sinon.stub().resolves(identityFixture); - createRewardShareDocumentMock = this.sinon.stub(); - - blockInfo = new BlockInfo(1, 0, Date.now()); - - transactionFixture = { - extraPayload: { - operatorReward: 0, - keyIDOwner: Buffer.alloc(20).fill('a').toString('hex'), - keyIDVoting: Buffer.alloc(20).fill('b').toString('hex'), - }, - }; - - fetchTransactionMock = this.sinon.stub().resolves(transactionFixture); - - handleNewMasternode = handleNewMasternodeFactory( - dppMock, - createMasternodeIdentityMock, - createRewardShareDocumentMock, - fetchTransactionMock, - ); - }); - - it('should create masternode identity', async () => { - masternodeEntry.payoutAddress = 'yRRwW957BJwL6SVVh3s8ASQYa2qXnduyfx'; - - const payoutAddress = Address.fromString(masternodeEntry.payoutAddress); - const payoutScript = new Script(payoutAddress); - - const result = await handleNewMasternode(masternodeEntry, dataContract, blockInfo); - - expect(result.createdEntities).to.have.lengthOf(2); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(0); - - expect(result.createdEntities[0].toObject()).to.deep.equal(identityFixture.toObject()); - expect(result.createdEntities[1].toObject()).to.deep.equal(identityFixture.toObject()); - - expect(fetchTransactionMock).to.be.calledOnceWithExactly(masternodeEntry.proRegTxHash); - expect(createMasternodeIdentityMock.getCall(0)).to.be.calledWithExactly( - blockInfo, - Identifier.from('HYyu6DdUQyiHZwzeWpmahu7AUrsEF9MKkRcrdQnKeNSj'), - Buffer.from('6161616161616161616161616161616161616161', 'hex'), - IdentityPublicKey.TYPES.ECDSA_HASH160, - payoutScript, - ); - - expect(createMasternodeIdentityMock.getCall(1)).to.be.calledWithExactly( - blockInfo, - Identifier.from('GVYoKVDd29gbmHzbVGepFjCbdymCS5Jq26CCiLnWNL6C'), - Buffer.from('6262626262626262626262626262626262626262', 'hex'), - IdentityPublicKey.TYPES.ECDSA_HASH160, - ); - - expect(createRewardShareDocumentMock).to.not.be.called(); - }); - - it('should not create voting identity if keyIDVoting equals keyIDOwner', async () => { - masternodeEntry.payoutAddress = 'yRRwW957BJwL6SVVh3s8ASQYa2qXnduyfx'; - - const payoutAddress = Address.fromString(masternodeEntry.payoutAddress); - const payoutScript = new Script(payoutAddress); - - transactionFixture.extraPayload.keyIDVoting = transactionFixture.extraPayload.keyIDOwner; - - fetchTransactionMock.resolves(transactionFixture); - - const result = await handleNewMasternode(masternodeEntry, dataContract, blockInfo); - - expect(result.createdEntities).to.have.lengthOf(1); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(0); - - expect(result.createdEntities[0].toJSON()).to.deep.equal(identityFixture.toJSON()); - - expect(fetchTransactionMock).to.be.calledOnceWithExactly(masternodeEntry.proRegTxHash); - expect(createMasternodeIdentityMock).to.be.calledOnceWithExactly( - blockInfo, - Identifier.from('HYyu6DdUQyiHZwzeWpmahu7AUrsEF9MKkRcrdQnKeNSj'), - Buffer.from('6161616161616161616161616161616161616161', 'hex'), - IdentityPublicKey.TYPES.ECDSA_HASH160, - payoutScript, - ); - - expect(createRewardShareDocumentMock).to.not.be.called(); - }); - - it('should create masternode identity and a document in rewards data contract with percentage', async () => { - transactionFixture.extraPayload.operatorReward = 10; - - const result = await handleNewMasternode(masternodeEntry, dataContract, blockInfo); - - expect(result.createdEntities).to.have.lengthOf(3); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(0); - - expect(result.createdEntities[0].toJSON()).to.deep.equal(identityFixture.toJSON()); - expect(result.createdEntities[1].toJSON()).to.deep.equal(identityFixture.toJSON()); - expect(result.createdEntities[2].toJSON()).to.deep.equal(identityFixture.toJSON()); - - const operatorIdentifier = createOperatorIdentifier(masternodeEntry); - const operatorPayoutAddress = Address.fromString(masternodeEntry.operatorPayoutAddress); - const operatorPayoutScript = new Script(operatorPayoutAddress); - - const votingIdentifier = createVotingIdentifier(masternodeEntry); - const payoutAddress = Address.fromString(masternodeEntry.payoutAddress); - const payoutScript = new Script(payoutAddress); - - expect(fetchTransactionMock).to.be.calledOnceWithExactly(masternodeEntry.proRegTxHash); - expect(createMasternodeIdentityMock).to.be.calledThrice(); - expect(createMasternodeIdentityMock.getCall(0)).to.be.calledWithExactly( - blockInfo, - Identifier.from('HYyu6DdUQyiHZwzeWpmahu7AUrsEF9MKkRcrdQnKeNSj'), - Buffer.from('6161616161616161616161616161616161616161', 'hex'), - IdentityPublicKey.TYPES.ECDSA_HASH160, - payoutScript, - ); - - expect(createMasternodeIdentityMock.getCall(1)).to.be.calledWithExactly( - blockInfo, - operatorIdentifier, - Buffer.from('951a3208ba531ea75aedd2dc0a9efc75f2c4d9492f1ee0a989b593bcd9722b1a101774d80a426552a9f91d24eb55af6e', 'hex'), - IdentityPublicKey.TYPES.BLS12_381, - operatorPayoutScript, - ); - - expect(createMasternodeIdentityMock.getCall(2)).to.be.calledWithExactly( - blockInfo, - votingIdentifier, - Buffer.from('6262626262626262626262626262626262626262', 'hex'), - IdentityPublicKey.TYPES.ECDSA_HASH160, - ); - - expect(createRewardShareDocumentMock).to.be.calledOnceWithExactly( - dataContract, - Identifier.from('HYyu6DdUQyiHZwzeWpmahu7AUrsEF9MKkRcrdQnKeNSj'), - Identifier.from('4Ftw1Euv5BJrUk73gKeELFsVqrfVXjbUTSt4tNZjBaVq'), - 10, - blockInfo, - ); - }); -}); diff --git a/packages/js-drive/test/unit/identity/masternode/handleUpdatedScriptPayoutFactory.spec.js b/packages/js-drive/test/unit/identity/masternode/handleUpdatedScriptPayoutFactory.spec.js deleted file mode 100644 index dec890be168..00000000000 --- a/packages/js-drive/test/unit/identity/masternode/handleUpdatedScriptPayoutFactory.spec.js +++ /dev/null @@ -1,157 +0,0 @@ -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const Identity = require('@dashevo/dpp/lib/identity/Identity'); -const Script = require('@dashevo/dashcore-lib/lib/script'); -const identitySchema = require('@dashevo/dpp/schema/identity/identity.json'); -const handleUpdatedScriptPayoutFactory = require('../../../../lib/identity/masternode/handleUpdatedScriptPayoutFactory'); -const BlockInfo = require('../../../../lib/blockExecution/BlockInfo'); -const StorageResult = require('../../../../lib/storage/StorageResult'); - -describe('handleUpdatedScriptPayoutFactory', () => { - let handleUpdatedScriptPayout; - let getWithdrawPubKeyTypeFromPayoutScriptMock; - let getPublicKeyFromPayoutScriptMock; - let identity; - let blockInfo; - let identityRepositoryMock; - let identityPublicKeyRepositoryMock; - - beforeEach(function beforeEach() { - identity = getIdentityFixture(); - - blockInfo = new BlockInfo(1, 0, Date.now()); - - getWithdrawPubKeyTypeFromPayoutScriptMock = this.sinon.stub().returns( - IdentityPublicKey.TYPES.ECDSA_HASH160, - ); - - getPublicKeyFromPayoutScriptMock = this.sinon.stub().returns(Buffer.alloc(20, '0')); - - identityRepositoryMock = { - updateRevision: this.sinon.stub(), - fetch: this.sinon.stub().resolves(new StorageResult(identity, [])), - }; - - identityPublicKeyRepositoryMock = { - add: this.sinon.stub(), - disable: this.sinon.stub(), - }; - - handleUpdatedScriptPayout = handleUpdatedScriptPayoutFactory( - identityRepositoryMock, - identityPublicKeyRepositoryMock, - getWithdrawPubKeyTypeFromPayoutScriptMock, - getPublicKeyFromPayoutScriptMock, - ); - }); - - it('should not update identity if identityPublicKeys max length was reached', async () => { - const { maxItems } = identitySchema.properties.publicKeys; - for (let i = identity.getPublicKeys().length; i < maxItems; ++i) { - identity.publicKeys.push({ - data: 'fakePublicKey', - }); - } - - const newPubKeyData = Buffer.alloc(20, '0'); - - const result = await handleUpdatedScriptPayout( - identity.getId(), - newPubKeyData, - identity.publicKeys[0].getData(), - ); - - expect(result.createdEntities).to.have.lengthOf(0); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(0); - - expect(identityRepositoryMock.updateRevision).to.not.be.called(); - expect(identityPublicKeyRepositoryMock.add).to.not.be.called(); - expect(identityPublicKeyRepositoryMock.disable).to.not.be.called(); - }); - - it('should add a public key and disable an old one', async () => { - const newPubKeyData = Buffer.alloc(20, '0'); - - const result = await handleUpdatedScriptPayout( - identity.getId(), - newPubKeyData, - blockInfo, - identity.publicKeys[0].getData(), - ); - - const newWithdrawalIdentityPublicKey = new IdentityPublicKey() - .setId(2) - .setType(IdentityPublicKey.TYPES.ECDSA_HASH160) - .setData(Buffer.from(newPubKeyData)) - .setReadOnly(true) - .setPurpose(IdentityPublicKey.PURPOSES.WITHDRAW) - .setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MASTER); - - expect(identityRepositoryMock.updateRevision).to.be.calledOnceWithExactly( - identity.getId(), - 1, - blockInfo, - { useTransaction: true }, - ); - - expect(identityPublicKeyRepositoryMock.add).to.be.calledOnceWithExactly( - identity.getId(), - [newWithdrawalIdentityPublicKey], - blockInfo, - { useTransaction: true }, - ); - - expect(result.createdEntities).to.have.lengthOf(1); - expect(result.updatedEntities).to.have.lengthOf(1); - expect(result.removedEntities).to.have.lengthOf(0); - - expect(result.createdEntities[0]).to.be.instanceOf(IdentityPublicKey); - expect(result.createdEntities[0].toObject()).to.deep.equal( - newWithdrawalIdentityPublicKey.toObject(), - ); - - expect(result.updatedEntities[0]).to.be.instanceOf(Identity); - expect(result.updatedEntities[0].toObject()).to.deep.equal(identity.toObject()); - }); - - it('should add public keys', async () => { - const newPubKeyData = Buffer.alloc(20, '0'); - - const result = await handleUpdatedScriptPayout( - identity.getId(), - newPubKeyData, - blockInfo, - new Script(), - ); - - const newWithdrawalIdentityPublicKey = new IdentityPublicKey() - .setId(2) - .setType(IdentityPublicKey.TYPES.ECDSA_HASH160) - .setData(Buffer.from(newPubKeyData)) - .setReadOnly(true) - .setPurpose(IdentityPublicKey.PURPOSES.WITHDRAW) - .setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MASTER); - - expect(identityRepositoryMock.updateRevision).to.be.calledOnceWithExactly( - identity.getId(), - 1, - blockInfo, - { useTransaction: true }, - ); - - expect(identityPublicKeyRepositoryMock.add).to.be.calledOnceWithExactly( - identity.getId(), - [newWithdrawalIdentityPublicKey], - blockInfo, - { useTransaction: true }, - ); - - expect(result.createdEntities).to.have.lengthOf(1); - expect(result.updatedEntities).to.have.lengthOf(1); - expect(result.removedEntities).to.have.lengthOf(0); - - expect(result.updatedEntities[0]).to.be.instanceOf(Identity); - expect(result.updatedEntities[0].toObject()).to.deep.equal(identity.toObject()); - }); -}); diff --git a/packages/js-drive/test/unit/identity/masternode/handleUpdatedVotingAddressFactory.spec.js b/packages/js-drive/test/unit/identity/masternode/handleUpdatedVotingAddressFactory.spec.js deleted file mode 100644 index d1c3ba3f140..00000000000 --- a/packages/js-drive/test/unit/identity/masternode/handleUpdatedVotingAddressFactory.spec.js +++ /dev/null @@ -1,102 +0,0 @@ -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); -const handleUpdatedVotingAddressFactory = require('../../../../lib/identity/masternode/handleUpdatedVotingAddressFactory'); -const StorageResult = require('../../../../lib/storage/StorageResult'); -const BlockInfo = require('../../../../lib/blockExecution/BlockInfo'); - -describe('handleUpdatedVotingAddressFactory', () => { - let handleUpdatedVotingAddress; - let createMasternodeIdentityMock; - let smlEntry; - let identity; - let fetchTransactionMock; - let transactionFixture; - let identityRepositoryMock; - let blockInfo; - - beforeEach(function beforeEach() { - smlEntry = { - proRegTxHash: '5557273f5922d9925e2327908ddb128bcf8e055a04d86e23431809bedd077060', - confirmedHash: '0000003da09fd100c60ad5743c44257bb9220ad8162a9b6cae9d005c8e465dba', - service: '95.222.25.60:19997', - pubKeyOperator: '08b66151b81bd6a08bad2e68810ea07014012d6d804859219958a7fbc293689aa902bd0cd6db7a4699c9e88a4ae8c2c0', - votingAddress: 'yZRteAQ51BoeD3sJL1iGdt6HJLgkWGurw5', - isValid: false, - }; - - transactionFixture = { - extraPayload: { - operatorReward: 0, - keyIDOwner: Buffer.alloc(20).fill('a').toString('hex'), - keyIDVoting: Buffer.alloc(20).fill('b').toString('hex'), - }, - }; - - fetchTransactionMock = this.sinon.stub().resolves(transactionFixture); - - identity = getIdentityFixture(); - - identityRepositoryMock = { - update: this.sinon.stub(), - fetch: this.sinon.stub().resolves(new StorageResult(null, [])), - }; - - createMasternodeIdentityMock = this.sinon.stub(); - - blockInfo = new BlockInfo(1, 0, Date.now()); - - handleUpdatedVotingAddress = handleUpdatedVotingAddressFactory( - identityRepositoryMock, - createMasternodeIdentityMock, - fetchTransactionMock, - ); - }); - - it('should store updated identity', async () => { - createMasternodeIdentityMock.resolves(identity); - - const result = await handleUpdatedVotingAddress(smlEntry, blockInfo); - - expect(result.createdEntities).to.have.lengthOf(1); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(0); - - expect(result.createdEntities[0]).to.deep.equal(identity); - expect(createMasternodeIdentityMock).to.be.calledOnceWithExactly( - blockInfo, - Identifier.from('G1p14MYdpNRLNWuKgQ9SjJUPxfuaJMTwYjdRWu9sLzvL'), - Buffer.from('8fd1a9502c58ab103792693e951bf39f10ee46a9', 'hex'), - IdentityPublicKey.TYPES.ECDSA_HASH160, - ); - expect(fetchTransactionMock).to.be.calledWithExactly(smlEntry.proRegTxHash); - }); - - it('should not update identity if identity already exists', async () => { - identityRepositoryMock.fetch.resolves(new StorageResult(identity, [])); - - const result = await handleUpdatedVotingAddress(smlEntry, blockInfo); - - expect(result.createdEntities).to.have.lengthOf(0); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(0); - - expect(createMasternodeIdentityMock).to.not.be.called(); - expect(fetchTransactionMock).to.be.calledWithExactly(smlEntry.proRegTxHash); - }); - - it('should not update identity if owner and voting keys are the same', async () => { - transactionFixture.extraPayload.keyIDVoting = transactionFixture.extraPayload.keyIDOwner; - - fetchTransactionMock.resolves(transactionFixture); - - const result = await handleUpdatedVotingAddress(smlEntry, blockInfo); - - expect(result.createdEntities).to.have.lengthOf(0); - expect(result.updatedEntities).to.have.lengthOf(0); - expect(result.removedEntities).to.have.lengthOf(0); - - expect(createMasternodeIdentityMock).to.not.be.called(); - expect(fetchTransactionMock).to.be.calledWithExactly(smlEntry.proRegTxHash); - }); -}); diff --git a/packages/js-drive/test/unit/identity/withdrawals/updateWithdrawalTransactionIdAndStatusFactory.spec.js b/packages/js-drive/test/unit/identity/withdrawals/updateWithdrawalTransactionIdAndStatusFactory.spec.js deleted file mode 100644 index 1985b1b1623..00000000000 --- a/packages/js-drive/test/unit/identity/withdrawals/updateWithdrawalTransactionIdAndStatusFactory.spec.js +++ /dev/null @@ -1,89 +0,0 @@ -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); - -const updateWithdrawalTransactionIdAndStatusFactory = require('../../../../lib/identity/withdrawals/updateWithdrawalTransactionIdAndStatusFactory'); -const BlockInfo = require('../../../../lib/blockExecution/BlockInfo'); - -describe('updateWithdrawalTransactionIdAndStatusFactory', () => { - let updateWithdrawalTransactionIdAndStatus; - let withdrawalsContractId; - let documentRepositoryMock; - let fetchDocumentsMock; - let document1Fixture; - let document2Fixture; - - beforeEach(function beforeEach() { - ([document1Fixture, document2Fixture] = getDocumentsFixture()); - - document1Fixture.set('transactionId', Buffer.alloc(32, 1)); - document2Fixture.set('transactionId', Buffer.alloc(32, 3)); - - withdrawalsContractId = Identifier.from(Buffer.alloc(32)); - - documentRepositoryMock = { - update: this.sinon.stub(), - }; - - fetchDocumentsMock = this.sinon.stub(); - fetchDocumentsMock.resolves([document1Fixture, document2Fixture]); - - updateWithdrawalTransactionIdAndStatus = updateWithdrawalTransactionIdAndStatusFactory( - documentRepositoryMock, - fetchDocumentsMock, - withdrawalsContractId, - ); - }); - - it('should update documents transactionId, status and revision', async () => { - const blockInfo = new BlockInfo(1, 1, 1); - - const coreChainLockedHeight = 42; - - const transactionIdMap = { - [Buffer.alloc(32, 1).toString('hex')]: Buffer.alloc(32, 2), - [Buffer.alloc(32, 3).toString('hex')]: Buffer.alloc(32, 4), - }; - - await updateWithdrawalTransactionIdAndStatus( - blockInfo, - coreChainLockedHeight, - transactionIdMap, - { - useTransaction: true, - }, - ); - - expect(fetchDocumentsMock).to.have.been.calledOnceWithExactly( - withdrawalsContractId, - 'withdrawal', - { - where: [ - ['status', '==', 1], - ['transactionId', 'in', [Buffer.alloc(32, 1), Buffer.alloc(32, 3)]], - ], - orderBy: [ - ['transactionId', 'asc'], - ], - useTransaction: true, - }, - ); - - expect(documentRepositoryMock.update).to.have.been.calledTwice(); - expect(documentRepositoryMock.update.getCall(0).args).to.deep.equal( - [document1Fixture, blockInfo, { useTransaction: true }], - ); - expect(documentRepositoryMock.update.getCall(1).args).to.deep.equal( - [document2Fixture, blockInfo, { useTransaction: true }], - ); - - expect(document1Fixture.get('transactionSignHeight')).to.deep.equal(coreChainLockedHeight); - expect(document1Fixture.get('transactionId')).to.deep.equal(Buffer.alloc(32, 2)); - expect(document1Fixture.get('status')).to.deep.equal(2); - expect(document1Fixture.getRevision()).to.deep.equal(2); - - expect(document2Fixture.get('transactionSignHeight')).to.deep.equal(coreChainLockedHeight); - expect(document2Fixture.get('transactionId')).to.deep.equal(Buffer.alloc(32, 4)); - expect(document2Fixture.get('status')).to.deep.equal(2); - expect(document2Fixture.getRevision()).to.deep.equal(2); - }); -}); diff --git a/packages/js-drive/test/unit/util/ExecutionTimer.spec.js b/packages/js-drive/test/unit/util/ExecutionTimer.spec.js deleted file mode 100644 index b1f3aff7a98..00000000000 --- a/packages/js-drive/test/unit/util/ExecutionTimer.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -const ExecutionTimer = require('../../../lib/util/ExecutionTimer'); -const wait = require('../../../lib/util/wait'); - -describe('ExecutionTimer', () => { - let timer; - - beforeEach(() => { - timer = new ExecutionTimer(); - }); - - describe('#startTimer', () => { - it('should throw an error if timer already started', () => { - timer.startTimer('some'); - - try { - timer.startTimer('some'); - expect.fail('An error was not thrown'); - } catch (e) { - expect(e.message).to.equal('some timer is already started'); - } - }); - }); - - describe('#stopTimer', () => { - it('should throw an error if timer has not been started', () => { - try { - timer.stopTimer('some'); - expect.fail('An error was not thrown'); - } catch (e) { - expect(e.message).to.equal('some timer is not started'); - } - }); - }); - - it('should measure function execution time', async () => { - // TODO: maybe there should be a better way to do it - timer.startTimer('some'); - await wait(1500); - const timings = timer.stopTimer('some'); - - expect(parseInt(timings, 10)).to.equal(1); - }); -}); diff --git a/packages/js-drive/test/unit/util/errorHandlerFactory.spec.js b/packages/js-drive/test/unit/util/errorHandlerFactory.spec.js deleted file mode 100644 index 466f87948a4..00000000000 --- a/packages/js-drive/test/unit/util/errorHandlerFactory.spec.js +++ /dev/null @@ -1,142 +0,0 @@ -const errorHandlerFactory = require('../../../lib/errorHandlerFactory'); -const LoggerMock = require('../../../lib/test/mock/LoggerMock'); - -describe('errorHandlerFactory', () => { - let errorHandler; - let containerMock; - let loggerMock; - let closeAbciServerMock; - - beforeEach(function beforeEach() { - this.sinon.stub(console, 'log'); - this.sinon.stub(console, 'error'); - this.sinon.stub(process, 'exit'); - - containerMock = { - dispose: this.sinon.stub(), - }; - - closeAbciServerMock = this.sinon.stub(); - - loggerMock = new LoggerMock(this.sinon); - - errorHandler = errorHandlerFactory( - loggerMock, - containerMock, - closeAbciServerMock, - ); - }); - - it('should close server, log error, dispose container and exit process on first call', async () => { - const error = new Error('message'); - - await errorHandler(error); - - expect(closeAbciServerMock).to.be.calledOnceWithExactly(); - - // Error face is printed - // eslint-disable-next-line no-console - expect(console.log).to.be.calledOnce(); - - expect(loggerMock.fatal).to.be.calledOnceWithExactly({ err: error }, error.message); - - expect(containerMock.dispose).to.be.calledOnceWithExactly(); - - expect(process.exit).to.be.calledOnceWithExactly(1); - }); - - it('should use consensus logger if it\'s present', async function it() { - const error = new Error('message'); - - const contextLogger = new LoggerMock(this.sinon); - - error.contextLogger = contextLogger; - - await errorHandler(error); - - expect(loggerMock.fatal).to.not.be.called(); - expect(contextLogger.fatal).to.be.calledOnceWithExactly({ err: error }, error.message); - - expect(containerMock.dispose).to.be.calledOnceWithExactly(); - - expect(process.exit).to.be.calledOnceWithExactly(1); - - // eslint-disable-next-line no-console - expect(console.log).to.be.calledOnce(); - }); - - it('should collect an error on second call', async () => { - const error1 = new Error('error1'); - const error2 = new Error('error2'); - - await Promise.all([ - errorHandler(error1), - errorHandler(error2), - ]); - - expect(closeAbciServerMock).to.be.calledOnceWithExactly(); - - // Error face is printed - // eslint-disable-next-line no-console - expect(console.log).to.be.calledOnce(); - - expect(loggerMock.fatal).to.be.calledTwice(); - - expect(loggerMock.fatal.getCall(0)).to.be.calledWithExactly({ err: error1 }, error1.message); - expect(loggerMock.fatal.getCall(1)).to.be.calledWithExactly({ err: error2 }, error2.message); - - expect(containerMock.dispose).to.be.calledOnceWithExactly(); - - expect(process.exit).to.be.calledOnceWithExactly(1); - }); - - it('should dispose container and output error in console if it was thrown during error handling', async () => { - const closeError = new Error('close server error'); - - closeAbciServerMock.throws(closeError); - - const error = new Error('message'); - - await errorHandler(error); - - expect(closeAbciServerMock).to.be.calledOnceWithExactly(); - - // Error face is printed - // eslint-disable-next-line no-console - expect(console.log).to.not.be.called(); - - expect(loggerMock.fatal).to.not.be.called(); - - expect(containerMock.dispose).to.be.calledOnceWithExactly(); - - // eslint-disable-next-line no-console - expect(console.error).to.be.calledOnceWithExactly(closeError); - - expect(process.exit).to.be.calledOnceWithExactly(1); - }); - - it('should output error in console if it was thrown during dispose', async () => { - const disposeError = new Error('dispose error'); - - containerMock.dispose.throws(disposeError); - - const error = new Error('message'); - - await errorHandler(error); - - expect(closeAbciServerMock).to.be.calledOnceWithExactly(); - - // Error face is printed - // eslint-disable-next-line no-console - expect(console.log).to.be.calledOnce(); - - expect(loggerMock.fatal).to.be.calledOnceWithExactly({ err: error }, error.message); - - expect(containerMock.dispose).to.be.calledOnceWithExactly(); - - // eslint-disable-next-line no-console - expect(console.error).to.be.calledOnceWithExactly(disposeError); - - expect(process.exit).to.be.calledOnceWithExactly(1); - }); -}); diff --git a/packages/js-drive/test/unit/util/rejectAfter.spec.js b/packages/js-drive/test/unit/util/rejectAfter.spec.js deleted file mode 100644 index 31a281a6fa6..00000000000 --- a/packages/js-drive/test/unit/util/rejectAfter.spec.js +++ /dev/null @@ -1,34 +0,0 @@ -const rejectAfter = require('../../../lib/util/rejectAfter'); - -describe('rejectAfter', () => { - it('should return resolved promise', async () => { - const resolvedValue = 1; - const promise = Promise.resolve(resolvedValue); - - const actualValue = await rejectAfter(promise, new Error(), 1000); - - expect(actualValue).to.equal(resolvedValue); - }); - - it('should return rejected promise', (done) => { - const error = new Error(); - const promise = Promise.reject(error); - - const actualPromise = rejectAfter(promise, new Error(), 1000); - - expect(actualPromise).to.be.rejectedWith(error).and.notify(done); - }); - - it('should reject unresolved promise after specified time', function it(done) { - const promise = new Promise(() => {}); - const error = new Error(); - - const clock = this.sinon.useFakeTimers(); - - const rejectedPromise = rejectAfter(promise, error, 1000); - - clock.next(); - - expect(rejectedPromise).to.be.rejectedWith(error).and.notify(done); - }); -}); diff --git a/packages/js-drive/test/unit/util/sanitizeUrl.spec.js b/packages/js-drive/test/unit/util/sanitizeUrl.spec.js deleted file mode 100644 index 73c40d47682..00000000000 --- a/packages/js-drive/test/unit/util/sanitizeUrl.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -const { expect } = require('chai'); -const sanitizeUrl = require('../../../lib/util/sanitizeUrl'); - -describe('sanitizeUrl', () => { - it('should sanitize an url', () => { - const sanitized = sanitizeUrl('https://www.dash.org?something=true'); - expect(sanitized).to.equal('https://www.dash.org'); - }); - it('should handle non RFC path', () => { - const sanitized = sanitizeUrl('/foo;jsessionid=123456'); - expect(sanitized).to.equal('/foo'); - }); -}); diff --git a/packages/js-drive/test/unit/util/wait.spec.js b/packages/js-drive/test/unit/util/wait.spec.js deleted file mode 100644 index 353cf3606b0..00000000000 --- a/packages/js-drive/test/unit/util/wait.spec.js +++ /dev/null @@ -1,30 +0,0 @@ -const wait = require('../../../lib/util/wait'); - -describe('wait', () => { - let clock; - let executeWithWait; - - beforeEach(function beforeEach() { - clock = this.sinon.useFakeTimers(); - - executeWithWait = async (f) => { - await wait(1200); - f(); - }; - }); - - it('should delay execution of a flow for a specified amount of milliseconds', function it(done) { - const callback = this.sinon.stub(); - - executeWithWait(callback).then(() => { - expect(callback).to.have.been.calledOnce(); - done(); - }).catch(done); - - clock.tick(1199); - - expect(callback).to.have.not.been.called(); - - clock.tick(1); - }); -}); diff --git a/packages/js-drive/test/unit/validator/Validator.spec.js b/packages/js-drive/test/unit/validator/Validator.spec.js deleted file mode 100644 index c3544e8140b..00000000000 --- a/packages/js-drive/test/unit/validator/Validator.spec.js +++ /dev/null @@ -1,37 +0,0 @@ -const { expect } = require('chai'); -const Validator = require('../../../lib/validator/Validator'); -const ValidatorNetworkInfo = require('../../../lib/validator/ValidatorNetworkInfo'); - -describe('Validator', () => { - let networkInfo; - let host; - let port; - - beforeEach(() => { - host = '192.168.65.2'; - port = 26656; - networkInfo = new ValidatorNetworkInfo(host, port); - }); - - describe('#createFromQuorumMember', () => { - it('should create an instance from quorum member info', () => { - const memberInfo = { - proTxHash: Buffer.alloc(0, 32).toString('hex'), - pubKeyShare: Buffer.alloc(1, 32).toString('hex'), - }; - - const instance = Validator.createFromQuorumMember(memberInfo, networkInfo); - - expect(instance).to.be.an.instanceOf(Validator); - expect(instance.getProTxHash()).to.deep.equal( - Buffer.from(memberInfo.proTxHash, 'hex'), - ); - expect(instance.getPublicKeyShare()).to.deep.equal( - Buffer.from(memberInfo.pubKeyShare, 'hex'), - ); - expect(instance.getNetworkInfo()).to.be.an.instanceOf(ValidatorNetworkInfo); - expect(instance.getNetworkInfo().getHost()).to.equal(host); - expect(instance.getNetworkInfo().getPort()).to.equal(port); - }); - }); -}); diff --git a/packages/js-drive/test/unit/validator/ValidatorNetworkInfo.spec.js b/packages/js-drive/test/unit/validator/ValidatorNetworkInfo.spec.js deleted file mode 100644 index 92ba6b25946..00000000000 --- a/packages/js-drive/test/unit/validator/ValidatorNetworkInfo.spec.js +++ /dev/null @@ -1,24 +0,0 @@ -const ValidatorNetworkInfo = require('../../../lib/validator/ValidatorNetworkInfo'); - -describe('ValidatorNetworkInfo', () => { - let validatorNetworkInfo; - let host; - let port; - - beforeEach(() => { - host = '192.168.65.2'; - port = 26656; - }); - - it('should return host', () => { - validatorNetworkInfo = new ValidatorNetworkInfo(host, port); - - expect(validatorNetworkInfo.getHost()).to.equal(host); - }); - - it('should return port', () => { - validatorNetworkInfo = new ValidatorNetworkInfo(host, port); - - expect(validatorNetworkInfo.getPort()).to.equal(port); - }); -}); diff --git a/packages/js-drive/test/unit/validator/ValidatorSet.spec.js b/packages/js-drive/test/unit/validator/ValidatorSet.spec.js deleted file mode 100644 index 7e9e0e3db5f..00000000000 --- a/packages/js-drive/test/unit/validator/ValidatorSet.spec.js +++ /dev/null @@ -1,253 +0,0 @@ -const Long = require('long'); - -const QuorumEntry = require('@dashevo/dashcore-lib/lib/deterministicmnlist/QuorumEntry'); - -const SimplifiedMNListEntry = require('@dashevo/dashcore-lib/lib/deterministicmnlist/SimplifiedMNListEntry'); -const ValidatorSet = require('../../../lib/validator/ValidatorSet'); -const getSmlFixture = require('../../../lib/test/fixtures/getSmlFixture'); -const ValidatorSetIsNotInitializedError = require('../../../lib/validator/errors/ValidatorSetIsNotInitializedError'); -const Validator = require('../../../lib/validator/Validator'); -const PublicKeyShareIsNotPresentError = require('../../../lib/validator/errors/PublicKeyShareIsNotPresentError'); - -describe('ValidatorSet', () => { - let smlStoreMock; - let simplifiedMasternodeListMock; - let smlDiffMock; - let smlMock; - let quorumMembers; - let rotationEntropy; - let quorumEntry; - let coreHeight; - let coreRpcClientMock; - let validatorNetworkPort; - - let validatorSetLLMQType; - - let validatorSet; - let getRandomQuorumMock; - let fetchQuorumMembersMock; - - beforeEach(function beforeEach() { - coreHeight = 42; - - validatorSetLLMQType = 4; - - quorumEntry = new QuorumEntry(getSmlFixture()[0].newQuorums[0]); - - smlDiffMock = { - blockHash: 'some block hash', - }; - - smlMock = { - getQuorum: this.sinon.stub().returns(quorumEntry), - toSimplifiedMNListDiff: this.sinon.stub().returns(smlDiffMock), - getQuorumsOfType: this.sinon.stub().returns( - getSmlFixture()[0].newQuorums.filter((quorum) => quorum.llmqType === 1), - ), - getValidMasternodesList: this.sinon.stub().returns([ - new SimplifiedMNListEntry({ - proRegTxHash: 'c286807d463b06c7aba3b9a60acf64c1fc03da8c1422005cd9b4293f08cf0562', - confirmedHash: '4eb56228c535db3b234907113fd41d57bcc7cdcb8e0e00e57590af27ee88c119', - service: '192.168.65.2:20101', - pubKeyOperator: '809519c5f6f3be1c08782ac42ae9a83b6c7205eba43f9a96a4f032ec7a73f1a7c25fa78cce0d6d9c135f7e2c28527179', - votingAddress: 'yXmprXYP51uzfMyndtWwxz96MnkCKkFc9x', - nType: 0, - isValid: true, - }), - new SimplifiedMNListEntry({ - proRegTxHash: 'a3e1edc6bd352eeaf0ae58e30781ef4b127854241a3fe7fddf36d5b7e1dc2b3f', - confirmedHash: '27a0b637b56af038c45e2fd1f06c2401c8dadfa28ca5e0d19ca836cc984a8378', - service: '192.168.65.2:20201', - pubKeyOperator: '987a4873caba62cd45a2f7d4aa6d94519ee6753e9bef777c927cb94ade768a542b0ff34a93231d3a92b4e75ffdaa366e', - votingAddress: 'ycL7L4mhYoaZdm9TH85svvpfeKtdfo249u', - nType: 0, - isValid: true, - }), - ]), - }; - - smlStoreMock = { - getSMLbyHeight: this.sinon.stub().returns(smlMock), - getCurrentSML: this.sinon.stub().returns(smlMock), - }; - - simplifiedMasternodeListMock = { - getStore: this.sinon.stub().returns(smlStoreMock), - }; - - rotationEntropy = Buffer.from('00000ac05a06682172d8b49be7c9ddc4189126d7200ebf0fc074c433ae74b596', 'hex'); - - quorumMembers = [ - { - proTxHash: 'c286807d463b06c7aba3b9a60acf64c1fc03da8c1422005cd9b4293f08cf0562', - pubKeyOperator: '06abc1c890c9da4e513d52f20da1882228bfa2db4bb29cbd064e1b2a61d9dcdadcf0784fd1371338c8ad1bf323d87ae6', - valid: true, - pubKeyShare: '00d7bb8d6753865c367824691610dcc313b661b7e024e36e82f8af33f5701caddb2668dadd1e647d8d7d5b30e37ebbcf', - }, - { - proTxHash: 'a3e1edc6bd352eeaf0ae58e30781ef4b127854241a3fe7fddf36d5b7e1dc2b3f', - pubKeyOperator: '04d748ba0efeb7a8f8548e0c22b4c188c293a19837a1c5440649279ba73ead0c62ac1e840050a10a35e0ae05659d2a8d', - valid: true, - pubKeyShare: '86d0992f5c73b8f57101c34a0c4ebb17d962bb935a738c1ef1e2bb1c25034d8e4a0a2cc96e0ebc69a7bf3b8b67b2de5f', - }, - { - proTxHash: 'a3e1edc6bd352eeaf0ae58e30781ef4b127854241a3fe7fddf36d5b7e1dc2b3f', - pubKeyOperator: '04d748ba0efeb7a8f8548e0c22b4c188c293a19837a1c5440649279ba73ead0c62ac1e840050a10a35e0ae05659d2a8d', - valid: false, - }, - ]; - - getRandomQuorumMock = this.sinon.stub().resolves(quorumEntry); - - fetchQuorumMembersMock = this.sinon.stub().resolves(quorumMembers); - - const notMasternodeError = new Error(); - notMasternodeError.code = -32603; - - coreRpcClientMock = { - masternode: this.sinon.stub().throws(notMasternodeError), - }; - - validatorNetworkPort = 26656; - - validatorSet = new ValidatorSet( - simplifiedMasternodeListMock, - getRandomQuorumMock, - fetchQuorumMembersMock, - validatorSetLLMQType, - coreRpcClientMock, - validatorNetworkPort, - ); - }); - - describe('initialize', () => { - it('should initialize with specified core height', async () => { - await validatorSet.initialize(coreHeight); - - expect(smlStoreMock.getSMLbyHeight).to.be.calledOnceWithExactly(coreHeight); - - expect(getRandomQuorumMock).to.be.calledOnceWithExactly( - smlMock, - validatorSetLLMQType, - Buffer.from(smlDiffMock.blockHash, 'hex'), - coreHeight, - ); - - expect(fetchQuorumMembersMock).to.be.calledOnceWithExactly( - validatorSetLLMQType, - quorumEntry.quorumHash, - ); - - expect(smlStoreMock.getCurrentSML().getValidMasternodesList).to.be.calledOnce(); - }); - - it('should throw an error if the node is a quorum member and doesn\'t receive public key shares', async () => { - coreRpcClientMock.masternode.resolves({ - result: { - proTxHash: quorumMembers[0].proTxHash, - }, - }); - - quorumMembers[2].valid = true; - - try { - await validatorSet.initialize(coreHeight); - - expect.fail('should throw PublicKeyShareIsNotPresentError'); - } catch (e) { - expect(e).to.be.instanceOf(PublicKeyShareIsNotPresentError); - expect(e.getMember()).to.be.equal(quorumMembers[2]); - } - }); - }); - - describe('rotate', () => { - it('should rotate validator set with specified core height and entropy if height divisible by ROTATION_BLOCK_INTERVAL', async () => { - const height = Long.fromInt(ValidatorSet.ROTATION_BLOCK_INTERVAL); - - const result = await validatorSet.rotate( - height, - coreHeight, - rotationEntropy, - ); - - expect(result).to.be.true(); - - expect(smlStoreMock.getSMLbyHeight).to.be.calledOnceWithExactly(coreHeight); - - expect(getRandomQuorumMock).to.be.calledOnceWithExactly( - smlMock, - validatorSetLLMQType, - rotationEntropy, - coreHeight, - ); - - expect(fetchQuorumMembersMock).to.be.calledOnceWithExactly( - validatorSetLLMQType, - quorumEntry.quorumHash, - ); - - expect(smlStoreMock.getCurrentSML().getValidMasternodesList).to.be.calledOnce(); - }); - - it('should not rotate validator set if height not divisible by ROTATION_BLOCK_INTERVAL', async () => { - const height = Long.fromInt(42); - - const result = await validatorSet.rotate( - height, - coreHeight, - rotationEntropy, - ); - - expect(result).to.be.false(); - - expect(smlStoreMock.getSMLbyHeight).to.be.calledOnceWithExactly(coreHeight); - - expect(getRandomQuorumMock).to.not.be.called(); - - expect(fetchQuorumMembersMock).to.not.be.called(); - }); - }); - - describe('getQuorum', () => { - it('should return QuorumEntry', async () => { - await validatorSet.initialize(coreHeight); - - const result = validatorSet.getQuorum(); - - expect(result).to.equals(quorumEntry); - }); - - it('should thrown an error if ValidatorSet is not initialized', () => { - try { - validatorSet.getQuorum(); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(ValidatorSetIsNotInitializedError); - } - }); - }); - - describe('getValidators', () => { - it('should return array of validators', async () => { - await validatorSet.initialize(coreHeight); - - const result = validatorSet.getValidators(); - - expect(result).to.have.lengthOf(2); - expect(result[0]).to.be.instanceOf(Validator); - expect(result[1]).to.be.instanceOf(Validator); - }); - - it('should thrown an error if ValidatorSet is not initialized', () => { - try { - validatorSet.getValidators(); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(ValidatorSetIsNotInitializedError); - } - }); - }); -}); diff --git a/yarn.lock b/yarn.lock index 8a95a3b3940..5a245765a17 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1281,17 +1281,6 @@ __metadata: languageName: node linkType: hard -"@dashevo/abci@github:dashpay/js-abci#09f72120bc2059144f72eb7a246d632ead3fc3c6": - version: 0.24.0-dev.1 - resolution: "@dashevo/abci@https://github.com/dashpay/js-abci.git#commit=09f72120bc2059144f72eb7a246d632ead3fc3c6" - dependencies: - "@dashevo/protobufjs": 6.10.5 - bl: ^1.2.3 - protocol-buffers-encodings: ^1.1.0 - checksum: aaf41ab7fada6504606daf6ef238f2240bac4307ecde77bd77b8c10aecfd0b73fb8cfb40b2ad91a5bc6440572c93580da51013e188bb85dc46c4120b7c8c2236 - languageName: node - linkType: hard - "@dashevo/bench-suite@workspace:packages/bench-suite": version: 0.0.0-use.local resolution: "@dashevo/bench-suite@workspace:packages/bench-suite" @@ -1631,63 +1620,6 @@ __metadata: languageName: unknown linkType: soft -"@dashevo/drive@workspace:packages/js-drive": - version: 0.0.0-use.local - resolution: "@dashevo/drive@workspace:packages/js-drive" - dependencies: - "@dashevo/abci": "github:dashpay/js-abci#09f72120bc2059144f72eb7a246d632ead3fc3c6" - "@dashevo/dapi-grpc": "workspace:*" - "@dashevo/dashcore-lib": ~0.20.0 - "@dashevo/dashd-rpc": ^18.2.0 - "@dashevo/dashpay-contract": "workspace:*" - "@dashevo/dp-services-ctl": "github:dashevo/js-dp-services-ctl#v0.19-dev" - "@dashevo/dpns-contract": "workspace:*" - "@dashevo/dpp": "workspace:*" - "@dashevo/feature-flags-contract": "workspace:*" - "@dashevo/grpc-common": "workspace:*" - "@dashevo/masternode-reward-shares-contract": "workspace:*" - "@dashevo/rs-drive": "workspace:*" - "@dashevo/withdrawals-contract": "workspace:*" - "@types/pino": ^6.3.0 - ajv: ^8.6.0 - ajv-keywords: ^5.0.0 - awilix: ^4.2.6 - babel-eslint: ^10.1.0 - blake3: ^2.1.4 - bs58: ^4.0.1 - cbor: ^8.0.0 - chai: ^4.3.4 - chai-as-promised: ^7.1.1 - chai-string: ^1.5.0 - chalk: ^4.1.0 - dirty-chai: ^2.0.1 - dotenv-expand: ^5.1.0 - dotenv-safe: ^8.2.0 - eslint: ^7.32.0 - eslint-config-airbnb-base: ^14.2.1 - eslint-plugin-import: ^2.24.2 - find-my-way: ^2.2.2 - js-merkle: ^0.1.5 - levelup: ^4.4.0 - lodash: ^4.17.21 - long: ^5.2.0 - memdown: ^5.1.0 - mocha: ^9.1.2 - moment: ^2.29.4 - node-graceful: ^3.0.1 - nyc: ^15.1.0 - pino: ^6.4.0 - pino-multi-stream: ^5.2.0 - pino-pretty: ^4.0.3 - rimraf: ^3.0.2 - setimmediate: ^1.0.5 - sinon: ^11.1.2 - sinon-chai: ^3.7.0 - through2: ^3.0.1 - zeromq: ^5.2.8 - languageName: unknown - linkType: soft - "@dashevo/feature-flags-contract@workspace:*, @dashevo/feature-flags-contract@workspace:packages/feature-flags-contract": version: 0.0.0-use.local resolution: "@dashevo/feature-flags-contract@workspace:packages/feature-flags-contract" @@ -1873,28 +1805,6 @@ __metadata: languageName: node linkType: hard -"@dashevo/rs-drive@workspace:*, @dashevo/rs-drive@workspace:packages/rs-drive-nodejs": - version: 0.0.0-use.local - resolution: "@dashevo/rs-drive@workspace:packages/rs-drive-nodejs" - dependencies: - "@dashevo/dashcore-lib": ~0.20.0 - "@dashevo/dpp": "workspace:*" - "@dashevo/withdrawals-contract": "workspace:*" - cargo-cp-artifact: ^0.1.6 - cbor: ^8.0.0 - chai: ^4.3.4 - dirty-chai: ^2.0.1 - eslint: ^7.32.0 - eslint-config-airbnb-base: ^14.2.1 - eslint-plugin-import: ^2.24.2 - mocha: ^9.1.2 - neon-cli: ^0.10.1 - neon-load-or-build: ^2.2.2 - neon-tag-prebuild: "github:shumkov/neon-tag-prebuild#patch-1" - ultra-runner: ^3.10.5 - languageName: unknown - linkType: soft - "@dashevo/wallet-lib@workspace:*, @dashevo/wallet-lib@workspace:packages/wallet-lib": version: 0.0.0-use.local resolution: "@dashevo/wallet-lib@workspace:packages/wallet-lib" @@ -2119,13 +2029,6 @@ __metadata: languageName: node linkType: hard -"@hapi/bourne@npm:^2.0.0": - version: 2.0.0 - resolution: "@hapi/bourne@npm:2.0.0" - checksum: 2ea0922101d3fecec43428194c72c5dbe0be908dd7ad07347879dc720820ac410ead79a4c349a2e1726e8af062464160c6d32b6566bbc4c60865923f9d7dd006 - languageName: node - linkType: hard - "@humanwhocodes/config-array@npm:^0.5.0": version: 0.5.0 resolution: "@humanwhocodes/config-array@npm:0.5.0" @@ -3136,37 +3039,6 @@ __metadata: languageName: node linkType: hard -"@types/pino-pretty@npm:*": - version: 4.7.3 - resolution: "@types/pino-pretty@npm:4.7.3" - dependencies: - "@types/node": "*" - "@types/pino": 6.3 - checksum: 40fe67e73d26242d1f741ba62bd57aa4ce34842376878137f16befde3df0dd5ee39c30bc89da3d5e99848f69b00b73010863a740fd469585e0852ea656cb5b7b - languageName: node - linkType: hard - -"@types/pino-std-serializers@npm:*": - version: 2.4.1 - resolution: "@types/pino-std-serializers@npm:2.4.1" - dependencies: - "@types/node": "*" - checksum: a156e25882db9aade2576dbe6414379efcdd4fad24211d3f22f20e0cd4bee569215799ee5cd9b2b15282f18461a8a54573ff42bf6bee5d35b72513be2f78bdec - languageName: node - linkType: hard - -"@types/pino@npm:6.3, @types/pino@npm:^6.3.0": - version: 6.3.12 - resolution: "@types/pino@npm:6.3.12" - dependencies: - "@types/node": "*" - "@types/pino-pretty": "*" - "@types/pino-std-serializers": "*" - sonic-boom: ^2.1.0 - checksum: 801735146669312d02459781e5180220630eaef643da36dc5a9a97520e7ecc3da7270f31a86fcdcb1dc835073c9143fc628024ba5e3a0ea7cbb86aada4897709 - languageName: node - linkType: hard - "@types/qs@npm:*": version: 6.9.7 resolution: "@types/qs@npm:6.9.7" @@ -3745,17 +3617,6 @@ __metadata: languageName: node linkType: hard -"ajv-keywords@npm:^5.0.0": - version: 5.0.0 - resolution: "ajv-keywords@npm:5.0.0" - dependencies: - fast-deep-equal: ^3.1.3 - peerDependencies: - ajv: ^8.0.0 - checksum: 239dd46383a861f9e1dda1f463542ddfa07b4aed886eccb2a4328672c886030b5fdbb7869e0e293ba5549c9b86b23b40fa0e3c0785047e081302f00e41b1e4c1 - languageName: node - linkType: hard - "ajv@npm:^6.10.0, ajv@npm:^6.10.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -3986,32 +3847,6 @@ __metadata: languageName: node linkType: hard -"args@npm:^5.0.1": - version: 5.0.1 - resolution: "args@npm:5.0.1" - dependencies: - camelcase: 5.0.0 - chalk: 2.4.2 - leven: 2.1.0 - mri: 1.1.4 - checksum: 51e2a05f32d15b8e292f000e6b232118df61b8f4fd446b17bb4e99df9ab47fe2c4a01924d7f967a6f08e82f9c19be277b08ed22bceff058aca849144ef8efed3 - languageName: node - linkType: hard - -"array-back@npm:^3.0.1, array-back@npm:^3.1.0": - version: 3.1.0 - resolution: "array-back@npm:3.1.0" - checksum: 7205004fcd0f9edd926db921af901b083094608d5b265738d0290092f9822f73accb468e677db74c7c94ef432d39e5ed75a7b1786701e182efb25bbba9734209 - languageName: node - linkType: hard - -"array-back@npm:^4.0.1, array-back@npm:^4.0.2": - version: 4.0.2 - resolution: "array-back@npm:4.0.2" - checksum: f30603270771eeb54e5aad5f54604c62b3577a18b6db212a7272b2b6c32049121b49431f656654790ed1469411e45f387e7627c0de8fd0515995cc40df9b9294 - languageName: node - linkType: hard - "array-buffer-byte-length@npm:^1.0.0": version: 1.0.0 resolution: "array-buffer-byte-length@npm:1.0.0" @@ -4175,13 +4010,6 @@ __metadata: languageName: node linkType: hard -"atomic-sleep@npm:^1.0.0": - version: 1.0.0 - resolution: "atomic-sleep@npm:1.0.0" - checksum: b95275afb2f80732f22f43a60178430c468906a415a7ff18bcd0feeebc8eec3930b51250aeda91a476062a90e07132b43a1794e8d8ffcf9b650e8139be75fa36 - languageName: node - linkType: hard - "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -4418,16 +4246,6 @@ __metadata: languageName: node linkType: hard -"bl@npm:^1.2.3": - version: 1.2.3 - resolution: "bl@npm:1.2.3" - dependencies: - readable-stream: ^2.3.5 - safe-buffer: ^5.1.1 - checksum: 123f097989ce2fa9087ce761cd41176aaaec864e28f7dfe5c7dab8ae16d66d9844f849c3ad688eb357e3c5e4f49b573e3c0780bb8bc937206735a3b6f8569a5f - languageName: node - linkType: hard - "bl@npm:^2.2.1": version: 2.2.1 resolution: "bl@npm:2.2.1" @@ -4851,13 +4669,6 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:5.0.0": - version: 5.0.0 - resolution: "camelcase@npm:5.0.0" - checksum: 8bfe920e0472d79d34f0279da1391f155bcce7fc74c99b49dafae4f787396040a34f4023da837ab0b4372e63224b460f9524b495906863c38876faea9da53705 - languageName: node - linkType: hard - "camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -4891,15 +4702,6 @@ __metadata: languageName: node linkType: hard -"cargo-cp-artifact@npm:^0.1.6": - version: 0.1.6 - resolution: "cargo-cp-artifact@npm:0.1.6" - bin: - cargo-cp-artifact: bin/cargo-cp-artifact.js - checksum: 2f5d2f3e73372c9d398746372e8d1f7b171f27c8d4e4e9f7de898ead93b29631d62ea26c1ae352fa2c1542e124c2c77ac8a60acc5634bb433133ee2c7c6f1e09 - languageName: node - linkType: hard - "cbor@npm:^8.0.0": version: 8.1.0 resolution: "cbor@npm:8.1.0" @@ -4954,17 +4756,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:2.4.2, chalk@npm:^2.0.0, chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - "chalk@npm:^1.0.0": version: 1.1.3 resolution: "chalk@npm:1.1.3" @@ -4978,6 +4769,17 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^2.0.0, chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + "chalk@npm:^3.0.0": version: 3.0.0 resolution: "chalk@npm:3.0.0" @@ -5350,39 +5152,6 @@ __metadata: languageName: node linkType: hard -"command-line-args@npm:^5.1.1": - version: 5.2.1 - resolution: "command-line-args@npm:5.2.1" - dependencies: - array-back: ^3.1.0 - find-replace: ^3.0.0 - lodash.camelcase: ^4.3.0 - typical: ^4.0.0 - checksum: e759519087be3cf2e86af8b9a97d3058b4910cd11ee852495be881a067b72891f6a32718fb685ee6d41531ab76b2b7bfb6602f79f882cd4b7587ff1e827982c7 - languageName: node - linkType: hard - -"command-line-commands@npm:^3.0.1": - version: 3.0.2 - resolution: "command-line-commands@npm:3.0.2" - dependencies: - array-back: ^4.0.1 - checksum: 2cf5409af0910b9ea3c405814d68ef6134d22849b7f41c32153b807e9f52c67c486472ab042ca96f80cf2e5ab19db830a52ef2070ae189513e6188b6692db903 - languageName: node - linkType: hard - -"command-line-usage@npm:^6.1.0": - version: 6.1.3 - resolution: "command-line-usage@npm:6.1.3" - dependencies: - array-back: ^4.0.2 - chalk: ^2.4.2 - table-layout: ^1.0.2 - typical: ^5.2.0 - checksum: 8261d4e5536eb0bcddee0ec5e89c05bb2abd18e5760785c8078ede5020bc1c612cbe28eb6586f5ed4a3660689748e5aaad4a72f21566f4ef39393694e2fa1a0b - languageName: node - linkType: hard - "commander@npm:4.0.1": version: 4.0.1 resolution: "commander@npm:4.0.1" @@ -6037,7 +5806,7 @@ __metadata: languageName: node linkType: hard -"dateformat@npm:^4.5.0, dateformat@npm:^4.5.1": +"dateformat@npm:^4.5.0": version: 4.6.3 resolution: "dateformat@npm:4.6.3" checksum: c3aa0617c0a5b30595122bc8d1bee6276a9221e4d392087b41cbbdf175d9662ae0e50d0d6dcdf45caeac5153c4b5b0844265f8cd2b2245451e3da19e39e3b65d @@ -6151,7 +5920,7 @@ __metadata: languageName: node linkType: hard -"deep-extend@npm:^0.6.0, deep-extend@npm:~0.6.0": +"deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 @@ -7214,13 +6983,6 @@ __metadata: languageName: node linkType: hard -"fast-decode-uri-component@npm:^1.0.0": - version: 1.0.1 - resolution: "fast-decode-uri-component@npm:1.0.1" - checksum: 427a48fe0907e76f0e9a2c228e253b4d8a8ab21d130ee9e4bb8339c5ba4086235cf9576831f7b20955a752eae4b525a177ff9d5825dd8d416e7726939194fbee - languageName: node - linkType: hard - "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -7271,20 +7033,6 @@ __metadata: languageName: node linkType: hard -"fast-redact@npm:^3.0.0": - version: 3.0.2 - resolution: "fast-redact@npm:3.0.2" - checksum: f4ffdf48f1647dbe0411884e5dca85ebef0762d1ce1937f6779beaea5c83ef7c35416d800b2bff60f1a252b670d1707f9484c9a5d0ef721e68f3dae94b420fa8 - languageName: node - linkType: hard - -"fast-safe-stringify@npm:^2.0.7, fast-safe-stringify@npm:^2.0.8": - version: 2.1.1 - resolution: "fast-safe-stringify@npm:2.1.1" - checksum: a851cbddc451745662f8f00ddb622d6766f9bd97642dabfd9a405fb0d646d69fc0b9a1243cbf67f5f18a39f40f6fa821737651ff1bceeba06c9992ca2dc5bd3d - languageName: node - linkType: hard - "fastest-levenshtein@npm:^1.0.12, fastest-levenshtein@npm:^1.0.7": version: 1.0.12 resolution: "fastest-levenshtein@npm:1.0.12" @@ -7292,13 +7040,6 @@ __metadata: languageName: node linkType: hard -"fastify-warning@npm:^0.2.0": - version: 0.2.0 - resolution: "fastify-warning@npm:0.2.0" - checksum: c19ebccf54a3122877d2248400772ca98bacbabdf97826211ede29246c640d47431a2eebed1f52f9421139ed5e52e42d3bd4aefc46e27b6f34add3507529fd97 - languageName: node - linkType: hard - "fastq@npm:^1.6.0": version: 1.13.0 resolution: "fastq@npm:1.13.0" @@ -7384,26 +7125,6 @@ __metadata: languageName: node linkType: hard -"find-my-way@npm:^2.2.2": - version: 2.2.5 - resolution: "find-my-way@npm:2.2.5" - dependencies: - fast-decode-uri-component: ^1.0.0 - safe-regex2: ^2.0.0 - semver-store: ^0.3.0 - checksum: 93303495659720c55c92e6cd7c430861c722865ac93454eac8b014954db82cfbcbac20826e74d871cef8883d484b2b8dc15a435b8964696bcdffe76afce5ade1 - languageName: node - linkType: hard - -"find-replace@npm:^3.0.0": - version: 3.0.0 - resolution: "find-replace@npm:3.0.0" - dependencies: - array-back: ^3.0.1 - checksum: 6b04bcfd79027f5b84aa1dfe100e3295da989bdac4b4de6b277f4d063e78f5c9e92ebc8a1fec6dd3b448c924ba404ee051cc759e14a3ee3e825fa1361025df08 - languageName: node - linkType: hard - "find-up@npm:5.0.0, find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" @@ -7480,13 +7201,6 @@ __metadata: languageName: node linkType: hard -"flatstr@npm:^1.0.12": - version: 1.0.12 - resolution: "flatstr@npm:1.0.12" - checksum: e1bb562c94b119e958bf37e55738b172b5f8aaae6532b9660ecd877779f8559dbbc89613ba6b29ccc13447e14c59277d41450f785cf75c30df9fce62f459e9a8 - languageName: node - linkType: hard - "flatted@npm:^3.1.0, flatted@npm:^3.2.6": version: 3.2.7 resolution: "flatted@npm:3.2.7" @@ -7794,15 +7508,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"git-config@npm:0.0.7": - version: 0.0.7 - resolution: "git-config@npm:0.0.7" - dependencies: - iniparser: ~1.0.5 - checksum: 99a7e203061fa2bf5a1ca9a888c0b86b2f1d8d104f57ae82cdaf61cf344dc4b67a85250572686d76c70ba0a8e83a7ca4993d2a9efe0a42ea03b5b65ebcaef97d - languageName: node - linkType: hard - "git-raw-commits@npm:^2.0.8": version: 2.0.10 resolution: "git-raw-commits@npm:2.0.10" @@ -8523,34 +8228,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"iniparser@npm:~1.0.5": - version: 1.0.5 - resolution: "iniparser@npm:1.0.5" - checksum: eba0ec2d6856dd1d1cc6c6234c683aee67d923c054c851e3d583f2436bd4fc14b29f9d39f3f94bac9cfa211d8310558c557e1e983fddc82e07ad6a6524cabc2a - languageName: node - linkType: hard - -"inquirer@npm:^7.3.3": - version: 7.3.3 - resolution: "inquirer@npm:7.3.3" - dependencies: - ansi-escapes: ^4.2.1 - chalk: ^4.1.0 - cli-cursor: ^3.1.0 - cli-width: ^3.0.0 - external-editor: ^3.0.3 - figures: ^3.0.0 - lodash: ^4.17.19 - mute-stream: 0.0.8 - run-async: ^2.4.0 - rxjs: ^6.6.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - through: ^2.3.6 - checksum: 4d387fc1eb6126acbd58cbdb9ad99d2887d181df86ab0c2b9abdf734e751093e2d5882c2b6dc7144d9ab16b7ab30a78a1d7f01fb6a2850a44aeb175d1e3f8778 - languageName: node - linkType: hard - "inquirer@npm:^8.0.0": version: 8.2.0 resolution: "inquirer@npm:8.2.0" @@ -9234,20 +8911,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"jmespath@npm:^0.15.0": - version: 0.15.0 - resolution: "jmespath@npm:0.15.0" - checksum: 353bb9e69cc4c1560be0a4df43cb4020abc246e1c60cb5b55dcc76d8c858383f1633faf22ccaf6a5e09568a2077d0f4f1e989e6fcfd496b5cef87964cc8cb9e7 - languageName: node - linkType: hard - -"joycon@npm:^2.2.5": - version: 2.2.5 - resolution: "joycon@npm:2.2.5" - checksum: 930bb748c0ade3b70cca756aa559916a3e0df36b06b0ace629d9c4a6081d235d3d7a93eb7d3094d53ab7a3658bcd5c6a54e4ed235e5f5c03a177597a669081eb - languageName: node - linkType: hard - "js-base64@npm:^2.1.9": version: 2.6.4 resolution: "js-base64@npm:2.6.4" @@ -9689,13 +9352,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"leven@npm:2.1.0": - version: 2.1.0 - resolution: "leven@npm:2.1.0" - checksum: f7b4a01b15c0ee2f92a04c0367ea025d10992b044df6f0d4ee1a845d4a488b343e99799e2f31212d72a2b1dea67124f57c1bb1b4561540df45190e44b5b8b394 - languageName: node - linkType: hard - "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -10110,13 +9766,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"make-promises-safe@npm:^5.1.0": - version: 5.1.0 - resolution: "make-promises-safe@npm:5.1.0" - checksum: 6e59ed8c568b422e4d707d171bf7d9a05ef483bad09749ddbab79e059498572b01e3f58baae7ce49d1e748e693823eb633d3875ae86fa5131242683e71ba73fe - languageName: node - linkType: hard - "map-obj@npm:^1.0.0": version: 1.0.1 resolution: "map-obj@npm:1.0.1" @@ -10587,13 +10236,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"moment@npm:^2.29.4": - version: 2.29.4 - resolution: "moment@npm:2.29.4" - checksum: 0ec3f9c2bcba38dc2451b1daed5daded747f17610b92427bebe1d08d48d8b7bdd8d9197500b072d14e326dd0ccf3e326b9e3d07c5895d3d49e39b6803b76e80e - languageName: node - linkType: hard - "mongodb@npm:^3.3.4": version: 3.7.3 resolution: "mongodb@npm:3.7.3" @@ -10624,13 +10266,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"mri@npm:1.1.4": - version: 1.1.4 - resolution: "mri@npm:1.1.4" - checksum: e65b9aed3b9e423ad4c11f529ab1b9280f65dce8fb476d0da236b5c570ad3322fbbcd2393180855f1474f8b0f982d76ad398766fbd47b8a5ab4069e325d0268e - languageName: node - linkType: hard - "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -10741,53 +10376,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"neon-cli@npm:^0.10.1": - version: 0.10.1 - resolution: "neon-cli@npm:0.10.1" - dependencies: - chalk: ^4.1.0 - command-line-args: ^5.1.1 - command-line-commands: ^3.0.1 - command-line-usage: ^6.1.0 - git-config: 0.0.7 - handlebars: ^4.7.6 - inquirer: ^7.3.3 - make-promises-safe: ^5.1.0 - rimraf: ^3.0.2 - semver: ^7.3.2 - toml: ^3.0.0 - ts-typed-json: ^0.3.2 - validate-npm-package-license: ^3.0.4 - validate-npm-package-name: ^3.0.0 - bin: - neon: bin/cli.js - checksum: 284e7ec9e3d7e643abc3f521e0969ee73e22297b6f7102e9526770b1c9f5a73c650ceef12497eb51ed9818ac2d3f53448ad8ef77a88108dae70a7bae2e131402 - languageName: node - linkType: hard - -"neon-load-or-build@npm:^2.2.2": - version: 2.2.2 - resolution: "neon-load-or-build@npm:2.2.2" - bin: - neon-load-or-build: ./bin.js - neon-load-or-build-optional: ./optional.js - neon-load-or-build-test: ./build-test.js - checksum: 3cafba0e26ad2d343c9c0bcbaaeef34fd646941da401a02bb7307a99095774c4bbbe4d2e168641e50f7228cb933ac9c5e68db390ec7e52dc9d01be99b5a90258 - languageName: node - linkType: hard - -"neon-tag-prebuild@github:shumkov/neon-tag-prebuild#patch-1": - version: 1.1.0 - resolution: "neon-tag-prebuild@https://github.com/shumkov/neon-tag-prebuild.git#commit=a429834da27432b129eceb737e4d2b3f03fa5496" - dependencies: - mkdirp: ^1.0.4 - node-abi: ^2.19.1 - bin: - neon-tag-prebuild: ./bin.js - checksum: 00a16bf27c06e0fa021be8019942490b4dc4f9cfd09b13eda042fdbc1f3873b7d74438f3b0d327651f77b93d087dd6ca5b9497bfc73457d12870f15cff0f0066 - languageName: node - linkType: hard - "net@npm:^1.0.2": version: 1.0.2 resolution: "net@npm:1.0.2" @@ -10825,15 +10413,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"node-abi@npm:^2.19.1": - version: 2.30.1 - resolution: "node-abi@npm:2.30.1" - dependencies: - semver: ^5.4.1 - checksum: 3f4b0c912ce4befcd7ceab4493ba90b51d60dfcc90f567c93f731d897ef8691add601cb64c181683b800f21d479d68f9a6e15d8ab8acd16a5706333b9e30a881 - languageName: node - linkType: hard - "node-fetch@npm:^2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" @@ -11821,61 +11400,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"pino-multi-stream@npm:^5.2.0": - version: 5.3.0 - resolution: "pino-multi-stream@npm:5.3.0" - dependencies: - pino: ^6.0.0 - checksum: 10ddb859836a1d8e4894a408c4bc0c00ca67fe81c2c1aa8ff1534720a5e1ad0261a976239408ec5cdfa5fd7f0444c83d6caa00189efe5cf95b230ed9a32ee6d5 - languageName: node - linkType: hard - -"pino-pretty@npm:^4.0.3": - version: 4.8.0 - resolution: "pino-pretty@npm:4.8.0" - dependencies: - "@hapi/bourne": ^2.0.0 - args: ^5.0.1 - chalk: ^4.0.0 - dateformat: ^4.5.1 - fast-safe-stringify: ^2.0.7 - jmespath: ^0.15.0 - joycon: ^2.2.5 - pump: ^3.0.0 - readable-stream: ^3.6.0 - rfdc: ^1.3.0 - split2: ^3.1.1 - strip-json-comments: ^3.1.1 - bin: - pino-pretty: bin.js - checksum: 8e2e4cdb80c7f8b4df318f30415c98a09f952174a7dd9b0910041f995b8476fc177568e950ea3ce5967303c46356df37d13f822cff99c848e4177c957d3b1dad - languageName: node - linkType: hard - -"pino-std-serializers@npm:^3.1.0": - version: 3.2.0 - resolution: "pino-std-serializers@npm:3.2.0" - checksum: 77e29675b116e42ae9fe6d4ef52ef3a082ffc54922b122d85935f93ddcc20277f0b0c873c5c6c5274a67b0409c672aaae3de6bcea10a2d84699718dda55ba95b - languageName: node - linkType: hard - -"pino@npm:^6.0.0, pino@npm:^6.4.0": - version: 6.13.3 - resolution: "pino@npm:6.13.3" - dependencies: - fast-redact: ^3.0.0 - fast-safe-stringify: ^2.0.8 - fastify-warning: ^0.2.0 - flatstr: ^1.0.12 - pino-std-serializers: ^3.1.0 - quick-format-unescaped: ^4.0.3 - sonic-boom: ^1.0.2 - bin: - pino: bin.js - checksum: a580decd47a1c8b32a846ba1cb478087b523636d697bd4c57833d10b3f2b35c7d06739715ad9a291b41caf002b8d1bbf98674bfb3e99989fd41b7d934cca861c - languageName: node - linkType: hard - "pkg-dir@npm:^2.0.0": version: 2.0.0 resolution: "pkg-dir@npm:2.0.0" @@ -12058,16 +11582,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"protocol-buffers-encodings@npm:^1.1.0": - version: 1.1.1 - resolution: "protocol-buffers-encodings@npm:1.1.1" - dependencies: - signed-varint: ^2.0.1 - varint: 5.0.0 - checksum: 1b22d6d05bbd6249cbfe9a792003945a3a4cb49c2d0e19a4b10ea2a9b543d610fcf244108133f7a5df83479a8e8cded51a33845477c1490361bfbe66a49c64ae - languageName: node - linkType: hard - "prr@npm:~1.0.1": version: 1.0.1 resolution: "prr@npm:1.0.1" @@ -12175,13 +11689,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"quick-format-unescaped@npm:^4.0.3": - version: 4.0.4 - resolution: "quick-format-unescaped@npm:4.0.4" - checksum: 7bc32b99354a1aa46c089d2a82b63489961002bb1d654cee3e6d2d8778197b68c2d854fd23d8422436ee1fdfd0abaddc4d4da120afe700ade68bd357815b26fd - languageName: node - linkType: hard - "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" @@ -12302,7 +11809,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": version: 3.6.0 resolution: "readable-stream@npm:3.6.0" dependencies: @@ -12398,13 +11905,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"reduce-flatten@npm:^2.0.0": - version: 2.0.0 - resolution: "reduce-flatten@npm:2.0.0" - checksum: 64393ef99a16b20692acfd60982d7fdbd7ff8d9f8f185c6023466444c6dd2abb929d67717a83cec7f7f8fb5f46a25d515b3b2bf2238fdbfcdbfd01d2a9e73cb8 - languageName: node - linkType: hard - "regenerate-unicode-properties@npm:^9.0.0": version: 9.0.0 resolution: "regenerate-unicode-properties@npm:9.0.0" @@ -12643,13 +12143,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"ret@npm:~0.2.0": - version: 0.2.2 - resolution: "ret@npm:0.2.2" - checksum: 774964bb413a3525e687bca92d81c1cd75555ec33147c32ecca22f3d06409e35df87952cfe3d57afff7650a0f7e42139cf60cb44e94c29dde390243bc1941f16 - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -12719,7 +12212,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"rxjs@npm:^6.6.0, rxjs@npm:^6.6.7": +"rxjs@npm:^6.6.7": version: 6.6.7 resolution: "rxjs@npm:6.6.7" dependencies: @@ -12762,15 +12255,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"safe-regex2@npm:^2.0.0": - version: 2.0.0 - resolution: "safe-regex2@npm:2.0.0" - dependencies: - ret: ~0.2.0 - checksum: f5e182fca040dedd50ae052ea0eb035d9903b2db71243d5d8b43299735857288ef2ab52546a368d9c6fd1333b2a0d039297925e78ffc14845354f3f6158af7c2 - languageName: node - linkType: hard - "safe-stable-stringify@npm:^1.1.0": version: 1.1.1 resolution: "safe-stable-stringify@npm:1.1.1" @@ -12844,14 +12328,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"semver-store@npm:^0.3.0": - version: 0.3.0 - resolution: "semver-store@npm:0.3.0" - checksum: b38f747123e850191526a912657c653c7e5963d164a8daf99e52aa30bc8c5bdac176dc6dab714e17a1a8489ac138c18ff7161b1961f1882888bce637990442dd - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.7.1": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0, semver@npm:^5.7.1": version: 5.7.1 resolution: "semver@npm:5.7.1" bin: @@ -13073,15 +12550,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"signed-varint@npm:^2.0.1": - version: 2.0.1 - resolution: "signed-varint@npm:2.0.1" - dependencies: - varint: ~5.0.0 - checksum: a9fd2d954d62149d5dcbf7292c028d5665046763bd3e2b68f5603fca9248c808ca727f0b70e8e785d292c40f6a43b7406d56a37c7b06becd3c6ad0972c5d0e94 - languageName: node - linkType: hard - "simple-swizzle@npm:^0.2.2": version: 0.2.2 resolution: "simple-swizzle@npm:0.2.2" @@ -13241,25 +12709,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"sonic-boom@npm:^1.0.2": - version: 1.4.1 - resolution: "sonic-boom@npm:1.4.1" - dependencies: - atomic-sleep: ^1.0.0 - flatstr: ^1.0.12 - checksum: 189fa8fe5c2dc05d3513fc1a4926a2f16f132fa6fa0b511745a436010cdcd9c1d3b3cb6a9d7c05bd32a965dc77673a5ac0eb0992e920bdedd16330d95323124f - languageName: node - linkType: hard - -"sonic-boom@npm:^2.1.0": - version: 2.3.1 - resolution: "sonic-boom@npm:2.3.1" - dependencies: - atomic-sleep: ^1.0.0 - checksum: 4f5022de97483bb6f889415e342f9a451dbdebbe732df454f7d6e417cc80e813c19e2d646ad5ae20a92510a34c311fb9fbc440864bb234b78b3a2100467d851b - languageName: node - linkType: hard - "sort-keys@npm:^4.2.0": version: 4.2.0 resolution: "sort-keys@npm:4.2.0" @@ -13364,7 +12813,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"split2@npm:^3.0.0, split2@npm:^3.1.1": +"split2@npm:^3.0.0": version: 3.2.2 resolution: "split2@npm:3.2.2" dependencies: @@ -13781,18 +13230,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"table-layout@npm:^1.0.2": - version: 1.0.2 - resolution: "table-layout@npm:1.0.2" - dependencies: - array-back: ^4.0.1 - deep-extend: ~0.6.0 - typical: ^5.2.0 - wordwrapjs: ^4.0.0 - checksum: 8f41b5671f101a5195747ec1727b1d35ea2cd5bf85addda11cc2f4b36892db9696ce3c2c7334b5b8a122505b34d19135fede50e25678df71b0439e0704fd953f - languageName: node - linkType: hard - "table@npm:^5.4.6": version: 5.4.6 resolution: "table@npm:5.4.6" @@ -13983,16 +13420,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"through2@npm:^3.0.1": - version: 3.0.2 - resolution: "through2@npm:3.0.2" - dependencies: - inherits: ^2.0.4 - readable-stream: 2 || 3 - checksum: 47c9586c735e7d9cbbc1029f3ff422108212f7cc42e06d5cc9fff7901e659c948143c790e0d0d41b1b5f89f1d1200bdd200c7b72ad34f42f9edbeb32ea49e8b7 - languageName: node - linkType: hard - "through2@npm:^4.0.0": version: 4.0.2 resolution: "through2@npm:4.0.2" @@ -14071,13 +13498,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"toml@npm:^3.0.0": - version: 3.0.0 - resolution: "toml@npm:3.0.0" - checksum: 5d7f1d8413ad7780e9bdecce8ea4c3f5130dd53b0a4f2e90b93340979a137739879d7b9ce2ce05c938b8cc828897fe9e95085197342a1377dd8850bf5125f15f - languageName: node - linkType: hard - "touch@npm:^3.1.0": version: 3.1.0 resolution: "touch@npm:3.1.0" @@ -14223,13 +13643,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"ts-typed-json@npm:^0.3.2": - version: 0.3.2 - resolution: "ts-typed-json@npm:0.3.2" - checksum: 141c976da04b290076c7fdb79cc05429315a974a41ecab6cb78cd63fac832062fd9fd8de8166f52955037874f0bf97d51306e723318b05a22f66666ebbc7ca53 - languageName: node - linkType: hard - "tsconfig-paths@npm:^3.11.0, tsconfig-paths@npm:^3.5.0": version: 3.12.0 resolution: "tsconfig-paths@npm:3.12.0" @@ -14407,20 +13820,6 @@ typescript@^3.9.5: languageName: node linkType: hard -"typical@npm:^4.0.0": - version: 4.0.0 - resolution: "typical@npm:4.0.0" - checksum: a242081956825328f535e6195a924240b34daf6e7fdb573a1809a42b9f37fb8114fa99c7ab89a695e0cdb419d4149d067f6723e4b95855ffd39c6c4ca378efb3 - languageName: node - linkType: hard - -"typical@npm:^5.2.0": - version: 5.2.0 - resolution: "typical@npm:5.2.0" - checksum: ccaeb151a9a556291b495571ca44c4660f736fb49c29314bbf773c90fad92e9485d3cc2b074c933866c1595abbbc962f2b8bfc6e0f52a8c6b0cdd205442036ac - languageName: node - linkType: hard - "ua-parser-js@npm:^1.0.33": version: 1.0.33 resolution: "ua-parser-js@npm:1.0.33" @@ -14683,7 +14082,7 @@ typescript@^3.9.5: languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.1, validate-npm-package-license@npm:^3.0.4": +"validate-npm-package-license@npm:^3.0.1": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" dependencies: @@ -14709,13 +14108,6 @@ typescript@^3.9.5: languageName: node linkType: hard -"varint@npm:5.0.0": - version: 5.0.0 - resolution: "varint@npm:5.0.0" - checksum: 527c65ad87f1d140c03cf734d5c193430ef75fc21b7ec9d2b72f06ee19dbf686be70e0bee27674db3807cedb73ba13ce36a589427ebe52ac620de11686a74c1c - languageName: node - linkType: hard - "varint@npm:^6.0.0": version: 6.0.0 resolution: "varint@npm:6.0.0" @@ -14723,13 +14115,6 @@ typescript@^3.9.5: languageName: node linkType: hard -"varint@npm:~5.0.0": - version: 5.0.2 - resolution: "varint@npm:5.0.2" - checksum: e1a66bf9a6cea96d1f13259170d4d41b845833acf3a9df990ea1e760d279bd70d5b1f4c002a50197efd2168a2fd43eb0b808444600fd4d23651e8d42fe90eb05 - languageName: node - linkType: hard - "vary@npm:^1": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -15049,16 +14434,6 @@ typescript@^3.9.5: languageName: node linkType: hard -"wordwrapjs@npm:^4.0.0": - version: 4.0.1 - resolution: "wordwrapjs@npm:4.0.1" - dependencies: - reduce-flatten: ^2.0.0 - typical: ^5.2.0 - checksum: 3d927f3c95d0ad990968da54c0ad8cde2801d8e91006cd7474c26e6b742cc8557250ce495c9732b2f9db1f903601cb74ec282e0f122ee0d02d7abe81e150eea8 - languageName: node - linkType: hard - "workerpool@npm:6.2.0": version: 6.2.0 resolution: "workerpool@npm:6.2.0" From ad5366d8a7a94174d3abab8b6c85e750d05645ad Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:37:42 +0200 Subject: [PATCH 3/3] chore(js-drive): remove unused yarn cache --- ...shevo-abci-https-9fb519f2ca-aaf41ab7fa.zip | Bin 169988 -> 0 bytes ...bourne-npm-2.0.0-8eeda7e0a2-2ea0922101.zip | Bin 3491 -> 0 bytes ...-pino-npm-6.3.12-19c7982858-8017351466.zip | Bin 11627 -> 0 bytes ...pretty-npm-4.7.3-5ebf57cfd2-40fe67e73d.zip | Bin 3758 -> 0 bytes ...lizers-npm-2.4.1-e7c36178c0-a156e25882.zip | Bin 3704 -> 0 bytes ...ywords-npm-5.0.0-50b946aaa2-239dd46383.zip | Bin 83989 -> 0 bytes .../args-npm-5.0.1-cd7b0f9dcc-51e2a05f32.zip | Bin 14048 -> 0 bytes ...y-back-npm-3.1.0-a52d25f5a3-7205004fcd.zip | Bin 5317 -> 0 bytes ...y-back-npm-4.0.2-f735073f8f-f306032707.zip | Bin 5325 -> 0 bytes ...-sleep-npm-1.0.0-17d8a762a3-b95275afb2.zip | Bin 4031 -> 0 bytes .../bl-npm-1.2.3-49c4213ca5-123f097989.zip | Bin 11338 -> 0 bytes ...elcase-npm-5.0.0-c808398846-8bfe920e04.zip | Bin 3017 -> 0 bytes ...tifact-npm-0.1.6-fe2dd40a8f-2f5d2f3e73.zip | Bin 6113 -> 0 bytes ...e-args-npm-5.2.1-093a68d295-e759519087.zip | Bin 34410 -> 0 bytes ...mmands-npm-3.0.2-782bf8a159-2cf5409af0.zip | Bin 6923 -> 0 bytes ...-usage-npm-6.1.3-145c2dabe1-8261d4e553.zip | Bin 9014 -> 0 bytes ...ponent-npm-1.0.1-578ba9fecf-427a48fe09.zip | Bin 5312 -> 0 bytes ...redact-npm-3.0.2-98d6f1d433-f4ffdf48f1.zip | Bin 20927 -> 0 bytes ...ingify-npm-2.1.1-7ce89033ca-a851cbddc4.zip | Bin 11598 -> 0 bytes ...arning-npm-0.2.0-f9c53563fc-c19ebccf54.zip | Bin 6139 -> 0 bytes ...my-way-npm-2.2.5-3bef2f72f0-9330349565.zip | Bin 42439 -> 0 bytes ...eplace-npm-3.0.0-686bd07d28-6b04bcfd79.zip | Bin 6412 -> 0 bytes ...atstr-npm-1.0.12-4311d37d16-e1bb562c94.zip | Bin 5112 -> 0 bytes ...config-npm-0.0.7-fd037544b3-99a7e20306.zip | Bin 6446 -> 0 bytes ...parser-npm-1.0.5-446fd8dfb0-eba0ec2d68.zip | Bin 3661 -> 0 bytes ...quirer-npm-7.3.3-9e86782610-4d387fc1eb.zip | Bin 35271 -> 0 bytes ...spath-npm-0.15.0-df80ed6dd1-353bb9e69c.zip | Bin 43520 -> 0 bytes ...joycon-npm-2.2.5-fff23ab519-930bb748c0.zip | Bin 6578 -> 0 bytes .../leven-npm-2.1.0-19f0a16606-f7b4a01b15.zip | Bin 3024 -> 0 bytes ...s-safe-npm-5.1.0-7a3dd5a2e9-6e59ed8c56.zip | Bin 4439 -> 0 bytes ...oment-npm-2.29.4-902943305d-0ec3f9c2bc.zip | Bin 1124907 -> 0 bytes .../mri-npm-1.1.4-d22a399f26-e65b9aed3b.zip | Bin 4826 -> 0 bytes ...n-cli-npm-0.10.1-f6ee1b3cec-284e7ec9e3.zip | Bin 47566 -> 0 bytes ...-build-npm-2.2.2-548a286943-3cafba0e26.zip | Bin 27915 -> 0 bytes ...g-prebuild-https-d665d28b1f-00a16bf27c.zip | Bin 3610 -> 0 bytes ...e-abi-npm-2.30.1-36a2c4e28a-3f4b0c912c.zip | Bin 11352 -> 0 bytes ...stream-npm-5.3.0-ecb9b754cb-10ddb85983.zip | Bin 14105 -> 0 bytes .../pino-npm-6.13.3-50e2aceb53-a580decd47.zip | Bin 106140 -> 0 bytes ...pretty-npm-4.8.0-0c822e28cb-8e2e4cdb80.zip | Bin 198096 -> 0 bytes ...lizers-npm-3.2.0-9fd67503a4-77e29675b1.zip | Bin 10077 -> 0 bytes ...odings-npm-1.1.1-07111209e8-1b22d6d05b.zip | Bin 4933 -> 0 bytes ...scaped-npm-4.0.4-7e22c9b7dc-7bc32b9935.zip | Bin 6008 -> 0 bytes ...latten-npm-2.0.0-01bd4936fa-64393ef99a.zip | Bin 3546 -> 0 bytes .../ret-npm-0.2.2-f5d3022812-774964bb41.zip | Bin 7562 -> 0 bytes ...regex2-npm-2.0.0-eadecc9909-f5e182fca0.zip | Bin 4317 -> 0 bytes ...-store-npm-0.3.0-0fc88fd5b9-b38f747123.zip | Bin 5356 -> 0 bytes ...varint-npm-2.0.1-18301876e5-a9fd2d954d.zip | Bin 2747 -> 0 bytes ...c-boom-npm-1.4.1-e42b921f99-189fa8fe5c.zip | Bin 11840 -> 0 bytes ...c-boom-npm-2.3.1-0ba04b648c-4f5022de97.zip | Bin 13951 -> 0 bytes ...layout-npm-1.0.2-0b3fe79240-8f41b5671f.zip | Bin 11610 -> 0 bytes ...rough2-npm-3.0.2-403f837012-47c9586c73.zip | Bin 4856 -> 0 bytes .../toml-npm-3.0.0-f993270804-5d7f1d8413.zip | Bin 26316 -> 0 bytes ...d-json-npm-0.3.2-6ec963b162-141c976da0.zip | Bin 6888 -> 0 bytes ...ypical-npm-4.0.0-2255d8d515-a242081956.zip | Bin 7391 -> 0 bytes ...ypical-npm-5.2.0-d4de46c932-ccaeb151a9.zip | Bin 8215 -> 0 bytes ...varint-npm-5.0.0-c2491b868a-527c65ad87.zip | Bin 4988 -> 0 bytes ...varint-npm-5.0.2-fcb43e79c5-e1a66bf9a6.zip | Bin 4988 -> 0 bytes ...wrapjs-npm-4.0.1-b6c3c84d76-3d927f3c95.zip | Bin 5653 -> 0 bytes 58 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .yarn/cache/@dashevo-abci-https-9fb519f2ca-aaf41ab7fa.zip delete mode 100644 .yarn/cache/@hapi-bourne-npm-2.0.0-8eeda7e0a2-2ea0922101.zip delete mode 100644 .yarn/cache/@types-pino-npm-6.3.12-19c7982858-8017351466.zip delete mode 100644 .yarn/cache/@types-pino-pretty-npm-4.7.3-5ebf57cfd2-40fe67e73d.zip delete mode 100644 .yarn/cache/@types-pino-std-serializers-npm-2.4.1-e7c36178c0-a156e25882.zip delete mode 100644 .yarn/cache/ajv-keywords-npm-5.0.0-50b946aaa2-239dd46383.zip delete mode 100644 .yarn/cache/args-npm-5.0.1-cd7b0f9dcc-51e2a05f32.zip delete mode 100644 .yarn/cache/array-back-npm-3.1.0-a52d25f5a3-7205004fcd.zip delete mode 100644 .yarn/cache/array-back-npm-4.0.2-f735073f8f-f306032707.zip delete mode 100644 .yarn/cache/atomic-sleep-npm-1.0.0-17d8a762a3-b95275afb2.zip delete mode 100644 .yarn/cache/bl-npm-1.2.3-49c4213ca5-123f097989.zip delete mode 100644 .yarn/cache/camelcase-npm-5.0.0-c808398846-8bfe920e04.zip delete mode 100644 .yarn/cache/cargo-cp-artifact-npm-0.1.6-fe2dd40a8f-2f5d2f3e73.zip delete mode 100644 .yarn/cache/command-line-args-npm-5.2.1-093a68d295-e759519087.zip delete mode 100644 .yarn/cache/command-line-commands-npm-3.0.2-782bf8a159-2cf5409af0.zip delete mode 100644 .yarn/cache/command-line-usage-npm-6.1.3-145c2dabe1-8261d4e553.zip delete mode 100644 .yarn/cache/fast-decode-uri-component-npm-1.0.1-578ba9fecf-427a48fe09.zip delete mode 100644 .yarn/cache/fast-redact-npm-3.0.2-98d6f1d433-f4ffdf48f1.zip delete mode 100644 .yarn/cache/fast-safe-stringify-npm-2.1.1-7ce89033ca-a851cbddc4.zip delete mode 100644 .yarn/cache/fastify-warning-npm-0.2.0-f9c53563fc-c19ebccf54.zip delete mode 100644 .yarn/cache/find-my-way-npm-2.2.5-3bef2f72f0-9330349565.zip delete mode 100644 .yarn/cache/find-replace-npm-3.0.0-686bd07d28-6b04bcfd79.zip delete mode 100644 .yarn/cache/flatstr-npm-1.0.12-4311d37d16-e1bb562c94.zip delete mode 100644 .yarn/cache/git-config-npm-0.0.7-fd037544b3-99a7e20306.zip delete mode 100644 .yarn/cache/iniparser-npm-1.0.5-446fd8dfb0-eba0ec2d68.zip delete mode 100644 .yarn/cache/inquirer-npm-7.3.3-9e86782610-4d387fc1eb.zip delete mode 100644 .yarn/cache/jmespath-npm-0.15.0-df80ed6dd1-353bb9e69c.zip delete mode 100644 .yarn/cache/joycon-npm-2.2.5-fff23ab519-930bb748c0.zip delete mode 100644 .yarn/cache/leven-npm-2.1.0-19f0a16606-f7b4a01b15.zip delete mode 100644 .yarn/cache/make-promises-safe-npm-5.1.0-7a3dd5a2e9-6e59ed8c56.zip delete mode 100644 .yarn/cache/moment-npm-2.29.4-902943305d-0ec3f9c2bc.zip delete mode 100644 .yarn/cache/mri-npm-1.1.4-d22a399f26-e65b9aed3b.zip delete mode 100644 .yarn/cache/neon-cli-npm-0.10.1-f6ee1b3cec-284e7ec9e3.zip delete mode 100644 .yarn/cache/neon-load-or-build-npm-2.2.2-548a286943-3cafba0e26.zip delete mode 100644 .yarn/cache/neon-tag-prebuild-https-d665d28b1f-00a16bf27c.zip delete mode 100644 .yarn/cache/node-abi-npm-2.30.1-36a2c4e28a-3f4b0c912c.zip delete mode 100644 .yarn/cache/pino-multi-stream-npm-5.3.0-ecb9b754cb-10ddb85983.zip delete mode 100644 .yarn/cache/pino-npm-6.13.3-50e2aceb53-a580decd47.zip delete mode 100644 .yarn/cache/pino-pretty-npm-4.8.0-0c822e28cb-8e2e4cdb80.zip delete mode 100644 .yarn/cache/pino-std-serializers-npm-3.2.0-9fd67503a4-77e29675b1.zip delete mode 100644 .yarn/cache/protocol-buffers-encodings-npm-1.1.1-07111209e8-1b22d6d05b.zip delete mode 100644 .yarn/cache/quick-format-unescaped-npm-4.0.4-7e22c9b7dc-7bc32b9935.zip delete mode 100644 .yarn/cache/reduce-flatten-npm-2.0.0-01bd4936fa-64393ef99a.zip delete mode 100644 .yarn/cache/ret-npm-0.2.2-f5d3022812-774964bb41.zip delete mode 100644 .yarn/cache/safe-regex2-npm-2.0.0-eadecc9909-f5e182fca0.zip delete mode 100644 .yarn/cache/semver-store-npm-0.3.0-0fc88fd5b9-b38f747123.zip delete mode 100644 .yarn/cache/signed-varint-npm-2.0.1-18301876e5-a9fd2d954d.zip delete mode 100644 .yarn/cache/sonic-boom-npm-1.4.1-e42b921f99-189fa8fe5c.zip delete mode 100644 .yarn/cache/sonic-boom-npm-2.3.1-0ba04b648c-4f5022de97.zip delete mode 100644 .yarn/cache/table-layout-npm-1.0.2-0b3fe79240-8f41b5671f.zip delete mode 100644 .yarn/cache/through2-npm-3.0.2-403f837012-47c9586c73.zip delete mode 100644 .yarn/cache/toml-npm-3.0.0-f993270804-5d7f1d8413.zip delete mode 100644 .yarn/cache/ts-typed-json-npm-0.3.2-6ec963b162-141c976da0.zip delete mode 100644 .yarn/cache/typical-npm-4.0.0-2255d8d515-a242081956.zip delete mode 100644 .yarn/cache/typical-npm-5.2.0-d4de46c932-ccaeb151a9.zip delete mode 100644 .yarn/cache/varint-npm-5.0.0-c2491b868a-527c65ad87.zip delete mode 100644 .yarn/cache/varint-npm-5.0.2-fcb43e79c5-e1a66bf9a6.zip delete mode 100644 .yarn/cache/wordwrapjs-npm-4.0.1-b6c3c84d76-3d927f3c95.zip diff --git a/.yarn/cache/@dashevo-abci-https-9fb519f2ca-aaf41ab7fa.zip b/.yarn/cache/@dashevo-abci-https-9fb519f2ca-aaf41ab7fa.zip deleted file mode 100644 index 0f04c9d69a2c5a41197626a30f4f505ef7624027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169988 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

7^zDCKQL&Ted}C!g5NeYsrE`M>ySFA-Pjas&{~ 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

SLjA8;M$Le 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篛Zm*xe9h)&8{}SAY8~DY;fYye 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 I`?jzC2ivxp{{R30 diff --git a/.yarn/cache/@types-pino-npm-6.3.12-19c7982858-8017351466.zip b/.yarn/cache/@types-pino-npm-6.3.12-19c7982858-8017351466.zip deleted file mode 100644 index dfed8ac6e729e09e16710b28ee155f05594ef7f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11627 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 diff --git a/.yarn/cache/@types-pino-pretty-npm-4.7.3-5ebf57cfd2-40fe67e73d.zip b/.yarn/cache/@types-pino-pretty-npm-4.7.3-5ebf57cfd2-40fe67e73d.zip deleted file mode 100644 index 98c7a35e627458e147fe943807e63d6e0e3404a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3758 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 diff --git a/.yarn/cache/@types-pino-std-serializers-npm-2.4.1-e7c36178c0-a156e25882.zip b/.yarn/cache/@types-pino-std-serializers-npm-2.4.1-e7c36178c0-a156e25882.zip deleted file mode 100644 index 31a47a212a2b3086718f0d7ca1e2ce84cefb39a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3704 zcmb7{2{hE*8^?zsV=NheYozRC3_?wmos2zuc4NudnHglw5?+#>8C%(9O=QUuQfRR! zTegfflx?#1*ZaQS{&i08`FDTk{O!O^C*H)MLHnlqhZ zc9+82=_(ZNI9C<9Jr$>|cFb4pyEDJX#s;|0a0)zz7sM6vmvVZidb?>WhRv^%tBu`c z9v4GST4uQAVh3VxKDuz|tk`m57!dk-?h`Hlq*mW1D|?gJ)ZJd1GFd!zPN5)Y;VN4MYKx`-jMZ%A(0Y3+DGPdH#AroeHChv zpyM_wCN@gBuAk&VJTW=b=1!mB-TTIZsL-}*Y7V`XH*0F*TZq32An1Qu}iux6OM z#co~{oFVwKxUigG5biru4oMGALp^0B>?~d;6Yt)RdyWiG+8eM-^b@6==y73y%` za9y+X3z(_2)i=IXYawRbv4!&axh9JG6NW3(wMB-kpJX4;XaaS4rLGO#o*HI0uy8iY z@x9H96#7HkV(Qsdq;TRwrq-u$kb3z#O^UN1IGcE#%aqC-LNqyNr6ZoN+$@X>@hx#2 zaj&jaSW?q>x~#gvN>pofm2kGLoEbLr#B`>R z-y?`xS%_Y*^16)3!_$!8vk21ni6rn=` z0N5NI=kvdFly#Nml{A%MF1FbCR_!)Xmgj5g+p_*$FeE#W7U?BQ4{BG^_T=WlEMFAx zav7)qc38UAvJS#yT`VT|wwgd$jFXc_UZpXK=%m(_L>*2#P5z;@D#; z%dB+Gdi!D2ZD&Jji=p_kXI24pWZ{H0=h!$W0*)9mcf}nVMz2XLpDnyO()y3$z$W1;6QW~_#-p}q46aA0=JhKgQMjJ8VL&KIyU zVK;sKGOta&aa2N1Hpg;UWHBzub{W}WI-5;{blvTC_ zgF>;m%?@5(*cc|0d*Rd8Z2Gl?mNLVWxKTmdAtw7Y9(8N+i}&&zlfML<d0mv-YPh23=(qvf;W1?@zA?#k83a9WAd2Xk-L>Z70W+TZRwjRZHmNa_gX8_Ey=y-X)&osw_Q!NlW2G{&QW`6h$8XtoKjpPYiMO z$e*J^^T-U0dq~Ac>Ucgj>%T~Fp8jYXim&Mt@k4SE5g~+_bT)sCfUtA=#5wl@#VGq_ zR9L@akg&Q=k_j;IQJQ?VLGUOzPnESQu9BZ8Pl>TgNl|4%;F(IV4|@t5p-0a_f+H@f z1LgiXErh9bQU-Z_V0VuJ2koiN`cFQ3aBG8kz2<7b6Aumu*BDu>|Ln_RDt zU460)jfSE3YpW--kT!dV1;w_o+Tc(4#B5H^doitD8J8D&D#VKTtogo_+Sl+r^1mVI z7uJn=Em`uw;EC4Ibuox%wtY-lx#C$XD>b~m34-u?ZojE1j90a!PfGYoi&V@MPnI#r z6SxBI-z(FGde2^>e`3lS@@}{FOmAGT_{iSgo@ud0y5K~a;aBGysJFAsukEu_+4bV- z{~$Z?n8B>R;xkaH(su8s)vO@4yPUFB)>4Vm*^(HHSe>8LFMWL8D4J+jk)k2UC_K#! z>8vBgFhWpfg3<3X^xonw41ZZlF}u#(CKPak8maK6@Vyx_Gu;0C#Ae>EYFT-8VbdTb z#S`i`5LJA(t{Fu`tqYWg*Y#r-By_fqRWi2>`4FpKTIB%sv<&fTh`BK5;=` z;wI5O`VKBIFBae{Zz`Mz#!TexJP-5I$_%?T&-34aotc@_#*Q0!PUErF z4I}9~j~B%TxcWDaG^uoj=o{zmwGa&6fiRG|QTFXq8I1M!Ip_;j;RKVaoKGJ*sd_#{ zmcxA5Xb$3Y=h_oY5}yMfmA`b#UrbRYuG5ve+9-ObEf87kmK~s)mG{{~5-{S(v=c0X zz@V=?Mj!!?%-Xi;Ap^crWWq(oC!-`C)$NSqmb%&|(&5-me+-N4>P!Z$km9cEWV+XK z-@CdcS(oGpzd_TbapOH%5o{swbU}?wo`(<8cXKVNv9>>2299dhI0RLfe6>pVF$K2Q z@5=TD?d^IL?N?Y{&)GHKCU#DmpW0d@?q+fw0DnxK`0auvx1+0#0SEv{{!Z$2x3+Pz zzF`M*M7y~L=xS;|6QyoiGt$4pHB`Pbik0RJrelwbV=<$PkU$va!X6|r^l2Wf@hnoj zCwtXZIazh!eCEd8K$xQ6k}Eq=MUpW&ko-&wCn1#u{<<1C+QvWIiu||k2f_burhfsCO@)3o{ijy=wexS)!f{)X zH$NKw;QVjGFKUOsu*Z_?=j!1Yn-`q-JJ`Q#iR0fsrvEJHzSG@~;^6;Y^gr_MXa3KE uUsv5q?ViEkK+qsQ<_=u%UE`}!|37`eIF*c<-iIba~jKR%+!rFqO37zl_P6bOj$e|+wXxR8jnf{2#9Wb`TnV&}6; z1pB$f%)Q-l4qJTkfO#nK5X}K5ve0@k=790c{gMk=b=!u7m?_?t1@4@hsyIlC#Tg>a zx}M#X>ZuHU9+xB1MXJZ+&!;gq#3=}_cK#C==XxLSHouzLC{YamTaad;kM}P0wwT`u zS6TgDO=%x_K56mbSpv@pMS_xZfrCD3m2YeZgUnB7WA{xg6G~k@yOxNCkI~K(J`OGn zLsZyIigNXH#%*riv36?-Ki8cGCvV6QRaAH!f@iOMhoqx(e#6zPCyc5ji~?Ps{&AGV z-5%xP;>ZT(FGCIqD?arBC1wgVs?*8iXOlwtoZC{{H0d;F?q&utD+o(bI9bA8JU-!a zr^)d4^h3hk#zwu+qKxCTE0_@!<&?5N#g{RC1NNvDyLBQ97fmLvlzn8Bd}&wNBu@YmLP~eVS0WF&nhWEJG=KN8L0?1 zAf}}EDG91@{t&J;Hc`yiLTyF>UA+SN^O101su-e5C^bw5Hg7v*rEEuKKMtXx|Ix4# zQZi8|9ba|VzlJ^j{|H}0GY7~2A!exm{lkVv#%9)Lj%GI2e+?p_*TC114?sXhAV5H$ z{@xqu*y~xF7}1$KcqvF(^ztKi9I3!+#6adw8<3nA@SsxBE@n!^vP8AAuE5o`Vb8og zSo20OCc=ZV+8E>69G)|kA=MKiVX@wCqH9Eq+kT}cyv|SzGlb_gE+NW;=st9qM`@^M zto?wiH)Ih00kam;&F8G5JR(9CdC{~`v+^2B;1uzGTmMmJEi(xyPx#Cvd8ihI}_fnP~^91PGh(O@(N`yJzJ=t(zm=wPqh&G6$cu z#D~tgu3pk&qCpt44-pg1>a4UpRI~|whzL0i)V8qf-4*;PE4Z6Q7kxlE{G)UwC;b)L zfQZH>HZELMFeIl#>RK9ATA(Lm@-ff_7gXkkbSN~B^ST*zNwix>-(Z-}!^SL)vh4Pi zth5KGpHIVsF(oNNfOZvT-Z+}D*0+h^c|4MfofNUyDPtTG&gyvBN$HzRYv_f%JFwMY=vE!Cfsy>caVqv9i;`pF*bnp zcO%cy&DO{P;2p3Y0q9-^M6hWu8OHudLGcH48{HbnN}(@Zaq?+;#zg4X7oA6?{_`Z{ z4qgr|Q(}kY+&5uz&_b4Ldwn8bH0%laLzou8Dhud4_T=qI;-P!^kuHwVYxx`66T^W|1JYFOHLKZoQ;fV=RvnUlEO4#rO?v!Ey^tEbpfufUz6_*BjzGqrZi79dl?A}6 zCg9w?sqt+4RF>s@%8X#}$HYtzxFI+6qf4KJeQ4g`XZ6P)-P4+8pEQpnV?hofP$jj^ z?rw&R96X#l%IVXpbVA4Q+Sx=ht1^@^tX;GUt+Fop#Pu-}uH>oN*U0hwgl`!hQ&$;g z^6eyaBYdMo@Wn zg`>9mJyX{~!_*rr4sTbV+@&i#kWq0hLCS3z_it8pN51Zqvgx~13UQz`e>P3OXcMFqo~Hb5BfW7G3aQJe%&O%~s-c#}0#_J`S)qpxI2*~9`I~#q!2I%*QQrwYv z0Za2S}dI=d!$BHsB+-%$xmS|OWm0~^|f@K)KyW2+ApI!b$EJK8JT?}X=j ztu^%nVA5QGY5#7FSiAixMzo^kEcysggSKALFdzo_8P8a9&Wxg|ae{atzO6ea32!Kk zNvyr|TGiGo2ErVzU%Kwk5I^#_!nGSih)jQSw@vD$wpKa=Dd!KgIoGT43)J; zGhNND_`tYa>5CHJ2q}~=H)@OhRivv?>#WB2TRA@%`Su3pKv|h%iCXKWj)!Hymn7Cl zfkncgyzZ@+dL7^{k!zz-_F`UrFh8Q+f?_p`NQ7y`H({w|mZ=kbgoyz|Xu2`CSPbU& zzV?(Bjj;4m=*n?BW@eVOu-E6W*w?9WOL6w<&CH`WQ0i>k&-|YAsN>Trc(lh`{$1dJn;v4m~enV;bN6I)qoMNh#yI&}^-QuM1 zYjrXEh0+zYtllSBh$?gP2H;h**j`G%D_Bk&V+y(ubmy6i`YYN(TYRM99Z=zMd6KMb z$=E=5Z;NVY8d>?B@EIO#Hu*oHv|A&Z1AtOGv)FlcH3-c}kC&_2>|$%7xL+t0m%tn& zBgax$wrmiceV^a0x-u5aX%Cpj!q`O`lCc7P-5W_V{ZvXb^sXylz@kC2kq}I)uw|+&K3Pl59+vt^N6M;qUw#opS@F($%SfWGO#FU*}5>bY%ZA2(D$1jyA z{-S;*iYGqHw+xki&x!V0Ht>%NJIybQfnodX<>edibMx&d~a)%;Q4!qL1vkD16h5=0#Y_Z&GD zzXf@~ayA^p;fs}*gnjoYqy-PCTH0$ijDqr*aQRS%>^Ml`d7&oy#)@YWv(Y}y2t7>J zv(bR}$k_=Fy^;3lCwy{f{pQUjg#xnbNIB$Tl))_5B431u3cVRLxK^FM$hp~%Xar^{ zkg*A6BvAwN(XAuh72Y|ZCg$m7E7EBtH4?6PX@hO}`mX)0E1@y2Nk3xY0OD;1CY6SZ z7QPV;qW0QrEvgL_zCSjUoXr(1DpQ}wGdx7S>iMImg3jkiJo|bQXv0aS(Agys_kQv1 zSvX6V$$N8*noQJ-EYfS4Zr!`NA0KCO<*~RKD6f@%zIk@Rzaz!fNkfyp1OJZqvX}Q# zH~=GG{_j}%pWEht1H032d!9ttQqt)_8eQ0SOTV$Q!YbKeUhCO~58H`yet2+q4BKT# z3I;N+|E+RErs4_-&8JB0h{iW~7os0{=Gkvr9LtsjO5QUjw%omR5fv)#pq!>7+c5&% z=w8((6kiR#syk}X3PrWYIXT|TPL!-;@AL!%y4*%GBkw^)SE=U*!Zbu_^JrGTJPRTAoXh}kRp zxDdDgI!eF`2A8tH-KOdxs9hfx4+O9HY z-eA+WqY!tg-Hg2ehOOUi%tmFNP6FVR20)pO^Y3%YpSC_HMJb20KN!VX5x+kIW?})a z>Dzsr8Me%9rWG1G1O|zcx;{7T(|MvV_7|-T-3K$i%{8<#8h_Gw^8Ur1y(wZc)Pm## zn=97vkhCw8>aV`7yY$;jC zFxz=X&aKO*7t0@k4T6NVSg4Vrj3x$x%$kh5LP`N$VCIhw?+j(>xbjlQSNax&{w#^k zs67DVH#tAmE447tZyJF~+V!|Z8w|beKcU`%TG$~`uzA?{)OSFd?+;pENg1NG#cw|J z&FKOUKT*)Zd!EpeH!4AxYx!1W565Yyz0JvY0-S0kKJ%ha&9XG_%RU&s0YzUP#p!Gi z^AEH{E%35^<%78C@#kCeDP8Cj2|bz@h^5$P{dp*o%1PP zs6m_@YQ_bT!fMp5mUcH=@wRlqB+TTgjNRj^RIV0E(l{GjTiXtgl% z)W&kTG11I<%6UC8O-0}Pz$0xEL{oAKQvrd=^;su=zTTW?pGh11s_wFN*NJG+iNR;FT@Sc2%Si`@VZs`LnywUEjC!vd>-S`UF-!fO&e+%AwZs`%}I=~b57 zy_4_8t*0|JDEEI!GZl_ol7C5sCBXV$6fu5_?>_dv1ebythv2$M(+rd2@HQ)>Z1;!I^a?RXxgw_UhwFlY z!CQ)w4_W1`rmva1CSlGN1boVdA9+5{fc?r+ZS{>7k9*u=LXE>O1=JGmoXYL5UCm8m zktc5{B?_?V_;g6lbh>^p=6=LdWJ8RFp}e$v&#B1oGI)}YCd(@5X2X!03>hoWqPjLZ zi%vgM*>~>OLWC8;sb@368n9vzu%MsXJ+|Sxt61OK32Y zuNe1D6zF^P)p4xEdaVBN6ez#oSiu-mE6A_uzj}A4qqZInJG+;2zrL8_3#55*Os`8!Ek^uU=TgVBz+1HIutQm&{@*$mm;Rh z%$gW^Qj_)ORg>lALr6`PC|s?%AZ>6d&>0qGAfzQI>12UFGVtHaG_TDW)4S+fnyo@? z@f6w#moRKlM_OTnd%8a-Xjbu$Wxip3qgj`S8U=GhLeuUHeBE&L?ei4y=Cd`o_Mlb3 zIQ>kS5#3JMm7^52wCb_7efA!$64&^0v>|wI@|b7@u}a9cRO}f*^Q72FWHRto_Dgn^ zHrynFoA=l`Se0J9tmHhV9rbPGH-iP(L|;;chuT^}ab%$Gy#RDq1f-X5Huwp~+X!pG zZN)%R&x5I!yt-$N0qYY9dD8oZt$Vbu$I447c26*9xPEL9hGogcP1R>(?wPo{#LJ4R zC5Q?G9hwI{`gv)Umg)grq<@N)4lLDdDP<&-&h!uVGN{1MNT#5C_fw1t>vyqqxg zh8+HnAjJk-;@`{*#4nZzqlAYM)Ifmiy73`XF8&m|bW)<1l0fr}!)7FRIV?JGw zd=3i0rDuTkzu3$Fi%r=wxX9Zg(tJ(BvNB8$SC%%TbGhFGLg&Hz=b z8@L?~(nQ%fa%M6hz5ZCKF8%cMd$O?;U&A9_f`|nBlnGm6T(f6`v-Y5Akk;uO?V?@M?rfKSAw^i&9|2^V1u*d6Ou&p>4J@4;%$$wn|Ff;46+K}NsHO#8x`&Ab5eUVcERg+} zH4u`_Hpv^sQRzuqPc)Q|YxgKveho*Y8J}dszCK3sB*+7)TFHk@9fZxxy9)I{dj`Tm z+}UtdtsszbtE1oc4ECz$#556rt)$)VC-~TlXqLp3{#k#&wg<|UOZ57b zO3OUy;&$zWQ;eArO=k>FY;RGwf%j^a-}~olr_p3Z{2G6Lq#gPBFI?Y2KIL16OnCk5 zm$DLgM1srNu1(i!f9&BLZ-k|7*Tja765SBBAzPpLGLa;)l_WgjIuUHa(}MX%GkOEx z9-ePkHaN3<;q*}dltqJ}4R8MP7m1JTOoI&zu;u|^{VxhH|Ag#+GpCd6*e`RoKU1Tl z`GX1+s^Bzz+gzPSK3*xlCrhj$RY71Q9O+WA*9?;)1_i0BW5!0ZK`LjiwI`7Q*UP3c zTC&*7v?cfao(*)$TM)DWO>{Gm-tz>@RYmoyU~rP!L+NJ=C>T^KYQiHr&saO2YZzW( zVhwMD=69;cTISQaAzyqK4M^P6BSGuL+Q_pL4GY1vTH=2zALew0&Am(ZW5(O*y~&>) z3C zOQq|3QjGsxRWeMEVR?ANeKKh8iTp+^Hpf-Hng-35ds(pBWup_;63Uk3lKcJ_R+wCh z+W-M5d|imYUCcMLHZ*em)h1HXuvlY2^?s;gZf`)8_KG?#H@@Wq&9lggbp zyjB-bM6R{oo&?B=!USctr_3Uqi1H6_sy^tq+U6Sha8-E^wsi zHtRyio6nCk6z}$%I8nYXL%-=?r}enElSjFa9udRU7%DYj4Id<+S&(7&+M~n96S^xzE7&p{I2cktjqjBlORc}-eayE;eS%`=%}Ax zW8a}C!B^c*+^pT(##@ka&l_7JQr7!0NfD+8Ja-HO@OhF&)8EQ;K(p zIvObV>!pyk#PhUNEjWX?06tXRcl6h+BPmwR9X>b56pAxj&+hvw#R6$V14jm};S6II zi@5&CtUD752(s7@}D@8*NO(Dh=8V$rPhhzJkY6y z>`%f5FEg16s*SmlFkID(bYH0@XI{r|@7f^2(~3$KgfxS7b#(zL%#ed|G&Ey*9R#XX zMsw!1_|?djjn%-`_yvAxILG%tPPv1ROp4Q~%IBe7^TseUiLSz@IkB@Vmu))HCo1T) zA{pDy5mkFps_kR+$M86hVtqQT8&#L*@x_C-#G1tJ`>&T9SYdQAC>yV^J>Jc}%*AeL*aNdCCIq{k!AHyi)H(SM+aZ z#3vvW+})x?Qt2Bd8M7f~6uMXD&~I#)0;A8-y?59+9&B}fH^nEH8rZ5!MQY%t<|UT$ z62z=5WYE#9*O0wj9_BNsBpPY3`Cm@@DT%4RU|X_^eWif@bXYpFRc^Q<$*?Nt*OY5j z;NJZFW<;v=b;!|T_H%vLUr=C<6Lg3MV3uP5voQR76#SFC{|Sdg9g94E)Pb#6R1AzT zzwEQ`fwlBrYO8UiXS@()Y$u=@HMitAX3rZgxu1{BG2oE(E-rCJJC3l`BeNrSQ=r&- zIFzclZfoO4xwi=$g8V!}$ElZWT_BbmxJ#?H_dwv44TB{=$Wh*+wL@%sLq{r|&nlfs zONakdJ8bMmdugr&3UGnEU8FLcm^~u19lAdVO!=zy73QVDFlclhNxSmfq6H*Gne93E zq?ul4zO`U?f>r+3b4P=3jUGUh=JMik5 zagWtgIMb$2akv%R5S$KxgPdZC`ANcY&odXx8_0ewAR}I9lfOyqvaRdRBj<68Ql<5w zPrzHD>A=Xkqcx9B;{FbLtC7=el3!z6rzgE7A4wy={cx|hHXfi6kUkl$`kqL&G+CIT zdQPDGx*XcpQ*T`=w1}00m|$){Va@EjXllMfa!Xu9mR}zIsp4M1(A$;rR%v+IXICOo zyBHI0FBGS?&-9SuNF;E^RL(j9m{n>f^pYzxHeEK1l_gDBUjhLq+l!CLETq;fM4|Is zZ1Lez)(OA;V$NB^LF%O8n2aLLMr&Pe&pgf(z%!#)92Hb_Q9jNx51RX~Uu8Jy=1%c{ zm$YqhGSRvKh*1Md-t7M#Vt+1qn^`+J>RB5Y*%<%Y!4xGG*8Ug{vs}QlB#U2T0*AT}`W|_5?k~7}|cd zWOv54+x#eBLhc&DTdhA9oycQb^#V^RL6xSoKFYp=IfIzwdV0rvUVaK`Jj(W}teuVI zHVz>ga1#9Z2+0muzOhCg&2|wjwBi*hguY031DV=)i{vBr(}S7qx{HsZXf93fcUzQ) z8RA2W;1iVS7rgc|4bD5WYqpnan|pI}n!>XLR0V1zYB@C${rEm_yZ36Pcc_pUc(4u} z@iX7+j1g34Bq5BTmxP-l+Io>sVT7&SMaarhza@hQSR(dheZUv^U@t1_=u(Wk-r%*% z&jsZ0o=3wh@APIOijJh#S~wUq)fIq|4FPuRm3Bzc(|9td*|bGB{X9~`OMQL=`*SaB z@x*&HYvhhSm@h~%#`z07XkX|G7wgAl;vXw*rvVW!>64p^mT?H<(CVjbXQ|PcJ_hcf zotS()LM*r0`*j{}!OR7kuTWl|z}gF>$`r6xX}GU2SXb*mywq}X${Ih-feaQe(?KsS za4}eUxSSuC@7&S-c!F&1k&xL@#YpWz>~Ds5nTy^Q0I93A_X#qA6Y$Q3Cx zK*6uI9|~Hl_v~OB*su&Ch23&4ZyED6x6^ngm9{eLjcK7}lq_|2h|cTX)?<2tR#zXm zN?&XU@NRg?c&HhSUUhln`yI769))~$@Lw~Yh&9Zfw@iw#uyO`fuO!^_m;UI~{_26n{_24ttTvNd zHecc<@NX2=1Cp=^%S4$S&)~tbRq+bnd-Z%<2?E@J$+R-mG$F_iK&SQ*Ucog2dfyh9 zsFEU1X0|}A*Xz}^#+fERzqexs1luM55k+*3HU>z6V0~^p1DVh=E6M zr+n$FMIB1bF8#vCzRPlPI?Y(lfBo&cT9rTbXU`NM3Dc^E!!Z%KtDM*-A;1%a|0Dqw zMO=H#Rtfjf_$m&SVjHyfW1gX1B3(h~!}+Z*+;>x~@XLL0k~gKt_{@9Bm?nyr2&|!2 z7*!wz{$|4h)AT!7v>g|QK&w04_v>j*slqtUEDR&oK94VHU)u_fOG@J=cb$zT7}1^| zh*@?Ej;l!T>TON-pHN&eihHDZU`)=+3 zcc$Qf=+=hG?AZGSs5Hc@e>krf+xg2(!6Ujtb2Q|>EjSSwWnA=hgP0&s7mF$vIz`EU zpDFmyZf)g%bZgaj@c7z4QIxL57&>vWpol{mtQ?aVK&R2(i~Y<}e?i-XrA%-^`1EHYd+O!)p2xjwnDwz`P7M896;WM?b3c(z}b0`H97!lLG#`99qxCK z9$pinc>d?s^*1Z9wt9|^M)uZ!0&1dSkM$a0Q16HuvWnlR+qTgH__AKo4~@F@Jl&M_ zytsi>C9VxT_}wd^yuT(5uP}`w?lRU>e;y0epkdgmUhDPoHn2qsh9;;VqC$QCe)y_F zX*CrzcLRQ+gQ^uf57gcDz$pZ$x>X2s_nb;)R&`j(4{dY1a8RxVJ)SN!Y@+WEV8y1 zVz?HTcZj*DWcnP9W;TO@f{jofevHV5K%A3w@HR9Kv~Q5X9HE#=)-(Dj-qvHbgTIeL zKjq?6;`hzU*Ri)R?H!%AgWSoX9wQcYB$rVR1wC4WuRR)yTeup&$rWVHkrO5c-G3_Kf zBhklz>UF82Nfd$lIjo9$0b|RN0whb)^5T<$)#=29qvbPT#)C)^&JW}$)4^I=_zE&} zgq3FWEF0={wXuV^v#$c)BN&>bOAR3$j6|`{4gQGPQfR5#>ErNX3a&I(ztFJXXQ~up zVfvp9%zDur>tx`{w!nIW6gAkzk|_hvkF|ZlO1LZVS;Kc?o(YdB%Fm>sSrj!9SP&fu z&A^4ewj*QZb{QteEX?vvJrBB2QeGd|#y9EBa3yjS87=EdzS0|O$G(3{^%lE?=KyqW zRuWSX0?CcsE_LGE&-m)j-D-4`^m}TQ>D3?fi@iuA=G% zc3Jyn^1hzK_L~Pe=fJ4sCHLTM8l5wIAPbomF_Yy?bSOZxjIpVPC0>S@#vtU9pBs{` zTJ|=jLPiY!(WtHx5tQsTww{Vd{bM=uVe3%Ca(_=CQMmT5|MOu!%HstgcQf(jYEJ1* zaX(8boDJa^Q*(s$7wx$|+Y>%W6(8jL>`&yc0ap`Bfv?LUd(#3gVZ3~VN^LaJ_sy|n zuu`BaEP=e|EA2nNM@!pfG+`M&F%ZSo8C_kL;T9QMo=x}dV=?8j_8v)By%uOO7#W5} zIkE_`8WF&yGSXigUIjkA0GB%_>93BWU;I~_CA=o%(t+9f6hP$q6^)Ze;{@k+QylYCDnQ1hF|0?rGW@btg z@S+;=|;w=1tf3q&J-nbS0) z_AWVqINDY`JfF40i6MsLxWc)(^civg&{6vFgoV&V&@etWiqNvLyygdf#Up7gmI4Jn zfg@p}`{3R;!hv_}Fb?!+?Ax6#)fm;!;rVI)p>D^)QH={S0cEG^GVYzf4@_OwSHWIyrCdrCxP132o=tKNbO4r7wYEiYQ`Sc_g=T>OW z_@&~9{v&z9!ADU1l7S2?(eLn8^wDXQviJdbu z|KQ=OW?@XI2vi-7Qu@vlSw=Y%4uE1P24(NW395g8ewtg8IumC-qz}D_N2i2%&+Fk>4wQ2rg2zHn7haa6R@(@zPF{^S2 zJQz0_C^S3p90s-W_;kzouGgz&%{7y}aW`8naU7rRi};K++?n~n;*5bjpw+_-7Fb77 zHwZroQlb}f=e535$U^=C9UQ|T2dNFdCbf`W`f4UqG_I$hs0btMsT@8bqSAUDA8L7 zIBqsckv)*x%i!&%!C*ZTKdgByL1f2K6EVrK{BU4kq%x@~_p|Ibi99H%jmw^LCG`V- zA$vl6?kZhzSrz_Nf_r3AxH#bgTc8#n66)L?8PZRW3HW@uikK0|N(n?E!#T$>ja9Py z?_@Q_Fj1IR3a9pP!(F78vbHdtuKm2ObhJpNoNu4b^o^!;eAPG=F%Ckr3*fZk)$eZj z#Zln1X^tQqV4%L1-=udP1RV1Yc;Q|;iZ{+D=CpZ-7nShmkW8_mC}T~*1!_Aas;KJG zX9!c%{JdknSrO9RS__~ky}ck*6|VWF#AFst1kp_&^W=w8^nsd|T*9aCDZk!G$Ybre z*oMp^G;MO>a^u2T(d*8Mjc9G_h@1sH-ruVo&Aw*eP)t6G+c6|=(7YDv`eXBf%9BJu%<@V#CqSR?o4TkBgCHTJomAx4F{kRWq!jBXuN;g!(M?UI zST%9ox-wtJgSSU%pRr`NWv_aKt8m;`7@82@hh5a_!!xXe=F0RJOORI|8kv26b$x0* z9jnRH1Ec@z{2M2%Zw3e;s4D=A@o$t7{s}{^f4Sqd|F+}Ev+9HTKL9qI@ph5wD93Zv z*oe67Qb#sSdzt2MoldgAE}~YyhG+-=NXt4dEsCTN+L@_>9DsL_IAxeo2Xeq@S2N@~ z2T<{dfjQFsN>;)SP#kIFWUI2^7NtQY9v(j%^V^e0@!2(O06*91uWd7qE*ii`ard&& z#;yKX41x^FF23kPDqBv!8nY0b3>+>b<;2siQ|p~g6nz0-iTG7HXpNEJ**jT_*=-`# z=LirzNB$8E_Qb7BvVp2j1M(h9(*|O}z0e%rm;Kxah;5Ge+?w3@zZMSm?;9di06mL5 z=)WD?4n~$n29AK(UQm{D01U%)d{?oY!7YXgN!2cp^RV?e{xav9&WaH&>OWin8v=?6 zu!Nf<`V@Na_ zA70fP?~7+6-xRs0YSxF+3h3gNiA%zxerS(699%B+yz&RaLkuCrkoF2oNHi^l%QYb{ zo>Qb%v~m|xjKr8V>M))Vq;YGWUMJlb3n0|h1*9ZvMoNue37h52tamQ9MPcklw`*jQ z&(+S?`{i6q)%KGN^i9z`tA@Ze9?`bftY_YxTRsU42VHP#WNb;%wVa5qOdP7yBo4Vz z+LMTp#?5SJADjZJeI^=Zv^E?FR|VTKA-_GisUv^eBW##vqTBff^n%EFCt*A=)pkdp+Lc22CvpTHENpU-M8RFBE2fi}WHMP) z)b#XPXsg~A;Ojm1WI8%mgCLrI^z|$4D{}CVAba< zkgVKJ%cR8QRT@FWC1;)pZV3h4uTI%B;T%J!_ z0ac$2#seK?(d&(&aKS)aFx{bghT@hTDaB;S;^aJHSFEo37 z`iv#7WsKqA5IA)!(YlId4xU44!PYNbHgBrnkShTr=9`{>XQzwi(mb%TBt{?#BMIN_ymOl`5Ee%^VE=d{1FVt2*UE0 zK+__vI7N4$s6T!OqK?rs;h{liXg>{>*>UuzYBZ{@1Y2Q`?`8bJ8%Q_{3a9U_8t#4m zrJONn=z||_6v4P5=?xMm2Gmwl6;F}?qmhOu`4VAJK>rruD!ssq##d60AFWZzLfN6V z(&71z6$slk#_hvl zhGSI{^GviZ@;~j-P$#k;f+6rl!3LapHxLyLO**uNW0*+ai_AtyEpXe47_NMD#VF}- zxZqr~=Ht^=K`FV{W@&x?i~cV2?3kkg4FApn1_l2YLzsW=us8w~q=T`Iy%m5J6O|=x z_E>+Nz8^2`2?kbd=@_;3Se__ZXfm(RJ8zmPls z1oEP%_)MQFkpUz}NaF*7_FzI1;hw`4DRgdzDD38)dh6%(NeA zN@am9{^7%T6n%lPuK%VW;$0KfMh(xad-+w+hr~F%jxjhPGlw1qn9Y_QSaBVv4sj!=8!+Mbztfy0+xg=d~&No`5(0IkrjqgfC(@-a8Dw0t;- ztw}l*{9*uA`@X=X*7HM;_O|q>e4JBN3<2F#uIIJo^nD5&`9^u4MQnsi~) zHaAu~_wmqi?s7s|Xf9ucxAUvyO3i|OSX$_U=dp?2`g<1#Tw!(R&z+J!V=p{@hr0pA zRC6v6AG-pB`h~Af*=vm3Y{0nSC}FAPEc=Inbg7Ui(WO$&!TYo=wq6z5X*)_Dg(X(_ zBcLc=Ej>;3vzArJ%(~?f)TfYN=44vk0x2k%rY9dx-*zc1f@^*#TR7BA995UN#rk1I zXP*@6vfFAjIp@hSSD7?UT+WZ`S4Y|%MX)zgsNyU*Y2b5d7FN47GXg2XiB0}gzX=G7 zypa7e2i$rGZ3=3Axjs3pA&Qs)s!z-Z%Od}qNcy4J!2w7@P@C?P{m9)S6GpbMkam{+~xbx;3M5Qa?-Bbq5MLS zUyMyFyLHDlM6gHAwgQ53eoADxO+T;C685D?yw|j8OT((=T0LET##pmFt?{$-KvagW z3uD$hXlc38DDO|-R` zBk{+fM(SWlNnpu89q@2=mNHA@6fXrF7i$x5Qq~gE9rn209EZ6@@8O(HG;m|0@~@rW z&>h~`QGQw!_^{q#22+OCPet$gVTjn$ONYbCeLJHB3>O(PWZI2WNDfzGI(H*^wTWVz zl_;j?gQ{1f{t9Tu4axe@5;!$ENP&kZ5i>yx&(IY6YNg++YK_wsrqXvt5K+7xlAC;{ z4yTbj!3Qu5bnMU|*@qFJa)2u-W1i@)73Dk-ek)6;sicEtnv%i za?E3ZPqiPh*;pEX@+VU|=$E%?*f5Zm^D`p7(jGxabK=EQFA)prUbL8ZsbyfPMRa%F zYv=(L!wMu6>(GRjiWviTp;*i!1PQ7tls{(f^a&4_P)HvutT2x_qH^}-l5cjUHj4Cwby~7Cn#feRR0ZP7uTuT_;RoJw zK}-blZL|jc@@rzLn6KPYE{&S2#K{W+>&u8Wx$*{4DD?o>eLHGv=F1Cz57uSW#pCMM!3!Nh1(MW!^rLO|B9?(?l9 zQ!JyelnJyRb)?t#=-TKk!c;$jYoHtlxuq#~Z%T!^G&G&w>Eh~ik3QhnD)mf91)$FI zSDd1gkE#b!L0mZvXVI57^aJg^IAdHnK7Sc|Vu8$fg$Bgb9uyFe;J;7H|E!pttj+A4 zjKm#{tbRL;*`RDC1DH;E%ha(mM9$BJyK2Z0GF=NX%O)J<{i3AQa#G+V9v`*tBT}EK@BRaG8M^k}~bo&7K%lcTqynG>8BS-E<8InUaZrvg3GCN79*3YiCO* zKF>@0^DKFg-^YS*M(A3rTd|!_S*ORjC7F?X?84|LW(mPLJU_|_B0UH8APb9m4YupI z2Y|7Gm8f!eqw%7XU&99SVVtqAi%`3$G*KZrB-%RA71acjEy+N~sK#cqcKmtHwtno1 z^a?o+Llsc!0TVBx&Y>Bf?L9HGh<=9q97m>9!R(6b z?g8dh?nWiHAJY&yfECZo^i+ET51m@=a6;PuVgD;rjT;^pueV}ZFk@D!v%RgAfyQPE?*VwYPG`5E(P7)RwRoxyhcS>2Q*6LgL< z;3L&5<^n^$LA8W8y(A(vS#1ZZYL_}9H$TB;7Ki-emqxE|d|f!TQTikV4@*JbqHf-O z1S<(ADCsVGUOw`(>eeEUw}1EoMNxLeQFfzNmDahvFPaCJ;?|Vv_l9Mq>?4)1kr?1& zdJv^<^|K!sZH)f@Lb(vZ@nbyCsbbu|WXf*3@;SPKeQRx)bwwJxq);LomU-lzcFUZT zVTBf2^LS*J?$^AaM(jyumTDx6KGQFJTXm-|)7}}eHkk&uhCjwLn!%A$h|!OED^n_) zPA(nB$!+0P4)P^&tZS|3G&uK!IQP;8oXp;1>Mu{ntr1bTtDI;x=_c0XoH(_6V(s1b zLry>o>Uh&q#~UKsvz<1q&-+Y>%fqaz_zIL4dp%8BL^!C8xVfHzn52WEn`p#Cq4_Rs z+@E>P*IOtzZGM*qP@zy`@BsQk0F-0-{(YqVQyTn>F!PF$`E~Wdz~w8dP#~!v>41gg z-L8nE9O$pR4*V5v*u0UH{nFzhcQJks)1}kdcP*B8Pwk*)~|xK zKP*py232-O#nK7NhPP$Y$oIPORwzxa)CtHmbZ~~EQiMjdkkTodL`hv?l zRP>b#;^msi(yVy=Cnaar+Pmf0EwwG#GB}$)W`ehmms@#~y4!bG`ryBqng^a*@)ls` zC%`Nx+5c#2TRj5{y+3Y-vawE7lKg+1y;WG9?bR-dyF-BBuEE{igS)%CLvVL@cZcBa z1PJc#8X&kkteNiBt|smN+wVV^S59)kJLGpGix7wJ9dyT`ECeSu*r86thPj?%qZ~Qtk#lohj^DU!b|fw;*|F zW)X)=L32Ff-)uE#vO&dPBFS1TbQTnQHwJrkw0(^66#GNYVTLKLQf1G(-jQJWQV_<* zV!uq17B?hzrN0j4BE!0E&1BP;w-1a7_a}AD1FCnv{``obnyWHOIio?r&^{>xr!(^5 z429W>GNH50Yk4tAc~vMPj&@{R?vEHrEOJR(!bDDNb>UChpLd`=s0N%0jxE{_jQvW= zrb9%W`T{KqSBc3gd*ul0;n0+R_)x-|&8q4QSy--OPi*hs`dTA0_mMTIVWls$XD@iD z?M%2LnOgM}ERvtJ(pd*Vu77 z`5w{es0Ua)yQ!?A;v79*OBJ2m#hi3+H!#;89I6%6ez!9I5K>M*N?(Wt;U(kkwxH+s zER4B<59#yra)imK&W{wGe%s}82NGTj!qyE6Y%3j&2+Z|Zqbbx#z8T#28jHagB-wt( z=ks!AUEzZJ*{h@P zjueCr0s2-BLAG@vO`Xo(6LLFc*pdatR(*-S_+{jcCIzQP-Fo7wDw?188YezxiVc?C z5VbgkFJi*qk|3OaK513y-Pk=QuboPqkb&h;(sQkYk2aUM{8TP_B|ClrS?HKw^%BFr z!Grn2r4y{}tkjMnHok>&)mpi-<@QA+;iHR}bBAGji;-|-vHk>qnf&bRSwMtTUmomr zW>$U6y&Pq|^rPx@#I&@T&f==Q9uEzbM)FJ&O2dk+Wl7jIFI*$HYGDEI`=tHZ`6!FC zeapii&H96(9S0)-LU97(fxpPxSWx-o|Sdn{17=xMdL7i9bR_ImE&Q(Du!{StykA!zzG$9(=9E$HNU@>36C~U8DJ>RzP z+85aj!c!vLHxw<`45V-dHqT+R9~BEk2*$VP$N08%UN*aBz9x*{ltOXOoE~*LsAB}K zduw4Fp1FXGqtIdwag_0lN8nGYk;2v&F+&>qIcoEwt6nBI6QaDknPJxbk$9~FjUCG3 zmbUv6jRNsK_gB&z0$IAQTgyeyg9v2r&6;RZ%abT+r)cbxZK5A*d-f&OdMT+NAv=)g za<|n&_4GEpTx{%=Y>_Sl9-GK*_Yek^tVt`_F}DsQ+fq1b*RIXsB5C3{GHs5olC8w& z+Ss}tVQo*k%!ECTW*g^xs!;g;NIN+MgWH4wnmYi19@qZ}cz+}4`{yW5*Wv$>BK=Zc zl!88>fr|7>ch6xJx|u9XXO3GR$?+ZRL)?lpaa&{Kaxnpbt0cm@xr`t&*5iJoy6x9s;?7DM;N)n|CEfJ+3m;powWgKwY)Kn5WYOaz)V2i>VFS3vxg#m#J zm>KUL+EaA>n+vIE4}}~+dxo$KkUxMe-GWfUDn42b_DBwEsw#lDf(}|+tTF6MvXJ>5 z^4G|{>ta4PoYOe<_dj@Gv1*C|8;ND7I$I@!n6r7Xvp+))2AfU`7|XDY9|z#E?>Ug` zeCF`JnI-h5@`l~k^~P_sjA$EpV6{bX`R?Jcq=?yWE|621!oU&Wt;*=vWfsx*D*wc& z1hPPdBDyPL{`BWsSal+YmjOU2u7KZPb*sO#r~T3lPvj&_06pfnP11uIJeOlbH(a6} z-hI^PkYeo6hqL2gC=L>mN8AVTyke+#`c!9BH#p}>!FCjg&*zL1DGJsDSEEVUlKW$OMOu)x)r29N=aN)ljHf3cXV`+teke*M|j za?=*S&>+Rjnc>6c*zBG|l2T;@(F{5zVHC==a7Q6s(fdZbHVX|}UmaI7Q`$1!)2GR= z78dD|X-)Hah0vX@*3Ot`xD2huTp0U~vkiFN^-5O^Bp)fFBW0s3uYpiRYi`Kw^|<6xiB1*ygT(8ndp&> ztQh`Kqacy9FEZazqQF&4Oeh4Md>mm69JEO7Hc({Z;U9*w-bzIa^6&(U+U_7p7-8|Q zSX;^HV_-oWMVa_!Wnd4%^b?U3(yir(&u4d2dbXR_KkC>yT0ZR`0ive_i2g5*TmDXv z^*1<{8?^y2@4ck(R1f8qQw@~VqRI;+gY*L{^AzgI$%&icJju=bRG)qTMiA#6n>ZVr zcuL{5J{~D9zVS2HR7qB#Dz~uVlQFhr3+N;!Tg+T(%wm&1X!km$@G9yhxSVV}HZp8B z)^^z#C0#_wDqt&aV;A-d3E6S`bevT!PDubs=Sw$^s+TWHACq3vqcpCkL$tFdYY&X( zcg!5)8yCx@hdu;P=T~I6VU66Pa*c^u5B!`_1;%JPpZu$HF-i05g))ZqoDMN`cGk7m)7~H>ORqN;bJQ&3JW?fm-FB?;Sc2VW z@-O%6V|zRX`LINM-Cdj&wA>uY4$tv_H+KePx$;JUixT{L0sk|G{v$sBSAk1Mjlu-* z!->3;u0j-{wbfLxhf*Vh*~_;fWua?2JBdE$-fUuL<--%Mk&v_5wn$l1&HFbCv8y(M zAzrn~81boSBu~r(`O6p38s*RRtQN6t;r7~V$rQlelj$NBN$tMnAVSDMS#OLnkCL6Y zm3P`fhERrrZSxYWKrQ%D(-Vc$6OYi7F!I8Pl6@pn^rJbpQlXT$P(GJkr2ZB}wrT3i zrXykbk`Z2I+dXdf8BKFC$ZzrwO3t}{7mOl+5S{_QziNQLabNv1KyRFK-(T+ zSvRb52O<)!s1S(oGRX*WRQLSiiQy+Rh`sS++O zH-kG@i)7Nm-S+c*c07%UJkCNp)mP<$s57CIn0M?ivRq`utF8o7DlS>9&$(tC2sIFN zDm}`PFJ$bHSI~@lWG&Ku;ot;nAPxq=^iSi#G27L}JqJ`;PxJn;xtJAoIU(6}zZ(P0 z0tepz${7Cj+W*ygBmFkhodT=$abDe7Ej? zy$=qVD^`Ga;|g?iPT3OJhzvUkmK>dF#p0*8m_H%vZbyHP3tgBtBzc|tvXnvF)ZVL!;J`__voDk7&fu2!3A>)Uox(Smc zlp+=9H>XZUEwd{xaJSv0hQaQ#rKh{q$U))STP@6oKl_(&=F2+<03@D&CXV3WO z=;B}4i+iP$bM<swiyG@6bR8R&Lb$8>Se3KbwBwrVLsZP?RW{ST-pa~3 z!Qh@%Xl&=LSie_W-(3rNt0szsd~duSCe*IzGE+7okM7;4tT+bHV#$ag^MgDY0prnB zVOKN*ZANv0wal3{eGz#!18)ku{m`S_0Q~Hy%GnF$#SA1Sw4fW@Lv6YNWHsbAwFtCm zsA+wJrFR;6GU${P<)SybRAk}<6U&Lj2<)(V9~Y^QkQvv6j4YA4imKcCA-TbsI*$gt zE=sik|G*;yj?iUmt)1<2$W}vSkqpcWcanjaf)P+!Jt^onV3doUc|5&I_Hdr>ZGBHv zyPh$@GFT}et$S&$8X!Ejq4G~VuYuMw)ZUqwC~O>0NRYK{fMiSvB)<1UULGzT(f!&;W3vD^5fL))m`rIt=9kdVZCp!VXySP}m|I_s!U=|AO z`FRLnx7+|^|1ZGoAISc1jaNJRZ!E*X?-7$K9!vUiGPZSJSM;$2SD@`vIRo0f3ngJb z2tJ>;K(G1@)!~uHoW4w@JWRFtg@2g!n1%k}g#Iz76MH~5D)0m)l(I!ucQnE=0p^}l z?ov`c*%D0mpvrS{B1h=Wwh!$v%AEbSR-l$I%8<#^Ohk4R_*2U!$f;=SPu32|J1tNa z)t&(TiV^=0Dg47+daTffbv5g(onqHeIH=<$X=w5pE@3v%ZB?GkYvm;7>zh^D88;!N zc)mjE-mZsFf24k~MJiNt0P$=An&-TK-NpZDx#O3E2LV{NcYoy&oDqR_Hz--zMl9Gf z3JSCE#z%zGbCoImGQ?~}l&|O1QC7pOe&9@FksBS4HyB)L1vKUH(%yD=8YgfWHBk&9 zkk@xQIO8Tai;NRix87PAA?4-kjtw*!FD3=kOI~*^c(!Af^5~7k^}Bc?*2_$$`xdgu zGV9d{A^B^Z5zxRCb{W7bT-uB22R$Ksu02_)0@_mEh-(qxb2R2!T$s9`mgig&yr3q% ztw892esoNa;YDMwF{lzPVGf8Wx4@|&UW}6bY+Ri0EP)n|=a4cgBjk@a;~(RlksY(S zaZ|N0D0`Z$)lllC1?X%1Fwkg>S8^-Y(jnX|S7-r;N#T-@8G71Md~+QMR!5fTnn$8j zQyi0w{m+8Jq&!T{l9OTX$9qi~J@uK`m7Dw&K@U)gf*!lje&qAIQh4JR8_Tf>mx((w z4Umc_6WUSxNbE?~Pv&=Ii+F(5p+VdK7D)z$wi>| zsk&J{zGv%?Ix~#lDDQm|a*L*)-oxyOLY@-BIOe2Fff*R=l0UvDJ|u2TskfB(3Ol?n zwpB=e7bQw7``Qcg4x4A-qOKW5?TaPe8))ODxB2JJJkM-l`mgtq2w*e+MZ)=;OZ{Oi z%2DkIfCn;ov#0_d&Wb%rDitaW8k7M+l!|DiSCLMBw_TH6)Nq#BXSLcV$Ih6#>WB~y zsp-^@FfiR+?c!)g<7;Opkbi2#`bA%A{nzeJ{uZ#wYnB03!pm|l72dGx2<=bqji-=*YA%oU8Z&n6~2SKlb{ z$Sc}3#s>8HkY|5-6Cn&dxa&-mA6qffu-zYjIsb|tR*I1^f4gT;t5y*FUOlj_THCz% zty)L>elWqDrFtP$_1+-SnWl>r#JvG}SiMzCyjC-wxGuptMrG~z8IFn zK9bnSO{cU?Z3Ca)7}|r|s$3O{ZW=i5ffi-Cbv7T?$USB+1~sQ2?w?>lHa6IS=5O#a zzZ%jZUSa?7VI`NE_*AoTpD5;@kOk&MKlI$H0cNfzYJ18hfJWI{pF##--e{u8|3C_S zS$KQpE@)xlZZKFdMiwLxre0A(Q}IkMsw{1H4`qw76cmw39u4^Cda!h*-7N}7^?}nnrt&uU!IDhsj;U8Z>=A0`aW!+#8@$vu5!`@+MF*1TOc4H4Ymd2;tS znWCcW!iBXD$mopV7PiffZ$;0d+B>OVtX=o6mL~HB2HhRkr9iwHxsBWyj4qeY#%v({ z*74bCQ29VebcY|xon%1^h`nDSeh=6eTrymm0Io*?0Hpuo0sDV|^l$x7JBkZ7Kn^bG zUFt`!(2*S1fLN9=1$z=g{-S}GmSuy8uE6}t5A3nB z)+>o=)!|N+kWFWBP?g_#6-}!k2^X?@TYZg}XVy$zii%Ut9Gl*WA%dy>-L8X%$WGhp zI)@>|6ov7&cZKI3@&gvWhf)ZN6w;FzVDJb;!Z9G}eav912&7P-+e<%=iW4An#n;&a>-xiF{h%B`*a?8e<39Lg-P0<0a@+evN$@8 z!}08e8+(*qDa0bkT82UkBK0J}qi#0y@F3bzdZw{4RP-Y?P0(fZy!p;RxV?fS(}jpi zivlADQ+_?Jc2SiD8QvO;;1dvu_$SlFLbhd#0&>3ZN1H?ab|Un*7e{WKbGxNcS1>Ny zp$LH;UosoClH0XN=7HH_&VZ z{36i|`1)UktiKZb{d*BaNyGL5w%FgLCiJ=7kbY2R%+6xMafgM-AE!Panz8aBy|*7x zp?)IemdNSw>Xp{~DvdY|v#rpKMKpytFQc{TB!8EL@D&cqimbv(e~hAUhDlfq%3qFF z^8@RXJKNpZwr<~$o#5f9jSkYuh<@p_B5f|;)E&flC^Q0V&7q zCu8^xLKPAPmUzWDapi9u5})GwdkXzpnm%E}8jhq%8R@^pkw&1}EA)OQN_+G;3^byt zqjZoF_Rq&b7Ml^Z5<;wnl;$W1A}di~Hb{9ySLoy2r49^D`K($~I1Icim)!KRnsCE- z9!hbXd!C;7h=C8MmqmYwJ%0BL^ZXw1GB74mcGD96RyROExGN-x)(c8|Er1NZVTogV zP7t!T9wXm_6?O%F4o?*h5_qM=nVp;lHJ%k$GxRC}jSGeK6Waj8M8o>3@JK?ww}tTS z;~z_Vm=hP>zbgDPfG~slKYR0UngZNK0ch%#&N16pT>P^~`nt*tb72_{e-xyD5_+L^ zo7v~c_w{x4r?4df@7W0>m1LL)vA>)vIs`BARhq0?**bF(H;8rd!%=4o?fBzI35Vu@SpQA{Np}S6Szc4j8<+nl`B=A)#jQo^Wt6an(Q5-szMFkf28~ zhALnD3=4)bSoEOoGy@hSZ=buwOE8k^(xbtW%~z^BTr4vT(s2=2P}OwbQHd}`x@2Uu zZ-`7jc1C&@&L76l7o1`>D0IW6E=66#q@WhZEChyb3sPg@Vlj3oHz^^@yQ=4R3rSsu z6T|i#Sx(F9d;&!PQ-!GP2#E4idgWy%8G^%^bO?9Rn47?{pYR6e>BswwTrwqES^9$q z-ryj)PIF5NfwVoDUKHnmmGD?;O7DCQqw42;!kpqm!-`GCQ?@A8BrsWSHPF`^ z6uq+VK&Gj(K$BvOquXLU;HeHb0+T={IO7FYp=5!B(?vN#J+fH9zAm-IfR2<5+<==! zp^`4B*7LZr8>F4sXzv%=1{AMkwJ5K-yiOh%^6mn=_z&!1oGoI<+pFs*9h>k4;>l_d z4cur-VKuMN3zR>>dj!kXBO7B(KI!sr4RALzJwa>@%EBN>orK_u?DdTWGB`e2UlomY z6&uCGZDRMpqOuT z{POct^tqR)O`{tRM=p3f@AG%ZF#R1aCS+_U1;@?W`{(rW3J}gGF1W9fXGGlwen+Y^ zZJ)D|ySyM5xx6gquK%c|=niqJcOjIJG>o zB#-d4^RRlN{PT@D$?yMP<=DUdsKo)@pG8n!8y-wf{fsFCTh$E%0?ehEmJRaYi~5^K z@D^0|fs{kabE7-2maB=6{W?=7lGQ?F%@CR8>PYfTuQwEtbPG&alZI2vEGFuJ8dbi6 zzHmQGBY!}oT#FsmwUrX3JSSyI@N-(6V8At5zlO>W)7LCZU1@wVc0x(AMR4$Q#NU05 ziMh?>f7wO&os;F4vq^sz_*)lYG@DH?pPU!1+mfKt%_`dt5mYXqiKecIT` z#IM0(cWZc3sbW!GG*Y7|s(I%rnfd8q)P&}M3MF%E{I2@D#1qQ!oth10`zkDJC;T?g zm(3{;PWq3_-XMNWb;k`H5F*F+zBF!)z-I<~h`k)Kva!Ihz1A>FpMZK%Vo_mzr)^z4 z5qwy{yHvMl)M06T4Jt>x@xJ_77a%{htNq_}5&q4`{|_xC%m1OJ#0HI5szO$WPfa6r zU;)%yDv!Y^Z?SbcgMAUb#ZFr?9i%zBD0DQ_@_rEDhboxC#x!0x-2T;qZmm}zhDe|V zF_hKcc?%{oln4-d!i7b~_{T{E4=L%5a%Lz?CTh$-&)$yMv?`q?nuWtN?=UugM@*nI)6C1SMD%lSczbf)Nc*cmjA?AOO@jCP;?$*UO^X_{i& zqLzy2qSSE5Y3Kc-E=nJ6r4$FYbSuv3wt>7d95x6hN~)h*lA4yvoa+ErRyvZi z0cC6)%vg%d+=?d(j>QV4c|&+9brC!K@M3j6Du;XjA;XlB2}eSq;o*E(cEZxB3Ys*4 z#QQ~3bk=WRol#R2DJLr)I#|K;HE#iUG9a8G#Iv3}Yq6lTNEsyIc9uT}>LmehAC+g* z1ThAX{6y}(4`Y>?gQ)Q_Q6hwSSA#&ICo6BK<+HDjkck$U6=SmqIa$--*xxZye;o*o zgISvv2YTk8Kpt|yJ^p^YclZ6FT)xhGjt-^|E*wLx7Ra!M7Hs!1JR61FdQ&z;I|FfJ z#I4(EtYnMBe0}PkhCtsFxx47n<+0fMjM$4F&}f@!)Shxecv|tI#KHCzHoj{1SCzcS zk2O;%l|BHyy#M$+80FS~ZTXc6{?!V>zc)T@Kq}}DAS8Jo&4lC;4mn}=-je|91z>Yl z-`EsZa6ntn@>TC5mpa%lX{ZI?av;fZ(KmO$RC1ya zC$jbqtAmL>+OkWfX!YVIzI^7)r$2YwpCH_2gMJBJTQwr%Xv+*=o_{GPbY;qpMDTMc ziV@LZs`xV|=72$D9CC8qxXDP^6`;LqV;fCrxcZ57SBm>t5ruz0LbX#?6Y4y-;@USfR;eI(K=SQQ3;^C$MQ)=<0tHuo@ zSL5ZD?}j!57Xok)aa>Is!mC!MFthBG*tcL<)OZqT6+DaWcHQMvihH!E3LwyC2p!bv zK&WYgx>V^PiW~u5`=KbRB2s!swHop;g}|A>Oo%q-z@I=C;$cM$^>FyTT@YI1r4A2s zw`n9mIfb>(6w@kHDA72Pvek~>QBmKyK}7RFWxToxjqwaU8zFQrH}`DPC$gn(1h(xO zBlpmb+jE#EX1>xik5;fp9`vUyL07MH$jjy@0n8j{m*r00O0xB6~!T z9T^2xW)QS*E{wj8P&De@h7H9|J$>=6@wJB{O1Uk-EXq#B6&m?QRCitiz7D|#9jVeg zRr0J6uZ80PJs%WIU}!U)%4+YpOxpTe_fc;javrrN9bjJ(aEYw%O!7egSLw zQJ3dZryQAt8KL?S{2X+ya(nl zwb=&Kmz%|L>guPWhE={z{@j+6PN=Oib<%Tv+!Y~0cTjJ0g<^~l&~fMBTj?x0YB zUO`6qs@w4yo?@AbR~#tJ`CYyRQU%Eh<3qe;B~ zLpDy#wa^iX1bY>a1Wr^c`Ka5Q29moxRGZD9^cg+VJP*qvt#A0J{f-u#!igC7r)x0v;N9@6OvE_J1cibePE;;ZOAldQ?RSx3&e(! z8Z>)F!w$+Q=3^c9;7HQy9)>i=-iuBkao5gO6Y7p&hneF zMWG6E6Hv7GHAS01;*h@qh%i?RKe&o3CoSciPUh_L{VXb#R=1vi2%QsZrJYloA1HTQ zjlzo}GA`G>)xPX3zgw7IkHXTen5L-BDLapU-pN}__Q)6{k-pd{#a38djnX@{cWhrx zT21OKV+O}GV%+jwe~dN%)|1e#Rhc&7=cr+>S7Z*7m?_iiEUKs{$q_q?lghQrL*rMp zG{f-_PiqB%Sj&ee96G+e!7}c6+Yu*`r-t2aD-VCk$Ms$7zEORh)P-qo~=v zV-uLX!~vYcIbKp;3zP^4!Yqn?(Ik(_1Q&n%?tMARLp-aico0O@6Z+6uf)wqQ?5P9+ zJrwCnDGmL~?R#0V?g<95U1<2klcp-Z4DAJ;gxRx15f9h>JK9P`somNA>qV1B(&fH5 zdrRjT-q$8Lx#LK0OK!_(RSwef@7! zuK%d<|7Ij2kpMRVoGREfo{VU^F_E=Ik`Z7lJKK0x# z!);#RuM=u%a)pOxUq8G@TE|3M;?=5(S%|JvV-#}mrwHG#uh^CG(OJ-D&!!U#X7Vq4 zf<{|a{Wg^@igNNwtPtoW+91DEU)2XXO(-tYPe~=vF)m;FX^1mJOF{`^vGC2#Sa|3@ z9ga)=NRC@JNh+nXhJZ@&ps(joP&C1YJFEq~(~VGn*-8GvBk;>f29*CXd^6mn_iOkj zKEc>rzEEHl>>D23;&^66R=-Z0{!({LzLg^D8vNlX(6?O5tBVV=ca)SptwMLQL1N16 z884#2eDOO8Erh0^*!-dHoZUUvNhxl#E?9;)B8UJ&-T@9gUNTwpBsB;BH+ ze9+~5x6tVC%&S`|fC>zJ9X*gO+{m^jF(TGh;iaL=!WGt*#su&W2bc>PaHc6S8e1S6 zqtG8H){RM2QZv&BxII}3KULK{4m-IJ&~t5ZK{|F(0thkUwnp6dg7FKyVm3R64|DCSIZ=*V`NiXk|M6{xDMsxe2V| z9)?iYyZwaI6^fGxG_+LkMwUGdY){rR=R$}K5TQIzd#KGN-<~{YJHxJKoOUv;a73)> z*9FS2T{}C^U4j${w@lP=tzXaIF8p1&lz*x!vGf|hdC=UyS0`I-&NcXlPf=n;XEe3VD6TbBx0|8K*ADC{3?>fkJ+ZD`BZtVT9?F5`S?PIEbH0&uFXiE zmKz2R&M&4|cduaKr}vANY&b>vYxw+r&nRk?m-8Bz5KCZXz6btE1RE-!l!jUCsQqu_ z7v*G0@nQ9_<$!-~ku47n=JX$lJnUiRJ|a$nyemCHWr}TKEYV;>du`Xhh=$;r45HWS zhzbXLd;fuwf?n%O3V_0NJzyB&zZlK<=REtLx6prKMUjfNE#R)^8{L~mMQOgK?$yx= zSa@4`eyNbvN=T%jlph$>X`A%(`E?d*j&*N8E42Dxmxt&5+ODH__~LMJdQwn}l@vo3 z4cU%@6`Q-f^yv82Lo14c(*CFkcPsU1)w1I|wf&ow_K-SQRt0)T;F>w@BIOLRGnj=Ak#ZK|7e7vhnrU@MOVr0zMkA-DTdbh>#8-0u^h{z`_iKg1m=R;ERLQX{Y6 z)CVWE8rFB>rdoJZ`M6Oy@$(?=QyLEuX^YC25~HC2Xu{^ubRn;R;Kn+2{eTXK`b15P z70(;-0(8rTuEG0s=?B7?CyEG?FGffNAAL89hgq&P_`s!wZ@OZgr@}UT(E4!L$nGV+vhr2XSta%ifQ4hEO z_muYEubF?WG8(A`fEf+|%>IkO_a6bxpMEOxkLuuYZiFDL%Lhn%<-qWYnV_Xwwd2Uo zCqe))o2JAPY>|+$;k}rP#PhF@H8?u`QWJN>5oWOho>USt|7g9MgG z(oSV{`%rh*xBZ2iJ`?%#@_6OY*OTW#t)hTeG~sZ&&!J6{PIZcI1e|&@iH4H>3{(PS zY58(tbbw)VaQSUz48X8CF`ybj*sG$lg8g3d6ZhGcDIM8(!%=_h&yKV+BW{@iKmAm$aIb3M?U8p z*^m4yA%g68E~X}~cUMKx!@b2KUpd({s%EwGIm@|E6AW;zs%A#e@k5la)X+#Vezq%T zVSE51^tr2n*^GBiFCiUWy7)|6^<|z)*TjFHUi0kUylXonoX9uV8cqxO`?}?fpoOTj+By(dC#?5gmn#O+(KSTN>~dX7$otjmcnXUCw!-UWgJ+ zp*Cw;+M|Mj-k;ENNM9@)cqct>Ovz=8Hp$gt-Ya-wqN3xsG4Nuv(tI0Ps{YJM0y^YS zjx%@vM|t0qG5GZB{~{j$2PwlZrHMrK!UOd%>q#aW2q@_Z8WEvIs-+Pq z)>1!P$#ck`DWNVOXKf2E+@l(Pr#^~YEQ10J{s}PUkGb2xy}bRNxcZIH7P|prawrWRFw|Hyi|97= zr|pyWE5-2Z@a77}9CwpG23%)!_L0{_!wL+ZGy|NE$Psz$g~PLi2%~QI43l^EI%M_? zOXz~(L|l8L4~of2V3rd>nBK?%0{pshbbxzQGBbrFB_dPD<)8XhDQ5;!kdnIe0NP8N(9k;ozyiR;m{X z_B3no0&$mq+`@HSsG9-`Vx8e1MIva}!FrPB1>trvF1t0_jT@dRr@Y0kBASV@;{E(U z3+pQaiiqttC&}S|c`v_c3(hQT&Ac@NlSUs5$}E<2#5pPoWz{0W0iN3QNjr!mFu{Ey zYoSO`-!7(V)jb#&1WvYM#$_dNqV~%|@!T0Ns*N@-u3C4s&30ysLrnr3MB(e_hr{{# z$k-J<79pmlm$1&;R&J1Qsx&u^gwgMTZD!FWk~T$Tm_ZVp@fol|xX9f4IlIu;HhD--|Cvy4`rn{%BV}1$S28eZ7mA?k+j}wnXplzQ-CA-Up~vxN344TlWbelmh3V83^bp_!Cf?xdR_u*OC|c(bT_BT#n;ToD8tT%46tT zM#CX1Eo4$KXICz%$lI=(EUK#ornFAPRp z#)^4=-hc!GL8BbCDPHGk=P6+T2f@I=xQ~Lx3*EYIdl#{xO<*3=sKO9QCYQP_nRT^& zE}4aGg$wkiG?Ad1$oA36aizQROv-|TxTff)AbVq0N7$oE8&Z0El|n-VDkNX%C4vdy zme8!K_u#b%et9--5~r;PhR6TxZ%6xT#dCiKLz((R9>vt>L6dNH zoC*GZGddep50N2Kbri*-A@g}zgakwXhuARC2K)j-KMZ7Op{8HBmj`13b68dZ>p8+1mo63FDOo)=rfo*ki#aU%p; zk_-{(3c}&j){z5Gaeze@*Znr78Ledk#2=s#+hH$6Ln1D5Xc2Os3n>^shD!m7F@@hI zypmmdB2i-u6tw53lqeu9h;1NPMc)UM@#7M!Ktk?_pd2tx2xQ$1EFZIv`ms#3Ln8CJ zFFjEbcX3l(&^5l4PWcbUhXwhv;j>YPjdQ#Wuv!f04u57LXPT9%?^pCzeY^0^`A~8G z_SC+KctHpHHoahFUke6qBD)##qsxMI%g^~h0nDCaZ{A7XXj;R&hYVA!`st$FR!2TT zl}R(XM4o#yU797Oez>(mgV5>=1qPxo6J|~S?XhWNKV*~?+zj)Q)%b7~gcGt@E~)N; z!y~V>3gb925igtAR0rdD^9*yEXY#D4rRcm>F<9{f!MloZ85pWPP`AQu#R;g`MPx`Y1(|~$|TM-{2yKv`y+%1tZGKJ&+4<=lU1#K(m0A*Va&YU`pbt$YI^Z`{$tg=^$Bid45Ft&A#u<^UTKaVDi$x>6$ft-7Z$B;O zyN<&A-u1S^dinRv3GcCI?(iGThd!wp#ivwaP%%!`?_)J5w}2V~X~{rIHEq)he9E7v zT{#8wTre?Qa5-SVcOjw^1Y#e@z@7#VhF*|BGvGTU4p05W$yn8lPZdBva^?3p08)J^ zrBd36tL1Abi9rGrN}Y@SWfk6Ym+^aJUgDA;qFE+IG!)gApxIhWXl`o0cG6y08~Zvm zzFZ8cq-o)&dm*dbyNTm3o$YY-X%dLw#l|B6DSlLxpfLgC&Eh6I;%d7B8O93XO)Hd2 z+ND-dk>}4IMEZAWW)b3<_ZsQ_hE_NQrf_QX41WDq1L_>$f@$4RnAFD?31a~a1oubZ zEc@M|`JO+DB}!K1bvk@tXfhcHY&Xv5GHDpxvyIZO=eqN>+bEKoC3M+k{V6IJl~Yfm zlJF?OiGN|}F?MzoL$<=>tGlN?v+IX>jougkj+wjWi}HqAGfG(-;ZBVNUIzh$C=Vp9 zB(7!TEe~USqy#y#8gSbXky=Xo?XCs#;R@Eq3v%g5M~w5m zmjf(gWLZXkVV)`3kw{DP%44CW&N!ywY; zSGDY$LlrOO1OaTN@wxYyN-V(bbF9Uz5uVr(Sps}4_?%)wHG?+6yw6HUZucVF2yGHY zfRN5*!yPj@4P@~9&id+X3_fq?!^7FPvg!kmV$%%~gZZF6Sh%961`;rxot( zaevs*z%CI4YYxja( z6BPAQlmfY<3`n~43WFljM34%oL8#tXoiLTVgWi%?m@W?qb>OiFse>qB(lF+I;vH-7 zFZDMG7l$rZ2-5!Yam8SY(W1dbg>!z(B)~IwW$p_cDFhfW3&mX*vz&)jB0r|Ryu}iC zQqK;hg`n{?El9Q}deId4$Kv@fJhLm2Bt%L}6dUk!a4z^-xE6BIvt%uUQn5a3i=2%b z^YK_^Uk67j@{7oX^G&7fI@aPN+B^%}({!P3NHUG~Fn-01lAqrdDNz6>fO zahH>e!gFeL^L6aMPSc!+yv>$KTden7gb-IuRvkMG>^6a0Y~Abb=IIDIrc75^RtDE; zKJlwN6d+OUM}(iTOvJCxEj1!p0*KMqCOc~WZ@x8K}ZK4voD1T$p1s_{J?I*PBY2N|YmzeZV$q_{1I z{3OYlXV-rD5~W%$gb_VS+yhl)Fg(7u&Z(T*6td7#P>Yqzqls^4o$3T>m$Fsvj84>x zRDpa>2*{L_T-0BwV+OV3v)RXznG(3#Jtd=Qjs7fmdm!jA!@*R3ozD1ppFSLf1LodO19(e?NI%L7oQ z_~>&Qb+e0x^04Hf@SLL8>=MRM*W4J%vxQTjydvW0;XKHXGpZZUOw-Vuo8cNC0&qKQ z3BRNcne*4S>~J;Ag)jG{kv{U9p3gnlLQMNI(IDb&EhBE>(|k`|QYW*7)*u=&Zi3-2 zHARXhI3sx56Y9@9^A3;N1?K6FtA9z}{<2iTt`xv4d>w&XaHBMwv8Pa+dKcW)!)dwo zWi1Pw751}>W3z09vUW2_MwLx@&4s$Wthxt2Z14iq#Vz#-81AH05Q|s{GUzNVE(ukhB)J zh}5vn7p{1uQ9}jfuFSn$FAyXb%86O(#Dyi8`$5%<7W{Lx#kRvR_2VJ%5pKUtkGn_h z<84Ew$|2U_#i{p!xah%TlG<6kUO_$019Lg~-iGSbRC1@10m%6EZ$*rWG_ul0oF;lm z5muO)azvM~p<>*?(nS-9OlRHi&J#qC22c*QGW6(ed3;=1i;|Du`Kqs!uc*qo1*kDA zIP*AC6)Zfdodo>q6XCK3dy6Ag7ruUUk;em^$M_T)Ibw|^PPkU+|8Pq;EAVrvS0ciS zyx|fqm}u_u>#|LNuYdy+P!ivch(eG6nyE5p#hN#9S$kB&og~;XTiEc3M<(03dNu8> z^GAL6L6LMV0~o=tN-Y=jyA24YoSZE3Y3@N}xNprZ&w;b3Y?}+gdfdQ=vi>de*n(*9Ufhw8E<6WxuVEEVX7cvqOV!Wf@OsZ=Cy z+=~c{9)KWo$^Q>=Zyl6(m-7!7cP&nFclY8B#idx$Qe29=yK8ZGcXxMpEmqvM6niiB zUTL}a>F&Mrn|YbZ4F7zuNzOUR$w@v*9(eh-jSt;q`n8=h^nwGs-9hG1PkV0CyC895 zKWo>#Q-O5eQ@hq63y@uREP3ZWbSy%%;%!}WB={AG^-T)IFa+~0{M;}Ko7DYw<pF=!jgh}`SG+T9ig2S3^hMte!i3v=Qy*o^n{;A@%+T`W(Xi@nNwpLQU8x!_AHKw) zH6SMw{LXh%s>hV6>VSum0M#PV2J%4m;|%G{SzEx#NxJ6d*LP)Kmg>sXNQCE$mF+91 z(5P4nr%EgxT#nKgJ#|u2ciZzvZ{fhY$SLSakiiYPTKyu|Ae(RlxL|v2Dbz~^)o9w# z?DMB^C4_r4w2L?Ty-NsdM1aNz7(77^agId@)`kpVqTyD$k&B4EEIA*PW}3TJoz_Tj zmb(s<@vS4KY<1WT!mBR&uX@qt7hrbNgc~MTm(jyty%RFzS2hT50_%Yy5#Kc}F4iZ9 zaNq>%EU-DO-QVCfhixR6jZmnLuY_szEmDeLPb_h6y&$yZ4Y{Cq_hKQo0&CmdP z=v+B@0iPEjn)EALqrL|8b#7h{ZWrRb{^`GG;#V@1Z7X}#kl6i|a zOy0p{AJH^KIXqGYEz?B?B4eEG6vS){Q(7MDc~(7esSoURtd~D>u9<;A$bIpI$8G-( z;&d3E%ER*}G&L-YTmOvyybGml6>q4&@PQtcFbu_Lwp6kq(L_@1QE~l7+w_ABW7{-X z4rf}rJh>ks+C~Xre!4&Y+bwZjvu!Ji&4^&K(`@WAGH&-LwPar;t9j(14dep>%2Wf_ z(R=8D`(T#_c1u5p9CyRYQ~Vz`jyq5@HiP)tQ(84bXi^YH({#m}QN+=+73G`k7&P<~ zJ^f)6)nj$6i*(e%3o(kW#dO6@EG%s*1_=4qGCP>+GXq+~t3&F}B`r!D@th4X1=7TmWmU=@OYNk}f%MrqE`A7Caw8DWff+!sP^$*Gz5aNaoQE ziM1O1j`YIkrE5lz6_Fd;LCaXLifZwkkQ0SPx^n}y&1L5UlR206p08u6o^m~x3 zX>!C)GP@{1iNs5yW@3}659Y;STnzOaP$cZX>Xr4&+oOc&qN2*7j8atPj>UVQLb<^^ zsJ3lH{{Rd`C_v_F=x7E=(+IyRxBXrMS-OCYUa@D6*C;=bdIgW5FA3D0<#fJoOhykM z+i=wl+6X(Xs`Gvhn&a)KmB`K|98?iDi-jHy@I7>%AQti;b?VY7p+a3Oq+s02KUR2T zA8c*vzA7?LRRn+HEHupR+S+yaT6=B%T7e4llq9HY)bRldyVctOETao}B}0Mve8NHV zkYC7?whO4EN^1(f(ZFsoym*Uvw8pz3G|+cMYOI>Rn)5OQJMd|JMz(g!u6)q9M_H7I zxws<~nZ&*)Gz01e_8hmqp<0=`EN>Qiheo+O=DX#rC^|F8Ev_#Rp5N>nmwjebG`D=E zf-|8*cn2h7`wYbP>6S!oR7)byx5k-ClSm$O<|HnkWjQL z6*aWX@6QVNz($(T{0A@_2W30L)?%9U*I48>;@S(MMo78g>)sF7dYWL{cZ}a{hWLvZ zG&>(_+{z1DE91XHFoxd_x;ua=Z!e%lIRVNmYmWjiH_;4dQ2^jBJGqd!`{ug72xDU$wxo3+E=#jjxJ1KD?Wd z8|J}t=hTLN)o`~>h1RMbWdQa{M@58gQ20ZCjfQsh7Zx(21@flS+yku*<$7B4Bd@b4 zLB|g|Oi!52TWVfl;(DgcOgQq;jCODBnl6F0?dCMZnHEy*tA z;o$R9fHAg3?E!JTQ4bgm&}KlHwmvhs9{AxpYzCj#Y;iK^$c~Xp3p6Z$!+o%TUnbsG$}qqlM!y8+sbQ*s*4-%fvu}rq9wF7GehC z?8s|5XA9*E4DU7%qd7#Wj0Rx&k-6zQq)R9ypc_&9?FxlMrX%N`vA_W}=^zS7#&77y znlxiO60Uk3tqGFCBUTvl)bWU>3nTc>@oUgMm^Ij>&87~tO%$$Mcuv9>t77hL>-gIf zdiDlq$mH-N`p=Z%G^!PCd%d?p+<$M*53VGH>C1qF7e-~BQW%z;nj}b$NbQ7}EY^sP zCBk%mciZ*m$80%e|0ua#gAC>TjC?K+t_2<@lv3J}N8CH0U>rCc!wb=__0V%w2Bo5= zP58vHLOyorp(ZKYV=HrxLfe@i0)ereRRD)vVdDT;)>IEaKe&ZVH($Ll&dx|2UQums zrG1rI<8^(hMlrMSlcKp;%32>wWTrLy8=MJh#RUykpB3wI;`@9^SiWhHq*BwRJ$27IO$V0dq8t4=}5k14vd$p z-x|cc86A~vFbd_(TMqlIPWzt26*7}G6aakFdnZ>Y!{f1RYZPzC8iFxtwug8MrGvmE z;9+hbHRtz9R%bm}CVth+H~qlD?~z}gukS<7GV1&Bz)N?Rt2o}ayVG+NK^M53=5k)q&Fc=8(^` zYlmbpNvd3aln-y>(@JXA!jSpcZ@!WtO!<0Y@uR;;!Fy%2>?FSnmJ%bwrbXgTa;T>_ zJyZAG5hCGF$6rA+^ijd;)n?;(PwgF*Xq$%&_$lAQ%dV9?ozL8i@wVJL>=z|8raD~X zNF9{n&E}5P>Vpk*#+xOvFW&6iYU_@+Baa(kExM$ym2+!?% z=<8Co{C=wQ{k!G&YCY><4r6Vi@*ZjpD7GFGAZ2`rut?sU5jG%#Vxhv7NG({rQT<1# z#m0QAw~I2dr}ArQf!B>RZe)$)dMSYxtpwk;%DB(M-2<+>YDM?t&l8cZ6R_;fkJjc4 zBz!MZ5A&PjBDd)V>4BK6FLVlAW|po39UM08I13N5k5fxTrEB_?v04~>wyF$|mPI&o zyuN5P+&FL=LY!K4vE4T6!F6l(JEUr@<&CwnSq54NjJgaIq5e2^vf}I_#Bc~fB>Vi; zr3LP~MrAU=wG*+H6zMBJpeIqSevo^#`ltK7+Wk3^y)32gI0rGuqX%^dx}NAAq!Yky zo@3qWil?eh2Zu!LyupTF;y{M`Bv}d@_67R)%{_cDC0eJMGw@Z?phq*Qtg_4TwIe?Y z2Pts}@oIaow%+A`F6lvW<-FHecNe-v=n=9c0WWi&n^RCP*}1k)zeRaJGo~WhBS@f# zN?r;#RNV-xthN1};Jo!>{g_beaaiSTQR^M}R~mf`)FA^Kt7vc-<0SAQrB`m>m>&CU z8)+exb>Xb1GUzP{Y)Gr}$70LZ3d{!-Sp-$zrZBPg6&Ys(zpK>uqwx-aZq%WlQgD^3 zo#DLOyXtejS2-}*MN4aSeAt*-0<;`HXnO%*GXJKGk_bqtyaHsNSbv*Z`8Ul>b<6?X zoIldqSeu3atzCiejayHIQj^imqMg#NK;s@lOvF3l5>jL`p7KX$Jy3p2Hp?;BkW%9V zNW*+25eKVv(=b7Ul;*5Sk?2}*QrS`E_V0Q6s+nwGASU4*Iok|cpz4L>to&h~HgemW zqbpvweVev|< zp8q}1_ADS@=`0{~{I5S;z`y@DsMXp^@9%ZU&tJU!mhwM-`*ZsF*JPHAjMAPfV6{~N z0F2*{Eq&(U=im8z-(MSRTlo&@=XtO!2Q$))O~ zKRl&m4{-Lbjg!`<9qsIhUFjElFS#H!Iy2O5hq0RI4N(?hWC{$6soex$Kpm%I+Hf{ z_%3p5klovt2-XMWAKXS3pE2}Gva|xr(Q^;h@$^-}#z%VK5AeCzS0Z18wYaq+kYyMM zi&2wMWHVlWy%cSL9KJzpR-7S%1 zt>6SDJHd%+eSGAF{t+(!hRe(~I%WN9$6!C>Sqv&La@DI2yWo4iK`j{sGBO<>0<dYo4|I2J^q|v&2Jy4aBPM@5Ug@Dx*QnH6Dtma` zudE#P4o4M$F`!KzVPKsdAfhy@o}1-^7+gRmZ)+nba;miwXyY@lo%?#9U>TUX1`qM* zWjhY9zbZDL=S>=h1C5tHyQawGb)rcucP8r~+Yz8?CCDo;-r@x7SoO4dV2W#6cfX($ zRgFXRqEGGp^%w*%K-M$>665#w;?Jk|AL80ryUOwd4lrW#9V%6tE);6LNVY}nkeytL6wQ1HjD!{t!#&s?H3i{!dl7JAI`ZSfA;1_*MA`$G5>i2O@ z&gsWy8XTc^KfW`tH4@k>OUBt~^gMA(J*>`+k@!#VoM_5vzoExtM$5X-j zzi^s>LGrs{03*J|V!~j{yC`1{^HJJlM}l=c%ik!|EKhxSQR|6GP7f0aID$(6`u&#t z*@XYm^7#4u>4#MSs+droO*mZiqZcGCDSU7JDM)NC)e`c)>b{M zC5jjxBuLmaFGnJ`>P`y#HHHpRUH|1#<>PFJxEe;nR9ohI#{rk>DWXLT` z_~JH?LFlx@a7JlGXJw3vY@CyHYkZ6_b*TBT&q-;jBv4d7M=%edLz$qE6l%Pz?wv63 zR}BCNI0~S@Xf^+k@mWF!03rer)VWPJ7P{3#%rJr+F>?R{mWL>7YqSzU4CUM&AB#V-crZ;hXyH_tW<(D#%N(f8yrs3Y2Q`U3(kG-s?FFFt8X4XXWnyFT*n zr`1G7F&oVIzPnXt`I=tF(=3u*9YF!(fyv!woHB199~S7&Z~JeZG~&Un{E~yHD2C}+ zP~UVd##EEwbm5}9Y8P9iX59r-6&L~n#nR|{5ahba@?pf8tJt7+a3{^Mf?w{#)QGEQ zp9WI0Kp3NE7qM!+)s z{zm?@^nh)Rl(PUFT;H#^sBEDK5%i800%%#Emb|Se^vmWuzz)*Q3>TQ^pIU(%D{d!Q z<4!C`jU016nzbjR2sE`P!;_3AcNZ|&S@ZM)mI{rQ!GPUky~apX9#}WubuT%V zFa%9c%CT!+C2i*Vu8qSX_qj;+2b=uya)Phm)@>v722w`K=EfAuD7Nq=aO5G_{0BhO zhKXwJV(_2e2#!jGTAm2;Wu#2UPw@`l-j{h@9h&uuY{D>so2)mTU*3Sv(C4H}jR+$N zXjW#zh+}QY+o8Xe-sx6Ik?^%BHXSEJ=YVpCTmzB0{4rLZcIgS`)&U;;P40Fs+*^*G zZzW4s%#O%>Qd11OGy6yf`;c=PymX!I*L|tSf3Q;k?1veE{vxpb=N`?^hjVC{rk{>d zj=X?cOetUaRO%h=;Ei+%^%$MRXK|^a;UVgQ;W34LB{8bOF(p}vVM>L{ZHbasCgS2! zlGGy&|(QVLCmS-Eb1o5+n}{wV44;R2w}9o13>0(J17ir0hCtoVSqZ?BYOJOctTaVqZcL z=TYW>{T#D%oCr*Lzs>|~xey=LWIo{VbSOT4E;0XgZ5?m5Xzu|0&H&E+@A-XshyKhl z!0VQ40^Fh~D-Wn~?*bKtha)R12z)?I13GFf)X>|?%RCDQ+cvwycE?9JEtUoy&>?pZ zk!WQ!KyLze@X)tFqz5VGM@Q+w4AR&0PW%||KfocAr80NK6srhX@(q5e#a^?6*1+K7 zlgM}j#1s6ne?YBm?Y%sZewBKIz6|N|qmLIQS`QMOJJs+iN9eNhAa$%660B?kjsx!a zsO4Jx11_-YUItS}0)vKl)!#il+&$Z2!f?#1%FCfPL)d$=b`?=hv5^)=R!XBd4L z(ehWyMO;0mVJe#4E!k6-e-<8I@;{Sm|!mPpK5D|>AaLV|4Hy*(bhz+f!U zI}Q6_ITkm8C_ZX+$&7NLeA`JG%w918;XU) z#~5AMc$|bE4CpJkFN;-{L3A$70n*h1=&$PZPp!89N1YxNn%GEH^AgTUb$ct;ijn`8 zgoT5wf?SD!gSV_+hybT}8Cod`&d&L$xIvz(-7Y6Pm*mTKyN$Xv&r}Rd=o8s7;i;H38SKfLAfMX~mrMDB#jDq~{MShIq~ zzp9iZp~fm>@(OH59bYEZpwh2i*|{4;!(mwDhkCoZ{@Uh>x3v4k6X6NDGdcpW7VtzP!3J*+P#&SyI=*$}#fo5}ws~v045!TcHjBF`5AM zUs!^F8oU1}2V_5m)Y$Ng+k8++ZX+u3OG2D#R6^R$Klr~?Sc~fUafT1q!}mZ@Fu)Ng zTmU`5H-YRMGd=C)k$LYmof$PetxJ_3%ZkyvsA`>~>_G#Lm8g>FT{@Kr^Fkmk?qrxa zfD2g+=$ij~fnHvzFGK?P(u$JSNqn%a7gWs2+NPUZDv5nLd96|6P8SZ0>WJ65?Tk&5 z3gMD&&Npzxm&g!%(U*JC)zy0#ariPgowwK&>~~&y=)FTSDidEM1{Yc0qKTUJuZ$T` zXFp-3ZxnmRzkLcL;v8WVS+)I9b~KZz2`TyM!9B_2}> zR}#I8JGBGW2WC7YQnbV_5VXSn*ofp>|Au6?0zF_^@_l5n4_}om;hI{Q-iHY4y5eM& z2*Fp|Qp>}PHEO0ng00K{XaB|pZI%}U}7_AeQ{X_VrpJ71e9$LMdt*^5>K15k1 zx_hA==MyuInh_W-mT8XcpiHHHW>LYr4YOo$VuN=)v|GxN1~mGiIUrQ9_Bb|WO1^7W<=*tI)sv8F&3&lFedx<(PzULTv9 z=3VB?Y7>MAK+4WMY-+u(a-(Cdx#B1?hpnYovCPemS;rF2{YKuG;p}XoIDa3CoXrnc zm{~TJSMR~iI zDW9ZLE|?NKqxgrgR&=2vZ-F(3L&Bc~OJ5(4Y;3dneH{iBsM;i@@kSxkvO)MbpMpG( z$dH}z>NJEpmUHuzxG3{fhB;wF1=3|C)-|KjVs=hgvd}^ny#F?s>gCiPleswydB6&o z0O&8a(|K0;fA&THvn{q9l@Y)C&kvLXv48(SF%SCF14Z6V@%GtcdA>dViy+}I+w}{h zN+D7JmjwmQmZ+gU(CX~Ci| zY$d{%dm-`W{?qn|ik*l$a3hA#K?~YDQ0^ef@tc;3A@8mSMorDmX zvODBz8c!;@P9!6f8h*(*WUu9o9tkngA~k!F+Fcn>QANiu>-2k&rVd|`nOh14SJS^0 zY4>1h7Q>WcdI;~EH3Q#=#IS4uPq=hwwN#UzTLBCD<4*8Ot0)9D{6OM*WFcHua}(zy z51U~wMsGo zca#RGAN)%@=AU$}A_|2ig*%E86AdCbQ4uHy?b`oJP)APaTZYjgA}U7L>e3PItH z0AH7H@2CR56@j%0dlAgkBxpQ{8bcDYwd|%-@q?dy%C!Jp1;T!7?Oxvmzqz$*My6Ue zKC`^mWruDX&u0D>rQA7@zjGA3#_w}?8@-w#Z`Es*Jp4^?FyyYeMPvkr~>c48STJavw>u)jC5uOd+Hisa1Q zlX_3?@IDk!x)W zXVfU1N;c)Of>sz~VN|FSuo8UhKDYh)q8vl~VgBqaKF7=diy^eXIE*hkr9WFKvv8?r zTkU(p-4hH05=i!{CmtXB!>zSPE^IcqntYJNbd&li+aNV*!a(!MNVI-VsIM7SCzyCv zchF)qtI@jz#Yu@0OTkYzfk?b>Lw@Cs+2Jgpm*nWZ`=m6-KupEh z0o^4;3SEFp7yJ9Dz2@xM{0_lhtIeRDF{&QUH65kdv~LHA!QHtYy)cm7R44o|ApQDmo5A^EAnCZ*&HJB zt^e_YD}o%HLlVS5nVuY~d+Uw&$S_EYr?6qg6Hgev(oF2Lr>M zb62i?mvqY$ZqOUhXchxxZOW0nYRmW(ikF6^Wa>zfO`jPFb$BkSS*4XKg^*)x47m_j zrh~W@It|YJl()&a!|8qVR&*$>T26q67{BQU)B9846zYC#I&&S6JRZpJ7YR1bF~w*c z=M|-l*{}GK6cB!xuSX7Sn!zTi2ORRkL!d6zowz+7+#odh4g}pv@&kDwvCR3+m~DS( zdZJ-^8#|(aLIz1`Db&s(a!wW;yfMw(c6@CA<-6$_CjgEfd9lmsnPg(}!->$s$y)CS zC0bZvjOIyuo52=l0+cv=pjRx-_&Nl^{!IN0l473RV(| z%2HXGm}K{S@Vd;qfw&5v1VVPY&i3F<2i^@4)!^XUW2kk}U1257$ zg0{WsS>Vk1b|GiqcT?y65fQBlYg$KlP8^w*RoORf%I+)P;UJIA1XMJVjb(l#g^*)6 z$#UF&ebW6PrQAER^IUV`9-&i*cYk-Wt>|4RIZ|7lEL|28*of!1s#ap=D^C-y8<&IA#|M z{+j+Fz`&>3d<3b&U+_!DKVtsWM1cA5t>~ z71k;8P-=|;Tk$st#AtCYUU(218*n}sUnQHWSy-K=XcN|`l(^uK)qz0?LRWmRIIXBO z-RhT!<#tr)=Dt>Y=PFqr`!Q+5sPqRg3$`?P76z{Y9=GjO1(FnUTmPddNNAOHjZ{+X zNeGziC&wB~QRaC((OeA1#7?f8x3&}}Uc3`7x`Go12a9M<8YCHN!)qB}Cj(=i=2#^Y zU9)B+R;x%@X*Zrk&N;LnrC7X6Qr|P6OD^h$T92}^r7zjB6PX0x+@E{HUa>Qou|T$5 zPl#}uF_D64<0@TzYztVW^wq*n^QnGtcbtQr8;_V5Z6xPZylQzk-Q`t%c=WEeROaae zZZ;?{$upM=mty<=Vj>p1m}&lVWMmUS|Jj-PKMkIZ^#?$Tt_vSl$iB665EN#ih*Y7D z_5lnfsb9&1+_O4=zYX12`rVh~(UY(htXfEhGSIZXs882g2|E)|rH}8j&KLP03bfHO3~KoSBWN( zYCTRq-+zM-rE z^!r%Cubt2SjTj&P7GgvZo@glgULO)Ni+IF$N#f_$!yIIIBFt>;w61|?O&Pl%$xjxV z!7*ktp&?IP5GO^cqvJ)3AMH@$v*J_x11|cLKcEMzUho3bVLIsb%`NCkrxy9=7t0@) zYT^Ez1b!Ys@_VLVUQjRCevUI%0FVfXe)g$e^n3F5S<-+^@G}r0Y#Y`RZhW!#`!O0; zjmX^7-T6v}2|019ANcnNVx@EXxVOy)u9za z^%g|kkp1dFs0!^eM*$@L3ZTF6^!<~V9{}OhE_^^ZRl33o4DL8q{@f&eVQY_#;005*DGL^K47p!J zkC~-oE?63+iYW$mP~w_aE1$2HHG5^g^R7o6JkSS(ZxT6II5#ZPiF2H^pnCNE>sVygg52d z%jXEOCY(j;%ojQ|-jF5eW^l48>3U9GB!hL{I;iLorO2B<66>YNRWu;#(G5k@G{;C^ zpjiUWrWqUo=O_n4 zP09Q-?MVf`4~Qa+ic?D{iGf>5q97wJ7N@h$qr{=;Z|6`=lk;IrRM=TMdx!v1A?b!y z+rTfvo&`pU;LjNyZvg#1d;Y7b`j;R|q5RMQEf5Ao6rycq5Cv(+rS{;2$U1a;>5bKl ztZ&5nbDR3SZ`!nG$uS#BedusAhEpr_qUzI`%1WjNBjH3KS*->QkEO40dU9}OD&hQM zdM;d=&O0n|&IENtqYbRGlrI4T7U)UtLk(?TaIg4!Pw6?z5C#a^{+|1nHtP@m0j5e( z&SZ%m(QU4b{XE7){HtIzg9?RSxi9>+yoB75b)Jr7DX~3^(UUU?36FT~1)|MYS9_kl zR;~#<3H5S8f6E_P5|7ht8VF$b?dxrmGi=4aD9Yrj?V+<0Pl}?YjwU?mvxUB>PdAOa zgd@m;ZnlqKQ7nU5GxfHv_a`9YsWoQ8#C(_pKnX&>RVGIeN(ha7V?riS+3KpR+zWN+ zX$pzyVtCE7sgAAy#-w~GpQN_Os{EF)doRaf@2sikI$z0u5t>;@%SxWuB9Y5w&$l-S z7@7Kfi+)Eq#6e;sBu=~gpuQ&mTL8Kx=e8K4fa#_W-i6`S`?pX@F0=yOg@{eQaRcii z+)YBzBHQ?mR1$e8t8A>|$(!A5^V)m*`^R@&$z*eHUn_^iN>8;$$&G)CgSmHNl zeqIRXtUWyAY_8g#eyqQT2eLd^-yES@G@3}q6@L^m0>8oPrQq;t$s~d2uJ+rC(+4wc zcMr;si>9@u93*un``cg!c#1Of@>+Uu86)NPX%7A*84#kG0on#lr;GfLH}FM6r3B86 z%KedWBIcZzKGI~w*3@Tton$hN{7~;iSu{^7pCHAqadd_xN4O9|Y6|zUms6c} zmKBMOwbOpRC(!f=oXi0B6A$ogBmJ#zKcB9DoG8~Qeg#0sQs0wXR4Ot?=w&YDBYrx~ zW{3UDh{>E>zE0wdn1XwILC6^6J{Zr#8#^t{HGPs;pebd@qAnyx5=qGUbqquvsubQJ zr!issEX{_X>sa=I3bX9RJrBgU92=(CZFej0bF%kI9sDuTmn|urcxr-y>@v{lhh3*d zK3Di#U}(-Jk*Nq64hWz80J+iu@hG+e#(v9HeEo0YGSD-E#-uJLXau%O#O*`<=q$%x?b*Ou3PRgWI_(A`eLtc zn$O1?u{)I=oLRifK#DQ(~;%qhlcW)Y@$eM-h88u5}7=l`hn_i>(a^*+H!5 zJgM6jI_PHtN%({qXQ=wg1%5+Q>YhZoIw3gQ-E^9NfrRSCgY^0c*f4%T(2?#xZrDHl zYpS1x z`8&ZBGFcu+9P?I;4`!TEKisg|xK%IDUf|q*lKbbREOLUGSFm)fvV&mU*!bwLImBl# zoDgWReMhk3IM2aBr_m}@XdzY0_I7mKAytWMtTHlbGx6vjC|Ba)O49AZODYnF%*FK} z>&(Zve(Z!T^9_+ObNvu0^I3h}LJ`$s;{<*1>5JisfAJ5|gg$NG!&`K}Ve~S>tt)DZ zjCY==`gZnOJSnVV4gy-S22SK0Pt_K5Ju9>Wp@?jbZ%r&OMxr!XvOJWCLzcA6A7A*K zAzC0@4SWYz6(8e<7ys6`s)448M9#Zn_3HLSfuU&yE++!Gahk! zAbDi?21_M*)C;)-kdi@g^uaG}Bw(s}nC%yu@om>k?>-w?GKs+d;Kaibob?YeFY{+7 zwirSn{3!FQ$tf+(3V4q5+XLvo=%xPC5&mU0{u}4wA6~;Kpdpo9KPYmb<3Pc!5n_+B ztQ2dGBSnExf@1-N-K<6ds!?yMMla|H-h8 zb*Q40#UdYK%Sl@V4I5*ffw0_3X0@utRQ6HYjM(@!l`c)fn<`DEdC zX$Gs!u1uNB$`al@rbuDDSP2i^U8V8|&cnVaYKoP<8cHOf_g6I9!@zy9#Wlu^A1E+9 zyK#KPqbzF*6xPnmRYd3;nUM4nJUboE*^^}4!*`dn)4ziW)kvDG zZ_Sz(1*cbS(aqHhYNhBwAf1ti7Xqcits9D-T3w(s_``?k`iy2ir$b9*Qy4GP_2g6QfCI zVL~+>YDLhF2O&;?I0+ep6p3H^-uBvyB<*z_3Yw?20AlpO@M{Q3h`~ZDDri_7b}$H{ z@cQ=oVN_rY$fI$3!W7q4+)q|&yiu>FN824+#cY6oNO!W#EgPEy?_zsa_(wH3!Ovy} z<{#A!-L|^TqL&5+b&-&K_1h`tNuSCC?KiUOEM>}MeTSDqfHP!YBJ{!S2Moli9ip?) z=)lq;vL*8RAidbK2@@=Qx|U*171t&|#pKE%D&n`=cI2GxS#d*i;5nCrX4%YbrW5Z{ z0yX;AiGe+G>Ug$eD^bA@fmI5y0(#<2d&u)nSqoSts;|lFwCaftmPL>8j;RE5>ZUF2 z&=#UNYMgCD^=a?i(auBBbzNDBS9V{0V1Y~vSG{|K=~iENkT?rr5oAtNUa7_gMtWRn zx5~QnG8Ni>xyc&_P`Gsf{l1<5^C|v!ItRdzhH^YZYlH#Nnyo?eWZXza8)l7;puP!w zx=3_00-%%Agvo6X11-123hCfhSe}q)3 z{~l7o^m7~eBcx*F#G!#MKkPdg$wvm)Djl{*n5363GNMl8>v>J-ZL?J)`!PhNaEShB zr)dy;mf;;8*tPw4P^E`($(I3@=cwIZM{WJg@pClg57gEjx9g5n`an@{A}*tD z>;ACH%iYTgoD48ZR-A;sJ&u}6>(5lGcdbZVd1xqDvQ z@@kufPFL*oZ|tbO{je9wj%b`?&Jk2T1TS0Nw^fIx0|TeHV4iM7pml&aR?S1At>j0k z7n3>1nj%RH=Ptnlo$G0O8((FP@FE2_&{p961t8!Sfc|0%?&T<=zlBr6{x%j(7?6U? zrjlX@%Ez|-Ca?)dnG!`X{zXR?3Q*10*xtSH@bU33d>=!F??(WAJCDj+ohL|Bgx&sV z*;A-D2_R_}B-_A5?C>mx3ahrcryO%M+p#+L+O#5|3tAO>0TZM8^RxumIPUH?z}{Ya z#>VRBJ?N1FRBwCUg*NqkVfsL_#+lZ3mCl#&@%_PNn_I5tuTF@hP-O+6PvT!ru>CuE z|FS1SE=EluPBRE2K|?)4Eg@CmwO>IoBKaKekd&&Zdd78QL!*dMk93Udj)1*zNAlq4 z74-n_NH)M7`D;10m#o`Z`vQEDB|wGT-Frk4&q0sKV^iuD8!i;C;(0p@#U$zJ#V=G7 zs=$IzuGPe3=2N<4LtC4hbJ2=RCW3r@xH`>KsE_TNT4se7Dn-(flONzGZ0ysgZkreu zsTo#JFZM7ctz@xR1Sr#Pj52|rzQ=o$M0+0=`ab2#e=(O>xh~{?RIcwie#5Nd5+P*R z$nnYcf<3}`lDMO*;S}?u zk{&3Q9404e%01FY=*VWZ%Q{p~pyA9SxLI9eJa5QU1J3z+1OiltIUMtpLW`5$R(_Ke zj|xNY=10mgM(k)ZE?=62pFLo48PJ8WsK2h1LltEr@fOcsZTBKz(niZ*p?U}U)*hxY zY@iB}77DM^3RSHmfI0zW=hiJmoib9iZBAowd0!*_JxnVFLt=fu8Y`O2Lc3u7{GD`m zb2>9D8AJ!KCWXPdM{IGV85yC@s6?aMvf%p8n}gxypz)}Btb}2}pg5e^!ZGGfvZP`e z@NdEWquO=(U)X9Z#Sk=?Hw3yEDu$vEB(6cO=!RWF7SJ0=A5+hO7?x6=8u9DU#2>Gl zsHM9yBt0v0As@g(M$4;=Ko%`^YcbqL;0uz@1oJc@ni1rpznojEv8{9~zZdi_vLqp#cT=f5*jes)J)+TkW1nAEQB0k zJ}t`CZGa-#{U^1e7yaqYa-82n176aAX)XVO+n2AgpZEooRz^z7_&$e09#CH^M_^>C zBWpA;ZPVJ=Tcfwo^Oaq$)93qKw!u_?59n1&O11bjx<`IQ&2YMfxDBBi+0wT+BJb)S z$`};Of{Rs&h3x1k<B?9tZLPW=kfG20T%0bUF!kZ7r( zO1C(=NJ{O9`sCWBBWQC;);9l}f-G@la%TFRV^3T(a|9UdyTR%{1vCiY{7>&MaHWQD zV)UWr7R*D8y4@#|WNcW!z{Epoi3rzcLzdrEJd%-)*cjT8&Q0bN45c^wUaI?Naoth} z?Ej;>qjX$152HprmXpu7o=eVKh)nY7wryxg4COBrA zEfcP8rjjv4xj0O-5P)9#SrJ%y}G>kDr{Ga4_IuBe&>dza4~@=UuUU;r;?nKBcZ#vcm30*o_RSf(bK6))qH zKSP9n4>0`G%lYq9%>Jwt|L?)UBS@n+N`O_@0}vB{{zDG(p8<@YSY#Pie})AMPq>SI zHpIXT&7cU->^bd`$_m&{<$o|oTk4By$V~OM)PWkg^}+sP-JL$`8qpa69|XmjSK>7= zA=eu&O@mp<6Pb{+``~(&uJ%0#u{(0)q3u=kiZSU*ACA!ScCCSwYG= z34jH@pt8fj!|z%%3V*kPJE^f~6lLUO{Xx{TM-Cb}Rw&f}{A*KGd+%pw{;vI_KIgmc z0})D)?Q#6exytr2hj~dQm+q+Ns$Hm%jDu0))4lcMYXbM)MAxhsP;=E#kQj+s#LBp@ zI_<6EzORl$ zyb2u~;KT0e2_w|+vHQ`*Ko81K>&u$1v5(F?oM%vG*qk)yhCuaxRU(R?JWZ3HO-C1- zav`1ZjqNsK719r+BQAfzjnb93=y6a1wT1Hv!VFnzHrh9G-;2IM2gA;;t8gyQ!ziPe zqZc=(jmTC?=vif|zUCkEA*XhC(GuBHdiV7zZ0<8&P?4l$7^a7H3I%S}?MXv)p@0NGZ zZ2;N;ME_f5`6bx*cU`fuW&zkKU;;p(uT@t73~mYAo{9_G-IE=p;}jZZzxVq|X7S9{ zXo7REZ?c4MqrTT%58J^8_B(N)`qmW=Yj5>JGDa?0V*y6m#(jB>Jb^E%2~2iJ1)Tv9 z7?pa#ZR(w1pAc6lbTrdta*)QVx#js8E(Iidoo?>R<7_V6v0ivc0o=d8XsG@^YVFxj=|}J)0Pw**_B=hl;;%EguEx@(;bFsiR1FIL`~EDD!I1{<%{2;c6j#7T2ayK?-GzH2#^Phk^^7) zKgMU{<~}r{4;`#kz<0!nGQO)JzE3BcHm?i!yka*;RipDovH_}(lgv@F{VE>3gh3sB z7f`Xm*)LM{IsprXzYSB^3F2MCz;3s=H66^*#PrqWVgy8!rDi(aodt3Q{r;-z%Pkpo{aWH2A&|Qbg+5Jqveuyu z@b$Uzg-611MuaUGfwKcN$Z>g-60pP&C@9_Q?}L=dsx;Q6myAV4esN-BZ|cZJ-iw+9 zInTsvv3#fdLZz3HD~oDu7rmm_)2hS3WWqw%h2Opc>g-K|RJ*)xliJlMyHG^$S*qQ< zrR&^*lA1>f<8=G#F~*^ycG@OGKlniv@uQG52v+eW*dDnu`YXkJlqFqgxjFg)%2N68nHdnl^Jd>E9S+&tTPqV7 zB&i2rj>Nges1xy4nYL-dv2SP24SmJnNH%IC@V6z!QpIKI~&Q7lG1 z5ZglQeZzv|-$mC4Z@c^2)h~0eyF2T|PK&O_6-e<0*Dg^)nx|c)KgBnWsuk~?f=8gs zbx8O!P{;Aj?4Uk{BHzo374MUQmafd=L&Ut(GY3l}K&__BWT?{tuAhJHz(Dn(nJn|Q zdPZw)7wX6k@oE)QOysT`ZRQLo>^gUjK@WYy3BvqhZnrNfFf&jwF$|^H5!p&jE-Bx2UBj$OzTGCU(8`6JC0xSrL86K*0#uKzwl=~uP&bic^4|e zCA>cVyEWNNL-Tf+fUxOK3mga0jT&bCYFc`CTeHc59o2-@+!O<($M-!#(%dy{E-2Lm z`2LJ5A^%@*X987I_x|yck`$E?rIe&eN+G3aLYkCD70qc-X%JG}C^V@EAr-e!l86SR zB2+3(q(qX0Qr;42@Y@IXo_mISj@Eyz|9RJO*Lv6L`Rwn0_St7o=XtISd5`>ftglwT z^3k^Zmw8VzcATrpOzm~#@f?vB$z`!R@BgATLs;sTZn8qcO2zq={WGpj6@F7%`=Die zP?wrT(;l0SvXGh+ZO)Qb{isAc)pb5W&=6M-^t2Orf6yP!9mk+3IlK|yK_7cXBBMvg zx3og@O^Nbg$-GoU8#ArlLDSgh2=|Tmjqh7*lO4^ra{HmL&j)YyNM4Ti5bLP5)Ny{| z8NhC_%TQ2%vc-+#MwvB|vxVf^j`7%)&nWoBes)~+joYhrhfak0@fMkK$~?BypFVe! z&n}kqWcBpx3mu>M2~PE@3E*(DkoNC-f6z3Sr8sP-n7qo}M843uBhwCETiJFl{wVLL zT;Fc%*DKG?bx-UTau&;b?b?P;?;Bg3=FSc(fdh=`hz})W#>Q|$Jm{?xXkuvmI~JLx zm3pdC$DBMb;YuR|VUBaWhcEAJDRH#atGxVZT+Mn7NDXb&}>r~d( z@QdcQ-AtTuS=l`&shzX(2E}UMzH)1c+~%oKAr(=xIt6S7B)H4?9er-?87liJ7`iu4 za(IrCqxK9MD-I_@MRxY3r&X-8V+$e^hgYgJR6Vs(bSpTlJ*SJi;Q zp`%N-tERM!L@&$p(=)v=BWr`0o@#oQ(3X~ZnhK|VlaKT=vdb%XZPn-1$k z*lB-G%5Dc!-_vI;g&WQbj615m)=ob&U#_{qfp4m3ez1Y2(4x+DW{(9{yc)fDM%}VY zFf~U%tvax-XXrxLk0rwqRk{K^hkvG>ZZyBRt8J_7+hpY3u!n1@j3R8xI?x$40s@&zaSX_+9a+YkEf1C0RexYvOdoFv=mIiIL z_Y2K;IQI5py2Z&8W?MsJf9~^sS z>%3%-*!B90GgZ@#w?=4W*QKXK9dFcBNKs;`F{nDxevF5E)vqTHy{eZOoH+Ekp$Ftk zNG=)e;S{P^*cjK$x^e1Oe!K7GaW-bk^Y$FbU-?YB&S@ZOZ@E@U_Sfs5y+R~>Kh}RL zT;P4y= zJJbrC>Z%!=sx5XgsUc+cU|_RK%%zjp%VHL*aUX4-^Jt7s{Hpe0{#g%G7P5l?A3$Cw%>9;NLy(dr^TBrHmu5;Q`h@>YoWlRidCadp&g$zMh6--IxQ451O@KQ z-&0Y$n&avnan4xJJt_VgyHDr3D2#BvS{clp^f8xmUNDkpxly0!s+BfPcMo(f_02N7 z*a0#^TWC~uEh@SB_Q#y$j|0wK$zf{RYYb=p5;43LZQ3u{$CLamFYyv&})Y`=}##ZxYY&HMC{>rWTg-tF_;ko8tgVAF@$ zcGlFjG4et-ie37TXMV1E-2d_8^#01x)Mqz`KTB2AXz*OiacGMy5`N8T-(1wSdlk&_NJRu$=Wcv=tl#StB-3XLdMq;Fa^5LDXjb z|6w`nZxYb|kL4_Tb1zS59oL7{1;{BJ(<0&@u4g#^7IFEh@j&|w&{ngi zxesQV7WPKEYZn;(d;+5%@^-@bVea2zf_)a#Di0`x!z}_hSS&%ub)Sf8WX5> ze1lh9beA|kmul}AEKlODcMVERzH}pXk7J{CSGQy2`o?p)54*$c2ZsL3i(tPyV0x*T zHDmRpt#OGzyW{1XShLr6`Ia48UAZy&$EwvDg2yj*+nZz^tQbD2c(rJit)@xWWH!;* z4c<`|$`Nb6hefbjQR_K4`{zn2`uZHM*xi^O)ybCFTwvBCd7oSM>a68&I1;u6CYT9q zD_q|D`KQhO(BoYECfj_D9Dg$_!*@o|LBE#r6+KyT4~t}ZkJ)h9QP`#mv#JFJdV1;Aw;e@!DvU};MBPi;AaBGqm znLg%aTHYOCHwPTaTlY4^NO4ebT~W{r*+X4EbM+*5sxF-M^-E$$eec1(oxO%JJx!WE zXCiat2GewH(#6_Rw7KW{>v5eq>$OgP)b|y4VEyy7N6qqUb_Z5iS;ajTyq@yGXT#R< zJA%`ZBVmyn;WGK4JLm)-qYw)~kA!h01o&s08$#h(Am_ZZ>vV7H)B*48U~rB2!P)&wgJaEPpy^}DjRiM?#xe^Ez{)vucO zpB75m`j-1EhJ{}~^_4?uXl!RxuE&D-Jsk3_<9_qKzy7ez6>weP{$SBw@3M`{w~Ebn z@_+v`cIJl*X4glr|F~W7Yq2E_-dU2^>6jgKY|nY|nR{h3 zl>-+(E={f|EIVX=CG1e<^YF5Hvl4rUXR5Sv_RLS6WWK0(c6&vHK}q)H{nz@V%6g2t z*f*Bv2CSFdps&qmu+buaeY(lJw}av}H^VM<^X**4+NvWMlWNZ&enZ?S_S;~qhqA4# z*&{iZguJxSldi_uCnEfx=$zSN+j=73F>+Ypjymt8{)Zw{q$6*&lvH!S9+|(kf@?;+ zo_wjkN$Je=(3R=$*G)6Ky+O60cqsU(U7>(B%lx?-y7z37U*6XGplv^;?Yf^5B{<*`upfpy7ym-Tv-Uu&#0@m2zYYw*TUhn*d>Ys(q6T0egD0%8{ZMY zpC)@bm@RXJt^UI!%4)S&e2uQ(er5U&+`e4%@ynp+ji8w2;oP%6Ym8mHuauz`6E_yO zqo=iMD8}9TX}wC!yTP$9Pegy7-(385#mwzXmPh}L-LCO1de(W#Pf16bw#AR1R8TOl zIoQ#De4s>1bw)s&k#Su37y0&dYxVc}J8Ir)vD-d$zg1Qr9I|=4>A`8TMu*REj|=BG zMBM&*OToH0)0DfXFD;K_<51ry>a>Sg!ui*U;Bo#AZsMpZ^|Qovv@1?bB7AV58;S9-{dpdPQ~TeS1gWX9mZz`OJPq@6#NZ zvN3QT&mKpv(B6bgZe_9;g`BJumc4D^+*uo)#$miEqNYMrq>*j#S(p0MF_z&>z0X2l za(Dx6GHj&7OTK?KkT{>$a1Zj3?M}98_6;vGnebH(#GZ$m9L#05Qgv{Rt2721MMw@kM z=AgesN3IuTFxRUo4wkB!oBKULBQgf5qFue3+sKVEzNu)2X`)%i4vigVWnpmvW}pKa zw2Ml)JTb$6!{mGTqX~Ym%qtB5;UTD6=sXbZqEaZ}$RSBRFcy8AA1#zQ7830EO&WS{ zL*rkh4Dl%wgFwR+e|ao{cYSd8J|N=`kO2)|X&069W`cy@@uRT-?*ga8asXfl0MObX z?V?hyf^Cfn)DvTDR2T!9LpMt)8Uy@-5ALRsVwgTV%NzKjrhvjf12?qzM!Tq#zzJBz zFFCEL9{6fkI|vM401RXWJ>w=VIb%a|V2FMRR}c-Ob>G4eUy9IlQVhLXWZi614nhtAM8vGYDGBs` zlA!6T)0BW;D&@i)QV2o}Dhd%+&pEBd4bZm^J>W*x+esl(6s(7o!>PMmvs~2kJ$t3vY=OiVsy|hD#aaqiant^p?_$It(gCUGen>sr4`)EX$bI3rHD$CQW!K4 zAY?<$P7VN**q(kr$N@9~A&j5QV3oLr3%BF<^cAwC7`hT-M%P#Infw0w1lgBJEFonu zwo~+(b*vmILAyEleaQ$oTS!uCbUEalOT~q*8o>E!Ko+u@*(#E95R&|Sw!1sJ2e>%n zjJMh*$BJJ=Y^S%N@FcRyC;{Q1-h%LV=_km<6v{5#= zfotg(mEsDzb`k1{sZgbD>_U4BSXJ8|aWi=o*L! zma*r=As71rUmywTx}*ez3@~>Bu?4Ui!jxKLpsy_MgB#h9sOw1yum)!4mvbhMae>0W z0}~}JdMkxqNn;yG%`*zXT|vRhnR;Yu)pQ_b26*~_qv;ow;$}d~qs#e6nEG^C{Q&?P z24e>B8mC`WO1&Ww%-6xm(*a}(^zioqnNa?$w$SD{;EPW`DCmbOs5E33KGlTCCgxNM zebz6(!@(C#S)~8nJUJGQ=E-FRLhLpo72{W0lf)JuG^K3j_&v%{ObsLz60`ws3u-t_d2kZJLmfUlV#g_pK z8l|lTzqE@=dErXRVw8rNaN{X+W*ybb2MDMaL^i}WH&Pm1**~G4zKf}I0GLkjlp#CY zzU`zaMq#wcGM*m6n*RIH3(5#I4lv`RUsOuE2PuTe@LR`3a}Qvc1sFz-sFrz=8m3ni z5rM-(Djxb~H3ba*kqbIsc90T~^}{d`$E&1mUVPj+;LzhfxxC zPL3xl_2#t#=;_4vJ0Ai`adcV##`1PHIJN>bh%z7#+5CR)B4r_@F;39&R0V2&TW}qy zf--d?n_uK^QWC6+3{#pa{V^F}`oN9sZ{qimVi*O{X6txbI+w+NzX|{|ffi)9aBwdv zgsz2%5VYx&eLb*V4c_0#kuW8glz@;yo3!KUU_EhqBopYE4M@wuFYTgIu7r?MU>!sV zS0V21T+p~~aiWD}gpwi{h0rJOctVtPt{$rerKezoWK&2fbRmQYt&p~6Q}7zN2?ig? zQBG|bDS}Z5;|v~8%iL_|%3PpD7-&Jdes2URh^~c<61Z&s6-Pi&2a=E!%3)FpLJn;* zkEdndvWVVmKnu2ktvX6dfwd4JDAf%ayFmk!0S#;&tpS5yDn&Jt6u~Hj$uu5M*3g^{ z3yT3m1yrCmf;l^elu4I00ib%1n)bZ8EG+B6;C&$ixEutaV!r-ms;jAEs4Kt289k-< zes3Xg1~LQ`fJH|7MWw`DA~MKq;Q%@#M`J+7&^y#3bON+P9SVlJ%nJ>jg(0#fgRoUZ zYKzgyG`q9~6k}uak0GEAtifY|Tsod~g{+K>cK@!Qz?DD)pflXl%1)&`13fSEO2DaT z+S&`QXG(_|o3n`+SSf#2XYh2O6P3dZ70{0`uP%&^ zKM1S{bi!~Lz?VY=z>1)!4@b8tbW&~@!3zdJ6VULRfR(@)LkRgMx(wbM%KPWd?P0z1QBA;i6vo7#(g3|c>bY-u=R#cEeK<#m62ia#b6oe?0zt#hme8w z4QhQA&pqg@c`%IiA(5cpFj&z)kkFa#U{XFI3F9FY3tNHcyjU=4;0ci?L?7o&ieY^J zXwVqomr8kAL4?8h3AI{`=O%ROC>oARxmZccqPyuIKTBAA;+XW)U&8iC~;k{+5~LCo!= zbL7DGxt|f)M?3lt0bBFvEGe*kk9sou%xt0)dB8S>8p&*;ssvkLbkYgf_|qmL<2X%) zz7K%cUeLK5U{2d}QVxR(LI^qo0}P3NK?K2imyW^K7&<^c3^8pXgWw6l5*WK!ZZ|1{u7bIJbhujB{yjqb zXixkhV5KA^WJ}V~sOTeUaBVZa+g0NMwC5m+CfW6HsR{ewgb5I$gP9UZ6*wtnOrk#)>-0Pm;b zxd9!s490X0kz(j>AZDP0jlqm#--#G#PrwwcGtd!$V8+%_G6s$eEP#2xq&7wb!209Q zo-m#>&@psi5pT&EunOh?bo?6_5HU_90^^B42y88(BeTE&L$G1XyyrkX6VMJAIK+>& zj*gE4TVDh|a$#;A;{)6cY&?&k!<)dwW^y9kBmay;2P1)TNt1{KqWyyl#MUP|$^(qc f0Wl((*C)bTOj+z4kiARbzipZ<)lcJy-p*cA2m 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 LeM2gyKmPqcN0xVb diff --git a/.yarn/cache/array-back-npm-3.1.0-a52d25f5a3-7205004fcd.zip b/.yarn/cache/array-back-npm-3.1.0-a52d25f5a3-7205004fcd.zip deleted file mode 100644 index 7e02ce53a394fd7231ac24f0e1a91cc46807dce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5317 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 diff --git a/.yarn/cache/atomic-sleep-npm-1.0.0-17d8a762a3-b95275afb2.zip b/.yarn/cache/atomic-sleep-npm-1.0.0-17d8a762a3-b95275afb2.zip deleted file mode 100644 index d172f9448b52e86d37eaa813c5f3236f66fca8a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4031 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 diff --git a/.yarn/cache/camelcase-npm-5.0.0-c808398846-8bfe920e04.zip b/.yarn/cache/camelcase-npm-5.0.0-c808398846-8bfe920e04.zip deleted file mode 100644 index cdc64a3c0b368c7de85a6bb09f25e3febea2b3c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3017 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 K?+*F%Z~7lA=SR2z diff --git a/.yarn/cache/command-line-args-npm-5.2.1-093a68d295-e759519087.zip b/.yarn/cache/command-line-args-npm-5.2.1-093a68d295-e759519087.zip deleted file mode 100644 index d5cc8adc2c349144215722ce755f3ef846724b4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34410 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 diff --git a/.yarn/cache/command-line-commands-npm-3.0.2-782bf8a159-2cf5409af0.zip b/.yarn/cache/command-line-commands-npm-3.0.2-782bf8a159-2cf5409af0.zip deleted file mode 100644 index c7e7294a472b965ceb03f99520e00691b27e0b47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6923 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 diff --git a/.yarn/cache/command-line-usage-npm-6.1.3-145c2dabe1-8261d4e553.zip b/.yarn/cache/command-line-usage-npm-6.1.3-145c2dabe1-8261d4e553.zip deleted file mode 100644 index 17bff004f384b97ab2dcd8f6c59f5717fc519bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9014 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 YJ4)(k-~xa3$3H)q&*N+u>94nc0nykBqyPW_ diff --git a/.yarn/cache/fast-redact-npm-3.0.2-98d6f1d433-f4ffdf48f1.zip b/.yarn/cache/fast-redact-npm-3.0.2-98d6f1d433-f4ffdf48f1.zip deleted file mode 100644 index e74e97b048abe1b5e06c090d7ffd400871370050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20927 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 diff --git a/.yarn/cache/fast-safe-stringify-npm-2.1.1-7ce89033ca-a851cbddc4.zip b/.yarn/cache/fast-safe-stringify-npm-2.1.1-7ce89033ca-a851cbddc4.zip deleted file mode 100644 index 0de375bb1a1a1f729001dc6de346270a8da8cb44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11598 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 W`nBW%28Q(dfq6~!u>D~N1N%P(%gnX_ diff --git a/.yarn/cache/fastify-warning-npm-0.2.0-f9c53563fc-c19ebccf54.zip b/.yarn/cache/fastify-warning-npm-0.2.0-f9c53563fc-c19ebccf54.zip deleted file mode 100644 index c8595ca6e7591709236e8de98045ff2c40235a74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6139 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 V3+HMI004rkEB(sytCRip^e=dt#x(!{ diff --git a/.yarn/cache/git-config-npm-0.0.7-fd037544b3-99a7e20306.zip b/.yarn/cache/git-config-npm-0.0.7-fd037544b3-99a7e20306.zip deleted file mode 100644 index 11bd0fc7a0f6aa621e323e4be5bacd0e39cb191f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6446 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 diff --git a/.yarn/cache/jmespath-npm-0.15.0-df80ed6dd1-353bb9e69c.zip b/.yarn/cache/jmespath-npm-0.15.0-df80ed6dd1-353bb9e69c.zip deleted file mode 100644 index 3f85bba8b315b811c0b2402478ba7325cb46b8b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43520 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 diff --git a/.yarn/cache/leven-npm-2.1.0-19f0a16606-f7b4a01b15.zip b/.yarn/cache/leven-npm-2.1.0-19f0a16606-f7b4a01b15.zip deleted file mode 100644 index 6eba0706ba59353595afbe75eae26862f3c9e368..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3024 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 P9NT|N_v@I8@#ohc6#)w* diff --git a/.yarn/cache/make-promises-safe-npm-5.1.0-7a3dd5a2e9-6e59ed8c56.zip b/.yarn/cache/make-promises-safe-npm-5.1.0-7a3dd5a2e9-6e59ed8c56.zip deleted file mode 100644 index 0771f5ff8e767b1bfcd647e4297bc612c1fda5e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4439 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 DBr{9? diff --git a/.yarn/cache/moment-npm-2.29.4-902943305d-0ec3f9c2bc.zip b/.yarn/cache/moment-npm-2.29.4-902943305d-0ec3f9c2bc.zip deleted file mode 100644 index 78acd14bed8590cd1fc501c2b75d16b40a4ab92e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1124907 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 z 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%0AZkK$tyOgRLwwE@1dn> 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Μ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 >>DA*4_kE!Tqzr0qo{MGr}mNQYykShZ? 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�BS34(Z%zXy96tyya0bD>% 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¬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%0DQZm&u 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

b{^BcYK^|ZL^&)WQ49`#Umr0N^Cne@fv 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 diff --git a/.yarn/cache/mri-npm-1.1.4-d22a399f26-e65b9aed3b.zip b/.yarn/cache/mri-npm-1.1.4-d22a399f26-e65b9aed3b.zip deleted file mode 100644 index 5eb6997d644e5043c1cc2fbda2e371412883278d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4826 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 JY)k|H`VSjG&2Inz diff --git a/.yarn/cache/neon-load-or-build-npm-2.2.2-548a286943-3cafba0e26.zip b/.yarn/cache/neon-load-or-build-npm-2.2.2-548a286943-3cafba0e26.zip deleted file mode 100644 index 96d1001a7cfd0e21aebe697e0a04f8e6c5a14845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27915 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 K)xS+ssQ&|ZJluT% diff --git a/.yarn/cache/neon-tag-prebuild-https-d665d28b1f-00a16bf27c.zip b/.yarn/cache/neon-tag-prebuild-https-d665d28b1f-00a16bf27c.zip deleted file mode 100644 index 609ef81c0b01dcea31282507c64f495d29a4361c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3610 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 UGQy1k0A~mXguvl2#gD6h0q=$BF8}}l diff --git a/.yarn/cache/node-abi-npm-2.30.1-36a2c4e28a-3f4b0c912c.zip b/.yarn/cache/node-abi-npm-2.30.1-36a2c4e28a-3f4b0c912c.zip deleted file mode 100644 index 78cb2c39d72baa64cfdf766d80d95c4e60ac6fd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11352 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 diff --git a/.yarn/cache/pino-npm-6.13.3-50e2aceb53-a580decd47.zip b/.yarn/cache/pino-npm-6.13.3-50e2aceb53-a580decd47.zip deleted file mode 100644 index 3b8946551719a9d509e79cf023ee6cd805d7adb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106140 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®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ⅈHEwpVXMo6Qcchn=7t3JvDSP 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∋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 diff --git a/.yarn/cache/pino-std-serializers-npm-3.2.0-9fd67503a4-77e29675b1.zip b/.yarn/cache/pino-std-serializers-npm-3.2.0-9fd67503a4-77e29675b1.zip deleted file mode 100644 index fa0c61ed0b28479f10fbbe34f7336d701755cd1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10077 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 O-K*s8DwXWlum1sA+1mpE diff --git a/.yarn/cache/protocol-buffers-encodings-npm-1.1.1-07111209e8-1b22d6d05b.zip b/.yarn/cache/protocol-buffers-encodings-npm-1.1.1-07111209e8-1b22d6d05b.zip deleted file mode 100644 index 1fcfbe9317f5861b64fc8d30f588d3a7165d6b73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4933 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 diff --git a/.yarn/cache/quick-format-unescaped-npm-4.0.4-7e22c9b7dc-7bc32b9935.zip b/.yarn/cache/quick-format-unescaped-npm-4.0.4-7e22c9b7dc-7bc32b9935.zip deleted file mode 100644 index 8ce3d464d8092647d8e7ac881530db7f23434cea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6008 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 G-u@50Roz+u diff --git a/.yarn/cache/reduce-flatten-npm-2.0.0-01bd4936fa-64393ef99a.zip b/.yarn/cache/reduce-flatten-npm-2.0.0-01bd4936fa-64393ef99a.zip deleted file mode 100644 index 7ab0e9472f8565eb3760db0ea6a0bdeaa3e5cbe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3546 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 T`vCxcAw8X>!`~vA0RVphQ2MWP diff --git a/.yarn/cache/ret-npm-0.2.2-f5d3022812-774964bb41.zip b/.yarn/cache/ret-npm-0.2.2-f5d3022812-774964bb41.zip deleted file mode 100644 index 495e63ba04eabd3b3d63b28d8ef2f300d47597bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7562 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 diff --git a/.yarn/cache/safe-regex2-npm-2.0.0-eadecc9909-f5e182fca0.zip b/.yarn/cache/safe-regex2-npm-2.0.0-eadecc9909-f5e182fca0.zip deleted file mode 100644 index 8ae7c9e5e5343d873f0f37404fc39f22fa90b488..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4317 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 diff --git a/.yarn/cache/semver-store-npm-0.3.0-0fc88fd5b9-b38f747123.zip b/.yarn/cache/semver-store-npm-0.3.0-0fc88fd5b9-b38f747123.zip deleted file mode 100644 index 3075d8a1670d3d7ae405f4e5050682c8508f806b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5356 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 Fe*n9hKb-&o diff --git a/.yarn/cache/signed-varint-npm-2.0.1-18301876e5-a9fd2d954d.zip b/.yarn/cache/signed-varint-npm-2.0.1-18301876e5-a9fd2d954d.zip deleted file mode 100644 index e5b624d26776c9fa43791c0bd3e780deb4b284af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2747 zcmai$c{r5q9>>Q%iAc7wgkdPzLgDn9sD?7UBqAe{!OSpY8$(f+#{QPEMz(B`lkJs# z8(Rn^GlrC=PjIVEAZdd8;OGL0lhZwiFYJ>JfS!Y)YSU%Q zSAYjOgvi|2NIV`(c_?_b)v+pbjC&xyJ}t7kPfaQ&R}L5HX#Kpo2x}gpOdA&yAS}*! z$fiNhd{K@;{ZUt!j!!cK^EV@sf(bTaq2wqP0`O^*t{4(Kzt1d5_ifx z-*6k_SX^@?Uai6JawR>KPaG=c!Ii|VIDK%wdwDk^ zbVRc#dyf?l5U*5ZFPzI7`}_DmQP^^(K8ac2%W@`_VkX6|hU zf=vr$;>=5yi=kn+!}LXoDGrU%lZt5y6vbnVc_T*4LWg#Y-Dx$?@j$I5g6m|Frfr8Y zwkMz%qypLPDb&oQ-`8si0dMMESp^HkTSvk(eS+@chf}zgLs?|71 za?V4tJ6jxzyo^1%#{C8jQpWOX*fJ#LUhb|tpm z6j#lYd04+OWBMObdzg%*Zl%~Gwx8#FE^EldUkOla=-TK{1DZ{%lnq@P^b+YSG|o1s zKwe)mYy`F=-i6P6aVpln*kW&vs?H7W?=(LxIdI8n<{xI?jBe5CN@`b=`4VEV`X_GaR9 zkPr$~mjWa4Mbe8>9kc~%Tjm6GlxRqX{v$ag+C)O-YYk-cs4x|IG z*K(?C*v>9X4G;8+y(hm%vxkXuS1Gm2uv09i^tx=@RSP?Uq~~@meVXOIA)$sdvdm1m z8rzy9tFW2ZAPD!qUQR)lJ#%z>JATUMi;^5KVy^YeP|wpB@oth9bLmk5kxN~Eo~raN z(G{6x)uYHqBxlBaH;e+EJWihEdP0M=ea(dCgdDkH^niNHgu5}+E=J6uoL%%`>qqbn zX&d(n>yUj3=P?48xgL(Tt2>CyByN^M+$98s*6yk4wS&tReGtrdpp;tMU0jd}uka!h z17xF* z<815J_NUY!Dy>eOh-tC+KHF*UbM|1gc^_=o{c(T)MkkO(PrCSH6W)%vGLtN10E_{F=0FfgWX@tYocZ-8S+&CoLL>bO~Tx z+J2|YUbnqGh|RM)CJ6c{mESH1_7 zit}ql-g8KcU>hrgG++!@ZQtZ~->){dNfIr&tk5QR0z?M^a*3A`ox)X-DVIy!GQdWI zpE0639bHW;v;4x$$8@Hb)lI!J<&G&#_2lGGO)vUosde97JFS^vD#tze>QnDUi%rGd zil^~V`6Y!8p$~4RP5E{Vf9G)hh3>2|my!M`PwI32d$U)T++uT#8rgpJ!oYbi<^h%m z1pj~O;$3|4EGHx*tQ3fDOBpKmM=~W{ABUC?+&oQFO-iNG9CW2v-NXQU9*2E)7<~c@8z5e*Lfa-+d zrQwsWMvCf_;d*~fHt!vDU!HR%9L6{VS+uMfq^t>p{5y!&BARLCy;gqb*5gcRQPOdz z^@*CVC>AM!usX-(Swoc-m)de|Uz9)lRn$haewF_EB#{J6Xb0^s*l)7y>ABWxqauZS zJT>b{Zz8M<=S|x{B4KIR^$)Vcvi9xQtq^=wL?ec;QbOXVeW6ULzGk%6M;;3}8~bsN z-%Alz%6%VmhTo=b!sPd+-=xXbm@_=YTK;0XU8wv6+Ul;`rOFm4KNPt$=zoRF){kvL zx3}z{&@5tLK{O!Q)Rr3=l$Fn2w YM-5rPxmX7S06eTmiq$xyzYEp>0N{6EdjJ3c diff --git a/.yarn/cache/sonic-boom-npm-1.4.1-e42b921f99-189fa8fe5c.zip b/.yarn/cache/sonic-boom-npm-1.4.1-e42b921f99-189fa8fe5c.zip deleted file mode 100644 index 7e23ef07671e3810358d46ff69c44f952910ef60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11840 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 IX@C6tf6PsZw*UYD diff --git a/.yarn/cache/table-layout-npm-1.0.2-0b3fe79240-8f41b5671f.zip b/.yarn/cache/table-layout-npm-1.0.2-0b3fe79240-8f41b5671f.zip deleted file mode 100644 index e8b724b78d6bff3eb580538360695967701f34eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11610 zcma)?b97|e7O!L5ww;chbc~K|+cr8KI~}`Y+qUhbW83D-x%c!t@AMe=oVRLJ?fu7| zU#+#qtW^^~SxI0J6o5YlfB8Jbe{TN#fc>~y+ZY<@SlJjlSsFRe%l^+tv3`HlQBU8} zh}Kfi&Bn>`Pdgw0i2r;=J72wgJP-hY3 zrPqKqV(3rOr;bQ6z+5s*5FJp~w~9oiF(Q2T-e)&!fdksqZ2uWEGT-?*A$ocFX04MJ z%_Y3=%ogvY9M)E2y{o6-c>o^%KHB+grPI;&tl{$F_IkSu_j&KxT4%{xzU7sz-=68D z?0)`Mm#5a4A(iPQuoyl+M3)N#*c#eN1C|R}z*hFwggvQ?xYO#hk;l*Ttgl$G3@b3S z)2NXXN%E6iFPLUcg6e{msA;qhf@YXSD0OEEY6be#^Fxv)||&bA+RK8 zQw=)v3-(-hg6%yWfn8^uU@&Q(@M_wduw4e9{NS+4$**QP>a5>+LvAfSaNOgViSzAT ztK}{ei-4U>y^fp5(<#(XpZevA-UF(TMCbZn84VIfa_;G}=E6YTeS3bEXp6R&HN&y) zxiif6T`Rx$Vv4PSd%9{k+1mCL-usL~9!-Fvm@Ahzq7gt3*10Eyh;0O-tF8-G#_np; zN_N7I)!4(DgK=y0z$cR;24^;*2?I(nH4Q3IR+87SYmt5O_)59;DPX;!7am(&5|qR> zFE*Q?I$-h=N0K+bh-LvXb?6iEc=B{7;eK=6<)>Y&tGsa~LRnscWhrB(2r7NTYWuIn zi@=xRpePO*`6PW0NUIiC;8nv5>bzr;NhQpPi)m1f{RKshVtR$_yY`3z-RLjk;S>Qh zDO1aRxTSkv)pG|f(G%s3P>7Y)imJjH^5}GaP^$$)G$w%J8s^Ut={rgb6~=(rB{x=1 z7HzJEZ9vV9d~QYhOynA>3F=3=HFEXs74*Nqg=6t-Cr-p+KY(DO+Tb-DcPrOcYB6G!CKq2ea>I9Ff?>-ED1W2uKA@dDrO z$_>du>^CD16=9enYw0J>cuVGXOGY4b6rzEIVtmX^`cd53V2ERL6+ynHAl&zen~L=o zO^B09&bURVN*4e^tsL+dGt-E1lTmunoM^Q-3n2~~$=gGPq(RY%XRB~Zj{4j>EeIl||;gM%u`So%la-oW(~bz%wH2_4 zkaCdTifOzUdTv+;;c^-5OyltC(g$p*TI5ezn3M^|WJ)L&j~GLrBSaL%%X*UK2d?LJ z5u^5TW&J8)=VWcWzu6p=6$vwk$Bk|-Yz{HX^CeJC%>p0`n`M28BSIZS96Si@7jXf4 zP?(V$(j!4d2{kX}K&E8(km9FtONK671sW#lMex}09J@QUQM@3|HUrAbhia%CBt}xe z?c`lRq8s|ga8?@(_BG)er{|gj86`aK<#_REAk7I#Y7h&Cnh<)dc3;a-af(cYZdVo9 z#Gp2XvF+GxVPSzy9qN1vHe z47&+pQx+=Cd?{5_OEhT^)`OGYKobo}_?AY8j;ij*d4+xa#WGso^A__$Nc)0eMsWkF z9e%^b&v&W>O$-+NHqdm*kO=^&m~~bO15bIu?lOq4a@mxD-@Ag^QF5l|lZ5Ke1`0YV z49bn9*p2ZIhdJzGh5H+4s|Slob;)wt()8?gLQ9@u%Hu{L7#A;*zO(mW#}VE~D56%% z35vl=NL)KZP7W>UQivK$plE>(JsXPexb2HkRC?ip2=q|XCt$FrajBo^4ZLb)AKyI@ znJjQcpv+(~(uacTwV|s9j_*nteAy6kPWV|j3$`L4ZB4JLU#;c38t|+xXpg1KZB>Ad z!NCkAK7HnBz8G9D%kET#sU-uT->qDv(Np39urX2!o;0(PKeX2`hq1viJw6XijJ;}H zM&@MI4t_xjw#>4R%FX&t!({=#DvFoT$gBY^YNC{q&4oo;&-e^Ngaf^ckf>t%Q2>}{!-oOW%Wof@Ei4-Hl> zM#)~~$u$3%0z%9~X^eEnc$5S|iIsT#)xy!HW(Er`l2;QJ9zGKMyyD5f=DMV3yX1}j zIcR{kz|)Xe@O@H!vQH>S|- zn9wA57Z-~$1NrE*vpO`7awngteH)@=#rN4vj=IEQbxChI`zN%zZEH zk?bc#)|NIapBivcO=ZZ|p5e%<7~Z$q8m&Qj621Zs*5Gty{B@8E?f$$ruA{ik9Kx6? zo7_xfmU@}B326@Ux@7XrSoX+fAHe?|2jKnV*=K2{|6448G%i_|@L}`x@h1IOTRm$B zGdgnztH>^>ZU&gZbGOiydQ`K0;9zY}pbBmC2+qZ6>o39x>#Npqh4^*a!SxM9$x^nFkaXj=wAa9M=R4m-mHoN#`p_$d_n`og{t`$i^$YzOTAhYkx5| z2y_F|MB*~zooqu1Lfsv)<9}9~avko9Y2)O6&JMqoEgwNk5gi%AlaI@LQ>ITN`^ zqEhEQzrE%PaJLvEtEbBUoiz03x{`j^ICmedn~;!^M)+jA?8Xu-Qc%M1BTisv>; zY^UP45ow-E6YV=5xOoGe0e@s=3A%A#y3LMA^3eGxa3?F~Ys?t?o1pXt`8#`9FXzRL zdlaHPAT>Oh7ofjyU29(9nbgO&A%Oz`kpHVs7}!`kSy_K0%)3+0Vs?wagFMHFJA9Kj64=8-Z$qS&VttMjM(Qz1suD3A_TTbIDZ=?eP+ znU)-_p8yX<&v3B zIYW1If8~3T(t^@IfI<$AQqZJP=uU1rlQ=9PP*v(V;Y06ej-UuvUssLaTS zHA9ubGzUL;I7EC?DfZ(m;fa5UjcGE(-4QUAa@ieb`;ew>>l&F(R1})qeo-e#2z=JU|E=(O-S(b>r@f4Xy?nKVmkwV3s*3 zzHESCA1@%A>WHpQBk9%=42X=`oVsNu!C3qng$MI+PLuX15nmt~d;vD9d&*2g@$@KM za>?|)+~Id9w;vKn6&s?N9N*6=mV&IBD4&PinI8M4n+bu?OBxyBTTE1us+u-zr)wXW ze_myr>*!x~Ut1wq62p=;;J#b6gIzK&&!5NIb?Wwwvc93aN-n&dImB-i6$QNUa<{+> z+~EJ+A?frITqHmN0EQ6&04V-H9n#^$BlA=w9e%PRv>&Tj(leUP#7(3O4u$``k-wiD zodu67@Dq#v_T?)TfP^#i)47%}0E9ezLlHb4;&W$1m<@VZ>8`xrS5k;4mjRFny4jy8 zM!D_5Cdr6MgoD`BYoBpzoZE<&!c|WH$a7ANrl>4IRl}jymkr)7*Wk2HHfKC^ z#sfkpTGGr@Q`BE|U|l_R+AIA)D$sDv+S$!0C00z*(H`GG;$^d1n?rFoMM~T=)kLPW z0zq5^xO(d>JK`VO*FjO*(6VE81?svFG9WbrV z+~fm>M2I`VGKD6<@DS%f6`E>=&(W$W*lbwTv<62{(rn)nBihNfp5nDYLh0C40 zRh>z>l2;M|yP!m1PQw2NJED;u=Lka}4La5mE`lhoi)uj%r1CJrsooh8)}Qszt&Mw= zBP&rHF0q5tTGKYe8A;@aohfy5B7NjCJ^9^@;)cU8p|l|ZoKh57l`av%6@vR+fb>~f zc`)@Ld|O@4?jS|n2Dk5r!uMc&dsBsjbixkJlW`3lc(ST_IE-?H3^~IT+Ibo2T86pl z3Qkdj@`7V&Wp$Jw-OHbP(Mdi!UQ>aya3K{#C`wYGBw2kyO8oKPYz%-rfoVvxRK?MX zX#+}$!jI#ghzQcnJF3sSAa5xlIJK%kSAVDPy0>SDB^uOzT2c~jFp(GicKrxfXolw}P3WUec->|H6 zcZO{qr%Yo|lm1fr=6wf;l^V%p%G>RC)*))}g*$~||Bk2{ZM?utD~z{CkSSuTcbF~Q z8vTub#e6(;D;QA|-xRKlaTecwxAHsUgLjp$$5%^Xml%_tTS|B@`kO=iDoN!s*{9GL zi&(de<7>tuF((Q!zf{7pW)dnQiZc;EONf#$&&Q`KidK}ni=d867=CRJX%@a%O*EPW zXXaW@8UzO+^SZ^JfqMlUx>riGR@9b;+uyohY*XL#9Vu|+o(hbYOWBj4394^jy!=3Yy9}2`67G$f-QSk5JJ2%P`0m%M-|*n|NDB z)*e$0uffIKS@aJvR$n^b?VO3&)M5ZAFK$N1g3^pzrF6qci!sJy+(zh8BBPp@Hr=i_ zIRzx_DV74w%hfrTGZ4cGz#Fd7vx7F-Obd&bSBkeXjLpYlq{2;x8~i@k!ouMkOD{ot zd;u{7a6UasHa@yEi-Kgczlq!A0;p&oiu(zF1bu9m7K)XW;ma=6dEa5F$z+ zGn{2wzB}rue=rl@J0Pf_AX1FUBMBUlE=$=J85SxdH@``Eo6^1!)&~pTjPMH(Jo~sX z*Cg>F(IOuv3ldH%G7sfS!~$4$bLzzQiHdMIhf7K1P}8&e)^VdaL_TzMXXTUqpp zlLoy_4CV;(+9ufkh!(_@o}BcfjX=K=;(b)vKGA^lox1jVxNaw)n_~PKcALk%9{v|* zX1uNE0tSgokWe`2F(z-K>#14WFF`05|eV>4?* zBiE0UI9_%2<0MA%S$(irL#mF627&&Xu-g0j zv!&&MKulbEoE{DRIpFn_4voU;r^X~tnqQ0$-0+}f(X&yzs$~X`MkkZ&(t&v)sj8jU zh!ZW|jc!bP2#k$U(U&<%==e$?Md)M(5pLf#zxFo@$)Eewl~-$=xV}(O^EBq9?zT@2 zOs^O6Yhn2%q_1y~-X=r6197-*M)^@~);?tT;~QH{F#r-;?-tM_F3mCHpgTcrM>bvN zieyw*3r)LDW!W3|6c5E^S>&4{*cE`Fwsxkn))mmINblQu*PZTc8ci;ACS3)no`E7O z9V+o{tKIPQ8&h0bL;%eR!eus}(CACOO(M)~s?*eTkGQ2Y^#g~z30#LH?Oa|GAI3@` zQ;cYz)`Bn%z+vbR;L;hg{U+ds!$w3^bLOpWZDm~P98FNI_dnSpSLB3XF$mI}74uQa ze_PD5Y;f!$$o$)r1i{y zQ-Jbnt>~aBSEk-1;+O(fhl}1Jg2DSG&*-?dlT+>bs-bxcUG8TL)#J~yx8YVpvV?RE z)%$dsIq7&je`MC#FJU1!&4(vFZp?}770w{5P$YIBE&{0!$V`h+bIm++@Rc1(%6I7$ zr0yg?=FpgG%5r0r>{bG#6;VTFuJ+hO{ki1es|#-O(fkFzXSd$gLqB{;shcqOB9D+m zy-LUquo!xYdv8E0HwJ98uX0~b&raY9k-+CUW>+x7;!;buFm z^30_=hMmWsin67Scm`3Z>|XgcU;uz)RUOUwQ#aG61$D)6+^I!8 zIh-^=VUu@SP_8O%OLM0-MzPy|+|-IqLFo<-&Sk-1Q5l5+;%*UERmGZanNFTnfvaHI z-Ejl^cH1ZU_Qq=r3+LQ$j|c0k*XtpeG8{z5k!=)5 zyvX9B>_mg$av5>43!OJYfIbt+h5IA(u}9+*+>0TG6zo9}Wb#AoAnYXhT4<%R^hConQ)^OlpTWY}eQ4-1rd(l?RwXC&aNUxnHWPJ&ux3SNW9 zYXQiXD8SOr=X5?fV4CLQN{!HL0(5#B0V75E9U@k`U`IuygGpq2g=@WHf3aI|#4SeD z3e>rl&lX5LlS|A9q^Sa_k)OYX`n*IEYsMqIGM)5&IUD;)V_xpUR^>*k%(DJbm$&x) z_3Fp!&Lf6wv=hBdVOAOX%@X;tGP1F)OORD56#Ak=6meM@*$K>xb1b$3m=ug_dqY~mt>=V3nE9q-{=505WyyqJ@4-zl3}GopgmnPc{v?0?Xi zscO)D?~LSg+mB54-n-^Z3*eboZ{2&7*W)cjIxk|6)**GdpdKYSQFjcBzRxr4yp&WW z!(5u7sZu%M)#kX^LZsKTGyxSM$RrG5g?pklm6a&tpgWUB$oJki#4m?(U60&uZxO;B zigHiD7>&iXPO(_kV-(@k>jW&rl1Sd1<6qPBa){rKqdzwh_I@hOOR(=EBA#CZq72w) z?#ayA5{HL0(Ryi*DeLVV8crv)i;TL6B1J~@JSG;c42MVYb)kr9`Z<13 z;Df5CZ!(K35`=H%Q$Od4GQ1bI zquJ^i8k$*~d_)FcqU4}@2w(!&9YVRC;Z7jIxVp<_XNxv!Nf5zuTryQ9pQD4`-@DQE zr@O-|`j(S;-TcSi^k}5+R44k*=n<30 zUs28(YQ%UQTpinXeIo6 z)yUq)<&QMeNwLfNCj(5|GxegRfm2bqmv0!L7Ce_FXuVz{4Y+VVdRhIhxV?tKSVvTB znJSAi0fTx=(7s8cZ&nHaNhDBz|0Q6WQlf}Fw zY!A`^@S3e7D&TkOPfHLMn1FCvHS$1-pc?92x< z3CI}GO9eGB$KMoUv8IniTP-};)}$2&sW*kiI=$6tBD{`|)jSwdeICh$!Lt=b{s~ic2mY+wX*mRTFGqGXx|ccrFe!w@}_O9Q_aF z&u0B-VMC2VIHblB->-))=44fn^@_E|?HzAj9bNhQ9{vIvOE0*Yo+-iY>xYjp#Mws;%v;-xm9jAq_-x?5|FB}Q{qpIt zgyb3g?_PwGM1lwU;YF*!003nF7$4i}8Cd9<7=1XAjkT5h(1#l#e7F%9?~d%ZtJr3` z>3-9&9oeiVM-Eh2{t$yOR&>AISP1c_)AS!i8bKMoYHOn&*Eh_7Nt|YO?vOJilK$O; z;|*r+Ik%QWzQs98*HP)K~_ow7?D^TW6)Yw&4d*m$;fSkRZyMk`oLudKMR4B6gtGli)rxW$LU z@9?-XKq1_Bx?9_8X(wI)mZVDERH)!NaIn zb})c^H5rsOlj1&9TqHPkj>pRs4kX}`8$Rj`J6oH!LKBS$j>!4}vc0wLb{PrB=DNVr zOmvJ7UoKo|Qx zYz~9noj5&xqj{n^#D zGVD{;P#|tX^*-0JL!$yFbHq*>l@0(Tqp7SpK_W;(iNBI3a2cu3(l`<`54YfP8{1ai zCErWj!6|C7GDwxIm%p4HT`Y5Wbi7FqYkvLmEN}rx0r_d7T;+Lw&$wmjq%wEFh@{DC z>v~UcrdoQqCk|Fg58I%rOBdlsXL?B78H)qjdJSGC8r<@FtsKawcofPYAy~s=Redy0 z$rGEKJK>u!IMWPjG1qaU?!5H#a&nqb)&Y4!GZsE?F|IHM*LVu$rBYR7E4aA!OooT1 zH+O>|j`cQnPCg4LMi+spERVhYEpP0 zko&vS2g9QVxo>z~n7`Zkuo?8*ueyHpINh`G8uKT)op4$Lm|0?Ezi=`u1eiGI(0v2R ztK#>G$@jN4`D~CZl_Y&J!mw*VOmr-qPw$%Y-zMk7c|B{|foe^TaD|OW%C?#`aWZ=j z-NJB^ao#M%SEHm}WDuQ3p~VF3K?O2H)5n}!BCuw4qYH!M6OU0cifx*_w%HdjL zL0K)?bS^xNnc$6zK$kF-W(mRarY_UM;xyr0hK*4 zGFc3o+r->EbYV>)x_m59%O`#zvu2FIFtjF^*7Q;VJG$`_Is@|z(!#{uzBGas6iU|L zAitLIF0`%~6wkK#DX!$qwKMz_u=VipFo}a%2JEDNK-U#VQwuuIvs!$qe0+mHe*1yS zy8B>xn6(9RgIKJntN6p9SLm5 zNhNSbS&tC4l>sQK=x60a!eDE0F<^DdXE(6Pr9L@Hr&C|Eb_jXfFC_rhI{nO zIj%ME0iVqIu}ft6E5saVnx^FgXnKa2M=I$Vo(+K^jwHlz5@9TxgKb_AY4I2+4tj3~4VJBOSm{5{}?!uUF|*G>}>?SZqJYwcz))R9385Zyu@nRS2rNWys`U9>dE;cgki26 zoQ;N~iw{6lU%;5~@_KF1xUq=W6z+ylD&X&CR&I)oP5EcF>PcVP^tiNO&F z_Tj#wV;(`)D(&0s^Zbu8d;QR+{N17E}!SmszHTiN| zaEFo!+hr~35vcXMBxdkMvjfIXF#|UoI^J6*%zY<>8KU+PbKGd7upJl`COY zDRvL2s?_N>52(s&8rz3E5>`qrWcH%Qwb*JN425xk381jvHB>v4bjnlHHgmD%-Ij`+ zW7N>n1*eEpc+x-2irtb~l1gftCGwbpf%PMlryZG8E?em`ckPf(l#JqUD#9Yo^pksQ z53FZn74M(k(l`iXwP=3~nB3t;(?U!X{p3vRE^p=?x9jXG`$M&o*b?70^0-sHaTyqP zbx!5v7OlXmW6Cj@MR5Za;F!(X%u-?&!Lw^aToHIsEjFv42rB*A$W@nejBGKFqM{I4 z_nMkV)OOrSbq&;1YLZA`DM|dm_TnDeywg_WtR3p1EJ{I91r8|gs=O^jMaT9w+C?o! zJ;>j$i-lXip~npS4DEIuqpOzN-B2y#s*YvUgRkebjlJU(&}l$WVoS?(#x;~{WhF2^ zVYsn^nIdG#@M#D2Fp0a3w5-&ljCOW85i(MxFqx1oL%aTh6|YO;;ufoIT>2|&E$Wt4#l165B(eeZ-fWQ>74XMBE5VY2(<*pHF z#0n&odJUV%T}V0mUjr{^=Z!$1&uLO7d}%jDDw9_Ls2tfN;2b)yyyAwcDM zL@J%a&GBUB;D&Z!2O7DO5F4|fwk<%^4H0JWMogYz&;?i7@XdOgnFOxrC7utE^{lLX z-!xKfV~h2G);DqQ@dkV|U3k3*l?cD{-F_mIcelB})&>cpqC21s?clCIm&)FnEM_ox z%FuqB@LJ!`t*_4IAYKdp`VJr~2?)do{J&+6AHmIk#;L#`m)}H>|J(Er+2gNqDnR{l z`#00yM3DdG{F03QE`$8V$@Me%N6w$3$X_e^h5KEB_7{%rBMtc9)A~z~_KWz3pXt3a{X-nmG!6U#+kf81|B4&_Nb-ND{@w%mi<*n{Pt;!>k>7d0 z*H8Z9HGVkxKhN^7YRd1_-|HEFQN6MMjrwPG<9Fom$?adrUfh2|{=cd2@66xxoWGc` e1pmbRzgds0Bq-P)MsOc5osZhh?jI#6fd2!X=D!I5 diff --git a/.yarn/cache/through2-npm-3.0.2-403f837012-47c9586c73.zip b/.yarn/cache/through2-npm-3.0.2-403f837012-47c9586c73.zip deleted file mode 100644 index 7dbb5653351b8a2071008633bf9de7f3c2bf9309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4856 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 diff --git a/.yarn/cache/toml-npm-3.0.0-f993270804-5d7f1d8413.zip b/.yarn/cache/toml-npm-3.0.0-f993270804-5d7f1d8413.zip deleted file mode 100644 index 6474c4f487eeb52c7bd4719c45ed235438cd4d42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26316 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

Pic|Qo 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