diff --git a/lib/grpcServer/handlers/core/broadcastTransactionHandlerFactory.js b/lib/grpcServer/handlers/core/broadcastTransactionHandlerFactory.js index 2ad260a0..9f0f0b7f 100644 --- a/lib/grpcServer/handlers/core/broadcastTransactionHandlerFactory.js +++ b/lib/grpcServer/handlers/core/broadcastTransactionHandlerFactory.js @@ -8,6 +8,7 @@ const { const { server: { error: { + AlreadyExistsGrpcError, InvalidArgumentGrpcError, }, }, @@ -61,7 +62,7 @@ function broadcastTransactionHandlerFactory(coreRPCClient) { if (e.code === -27) { // RPC_VERIFY_ALREADY_IN_CHAIN - throw new InvalidArgumentGrpcError(`Cannot broadcast transaction: ${e.message}`); + throw new AlreadyExistsGrpcError(`Transaction already in chain: ${e.message}`); } throw e; diff --git a/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js b/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js index 2389e304..d4ca0350 100644 --- a/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js +++ b/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js @@ -2,7 +2,7 @@ const { server: { error: { InvalidArgumentGrpcError, - FailedPreconditionGrpcError, + AlreadyExistsGrpcError, }, }, } = require('@dashevo/grpc-common'); @@ -43,7 +43,7 @@ function broadcastStateTransitionHandlerFactory(rpcClient, handleAbciResponseErr if (jsonRpcError) { if (jsonRpcError.data === 'tx already exists in cache') { - throw new FailedPreconditionGrpcError(jsonRpcError.data, jsonRpcError); + throw new AlreadyExistsGrpcError('State transition already in chain', jsonRpcError); } const error = new Error(); diff --git a/package-lock.json b/package-lock.json index 2dd42dea..a6720993 100644 --- a/package-lock.json +++ b/package-lock.json @@ -160,6 +160,19 @@ "node-inspect-extracted": "^1.0.7" }, "dependencies": { + "@dashevo/dapi-grpc": { + "version": "0.21.0-dev.6", + "resolved": "https://registry.npmjs.org/@dashevo/dapi-grpc/-/dapi-grpc-0.21.0-dev.6.tgz", + "integrity": "sha512-s21fOhGYEjYV8vvswtVNEWIlBXUW1vCQ46FNsiT345nNlDZxxVy4R7C8t/YymCd0b2M8UL0JnsAq5IaHm5K0aw==", + "dev": true, + "requires": { + "@dashevo/grpc-common": "^0.3.3", + "google-protobuf": "^3.12.2", + "grpc": "^1.24.3", + "grpc-web": "^1.2.0", + "protobufjs": "github:jawid-h/protobuf.js#fix/buffer-conversion" + } + }, "cbor": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cbor/-/cbor-7.0.6.tgz", @@ -233,7 +246,7 @@ } }, "@dashevo/dp-services-ctl": { - "version": "github:dashevo/js-dp-services-ctl#3181fee0b1488e76a6598a7a8b733c8e218d6333", + "version": "github:dashevo/js-dp-services-ctl#03c748fd6fe20508aae783bf51b78e66e2b87b1c", "from": "github:dashevo/js-dp-services-ctl#v0.19-dev", "dev": true, "requires": { @@ -292,9 +305,9 @@ "integrity": "sha512-OnKpFX498ZcJVAEv1MRF/bNpDY0DUHSd+5MjGtSBkZ9plv+E2p6UWHK77479l59ZJWun+Ix2BsYPY7PSd+11yA==" }, "@dashevo/grpc-common": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@dashevo/grpc-common/-/grpc-common-0.3.4.tgz", - "integrity": "sha512-h7N91eFjIG3hJkTfhcU5a0BvpjxOc0QD5uFOCbY+hbF5B0RsNvlHgOcNJCb5xK/dDG1YJRDh26lpktRW1F7F/Q==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@dashevo/grpc-common/-/grpc-common-0.3.5.tgz", + "integrity": "sha512-01n3kdPsa4x5S9Q8UXXU8x8I3+2RYJ5q5YdfZU5sjHv+gd5IjPvS3rCT/wOAA/JrerVuZc9ZM1hgrS46VXwuxg==", "requires": { "@grpc/proto-loader": "^0.5.2", "grpc": "^1.24.0", @@ -5152,9 +5165,9 @@ } }, "ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==" + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==" }, "y18n": { "version": "3.2.2", diff --git a/package.json b/package.json index 568f332c..8ef52841 100644 --- a/package.json +++ b/package.json @@ -27,11 +27,11 @@ "all": true }, "dependencies": { - "@dashevo/dapi-grpc": "~0.21.0-dev.2", + "@dashevo/dapi-grpc": "~0.21.0-dev.3", "@dashevo/dashcore-lib": "~0.19.25", "@dashevo/dashd-rpc": "^2.0.2", "@dashevo/dpp": "~0.20.0", - "@dashevo/grpc-common": "~0.3.3", + "@dashevo/grpc-common": "~0.3.5", "ajv": "^8.6.0", "bs58": "^4.0.1", "cbor": "^4.1.5", @@ -43,7 +43,7 @@ "lodash": "^4.17.19", "request": "^2.87.0", "request-promise-native": "^1.0.5", - "ws": "^7.4.2", + "ws": "^7.5.3", "zeromq": "5.2.0" }, "devDependencies": { diff --git a/test/unit/grpcServer/handlers/core/broadcastTransactionHandlerFactory.js b/test/unit/grpcServer/handlers/core/broadcastTransactionHandlerFactory.js index 781af405..9450e454 100644 --- a/test/unit/grpcServer/handlers/core/broadcastTransactionHandlerFactory.js +++ b/test/unit/grpcServer/handlers/core/broadcastTransactionHandlerFactory.js @@ -2,6 +2,7 @@ const { server: { error: { InvalidArgumentGrpcError, + AlreadyExistsGrpcError, }, }, } = require('@dashevo/grpc-common'); @@ -98,4 +99,21 @@ describe('broadcastTransactionHandlerFactory', () => { expect(coreRPCClientMock.sendRawTransaction).to.be.not.called(); } }); + + it('should throw AlreadyExistsGrpcError error if transaction already in chain', async () => { + const error = new Error(); + error.code = -27; + error.message = 'dup-tx-something'; + + coreRPCClientMock.sendRawTransaction.throws(error); + + try { + await broadcastTransactionHandler(call); + + expect.fail('should thrown AlreadyExistsGrpcError error'); + } catch (e) { + expect(e).to.be.instanceOf(AlreadyExistsGrpcError); + expect(e.getMessage()).to.equal(`Transaction already in chain: ${error.message}`); + } + }); }); diff --git a/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js b/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js index bda1b86e..7e2acb84 100644 --- a/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js +++ b/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js @@ -2,7 +2,7 @@ const { server: { error: { InvalidArgumentGrpcError, - FailedPreconditionGrpcError, + AlreadyExistsGrpcError, }, }, } = require('@dashevo/grpc-common'); @@ -117,19 +117,17 @@ describe('broadcastStateTransitionHandlerFactory', () => { }); it('should throw FailedPreconditionGrpcError if transaction was broadcasted twice', async () => { - const error = { + response.error = { code: -32603, message: 'Internal error', data: 'tx already exists in cache', }; - response.error = error; - try { await broadcastStateTransitionHandler(call); } catch (e) { - expect(e).to.be.an.instanceOf(FailedPreconditionGrpcError); - expect(e.getMessage()).to.equal(`Failed precondition: ${error.data}`); + expect(e).to.be.an.instanceOf(AlreadyExistsGrpcError); + expect(e.getMessage()).to.equal('State transition already in chain'); } }); });