UNPKG

2.88 kBPlain TextView Raw
1import type { Provider, Callback, JsonRPCResponse } from "web3/providers";
2import type { parsedUriObject } from "typings";
3
4const Blockchain = {
5 getBlockByNumber(
6 blockNumber: string,
7 provider: Provider,
8 callback: Callback<JsonRPCResponse>
9 ) {
10 const params = [blockNumber, true];
11 provider.send(
12 {
13 jsonrpc: "2.0",
14 method: "eth_getBlockByNumber",
15 params,
16 id: Date.now()
17 },
18 callback
19 );
20 },
21
22 getBlockByHash(
23 blockHash: string,
24 provider: Provider,
25 callback: Callback<JsonRPCResponse>
26 ) {
27 const params = [blockHash, true];
28 provider.send(
29 {
30 jsonrpc: "2.0",
31 method: "eth_getBlockByHash",
32 params,
33 id: Date.now()
34 },
35 callback
36 );
37 },
38
39 parse(uri: string) {
40 const parsed: parsedUriObject = {};
41 if (uri.indexOf("blockchain://") !== 0) return parsed;
42
43 const cleanUri = uri.replace("blockchain://", "");
44
45 const pieces = cleanUri.split("/block/");
46
47 parsed.genesis_hash = `0x${pieces[0]}`;
48 parsed.block_hash = `0x${pieces[1]}`;
49
50 return parsed;
51 },
52
53 asURI(provider: Provider) {
54 return new Promise((resolve, reject) => {
55 let genesis: any, latest;
56
57 this.getBlockByNumber(
58 "0x0",
59 provider,
60 (err: Error, { result }: JsonRPCResponse) => {
61 if (err) return reject(err);
62 genesis = result;
63
64 this.getBlockByNumber(
65 "latest",
66 provider,
67 (err: Error, { result }: JsonRPCResponse) => {
68 if (err) return reject(err);
69 latest = result;
70 const url = `blockchain://${genesis.hash.replace(
71 "0x",
72 ""
73 )}/block/${latest.hash.replace("0x", "")}`;
74 resolve(url);
75 }
76 );
77 }
78 );
79 });
80 },
81
82 matches(uri: string, provider: Provider) {
83 return new Promise((resolve, reject) => {
84 const parsedUri = this.parse(uri);
85
86 const expectedGenesis = parsedUri.genesis_hash;
87 const expectedBlock = parsedUri.block_hash;
88
89 this.getBlockByNumber(
90 "0x0",
91 provider,
92 (err: Error, { result }: JsonRPCResponse) => {
93 if (err) return reject(err);
94 const block = result;
95 if (block.hash !== expectedGenesis) return resolve(false);
96
97 this.getBlockByHash(
98 expectedBlock,
99 provider,
100 (err: Error, { result }: JsonRPCResponse) => {
101 // Treat an error as if the block didn't exist. This is because
102 // some clients respond differently.
103 const block = result;
104 if (err || block == null) {
105 return resolve(false);
106 }
107
108 resolve(true);
109 }
110 );
111 }
112 );
113 });
114 }
115};
116
117export = Blockchain;