@witnet/sdk 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/package.json +72 -0
  4. package/dist/src/bin/helpers.d.ts +91 -0
  5. package/dist/src/bin/helpers.d.ts.map +1 -0
  6. package/dist/src/bin/helpers.js +816 -0
  7. package/dist/src/index.d.ts +5 -0
  8. package/dist/src/index.d.ts.map +1 -0
  9. package/dist/src/index.js +47 -0
  10. package/dist/src/lib/crypto/account.d.ts +32 -0
  11. package/dist/src/lib/crypto/account.d.ts.map +1 -0
  12. package/dist/src/lib/crypto/account.js +106 -0
  13. package/dist/src/lib/crypto/coinbase.d.ts +10 -0
  14. package/dist/src/lib/crypto/coinbase.d.ts.map +1 -0
  15. package/dist/src/lib/crypto/coinbase.js +28 -0
  16. package/dist/src/lib/crypto/index.d.ts +8 -0
  17. package/dist/src/lib/crypto/index.d.ts.map +1 -0
  18. package/dist/src/lib/crypto/index.js +30 -0
  19. package/dist/src/lib/crypto/interfaces.d.ts +85 -0
  20. package/dist/src/lib/crypto/interfaces.d.ts.map +1 -0
  21. package/dist/src/lib/crypto/interfaces.js +3 -0
  22. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +55 -0
  23. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -0
  24. package/dist/src/lib/crypto/payloads/DataRequestPayload.js +339 -0
  25. package/dist/src/lib/crypto/payloads/StakePayload.d.ts +28 -0
  26. package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -0
  27. package/dist/src/lib/crypto/payloads/StakePayload.js +142 -0
  28. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +36 -0
  29. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -0
  30. package/dist/src/lib/crypto/payloads/UnstakePayload.js +154 -0
  31. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +25 -0
  32. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -0
  33. package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +128 -0
  34. package/dist/src/lib/crypto/payloads.d.ts +57 -0
  35. package/dist/src/lib/crypto/payloads.d.ts.map +1 -0
  36. package/dist/src/lib/crypto/payloads.js +170 -0
  37. package/dist/src/lib/crypto/signer.d.ts +33 -0
  38. package/dist/src/lib/crypto/signer.d.ts.map +1 -0
  39. package/dist/src/lib/crypto/signer.js +194 -0
  40. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +15 -0
  41. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -0
  42. package/dist/src/lib/crypto/transmitters/DataRequests.js +23 -0
  43. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +12 -0
  44. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -0
  45. package/dist/src/lib/crypto/transmitters/StakeDeposits.js +17 -0
  46. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +18 -0
  47. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -0
  48. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +53 -0
  49. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +11 -0
  50. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -0
  51. package/dist/src/lib/crypto/transmitters/ValueTransfers.js +16 -0
  52. package/dist/src/lib/crypto/transmitters.d.ts +47 -0
  53. package/dist/src/lib/crypto/transmitters.d.ts.map +1 -0
  54. package/dist/src/lib/crypto/transmitters.js +416 -0
  55. package/dist/src/lib/crypto/types.d.ts +161 -0
  56. package/dist/src/lib/crypto/types.d.ts.map +1 -0
  57. package/dist/src/lib/crypto/types.js +273 -0
  58. package/dist/src/lib/crypto/utils.d.ts +21 -0
  59. package/dist/src/lib/crypto/utils.d.ts.map +1 -0
  60. package/dist/src/lib/crypto/utils.js +156 -0
  61. package/dist/src/lib/crypto/wallet.d.ts +120 -0
  62. package/dist/src/lib/crypto/wallet.d.ts.map +1 -0
  63. package/dist/src/lib/crypto/wallet.js +258 -0
  64. package/dist/src/lib/index.d.ts +5 -0
  65. package/dist/src/lib/index.d.ts.map +1 -0
  66. package/dist/src/lib/index.js +44 -0
  67. package/dist/src/lib/radon/ccdr/eth.d.ts +160 -0
  68. package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -0
  69. package/dist/src/lib/radon/ccdr/eth.js +272 -0
  70. package/dist/src/lib/radon/ccdr/index.d.ts +14 -0
  71. package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -0
  72. package/dist/src/lib/radon/ccdr/index.js +39 -0
  73. package/dist/src/lib/radon/ccdr/wit.d.ts +23 -0
  74. package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -0
  75. package/dist/src/lib/radon/ccdr/wit.js +35 -0
  76. package/dist/src/lib/radon/filters.d.ts +14 -0
  77. package/dist/src/lib/radon/filters.d.ts.map +1 -0
  78. package/dist/src/lib/radon/filters.js +45 -0
  79. package/dist/src/lib/radon/index.d.ts +296 -0
  80. package/dist/src/lib/radon/index.d.ts.map +1 -0
  81. package/dist/src/lib/radon/index.js +707 -0
  82. package/dist/src/lib/radon/reducers.d.ts +29 -0
  83. package/dist/src/lib/radon/reducers.d.ts.map +1 -0
  84. package/dist/src/lib/radon/reducers.js +66 -0
  85. package/dist/src/lib/radon/types.d.ts +521 -0
  86. package/dist/src/lib/radon/types.d.ts.map +1 -0
  87. package/dist/src/lib/radon/types.js +936 -0
  88. package/dist/src/lib/radon/utils.d.ts +53 -0
  89. package/dist/src/lib/radon/utils.d.ts.map +1 -0
  90. package/dist/src/lib/radon/utils.js +153 -0
  91. package/dist/src/lib/rpc/index.d.ts +3 -0
  92. package/dist/src/lib/rpc/index.d.ts.map +1 -0
  93. package/dist/src/lib/rpc/index.js +19 -0
  94. package/dist/src/lib/rpc/nodes.d.ts +40 -0
  95. package/dist/src/lib/rpc/nodes.d.ts.map +1 -0
  96. package/dist/src/lib/rpc/nodes.js +293 -0
  97. package/dist/src/lib/rpc/provider.d.ts +88 -0
  98. package/dist/src/lib/rpc/provider.d.ts.map +1 -0
  99. package/dist/src/lib/rpc/provider.js +336 -0
  100. package/dist/src/lib/rpc/reporter.d.ts +18 -0
  101. package/dist/src/lib/rpc/reporter.d.ts.map +1 -0
  102. package/dist/src/lib/rpc/reporter.js +30 -0
  103. package/dist/src/lib/rpc/types.d.ts +409 -0
  104. package/dist/src/lib/rpc/types.d.ts.map +1 -0
  105. package/dist/src/lib/rpc/types.js +81 -0
  106. package/dist/src/lib/types.d.ts +18 -0
  107. package/dist/src/lib/types.d.ts.map +1 -0
  108. package/dist/src/lib/types.js +7 -0
  109. package/dist/src/lib/utils.d.ts +13 -0
  110. package/dist/src/lib/utils.d.ts.map +1 -0
  111. package/dist/src/lib/utils.js +97 -0
  112. package/dist/witnet/assets/index.d.ts +30 -0
  113. package/dist/witnet/assets/index.d.ts.map +1 -0
  114. package/dist/witnet/assets/index.js +6 -0
  115. package/dist/witnet/assets/modals/index.d.ts +18 -0
  116. package/dist/witnet/assets/modals/index.d.ts.map +1 -0
  117. package/dist/witnet/assets/modals/index.js +21 -0
  118. package/dist/witnet/assets/modals/web3/eth.d.ts +5 -0
  119. package/dist/witnet/assets/modals/web3/eth.d.ts.map +1 -0
  120. package/dist/witnet/assets/modals/web3/eth.js +26 -0
  121. package/dist/witnet/assets/modals/web3/wit.d.ts +4 -0
  122. package/dist/witnet/assets/modals/web3/wit.d.ts.map +1 -0
  123. package/dist/witnet/assets/modals/web3/wit.js +20 -0
  124. package/dist/witnet/assets/requests.d.ts +11 -0
  125. package/dist/witnet/assets/requests.d.ts.map +1 -0
  126. package/dist/witnet/assets/requests.js +88 -0
  127. package/dist/witnet/witnet.proto.json +1325 -0
  128. package/package.json +72 -0
  129. package/src/bin/cli/history.js +31 -0
  130. package/src/bin/cli/inspect.js +359 -0
  131. package/src/bin/cli/network.js +592 -0
  132. package/src/bin/cli/nodes.js +364 -0
  133. package/src/bin/cli/radon.js +814 -0
  134. package/src/bin/cli/wallet.js +1000 -0
  135. package/src/bin/helpers.js +829 -0
  136. package/src/bin/postinstall.js +9 -0
  137. package/src/bin/toolkit.js +294 -0
  138. package/witnet/assets/_index.js +8 -0
  139. package/witnet/assets/_requests.js +25 -0
  140. package/witnet/assets/_sources.js +36 -0
  141. package/witnet/assets/_templates.js +36 -0
  142. package/witnet/assets/index.js +4 -0
  143. package/witnet/assets/modals/index.js +25 -0
  144. package/witnet/assets/modals/web3/btc.js +0 -0
  145. package/witnet/assets/modals/web3/eth.js +29 -0
  146. package/witnet/assets/modals/web3/sol.js +0 -0
  147. package/witnet/assets/modals/web3/wit.js +23 -0
  148. package/witnet/assets/requests.js +94 -0
  149. package/witnet/witnet.proto.json +1325 -0
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@witnet/sdk",
3
+ "version": "1.0.0-beta.0",
4
+ "description": "Typescript library and CLI tooling for Web3 buidlers willing to interact with the Witnet blockchain.",
5
+ "author": "Witnet Foundation",
6
+ "license": "MIT",
7
+ "private": false,
8
+ "type": "commonjs",
9
+ "bin": {
10
+ "witnet": "src/bin/toolkit.js",
11
+ "witnet-toolkit": "src/bin/toolkit.js"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "src/bin",
16
+ "src/lib/cli",
17
+ "src/lib/helpers.js",
18
+ "witnet/witnet.proto.json",
19
+ "witnet/assets"
20
+ ],
21
+ "exports": {
22
+ ".": {
23
+ "require": "./dist/src/index.js",
24
+ "default": "./dist/src/index.js",
25
+ "types": "./dist/src/*.d.ts"
26
+ },
27
+ "./assets": "./dist/witnet/assets/index.js",
28
+ "./utils": {
29
+ "require": "./dist/src/lib/utils.js",
30
+ "default": "./dist/src/lib/utils.js",
31
+ "types": "./dist/src/lib/*.d.ts"
32
+ }
33
+ },
34
+ "types": "./dist",
35
+ "scripts": {
36
+ "build": "pbjs --target json witnet/witnet.proto -o witnet/witnet.proto.json && tsc -p tsconfig.json",
37
+ "fmt": "eslint --ext .js,.cjs . --ignore-path .gitignore --ignore-pattern _*",
38
+ "fmt!": "eslint --ext .js,.cjs . --fix --ignore-path .gitignore --ignore-pattern _*",
39
+ "postinstall": "node src/bin/postinstall.js",
40
+ "prepare": "pnpm run build",
41
+ "test": "cross-env-shell WITNET_SDK_RADON_ASSETS_PATH='../../../witnet/assets' node ./src/bin/toolkit.js"
42
+ },
43
+ "dependencies": {
44
+ "axios": "^1.7.9",
45
+ "bech32": "~2.0.0",
46
+ "bip32": "^4.0.0",
47
+ "cbor": "^10.0.3",
48
+ "dotenv": "^16.4.1",
49
+ "graphql-query-compress": "1.2.4",
50
+ "inquirer": "^12.4.2",
51
+ "json-bigint": "^1.0.0",
52
+ "lodash.merge": "^4.6.2",
53
+ "long": "^5.3.2",
54
+ "moment": "^2.30.1",
55
+ "promise-poller": "~1.9.1",
56
+ "protobufjs": "^7.4.0",
57
+ "qrcode-terminal": "^0.12.0",
58
+ "secp256k1": "^5.0.1",
59
+ "tiny-secp256k1": "~2.2.3"
60
+ },
61
+ "devDependencies": {
62
+ "@types/node": "^22.10.2",
63
+ "cross-env": "7.0.3",
64
+ "eslint": "8.56.0",
65
+ "eslint-config-standard": "^17.1.0",
66
+ "eslint-plugin-import": "^2.27.5",
67
+ "eslint-plugin-n": "^17.15.0",
68
+ "eslint-plugin-promise": "^7.2.1",
69
+ "protobufjs-cli": "^1.1.3",
70
+ "typescript": "^5.7.2"
71
+ }
72
+ }
@@ -0,0 +1,31 @@
1
+ /// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
+ /// CLI SUBMODULE CONSTANTS ===========================================================================================
3
+
4
+ module.exports = {
5
+ flags: {
6
+ start: {
7
+ hint: "Epoch from which search starts (default: -2048).",
8
+ param: ":epoch",
9
+ },
10
+ end: {
11
+ hint: "Epoch on which search ends (default: -1).",
12
+ param: ":epoch",
13
+ },
14
+ limit: { hint: "Limit output records (default: 100).", param: ":number" },
15
+ },
16
+ router: {
17
+ miners: {
18
+ hint: "Report most successful miners.",
19
+ },
20
+ requests: {
21
+ hint: "Report most successful data requests.",
22
+ },
23
+ witnesses: {
24
+ hint: "Report most successful witnesses.",
25
+ },
26
+ },
27
+ subcommands: {},
28
+ }
29
+
30
+ /// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
31
+ /// CLI SUBMODULE COMMANDS ============================================================================================
@@ -0,0 +1,359 @@
1
+ const moment = require("moment")
2
+
3
+ const helpers = require("../helpers")
4
+ const { utils, Witnet } = require("../../../dist/src")
5
+
6
+ const { cyan, gray, green, lyellow, magenta, mgreen, mmagenta, myellow, yellow } = helpers.colors
7
+
8
+ /// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9
+ /// CLI SUBMODULE CONSTANTS ===========================================================================================
10
+
11
+ module.exports = {
12
+ envars: {
13
+ WITNET_SDK_PROVIDER_URL: "=> Wit/Oracle RPC provider(s) to connect to, if no otherwise specified.",
14
+ },
15
+ flags: {
16
+ provider: {
17
+ hint: "Public Wit/Oracle JSON-RPC provider, other than default.",
18
+ param: ":http-url",
19
+ },
20
+ verbose: {
21
+ hint: "Outputs validators' nonce and last validation epochs.",
22
+ },
23
+ },
24
+ router: {
25
+ balance: {
26
+ hint: "Show available Wits on given address.",
27
+ params: "WIT_ADDRESS",
28
+ },
29
+ block: {
30
+ hint: "Get block data given its block hash.",
31
+ params: "BLOCK_HASH",
32
+ },
33
+ dataRequest: {
34
+ hint: "Report resolution workflow for the specified data request transaction.",
35
+ params: "DR_TX_HASH",
36
+ },
37
+ "dataRequests*": {
38
+ hint: "Search for in-flight or recently solved data request transactions.",
39
+ params: "BYTECODE | RAD_HASH | DDR_HASH",
40
+ options: {
41
+ limit: { hint: "Limit output records (default: 100).", param: "LIMIT" },
42
+ since: {
43
+ hint: "Number of past epochs to search for (default: 256; max: 2048).",
44
+ param: "EPOCH|MINUS_EPOCHS",
45
+ },
46
+ "min-unitary-reward": {
47
+ hint: "Filters out those providing less unitary reward than specified.",
48
+ param: "NANOWITS",
49
+ },
50
+ "min-witnesses": {
51
+ hint: "Filters out those solved with less than specified witnesses.",
52
+ param: "NUM_WITNESSES",
53
+ },
54
+ },
55
+ },
56
+ superblock: {
57
+ hint: "Show superblock metadata for given epoch.",
58
+ params: "EPOCH",
59
+ },
60
+ transaction: {
61
+ hint: "Report transaction details given its transaction hash.",
62
+ params: "TX_HASH",
63
+ },
64
+ validators: {
65
+ hint: "List validators treasuring delegated stake from the specified address.",
66
+ params: "WIT_ADDRESS",
67
+ },
68
+ withdrawers: {
69
+ hint: "List withdrawers currently delegating stake to the specified address.",
70
+ params: "WIT_ADDRESS",
71
+ },
72
+ utxos: {
73
+ hint: "List UTXOs available to the specified address.",
74
+ params: "WIT_ADDRESS",
75
+ options: {
76
+ "small-first": {
77
+ hint: "Outputs smallest UTXOs first (default: false).",
78
+ },
79
+ },
80
+ },
81
+ },
82
+ subcommands: {
83
+ balance, block, dataRequest, superblock, transaction, validators, withdrawers, utxos,
84
+ },
85
+ }
86
+
87
+ /// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
88
+ /// CLI SUBMODULE COMMANDS ============================================================================================
89
+
90
+ async function balance (options = {}, args = []) {
91
+ if (args.length === 0) {
92
+ throw Error("No WIT_ADDRESS was specified")
93
+ }
94
+ const pkh = args[0]
95
+ const provider = new Witnet.JsonRpcProvider(options?.provider)
96
+ const balance = await provider.getBalance(pkh)
97
+ const records = []
98
+ records.push([
99
+ Witnet.Coins.fromNanowits(balance.locked).wits,
100
+ Witnet.Coins.fromNanowits(balance.staked).wits,
101
+ Witnet.Coins.fromNanowits(balance.unlocked).wits,
102
+ Witnet.Coins.fromNanowits(balance.locked + balance.staked + balance.unlocked).wits,
103
+ ])
104
+ helpers.traceTable(records, {
105
+ headlines: ["Locked ($WIT)", "Staked ($WIT)", "Available ($WIT)", "BALANCE ($WIT)"],
106
+ humanizers: [helpers.commas, helpers.commas, helpers.commas, helpers.commas],
107
+ colors: [gray, yellow, myellow, lyellow],
108
+ })
109
+ }
110
+
111
+ async function block (options = {}, args = []) {
112
+ if (args.length === 0) {
113
+ throw Error("No BLOCK_HASH was specified")
114
+ }
115
+ const blockHash = args[0].startsWith("0x") ? args[0].slice(2) : args[0]
116
+ if (!helpers.isHexString(blockHash)) {
117
+ throw Error("Invalid BLOCK_HASH was provided")
118
+ }
119
+ const provider = await Witnet.JsonRpcProvider.fromEnv(options?.provider)
120
+ const block = await provider.getBlock(blockHash)
121
+ console.info(gray(JSON.stringify(block, (key, value) => {
122
+ switch (key) {
123
+ case "bytes":
124
+ case "der":
125
+ case "proof":
126
+ return Array.isArray(value) ? helpers.toHexString(value, true) : value
127
+
128
+ case "public_key":
129
+ return Array.isArray(value)
130
+ ? helpers.toHexString(value, true)
131
+ : (typeof value === 'object' ? Witnet.PublicKey.fromProtobuf(value).hash().toBech32(provider.network) : value)
132
+
133
+ default:
134
+ return value
135
+ }
136
+ }, 2)))
137
+ }
138
+
139
+ async function dataRequest (options = {}, args = []) {
140
+ if (args.length === 0) {
141
+ throw Error("No DR_TX_HASH was specified")
142
+ }
143
+ const drTxHash = args[0].startsWith("0x") ? args[0].slice(2) : args[0]
144
+ if (!helpers.isHexString(drTxHash)) {
145
+ throw Error("Invalid DR_TX_HASH was provided")
146
+ }
147
+ const provider = new Witnet.JsonRpcProvider(options?.provider)
148
+
149
+ const drTxJsonReplacer = (key, value) => {
150
+ switch (key) {
151
+ case "proof":
152
+ case "public_key":
153
+ case "signature":
154
+ case "signatures":
155
+ return undefined
156
+
157
+ case "reveal":
158
+ case "tally":
159
+ if (Array.isArray(value)) {
160
+ const result = utils.cbor.decode(Uint8Array.from(value))
161
+ return Buffer.isBuffer(result) ? utils.toHexString(value) : result
162
+ }
163
+
164
+ default:
165
+ return value
166
+ }
167
+ }
168
+
169
+ const report = await provider.getDataRequest(drTxHash)
170
+ console.info(JSON.stringify(report, drTxJsonReplacer, 4))
171
+ }
172
+
173
+ async function superblock (options = {}, args = []) {
174
+ if (args.length === 0) {
175
+ throw Error("No EPOCH was specified")
176
+ }
177
+ const provider = new Witnet.JsonRpcProvider(options?.provider)
178
+ const superblock = await provider.getSuperblock(args[0])
179
+ console.info(superblock)
180
+ }
181
+
182
+ async function transaction (options = {}, args = []) {
183
+ if (args.length === 0) {
184
+ throw Error("No TX_HASH was specified")
185
+ }
186
+ const txHash = args[0].startsWith("0x") ? args[0].slice(2) : args[0]
187
+ if (!helpers.isHexString(txHash)) {
188
+ throw Error("Invalid TX_HASH was provided")
189
+ }
190
+ const provider = new Witnet.JsonRpcProvider(options?.provider)
191
+ const transaction = await provider.getTransaction(txHash)
192
+ console.info(
193
+ `${yellow(JSON.stringify(transaction, utils.txJsonReplacer, 2))}`
194
+ )
195
+ }
196
+
197
+ async function utxos (options = {}, args = []) {
198
+ if (args.length < 1) {
199
+ throw Error("No WIT_ADDRESS was specified")
200
+ }
201
+ const now = Math.floor(Date.now() / 1000)
202
+ const provider = new Witnet.JsonRpcProvider(options?.provider)
203
+ let utxos = await provider.getUtxos(args[0], options["small-first"] || false)
204
+ let totalBalance = 0n
205
+ if (!options?.verbose) {
206
+ utxos = utxos
207
+ .filter(utxo => utxo.timelock <= now)
208
+ .map(utxo => {
209
+ totalBalance += utxo.value
210
+ return [
211
+ utxo.output_pointer,
212
+ utxo.value,
213
+ ]
214
+ })
215
+ helpers.traceTable(utxos, {
216
+ headlines: [":UTXOs", "Value ($pedros)"],
217
+ humanizers: [, helpers.commas],
218
+ colors: [, myellow],
219
+ })
220
+ } else {
221
+ utxos = utxos
222
+ .map(utxo => {
223
+ totalBalance += utxo.value
224
+ return [
225
+ utxo.output_pointer,
226
+ utxo.timelock > now ? gray(moment.unix(utxo.timelock).fromNow()) : "",
227
+ utxo.timelock > now ? gray(helpers.commas(utxo.value)) : myellow(helpers.commas(utxo.value)),
228
+ ]
229
+ })
230
+ helpers.traceTable(utxos, {
231
+ headlines: [":UTXOs", "Timelock", "Value ($pedros)"],
232
+ })
233
+ }
234
+ console.info(`^ Showing ${utxos.length} UTXOs: ${lyellow(helpers.whole_wits(totalBalance, 2))}.`)
235
+ }
236
+
237
+ async function validators (options = {}, args = []) {
238
+ if (args.length === 0) {
239
+ throw Error("No WIT_ADDRESS was specified")
240
+ }
241
+ const provider = new Witnet.JsonRpcProvider(options?.provider)
242
+ const query = {
243
+ filter: { withdrawer: args[0] },
244
+ }
245
+ const records = await provider.stakes(query)
246
+ let nanowits = 0
247
+ if (records.length > 0) {
248
+ helpers.traceTable(
249
+ records.map((record, index) => {
250
+ nanowits += record.value.coins
251
+ return [
252
+ 1 + index,
253
+ record.key.validator,
254
+ ...(
255
+ options?.verbose
256
+ ? [record.value.nonce, record.value.epochs.witnessing, record.value.epochs.mining]
257
+ : []
258
+ ),
259
+ Witnet.Coins.fromNanowits(record.value.coins).wits,
260
+ ]
261
+ }), {
262
+ headlines: [
263
+ "RANK",
264
+ "VALIDATORS",
265
+ ...(
266
+ options?.verbose
267
+ ? ["Nonce", "LW_Epoch", "LM_Epoch"]
268
+ : []
269
+ ),
270
+ "STAKED ($WIT)",
271
+ ],
272
+ humanizers: [
273
+ ,, ...(
274
+ options?.verbose
275
+ ? [helpers.commas, helpers.commas, helpers.commas]
276
+ : []
277
+ ),
278
+ helpers.commas,
279
+ ],
280
+ colors: [, green, ...(
281
+ options?.verbose
282
+ ? [, magenta, cyan, myellow]
283
+ : [myellow]
284
+ )],
285
+ }
286
+ )
287
+ console.info(
288
+ `^ ${records.length} validators for withdrawer ${
289
+ mgreen(args[0])
290
+ }: ${
291
+ lyellow(helpers.whole_wits(nanowits, 2))
292
+ }`
293
+ )
294
+ } else {
295
+ console.info(`> No validators found for withdrawer ${mmagenta(args[0])}.`)
296
+ }
297
+ }
298
+
299
+ async function withdrawers (options = {}, args = []) {
300
+ if (args.length === 0) {
301
+ throw Error("No WIT_ADDRESS was specified")
302
+ }
303
+ const provider = new Witnet.JsonRpcProvider(options?.provider)
304
+ const query = {
305
+ filter: { validator: args[0] },
306
+ }
307
+ const records = await provider.stakes(query)
308
+ let nanowits = 0
309
+ if (records.length > 0) {
310
+ helpers.traceTable(
311
+ records.map((record, index) => {
312
+ nanowits += record.value.coins
313
+ return [
314
+ 1 + index,
315
+ record.key.withdrawer,
316
+ ...(
317
+ options?.verbose
318
+ ? [record.value.nonce, record.value.epochs.witnessing, record.value.epochs.mining]
319
+ : []
320
+ ),
321
+ Witnet.Coins.fromNanowits(record.value.coins).wits,
322
+ ]
323
+ }), {
324
+ headlines: [
325
+ "RANK",
326
+ "WITHDRAWERS",
327
+ ...(
328
+ options?.verbose
329
+ ? ["Nonce", "LW_Epoch", "LM_Epoch"]
330
+ : []
331
+ ),
332
+ "STAKED ($WIT)",
333
+ ],
334
+ humanizers: [
335
+ ,, ...(
336
+ options?.verbose
337
+ ? [helpers.commas, helpers.commas, helpers.commas]
338
+ : []
339
+ ),
340
+ helpers.commas,
341
+ ],
342
+ colors: [, green, ...(
343
+ options?.verbose
344
+ ? [, magenta, cyan, myellow]
345
+ : [myellow]
346
+ )],
347
+ }
348
+ )
349
+ console.info(
350
+ `^ ${records.length} withdrawers for validator ${
351
+ mgreen(args[0])
352
+ }: ${
353
+ lyellow(helpers.whole_wits(nanowits, 2))
354
+ }`
355
+ )
356
+ } else {
357
+ console.info(`> No withdrawers found for validator ${mmagenta(args[0])}.`)
358
+ }
359
+ }