@witnet/solidity 3.0.4 → 3.0.5

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 (222) hide show
  1. package/LICENSE +2 -2
  2. package/build/contracts/Bech32.json +1 -1
  3. package/build/contracts/Clonable.json +1 -1
  4. package/build/contracts/Context.json +1 -1
  5. package/build/contracts/Create3.json +1 -1
  6. package/build/contracts/ERC165.json +1 -1
  7. package/build/contracts/Escrowable.json +1 -1
  8. package/build/contracts/IChainlinkAggregatorV3.json +1 -1
  9. package/build/contracts/IERC165.json +1 -1
  10. package/build/contracts/IERC20.json +1 -1
  11. package/build/contracts/IERC2362.json +1 -1
  12. package/build/contracts/IPythChainlinkAggregatorV3.json +1 -1
  13. package/build/contracts/IWitAppliance.json +1 -1
  14. package/build/contracts/IWitOracle.json +1 -1
  15. package/build/contracts/IWitOracleAppliance.json +1 -1
  16. package/build/contracts/IWitOracleConsumer.json +1 -1
  17. package/build/contracts/IWitOracleConsumerLegacy.json +1 -1
  18. package/build/contracts/IWitOracleLegacy.json +1 -1
  19. package/build/contracts/IWitOracleQueriable.json +1 -1
  20. package/build/contracts/IWitOracleQueriableConsumer.json +1 -1
  21. package/build/contracts/IWitOracleQueriableEvents.json +1 -1
  22. package/build/contracts/IWitOracleQueriableExperimental.json +1 -1
  23. package/build/contracts/IWitOracleQueriableTrustableReporter.json +1 -1
  24. package/build/contracts/IWitOracleQueriableTrustlessReporter.json +1 -1
  25. package/build/contracts/IWitOracleRadonRegistry.json +1 -1
  26. package/build/contracts/IWitOracleRadonRegistryEvents.json +1 -1
  27. package/build/contracts/IWitOracleRadonRegistryLegacy.json +1 -1
  28. package/build/contracts/IWitOracleRadonRequestFactory.json +1 -1
  29. package/build/contracts/IWitOracleRadonRequestModal.json +1 -1
  30. package/build/contracts/IWitOracleRadonRequestTemplate.json +1 -1
  31. package/build/contracts/IWitOracleRequest.json +1 -1
  32. package/build/contracts/IWitOracleRequestFactory.json +1 -1
  33. package/build/contracts/IWitOracleRequestFactoryEvents.json +1 -1
  34. package/build/contracts/IWitOracleRequestTemplate.json +1 -1
  35. package/build/contracts/IWitOracleTrustableAdmin.json +1 -1
  36. package/build/contracts/IWitOracleTrustless.json +1 -1
  37. package/build/contracts/IWitPriceFeeds.json +1 -1
  38. package/build/contracts/IWitPriceFeedsAdmin.json +1 -1
  39. package/build/contracts/IWitPriceFeedsConsumer.json +1 -1
  40. package/build/contracts/IWitPriceFeedsEvents.json +1 -1
  41. package/build/contracts/IWitPriceFeedsLegacy.json +1 -1
  42. package/build/contracts/IWitPriceFeedsLegacyAdmin.json +1 -1
  43. package/build/contracts/IWitPriceFeedsLegacySolver.json +1 -1
  44. package/build/contracts/IWitPriceFeedsLegacySolverFactory.json +1 -1
  45. package/build/contracts/IWitPriceFeedsTypes.json +1 -1
  46. package/build/contracts/IWitPyth.json +1 -1
  47. package/build/contracts/IWitPythChainlinkAggregator.json +1 -1
  48. package/build/contracts/IWitPythErrors.json +1 -1
  49. package/build/contracts/IWitPythEvents.json +1 -1
  50. package/build/contracts/IWitPythReporter.json +1 -1
  51. package/build/contracts/IWitRandomness.json +1 -1
  52. package/build/contracts/IWitRandomnessAdmin.json +1 -1
  53. package/build/contracts/IWitRandomnessAdminV2.json +1 -1
  54. package/build/contracts/IWitRandomnessConsumer.json +1 -1
  55. package/build/contracts/IWitRandomnessEvents.json +1 -1
  56. package/build/contracts/IWitRandomnessLegacy.json +1 -1
  57. package/build/contracts/IWitRandomnessTypes.json +1 -1
  58. package/build/contracts/Initializable.json +1 -1
  59. package/build/contracts/OVM_GasPriceOracle.json +1 -1
  60. package/build/contracts/Ownable.json +1 -1
  61. package/build/contracts/Ownable2Step.json +1 -1
  62. package/build/contracts/Payable.json +1 -1
  63. package/build/contracts/Proxiable.json +1 -1
  64. package/build/contracts/ReentrancyGuard.json +1 -1
  65. package/build/contracts/Secp256k1.json +1 -1
  66. package/build/contracts/Slices.json +1 -1
  67. package/build/contracts/TestBech32.json +1 -1
  68. package/build/contracts/TestSecp256k1.json +1 -1
  69. package/build/contracts/Upgradeable.json +1 -1
  70. package/build/contracts/UsingWitOracle.json +1 -1
  71. package/build/contracts/UsingWitPriceFeeds.json +1 -1
  72. package/build/contracts/UsingWitRandomness.json +1 -1
  73. package/build/contracts/WitOracle.json +2 -13
  74. package/build/contracts/WitOracleBasePushOnly.json +1 -1
  75. package/build/contracts/WitOracleBasePushOnlyTrustable.json +1 -1
  76. package/build/contracts/WitOracleBasePushOnlyTrustless.json +1 -1
  77. package/build/contracts/WitOracleBasePushOnlyUpgradable.json +1 -1
  78. package/build/contracts/WitOracleBaseQueriable.json +1 -1
  79. package/build/contracts/WitOracleBaseQueriableTrustable.json +1 -1
  80. package/build/contracts/WitOracleBaseQueriableTrustless.json +1 -1
  81. package/build/contracts/WitOracleBaseQueriableUpgradable.json +1 -1
  82. package/build/contracts/WitOracleDataLib.json +2 -254
  83. package/build/contracts/WitOraclePushOnly.json +1 -1
  84. package/build/contracts/WitOracleRadonEncodingLib.json +2 -13
  85. package/build/contracts/WitOracleRadonRegistry.json +2 -13
  86. package/build/contracts/WitOracleRadonRegistryBase.json +1 -1
  87. package/build/contracts/WitOracleRadonRegistryBaseUpgradable.json +1 -1
  88. package/build/contracts/WitOracleRadonRegistryData.json +1 -1
  89. package/build/contracts/WitOracleRadonRegistryDefaultV21.json +1 -1
  90. package/build/contracts/WitOracleRadonRegistryUpgradableDefault.json +2 -17
  91. package/build/contracts/WitOracleRadonRegistryUpgradableNoSha256.json +1 -1
  92. package/build/contracts/WitOracleRadonRegistryUpgradableZkSync.json +1 -1
  93. package/build/contracts/WitOracleRadonRequestFactory.json +2 -13
  94. package/build/contracts/WitOracleRadonRequestFactoryBase.json +1 -1
  95. package/build/contracts/WitOracleRadonRequestFactoryBaseUpgradable.json +1 -1
  96. package/build/contracts/WitOracleRadonRequestFactoryModals.json +2 -13
  97. package/build/contracts/WitOracleRadonRequestFactoryModalsDefault.json +2 -13
  98. package/build/contracts/WitOracleRadonRequestFactoryTemplates.json +2 -13
  99. package/build/contracts/WitOracleRadonRequestFactoryTemplatesDefault.json +2 -13
  100. package/build/contracts/WitOracleRadonRequestFactoryUpgradableConfluxCore.json +1 -1
  101. package/build/contracts/WitOracleRadonRequestFactoryUpgradableDefault.json +2 -13
  102. package/build/contracts/WitOracleResultStatusLib.json +2 -14
  103. package/build/contracts/WitOracleTrustableDefault.json +2 -259
  104. package/build/contracts/WitOracleTrustableExperimental.json +1 -1
  105. package/build/contracts/WitOracleTrustableObscuro.json +1 -1
  106. package/build/contracts/WitOracleTrustableOvm2.json +1 -1
  107. package/build/contracts/WitOracleTrustablePushOnly.json +1 -1
  108. package/build/contracts/WitOracleTrustableReef.json +1 -1
  109. package/build/contracts/WitOracleTrustableZkSync.json +1 -1
  110. package/build/contracts/WitOracleTrustlessDataLib.json +1 -1
  111. package/build/contracts/WitOracleTrustlessDefaultV22.json +1 -1
  112. package/build/contracts/WitOracleTrustlessUpgradableDefault.json +1 -1
  113. package/build/contracts/WitPriceFeeds.json +2 -13
  114. package/build/contracts/WitPriceFeedsDataLib.json +2 -14
  115. package/build/contracts/WitPriceFeedsLegacy.json +2 -8
  116. package/build/contracts/WitPriceFeedsLegacyDataLib.json +2 -84
  117. package/build/contracts/WitPriceFeedsLegacyUpgradable.json +1 -1
  118. package/build/contracts/WitPriceFeedsLegacyUpgradableBypass.json +2 -80
  119. package/build/contracts/WitPriceFeedsSolverBase.json +1 -1
  120. package/build/contracts/WitPriceFeedsV3.json +1 -1
  121. package/build/contracts/WitPriceFeedsV3Upgradable.json +2 -17
  122. package/build/contracts/WitPythChainlinkAggregator.json +1 -1
  123. package/build/contracts/WitRandomness.json +2 -13
  124. package/build/contracts/WitRandomnessLegacy.json +1 -1
  125. package/build/contracts/WitRandomnessV3.json +2 -13
  126. package/build/contracts/WitRngConsumer.json +1 -1
  127. package/build/contracts/Witnet.json +1 -1
  128. package/build/contracts/WitnetBuffer.json +1 -1
  129. package/build/contracts/WitnetCBOR.json +1 -1
  130. package/build/contracts/WitnetDeployer.json +2 -13
  131. package/build/contracts/WitnetDeployerConfluxCore.json +1 -1
  132. package/build/contracts/WitnetDeployerDeferred.json +1 -1
  133. package/build/contracts/WitnetDeployerMeter.json +1 -1
  134. package/build/contracts/WitnetProxy.json +2 -9
  135. package/build/contracts/WitnetUpgradableBase.json +1 -1
  136. package/{migrations → dist/migrations}/addresses.json +1 -25
  137. package/{migrations → dist/migrations}/constructorArgs.json +1 -6
  138. package/dist/migrations/settings/artifacts.d.ts +95 -0
  139. package/dist/migrations/settings/artifacts.d.ts.map +1 -0
  140. package/dist/migrations/settings/artifacts.js +80 -0
  141. package/dist/migrations/settings/networks.d.ts +593 -0
  142. package/dist/migrations/settings/networks.d.ts.map +1 -0
  143. package/dist/migrations/settings/networks.js +593 -0
  144. package/dist/src/bin/helpers.cjs +350 -0
  145. package/dist/src/bin/helpers.d.cts +76 -0
  146. package/dist/src/bin/helpers.d.cts.map +1 -0
  147. package/dist/src/index.d.ts +6 -0
  148. package/dist/src/index.d.ts.map +1 -0
  149. package/dist/src/index.js +33 -0
  150. package/dist/src/lib/types.d.ts +99 -0
  151. package/dist/src/lib/types.d.ts.map +1 -0
  152. package/dist/src/lib/types.js +18 -0
  153. package/dist/src/lib/utils.d.ts +22 -0
  154. package/dist/src/lib/utils.d.ts.map +1 -0
  155. package/dist/src/lib/utils.js +267 -0
  156. package/dist/src/lib/wrappers/ContractWrapper.d.ts +47 -0
  157. package/dist/src/lib/wrappers/ContractWrapper.d.ts.map +1 -0
  158. package/dist/src/lib/wrappers/ContractWrapper.js +81 -0
  159. package/dist/src/lib/wrappers/WitAppliance.d.ts +7 -0
  160. package/dist/src/lib/wrappers/WitAppliance.d.ts.map +1 -0
  161. package/dist/src/lib/wrappers/WitAppliance.js +17 -0
  162. package/dist/src/lib/wrappers/WitArtifact.d.ts +6 -0
  163. package/dist/src/lib/wrappers/WitArtifact.d.ts.map +1 -0
  164. package/dist/src/lib/wrappers/WitArtifact.js +16 -0
  165. package/dist/src/lib/wrappers/WitOracle.d.ts +105 -0
  166. package/dist/src/lib/wrappers/WitOracle.d.ts.map +1 -0
  167. package/dist/src/lib/wrappers/WitOracle.js +217 -0
  168. package/dist/src/lib/wrappers/WitOracleConsumer.d.ts +16 -0
  169. package/dist/src/lib/wrappers/WitOracleConsumer.d.ts.map +1 -0
  170. package/dist/src/lib/wrappers/WitOracleConsumer.js +30 -0
  171. package/dist/src/lib/wrappers/WitOracleRadonRegistry.d.ts +102 -0
  172. package/dist/src/lib/wrappers/WitOracleRadonRegistry.d.ts.map +1 -0
  173. package/dist/src/lib/wrappers/WitOracleRadonRegistry.js +140 -0
  174. package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.d.ts +81 -0
  175. package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.d.ts.map +1 -0
  176. package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.js +257 -0
  177. package/dist/src/lib/wrappers/WitPriceFeeds.d.ts +91 -0
  178. package/dist/src/lib/wrappers/WitPriceFeeds.d.ts.map +1 -0
  179. package/dist/src/lib/wrappers/WitPriceFeeds.js +356 -0
  180. package/dist/src/lib/wrappers/WitPriceFeedsLegacy.d.ts +14 -0
  181. package/dist/src/lib/wrappers/WitPriceFeedsLegacy.d.ts.map +1 -0
  182. package/dist/src/lib/wrappers/WitPriceFeedsLegacy.js +64 -0
  183. package/dist/src/lib/wrappers/WitRandomness.d.ts +55 -0
  184. package/dist/src/lib/wrappers/WitRandomness.d.ts.map +1 -0
  185. package/dist/src/lib/wrappers/WitRandomness.js +165 -0
  186. package/dist/src/lib/wrappers.d.ts +8 -0
  187. package/dist/src/lib/wrappers.d.ts.map +1 -0
  188. package/dist/src/lib/wrappers.js +8 -0
  189. package/package.json +78 -54
  190. package/scripts/clean.cjs +21 -0
  191. package/scripts/eth-create2.cjs +38 -0
  192. package/scripts/eth-create3.cjs +45 -0
  193. package/scripts/postinstall.cjs +9 -0
  194. package/scripts/prepare.cjs +27 -0
  195. package/scripts/vanity2gen.cjs +121 -0
  196. package/scripts/vanity3gen.cjs +84 -0
  197. package/scripts/verify-proxies.cjs +50 -0
  198. package/scripts/verify-truffle.cjs +69 -0
  199. package/scripts/verify.js +95 -0
  200. package/scripts/wof-acls.js +17 -0
  201. package/src/bin/bots/bridge.cjs +0 -0
  202. package/src/bin/bots/randomizer.cjs +290 -0
  203. package/src/bin/bots/reporter.cjs +0 -0
  204. package/src/bin/cli/accounts.cjs +47 -0
  205. package/src/bin/cli/assets.cjs +466 -0
  206. package/src/bin/cli/framework.cjs +100 -0
  207. package/src/bin/cli/gateway.cjs +26 -0
  208. package/src/bin/cli/networks.cjs +63 -0
  209. package/src/bin/cli/priceFeeds.cjs +170 -0
  210. package/src/bin/cli/queries.cjs +217 -0
  211. package/src/bin/cli/randomness.cjs +367 -0
  212. package/src/bin/cli/reports.cjs +272 -0
  213. package/src/bin/cli/wizard.cjs +352 -0
  214. package/src/bin/helpers.cjs +388 -0
  215. package/src/bin/index.cjs +407 -0
  216. package/settings/artifacts.js +0 -71
  217. package/settings/index.js +0 -49
  218. package/settings/networks.js +0 -593
  219. package/settings/solidity.js +0 -11
  220. package/settings/specs.js +0 -102
  221. package/src/index.js +0 -96
  222. package/src/utils.js +0 -305
