1 | import type { Provider, Callback, JsonRPCResponse } from "web3/providers";
|
2 | import type { parsedUriObject } from "typings";
|
3 |
|
4 | const 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 |
|
102 |
|
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 |
|
117 | export = Blockchain;
|