@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,466 @@
1
+ const helpers = require("../helpers.cjs")
2
+ const { WitOracle } = require("../../../dist/src")
3
+ const { Witnet } = require("@witnet/sdk")
4
+
5
+ const { execSync } = require("node:child_process")
6
+ const prompt = require("inquirer").createPromptModule()
7
+
8
+ const deployables = helpers.readWitnetJsonFiles(
9
+ "modals",
10
+ "requests",
11
+ "templates",
12
+ )
13
+
14
+ module.exports = async (flags = {}, params = []) => {
15
+ const [args] = helpers.deleteExtraFlags(params)
16
+
17
+ const witOracle = await WitOracle.fromJsonRpcUrl(
18
+ `http://127.0.0.1:${flags?.port || 8545}`,
19
+ flags?.signer,
20
+ )
21
+
22
+ const { force } = flags
23
+ const { network } = witOracle
24
+
25
+ if (!deployables.modals[network]) deployables.modals[network] = {}
26
+ if (!deployables.requests[network]) deployables.requests[network] = {}
27
+ if (!deployables.templates[network]) deployables.templates[network] = {}
28
+
29
+ const registry = await witOracle.getWitOracleRadonRegistry()
30
+ const deployer = await witOracle.getWitOracleRadonRequestFactory()
31
+
32
+ if (!flags?.force)
33
+ helpers.traceHeader(`${network.toUpperCase()}`, helpers.colors.lcyan)
34
+
35
+ let assets = flags?.module
36
+ ? require(`${flags.module}/assets`)
37
+ : helpers.importRadonAssets(flags)
38
+ if (!assets || Object.keys(assets).length === 0) {
39
+ throw new Error("No Radon assets declared just yet in witnet/assets.")
40
+ } else {
41
+ assets = clearEmptyBranches(network, assets, args, !flags?.all)
42
+ }
43
+
44
+ const selection = (
45
+ await selectWitnetArtifacts(registry, assets, args, " ", !flags?.all)
46
+ ).sort(([a], [b]) => (a > b) - (a < b))
47
+
48
+ if (selection.length > 0) {
49
+ for (const index in selection) {
50
+ const [key, color, asset] = selection[index]
51
+
52
+ if (asset instanceof Witnet.Radon.RadonModal) {
53
+ if (flags?.deploy) {
54
+ console.info()
55
+ let user
56
+ if (!force) {
57
+ user = await prompt([
58
+ {
59
+ message: `Deploy ${asset.constructor.name}::${color(key)} ?`,
60
+ name: "continue",
61
+ type: "confirm",
62
+ default: true,
63
+ },
64
+ ])
65
+ } else {
66
+ console.info(color(key))
67
+ }
68
+ if (force || user?.continue) {
69
+ let gasUsed = BigInt(0)
70
+ const modal = await deployer
71
+ .deployRadonRequestModal(asset, {
72
+ confirmations: 1,
73
+ onVerifyRadonRetrieval: (hash) => {
74
+ process.stdout.write(
75
+ ` > Verifying common data source => ${helpers.colors.gray(hash)} ... `,
76
+ )
77
+ },
78
+ onVerifyRadonRetrievalReceipt: (_hash, receipt) => {
79
+ gasUsed += receipt?.gasUsed || BigInt(0)
80
+ process.stdout.write(`${helpers.colors.lwhite("OK")}\n`)
81
+ },
82
+ onDeployRadonRequestModal: (address) => {
83
+ process.stdout.write(
84
+ ` > Replacing WitOracleRadonRequestModal => ${helpers.colors.mblue(address)} ... `,
85
+ )
86
+ },
87
+ onDeployRadonRequestModalReceipt: (receipt) => {
88
+ gasUsed += receipt?.gasUsed || BigInt(0)
89
+ process.stdout.write(`${helpers.colors.lwhite("OK")}\n`)
90
+ },
91
+ })
92
+ .catch((err) => {
93
+ process.stdout.write(`${helpers.colors.mred("FAIL")}`)
94
+ console.error(err)
95
+ throw err
96
+ })
97
+ if (gasUsed > 0) {
98
+ process.stdout.write(` > EVM cost: ${gasUsed} gas units.\n`)
99
+ }
100
+ deployables.modals[network][key] = modal.address
101
+ helpers.saveWitnetJsonFiles({ modals: deployables.modals })
102
+ }
103
+ }
104
+ if (flags?.decode || flags["dry-run"]) {
105
+ // todo: parse radon modal from evm contract
106
+ if (deployables.modals[network]?.[key]) {
107
+ console.info()
108
+ // if deployed, decode deployed bytecode
109
+ execSync(
110
+ `npx witsdk radon decode ${key} --headline ${network.toUpperCase()}::${key}`,
111
+ { stdio: "inherit", stdout: "inherit" },
112
+ )
113
+ } else {
114
+ // if not deployed, decode locally compiled bytecode
115
+ execSync(`npx witsdk radon decode ${key}`, {
116
+ stdio: "inherit",
117
+ stdout: "inherit",
118
+ })
119
+ }
120
+ }
121
+ } else if (asset instanceof Witnet.Radon.RadonTemplate) {
122
+ if (flags?.deploy) {
123
+ console.info()
124
+ let user
125
+ if (!force) {
126
+ user = await prompt([
127
+ {
128
+ message: `Deploy ${asset.constructor.name}::${color(key)} ?`,
129
+ name: "continue",
130
+ type: "confirm",
131
+ default: true,
132
+ },
133
+ ])
134
+ } else {
135
+ console.info(color(key))
136
+ }
137
+ if (force || user?.continue) {
138
+ let target
139
+ let gasUsed = BigInt(0)
140
+ const template = await deployer
141
+ .deployRadonRequestTemplate(asset, {
142
+ confirmations: 1,
143
+ onVerifyRadonRetrieval: (hash) => {
144
+ process.stdout.write(
145
+ ` > Verifying parameterized data source => ${helpers.colors.gray(hash)} ... `,
146
+ )
147
+ },
148
+ onVerifyRadonRetrievalReceipt: (_hash, receipt) => {
149
+ gasUsed += receipt?.gasUsed || BigInt(0)
150
+ process.stdout.write(`${helpers.colors.lwhite("OK")}\n`)
151
+ },
152
+ onDeployRadonRequestTemplate: (address) => {
153
+ target = address
154
+ process.stdout.write(
155
+ ` > Replacing WitOracleRadonRequestTemplate => ${helpers.colors.mblue(address)} ... `,
156
+ )
157
+ },
158
+ onDeployRadonRequestTemplateReceipt: (receipt) => {
159
+ gasUsed += receipt?.gasUsed || BigInt(0)
160
+ process.stdout.write(`${helpers.colors.lwhite("OK")}\n`)
161
+ },
162
+ })
163
+ .catch((err) => {
164
+ process.stdout.write(`${helpers.colors.mred("FAIL")}`)
165
+ console.error(err)
166
+ throw err
167
+ })
168
+ // process.stdout.write(` > WitOracleRadonRequestTemplate address: ${helpers.colors.mcyan(target)}\n`)
169
+ deployables.templates[network][key] = template.address
170
+ helpers.saveWitnetJsonFiles({ templates: deployables.templates })
171
+
172
+ const artifact =
173
+ await witOracle.getWitOracleRadonRequestTemplateAt(target)
174
+ for (const [sample, args] of Object.entries(asset?.samples)) {
175
+ await artifact
176
+ .verifyRadonRequest(args, {
177
+ onVerifyRadonRequest: (radHash) => {
178
+ process.stdout.write(
179
+ ` > Verifying RAD hash for ${helpers.colors.lwhite(`${sample}`)} => `,
180
+ )
181
+ process.stdout.write(
182
+ `${helpers.colors.green(radHash)} ... `,
183
+ )
184
+ },
185
+ onVerifyRadonRequestReceipt: async (receipt) => {
186
+ gasUsed += receipt?.gasUsed || BigInt(0)
187
+ process.stdout.write(`${helpers.colors.lwhite("OK")}\n`)
188
+ },
189
+ })
190
+ .catch((err) => {
191
+ process.stdout.write(`${helpers.colors.mred("FAIL")}\n`)
192
+ console.error(err)
193
+ })
194
+ .then((radHash) => {
195
+ deployables.requests[network][`${key}$${sample}`] = radHash
196
+ helpers.saveWitnetJsonFiles({
197
+ requests: deployables.requests,
198
+ })
199
+ })
200
+ }
201
+ if (gasUsed > 0) {
202
+ process.stdout.write(` > EVM cost: ${gasUsed} gas units.\n`)
203
+ }
204
+ }
205
+ }
206
+ if (flags?.decode || flags["dry-run"]) {
207
+ if (deployables.templates[network]?.[key]) {
208
+ // todo: parse radon template from evm contract
209
+ console.info()
210
+ // if deployed, decode deployed bytecode
211
+ execSync(
212
+ `npx witsdk radon decode ${key} --headline ${network.toUpperCase()}::${key}`,
213
+ { stdio: "inherit", stdout: "inherit" },
214
+ )
215
+ } else {
216
+ // if not deployed, decode locally compiled bytecode
217
+ execSync(`npx witsdk radon decode ${key}`, {
218
+ stdio: "inherit",
219
+ stdout: "inherit",
220
+ })
221
+ }
222
+ }
223
+ } else if (asset instanceof Witnet.Radon.RadonRequest) {
224
+ if (flags?.deploy) {
225
+ // && (!deployables.requests[network] || deployables.requests[network][key] !== asset.radHash)) {
226
+ console.info()
227
+ let user
228
+ if (!force) {
229
+ user = await prompt([
230
+ {
231
+ message: `Formally verify RadonRequest::${color(key)} ?`,
232
+ name: "continue",
233
+ type: "confirm",
234
+ default: true,
235
+ },
236
+ ])
237
+ } else {
238
+ console.info(helpers.colors.lwhite(` ${key}`))
239
+ }
240
+ if (force || user?.continue) {
241
+ let gasUsed = BigInt(0)
242
+ const radHash = await registry
243
+ .verifyRadonRequest(asset, {
244
+ confirmations: 1,
245
+ onVerifyRadonRetrieval: (hash) => {
246
+ process.stdout.write(
247
+ ` > Verifying new data source => ${helpers.colors.gray(hash)} ... `,
248
+ )
249
+ },
250
+ onVerifyRadonRetrievalReceipt: (_hash, receipt) => {
251
+ gasUsed += receipt?.gasUsed || BigInt(0)
252
+ process.stdout.write(helpers.colors.lwhite("OK\n"))
253
+ },
254
+ onVerifyRadonRequest: (hash) => {
255
+ process.stdout.write(
256
+ ` > Verifying new RAD hash => ${helpers.colors.mgreen(hash)} ... `,
257
+ )
258
+ },
259
+ onVerifyRadonRequestReceipt: (receipt) => {
260
+ gasUsed += receipt?.gasUsed || BigInt(0)
261
+ process.stdout.write(helpers.colors.lwhite("OK\n"))
262
+ },
263
+ })
264
+ .catch((err) => {
265
+ process.stdout.write(helpers.colors.mred("FAIL"))
266
+ console.error(err)
267
+ throw err
268
+ })
269
+ if (gasUsed > 0) {
270
+ process.stdout.write(` > EVM cost: ${gasUsed} gas units.\n`)
271
+ } else {
272
+ process.stdout.write(
273
+ ` > RAD hash: ${helpers.colors.green(radHash)}\n`,
274
+ )
275
+ }
276
+ if (radHash) {
277
+ deployables.requests[network][key] = radHash
278
+ helpers.saveWitnetJsonFiles({ requests: deployables.requests })
279
+ }
280
+ }
281
+ }
282
+ if (flags["dry-run"] || flags?.decode) {
283
+ console.info()
284
+ if (deployables.requests[network][key] !== undefined) {
285
+ const bytecode = await registry.lookupRadonRequestBytecode(
286
+ deployables.requests[network][key],
287
+ )
288
+ execSync(
289
+ `npx witsdk radon ${flags["dry-run"] ? "dry-run --verbose" : "decode"} ${bytecode} --headline ${network.toUpperCase()}::${key}`,
290
+ { stdio: "inherit", stdout: "inherit" },
291
+ )
292
+ } else {
293
+ execSync(
294
+ `npx witsdk radon ${flags["dry-run"] ? "dry-run --verbose" : "decode"} ${key}`,
295
+ { stdio: "inherit", stdout: "inherit" },
296
+ )
297
+ }
298
+ }
299
+ }
300
+ }
301
+ }
302
+ }
303
+
304
+ function clearEmptyBranches(network, node, args, filter) {
305
+ if (node) {
306
+ const assets = Object.fromEntries(
307
+ Object.entries(node)
308
+ .map(([key, value]) => {
309
+ if (
310
+ (!filter ||
311
+ args.find(
312
+ (arg) => key.toLowerCase().indexOf(arg.toLowerCase()) >= 0,
313
+ ) ||
314
+ deployables.modals[network][key] !== undefined ||
315
+ deployables.requests[network][key] !== undefined ||
316
+ deployables.templates[network][key] !== undefined) &&
317
+ (value instanceof Witnet.Radon.RadonModal ||
318
+ value instanceof Witnet.Radon.RadonTemplate ||
319
+ value instanceof Witnet.Radon.RadonRequest)
320
+ ) {
321
+ return [key, value]
322
+ } else if (typeof value === "object") {
323
+ if (countWitnetArtifacts(network, value, args, filter) > 0) {
324
+ return [key, clearEmptyBranches(network, value, args, filter)]
325
+ } else {
326
+ return [key, undefined]
327
+ }
328
+ } else {
329
+ return [key, undefined]
330
+ }
331
+ })
332
+ .filter(([, value]) => value !== undefined),
333
+ )
334
+ if (Object.keys(assets).length > 0) {
335
+ return assets
336
+ } else {
337
+ return undefined
338
+ }
339
+ }
340
+ }
341
+
342
+ function countWitnetArtifacts(network, assets, args, filter = false) {
343
+ let counter = 0
344
+ Object.entries(assets).forEach(([key, value]) => {
345
+ if (
346
+ (value instanceof Witnet.Radon.RadonModal ||
347
+ value instanceof Witnet.Radon.RadonRequest ||
348
+ value instanceof Witnet.Radon.RadonTemplate ||
349
+ value instanceof Witnet.Radon.RadonRetrieval) &&
350
+ (!filter ||
351
+ !args ||
352
+ args.length === 0 ||
353
+ args.find((arg) => key.toLowerCase().indexOf(arg.toLowerCase()) >= 0) ||
354
+ deployables.modals[network][key] !== undefined ||
355
+ deployables.requests[network][key] !== undefined ||
356
+ deployables.templates[network][key] !== undefined)
357
+ ) {
358
+ counter++
359
+ } else if (typeof value === "object") {
360
+ counter += countWitnetArtifacts(network, value, args)
361
+ }
362
+ })
363
+ return counter
364
+ }
365
+
366
+ async function selectWitnetArtifacts(
367
+ registry,
368
+ assets = {},
369
+ args,
370
+ indent = "",
371
+ filter = false,
372
+ ) {
373
+ const network = registry.network
374
+ const selection = []
375
+ const prefix = `${indent}`
376
+ for (const index in Object.keys(assets)) {
377
+ const key = Object.keys(assets)[index]
378
+ const asset = assets[key]
379
+ const isLast = parseInt(index, 10) === Object.keys(assets).length - 1
380
+ const found = args.find(
381
+ (arg) => key.toLowerCase().indexOf(arg.toLowerCase()) >= 0,
382
+ )
383
+ let color = helpers.colors.white
384
+ if (asset instanceof Witnet.Radon.RadonRequest) {
385
+ color = found
386
+ ? deployables.requests[network][key] !== undefined
387
+ ? helpers.colors.lcyan
388
+ : helpers.colors.myellow
389
+ : deployables.requests[network][key] !== undefined
390
+ ? helpers.colors.cyan
391
+ : helpers.colors.gray
392
+ if (deployables.requests[network][key] !== undefined) {
393
+ const radHash = asset.radHash
394
+ try {
395
+ await registry.lookupRadonRequest(radHash)
396
+ if (deployables.requests[network][key] !== radHash) {
397
+ // already verified but with a different RAD hash
398
+ color = found ? helpers.colors.mred : helpers.colors.red
399
+ }
400
+ } catch {
401
+ color = found ? helpers.colors.white : helpers.colors.gray
402
+ }
403
+ }
404
+ if (
405
+ !filter ||
406
+ found ||
407
+ deployables.requests[network][key] !== undefined
408
+ ) {
409
+ console.info(`${prefix}${color(key)}`)
410
+ if (isLast) {
411
+ console.info(`${prefix}`)
412
+ }
413
+ }
414
+ } else if (
415
+ asset instanceof Witnet.Radon.RadonTemplate ||
416
+ asset instanceof Witnet.Radon.RadonModal
417
+ ) {
418
+ color = found
419
+ ? deployables.modals[network][key] !== undefined ||
420
+ deployables.templates[network][key] !== undefined
421
+ ? helpers.colors.lcyan
422
+ : helpers.colors.myellow
423
+ : deployables.modals[network][key] !== undefined ||
424
+ deployables.templates[network][key] !== undefined
425
+ ? helpers.colors.cyan
426
+ : helpers.colors.gray
427
+ // todo: lookup whether radon template was already deployed on a different address ?
428
+ if (
429
+ !filter ||
430
+ found ||
431
+ deployables.modals[network][key] !== undefined ||
432
+ deployables.templates[network][key] !== undefined
433
+ ) {
434
+ console.info(`${prefix}${color(key)}`)
435
+ if (isLast) {
436
+ console.info(`${prefix}`)
437
+ }
438
+ }
439
+
440
+ // } else if (asset instanceof Witnet.Radon.RadonRetrieval) {
441
+ // const argsCount = asset.argsCount
442
+ // if (!filter || found) {
443
+ // console.info(`${prefix}${color(key)} ${argsCount > 0 ? helpers.colors.green(`(${argsCount} args)`) : ""}`)
444
+ // if (isLast) {
445
+ // console.info(`${prefix}`)
446
+ // }
447
+ // }
448
+ } else if (
449
+ typeof asset === "object" &&
450
+ countWitnetArtifacts(network, asset, args, filter) > 0
451
+ ) {
452
+ console.info(`${indent}${isLast ? "└─ " : "├─ "}${key}`)
453
+ selection.push(
454
+ ...(await selectWitnetArtifacts(
455
+ registry,
456
+ asset,
457
+ args,
458
+ !isLast ? `${indent}│ ` : `${indent} `,
459
+ filter,
460
+ )),
461
+ )
462
+ }
463
+ if (found) selection.push([key, color, asset])
464
+ }
465
+ return selection
466
+ }
@@ -0,0 +1,100 @@
1
+ const helpers = require("../helpers.cjs")
2
+ const { utils } = require("../../../dist/src")
3
+ const { JsonRpcProvider } = require("ethers")
4
+
5
+ const deployables = helpers.readWitnetJsonFiles("templates", "modals")
6
+
7
+ module.exports = async (flags = {}, params = []) => {
8
+ let [args] = helpers.deleteExtraFlags(params)
9
+
10
+ let provider
11
+ try {
12
+ provider = new JsonRpcProvider(`http://127.0.0.1:${flags?.port || 8545}`)
13
+ } catch (err) {
14
+ throw new Error(
15
+ `Unable to connect to local ETH/RPC gateway: ${err.message}`,
16
+ )
17
+ }
18
+
19
+ const chainId = (await provider.getNetwork()).chainId
20
+ const network = utils.getEvmNetworkByChainId(chainId)
21
+ if (!network) {
22
+ throw new Error(`Connected to unsupported EVM chain id: ${chainId}`)
23
+ }
24
+ helpers.traceHeader(`${network.toUpperCase()}`, helpers.colors.lcyan)
25
+
26
+ let artifacts = {}
27
+ if (flags?.templates || flags?.modals) {
28
+ const assets = helpers.importRadonAssets(flags)
29
+ if (flags?.templates) {
30
+ const dict = utils.flattenRadonTemplates(assets)
31
+ if (Object.keys(dict).length > 0 && deployables.templates[network]) {
32
+ artifacts.templates = Object.fromEntries(
33
+ Object.entries(deployables.templates[network])
34
+ .filter(([key]) => dict[key] !== undefined)
35
+ .map(([key, address]) => [key, { address }]),
36
+ )
37
+ }
38
+ }
39
+ if (flags?.modals) {
40
+ const dict = utils.flattenRadonModals(assets)
41
+ if (Object.keys(dict).length > 0 && deployables.modals[network]) {
42
+ artifacts.modals = Object.fromEntries(
43
+ Object.entries(deployables.modals[network])
44
+ .filter(([key]) => dict[key] !== undefined)
45
+ .map(([key, address]) => [key, { address }]),
46
+ )
47
+ }
48
+ }
49
+ } else {
50
+ const framework = await helpers.prompter(
51
+ utils
52
+ .fetchWitOracleFramework(provider)
53
+ .catch((err) => console.error(err)),
54
+ )
55
+ artifacts = Object.entries(framework)
56
+ if (!args || args.length === 0) {
57
+ args = ["WitOracle"]
58
+ }
59
+ }
60
+ helpers.traceTable(
61
+ artifacts.map(([key, obj]) => {
62
+ const match = includes(args, key)
63
+ return [
64
+ match ? helpers.colors.lwhite(key) : helpers.colors.white(key),
65
+ match
66
+ ? helpers.colors.mblue(obj.address)
67
+ : helpers.colors.blue(obj.address),
68
+ match
69
+ ? helpers.colors.mgreen(obj?.interfaceId || "")
70
+ : helpers.colors.green(obj?.interfaceId || ""),
71
+ ...(flags?.verbose
72
+ ? [
73
+ match
74
+ ? helpers.colors.myellow(obj?.class || "")
75
+ : helpers.colors.yellow(obj?.class || ""),
76
+ match
77
+ ? helpers.colors.white(obj?.version || "")
78
+ : helpers.colors.gray(obj?.version || ""),
79
+ ]
80
+ : []),
81
+ ]
82
+ }),
83
+ {
84
+ headlines: [
85
+ ":WIT/ORACLE FRAMEWORK",
86
+ ":EVM CONTRACT ADDRESS",
87
+ ":EVM SPECS",
88
+ ...(flags?.verbose ? [":EVM CONTRACT CLASS", ":EVM VERSION TAG"] : []),
89
+ ],
90
+ },
91
+ )
92
+ }
93
+
94
+ const includes = (selection, key) => {
95
+ return (
96
+ selection.filter((artifact) =>
97
+ key.toLowerCase().endsWith(artifact.toLowerCase()),
98
+ ).length > 0
99
+ )
100
+ }
@@ -0,0 +1,26 @@
1
+ const helpers = require("../helpers.cjs")
2
+
3
+ const { spawn } = require("node:child_process")
4
+ const os = require("node:os")
5
+
6
+ module.exports = async (flags = {}, args = []) => {
7
+ ;[args] = helpers.deleteExtraFlags(args)
8
+ const network = args[0]
9
+ if (!network) {
10
+ throw new Error("No EVM network was specified.")
11
+ } else if (network && !helpers.supportsNetwork(network)) {
12
+ throw new Error(`Unsupported network "${network}"`)
13
+ } else {
14
+ const shell = spawn(
15
+ os.type() === "Windows_NT" ? "npx.cmd" : "npx",
16
+ ["ethrpc", network, flags?.port || 8545, flags?.remote],
17
+ { shell: true },
18
+ )
19
+ shell.stdout.on("data", (x) => {
20
+ process.stdout.write(x.toString())
21
+ })
22
+ shell.stderr.on("data", (x) => {
23
+ process.stderr.write(x.toString())
24
+ })
25
+ }
26
+ }
@@ -0,0 +1,63 @@
1
+ const { JsonRpcProvider } = require("ethers")
2
+ const { utils } = require("../../../dist/src")
3
+ const helpers = require("../helpers.cjs")
4
+
5
+ module.exports = async (flags = {}, [ecosystem]) => {
6
+ if (ecosystem === undefined) {
7
+ let provider
8
+ try {
9
+ provider = new JsonRpcProvider(`http://127.0.0.1:${flags?.port || 8545}`)
10
+ const chainId = (await provider.getNetwork()).chainId
11
+ ecosystem = utils.getEvmNetworkByChainId(chainId)
12
+ } catch (_err) {}
13
+ }
14
+ const networks = Object.fromEntries(
15
+ Object.entries(helpers.supportedNetworks())
16
+ .filter(([, config]) => {
17
+ return (
18
+ !flags ||
19
+ (flags?.mainnets && config.mainnet) ||
20
+ (flags?.testnets && !config.mainnet) ||
21
+ (!flags?.mainnets && !flags?.testnets)
22
+ )
23
+ })
24
+ .map(([network, config]) => [
25
+ network,
26
+ {
27
+ browser: config?.verified,
28
+ id: config?.network_id,
29
+ mainnet: config?.mainnet,
30
+ match:
31
+ ecosystem &&
32
+ network.toLowerCase().indexOf(ecosystem.toLowerCase()) > -1,
33
+ name: network,
34
+ symbol: config?.symbol,
35
+ },
36
+ ]),
37
+ )
38
+ helpers.traceTable(
39
+ Object.values(networks).map((network) => [
40
+ network.match
41
+ ? helpers.colors.mcyan(network.name)
42
+ : helpers.colors.cyan(network.name),
43
+ network.match
44
+ ? helpers.colors.lwhite(network.symbol)
45
+ : helpers.colors.white(network.symbol),
46
+ network.match
47
+ ? helpers.colors.myellow(helpers.commas(network.id))
48
+ : helpers.colors.yellow(helpers.commas(network.id)),
49
+ network.match
50
+ ? helpers.colors.white(network.browser || "")
51
+ : helpers.colors.gray(network.browser || ""),
52
+ ]),
53
+ {
54
+ headlines: [
55
+ ":Network",
56
+ ":Fee token",
57
+ "Network Id",
58
+ ":Verified Block Explorer",
59
+ ],
60
+ },
61
+ )
62
+ console.info(`^ Listed ${Object.keys(networks).length} networks.`)
63
+ }