@@ -0,0 +1,367 @@
1
+ const helpers = require("../helpers.cjs")
2
+ const ethers = require("ethers")
3
+ const moment = require("moment")
4
+ const prompt = require("inquirer").createPromptModule()
5
+
6
+ const { utils, WitOracle } = require("../../../dist/src")
7
+ const { colors, DEFAULT_LIMIT, DEFAULT_SINCE } = helpers
8
+
9
+ module.exports = async (options = {}, args = []) => {
10
+ ;[args] = helpers.deleteExtraFlags(args)
11
+
12
+ const { limit, offset, since, clone } = options
13
+
14
+ const witOracle = await WitOracle.fromJsonRpcUrl(
15
+ `http://127.0.0.1:${options?.port || 8545}`,
16
+ options?.signer,
17
+ )
18
+
19
+ const { network, provider } = witOracle
20
+ helpers.traceHeader(`${network.toUpperCase()}`, helpers.colors.lcyan)
21
+ const framework = await helpers.prompter(
22
+ utils.fetchWitOracleFramework(provider),
23
+ )
24
+ let target = args[0]
25
+ let chosen = false
26
+ if (!target) {
27
+ const artifacts = Object.entries(framework).filter(([key]) =>
28
+ key.startsWith("WitRandomness"),
29
+ )
30
+ if (artifacts.length === 1) {
31
+ target = artifacts[0][1].address
32
+ } else {
33
+ const selection = await prompt([
34
+ {
35
+ choices: artifacts.map(([_key, artifact]) => artifact.address),
36
+ message: "Randomness contract:",
37
+ name: "target",
38
+ type: "rawlist",
39
+ },
40
+ ])
41
+ target = selection.target
42
+ chosen = true
43
+ }
44
+ }
45
+ const randomizer = await witOracle.getWitRandomnessAt(target)
46
+ const symbol = utils.getEvmNetworkSymbol(network)
47
+ const [artifact, version, base, consumer] = await Promise.all([
48
+ await randomizer.getEvmImplClass(),
49
+ await randomizer.getEvmImplVersion(),
50
+ await randomizer.getEvmBase(),
51
+ await randomizer.getEvmConsumer(),
52
+ ])
53
+ let curator = await randomizer.getEvmCurator()
54
+
55
+ const maxWidth = Math.max(20, artifact.length + 2)
56
+ console.info(
57
+ `> ${helpers.colors.lwhite(artifact)}:${" ".repeat(
58
+ maxWidth - artifact.length,
59
+ )}${chosen ? "" : `${helpers.colors.lblue(target)} `}${helpers.colors.blue(
60
+ `[ ${version} ]`,
61
+ )}`,
62
+ )
63
+ if (base !== randomizer.address) {
64
+ console.info(`> Master address: ${colors.blue(base)}`)
65
+ if (randomizer.signer.address !== curator) {
66
+ console.info(`> Curator address: ${colors.magenta(curator)}`)
67
+ } else {
68
+ console.info(`> Curator address: ${colors.mmagenta(curator)}`)
69
+ }
70
+ }
71
+
72
+ if (clone) {
73
+ console.info()
74
+ await prompt([
75
+ {
76
+ name: "setDefault",
77
+ type: "confirm",
78
+ message: "Do you want the new clone to become your default address?",
79
+ default: true,
80
+ },
81
+ {
82
+ name: "curator",
83
+ type: "list",
84
+ message: "Please, select a new curator address:",
85
+ choices: (await randomizer.provider.listAccounts()).map(
86
+ (signer) => signer.address,
87
+ ),
88
+ },
89
+ ]).then(async (answer) => {
90
+ console.info(
91
+ colors.lyellow(`\n >>> CLONING THE WIT/RANDOMNESS CONTRACT <<<`),
92
+ )
93
+ console.info(` > Master address: ${colors.blue(randomizer.address)}`)
94
+ if (answer.curator === randomizer.signer.address) {
95
+ console.info(
96
+ ` > Curator address: ${colors.mmagenta(answer.curator)}`,
97
+ )
98
+ } else {
99
+ console.info(
100
+ ` > Signer address: ${colors.yellow(randomizer.signer.address)}`,
101
+ )
102
+ console.info(` > Curator address: ${colors.magenta(answer.curator)}`)
103
+ }
104
+ const { logs } = await _invokeAdminTask(
105
+ randomizer.clone.bind(randomizer),
106
+ answer.curator,
107
+ )
108
+ if (logs?.[0]) {
109
+ const cloned = logs[0].address
110
+ console.info(` > Cloned address: ${colors.mblue(cloned)}`)
111
+ randomizer.attach(cloned)
112
+ if (answer.setDefault) {
113
+ const { addresses } = helpers.readWitnetJsonFiles("addresses")
114
+ if (!addresses[network]) addresses[network] = {}
115
+ if (!addresses[network].apps) addresses[network].apps = {}
116
+ addresses[network].apps[artifact] = cloned
117
+ helpers.saveWitnetJsonFiles({ addresses })
118
+ }
119
+ } else {
120
+ console.error(colors.mred(` Error: no Cloned event was emitted.`))
121
+ process.exit(0)
122
+ }
123
+ curator = answer.curator
124
+ })
125
+ } else {
126
+ if (consumer !== "0x0000000000000000000000000000000000000000") {
127
+ console.info(`> Consumer address: ${colors.cyan(consumer)}`)
128
+ }
129
+ }
130
+
131
+ if (options?.randomize) {
132
+ console.info(colors.lyellow(`\n >>> REQUESTING NEW RANDOMIZE <<<`))
133
+ const receipt = await randomizer
134
+ .randomize({
135
+ evmConfirmations: options?.confirmations || 1,
136
+ evmGasPrice: options?.gasPrice,
137
+ evmTimeout: options?.timeout,
138
+ onRandomizeTransaction: (txHash) => {
139
+ console.info(
140
+ ` > EVM signer:${" ".repeat(maxWidth - 10)}${helpers.colors.gray(randomizer.signer.address)}`,
141
+ )
142
+ process.stdout.write(
143
+ ` > EVM transaction:${" ".repeat(maxWidth - 15)}${helpers.colors.gray(txHash)} ... `,
144
+ )
145
+ },
146
+ onRandomizeTransactionReceipt: () => {
147
+ process.stdout.write(`${helpers.colors.lwhite("OK")}\n`)
148
+ },
149
+ })
150
+ .catch((err) => {
151
+ process.stdout.write(`${helpers.colors.mred("FAIL")}`)
152
+ console.error(err)
153
+ throw err
154
+ })
155
+ if (receipt) {
156
+ console.info(
157
+ ` > EVM block number:${" ".repeat(maxWidth - 16)}${helpers.colors.lwhite(helpers.commas(receipt?.blockNumber))}`,
158
+ )
159
+ console.info(
160
+ ` > EVM tx gas price:${" ".repeat(maxWidth - 16)}${helpers.colors.lwhite(helpers.commas(receipt?.gasPrice))} weis`,
161
+ )
162
+ console.info(
163
+ ` > EVM tx fee:${" ".repeat(maxWidth - 10)}${helpers.colors.lwhite(ethers.formatEther(receipt.fee))} ETH`,
164
+ )
165
+ const value = (await receipt.getTransaction()).value
166
+ console.info(
167
+ ` > EVM randomize fee:${" ".repeat(maxWidth - 17)}${helpers.colors.lwhite(ethers.formatEther(value))} ETH`,
168
+ )
169
+ console.info(
170
+ ` > EVM effective gas:${" ".repeat(maxWidth - 17)}${helpers.commas(
171
+ Math.floor(Number((receipt.fee + value) / receipt.gasPrice)),
172
+ )} gas units`,
173
+ )
174
+ }
175
+ }
176
+
177
+ // determine current block number
178
+ const blockNumber = await provider.getBlockNumber()
179
+
180
+ // determine fromBlock
181
+ let fromBlock
182
+ if (since === undefined || since < 0) {
183
+ fromBlock = BigInt(blockNumber) + BigInt(since ?? DEFAULT_SINCE)
184
+ } else {
185
+ fromBlock = BigInt(since ?? 0n)
186
+ }
187
+
188
+ // fetch events since specified block
189
+ let logs = await randomizer.filterEvents({ fromBlock })
190
+
191
+ // count logs before last filter
192
+ const totalLogs = logs.length
193
+
194
+ // apply limit/offset filter
195
+ logs =
196
+ !since || BigInt(since) < 0n
197
+ ? logs
198
+ .slice(offset || 0)
199
+ .slice(0, limit || DEFAULT_LIMIT) // oldest first
200
+ : logs
201
+ .reverse()
202
+ .slice(offset || 0)
203
+ .slice(0, limit || DEFAULT_LIMIT) // latest first
204
+
205
+ // fetch randomize status and evm cost for each log entry
206
+ logs = await helpers.prompter(
207
+ Promise.all(
208
+ logs.map(async (log) => {
209
+ const block = await provider.getBlock(log.randomizeBlock)
210
+ const receipt = await provider.getTransactionReceipt(
211
+ log.transactionHash,
212
+ )
213
+ const status = await randomizer.getRandomizeStatus(log.randomizeBlock)
214
+ const transaction = await provider.getTransaction(log.transactionHash)
215
+ let readiness = {}
216
+ try {
217
+ if (status === "Ready") {
218
+ const randomness = options["trace-back"]
219
+ ? await randomizer.fetchRandomnessAfter(log.randomizeBlock)
220
+ : undefined
221
+ let { btr, finality, trail, timestamp } =
222
+ await randomizer.fetchRandomnessAfterProof(log.randomizeBlock)
223
+ if (finality) {
224
+ timestamp = (await provider.getBlock(finality)).timestamp
225
+ btr = finality - log.randomizeBlock
226
+ }
227
+ const ttr = moment
228
+ .duration(
229
+ moment
230
+ .unix(timestamp)
231
+ .diff(moment.unix(Number(block.timestamp))),
232
+ )
233
+ .humanize()
234
+ readiness = { btr, finality, randomness, trail, ttr }
235
+ }
236
+ } catch {}
237
+ return {
238
+ ...log,
239
+ cost: transaction.value + receipt.gasPrice * receipt.gasUsed,
240
+ gasPrice: receipt.gasPrice,
241
+ origin: transaction.from,
242
+ status,
243
+ ...readiness,
244
+ blockTimestamp: block.timestamp,
245
+ }
246
+ }),
247
+ ).catch((err) => console.error(err)),
248
+ )
249
+ if (logs?.length > 0) {
250
+ if (options["trace-back"]) {
251
+ helpers.traceTable(
252
+ logs.map((log) => [
253
+ log.randomizeBlock,
254
+ log.btr,
255
+ log.trail?.slice(2),
256
+ log.randomness,
257
+ ]),
258
+ {
259
+ colors: [
260
+ helpers.colors.white,
261
+ helpers.colors.lwhite,
262
+ helpers.colors.magenta,
263
+ helpers.colors.green,
264
+ ],
265
+ headlines: [
266
+ "EVM BLOCK:",
267
+ "B.T.R.",
268
+ `RANDOMIZE WITNESSING ACT ON ${helpers.colors.lwhite(`WITNET ${utils.isEvmNetworkMainnet(network) ? "MAINNET" : "TESTNET"}`)}`,
269
+ "WITNET-GENERATED RANDOMNESS",
270
+ ],
271
+ humanizers: [helpers.commas, helpers.commas],
272
+ },
273
+ )
274
+ } else {
275
+ helpers.traceTable(
276
+ logs.map((log) => [
277
+ log.randomizeBlock,
278
+ moment.unix(log.blockTimestamp),
279
+ log.origin, // `${log.origin?.slice(0, 8)}..${log.origin?.slice(-4)}`,
280
+ `${
281
+ Number(log.gasPrice) / 10 ** 9 < 1.0
282
+ ? Number(Number(log.gasPrice) / 10 ** 9).toFixed(6)
283
+ : helpers.commas(
284
+ Number(Number(log.gasPrice) / 10 ** 9).toFixed(1),
285
+ )
286
+ } gwei`,
287
+ Number(Number(log.cost) / 10 ** 18).toFixed(9),
288
+ log.ttr,
289
+ log.status === "Error"
290
+ ? helpers.colors.mred("Error")
291
+ : log.status === "Ready"
292
+ ? helpers.colors.mgreen("Ready")
293
+ : helpers.colors.yellow(log.status),
294
+ ]),
295
+ {
296
+ colors: [
297
+ helpers.colors.white,
298
+ helpers.colors.lwhite,
299
+ helpers.colors.mblue,
300
+ helpers.colors.blue,
301
+ helpers.colors.gray,
302
+ undefined,
303
+ helpers.colors.magenta,
304
+ ],
305
+ headlines: [
306
+ "EVM BLOCK:",
307
+ "EVM TIMESTAMP",
308
+ ":EVM RANDOMIZER",
309
+ "EVM GAS PRICE",
310
+ `$${helpers.colors.lwhite(symbol)} COST`,
311
+ "T.T.R.",
312
+ ":STATUS",
313
+ ],
314
+ humanizers: [helpers.commas, undefined, undefined, helpers.commas],
315
+ },
316
+ )
317
+ }
318
+ console.info(
319
+ `^ Listed ${logs.length} out of ${totalLogs} randomness requests${
320
+ fromBlock
321
+ ? ` since block #${helpers.commas(fromBlock)}.`
322
+ : ` up until current block #${helpers.colors.lwhite(helpers.commas(blockNumber))}.`
323
+ }`,
324
+ )
325
+ } else {
326
+ console.info(
327
+ `^ No randomness requests${fromBlock ? ` since block #${helpers.colors.lwhite(helpers.commas(fromBlock))}.` : "."}`,
328
+ )
329
+ }
330
+ }
331
+
332
+ async function _invokeAdminTask(func, ...params) {
333
+ const receipt = await func(...params, {
334
+ // evmConfirmations: helpers.parseIntFromArgs(process.argv, `--confirmations`) || 2,
335
+ onTransaction: (txHash) => {
336
+ process.stdout.write(
337
+ ` - EVM transaction: ${helpers.colors.gray(txHash)} ... `,
338
+ )
339
+ },
340
+ onTransactionReceipt: () => {
341
+ process.stdout.write(`${helpers.colors.lwhite("OK")}\n`)
342
+ },
343
+ }).catch((err) => {
344
+ process.stdout.write(`${helpers.colors.mred("FAIL:\n")}`)
345
+ console.error(err)
346
+ process.exit(1)
347
+ })
348
+ if (receipt) {
349
+ console.info(
350
+ ` - EVM block number: ${helpers.colors.lwhite(helpers.commas(receipt?.blockNumber))}`,
351
+ )
352
+ console.info(
353
+ ` - EVM tx gas price: ${helpers.colors.lwhite(helpers.commas(receipt?.gasPrice))} weis`,
354
+ )
355
+ console.info(
356
+ ` - EVM tx fee: ${helpers.colors.lwhite(ethers.formatEther(receipt.fee))} ETH`,
357
+ )
358
+ const value = (await receipt.getTransaction()).value
359
+ console.info(
360
+ ` - EVM randomize fee: ${helpers.colors.lwhite(ethers.formatEther(value))} ETH`,
361
+ )
362
+ console.info(
363
+ ` - EVM effective gas: ${helpers.commas(Math.floor(Number((receipt.fee + value) / receipt.gasPrice)))} gas units`,
364
+ )
365
+ }
366
+ return receipt
367
+ }
@@ -0,0 +1,272 @@
1
+ const helpers = require("../helpers.cjs")
2
+ const moment = require("moment")
3
+ const prompt = require("inquirer").createPromptModule()
4
+
5
+ const { Witnet } = require("@witnet/sdk")
6
+ const { utils, WitOracle } = require("../../../dist/src")
7
+
8
+ const { DEFAULT_LIMIT, DEFAULT_SINCE } = helpers
9
+
10
+ module.exports = async (options = {}, args = []) => {
11
+ ;[args] = helpers.deleteExtraFlags(args)
12
+
13
+ const { limit, offset, parse, push, since } = options
14
+
15
+ const witOracle = await WitOracle.fromJsonRpcUrl(
16
+ `http://127.0.0.1:${options?.port || 8545}`,
17
+ options?.signer,
18
+ )
19
+
20
+ const { address, network, provider } = witOracle
21
+ helpers.traceHeader(`${network.toUpperCase()}`, helpers.colors.lcyan)
22
+
23
+ const symbol = utils.getEvmNetworkSymbol(network)
24
+ const artifact = await witOracle.getEvmImplClass()
25
+ const version = await witOracle.getEvmImplVersion()
26
+ console.info(
27
+ `> ${helpers.colors.lwhite(artifact)}: ${helpers.colors.lblue(address)} ${helpers.colors.blue(`[ v${version} ]`)}`,
28
+ )
29
+
30
+ if (push) {
31
+ const drTxHash = push
32
+ if (!utils.isHexStringOfLength(drTxHash, 32)) {
33
+ throw new Error(`invalid <WIT_DR_TX_HASH>: ${drTxHash}`)
34
+ } else if (!options?.into) {
35
+ throw new Error("--into <EVM_ADDRESS> must be specified")
36
+ }
37
+
38
+ console.info(
39
+ helpers.colors.lwhite("\n Fetching result to Wit/Oracle query:"),
40
+ )
41
+
42
+ const consumer = await witOracle.getWitOracleConsumerAt(options.into)
43
+ const kermit = await Witnet.KermitClient.fromEnv(options?.kermit)
44
+ console.info(` > Wit/Kermit provider: ${kermit.url}`)
45
+ const report = await kermit.getDataPushReport(drTxHash, network)
46
+
47
+ if (report?.query) {
48
+ console.info(` > Witnet DRT hash: ${report.hash}`)
49
+ console.info(` > Witnet RAD hash: ${report.query.rad_hash}`)
50
+ console.info(` > Witnet DRO hash: ${report.query.dro_hash}`)
51
+
52
+ if (report?.result) {
53
+ console.info(
54
+ ` > Witnet DRT result: ${JSON.stringify(utils.cbor.decode(utils.fromHexString(report.result.cbor_bytes)))}`,
55
+ )
56
+ console.info(
57
+ ` > Witnet DRT clock: ${moment.unix(report.result.timestamp).fromNow()}`,
58
+ )
59
+
60
+ if (!report.result.finalized) {
61
+ const user = await prompt([
62
+ {
63
+ message:
64
+ "> The Wit/Oracle query is not yet finalized. Proceed anyway ?",
65
+ name: "continue",
66
+ type: "confirm",
67
+ default: false,
68
+ },
69
+ ])
70
+ if (!user.continue) {
71
+ process.exit(0)
72
+ }
73
+ }
74
+
75
+ console.info(
76
+ `\n ${helpers.colors.lwhite("WitOracleConsumer")}: ${helpers.colors.lblue(options.into)}`,
77
+ )
78
+ const message = utils.abiEncodeDataPushReportMessage(report)
79
+ const digest = utils.abiEncodeDataPushReportDigest(report)
80
+ helpers.traceData(
81
+ " > Push data report: ",
82
+ message.slice(2),
83
+ 64,
84
+ "\x1b[90m",
85
+ )
86
+ console.info(` > Push data digest: ${digest.slice(2)}`)
87
+ console.info(` > Push data proof: ${report.evm_proof.slice(2)}`)
88
+
89
+ await consumer
90
+ .pushDataReport(report, {
91
+ confirmations: options?.confirmations || 1,
92
+ gasLimit: options?.gasLimit,
93
+ gasPrice: options?.gasPrice,
94
+ onDataPushReportTransaction: (txHash) => {
95
+ process.stdout.write(
96
+ ` > Pushing report => ${helpers.colors.gray(txHash)} ... `,
97
+ )
98
+ },
99
+ })
100
+ .catch((err) => {
101
+ process.stdout.write(`${helpers.colors.mred("FAIL")}\n`)
102
+ console.error(err)
103
+ })
104
+ process.stdout.write(`${helpers.colors.lwhite("OK")}\n`)
105
+ } else {
106
+ console.info(
107
+ " Skipped: the Wit/Oracle query exists but has not yet been solved.",
108
+ )
109
+ }
110
+ } else {
111
+ console.info(" Skipped: the Wit/Oracle query does not exist.")
112
+ }
113
+ }
114
+
115
+ // determine current block number
116
+ const blockNumber = await provider.getBlockNumber()
117
+
118
+ // determine fromBlock
119
+ let fromBlock
120
+ if (since === undefined || since < 0) {
121
+ fromBlock = BigInt(blockNumber) + BigInt(since ?? DEFAULT_SINCE)
122
+ } else {
123
+ fromBlock = BigInt(since ?? 0n)
124
+ }
125
+
126
+ // fetch events since specified block
127
+ let logs = await witOracle.filterWitOracleReportEvents({
128
+ fromBlock,
129
+ where: {
130
+ evmOrigin: options?.signer,
131
+ evmConsumer: options["filter-consumer"],
132
+ queryRadHash: options["filter-radHash"],
133
+ },
134
+ })
135
+
136
+ // count logs before last filter
137
+ const totalLogs = logs.length
138
+
139
+ // apply limit/offset filter
140
+ logs =
141
+ !since || BigInt(since) < 0n
142
+ ? logs
143
+ .slice(offset || 0)
144
+ .slice(0, limit || DEFAULT_LIMIT) // oldest first
145
+ : logs
146
+ .reverse()
147
+ .slice(offset || 0)
148
+ .slice(0, limit || DEFAULT_LIMIT) // latest first
149
+
150
+ // compute tx cost for each record
151
+ logs = await helpers.prompter(
152
+ Promise.all(
153
+ logs.map(async (log) => {
154
+ const receipt = await provider.getTransactionReceipt(
155
+ log.evmTransactionHash,
156
+ )
157
+ const transaction = await provider.getTransaction(
158
+ log.evmTransactionHash,
159
+ )
160
+ const evmTransactionCost =
161
+ transaction.value + receipt.gasPrice * receipt.gasUsed
162
+ return {
163
+ ...log,
164
+ evmTransactionCost,
165
+ }
166
+ }),
167
+ ),
168
+ )
169
+
170
+ if (logs.length > 0) {
171
+ if (!options["trace-back"]) {
172
+ helpers.traceTable(
173
+ logs.map((log) => [
174
+ log.evmBlockNumber,
175
+ `${log?.queryRadHash?.slice(2).slice(0, 6)}..${log?.queryRadHash.slice(-5)}`,
176
+ `${log.queryParams.witnesses}`,
177
+ `${Witnet.Coins.fromPedros(BigInt(log.queryParams.unitaryReward) * (3n + log.queryParams.witnesses)).toString(2)}`,
178
+ `${log.evmOrigin.slice(0, 8)}..${log.evmOrigin.slice(-4)}`,
179
+ `${log?.evmConsumer.slice(0, 8)}..${log?.evmConsumer.slice(-4)}`,
180
+ Number(Number(log?.evmTransactionCost || 0n) / 10 ** 18).toFixed(7),
181
+ parse
182
+ ? utils.cbor.decode(utils.fromHexString(log?.resultCborBytes))
183
+ : log?.resultCborBytes,
184
+ ]),
185
+ {
186
+ colors: [
187
+ helpers.colors.white,
188
+ helpers.colors.mgreen,
189
+ helpers.colors.green,
190
+ helpers.colors.green,
191
+ helpers.colors.mblue,
192
+ helpers.colors.mblue,
193
+ helpers.colors.gray,
194
+ parse ? helpers.colors.mcyan : helpers.colors.cyan,
195
+ ],
196
+ headlines: [
197
+ "EVM BLOCK:",
198
+ ":radon request",
199
+ "witnesses",
200
+ "witnet fees",
201
+ "EVM PUSHER",
202
+ "EVM CONSUMER",
203
+ `$${helpers.colors.lwhite(symbol)} COST`,
204
+ parse ? "REPORTED DATA" : ":REPORTED CBOR BYTES",
205
+ ],
206
+ humanizers: [helpers.commas],
207
+ },
208
+ )
209
+ } else {
210
+ logs = await helpers.prompter(
211
+ Promise.all(
212
+ logs.map(async (log) => {
213
+ const ethBlock = await witOracle.provider.getBlock(
214
+ log.evmBlockNumber,
215
+ )
216
+ return {
217
+ ...log,
218
+ ethBlockTimestamp: ethBlock.timestamp,
219
+ }
220
+ }),
221
+ ).catch((err) => console.error(err)),
222
+ )
223
+ helpers.traceTable(
224
+ logs.map((log) => [
225
+ log.evmBlockNumber,
226
+ log.witDrTxHash.slice(2),
227
+ moment
228
+ .duration(
229
+ moment
230
+ .unix(log.ethBlockTimestamp)
231
+ .diff(moment.unix(log.resultTimestamp)),
232
+ )
233
+ .humanize(),
234
+ log.evmTransactionHash,
235
+ ]),
236
+ {
237
+ colors: [
238
+ helpers.colors.white,
239
+ helpers.colors.mmagenta,
240
+ helpers.colors.magenta,
241
+ helpers.colors.gray,
242
+ ],
243
+ headlines: [
244
+ "EVM BLOCK:",
245
+ `DATA WITNESSING ACT ON ${helpers.colors.lwhite(`WITNET ${utils.isEvmNetworkMainnet(network) ? "MAINNET" : "TESTNET"}`)}`,
246
+ "T.T.R.",
247
+ "EVM DATA REPORTING TRANSACTION HASH",
248
+ ],
249
+ humanizers: [
250
+ helpers.commas,
251
+ undefined,
252
+ undefined,
253
+ undefined,
254
+ undefined,
255
+ undefined,
256
+ ],
257
+ },
258
+ )
259
+ }
260
+ console.info(
261
+ `^ Listed ${logs.length} out of ${totalLogs} pushed data reports${
262
+ fromBlock
263
+ ? ` since block #${helpers.commas(fromBlock)}.`
264
+ : ` up until current block #${helpers.colors.lwhite(helpers.commas(blockNumber))}.`
265
+ }`,
266
+ )
267
+ } else {
268
+ console.info(
269
+ `^ No data reports pushed${fromBlock ? ` since block #${helpers.colors.lwhite(helpers.commas(fromBlock))}.` : "."}`,
270
+ )
271
+ }
272
+ }