@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,352 @@
1
+ const helpers = require("../helpers.cjs")
2
+ const fs = require("node:fs")
3
+ const inquirer = require("inquirer")
4
+ const path = require("node:path")
5
+
6
+ const { supportsNetwork, supportedEcosystems, supportedNetworks } =
7
+ require("@witnet/solidity").default
8
+
9
+ const MODULE_WITNET_PATH =
10
+ process.env.WITNET_SOLIDITY_MODULE_PATH ||
11
+ "node_modules/witnet-solidity/witnet"
12
+
13
+ const camelizeDashedString = (str) =>
14
+ str
15
+ .split("-")
16
+ .map((part) => capitalizeFirstLetter(part))
17
+ .join("")
18
+ const capitalizeFirstLetter = (str) =>
19
+ str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()
20
+
21
+ module.exports = async (flags = {}) => {
22
+ const network = flags?.network
23
+ if (network && !supportsNetwork(network)) {
24
+ throw new Error(`Unsupported network "${network}"`)
25
+ }
26
+ let contractPath = "contracts/"
27
+ let contractName = flags?.contract || ""
28
+ let isFirstMockup = true
29
+ let namedByUser = false
30
+ if (contractName !== "") {
31
+ if (contractName.indexOf("/") > -1) {
32
+ contractPath = contractName.slice(0, contractName.lastIndexOf("/"))
33
+ contractName = contractName.slice(contractName.lastIndexOf("/") + 1)
34
+ }
35
+ if (fs.existsSync(contractPath + contractName)) {
36
+ console.info("Sorry, output file already exists:", contractName)
37
+ process.exit(1)
38
+ } else if (!fs.existsSync(contractPath)) {
39
+ fs.mkdirSync(contractPath)
40
+ }
41
+ if (contractName.endsWith(".sol")) contractName = contractName.slice(0, -4)
42
+ contractName = camelizeDashedString(contractName)
43
+ namedByUser = true
44
+ }
45
+ if (contractName === "") {
46
+ const basename = `WitOracle${camelizeDashedString(path.basename(process.cwd()))}`
47
+ if (!fs.existsSync(contractPath)) {
48
+ fs.mkdirSync(contractPath)
49
+ }
50
+ const files = fs
51
+ .readdirSync(contractPath)
52
+ .filter((filename) => filename.startsWith(basename))
53
+ contractName = `${basename}${files.length + 1}`
54
+ isFirstMockup = files.length === 0
55
+ }
56
+ let answers = {
57
+ ...(await inquirer.prompt([
58
+ {
59
+ type: "rawlist",
60
+ name: "usage",
61
+ message: `What will ${
62
+ isFirstMockup
63
+ ? "your first"
64
+ : namedByUser
65
+ ? `the ${contractName}`
66
+ : "your next"
67
+ } Solidity contract be using the Wit/Oracle for?`,
68
+ choices: [
69
+ "Randomness => unmalleable source of entropy.",
70
+ "Price feeds => based on multiple, reliable and public data sources.",
71
+ "Public data => retrieved from a single or multiple providers on the Internet.",
72
+ ],
73
+ },
74
+ ])),
75
+ }
76
+ const appKind = answers.usage.split(" ")[0]
77
+ switch (appKind) {
78
+ case "Randomness": {
79
+ answers = {
80
+ ...(await inquirer.prompt({
81
+ type: "list",
82
+ name: "randomness",
83
+ message:
84
+ "Would you rather rely on the WitRandomness appliance or handle resolution of randomness requests at a lower level?",
85
+ choices: [
86
+ "Yes => use the WitRandomness appliance (randomize results need to be polled).",
87
+ "No => I know how to handle randomness request callbacks, attend eventual faulty requests and protect against front-run attacks.",
88
+ ],
89
+ })),
90
+ ...answers,
91
+ }
92
+ break
93
+ }
94
+ case "Public": {
95
+ answers = {
96
+ ...(await inquirer.prompt({
97
+ type: "list",
98
+ name: "dynamic",
99
+ message:
100
+ "Will the underlying data sources or parameters vary in time",
101
+ choices: [
102
+ "Yes => either the data sources, or some request parameters, will vary in time.",
103
+ "No => the data sources and parameters will remain constant.",
104
+ ],
105
+ })),
106
+ ...answers,
107
+ }
108
+ if (answers?.dynamic.split(" ")[0] === "Yes") {
109
+ answers = {
110
+ ...(await inquirer.prompt({
111
+ type: "list",
112
+ name: "parameterized",
113
+ message:
114
+ "Will your contract have to deal with data request parameters?",
115
+ choices: [
116
+ "Yes => my contract will have to generate actual parameter values onchain.",
117
+ "No => Witnet-compliant data request bytecode will be provided by some Externally Owned Account.",
118
+ ],
119
+ })),
120
+ ...answers,
121
+ }
122
+ }
123
+ if (
124
+ answers?.dynamic.split(" ")[0] === "No" ||
125
+ answers?.parameterized.split(" ")[0] === "Yes"
126
+ ) {
127
+ answers = {
128
+ ...(await inquirer.prompt({
129
+ type: "list",
130
+ name: "callbacks",
131
+ message:
132
+ "How would you like your contract to fetch data provided from the Wit/Oracle?",
133
+ choices: [
134
+ "Asynchronously => my contract will eventually read the result from the WitOracle contract.",
135
+ "Synchronously => my contract is to be called as soon as data is reported from the Wit/Oracle.",
136
+ ],
137
+ })),
138
+ ...answers,
139
+ }
140
+ }
141
+ break
142
+ }
143
+ }
144
+ // console.info()
145
+ if (
146
+ answers?.randomness?.split(" ")[0] === "No" ||
147
+ answers?.callbacks?.split(" ")[0] === "Synchronously" ||
148
+ answers?.parameterized?.split(" ")[0] === "No"
149
+ ) {
150
+ let callbackGasLimit
151
+ do {
152
+ callbackGasLimit = parseInt(
153
+ (
154
+ await inquirer.prompt({
155
+ type: "number",
156
+ name: "callbackGasLimit",
157
+ message:
158
+ "Please, specify the maximum gas that you expect your Witnet-callback methods to consume:",
159
+ default: 250000,
160
+ })
161
+ ).callbackGasLimit,
162
+ 10,
163
+ )
164
+ } while (!callbackGasLimit)
165
+ answers = { callbackGasLimit, ...answers }
166
+ }
167
+ let importWitnetMocks = ""
168
+ if (
169
+ appKind === "Randomness" ||
170
+ appKind === "Price" ||
171
+ answers?.parameterized?.split(" ")[0] === "No"
172
+ ) {
173
+ // answers = {
174
+ // ...await inquirer.prompt({
175
+ // type: "confirm",
176
+ // name: "includeMocks",
177
+ // message: "Do you intend to include your new contract within unitary Solidity tests?",
178
+ // default: false,
179
+ // }),
180
+ // ...answers,
181
+ // }
182
+ answers.includeMocks = false
183
+ if (!answers.includeMocks) {
184
+ const artifact =
185
+ appKind === "Price"
186
+ ? "apps.WitPriceFeeds"
187
+ : answers?.randomness?.split(" ")[0] === "Yes"
188
+ ? "apps.WitRandomnessV2"
189
+ : "core.WitOracle"
190
+ const findings = []
191
+ if (!network) {
192
+ const choices = supportedEcosystems().map((e) => e.toUpperCase())
193
+ answers = {
194
+ ...(await inquirer.prompt({
195
+ type: "checkbox",
196
+ name: "ecosystems",
197
+ message:
198
+ "Please, select the ecosystem(s) where you intend to deploy this new contract:",
199
+ choices,
200
+ pageSize: 32,
201
+ loop: true,
202
+ validate: (ans) => {
203
+ return ans.length > 0
204
+ },
205
+ })),
206
+ ...answers,
207
+ }
208
+ answers?.ecosystems.forEach((ecosystem) => {
209
+ Object.keys(supportedNetworks(ecosystem)).forEach((network) => {
210
+ const addrs = helpers.flattenObject(
211
+ helpers.getNetworkAddresses(network),
212
+ )
213
+ const artifactAddr = addrs[artifact]
214
+ if (artifactAddr && !findings.includes(artifactAddr)) {
215
+ findings.push(artifactAddr)
216
+ }
217
+ })
218
+ })
219
+ } else {
220
+ const addrs = helpers.flattenObject(
221
+ helpers.getNetworkAddresses(network),
222
+ )
223
+ if (addrs[artifact]) {
224
+ findings.push(addrs[artifact])
225
+ }
226
+ }
227
+ if (findings.length === 1) {
228
+ answers = {
229
+ ...answers,
230
+ witnetAddress: findings[0],
231
+ }
232
+ } else if (findings.length === 0) {
233
+ throw Error(
234
+ `Sorry, required ${artifact} contract is not available on selected ecosystems: ${answers?.ecosystems}`,
235
+ )
236
+ }
237
+ } else {
238
+ importWitnetMocks =
239
+ '\nimport "@witnet/solidity/contracts/mocks/WitMockedOracle.sol";'
240
+ }
241
+ }
242
+
243
+ let baseFeeOverhead = 5 // 5%
244
+ answers = {
245
+ ...(await inquirer.prompt([
246
+ {
247
+ type: "rawlist",
248
+ name: "overhead",
249
+ message:
250
+ "How much extra fee would you pay as to to prevent EVM gas price variations affecting queries resolution time?",
251
+ choices: [
252
+ "Average (+15%)",
253
+ "Generous (+30%)",
254
+ "Precautious (+50%)",
255
+ "Stingy (+5%)",
256
+ ],
257
+ },
258
+ ])),
259
+ ...answers,
260
+ }
261
+ switch (answers.overhead.split(" ")[0].toLowerCase()) {
262
+ case "average":
263
+ baseFeeOverhead = 15
264
+ break
265
+ case "generous":
266
+ baseFeeOverhead = 30
267
+ break
268
+ case "precautious":
269
+ baseFeeOverhead = 50
270
+ break
271
+ }
272
+
273
+ let constructorParams = ""
274
+ let witnetAddress = ""
275
+ let templateFile = `${MODULE_WITNET_PATH}/contracts/`
276
+ switch (appKind) {
277
+ case "Randomness": {
278
+ if (answers?.randomness?.split(" ")[0] === "Yes") {
279
+ if (!answers?.witnetAddress) {
280
+ constructorParams = "WitRandomness _witnetRandomness"
281
+ witnetAddress = "_witnetRandomness"
282
+ } else {
283
+ witnetAddress = `WitRandomness(${answers.witnetAddress})`
284
+ }
285
+ templateFile += "_UsingRandomness.tsol"
286
+ } else {
287
+ if (!answers?.witnetAddress) {
288
+ constructorParams = "WitOracle _witOracle"
289
+ witnetAddress = "_witOracle"
290
+ } else {
291
+ witnetAddress = `WitOracle(${answers.witnetAddress})`
292
+ }
293
+ templateFile += "_RandomnessRequestConsumer.tsol"
294
+ }
295
+ break
296
+ }
297
+ case "Price": {
298
+ if (!answers?.witnetAddress) {
299
+ constructorParams = "WitPriceFeeds _witnetPriceFeeds"
300
+ witnetAddress = "_witnetPriceFeeds"
301
+ } else {
302
+ witnetAddress = `WitPriceFeeds(${answers.witnetAddress})`
303
+ }
304
+ templateFile += "_UsingPriceFeeds.tsol"
305
+ break
306
+ }
307
+ case "Public": {
308
+ if (answers?.dynamic.split(" ")[0] === "Yes") {
309
+ if (answers.parameterized.split(" ")[0] === "Yes") {
310
+ constructorParams =
311
+ "WitOracleRadonRequestTemplate _witOracleRequestTemplate"
312
+ witnetAddress = "_witOracleRequestTemplate"
313
+ templateFile +=
314
+ answers?.callbacks.split(" ")[0] === "Synchronously"
315
+ ? "_RequestTemplateConsumer.tsol"
316
+ : "_UsingRequestTemplate.tsol"
317
+ } else {
318
+ if (!answers?.witnetAddress) {
319
+ constructorParams = "WitOracle _witOracle"
320
+ witnetAddress = "_witOracle"
321
+ } else {
322
+ witnetAddress = `WitOracle(${answers.witnetAddress})`
323
+ }
324
+ templateFile += "_Consumer.tsol"
325
+ }
326
+ } else {
327
+ constructorParams = "WitOracleRequest _witOracleRequest"
328
+ witnetAddress = "_witOracleRequest"
329
+ templateFile +=
330
+ answers?.callbacks.split(" ")[0] === "Synchronously"
331
+ ? "_RequestConsumer.tsol"
332
+ : "_UsingRequest.tsol"
333
+ }
334
+ break
335
+ }
336
+ }
337
+
338
+ const solidity = fs
339
+ .readFileSync(templateFile, "utf-8")
340
+ .replaceAll("$_importWitnetMocks", importWitnetMocks)
341
+ .replaceAll("$_contractName", contractName)
342
+ .replaceAll("$_constructorParams", constructorParams)
343
+ .replaceAll("$_witnetAddress", witnetAddress)
344
+ .replaceAll("$_baseFeeOverhead", baseFeeOverhead)
345
+ .replaceAll("$_callbackGasLimit", answers.callbackGasLimit)
346
+
347
+ const solidityPathFileName = `${contractPath}${contractName}.sol`
348
+ fs.writeFileSync(solidityPathFileName, solidity)
349
+ console.info()
350
+ console.info("Awesome! Your new contract was just created here:")
351
+ console.info(`\x1b[35m${contractPath}\x1b[1;35m${contractName}.sol\x1b[0m`)
352
+ }