@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.
- package/LICENSE +2 -2
- package/build/contracts/Bech32.json +1 -1
- package/build/contracts/Clonable.json +1 -1
- package/build/contracts/Context.json +1 -1
- package/build/contracts/Create3.json +1 -1
- package/build/contracts/ERC165.json +1 -1
- package/build/contracts/Escrowable.json +1 -1
- package/build/contracts/IChainlinkAggregatorV3.json +1 -1
- package/build/contracts/IERC165.json +1 -1
- package/build/contracts/IERC20.json +1 -1
- package/build/contracts/IERC2362.json +1 -1
- package/build/contracts/IPythChainlinkAggregatorV3.json +1 -1
- package/build/contracts/IWitAppliance.json +1 -1
- package/build/contracts/IWitOracle.json +1 -1
- package/build/contracts/IWitOracleAppliance.json +1 -1
- package/build/contracts/IWitOracleConsumer.json +1 -1
- package/build/contracts/IWitOracleConsumerLegacy.json +1 -1
- package/build/contracts/IWitOracleLegacy.json +1 -1
- package/build/contracts/IWitOracleQueriable.json +1 -1
- package/build/contracts/IWitOracleQueriableConsumer.json +1 -1
- package/build/contracts/IWitOracleQueriableEvents.json +1 -1
- package/build/contracts/IWitOracleQueriableExperimental.json +1 -1
- package/build/contracts/IWitOracleQueriableTrustableReporter.json +1 -1
- package/build/contracts/IWitOracleQueriableTrustlessReporter.json +1 -1
- package/build/contracts/IWitOracleRadonRegistry.json +1 -1
- package/build/contracts/IWitOracleRadonRegistryEvents.json +1 -1
- package/build/contracts/IWitOracleRadonRegistryLegacy.json +1 -1
- package/build/contracts/IWitOracleRadonRequestFactory.json +1 -1
- package/build/contracts/IWitOracleRadonRequestModal.json +1 -1
- package/build/contracts/IWitOracleRadonRequestTemplate.json +1 -1
- package/build/contracts/IWitOracleRequest.json +1 -1
- package/build/contracts/IWitOracleRequestFactory.json +1 -1
- package/build/contracts/IWitOracleRequestFactoryEvents.json +1 -1
- package/build/contracts/IWitOracleRequestTemplate.json +1 -1
- package/build/contracts/IWitOracleTrustableAdmin.json +1 -1
- package/build/contracts/IWitOracleTrustless.json +1 -1
- package/build/contracts/IWitPriceFeeds.json +1 -1
- package/build/contracts/IWitPriceFeedsAdmin.json +1 -1
- package/build/contracts/IWitPriceFeedsConsumer.json +1 -1
- package/build/contracts/IWitPriceFeedsEvents.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacy.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacyAdmin.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacySolver.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacySolverFactory.json +1 -1
- package/build/contracts/IWitPriceFeedsTypes.json +1 -1
- package/build/contracts/IWitPyth.json +1 -1
- package/build/contracts/IWitPythChainlinkAggregator.json +1 -1
- package/build/contracts/IWitPythErrors.json +1 -1
- package/build/contracts/IWitPythEvents.json +1 -1
- package/build/contracts/IWitPythReporter.json +1 -1
- package/build/contracts/IWitRandomness.json +1 -1
- package/build/contracts/IWitRandomnessAdmin.json +1 -1
- package/build/contracts/IWitRandomnessAdminV2.json +1 -1
- package/build/contracts/IWitRandomnessConsumer.json +1 -1
- package/build/contracts/IWitRandomnessEvents.json +1 -1
- package/build/contracts/IWitRandomnessLegacy.json +1 -1
- package/build/contracts/IWitRandomnessTypes.json +1 -1
- package/build/contracts/Initializable.json +1 -1
- package/build/contracts/OVM_GasPriceOracle.json +1 -1
- package/build/contracts/Ownable.json +1 -1
- package/build/contracts/Ownable2Step.json +1 -1
- package/build/contracts/Payable.json +1 -1
- package/build/contracts/Proxiable.json +1 -1
- package/build/contracts/ReentrancyGuard.json +1 -1
- package/build/contracts/Secp256k1.json +1 -1
- package/build/contracts/Slices.json +1 -1
- package/build/contracts/TestBech32.json +1 -1
- package/build/contracts/TestSecp256k1.json +1 -1
- package/build/contracts/Upgradeable.json +1 -1
- package/build/contracts/UsingWitOracle.json +1 -1
- package/build/contracts/UsingWitPriceFeeds.json +1 -1
- package/build/contracts/UsingWitRandomness.json +1 -1
- package/build/contracts/WitOracle.json +2 -13
- package/build/contracts/WitOracleBasePushOnly.json +1 -1
- package/build/contracts/WitOracleBasePushOnlyTrustable.json +1 -1
- package/build/contracts/WitOracleBasePushOnlyTrustless.json +1 -1
- package/build/contracts/WitOracleBasePushOnlyUpgradable.json +1 -1
- package/build/contracts/WitOracleBaseQueriable.json +1 -1
- package/build/contracts/WitOracleBaseQueriableTrustable.json +1 -1
- package/build/contracts/WitOracleBaseQueriableTrustless.json +1 -1
- package/build/contracts/WitOracleBaseQueriableUpgradable.json +1 -1
- package/build/contracts/WitOracleDataLib.json +2 -254
- package/build/contracts/WitOraclePushOnly.json +1 -1
- package/build/contracts/WitOracleRadonEncodingLib.json +2 -13
- package/build/contracts/WitOracleRadonRegistry.json +2 -13
- package/build/contracts/WitOracleRadonRegistryBase.json +1 -1
- package/build/contracts/WitOracleRadonRegistryBaseUpgradable.json +1 -1
- package/build/contracts/WitOracleRadonRegistryData.json +1 -1
- package/build/contracts/WitOracleRadonRegistryDefaultV21.json +1 -1
- package/build/contracts/WitOracleRadonRegistryUpgradableDefault.json +2 -17
- package/build/contracts/WitOracleRadonRegistryUpgradableNoSha256.json +1 -1
- package/build/contracts/WitOracleRadonRegistryUpgradableZkSync.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactory.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryBase.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactoryBaseUpgradable.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactoryModals.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryModalsDefault.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryTemplates.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryTemplatesDefault.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryUpgradableConfluxCore.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactoryUpgradableDefault.json +2 -13
- package/build/contracts/WitOracleResultStatusLib.json +2 -14
- package/build/contracts/WitOracleTrustableDefault.json +2 -259
- package/build/contracts/WitOracleTrustableExperimental.json +1 -1
- package/build/contracts/WitOracleTrustableObscuro.json +1 -1
- package/build/contracts/WitOracleTrustableOvm2.json +1 -1
- package/build/contracts/WitOracleTrustablePushOnly.json +1 -1
- package/build/contracts/WitOracleTrustableReef.json +1 -1
- package/build/contracts/WitOracleTrustableZkSync.json +1 -1
- package/build/contracts/WitOracleTrustlessDataLib.json +1 -1
- package/build/contracts/WitOracleTrustlessDefaultV22.json +1 -1
- package/build/contracts/WitOracleTrustlessUpgradableDefault.json +1 -1
- package/build/contracts/WitPriceFeeds.json +2 -13
- package/build/contracts/WitPriceFeedsDataLib.json +2 -14
- package/build/contracts/WitPriceFeedsLegacy.json +2 -8
- package/build/contracts/WitPriceFeedsLegacyDataLib.json +2 -84
- package/build/contracts/WitPriceFeedsLegacyUpgradable.json +1 -1
- package/build/contracts/WitPriceFeedsLegacyUpgradableBypass.json +2 -80
- package/build/contracts/WitPriceFeedsSolverBase.json +1 -1
- package/build/contracts/WitPriceFeedsV3.json +1 -1
- package/build/contracts/WitPriceFeedsV3Upgradable.json +2 -17
- package/build/contracts/WitPythChainlinkAggregator.json +1 -1
- package/build/contracts/WitRandomness.json +2 -13
- package/build/contracts/WitRandomnessLegacy.json +1 -1
- package/build/contracts/WitRandomnessV3.json +2 -13
- package/build/contracts/WitRngConsumer.json +1 -1
- package/build/contracts/Witnet.json +1 -1
- package/build/contracts/WitnetBuffer.json +1 -1
- package/build/contracts/WitnetCBOR.json +1 -1
- package/build/contracts/WitnetDeployer.json +2 -13
- package/build/contracts/WitnetDeployerConfluxCore.json +1 -1
- package/build/contracts/WitnetDeployerDeferred.json +1 -1
- package/build/contracts/WitnetDeployerMeter.json +1 -1
- package/build/contracts/WitnetProxy.json +2 -9
- package/build/contracts/WitnetUpgradableBase.json +1 -1
- package/{migrations → dist/migrations}/addresses.json +1 -25
- package/{migrations → dist/migrations}/constructorArgs.json +1 -6
- package/dist/migrations/settings/artifacts.d.ts +95 -0
- package/dist/migrations/settings/artifacts.d.ts.map +1 -0
- package/dist/migrations/settings/artifacts.js +80 -0
- package/dist/migrations/settings/networks.d.ts +593 -0
- package/dist/migrations/settings/networks.d.ts.map +1 -0
- package/dist/migrations/settings/networks.js +593 -0
- package/dist/src/bin/helpers.cjs +350 -0
- package/dist/src/bin/helpers.d.cts +76 -0
- package/dist/src/bin/helpers.d.cts.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +33 -0
- package/dist/src/lib/types.d.ts +99 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +18 -0
- package/dist/src/lib/utils.d.ts +22 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +267 -0
- package/dist/src/lib/wrappers/ContractWrapper.d.ts +47 -0
- package/dist/src/lib/wrappers/ContractWrapper.d.ts.map +1 -0
- package/dist/src/lib/wrappers/ContractWrapper.js +81 -0
- package/dist/src/lib/wrappers/WitAppliance.d.ts +7 -0
- package/dist/src/lib/wrappers/WitAppliance.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitAppliance.js +17 -0
- package/dist/src/lib/wrappers/WitArtifact.d.ts +6 -0
- package/dist/src/lib/wrappers/WitArtifact.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitArtifact.js +16 -0
- package/dist/src/lib/wrappers/WitOracle.d.ts +105 -0
- package/dist/src/lib/wrappers/WitOracle.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracle.js +217 -0
- package/dist/src/lib/wrappers/WitOracleConsumer.d.ts +16 -0
- package/dist/src/lib/wrappers/WitOracleConsumer.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracleConsumer.js +30 -0
- package/dist/src/lib/wrappers/WitOracleRadonRegistry.d.ts +102 -0
- package/dist/src/lib/wrappers/WitOracleRadonRegistry.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracleRadonRegistry.js +140 -0
- package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.d.ts +81 -0
- package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.js +257 -0
- package/dist/src/lib/wrappers/WitPriceFeeds.d.ts +91 -0
- package/dist/src/lib/wrappers/WitPriceFeeds.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitPriceFeeds.js +356 -0
- package/dist/src/lib/wrappers/WitPriceFeedsLegacy.d.ts +14 -0
- package/dist/src/lib/wrappers/WitPriceFeedsLegacy.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitPriceFeedsLegacy.js +64 -0
- package/dist/src/lib/wrappers/WitRandomness.d.ts +55 -0
- package/dist/src/lib/wrappers/WitRandomness.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitRandomness.js +165 -0
- package/dist/src/lib/wrappers.d.ts +8 -0
- package/dist/src/lib/wrappers.d.ts.map +1 -0
- package/dist/src/lib/wrappers.js +8 -0
- package/package.json +78 -54
- package/scripts/clean.cjs +21 -0
- package/scripts/eth-create2.cjs +38 -0
- package/scripts/eth-create3.cjs +45 -0
- package/scripts/postinstall.cjs +9 -0
- package/scripts/prepare.cjs +27 -0
- package/scripts/vanity2gen.cjs +121 -0
- package/scripts/vanity3gen.cjs +84 -0
- package/scripts/verify-proxies.cjs +50 -0
- package/scripts/verify-truffle.cjs +69 -0
- package/scripts/verify.js +95 -0
- package/scripts/wof-acls.js +17 -0
- package/src/bin/bots/bridge.cjs +0 -0
- package/src/bin/bots/randomizer.cjs +290 -0
- package/src/bin/bots/reporter.cjs +0 -0
- package/src/bin/cli/accounts.cjs +47 -0
- package/src/bin/cli/assets.cjs +466 -0
- package/src/bin/cli/framework.cjs +100 -0
- package/src/bin/cli/gateway.cjs +26 -0
- package/src/bin/cli/networks.cjs +63 -0
- package/src/bin/cli/priceFeeds.cjs +170 -0
- package/src/bin/cli/queries.cjs +217 -0
- package/src/bin/cli/randomness.cjs +367 -0
- package/src/bin/cli/reports.cjs +272 -0
- package/src/bin/cli/wizard.cjs +352 -0
- package/src/bin/helpers.cjs +388 -0
- package/src/bin/index.cjs +407 -0
- package/settings/artifacts.js +0 -71
- package/settings/index.js +0 -49
- package/settings/networks.js +0 -593
- package/settings/solidity.js +0 -11
- package/settings/specs.js +0 -102
- package/src/index.js +0 -96
- 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
|
+
}
|