1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
const { deployed, getTrieNodesForCall, getTrieAtStep } = require("../scripts/lib")
async function main() {
let [c, m, mm] = await deployed()
const challengeId = parseInt(process.env.ID)
const blockNumberN = parseInt(process.env.BLOCK)
const isChallenger = process.env.CHALLENGER == "1"
let step = (await c.getStepNumber(challengeId)).toNumber()
console.log("searching step", step, "at block", blockNumberN)
if (await c.isSearching(challengeId)) {
console.log("search is NOT done")
return
}
let cdat
if (isChallenger) {
// challenger declare victory
cdat = c.interface.encodeFunctionData("confirmStateTransition", [challengeId])
} else {
// defender declare victory
// note: not always possible
cdat = c.interface.encodeFunctionData("denyStateTransition", [challengeId])
}
let startTrie = getTrieAtStep(blockNumberN, step)
let finalTrie = getTrieAtStep(blockNumberN, step+1)
let preimages = Object.assign({}, startTrie['preimages'], finalTrie['preimages']);
let nodes = await getTrieNodesForCall(c, c.address, cdat, preimages)
for (n of nodes) {
await mm.AddTrieNode(n)
}
let ret
if (isChallenger) {
ret = await c.confirmStateTransition(challengeId)
} else {
ret = await c.denyStateTransition(challengeId)
}
let receipt = await ret.wait()
console.log(receipt.events.map((x) => x.event))
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});