Enables cross-chain arbitration for Realitio (Reality.eth) using Kleros as arbitrator.
- Gnosis
- Optimism and other OP stack chains: Unichain, Redstone
- Arbitrum
- Polygon PoS
- ZkSync
The testnet of the above chains except Redstone.
- Alice requests arbitration on the main chain paying the arbitration fee to the ETH proxy and indicates the maximum value of the bond for the question (A.K.A.
max_previous
). - The ETH proxy communicates the request to the Gnosis proxy through the AMB.
- The Gnosis tries to notify Realitio of the arbitration request and forwards the
max_previous
value:- If the bond has not changed, the arbitration request will be accepted.
- Notify the ETH proxy through the AMB.
- Otherwise, if it changed then:
- Notify the ETH proxy through the AMB.
- The ETH proxy refunds Alice. END
- If the bond has not changed, the arbitration request will be accepted.
- In the mean time while Realitio was being notified of the arbitration request, the arbitration fees might have changed:
- If the fees stayed the same (most common case) then:
- Create a dispute on Kleros Court.
- If the fees have decreased then:
- Create a dispute on Kleros Court.
- Refund Alice of the difference.
- If the fees have increased, then the arbitration request will fail:
- Refund Alice of the value paid so far.
- The ETH proxy notifies the Gnosis proxy through the AMB that the arbitration failed to be created.
- The Gnosis proxy notifies Realitio of the failed arbitration. END
- If the fees stayed the same (most common case) then:
- The Kleros court gives a ruling. It is relayed to the Gnosis proxy through the AMB.
- If the ruling is the current answer, Bob, the last answerer, is the winner. END
- If it is not, Alice is the winner. END
See contracts/README.md.
Each directory at the root of this repository contains code for each individual part that enables this integration:
bots/
: service to automate some steps of the flow which otherwise would required manual intervention from users.- Notice: while this is a centralized service, it exists only for convenience. Users can fulfill the role of the bots if they wish to.
contracts/
: Smart contracts to enable cross-chain arbitration for Realitio (Reality.eth). Learn more.dynamic-script/
: allows fetching the dynamic content for the arbitration, as described by ERC-1497: Evidence Standard.evidence-display/
: display interface that should be used to render the evidence for arbitrators, as described by ERC-1497: Evidence Standard.
- Get the Reality.eth contract address and deployment block number from the Reality monorepo.
- Add the new chain configuration to hardhat.config.
- Make sure to add the correct tag (home or foreign) and the correct companion network for the home and foreign networks (so that both networks have a companion network referring to the other). The deployment scripts rely on them.
- In
package.json
, add the extra convenience scripts:metaevidence:xxx
,deploy:xxx
- Build the bridging logic in the proxies if needed.
- E.g. for an OP L2 it is not needed, the logic is the same for all OP L2s and is already implemented.
- Test, review etc
- Add the Reality.eth contract and deployment block number to the script files here and here.
yarn build
- Upload the file
dynamic-script/dist/realitio-dynamic-script-vx.x.x.js
to IPFS. - Upload the folder
evidence-display/evidence-display-vx.x.x
to IPFS.
- In this script, update the CIDs with the latest dynamic and evidence scripts uploaded to IPFS in the above steps.
- Run
yarn metaevidence:xxx
for the new chain - Upload the resulting metaevidence-xxx.json to IPFS
- Configuration:
- In the home and foreign proxy deployment script, add a configuration object to
params
. - The home script needs the Reality contract address.
- The foreign script needs the desired courtId and number of jurors (arbitratorExtraData), the L1 bridge address (messenger) and the metaEvidence IPFS URI (from earlier step).
- In the home and foreign proxy deployment script, add a configuration object to
- Deploy and verify with
yarn deploy:xxx
. - Update the contracts README by running
./scripts/populateReadme.sh
, expand the script if needed. - Make sure to commit to
deployments
folder to git.
- Add support for the new chain (because the dynamic/evidence scripts need a RPC provided by the court).
- Whitelist the newly deployed arbitrable.