diff --git a/.travis.yml b/.travis.yml index c1f5317da..48d7dde0c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ dist: bionic language: node_js node_js: - - '10' - '12' branches: @@ -20,17 +19,54 @@ addons: apt: packages: - docker-ce + - jq + +env: + - DOCKER_COMPOSE_VERSION=1.25.5 + +before_install: + - sudo rm /usr/local/bin/docker-compose + - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose + - chmod +x docker-compose + - sudo mv docker-compose /usr/local/bin install: - npm ci - cp .env.example .env + - curl -s https://api.github.com/repos/jawid-h/travis-ci-tools/releases/latest | jq -r '.tarball_url' | xargs -I {} -n1 wget -O travis-ci-tools.tar.gz -q {} + - mkdir ~/travis-ci-tools && tar -C ~/travis-ci-tools -xvf travis-ci-tools.tar.gz + - export CI_TOOLS_DIR="$(ls ~/travis-ci-tools)" + - cd ~/travis-ci-tools/$CI_TOOLS_DIR + - npm ci && npm link + # Go back to workdir + - cd $TRAVIS_BUILD_DIR + - export CURRENT_VERSION=$(get-release-version $TRAVIS_BUILD_DIR/package.json) + # Install MN Bootstrap + - export MN_RELEASE_LINK=$(get-github-release-link $TRAVIS_BUILD_DIR/package.json dashevo/mn-bootstrap) + - curl -L $MN_RELEASE_LINK > mn-bootstrap.tar.gz + - mkdir ~/mn-bootstrap && tar -C ~/mn-bootstrap -xvf mn-bootstrap.tar.gz + - export MN_RELEASE_DIR="$(ls ~/mn-bootstrap)" + - cd ~/mn-bootstrap/$MN_RELEASE_DIR + - chmod -R 777 data + - npm ci && npm link + # Go back to workdir + - cd $TRAVIS_BUILD_DIR before_script: - - npm run check-package - - npm run lint - - docker pull dashpay/insight-api:latest # workaround for functional tests - - docker build . -t dapi-dev - - echo SERVICE_IMAGE_DAPI=dapi-dev >> .env + - print-bells + - export OUTPUT=$(mn setup-for-local-development 127.0.0.1 20001 --dapi-image-build-path=$TRAVIS_BUILD_DIR) + - export PRIVATE_KEY=$(echo "$OUTPUT" | grep -m 1 "Private key:" | awk '{printf $4}') + - export OPERATOR_BLS_KEY=$(echo "$OUTPUT" | grep -m 2 "Private key:" | tail -n 1 | awk '{printf $4}') + - export DPNS_CONTRACT_ID=$(echo "$OUTPUT" | grep -m 1 "DPNS contract ID:" | awk '{printf $5}') + - export DPNS_TOP_LEVEL_IDENTITY_ID=$(echo "$OUTPUT" | grep -m 1 "DPNS identity:" | awk '{printf $4}') + - export DPNS_TOP_LEVEL_IDENTITY_PRIVATE_KEY=$(echo "$OUTPUT" | grep -m 1 "HD private key:" | awk '{$1=""; printf $5}') + - mn start local 127.0.0.1 20001 -p=$OPERATOR_BLS_KEY --dpns-contract-id=$DPNS_CONTRACT_ID --dpns-top-level-identity=$DPNS_TOP_LEVEL_IDENTITY_ID --dapi-image-build-path=$TRAVIS_BUILD_DIR + +script: > + npm run check-package && + npm run lint && + npm run test:coverage && + docker run --network="host" dashpay/platform-test-suite:$CURRENT_VERSION 127.0.0.1:3000 -k=$PRIVATE_KEY -n=regtest --dpns-tld-identity-private-key=$DPNS_TOP_LEVEL_IDENTITY_PRIVATE_KEY --dpns-tld-identity-id=$DPNS_TOP_LEVEL_IDENTITY_ID --dpns-contract-id=$DPNS_CONTRACT_ID deploy: skip_cleanup: true diff --git a/CHANGELOG.md b/CHANGELOG.md index e369d062d..3f9a5d228 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +# [0.14.0](https://github.com/dashevo/dapi/compare/v0.13.0...v0.14.0) (2020-07-23) + +### Bug Fixes + +* internal error when `fromBlockHeight` submitted as 0 to `subscribeToTransactionsWithProofs` ([#285](https://github.com/dashevo/dapi/issues/285)) + + +### Features + +* update dependencies (dpp to 0.14.0, dashcore-lib to 0.18.11) ([#283](https://github.com/dashevo/dapi/issues/283)) +* reduce artifical slowdown of the transaction stream ([#275](https://github.com/dashevo/dapi/issues/275)) +* use test-suite to run functional tests ([#276](https://github.com/dashevo/dapi/issues/276), [#280](https://github.com/dashevo/dapi/issues/280)) + + + # [0.13.0](https://github.com/dashevo/dapi/compare/v0.12.0...v0.13.0) (2020-06-08) diff --git a/lib/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.js b/lib/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.js index 6c935d3bb..d959af4a2 100644 --- a/lib/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.js +++ b/lib/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.js @@ -101,7 +101,11 @@ function subscribeToTransactionsWithProofsHandlerFactory( let blockHash = fromBlockHash; - if (blockHash.length === 0) { + if (blockHash === '') { + if (fromBlockHeight === 0) { + throw new InvalidArgumentGrpcError('minimum value for `fromBlockHeight` is 1'); + } + const bestHeight = await coreAPI.getBestBlockHeight(); if (fromBlockHeight > bestHeight) { @@ -151,7 +155,7 @@ function subscribeToTransactionsWithProofsHandlerFactory( for await (const { merkleBlock, transactions, index } of historicalDataIterator) { if (index > 0) { // Wait a second between the calls to Core just to reduce the load - await wait(1000); + await wait(50); } await sendTransactionsResponse(acknowledgingCall, transactions); diff --git a/lib/transactionsFilter/subscribeToNewTransactions.js b/lib/transactionsFilter/subscribeToNewTransactions.js index 625244cdf..8d9e403ee 100644 --- a/lib/transactionsFilter/subscribeToNewTransactions.js +++ b/lib/transactionsFilter/subscribeToNewTransactions.js @@ -65,7 +65,7 @@ function subscribeToNewTransactions( unsentMerkleBlocks .forEach(merkleBlock => mediator.emit(ProcessMediator.EVENTS.MERKLE_BLOCK, merkleBlock)); - await wait(1000); + await wait(50); } }); diff --git a/package-lock.json b/package-lock.json index 01e90afbe..0dd242457 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi", - "version": "0.13.0", + "version": "0.14.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -87,16 +87,6 @@ "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", "dev": true }, - "@babel/polyfill": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.10.1.tgz", - "integrity": "sha512-TviueJ4PBW5p48ra8IMtLXVkDucrlOZAIZ+EXqS3Ot4eukHbWiqcn7DcqpA1k5PcKtmJ4Xl9xwdv6yQvvcA+3g==", - "dev": true, - "requires": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" - } - }, "@babel/template": { "version": "7.10.1", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", @@ -154,22 +144,31 @@ } }, "@dashevo/dapi-client": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@dashevo/dapi-client/-/dapi-client-0.13.0.tgz", - "integrity": "sha512-ttbg08wkV6Z2gpxj/ksVuQAf2YOLAOiWMEVh+sc7v9zbWfEGd16HmpwDWVP8lzdMGG/P910+UeDi6bjYdnwZDQ==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@dashevo/dapi-client/-/dapi-client-0.14.0.tgz", + "integrity": "sha512-O0+XPseWobP44Sfw859LQoGWX622bpQ3ob/9NWJc8t90eA0WTHeENAgPMvKEAOxJOyLt8U4ghxZRq2ylc8mX9Q==", "dev": true, "requires": { - "@babel/polyfill": "^7.8.3", - "@dashevo/dapi-grpc": "~0.13.0", - "@dashevo/dash-spv": "^1.1.6", - "@dashevo/dashcore-lib": "~0.18.0", - "@dashevo/dpp": "~0.13.0", + "@dashevo/dapi-grpc": "~0.14.0", + "@dashevo/dashcore-lib": "~0.18.11", "axios": "^0.19.2", "cbor": "^5.0.1", - "lodash": "^4.17.15", - "lowdb": "^1.0.0" + "lodash.sample": "^4.2.1" }, "dependencies": { + "@dashevo/dapi-grpc": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@dashevo/dapi-grpc/-/dapi-grpc-0.14.0.tgz", + "integrity": "sha512-eMx9OF80uxHFHD3gZ1Yro5pLTpgTuNQiy0Kts3mRDIjVyqgMbthIeYVcyzOwARs6FJrJfX18QnQ4kUt9b1ILKQ==", + "dev": true, + "requires": { + "@dashevo/grpc-common": "^0.3.0", + "google-protobuf": "^3.12.2", + "grpc": "^1.24.3", + "grpc-web": "^1.1.0", + "protobufjs": "^6.9.0" + } + }, "cbor": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.0.2.tgz", @@ -183,90 +182,38 @@ } }, "@dashevo/dapi-grpc": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@dashevo/dapi-grpc/-/dapi-grpc-0.13.0.tgz", - "integrity": "sha512-w6oyQsHO5/m56DNS9Z41qelJWhT9vh9AOE8tBzv6Zd5mI+wV+LhM95r9xwpb0x6CufXCK1K9kLkBOFuOp/C2Pg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@dashevo/dapi-grpc/-/dapi-grpc-0.14.0.tgz", + "integrity": "sha512-eMx9OF80uxHFHD3gZ1Yro5pLTpgTuNQiy0Kts3mRDIjVyqgMbthIeYVcyzOwARs6FJrJfX18QnQ4kUt9b1ILKQ==", "requires": { "@dashevo/grpc-common": "^0.3.0", - "google-protobuf": "^3.8.0", - "grpc": "^1.24.2", - "grpc-web": "^1.0.6", - "protobufjs": "^6.8.8" - } - }, - "@dashevo/dark-gravity-wave": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@dashevo/dark-gravity-wave/-/dark-gravity-wave-1.1.1.tgz", - "integrity": "sha512-rt0PzGzqplqERWVIMLlBxm4mJqjFTYNUFRhIccbfaF/MDyd0/585krGOWIhe0Sis9XQNA/FJlxxRjtPXIcyyCg==", - "dev": true - }, - "@dashevo/dash-spv": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@dashevo/dash-spv/-/dash-spv-1.1.6.tgz", - "integrity": "sha512-pAZlwN4UJkht68zSq7MmqMZIHcvuah69UT7KM6RBeGrSEPaw1wxiz772tJ3Q/Px4FOHf3Uwc63ylOe7Vnbk1qA==", - "dev": true, - "requires": { - "@dashevo/dark-gravity-wave": "^1.1.1", - "@dashevo/dash-util": "^2.0.3", - "@dashevo/dashcore-lib": "^0.17.4", - "levelup": "^4.0.1", - "memdown": "^3.0.0" - }, - "dependencies": { - "@dashevo/dashcore-lib": { - "version": "0.17.12", - "resolved": "https://registry.npmjs.org/@dashevo/dashcore-lib/-/dashcore-lib-0.17.12.tgz", - "integrity": "sha512-ZZFlWqzGTklW9uSsj4QNe1k3e5vrqDTfeaZwt2oU0dbmMltkFgNifx7Rq6ij5erRDKFoIkOG1ZM6Q4brc9eWUw==", - "dev": true, - "requires": { - "@dashevo/x11-hash-js": "^1.0.2", - "bloom-filter": "^0.2.0", - "bn.js": "=4.11.8", - "bs58": "=4.0.1", - "elliptic": "=6.4.1", - "inherits": "=2.0.1", - "lodash": "^4.17.15", - "unorm": "^1.4.1" - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "@dashevo/dash-util": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dashevo/dash-util/-/dash-util-2.0.3.tgz", - "integrity": "sha512-fnc76NYVBhuTLhuUVidnV9sKSsMxmkxkhUOjiD/ny6Ipyo+qxwKeFAn8SvdVzlEpflNA613B+hsxmTBBGazl4A==", - "dev": true, - "requires": { - "bn.js": "^4.6.4", - "buffer-reverse": "^1.0.1" + "google-protobuf": "^3.12.2", + "grpc": "^1.24.3", + "grpc-web": "^1.1.0", + "protobufjs": "^6.9.0" } }, "@dashevo/dashcore-lib": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@dashevo/dashcore-lib/-/dashcore-lib-0.18.1.tgz", - "integrity": "sha512-lu4X9esZ1K/SorUp4NriF6pJMj2AccSdA/l3Uj4stJYmkyWT8Ua7TRinJ2+mR2IFnzDexc/BH81lABEiQY+0Mw==", + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@dashevo/dashcore-lib/-/dashcore-lib-0.18.11.tgz", + "integrity": "sha512-IdyfXvHEZbvsYD1cnfDoYLTCLKJAmeLVFfm2tE+qd8J7aUh+RoSID34uDu4jtzN1tMMi+OUVRR8RM8FLhr2vLQ==", "requires": { "@dashevo/x11-hash-js": "^1.0.2", - "@types/node": "^12.12.12", + "@types/node": "^12.12.47", + "bitset": "^5.1.1", "bloom-filter": "^0.2.0", "bn.js": "=4.11.8", "bs58": "=4.0.1", "elliptic": "=6.4.1", "inherits": "=2.0.1", "lodash": "^4.17.15", - "unorm": "^1.4.1" + "unorm": "^1.6.0" }, "dependencies": { "@types/node": { - "version": "12.12.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.45.tgz", - "integrity": "sha512-9w50wqeS0qQH9bo1iIRcQhDXRxoDzyAqCL5oJG+Nuu7cAoe6omGo+YDE0spAGK5sPrdLDhQLbQxq0DnxyndPKA==" + "version": "12.12.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.50.tgz", + "integrity": "sha512-5ImO01Fb8YsEOYpV+aeyGYztcYcjGsBvN4D7G5r1ef2cuQOpymjWNQi5V0rKHE6PC2ru3HkoUr/Br2/8GUA84w==" }, "inherits": { "version": "2.0.1", @@ -285,12 +232,12 @@ } }, "@dashevo/dp-services-ctl": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@dashevo/dp-services-ctl/-/dp-services-ctl-0.13.1.tgz", - "integrity": "sha512-kTpMwdXkKGQXxs6oDw9tvVCW9VWSyF23tBcLX5jfgx8633CK9TqexIhiQC3EnDJkGl0p5+SFlDXyZNAu03+v0A==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@dashevo/dp-services-ctl/-/dp-services-ctl-0.14.0.tgz", + "integrity": "sha512-asyzbwItBU9wfkiqY6n2qDY0UQp/0LbhW5v7wiv/mXfuoaFwT5hFvoTBhX8dUQfuvQ59MEfBCBWdlIGjPbiwJA==", "dev": true, "requires": { - "@dashevo/dapi-client": "~0.13.0", + "@dashevo/dapi-client": "~0.14.0", "@dashevo/dashd-rpc": "^2.0.0", "aws-sdk": "^2.382.0", "axios": "^0.19.0", @@ -299,18 +246,18 @@ "grpc": "^1.24.0", "grpc-health-check": "^1.7.0", "jayson": "^2.1.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "mongodb": "^3.3.4", "tendermint": "^4.0.8" } }, "@dashevo/dpp": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@dashevo/dpp/-/dpp-0.13.0.tgz", - "integrity": "sha512-0SrJNvpUZ4J6WOkQB61LYsmNTUNlNOjDt+JVcOJ9JlWnzLke2KyAuE6sP477Wokosqn+RjrV655zypSA0Hq0vw==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@dashevo/dpp/-/dpp-0.14.0.tgz", + "integrity": "sha512-wdBDFevWhOyPrsMASNDL5hZYDiJl3qWmsVWmPmXymd7sfgvdIYy7IZ0YxoUQJ+YIL79FY/DqBrF8zHMHpYBX8Q==", "requires": { "@apidevtools/json-schema-ref-parser": "^8.0.0", - "@dashevo/dashcore-lib": "~0.18.1", + "@dashevo/dashcore-lib": "~0.18.11", "ajv": "^6.12.0", "bs58": "^4.0.1", "cbor": "^5.0.1", @@ -358,9 +305,9 @@ } }, "@jsdevtools/ono": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.2.tgz", - "integrity": "sha512-qS/a24RA5FEoiJS9wiv6Pwg2c/kiUo3IVUQcfeM9JvsR6pM8Yx+yl/6xWYLckZCT5jpLNhslgjiA8p/XcGyMRQ==" + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, "@protobufjs/aspromise": { "version": "1.1.2", @@ -491,19 +438,6 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, "acorn": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", @@ -767,9 +701,9 @@ "dev": true }, "aws-sdk": { - "version": "2.692.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.692.0.tgz", - "integrity": "sha512-fQRbZq+urzE4VjciEr6KNY7vbzougcVg7UqbHKGcgBT7EPtSbog9C2i9YY9Yum8PRuP1GAmfvC2Vthlw6dVTGw==", + "version": "2.718.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.718.0.tgz", + "integrity": "sha512-YMWR1RJ3VuSbUOGeOfDw2QqRzwX51oa9TCm2G6SW+JywJUy0FTxi/Nj0VjVEQvKC0GqGu5QCgUTaarF7S0nQdw==", "dev": true, "requires": { "buffer": "4.9.2", @@ -929,6 +863,11 @@ "file-uri-to-path": "1.0.0" } }, + "bitset": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bitset/-/bitset-5.1.1.tgz", + "integrity": "sha512-oKaRp6mzXedJ1Npo86PKhWfDelI6HxxJo+it9nAcBB0HLVvYVp+5i6yj6DT5hfFgo+TS5T57MRWtw8zhwdTs3g==" + }, "bl": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", @@ -1120,12 +1059,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-reverse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", - "integrity": "sha1-SSg8jvpvkBvAH6MwTQYCeXGuL2A=", - "dev": true - }, "bytebuffer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", @@ -1519,12 +1452,6 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1680,16 +1607,6 @@ "strip-bom": "^3.0.0" } }, - "deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "dev": true, - "requires": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1984,15 +1901,6 @@ "once": "^1.4.0" } }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -3182,12 +3090,6 @@ "minimatch": "^3.0.4" } }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", - "dev": true - }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -3511,12 +3413,6 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", @@ -3909,67 +3805,6 @@ "invert-kv": "^1.0.0" } }, - "level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true - }, - "level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "requires": { - "xtend": "^4.0.2" - } - }, - "levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "dev": true, - "requires": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -4011,9 +3846,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash.camelcase": { "version": "4.3.0", @@ -4047,6 +3882,12 @@ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" }, + "lodash.sample": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.sample/-/lodash.sample-4.2.1.tgz", + "integrity": "sha1-XkKRsMdT+hq+sKq4+ynfG2bwf20=", + "dev": true + }, "lodash.set": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", @@ -4063,19 +3904,6 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, - "lowdb": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", - "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.3", - "is-promise": "^2.1.0", - "lodash": "4", - "pify": "^3.0.0", - "steno": "^0.4.1" - } - }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -4100,12 +3928,6 @@ } } }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", - "dev": true - }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", @@ -4141,31 +3963,6 @@ "safe-buffer": "^5.1.2" } }, - "memdown": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-3.0.0.tgz", - "integrity": "sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==", - "dev": true, - "requires": { - "abstract-leveldown": "~5.0.0", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", - "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, "memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", @@ -4396,9 +4193,9 @@ "dev": true }, "mongodb": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.8.tgz", - "integrity": "sha512-jz7mR58z66JKL8Px4ZY+FXbgB7d0a0hEGCT7kw8iye46/gsqPrOEpZOswwJ2BQlfzsrCLKdsF9UcaUfGVN2HrQ==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.9.tgz", + "integrity": "sha512-vXHBY1CsGYcEPoVWhwgxIBeWqP3dSu9RuRDsoLRPTITrcrgm1f0Ubu1xqF9ozMwv53agmEiZm0YGo+7WL3Nbug==", "dev": true, "requires": { "bl": "^2.2.0", @@ -4436,9 +4233,9 @@ } }, "multihashes": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.19.tgz", - "integrity": "sha512-ej74GAfA20imjj00RO5h34aY3pGUFyzn9FJZFWwdeUHlHTkKmv90FrNpvYT4jYf1XXCy5O/5EjVnxTaESgOM6A==", + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", "requires": { "buffer": "^5.5.0", "multibase": "^0.7.0", @@ -5340,12 +5137,6 @@ "long": "^4.0.0" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -5468,12 +5259,6 @@ "readable-stream": "^2.0.2" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -6124,15 +5909,6 @@ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, - "steno": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", - "integrity": "sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.3" - } - }, "stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", diff --git a/package.json b/package.json index 2c2c12c58..6cf5b66ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi", - "version": "0.13.0", + "version": "0.14.0", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", @@ -30,10 +30,10 @@ "all": true }, "dependencies": { - "@dashevo/dapi-grpc": "~0.13.0", - "@dashevo/dashcore-lib": "~0.18.1", + "@dashevo/dapi-grpc": "~0.14.0", + "@dashevo/dashcore-lib": "~0.18.11", "@dashevo/dashd-rpc": "^2.0.0", - "@dashevo/dpp": "~0.13.0", + "@dashevo/dpp": "~0.14.0", "@dashevo/grpc-common": "~0.3.0", "ajv": "^6.4.0", "bs58": "^4.0.1", @@ -43,14 +43,14 @@ "dotenv-safe": "^8.2.0", "grpc": "^1.24.3", "jayson": "^2.0.4", - "lodash": "^4.17.14", + "lodash": "^4.17.19", "request": "^2.87.0", "request-promise-native": "^1.0.5", "zeromq": "^5.2.0" }, "devDependencies": { - "@dashevo/dapi-client": "~0.13.0", - "@dashevo/dp-services-ctl": "~0.13.1", + "@dashevo/dapi-client": "~0.14.0", + "@dashevo/dp-services-ctl": "~0.14.0", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "dirty-chai": "^2.0.1", @@ -61,6 +61,7 @@ "mocha-sinon": "^2.1.0", "nodemon": "^1.18.9", "nyc": "^14.0.0", + "semver": "^7.3.2", "sinon": "^7.5.0", "sinon-chai": "^3.4.0", "swagger-jsdoc": "^3.5.0" diff --git a/test/functional/grpcServer/handlers/core/getBlockHandlerFactory.spec.js b/test/functional/grpcServer/handlers/core/getBlockHandlerFactory.spec.js deleted file mode 100644 index 03fc070ba..000000000 --- a/test/functional/grpcServer/handlers/core/getBlockHandlerFactory.spec.js +++ /dev/null @@ -1,68 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -const { Block } = require('@dashevo/dashcore-lib'); - -describe('getBlockHandlerFactory', function main() { - this.timeout(400000); - - let removeDapi; - let dapiClient; - let blockHash; - let blockHeight; - - beforeEach(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - const coreAPI = dashCore.getApi(); - - removeDapi = remove; - - dapiClient = dapiCore.getApi(); - - const { result: address } = await coreAPI.getNewAddress(); - - await dashCore.getApi().generateToAddress(101, address); - - ({ result: blockHash } = await dashCore.getApi().getbestblockhash()); - blockHeight = 100; - }); - - afterEach(async () => { - await removeDapi(); - }); - - it('should get block by hash', async () => { - const blockBinary = await dapiClient.getBlockByHash(blockHash); - - expect(blockBinary).to.be.an.instanceof(Buffer); - const block = new Block(blockBinary); - - expect(block.toBuffer()).to.deep.equal(blockBinary); - }); - - it('should get block by height', async () => { - const blockBinary = await dapiClient.getBlockByHeight(blockHeight); - - expect(blockBinary).to.be.an.instanceof(Buffer); - const block = new Block(blockBinary); - - expect(block.toBuffer()).to.deep.equal(blockBinary); - }); - - it('should respond with an invalid argument error if the block was not found', async () => { - try { - await dapiClient.getBlockByHeight(100000000); - - expect.fail('Should throw an invalid argument error'); - } catch (e) { - expect(e.message).to.equal('3 INVALID_ARGUMENT: Invalid block height'); - expect(e.code).to.equal(3); - } - }); -}); diff --git a/test/functional/grpcServer/handlers/core/getStatusHandlerFactory.spec.js b/test/functional/grpcServer/handlers/core/getStatusHandlerFactory.spec.js deleted file mode 100644 index eab3bc0c9..000000000 --- a/test/functional/grpcServer/handlers/core/getStatusHandlerFactory.spec.js +++ /dev/null @@ -1,48 +0,0 @@ -const startDapi = require('@dashevo/dp-services-ctl/lib/services/startDapi'); - -describe('getStatusHandlerFactory', function main() { - this.timeout(160000); - - let removeDapi; - let dapiClient; - - beforeEach(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - const coreAPI = dashCore.getApi(); - - removeDapi = remove; - - dapiClient = dapiCore.getApi(); - - const { result: address } = await coreAPI.getNewAddress(); - - await dashCore.getApi().generateToAddress(10, address); - }); - - afterEach(async () => { - await removeDapi(); - }); - - it('should return status', async () => { - const result = await dapiClient.getStatus(); - - expect(result).to.have.a.property('coreVersion'); - expect(result).to.have.a.property('protocolVersion'); - expect(result).to.have.a.property('blocks'); - expect(result).to.have.a.property('timeOffset'); - expect(result).to.have.a.property('connections'); - expect(result).to.have.a.property('proxy'); - expect(result).to.have.a.property('difficulty'); - expect(result).to.have.a.property('testnet'); - expect(result).to.have.a.property('relayFee'); - expect(result).to.have.a.property('errors'); - expect(result).to.have.a.property('network'); - - expect(result.blocks).to.equal(10); - }); -}); diff --git a/test/functional/grpcServer/handlers/core/getTransactionHandlerFactory.spec.js b/test/functional/grpcServer/handlers/core/getTransactionHandlerFactory.spec.js deleted file mode 100644 index a51e1f105..000000000 --- a/test/functional/grpcServer/handlers/core/getTransactionHandlerFactory.spec.js +++ /dev/null @@ -1,69 +0,0 @@ -const startDapi = require('@dashevo/dp-services-ctl/lib/services/startDapi'); - -const { - Transaction, - PrivateKey, -} = require('@dashevo/dashcore-lib'); - -describe('getTransactionHandlerFactor', function main() { - this.timeout(260000); - - let removeDapi; - let dapiClient; - let transaction; - let transactionId; - - beforeEach(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - removeDapi = remove; - - dapiClient = dapiCore.getApi(); - - const coreAPI = dashCore.getApi(); - - const { result: fromAddress } = await coreAPI.getNewAddress(); - const { result: privateKeyString } = await coreAPI.dumpPrivKey(fromAddress); - const privateKey = new PrivateKey(privateKeyString); - - const { result: toAddress } = await coreAPI.getNewAddress(); - - await coreAPI.generateToAddress(1000, fromAddress); - - const { items: unspent } = await dapiClient.getUTXO(fromAddress); - - const amount = 10000; - - transaction = new Transaction(); - - transaction.from(unspent.slice(-1)[0]) - .to(toAddress, amount) - .change(fromAddress) - .fee(1000) - .sign(privateKey); - - ({ result: transactionId } = await coreAPI.sendRawTransaction(transaction.serialize())); - }); - - afterEach(async () => { - await removeDapi(); - }); - - it('should respond with a transaction by it\'s ID', async () => { - const result = await dapiClient.getTransaction(transactionId); - const receivedTx = new Transaction(Buffer.from(result)); - expect(receivedTx.toString('hex')).to.deep.equal(transaction.serialize()); - }); - - it('should respond with null if transaction was not found', async () => { - const nonExistentId = Buffer.alloc(32).toString('hex'); - - const result = await dapiClient.getTransaction(nonExistentId); - - expect(result).to.be.null(); - }); -}); diff --git a/test/functional/grpcServer/handlers/core/sendTransactionHandlerFactory.spec.js b/test/functional/grpcServer/handlers/core/sendTransactionHandlerFactory.spec.js deleted file mode 100644 index 9fd6b88a8..000000000 --- a/test/functional/grpcServer/handlers/core/sendTransactionHandlerFactory.spec.js +++ /dev/null @@ -1,63 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -const { - PrivateKey, - Transaction, -} = require('@dashevo/dashcore-lib'); - -describe('sendTransactionHandlerFactory', function main() { - this.timeout(200000); - - let removeDapi; - let dapiClient; - let transaction; - let toAddress; - - beforeEach(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - removeDapi = remove; - - const coreAPI = dashCore.getApi(); - dapiClient = dapiCore.getApi(); - - const { result: fromAddress } = await coreAPI.getNewAddress(); - const { result: privateKeyString } = await coreAPI.dumpPrivKey(fromAddress); - const privateKey = new PrivateKey(privateKeyString); - - ({ result: toAddress } = await coreAPI.getNewAddress()); - - await coreAPI.generateToAddress(500, fromAddress); - - const { result: unspent } = await coreAPI.listUnspent(); - const inputs = unspent.filter(input => input.address === fromAddress); - - const amount = 10000; - - transaction = new Transaction(); - - transaction.from(inputs.slice(-1)[0]) - .to(toAddress, amount) - .change(fromAddress) - .fee(668) - .sign(privateKey); - }); - - afterEach(async () => { - await removeDapi(); - }); - - it('should sent transaction and return transaction ID', async () => { - const options = {}; - - const result = await dapiClient.sendTransaction(Buffer.from(transaction.serialize(), 'hex'), options); - - expect(result).to.be.a('string'); - }); -}); diff --git a/test/functional/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js b/test/functional/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js deleted file mode 100644 index c3a82ef46..000000000 --- a/test/functional/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js +++ /dev/null @@ -1,127 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -const { - PrivateKey, - PublicKey, - Transaction, -} = require('@dashevo/dashcore-lib'); - -const DashPlatformProtocol = require('@dashevo/dpp'); - -const getDataContractFixture = require( - '@dashevo/dpp/lib/test/fixtures/getDataContractFixture', -); - -const wait = require('../../../../../lib/utils/wait'); - -describe('getDataContractHandlerFactory', function main() { - this.timeout(200000); - - let removeDapi; - let dapiClient; - let dpp; - let identityCreateTransition; - let publicKeyId; - let dataContract; - - before(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi({}); - - removeDapi = remove; - - const coreAPI = dashCore.getApi(); - dapiClient = dapiCore.getApi(); - - dpp = new DashPlatformProtocol({ - dataProvider: {}, - }); - - const { result: addressString } = await coreAPI.getNewAddress(); - const { result: privateKeyString } = await coreAPI.dumpPrivKey(addressString); - - const privateKey = new PrivateKey(privateKeyString); - const publicKey = new PublicKey({ - ...privateKey.toPublicKey().toObject(), - compressed: true, - }); - const pubKeyBase = publicKey.toBuffer() - .toString('base64'); - - // eslint-disable-next-line no-underscore-dangle - const publicKeyHash = PublicKey.fromBuffer(Buffer.from(pubKeyBase, 'base64'))._getID(); - publicKeyId = 0; - - await coreAPI.generateToAddress(500, addressString); - - const { result: unspent } = await coreAPI.listUnspent(); - const inputs = unspent.filter(input => input.address === addressString); - - const transaction = new Transaction(); - - transaction.from(inputs.slice(-1)[0]) - .addBurnOutput(10000, publicKeyHash) - .change(addressString) - .fee(668) - .sign(privateKey); - - await coreAPI.sendrawtransaction(transaction.serialize()); - - await coreAPI.generateToAddress(1, addressString); - - await wait(2000); // wait a couple of seconds for tx to be confirmed - - const outPoint = transaction.getOutPointBuffer(0); - - const identity = dpp.identity.create( - outPoint, - [publicKey], - ); - - identityCreateTransition = dpp.identity.createIdentityCreateTransition(identity); - identityCreateTransition.signByPrivateKey(privateKey); - - dataContract = getDataContractFixture(identityCreateTransition.getIdentityId()); - - const dataContractCreateTransition = dpp.dataContract.createStateTransition(dataContract); - dataContractCreateTransition.sign(identity.getPublicKeyById(publicKeyId), privateKey); - - // Create Identity - await dapiClient.applyStateTransition(identityCreateTransition); - - // Create Data Contract - await dapiClient.applyStateTransition(dataContractCreateTransition); - }); - - after(async () => { - await removeDapi(); - }); - - it('should fetch created data contract', async () => { - const serializedDataContract = await dapiClient.getDataContract( - dataContract.getId(), - ); - - expect(serializedDataContract).to.be.not.null(); - - const receivedDataContract = await dpp.dataContract.createFromSerialized( - serializedDataContract, - { skipValidation: true }, - ); - - expect(dataContract.toJSON()).to.deep.equal(receivedDataContract.toJSON()); - }); - - it('should respond with null if data contract not found', async () => { - const serializedDataContract = await dapiClient.getDataContract( - 'unknownId', - ); - - expect(serializedDataContract).to.be.null(); - }); -}); diff --git a/test/functional/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js b/test/functional/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js deleted file mode 100644 index 41e80d1e6..000000000 --- a/test/functional/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js +++ /dev/null @@ -1,167 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -const { - PrivateKey, - PublicKey, - Transaction, -} = require('@dashevo/dashcore-lib'); - -const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); - -const DashPlatformProtocol = require('@dashevo/dpp'); - -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const { convertSatoshiToCredits } = require( - '@dashevo/dpp/lib/identity/creditsConverter', -); - -const wait = require('../../../../../lib/utils/wait'); - -describe('getDocumentsHandlerFactory', function main() { - this.timeout(90000); - - let removeDapi; - let dpp; - let dapiClient; - let identity; - let dataContract; - let identityPrivateKey; - let accumulatedFee; - let publicKeyId; - - before(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - removeDapi = remove; - - const coreAPI = dashCore.getApi(); - dapiClient = dapiCore.getApi(); - - dpp = new DashPlatformProtocol({ - dataProvider: {}, - }); - - const { result: addressString } = await coreAPI.getNewAddress(); - const { result: privateKeyString } = await coreAPI.dumpPrivKey(addressString); - - const privateKey = new PrivateKey(privateKeyString); - const publicKey = new PublicKey({ - ...privateKey.toPublicKey().toObject(), - compressed: true, - }); - const pubKeyBase = publicKey.toBuffer() - .toString('base64'); - publicKeyId = 0; - - identityPrivateKey = privateKey; - - // eslint-disable-next-line no-underscore-dangle - const publicKeyHash = PublicKey.fromBuffer(Buffer.from(pubKeyBase, 'base64')) - ._getID(); - - await coreAPI.generateToAddress(500, addressString); - - const { result: unspent } = await coreAPI.listUnspent(); - const inputs = unspent.filter(input => input.address === addressString); - - const transaction = new Transaction(); - - transaction.from(inputs.slice(-1)[0]) - .addBurnOutput(2, publicKeyHash) - .change(addressString) - .fee(668) - .sign(privateKey); - - await coreAPI.sendrawtransaction(transaction.serialize()); - - await coreAPI.generateToAddress(1, addressString); - - await wait(2000); // wait a couple of seconds for tx to be confirmed - - const outPoint = transaction.getOutPointBuffer(0); - - identity = dpp.identity.create( - outPoint, - [publicKey], - ); - - accumulatedFee = 0; - - const identityCreateTransition = dpp.identity.createIdentityCreateTransition(identity); - identityCreateTransition.signByPrivateKey(privateKey); - - accumulatedFee += identityCreateTransition.calculateFee(); - - await dapiClient.applyStateTransition(identityCreateTransition); - - dataContract = getDataContractFixture(identity.getId()); - - const dataContractStateTransition = dpp.dataContract.createStateTransition(dataContract); - dataContractStateTransition.sign(identity.getPublicKeyById(publicKeyId), identityPrivateKey); - - accumulatedFee += dataContractStateTransition.calculateFee(); - - await dapiClient.applyStateTransition(dataContractStateTransition); - }); - - after(async () => { - await removeDapi(); - }); - - it('should fetch created documents array', async () => { - const document = dpp.document.create( - dataContract, identity.getId(), 'niceDocument', { - name: 'someName', - }, - ); - - const documentTransition = dpp.document.createStateTransition({ - create: [document], - }); - documentTransition.sign(identity.getPublicKeyById(publicKeyId), identityPrivateKey); - - accumulatedFee += documentTransition.calculateFee(); - - await dapiClient.applyStateTransition(documentTransition); - - const [documentBuffer] = await dapiClient.getDocuments(dataContract.getId(), 'niceDocument', {}); - - const receivedDocument = await dpp.document.createFromSerialized( - documentBuffer, { skipValidation: true }, - ); - - expect(document.toJSON()).to.deep.equal(receivedDocument.toJSON()); - }); - - it('should fail to create more documents if not having enough credits', async () => { - const document = dpp.document.create( - dataContract, identity.getId(), 'niceDocument', { - name: 'someVeryLongOtherNameForTheDocument'.repeat(256), - }, - ); - - const documentTransition = dpp.document.createStateTransition({ - create: [document], - }); - documentTransition.sign(identity.getPublicKeyById(publicKeyId), identityPrivateKey); - - try { - await dapiClient.applyStateTransition(documentTransition); - expect.fail('Error was not thrown'); - } catch (e) { - expect(e.code).to.equal(GrpcErrorCodes.FAILED_PRECONDITION); - expect(e.details).to.equal('Failed precondition: Not enough credits'); - - const initialBalance = convertSatoshiToCredits(2); - expect(e.metadata.get('balance')[0]).to.equal( - (initialBalance - accumulatedFee).toString(), - ); - } - }); -}); diff --git a/test/functional/grpcServer/handlers/platform/getIdentityByFirstPublicKeyHandlerFactory.spec.js b/test/functional/grpcServer/handlers/platform/getIdentityByFirstPublicKeyHandlerFactory.spec.js deleted file mode 100644 index 38a6c1ab3..000000000 --- a/test/functional/grpcServer/handlers/platform/getIdentityByFirstPublicKeyHandlerFactory.spec.js +++ /dev/null @@ -1,123 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -const { - PrivateKey, - PublicKey, - Transaction, -} = require('@dashevo/dashcore-lib'); - -const DashPlatformProtocol = require('@dashevo/dpp'); - -const { convertSatoshiToCredits } = require( - '@dashevo/dpp/lib/identity/creditsConverter', -); - -const wait = require('../../../../../lib/utils/wait'); - -describe('getIdentityByFirstPublicKeyHandlerFactory', function main() { - this.timeout(200000); - - let removeDapi; - let dapiClient; - let dpp; - let identityCreateTransition; - let identity; - - before(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - removeDapi = remove; - - const coreAPI = dashCore.getApi(); - dapiClient = dapiCore.getApi(); - - dpp = new DashPlatformProtocol({ - dataProvider: {}, - }); - - const { result: addressString } = await coreAPI.getNewAddress(); - const { result: privateKeyString } = await coreAPI.dumpPrivKey(addressString); - - const privateKey = new PrivateKey(privateKeyString); - const publicKey = new PublicKey({ - ...privateKey.toPublicKey().toObject(), - compressed: true, - }); - const pubKeyBase = publicKey.toBuffer() - .toString('base64'); - - // eslint-disable-next-line no-underscore-dangle - const publicKeyHash = PublicKey.fromBuffer(Buffer.from(pubKeyBase, 'base64')) - ._getID(); - - await coreAPI.generateToAddress(500, addressString); - - const { result: unspent } = await coreAPI.listUnspent(); - const inputs = unspent.filter(input => input.address === addressString); - - const transaction = new Transaction(); - - transaction.from(inputs.slice(-1)[0]) - .addBurnOutput(10000, publicKeyHash) - .change(addressString) - .fee(668) - .sign(privateKey); - - await coreAPI.sendrawtransaction(transaction.serialize()); - - await coreAPI.generateToAddress(1, addressString); - - await wait(2000); // wait a couple of seconds for tx to be confirmed - - const outPoint = transaction.getOutPointBuffer(0); - - identity = dpp.identity.create( - outPoint, - [publicKey], - ); - - identityCreateTransition = dpp.identity.createIdentityCreateTransition(identity); - identityCreateTransition.signByPrivateKey(privateKey); - - await dapiClient.applyStateTransition(identityCreateTransition); - }); - - after(async () => { - await removeDapi(); - }); - - it('should fetch created identity', async () => { - const publicKeyHash = identity.getPublicKeyById(0).hash(); - - const serializedIdentity = await dapiClient.getIdentityByFirstPublicKey( - publicKeyHash, - ); - - expect(serializedIdentity).to.be.not.null(); - - const receivedIdentity = dpp.identity.createFromSerialized( - serializedIdentity, - { skipValidation: true }, - ); - - expect({ - ...identity.toJSON(), - balance: convertSatoshiToCredits(10000) - identityCreateTransition.calculateFee(), - }).to.deep.equal(receivedIdentity.toJSON()); - }); - - it('should respond with NOT_FOUND error if identity not found', async () => { - const publicKeyHash = Buffer.alloc(10).toString('hex'); - const serializedIdentity = await dapiClient.getIdentityByFirstPublicKey( - publicKeyHash, - ); - - expect(serializedIdentity).to.be.null(); - }); -}); diff --git a/test/functional/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js b/test/functional/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js deleted file mode 100644 index 5c1a67898..000000000 --- a/test/functional/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js +++ /dev/null @@ -1,118 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -const { - PrivateKey, - PublicKey, - Transaction, -} = require('@dashevo/dashcore-lib'); - -const DashPlatformProtocol = require('@dashevo/dpp'); - -const { convertSatoshiToCredits } = require( - '@dashevo/dpp/lib/identity/creditsConverter', -); - -const wait = require('../../../../../lib/utils/wait'); - -describe('getIdentityHandlerFactory', function main() { - this.timeout(200000); - - let removeDapi; - let dapiClient; - let dpp; - let identityCreateTransition; - let identity; - - before(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - removeDapi = remove; - - const coreAPI = dashCore.getApi(); - dapiClient = dapiCore.getApi(); - - dpp = new DashPlatformProtocol({ - dataProvider: {}, - }); - - const { result: addressString } = await coreAPI.getNewAddress(); - const { result: privateKeyString } = await coreAPI.dumpPrivKey(addressString); - - const privateKey = new PrivateKey(privateKeyString); - const publicKey = new PublicKey({ - ...privateKey.toPublicKey().toObject(), - compressed: true, - }); - const pubKeyBase = publicKey.toBuffer() - .toString('base64'); - - // eslint-disable-next-line no-underscore-dangle - const publicKeyHash = PublicKey.fromBuffer(Buffer.from(pubKeyBase, 'base64')) - ._getID(); - - await coreAPI.generateToAddress(500, addressString); - - const { result: unspent } = await coreAPI.listUnspent(); - const inputs = unspent.filter(input => input.address === addressString); - - const transaction = new Transaction(); - - transaction.from(inputs.slice(-1)[0]) - .addBurnOutput(10000, publicKeyHash) - .change(addressString) - .fee(668) - .sign(privateKey); - - await coreAPI.sendrawtransaction(transaction.serialize()); - - await coreAPI.generateToAddress(1, addressString); - - await wait(2000); // wait a couple of seconds for tx to be confirmed - - const outPoint = transaction.getOutPointBuffer(0); - - identity = dpp.identity.create( - outPoint, - [publicKey], - ); - - identityCreateTransition = dpp.identity.createIdentityCreateTransition(identity); - identityCreateTransition.signByPrivateKey(privateKey); - - await dapiClient.applyStateTransition(identityCreateTransition); - }); - - after(async () => { - await removeDapi(); - }); - - it('should fetch created identity', async () => { - const serializedIdentity = await dapiClient.getIdentity( - identityCreateTransition.getIdentityId(), - ); - - expect(serializedIdentity).to.be.not.null(); - - const receivedIdentity = dpp.identity.createFromSerialized( - serializedIdentity, - { skipValidation: true }, - ); - - expect({ - ...identity.toJSON(), - balance: convertSatoshiToCredits(10000) - identityCreateTransition.calculateFee(), - }).to.deep.equal(receivedIdentity.toJSON()); - }); - - it('should respond with NOT_FOUND error if identity not found', async () => { - const serializedIdentity = await dapiClient.getIdentity('unknownId'); - - expect(serializedIdentity).to.be.null(); - }); -}); diff --git a/test/functional/grpcServer/handlers/platform/getIdentityIdByFirstPublicKeyHandlerFactory.spec.js b/test/functional/grpcServer/handlers/platform/getIdentityIdByFirstPublicKeyHandlerFactory.spec.js deleted file mode 100644 index 29e8cfc7b..000000000 --- a/test/functional/grpcServer/handlers/platform/getIdentityIdByFirstPublicKeyHandlerFactory.spec.js +++ /dev/null @@ -1,111 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -const { - PrivateKey, - PublicKey, - Transaction, -} = require('@dashevo/dashcore-lib'); - -const DashPlatformProtocol = require('@dashevo/dpp'); - -const wait = require('../../../../../lib/utils/wait'); - -describe('getIdentityIdByFirstPublicKeyHandlerFactory', function main() { - this.timeout(200000); - - let removeDapi; - let dapiClient; - let dpp; - let identityCreateTransition; - let identity; - - before(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - removeDapi = remove; - - const coreAPI = dashCore.getApi(); - dapiClient = dapiCore.getApi(); - - dpp = new DashPlatformProtocol({ - dataProvider: {}, - }); - - const { result: addressString } = await coreAPI.getNewAddress(); - const { result: privateKeyString } = await coreAPI.dumpPrivKey(addressString); - - const privateKey = new PrivateKey(privateKeyString); - const publicKey = new PublicKey({ - ...privateKey.toPublicKey().toObject(), - compressed: true, - }); - const pubKeyBase = publicKey.toBuffer() - .toString('base64'); - - // eslint-disable-next-line no-underscore-dangle - const publicKeyHash = PublicKey.fromBuffer(Buffer.from(pubKeyBase, 'base64')) - ._getID(); - - await coreAPI.generateToAddress(500, addressString); - - const { result: unspent } = await coreAPI.listUnspent(); - const inputs = unspent.filter(input => input.address === addressString); - - const transaction = new Transaction(); - - transaction.from(inputs.slice(-1)[0]) - .addBurnOutput(10000, publicKeyHash) - .change(addressString) - .fee(668) - .sign(privateKey); - - await coreAPI.sendrawtransaction(transaction.serialize()); - - await coreAPI.generateToAddress(1, addressString); - - await wait(2000); // wait a couple of seconds for tx to be confirmed - - const outPoint = transaction.getOutPointBuffer(0); - - identity = dpp.identity.create( - outPoint, - [publicKey], - ); - - identityCreateTransition = dpp.identity.createIdentityCreateTransition(identity); - identityCreateTransition.signByPrivateKey(privateKey); - - await dapiClient.applyStateTransition(identityCreateTransition); - }); - - after(async () => { - await removeDapi(); - }); - - it('should fetch created identity', async () => { - const publicKeyHash = identity.getPublicKeyById(0).hash(); - - const identityId = await dapiClient.getIdentityIdByFirstPublicKey( - publicKeyHash, - ); - - expect(identityId).to.be.not.null(); - - expect(identityId).to.equal(identity.getId()); - }); - - it('should respond with NOT_FOUND error if identity not found', async () => { - const publicKeyHash = Buffer.alloc(10).toString('hex'); - const serializedIdentity = await dapiClient.getIdentityIdByFirstPublicKey( - publicKeyHash, - ); - - expect(serializedIdentity).to.be.null(); - }); -}); diff --git a/test/functional/grpcServer/handlers/platform/topUpIdentity.spec.js b/test/functional/grpcServer/handlers/platform/topUpIdentity.spec.js deleted file mode 100644 index 3f1b49f61..000000000 --- a/test/functional/grpcServer/handlers/platform/topUpIdentity.spec.js +++ /dev/null @@ -1,189 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -const { - PrivateKey, - PublicKey, - Transaction, -} = require('@dashevo/dashcore-lib'); - -const DashPlatformProtocol = require('@dashevo/dpp'); - -const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); - -const { convertSatoshiToCredits } = require( - '@dashevo/dpp/lib/identity/creditsConverter', -); - -const wait = require('../../../../../lib/utils/wait'); - -describe('topUpIdentity', function main() { - this.timeout(200000); - - let removeDapi; - let dapiClient; - let dpp; - let identity; - let identityCreateTransition; - let identityTopUpTransition; - let coreAPI; - let addressString; - let publicKeyHash; - let privateKey; - - before(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - removeDapi = remove; - coreAPI = dashCore.getApi(); - dapiClient = dapiCore.getApi(); - - dpp = new DashPlatformProtocol({ - dataProvider: {}, - }); - }); - - beforeEach(async () => { - ({ result: addressString } = await coreAPI.getNewAddress()); - const { result: privateKeyString } = await coreAPI.dumpPrivKey(addressString); - - privateKey = new PrivateKey(privateKeyString); - const publicKey = new PublicKey({ - ...privateKey.toPublicKey().toObject(), - compressed: true, - }); - const pubKeyBase = publicKey.toBuffer() - .toString('base64'); - - // eslint-disable-next-line no-underscore-dangle - publicKeyHash = PublicKey.fromBuffer(Buffer.from(pubKeyBase, 'base64')) - ._getID(); - - await coreAPI.generateToAddress(500, addressString); - - const { result: unspent } = await coreAPI.listUnspent(); - const inputs = unspent.filter(input => input.address === addressString); - - const transaction = new Transaction(); - - transaction.from(inputs.slice(-1)[0]) - .addBurnOutput(10000, publicKeyHash) - .change(addressString) - .fee(668) - .sign(privateKey); - - await coreAPI.sendrawtransaction(transaction.serialize()); - - await coreAPI.generateToAddress(1, addressString); - - await wait(2000); // wait a couple of seconds for tx to be confirmed - - const outPoint = transaction.getOutPointBuffer(0); - - identity = dpp.identity.create( - outPoint, - [publicKey], - ); - - identityCreateTransition = dpp.identity.createIdentityCreateTransition(identity); - identityCreateTransition.signByPrivateKey(privateKey); - - await dapiClient.applyStateTransition(identityCreateTransition); - }); - - after(async () => { - await removeDapi(); - }); - - it('should top up created identity', async () => { - const { result: unspent } = await coreAPI.listUnspent(); - const inputs = unspent.filter(input => input.address === addressString); - const topUpTransaction = new Transaction(); - const topUpAmount = 3000; - - topUpTransaction.from(inputs.slice(-1)[0]) - .addBurnOutput(topUpAmount, publicKeyHash) - .change(addressString) - .fee(668) - .sign(privateKey); - - await coreAPI.sendrawtransaction(topUpTransaction.serialize()); - - await coreAPI.generateToAddress(1, addressString); - - await wait(2000); // wait a couple of seconds for tx to be confirmed - - const topUpOutPoint = topUpTransaction.getOutPointBuffer(0); - - identityTopUpTransition = dpp.identity.createIdentityTopUpTransition( - identity.getId(), - topUpOutPoint, - ); - identityTopUpTransition.signByPrivateKey(privateKey); - - await dapiClient.applyStateTransition(identityTopUpTransition); - - const serializedIdentity = await dapiClient.getIdentity( - identityCreateTransition.getIdentityId(), - ); - - const receivedIdentity = dpp.identity.createFromSerialized( - serializedIdentity, - { skipValidation: true }, - ); - - const balance = convertSatoshiToCredits(10000) - + convertSatoshiToCredits(topUpAmount) - - identityCreateTransition.calculateFee() - - identityTopUpTransition.calculateFee(); - - expect(balance).to.equal(receivedIdentity.getBalance()); - }); - - it('should fail top up created identity ', async () => { - const { result: unspent } = await coreAPI.listUnspent(); - const inputs = unspent.filter(input => input.address === addressString); - const topUpTransaction = new Transaction(); - const topUpAmount = 3000; - - topUpTransaction.from(inputs.slice(-1)[0]) - .addBurnOutput(topUpAmount, publicKeyHash) - .change(addressString) - .fee(668) - .sign(privateKey); - - const topUpOutPoint = topUpTransaction.getOutPointBuffer(0); - - identityTopUpTransition = dpp.identity.createIdentityTopUpTransition( - identity.getId(), - topUpOutPoint, - ); - identityTopUpTransition.signByPrivateKey(privateKey); - - try { - await dapiClient.applyStateTransition(identityTopUpTransition); - - expect.fail('Should fail with error'); - } catch (e) { - expect(e.code).to.equal(GrpcErrorCodes.INVALID_ARGUMENT); - expect(e.details).to.equal('State Transition is invalid'); - } - - const serializedIdentity = await dapiClient.getIdentity( - identityCreateTransition.getIdentityId(), - ); - - const receivedIdentity = dpp.identity.createFromSerialized( - serializedIdentity, - { skipValidation: true }, - ); - - expect(convertSatoshiToCredits(10000) - identityCreateTransition.calculateFee()) - .to.equal(receivedIdentity.getBalance()); - }); -}); diff --git a/test/functional/grpcServer/handlers/platform/validateIdentityPublicKeyUniqueness.spec.js b/test/functional/grpcServer/handlers/platform/validateIdentityPublicKeyUniqueness.spec.js deleted file mode 100644 index 3e0dcad38..000000000 --- a/test/functional/grpcServer/handlers/platform/validateIdentityPublicKeyUniqueness.spec.js +++ /dev/null @@ -1,132 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -const { - PrivateKey, - PublicKey, - Transaction, -} = require('@dashevo/dashcore-lib'); - -const DashPlatformProtocol = require('@dashevo/dpp'); - -const wait = require('../../../../../lib/utils/wait'); - -/** - * @param {RpcClient} coreAPI - * @param {string} address - * @param {PublicKey} publicKey - * @param {PrivateKey} privateKey - * - * @returns {Promise} - */ -async function getOutPointBuffer(coreAPI, address, publicKey, privateKey) { - const pubKeyBase = publicKey.toBuffer() - .toString('base64'); - - // eslint-disable-next-line no-underscore-dangle - const publicKeyHash = PublicKey.fromBuffer(Buffer.from(pubKeyBase, 'base64')) - ._getID(); - - await coreAPI.generateToAddress(500, address); - - const { result: unspent } = await coreAPI.listUnspent(); - const inputs = unspent.filter(input => input.address === address); - - const transaction = new Transaction(); - - transaction.from(inputs.slice(-1)[0]) - .addBurnOutput(10000, publicKeyHash) - .change(address) - .fee(668) - .sign(privateKey); - - await coreAPI.sendRawTransaction(transaction.serialize()); - await coreAPI.generateToAddress(1, address); - - // wait a couple of seconds for tx to be confirmed - await wait(2000); - - return transaction.getOutPointBuffer(0); -} - -describe('validateIdentityPublicKeyUniqueness', function main() { - this.timeout(200000); - - let removeDapi; - let dapiClient; - let dpp; - let identityCreateTransition; - let identity; - let publicKey; - let privateKey; - let addressString; - let coreAPI; - - before(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - removeDapi = remove; - - coreAPI = dashCore.getApi(); - dapiClient = dapiCore.getApi(); - - dpp = new DashPlatformProtocol({ - dataProvider: {}, - }); - - ({ result: addressString } = await coreAPI.getNewAddress()); - const { result: privateKeyString } = await coreAPI.dumpPrivKey(addressString); - - privateKey = new PrivateKey(privateKeyString); - publicKey = new PublicKey({ - ...privateKey.toPublicKey().toObject(), - compressed: true, - }); - - const outPoint = await getOutPointBuffer( - coreAPI, addressString, publicKey, privateKey, - ); - - identity = dpp.identity.create( - outPoint, - [publicKey], - ); - - identityCreateTransition = dpp.identity.createIdentityCreateTransition(identity); - identityCreateTransition.signByPrivateKey(privateKey); - - await dapiClient.applyStateTransition(identityCreateTransition); - }); - - after(async () => { - await removeDapi(); - }); - - it('should throw error in case public key is already taken', async () => { - const outPoint = await getOutPointBuffer( - coreAPI, addressString, publicKey, privateKey, - ); - - identity = dpp.identity.create( - outPoint, - [publicKey], - ); - - identityCreateTransition = dpp.identity.createIdentityCreateTransition(identity); - identityCreateTransition.signByPrivateKey(privateKey); - - try { - await dapiClient.applyStateTransition(identityCreateTransition); - expect.fail('Error was not thrown'); - } catch (e) { - const [error] = JSON.parse(e.metadata.get('errors')[0]); - expect(error.name).to.equal('IdentityFirstPublicKeyAlreadyExistsError'); - expect(error.publicKeyHash).to.equal(publicKey.hash.toString('hex')); - } - }); -}); diff --git a/test/functional/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.spec.js b/test/functional/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.spec.js index 22db5bccc..37066e212 100644 --- a/test/functional/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.spec.js +++ b/test/functional/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.spec.js @@ -106,7 +106,7 @@ describe('subscribeToTransactionsWithProofsHandlerFactory', function main() { const bloomFilterObject = bloomFilter.toObject(); - const stream = await dapiClient.subscribeToTransactionsWithProofs( + const stream = await dapiClient.core.subscribeToTransactionsWithProofs( { vData: new Uint8Array(bloomFilterObject.vData), nHashFuncs: bloomFilterObject.nHashFuncs, @@ -177,7 +177,7 @@ describe('subscribeToTransactionsWithProofsHandlerFactory', function main() { const bloomFilterObject = bloomFilter.toObject(); - const stream = await dapiClient.subscribeToTransactionsWithProofs( + const stream = await dapiClient.core.subscribeToTransactionsWithProofs( { vData: new Uint8Array(bloomFilterObject.vData), nHashFuncs: bloomFilterObject.nHashFuncs, @@ -280,7 +280,7 @@ describe('subscribeToTransactionsWithProofsHandlerFactory', function main() { const bloomFilterObject = bloomFilter.toObject(); - const stream = await dapiClient.subscribeToTransactionsWithProofs( + const stream = await dapiClient.core.subscribeToTransactionsWithProofs( { vData: new Uint8Array(bloomFilterObject.vData), nHashFuncs: bloomFilterObject.nHashFuncs, @@ -443,7 +443,7 @@ describe('subscribeToTransactionsWithProofsHandlerFactory', function main() { await coreAPI.sendRawTransaction(transaction.serialize()); // Connect to the stream - const stream = await dapiClient.subscribeToTransactionsWithProofs( + const stream = await dapiClient.core.subscribeToTransactionsWithProofs( { vData: new Uint8Array(bloomFilterObject.vData), nHashFuncs: bloomFilterObject.nHashFuncs, diff --git a/test/functional/rpcServer/commands/getAddressSummary.spec.js b/test/functional/rpcServer/commands/getAddressSummary.spec.js deleted file mode 100644 index f23bfbfe6..000000000 --- a/test/functional/rpcServer/commands/getAddressSummary.spec.js +++ /dev/null @@ -1,52 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -describe('rpcServer', function main() { - this.timeout(200000); - - let removeDapi; - let dapiClient; - let address; - - beforeEach(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - removeDapi = remove; - - dapiClient = dapiCore.getApi(); - const coreAPI = dashCore.getApi(); - - ({ result: address } = await coreAPI.getNewAddress()); - - await coreAPI.generateToAddress(500, address); - }); - - afterEach(async () => { - await removeDapi(); - }); - - it('should return address summary', async () => { - const result = await dapiClient.getAddressSummary(address); - - expect(result).to.be.an('object'); - expect(result.addrStr).to.equal(address); - }); - - it('should throw an error on invalid params', async () => { - address = 'Xh7nD4vTUYAxy8GV7t1k8Er9ZKmxRBDcL'; - - try { - await dapiClient.getAddressSummary(address); - - expect.fail('should throw an error'); - } catch (e) { - expect(e.name).to.equal('RPCError'); - expect(e.message).contains('Invalid address'); - } - }); -}); diff --git a/test/functional/rpcServer/commands/getBlockHash.spec.js b/test/functional/rpcServer/commands/getBlockHash.spec.js deleted file mode 100644 index 1ef1645c2..000000000 --- a/test/functional/rpcServer/commands/getBlockHash.spec.js +++ /dev/null @@ -1,56 +0,0 @@ -const { - startDapi, -} = require('@dashevo/dp-services-ctl'); - -describe('rpcServer', function main() { - this.timeout(200000); - - describe('getBlockHash', () => { - let removeDapi; - let dapiClient; - let blocksNumber; - - beforeEach(async () => { - const { - dapiCore, - dashCore, - remove, - } = await startDapi(); - - removeDapi = remove; - - dapiClient = dapiCore.getApi(); - const coreAPI = dashCore.getApi(); - - const { result: addressString } = await coreAPI.getNewAddress(); - - blocksNumber = 500; - - await coreAPI.generateToAddress(blocksNumber, addressString); - }); - - afterEach(async () => { - await removeDapi(); - }); - - it('should get block hash by height', async () => { - const height = blocksNumber - 10; - const hash = await dapiClient.getBlockHash(height); - - expect(hash).to.be.a('string'); - }); - - it('should return RPC error if hash not found', async () => { - const height = blocksNumber * 3; - - try { - await dapiClient.getBlockHash(height); - - expect.fail('Should throw error'); - } catch (e) { - expect(e.name).to.equal('RPCError'); - expect(e.message).contains('Block height out of range'); - } - }); - }); -}); diff --git a/test/unit/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.spec.js b/test/unit/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.spec.js index 755c1cf68..8e7e971cf 100644 --- a/test/unit/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.spec.js +++ b/test/unit/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.spec.js @@ -129,76 +129,55 @@ describe('subscribeToTransactionsWithProofsHandlerFactory', () => { } }); - it('should subscribe to new transactions from 0 height if both fromBlockHash and fromBlockHeight are not specified', async function it() { - const hash = 'someHash'; - const hashHex = Buffer.from('someHash').toString('hex'); - - coreAPIMock.getBlock.resolves({ height: 1 }); - coreAPIMock.getBestBlockHeight.resolves(10); - coreAPIMock.getBlockHash.resolves(hashHex); - - call.request.setCount(10); - - const writableStub = this.sinon.stub(AcknowledgingWritable.prototype, 'write'); + it('should respond with error if `fromBlockHeight is 0 and `fromBlockHash` is not set', async () => { + const bloomFilterMessage = new BloomFilter(); - coreAPIMock.getBlock.resolves({ height: 1 }); - coreAPIMock.getBestBlockHeight.resolves(10); + bloomFilterMessage.setVData(new Uint8Array()); + bloomFilterMessage.setNTweak(1000); + bloomFilterMessage.setNFlags(100); + bloomFilterMessage.setNHashFuncs(10); - historicalTxData.push({ - merkleBlock: { - toBuffer: () => Buffer.from(hash), - header: { - hash, - }, - }, - transactions: [ - { - toBuffer: () => Buffer.from( - 'edefad1c70ee6736a0a0c2f9be7f22cfcf77ae2c120704a98cdc9aebdab7ffc5', 'hex', - ), - }, - ], - }); + const request = new TransactionsWithProofsRequest(); - await subscribeToTransactionsWithProofsHandler(call); + request.setFromBlockHeight(0); + request.setBloomFilter(bloomFilterMessage); - const filter = new CoreBloomFilter({ - vData: new Uint8Array([]), - nTweak: 1000, - nFlags: 100, - nHashFuncs: 10, - }); + call.request = request; - expect(getHistoricalTransactionsIteratorMock).to.have.been - .calledOnceWith( - filter, - hashHex, - 10, - ); + try { + await subscribeToTransactionsWithProofsHandler(call); + expect.fail('Error was not thrown'); + } catch (e) { + expect(e).to.be.an.instanceOf(InvalidArgumentGrpcError); + expect(e.getMessage()).to.equal('minimum value for `fromBlockHeight` is 1'); + expect(call.write).to.not.have.been.called(); + expect(call.end).to.not.have.been.called(); + } + }); - expect(subscribeToNewTransactionsMock).to.not.have.been.called(); - expect(writableStub).to.have.been.calledTwice(); + it('should respond with error if if both fromBlockHash and fromBlockHeight are not specified', async () => { + const bloomFilterMessage = new BloomFilter(); - const firstResponse = new TransactionsWithProofsResponse(); - const rawTransactions = new RawTransactions(); - rawTransactions.setTransactionsList( - historicalTxData[0].transactions.map(tx => tx.toBuffer()), - ); - firstResponse.setRawTransactions(rawTransactions); + bloomFilterMessage.setVData(new Uint8Array()); + bloomFilterMessage.setNTweak(1000); + bloomFilterMessage.setNFlags(100); + bloomFilterMessage.setNHashFuncs(10); - const secondResponse = new TransactionsWithProofsResponse(); - secondResponse.setRawMerkleBlock(historicalTxData[0].merkleBlock.toBuffer()); + const request = new TransactionsWithProofsRequest(); - expect(writableStub.getCall(0).args).to.deep.equal( - [firstResponse], - ); + request.setBloomFilter(bloomFilterMessage); - expect(writableStub.getCall(1).args).to.deep.equal( - [secondResponse], - ); + call.request = request; - expect(coreAPIMock.getBlockHash).to.be.calledOnceWith(0); - expect(coreAPIMock.getBestBlockHeight).to.be.calledThrice(); + try { + await subscribeToTransactionsWithProofsHandler(call); + expect.fail('Error was not thrown'); + } catch (e) { + expect(e).to.be.an.instanceOf(InvalidArgumentGrpcError); + expect(e.getMessage()).to.equal('minimum value for `fromBlockHeight` is 1'); + expect(call.write).to.not.have.been.called(); + expect(call.end).to.not.have.been.called(); + } }); it('should respond with error if fromBlockHeight exceeded blockchain length', async () => {