Skip to content

Commit 772eadc

Browse files
Add BitcoinRpcNetworkProvider (#89)
Co-authored-by: Rosco Kalis <[email protected]>
1 parent 3365dec commit 772eadc

File tree

5 files changed

+94
-4
lines changed

5 files changed

+94
-4
lines changed

packages/cashscript/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"dependencies": {
4444
"@bitauth/libauth": "^1.17.2",
4545
"bip68": "^1.0.4",
46+
"bitcoin-rpc-promise-retry": "^1.3.0",
4647
"cashc": "^0.5.7",
4748
"delay": "^4.3.0",
4849
"electrum-cash": "^2.0.6",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import RpcClientRetry from 'bitcoin-rpc-promise-retry';
2+
import { Utxo, Network } from '../interfaces';
3+
import NetworkProvider from './NetworkProvider';
4+
5+
export default class BitcoinRpcNetworkProvider implements NetworkProvider {
6+
private rpcClient: RpcClientRetry;
7+
8+
constructor(
9+
public network: Network,
10+
url: string,
11+
opts?: object,
12+
) {
13+
this.rpcClient = new RpcClientRetry(url, opts);
14+
}
15+
16+
async getUtxos(address: string): Promise<Utxo[]> {
17+
const result = await this.rpcClient.listUnspent(0, 9999999, [address]);
18+
19+
const utxos = result.map((utxo) => ({
20+
txid: utxo.txid,
21+
vout: utxo.vout,
22+
satoshis: utxo.amount * 1e8,
23+
}));
24+
25+
return utxos;
26+
}
27+
28+
async getBlockHeight(): Promise<number> {
29+
return this.rpcClient.getBlockCount();
30+
}
31+
32+
async getRawTransaction(txid: string): Promise<string> {
33+
return this.rpcClient.getRawTransaction(txid);
34+
}
35+
36+
async sendRawTransaction(txHex: string): Promise<string> {
37+
return this.rpcClient.sendRawTransaction(txHex);
38+
}
39+
40+
getClient(): RpcClientRetry {
41+
return this.rpcClient;
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/* eslint-disable */
2+
declare module 'bitcoin-rpc-promise-retry';
3+
4+
interface ListUnspentItem {
5+
txid: string;
6+
vout: number;
7+
address: string;
8+
label: string;
9+
scriptPubKey: string;
10+
amount: number;
11+
confirmations: number;
12+
redeemScript: string;
13+
spendable: boolean;
14+
solvable: boolean;
15+
safe: boolean;
16+
}
17+
18+
interface RpcClientRetry {
19+
constructor(url: string, opts?: object): void;
20+
listUnspent(minconf?: number, maxconf?: number, addresses?: string[], include_unsafe?: boolean, query_options?: object): Promise<ListUnspentItem[]>;
21+
getBlockCount(): Promise<number>;
22+
getRawTransaction(txid: string, verbose?: boolean, blockhash?: string): Promise<string>;
23+
sendRawTransaction(hexstring: string, allowhighfees?: boolean): Promise<string>;
24+
25+
// below are not required for NetworkProvider interface, but very useful
26+
generate(nblocks: number, maxtries?: number): Promise<string[]>;
27+
generateToAddress(nblocks: number, address: string, maxtries?: number): Promise<string[]>;
28+
getNewAddress(label?: string): Promise<string>;
29+
dumpPrivKey(address: string): Promise<string>;
30+
getBalance(dummy?: string, minconf?: number, include_watchonly?: boolean): Promise<number>;
31+
getBlock(blockhash: string, verbosity?: number): Promise<string>;
32+
importAddress(address: string, label?: string, rescan?: boolean, p2sh?: boolean): Promise<void>;
33+
}
+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export { default as NetworkProvider } from './NetworkProvider';
22
export { default as BitboxNetworkProvider } from './BitboxNetworkProvider';
3+
export { default as BitcoinRpcNetworkProvider } from './BitcoinRpcNetworkProvider';
34
export { default as ElectrumNetworkProvider } from './ElectrumNetworkProvider';
45
export { default as FullStackNetworkProvider } from './FullStackNetworkProvider';

yarn.lock

+16-4
Original file line numberDiff line numberDiff line change
@@ -2741,6 +2741,13 @@ bitbox-sdk@^8.11.1, bitbox-sdk@^8.8.0:
27412741
socket.io-client "^2.2.0"
27422742
wif "^2.0.6"
27432743

2744+
bitcoin-rpc-promise-retry@^1.3.0:
2745+
version "1.3.0"
2746+
resolved "https://registry.yarnpkg.com/bitcoin-rpc-promise-retry/-/bitcoin-rpc-promise-retry-1.3.0.tgz#28a9f5aa7b5528b0518b0bcccde63e7384e1626b"
2747+
integrity sha512-xhldBhYwiUNY4spzkXXcU9LEq+nbSKJ5tvYWEUe/XTCe1VYoe8tEb5jJq4MBA2d+5egiUOA+P1QTTYm1FqPtOg==
2748+
dependencies:
2749+
bitcoind-rpc "^0.8.0"
2750+
27442751
bitcoincash-ops@Bitcoin-com/bitcoincash-ops#2.0.0, "bitcoincash-ops@github:Bitcoin-com/bitcoincash-ops#2.0.0":
27452752
version "2.0.0"
27462753
resolved "https://codeload.github.com/Bitcoin-com/bitcoincash-ops/tar.gz/6ab82cc7326c67236f3b2d9d0457258ac2ef48e3"
@@ -2794,6 +2801,11 @@ bitcoincashjs@^0.1.10:
27942801
resolved "https://registry.yarnpkg.com/bitcoincashjs/-/bitcoincashjs-0.1.14.tgz#9da1efb762e05d608b6e04fadf1277eaa2201b48"
27952802
integrity sha512-x0wMVSCZ56ZQnSQ+Xim7XfS0IYiOyOwo0pdMCmR+cDNB7zRhICFuH5i3lNdLSgUw1e7Pc3FmUlC9wruQNlYMnA==
27962803

2804+
bitcoind-rpc@^0.8.0:
2805+
version "0.8.1"
2806+
resolved "https://registry.yarnpkg.com/bitcoind-rpc/-/bitcoind-rpc-0.8.1.tgz#11889972e46c346870d26cf680e3a7e3e52b1ff1"
2807+
integrity sha512-NfhykAT/x/P1SOiog8UzltvTiv6A6d2X5VWJ3UjGeAqFLXv+IYHy+E4fFCBmgQRyIb1EIcyIZK1SVpSOGRHsaw==
2808+
27972809
bitcoinjs-message@^2.0.0:
27982810
version "2.1.1"
27992811
resolved "https://registry.yarnpkg.com/bitcoinjs-message/-/bitcoinjs-message-2.1.1.tgz#c55d78f4461691b77fa5f9341216f8cd7ae0d0f4"
@@ -4083,10 +4095,10 @@ ecurve@^1.0.0, ecurve@^1.0.6:
40834095
bigi "^1.1.0"
40844096
safe-buffer "^5.0.1"
40854097

4086-
electrum-cash@^2.0.4:
4087-
version "2.0.4"
4088-
resolved "https://registry.yarnpkg.com/electrum-cash/-/electrum-cash-2.0.4.tgz#926158323b9dbf6563298a32864d9a2a1a0deca0"
4089-
integrity sha512-9l4/MpHvJEvnfTqTM5/acPMosTC2lwmgl8JBAsOPJ417DgkUQV73yE3WqmTTvON+pBetj11hOUVAkpkaJv0X0A==
4098+
electrum-cash@^2.0.6:
4099+
version "2.0.6"
4100+
resolved "https://registry.yarnpkg.com/electrum-cash/-/electrum-cash-2.0.6.tgz#005aa46ddace872696a89d918640ff6254a1ddaa"
4101+
integrity sha512-+o0Hqcl0eCwd9fvCJpWn4yV3gYX874uCGpwpwNbZuEU9ipY5ft9iU0IfuFghUN6/AuCcsE6f8JkVOjuTjmfF5Q==
40904102
dependencies:
40914103
"@types/ws" "^7.2.6"
40924104
async-mutex "^0.2.4"

0 commit comments

Comments
 (0)