From 6722c6fb04cb380560ddf2041956565a30ff4a69 Mon Sep 17 00:00:00 2001 From: Micah Riggan Date: Wed, 18 Mar 2020 12:04:01 -0400 Subject: [PATCH] Adding crypto-rpc to bitcore-node and using it for ETH fee estimates --- packages/bitcore-node/package-lock.json | 360 +++++++++++++++++- packages/bitcore-node/package.json | 1 + .../src/modules/ethereum/api/csp.ts | 56 ++- .../src/modules/ethereum/p2p/p2p.ts | 6 +- .../src/modules/ripple/api/csp.ts | 1 + .../test/integration/ethereum/p2p.spec.ts | 4 +- 6 files changed, 389 insertions(+), 39 deletions(-) diff --git a/packages/bitcore-node/package-lock.json b/packages/bitcore-node/package-lock.json index 52e9dd6383e..f57089ea084 100644 --- a/packages/bitcore-node/package-lock.json +++ b/packages/bitcore-node/package-lock.json @@ -178,8 +178,7 @@ "@types/node": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.2.tgz", - "integrity": "sha512-DPbG0qQ5kdvXBK0jGdv1yd8vGN7hwH8sB2Q1z1kGaxtCnXkSxYJ009VccGlcgknYoLeMTYu4TTzOditDJMdP2Q==", - "dev": true + "integrity": "sha512-DPbG0qQ5kdvXBK0jGdv1yd8vGN7hwH8sB2Q1z1kGaxtCnXkSxYJ009VccGlcgknYoLeMTYu4TTzOditDJMdP2Q==" }, "@types/range-parser": { "version": "1.2.3", @@ -660,6 +659,11 @@ "safe-buffer": "^5.0.1" } }, + "bitcoind-rpc": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/bitcoind-rpc/-/bitcoind-rpc-0.8.1.tgz", + "integrity": "sha512-NfhykAT/x/P1SOiog8UzltvTiv6A6d2X5VWJ3UjGeAqFLXv+IYHy+E4fFCBmgQRyIb1EIcyIZK1SVpSOGRHsaw==" + }, "bl": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", @@ -1250,6 +1254,294 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, + "crypto-rpc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/crypto-rpc/-/crypto-rpc-1.1.0.tgz", + "integrity": "sha512-s0nBraKUJcqHJL3K2w7X2NXwEg7Nmo27AzQtPGRekKIJViaSy5r4OSiecdvELiRKpUYJOsSbe3Hv4jekb/924g==", + "requires": { + "abi-decoder": "1.2.0", + "bitcoind-rpc": "0.8.1", + "commander": "2.8.1", + "ethereumjs-tx": "1.3.7", + "promptly": "0.2.0", + "ripple-binary-codec": "0.2.4", + "ripple-hashes": "0.3.4", + "ripple-lib": "1.6.3", + "web3": "1.2.4" + }, + "dependencies": { + "@types/lodash": { + "version": "4.14.149", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", + "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==" + }, + "@types/ws": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.2.tgz", + "integrity": "sha512-oqnI3DbGCVI9zJ/WHdFo3CUE8jQ8CVQDUIKaDtlTcNeT4zs6UCg9Gvk5QrFx2QPkRszpM6yc8o0p4aGjCsTi+w==", + "requires": { + "@types/node": "*" + } + }, + "abi-decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.2.0.tgz", + "integrity": "sha512-y2OKSEW4gf2838Eavc56vQY9V46zaXkf3Jl1WpTfUBbzAVrXSr4JRZAAWv55Tv9s5WNz1rVgBgz5d2aJIL1QCg==", + "requires": { + "web3": "^0.18.4" + }, + "dependencies": { + "web3": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", + "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", + "requires": { + "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2": "*", + "xmlhttprequest": "*" + } + } + } + }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + }, + "base-x": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz", + "integrity": "sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bignumber.js": { + "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decimal.js": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-5.0.8.tgz", + "integrity": "sha1-tIw/t9c6LU1JQOCzjxzSHbWzZ84=" + }, + "ethereumjs-tx": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", + "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "requires": { + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" + } + }, + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "requires": { + "agent-base": "5", + "debug": "4" + } + }, + "keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "ripple-address-codec": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-3.0.4.tgz", + "integrity": "sha512-GFk1BgavW+9oy5Z1Cp6YAGMfB51QdbeuhOo0Zir+s+S40F5vHtVZYu6zZE1eOAX92A5kygPuBRX4APH2v8Yhmg==", + "requires": { + "base-x": "3.0.4", + "create-hash": "^1.1.2" + } + }, + "ripple-binary-codec": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-0.2.4.tgz", + "integrity": "sha512-lfT9bybaVqA8IJmGFnSWaISCXmwvNY/P5HHKm6zQ1yTIXJpC+hDIeQqm/eD/2HLv82y2IvqGYd0GhEQ41lpNpQ==", + "requires": { + "babel-runtime": "^6.6.1", + "bn.js": "^4.11.3", + "create-hash": "^1.1.2", + "decimal.js": "^5.0.8", + "inherits": "^2.0.1", + "lodash": "^4.17.15", + "ripple-address-codec": "^3.0.4" + } + }, + "ripple-keypairs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.0.0.tgz", + "integrity": "sha512-MQ3d6fU3D+Cqu5ma4dfkfa+KakN2sKpVVVN0FeJyAYPVIGXu8Rcvd1g028TdwYAZcSYk0tGn5UhHxd0gUG3T8g==", + "requires": { + "bn.js": "^5.1.1", + "brorand": "^1.0.5", + "elliptic": "^6.5.2", + "hash.js": "^1.0.3", + "ripple-address-codec": "^4.0.0" + }, + "dependencies": { + "base-x": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.7.tgz", + "integrity": "sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA==" + }, + "ripple-address-codec": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.1.0.tgz", + "integrity": "sha512-C72gJpwvDagaOUiHyh67otqNqFduB4hjvJFiiPz/8I3FCiUYuvFLXeLhb29CEkoAEdoN9p7pPreLgoHUvwzt9w==", + "requires": { + "base-x": "3.0.7", + "create-hash": "^1.1.2" + } + } + } + }, + "ripple-lib": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ripple-lib/-/ripple-lib-1.6.3.tgz", + "integrity": "sha512-Vu6aUgbL2Kw1F0fMOJs13wu0seQLfURz00iQit03gJbAXiTmRR5zAWpDuC7DYjIqTEIgQFI/GSYLLEz/ZQNH0A==", + "requires": { + "@types/lodash": "^4.14.136", + "@types/ws": "^7.2.0", + "bignumber.js": "^9.0.0", + "https-proxy-agent": "^4.0.0", + "jsonschema": "1.2.2", + "lodash": "^4.17.4", + "lodash.isequal": "^4.5.0", + "ripple-address-codec": "^4.0.0", + "ripple-binary-codec": "^0.2.5", + "ripple-keypairs": "^1.0.0-beta.6", + "ripple-lib-transactionparser": "0.8.2", + "ws": "^7.2.0" + }, + "dependencies": { + "base-x": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.7.tgz", + "integrity": "sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + }, + "bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA==" + }, + "decimal.js": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==" + }, + "ripple-address-codec": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.1.0.tgz", + "integrity": "sha512-C72gJpwvDagaOUiHyh67otqNqFduB4hjvJFiiPz/8I3FCiUYuvFLXeLhb29CEkoAEdoN9p7pPreLgoHUvwzt9w==", + "requires": { + "base-x": "3.0.7", + "create-hash": "^1.1.2" + } + }, + "ripple-binary-codec": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-0.2.6.tgz", + "integrity": "sha512-k0efyjpcde7p+rJ9PXW9tJSYsUDdlC9Z9xU7OPM7fJiHVKlR1E7nfu0jqw9vVXtTG3tujqKeEgtcb8yaa7rMXA==", + "requires": { + "babel-runtime": "^6.6.1", + "bn.js": "^5.1.1", + "create-hash": "^1.1.2", + "decimal.js": "^10.2.0", + "inherits": "^2.0.1", + "lodash": "^4.17.15", + "ripple-address-codec": "^4.0.0" + } + } + } + }, + "ripple-lib-transactionparser": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.8.2.tgz", + "integrity": "sha512-1teosQLjYHLyOQrKUQfYyMjDR3MAq/Ga+MJuLUfpBMypl4LZB4bEoMcmG99/+WVTEiZOezJmH9iCSvm/MyxD+g==", + "requires": { + "bignumber.js": "^9.0.0", + "lodash": "^4.17.15" + }, + "dependencies": { + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + } + } + }, + "ws": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + } + } + }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -1948,6 +2240,11 @@ } } }, + "ethereum-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", + "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" + }, "ethereumjs-common": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz", @@ -3421,8 +3718,7 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "mz": { "version": "2.7.0", @@ -3905,6 +4201,14 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" }, + "promptly": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz", + "integrity": "sha1-c+8gD6gynV06jfQXmJULhkbKRtk=", + "requires": { + "read": "~1.0.4" + } + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -4004,6 +4308,14 @@ "unpipe": "1.0.0" } }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "requires": { + "mute-stream": "~0.0.4" + } + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -4210,6 +4522,41 @@ } } }, + "ripple-hashes": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/ripple-hashes/-/ripple-hashes-0.3.4.tgz", + "integrity": "sha512-u2kgg9Yu9D44HWnC9R2lNg+amVLllJkMQmXZEEM2DAMFXigr4+ph1O8LLxLv+k0fbdjAjos4aUyWwcw6cxzYMw==", + "requires": { + "bignumber.js": "^4.1.0", + "create-hash": "^1.1.2", + "ripple-address-codec": "^3.0.4", + "ripple-binary-codec": "^0.2.4" + }, + "dependencies": { + "base-x": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz", + "integrity": "sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bignumber.js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", + "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" + }, + "ripple-address-codec": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-3.0.4.tgz", + "integrity": "sha512-GFk1BgavW+9oy5Z1Cp6YAGMfB51QdbeuhOo0Zir+s+S40F5vHtVZYu6zZE1eOAX92A5kygPuBRX4APH2v8Yhmg==", + "requires": { + "base-x": "3.0.4", + "create-hash": "^1.1.2" + } + } + } + }, "ripple-keypairs": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-0.11.1.tgz", @@ -6288,6 +6635,11 @@ "xhr-request": "^1.0.1" } }, + "xhr2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.0.tgz", + "integrity": "sha512-BDtiD0i2iKPK/S8OAZfpk6tyzEDnKKSjxWHcMBVmh+LuqJ8A32qXTyOx+TVOg2dKvq6zGBq2sgKPkEeRs1qTRA==" + }, "xhr2-cookies": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", diff --git a/packages/bitcore-node/package.json b/packages/bitcore-node/package.json index e0b296e2420..11a6e7c56f1 100644 --- a/packages/bitcore-node/package.json +++ b/packages/bitcore-node/package.json @@ -89,6 +89,7 @@ "bitcore-wallet-client": "^8.16.0", "body-parser": "1.18.3", "cors": "2.8.4", + "crypto-rpc": "^1.1.0", "crypto-wallet-core": "^8.16.0", "heapdump": "0.3.12", "http": "0.0.0", diff --git a/packages/bitcore-node/src/modules/ethereum/api/csp.ts b/packages/bitcore-node/src/modules/ethereum/api/csp.ts index 33b1c0d241e..e4b318eabee 100644 --- a/packages/bitcore-node/src/modules/ethereum/api/csp.ts +++ b/packages/bitcore-node/src/modules/ethereum/api/csp.ts @@ -1,3 +1,4 @@ +import { CryptoRpc } from 'crypto-rpc'; import { ObjectID } from 'mongodb'; import { Readable, Transform } from 'stream'; import Web3 from 'web3'; @@ -47,46 +48,32 @@ interface ERC20Transfer export class ETHStateProvider extends InternalStateProvider implements IChainStateService { config: any; - static web3 = {} as { [network: string]: Web3 }; + static rpcs = {} as { [network: string]: { rpc: CryptoRpc; web3: Web3 } }; constructor(public chain: string = 'ETH') { super(chain); this.config = Config.chains[this.chain]; } - async getWeb3(network: string) { + async getWeb3(network: string): Promise<{ rpc: CryptoRpc; web3: Web3 }> { try { - if (ETHStateProvider.web3[network]) { - await ETHStateProvider.web3[network].eth.getBlockNumber(); + if (ETHStateProvider.rpcs[network]) { + await ETHStateProvider.rpcs[network].web3.eth.getBlockNumber(); } } catch (e) { - delete ETHStateProvider.web3[network]; + delete ETHStateProvider.rpcs[network]; } - if (!ETHStateProvider.web3[network]) { - const networkConfig = this.config[network]; - const provider = networkConfig.provider; - const host = provider.host || 'localhost'; - const protocol = provider.protocol || 'http'; - const portString = provider.port || '8545'; - const connUrl = `${protocol}://${host}:${portString}`; - const providerOptions = provider.options || {}; - let ProviderType; - switch (provider.protocol) { - case 'ws': - case 'wss': - ProviderType = Web3.providers.WebsocketProvider; - break; - default: - ProviderType = Web3.providers.HttpProvider; - break; - } - ETHStateProvider.web3[network] = new Web3(new ProviderType(connUrl, providerOptions)); + if (!ETHStateProvider.rpcs[network]) { + console.log('making a new connection'); + const rpcConfig = { ...this.config[network].provider, chain: this.chain, currencyConfig: {} }; + const rpc = new CryptoRpc(rpcConfig, {}).get(this.chain); + ETHStateProvider.rpcs[network] = { rpc, web3: rpc.web3 }; } - return ETHStateProvider.web3[network]; + return ETHStateProvider.rpcs[network]; } async erc20For(network: string, address: string) { - const web3 = await this.getWeb3(network); + const { web3 } = await this.getWeb3(network); const contract = new web3.eth.Contract(ERC20Abi as AbiItem[], address); return contract; } @@ -112,6 +99,13 @@ export class ETHStateProvider extends InternalStateProvider implements IChainSta if (network === 'livenet') { network = 'mainnet'; } + + if (target === 1) { + const { rpc } = await this.getWeb3(network); + const feerate = await rpc.estimateFee({ currency: this.chain, nBlocks: 1 }); + return { feerate, blocks: target }; + } + const bestBlock = (await this.getLocalTip({ chain, network })) || { height: target }; const gasPrices: number[] = []; const limitedTarget = Math.min(target, 4); @@ -132,7 +126,7 @@ export class ETHStateProvider extends InternalStateProvider implements IChainSta async getBalanceForAddress(params: GetBalanceForAddressParams) { const { network, address } = params; - const web3 = await this.getWeb3(network); + const { web3 } = await this.getWeb3(network); if (params.args) { if (params.args.tokenAddress) { const token = await this.erc20For(network, params.args.tokenAddress); @@ -178,7 +172,7 @@ export class ETHStateProvider extends InternalStateProvider implements IChainSta async broadcastTransaction(params: BroadcastTransactionParams) { const { network, rawTx } = params; - const web3 = await this.getWeb3(network); + const { web3 } = await this.getWeb3(network); const rawTxs = typeof rawTx === 'string' ? [rawTx] : rawTx; const txids = new Array(); for (const tx of rawTxs) { @@ -266,7 +260,7 @@ export class ETHStateProvider extends InternalStateProvider implements IChainSta async streamWalletTransactions(params: StreamWalletTransactionsParams) { const { chain, network, wallet, res, args } = params; - const web3 = await this.getWeb3(network); + const { web3 } = await this.getWeb3(network); const query: any = { chain, network, @@ -406,7 +400,7 @@ export class ETHStateProvider extends InternalStateProvider implements IChainSta } async getAccountNonce(network: string, address: string) { - const web3 = await this.getWeb3(network); + const { web3 } = await this.getWeb3(network); const count = await web3.eth.getTransactionCount(address); return count; /* @@ -438,7 +432,7 @@ export class ETHStateProvider extends InternalStateProvider implements IChainSta async estimateGas(params): Promise { const { network, from, to, value, data, gasPrice } = params; - const web3 = await this.getWeb3(network); + const { web3 } = await this.getWeb3(network); const gasLimit = await web3.eth.estimateGas({ from, to, value, data, gasPrice }); return gasLimit; } diff --git a/packages/bitcore-node/src/modules/ethereum/p2p/p2p.ts b/packages/bitcore-node/src/modules/ethereum/p2p/p2p.ts index 28b3fb2302d..e0cb4db9aeb 100644 --- a/packages/bitcore-node/src/modules/ethereum/p2p/p2p.ts +++ b/packages/bitcore-node/src/modules/ethereum/p2p/p2p.ts @@ -120,7 +120,8 @@ export class EthP2pWorker extends BaseP2PWorker { while (!this.disconnecting && !this.stopping) { try { if (!this.web3) { - this.web3 = await this.getWeb3(); + const { web3 } = await this.getWeb3(); + this.web3 = web3; this.rpc = new ParityRPC(this.web3); } try { @@ -133,7 +134,8 @@ export class EthP2pWorker extends BaseP2PWorker { this.events.emit('connected'); } } else { - this.web3 = await this.getWeb3(); + const { web3 } = await this.getWeb3(); + this.web3 = web3; this.rpc = new ParityRPC(this.web3); this.events.emit('disconnected'); } diff --git a/packages/bitcore-node/src/modules/ripple/api/csp.ts b/packages/bitcore-node/src/modules/ripple/api/csp.ts index 52a3aa750ad..b3ec6487760 100644 --- a/packages/bitcore-node/src/modules/ripple/api/csp.ts +++ b/packages/bitcore-node/src/modules/ripple/api/csp.ts @@ -211,6 +211,7 @@ export class RippleStateProvider extends InternalStateProvider implements IChain const addresses = await this.getWalletAddresses(params.wallet._id!); const readable = new Readable({ objectMode: true }); const promises = new Array>(); + params.args.limit = 500; for (const walletAddress of addresses) { promises.push(this.getAddressTransactions({ ...params, address: walletAddress.address })); } diff --git a/packages/bitcore-node/test/integration/ethereum/p2p.spec.ts b/packages/bitcore-node/test/integration/ethereum/p2p.spec.ts index 4f06da1a9a7..9adaea792b2 100644 --- a/packages/bitcore-node/test/integration/ethereum/p2p.spec.ts +++ b/packages/bitcore-node/test/integration/ethereum/p2p.spec.ts @@ -68,7 +68,7 @@ describe('Ethereum', function() { await worker.setupListeners(); const sawBlock = new Promise(resolve => worker.events.on('block', resolve)); - const web3 = await worker.getWeb3(); + const { web3 } = await worker.getWeb3(); await web3.eth.sendTransaction({ to: addresses[0], value: web3.utils.toWei('.01', 'ether'), from: account }); await sawBlock; await worker.disconnect(); @@ -84,7 +84,7 @@ describe('Ethereum', function() { await worker.start(); await wait(1000); - const web3 = await worker.getWeb3(); + const { web3 } = await worker.getWeb3(); await web3.eth.sendTransaction({ to: addresses[0], value: web3.utils.toWei('.02', 'ether'), from: account }); await sawBlock; await done;