Commit a0e47e5a authored by protolambda's avatar protolambda Committed by GitHub

FP: add KZG point-evaluation preimage-oracle type (#9461)

* FP: add KZG point-evaluation preimage-oracle type, to process L2 oracle call with

* op-program: Integrate kzg precompile oracle

* fix PreimageOracle.sol

* store kzg precompile input preimage

* update bindings and go.mod

* fix go.mod

* resolve TODOs

* s/Hex2Bytes/FromHex

* fix typo

* ctb: set kzg preimage length to 1

* op-challenger: Load kzg point evaluations to PreimageOracle (#9497)

* op-challenger: load KZG point evaluation into oracle

Also: increase max game depth for devnet.
This is a temporary solution to avoid flakes in e2e tests that use the kzg precompile.
The current execution trace max step of 2**31 steps isn't sufficient.

---------
Co-authored-by: default avatarinphi <mlaw2501@gmail.com>
Co-authored-by: default avatarrefcell <abigger87@gmail.com>
parent b5e56690
...@@ -257,6 +257,8 @@ func Run(ctx *cli.Context) error { ...@@ -257,6 +257,8 @@ func Run(ctx *cli.Context) error {
stopAtPreimageTypeByte = preimage.Sha256KeyType stopAtPreimageTypeByte = preimage.Sha256KeyType
case "blob": case "blob":
stopAtPreimageTypeByte = preimage.BlobKeyType stopAtPreimageTypeByte = preimage.BlobKeyType
case "kzg-point-evaluation":
stopAtPreimageTypeByte = preimage.KZGPointEvaluationKeyType
case "any": case "any":
stopAtAnyPreimage = true stopAtAnyPreimage = true
case "": case "":
......
...@@ -42,8 +42,8 @@ type PreimageOracleLeaf struct { ...@@ -42,8 +42,8 @@ type PreimageOracleLeaf struct {
// PreimageOracleMetaData contains all meta data concerning the PreimageOracle contract. // PreimageOracleMetaData contains all meta data concerning the PreimageOracle contract.
var PreimageOracleMetaData = &bind.MetaData{ var PreimageOracleMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_minProposalSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challengePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_cancunActivation\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"KECCAK_TREE_DEPTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_LEAF_COUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addLeavesLPP\",\"inputs\":[{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_inputStartBlock\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_stateCommitments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_finalize\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengeFirstLPP\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_postState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_postStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengeLPP\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_stateMatrix\",\"type\":\"tuple\",\"internalType\":\"structLibKeccak.StateMatrix\",\"components\":[{\"name\":\"state\",\"type\":\"uint64[25]\",\"internalType\":\"uint64[25]\"}]},{\"name\":\"_preState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_preStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_postState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_postStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengePeriod\",\"inputs\":[],\"outputs\":[{\"name\":\"challengePeriod_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTreeRootLPP\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"treeRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initLPP\",\"inputs\":[{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_partOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_claimedSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadBlobPreimagePart\",\"inputs\":[{\"name\":\"_z\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_y\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_commitment\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadKeccak256PreimagePart\",\"inputs\":[{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_preimage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadLocalData\",\"inputs\":[{\"name\":\"_ident\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_localContext\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_word\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_size\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"key_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadSha256PreimagePart\",\"inputs\":[{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_preimage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"minProposalSize\",\"inputs\":[],\"outputs\":[{\"name\":\"minProposalSize_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preimageLengths\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preimagePartOk\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preimageParts\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalBlocksLen\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"len_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalBranches\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalCount\",\"inputs\":[],\"outputs\":[{\"name\":\"count_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalMetadata\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"LPPMetaData\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalParts\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposals\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"readPreimage\",\"inputs\":[{\"name\":\"_key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"dat_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"datLen_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"squeezeLPP\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_stateMatrix\",\"type\":\"tuple\",\"internalType\":\"structLibKeccak.StateMatrix\",\"components\":[{\"name\":\"state\",\"type\":\"uint64[25]\",\"internalType\":\"uint64[25]\"}]},{\"name\":\"_preState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_preStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_postState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_postStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"zeroHashes\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"ActiveProposal\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AlreadyFinalized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BadProposal\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CancunNotActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInputSize\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPreimage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PartOffsetOOB\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PostStateMatches\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StatesNotContiguous\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TreeSizeOverflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongStartingBlock\",\"inputs\":[]}]", ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_minProposalSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challengePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_cancunActivation\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"KECCAK_TREE_DEPTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_LEAF_COUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addLeavesLPP\",\"inputs\":[{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_inputStartBlock\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_stateCommitments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_finalize\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengeFirstLPP\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_postState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_postStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengeLPP\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_stateMatrix\",\"type\":\"tuple\",\"internalType\":\"structLibKeccak.StateMatrix\",\"components\":[{\"name\":\"state\",\"type\":\"uint64[25]\",\"internalType\":\"uint64[25]\"}]},{\"name\":\"_preState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_preStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_postState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_postStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengePeriod\",\"inputs\":[],\"outputs\":[{\"name\":\"challengePeriod_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTreeRootLPP\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"treeRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initLPP\",\"inputs\":[{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_partOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_claimedSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadBlobPreimagePart\",\"inputs\":[{\"name\":\"_z\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_y\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_commitment\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadKZGPointEvaluationPreimage\",\"inputs\":[{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadKeccak256PreimagePart\",\"inputs\":[{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_preimage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadLocalData\",\"inputs\":[{\"name\":\"_ident\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_localContext\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_word\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_size\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"key_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadSha256PreimagePart\",\"inputs\":[{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_preimage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"minProposalSize\",\"inputs\":[],\"outputs\":[{\"name\":\"minProposalSize_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preimageLengths\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preimagePartOk\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preimageParts\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalBlocksLen\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"len_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalBranches\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalCount\",\"inputs\":[],\"outputs\":[{\"name\":\"count_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalMetadata\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"LPPMetaData\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalParts\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposals\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"readPreimage\",\"inputs\":[{\"name\":\"_key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"dat_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"datLen_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"squeezeLPP\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_stateMatrix\",\"type\":\"tuple\",\"internalType\":\"structLibKeccak.StateMatrix\",\"components\":[{\"name\":\"state\",\"type\":\"uint64[25]\",\"internalType\":\"uint64[25]\"}]},{\"name\":\"_preState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_preStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_postState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_postStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"zeroHashes\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"ActiveProposal\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AlreadyFinalized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BadProposal\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CancunNotActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInputSize\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPreimage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PartOffsetOOB\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PostStateMatches\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StatesNotContiguous\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TreeSizeOverflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongStartingBlock\",\"inputs\":[]}]",
Bin: "0x60e06040523480156200001157600080fd5b5060405162003601380380620036018339810160408190526200003491620000f9565b60c083905260a0829052608081905260005b62000054600160106200013e565b811015620000ef576003816010811062000072576200007262000158565b0154600382601081106200008a576200008a62000158565b0154604080516020810193909352820152606001604051602081830303815290604052805190602001206003826001620000c591906200016e565b60108110620000d857620000d862000158565b015580620000e68162000189565b91505062000046565b50505050620001a5565b6000806000606084860312156200010f57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b60008282101562000153576200015362000128565b500390565b634e487b7160e01b600052603260045260246000fd5b6000821982111562000184576200018462000128565b500190565b6000600182016200019e576200019e62000128565b5060010190565b60805160a05160c05161341e620001e3600039600081816103f901526119d201526000818161046d015261129301526000610fdd015261341e6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80639d53a648116100ee578063dd24f9bf11610097578063ec5efcbc11610071578063ec5efcbc14610458578063f3f480d91461046b578063faf37bc714610491578063fef2b4ed146104a457600080fd5b8063dd24f9bf146103f7578063e03110e11461041d578063e15926111461044557600080fd5b8063b4801e61116100c8578063b4801e61146103c9578063d18534b5146103dc578063da35c664146103ef57600080fd5b80639d53a648146103495780639d7e87691461038b578063b2e67ba81461039e57600080fd5b806361238bde1161015b5780637ac54767116101355780637ac54767146102b95780638542cf50146102cc578063882856ef1461030a5780638dc4be111461033657600080fd5b806361238bde146102505780636551927b1461027b5780637917de1d146102a657600080fd5b80633909af5c1161018c5780633909af5c146102205780634d52b4c91461023557806352f0f3ad1461023d57600080fd5b8063013cf08b146101b35780630359a563146101f75780632055b36b14610218575b600080fd5b6101c66101c13660046129d5565b6104c4565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b61020a610205366004612a17565b610509565b6040519081526020016101ee565b61020a601081565b61023361022e366004612c12565b610641565b005b61020a61088f565b61020a61024b366004612cfe565b6108aa565b61020a61025e366004612d39565b600160209081526000928352604080842090915290825290205481565b61020a610289366004612a17565b601560209081526000928352604080842090915290825290205481565b6102336102b4366004612d9d565b61097f565b61020a6102c73660046129d5565b610e6f565b6102fa6102da366004612d39565b600260209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101ee565b61031d610318366004612e39565b610e86565b60405167ffffffffffffffff90911681526020016101ee565b610233610344366004612e6c565b610ee0565b61020a610357366004612a17565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601760209081526040808320938352929052205490565b610233610399366004612eb8565b610fdb565b61020a6103ac366004612a17565b601660209081526000928352604080842090915290825290205481565b61020a6103d7366004612e39565b6111ec565b6102336103ea366004612c12565b61121e565b60135461020a565b7f000000000000000000000000000000000000000000000000000000000000000061020a565b61043061042b366004612d39565b6115d5565b604080519283526020830191909152016101ee565b610233610453366004612e6c565b6116c6565b610233610466366004612f44565b6117ce565b7f000000000000000000000000000000000000000000000000000000000000000061020a565b61023361049f366004612fdd565b611948565b61020a6104b23660046129d5565b60006020819052908152604090205481565b601381815481106104d457600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061054c9060601c63ffffffff1690565b63ffffffff16905060005b601081101561063957816001166001036105df5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106105ac576105ac613019565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250610620565b82600382601081106105f3576105f3613019565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c908061063181613077565b915050610557565b505092915050565b600061064d8a8a610509565b905061067086868360208b013561066b6106668d6130af565b611b5b565b611b9b565b801561068e575061068e838383602088013561066b6106668a6130af565b6106c4576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8660400135886040516020016106da919061317e565b6040516020818303038152906040528051906020012014610727576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001358760200135600161073d91906131bc565b14610774576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107bc8861078286806131d4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bfc92505050565b6107c588611d57565b8360400135886040516020016107db919061317e565b6040516020818303038152906040528051906020012003610828576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505073ffffffffffffffffffffffffffffffffffffffff9590951660009081526015602090815260408083209683529590529390932080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117905550505050565b600161089d6010600261335b565b6108a79190613367565b81565b60006108b686866125f3565b90506108c38360086131bc565b8211806108d05750602083115b15610907576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b606081156109985761099186866126a0565b90506109d2565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b8154815260200190600101908083116109ff57505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610a808260601c63ffffffff1690565b63ffffffff169050333214610ac1576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ad18260801c63ffffffff1690565b63ffffffff16600003610b10576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b1a8260c01c90565b67ffffffffffffffff1615610b5b576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610b94576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba189898d8886612719565b83516020850160888204881415608883061715610bc6576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610c76578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610c6b576001821615610c4b5782818b0152610c6b565b8981015160009081526020938452604090209260019290921c9101610c2e565b505050608801610bd3565b50505050600160106002610c8a919061335b565b610c949190613367565b811115610ccd576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d42610ce08360401c63ffffffff1690565b610cf09063ffffffff168a6131bc565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b91508415610dcf5777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b179150610d7c8260801c63ffffffff1690565b63ffffffff16610d928360401c63ffffffff1690565b63ffffffff1614610dcf576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e84529091529020610df59084601061294b565b50503360008181526017602090815260408083208e8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055928252601581528282209c82529b909b52909920989098555050505050505050565b60038160108110610e7f57600080fd5b0154905081565b60176020528260005260406000206020528160005260406000208181548110610eae57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b604435600080600883018610610efe5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa905080610f2b57600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b7f0000000000000000000000000000000000000000000000000000000000000000421015611035576040517f299f254900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080603087600037602060006030600060025afa8061105d5763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa9250826110df576309bde3396000526004601cfd5b602886106110f55763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061121457600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff811615611291576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006112bc8260c01c90565b6112d09067ffffffffffffffff1642613367565b11611307576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113138b8b610509565b905061132c87878360208c013561066b6106668e6130af565b801561134a575061134a848483602089013561066b6106668b6130af565b611380576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b876040013589604051602001611396919061317e565b60405160208183030381529060405280519060200120146113e3576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460200135886020013560016113f991906131bc565b14158061142b575060016114138360601c63ffffffff1690565b61141d919061337e565b63ffffffff16856020013514155b15611462576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114708961078287806131d4565b61147989611d57565b60006114848a61286c565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f020000000000000000000000000000000000000000000000000000000000000017905060006114db8460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054600160008481526020019081526020016000206000838152602001908152602001600020819055506115ad8460801c63ffffffff1690565b60009283526020839052604090922063ffffffff909216909155505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff1661165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b506000838152602081815260409091205461167a8160086131bc565b6116858560206131bc565b106116a357836116968260086131bc565b6116a09190613367565b91505b506000938452600160209081526040808620948652939052919092205492909150565b6044356000806008830186106116e45763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b60006117da8686610509565b90506117f3838383602088013561066b6106668a6130af565b611829576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611865576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61186d612989565b61187b8161078287806131d4565b61188481611d57565b84604001358160405160200161189a919061317e565b60405160208183030381529060405280519060200120036118e7576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505073ffffffffffffffffffffffffffffffffffffffff9290921660009081526015602090815260408083209383529290522080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117905550565b333214611981576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61198c8160086133a3565b63ffffffff168263ffffffff16106119d0576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008163ffffffff161015611a30576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601560209081526040808320878452825280832080547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1660a09790971b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff169690961760809590951b9490941790945582518084019093529082529181019283526013805460018101825592525160029091027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0908101805473ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff00000000000000000000000000000000000000009093169290921790915590517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09190910155565b6000816000015182602001518360400151604051602001611b7e939291906133cb565b604051602081830303815290604052805190602001209050919050565b60008160005b6010811015611bef578060051b880135600186831c1660018114611bd45760008481526020839052604090209350611be5565b600082815260208590526040902093505b5050600101611ba1565b5090931495945050505050565b6088815114611c0a57600080fd5b6020810160208301611c8b565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b1717179050611c8581611c70868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b611c9760008383611c17565b611ca360018383611c17565b611caf60028383611c17565b611cbb60038383611c17565b611cc760048383611c17565b611cd360058383611c17565b611cdf60068383611c17565b611ceb60078383611c17565b611cf760088383611c17565b611d0360098383611c17565b611d0f600a8383611c17565b611d1b600b8383611c17565b611d27600c8383611c17565b611d33600d8383611c17565b611d3f600e8383611c17565b611d4b600f8383611c17565b611c8560108383611c17565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e001604051602081830303815290604052905060208201602082016124d3565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c611f0a8660011b67ffffffffffffffff1690565b18188584603f1c611f258660011b67ffffffffffffffff1690565b18188584603f1c611f408660011b67ffffffffffffffff1690565b181895508483603f1c611f5d8560011b67ffffffffffffffff1690565b181894508387603f1c611f7a8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525050505050565b6122fa81611e4d565b805160208201805160408401805160608601805160808801805167ffffffffffffffff871986168a188116808c528619851689188216909952831982169095188516909552841988169091188316909152941990921618811690925260a08301805160c0808601805160e0880180516101008a0180516101208c018051861985168a188d16909a528319821686188c16909652801989169092188a169092528619861618881690529219909216909218841690526101408401805161016086018051610180880180516101a08a0180516101c08c0180518619851689188d169099528319821686188c16909652801988169092188a169092528519851618881690529119909116909118841690526101e08401805161020086018051610220880180516102408a0180516102608c0180518619851689188d169099528319821686188c16909652801988169092188a16909252851985161888169052911990911690911884169052610280840180516102a0860180516102c0880180516102e08a0180516103008c0180518619851689188d169099528319821686188c16909652801988169092188a16909252851985161888169052911990911690911884169052600386901b850151901c9081189091168252611c85565b6124df600082846122f1565b6124eb600182846122f1565b6124f7600282846122f1565b612503600382846122f1565b61250f600482846122f1565b61251b600582846122f1565b612527600682846122f1565b612533600782846122f1565b61253f600882846122f1565b61254b600982846122f1565b612557600a82846122f1565b612563600b82846122f1565b61256f600c82846122f1565b61257b600d82846122f1565b612587600e82846122f1565b612593600f82846122f1565b61259f601082846122f1565b6125ab601182846122f1565b6125b7601282846122f1565b6125c3601382846122f1565b6125cf601482846122f1565b6125db601582846122f1565b6125e7601682846122f1565b611c85601782846122f1565b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831617612699818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b60606040519050816020820181810182868337608883068080156126e95760888290038501848101848103803687375060806001820353506001845160001a1784538652612700565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b600061272b8260a01c63ffffffff1690565b67ffffffffffffffff16905060006127498360801c63ffffffff1690565b63ffffffff16905060006127638460401c63ffffffff1690565b63ffffffff169050600883108015612779575080155b156127ad5760c082901b6000908152883560085283513382526016602090815260408084208a855290915290912055612862565b600883101580156127cb5750806127c5600885613367565b93508310155b80156127df57506127dc87826131bc565b83105b156128625760006127f08285613367565b9050876127fe8260206131bc565b1015801561280a575085155b15612841576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526016602090815260408083208a845290915290209089013590555b5050505050505050565b60006128ef565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff0061289d8360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff00006128ca8360101b67ffffffffffffffff1690565b1617905060008160201c6128e88360201b67ffffffffffffffff1690565b1792915050565b6080820151602083019061290790612873565b612873565b604082015161291590612873565b60401b1761292d61290260018460059190911b015190565b825160809190911b9061293f90612873565b60c01b17179392505050565b8260108101928215612979579160200282015b8281111561297957825182559160200191906001019061295e565b506129859291506129a1565b5090565b604051806020016040528061299c6129b6565b905290565b5b8082111561298557600081556001016129a2565b6040518061032001604052806019906020820280368337509192915050565b6000602082840312156129e757600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a1257600080fd5b919050565b60008060408385031215612a2a57600080fd5b612a33836129ee565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612a9457612a94612a41565b60405290565b6040516060810167ffffffffffffffff81118282101715612a9457612a94612a41565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612b0457612b04612a41565b604052919050565b6000610320808385031215612b2057600080fd5b604051602080820167ffffffffffffffff8382108183111715612b4557612b45612a41565b8160405283955087601f880112612b5b57600080fd5b612b63612a70565b9487019491508188861115612b7757600080fd5b875b86811015612b9f5780358381168114612b925760008081fd5b8452928401928401612b79565b50909352509295945050505050565b600060608284031215612bc057600080fd5b50919050565b60008083601f840112612bd857600080fd5b50813567ffffffffffffffff811115612bf057600080fd5b6020830191508360208260051b8501011115612c0b57600080fd5b9250929050565b60008060008060008060008060006103e08a8c031215612c3157600080fd5b612c3a8a6129ee565b985060208a01359750612c508b60408c01612b0c565b96506103608a013567ffffffffffffffff80821115612c6e57600080fd5b612c7a8d838e01612bae565b97506103808c0135915080821115612c9157600080fd5b612c9d8d838e01612bc6565b90975095506103a08c0135915080821115612cb757600080fd5b612cc38d838e01612bae565b94506103c08c0135915080821115612cda57600080fd5b50612ce78c828d01612bc6565b915080935050809150509295985092959850929598565b600080600080600060a08688031215612d1657600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060408385031215612d4c57600080fd5b50508035926020909101359150565b60008083601f840112612d6d57600080fd5b50813567ffffffffffffffff811115612d8557600080fd5b602083019150836020828501011115612c0b57600080fd5b600080600080600080600060a0888a031215612db857600080fd5b8735965060208801359550604088013567ffffffffffffffff80821115612dde57600080fd5b612dea8b838c01612d5b565b909750955060608a0135915080821115612e0357600080fd5b50612e108a828b01612bc6565b90945092505060808801358015158114612e2957600080fd5b8091505092959891949750929550565b600080600060608486031215612e4e57600080fd5b612e57846129ee565b95602085013595506040909401359392505050565b600080600060408486031215612e8157600080fd5b83359250602084013567ffffffffffffffff811115612e9f57600080fd5b612eab86828701612d5b565b9497909650939450505050565b600080600080600080600060a0888a031215612ed357600080fd5b8735965060208801359550604088013567ffffffffffffffff80821115612ef957600080fd5b612f058b838c01612d5b565b909750955060608a0135915080821115612f1e57600080fd5b50612f2b8a828b01612d5b565b989b979a50959894979596608090950135949350505050565b600080600080600060808688031215612f5c57600080fd5b612f65866129ee565b945060208601359350604086013567ffffffffffffffff80821115612f8957600080fd5b612f9589838a01612bae565b94506060880135915080821115612fab57600080fd5b50612fb888828901612bc6565b969995985093965092949392505050565b803563ffffffff81168114612a1257600080fd5b600080600060608486031215612ff257600080fd5b8335925061300260208501612fc9565b915061301060408501612fc9565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036130a8576130a8613048565b5060010190565b6000606082360312156130c157600080fd5b6130c9612a9a565b823567ffffffffffffffff808211156130e157600080fd5b9084019036601f8301126130f457600080fd5b813560208282111561310857613108612a41565b613138817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612abd565b9250818352368183860101111561314e57600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b60198110156131b357825167ffffffffffffffff1682526020928301929091019060010161318a565b50505092915050565b600082198211156131cf576131cf613048565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261320957600080fd5b83018035915067ffffffffffffffff82111561322457600080fd5b602001915036819003821315612c0b57600080fd5b600181815b8085111561329257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561327857613278613048565b8085161561328557918102915b93841c939080029061323e565b509250929050565b6000826132a957506001613355565b816132b657506000613355565b81600181146132cc57600281146132d6576132f2565b6001915050613355565b60ff8411156132e7576132e7613048565b50506001821b613355565b5060208310610133831016604e8410600b8410161715613315575081810a613355565b61331f8383613239565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561335157613351613048565b0290505b92915050565b6000612699838361329a565b60008282101561337957613379613048565b500390565b600063ffffffff8381169083168181101561339b5761339b613048565b039392505050565b600063ffffffff8083168185168083038211156133c2576133c2613048565b01949350505050565b6000845160005b818110156133ec57602081880181015185830152016133d2565b818111156133fb576000828501525b509190910192835250602082015260400191905056fea164736f6c634300080f000a", Bin: "0x60e06040523480156200001157600080fd5b506040516200378f3803806200378f8339810160408190526200003491620000f9565b60c083905260a0829052608081905260005b62000054600160106200013e565b811015620000ef576003816010811062000072576200007262000158565b0154600382601081106200008a576200008a62000158565b0154604080516020810193909352820152606001604051602081830303815290604052805190602001206003826001620000c591906200016e565b60108110620000d857620000d862000158565b015580620000e68162000189565b91505062000046565b50505050620001a5565b6000806000606084860312156200010f57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b60008282101562000153576200015362000128565b500390565b634e487b7160e01b600052603260045260246000fd5b6000821982111562000184576200018462000128565b500190565b6000600182016200019e576200019e62000128565b5060010190565b60805160a05160c0516135a5620001ea600039600081816104170152611b1701526000818161048b01526113d8015260008181610ffb015261123e01526135a56000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80639d53a648116100f9578063dd24f9bf11610097578063ec5efcbc11610071578063ec5efcbc14610476578063f3f480d914610489578063faf37bc7146104af578063fef2b4ed146104c257600080fd5b8063dd24f9bf14610415578063e03110e11461043b578063e15926111461046357600080fd5b8063b4801e61116100d3578063b4801e61146103d4578063b893f82c146103e7578063d18534b5146103fa578063da35c6641461040d57600080fd5b80639d53a648146103545780639d7e876914610396578063b2e67ba8146103a957600080fd5b806361238bde116101665780637ac54767116101405780637ac54767146102c45780638542cf50146102d7578063882856ef146103155780638dc4be111461034157600080fd5b806361238bde1461025b5780636551927b146102865780637917de1d146102b157600080fd5b80633909af5c116101975780633909af5c1461022b5780634d52b4c91461024057806352f0f3ad1461024857600080fd5b8063013cf08b146101be5780630359a563146102025780632055b36b14610223575b600080fd5b6101d16101cc366004612b1a565b6104e2565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b610215610210366004612b5c565b610527565b6040519081526020016101f9565b610215601081565b61023e610239366004612d57565b61065f565b005b6102156108ad565b610215610256366004612e43565b6108c8565b610215610269366004612e7e565b600160209081526000928352604080842090915290825290205481565b610215610294366004612b5c565b601560209081526000928352604080842090915290825290205481565b61023e6102bf366004612ee2565b61099d565b6102156102d2366004612b1a565b610e8d565b6103056102e5366004612e7e565b600260209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101f9565b610328610323366004612f7e565b610ea4565b60405167ffffffffffffffff90911681526020016101f9565b61023e61034f366004612fb1565b610efe565b610215610362366004612b5c565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601760209081526040808320938352929052205490565b61023e6103a4366004612ffd565b610ff9565b6102156103b7366004612b5c565b601660209081526000928352604080842090915290825290205481565b6102156103e2366004612f7e565b61120a565b61023e6103f5366004613089565b61123c565b61023e610408366004612d57565b611363565b601354610215565b7f0000000000000000000000000000000000000000000000000000000000000000610215565b61044e610449366004612e7e565b61171a565b604080519283526020830191909152016101f9565b61023e610471366004612fb1565b61180b565b61023e6104843660046130cb565b611913565b7f0000000000000000000000000000000000000000000000000000000000000000610215565b61023e6104bd366004613164565b611a8d565b6102156104d0366004612b1a565b60006020819052908152604090205481565b601381815481106104f257600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061056a9060601c63ffffffff1690565b63ffffffff16905060005b601081101561065757816001166001036105fd5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106105ca576105ca6131a0565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925061063e565b8260038260108110610611576106116131a0565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c908061064f816131fe565b915050610575565b505092915050565b600061066b8a8a610527565b905061068e86868360208b01356106896106848d613236565b611ca0565b611ce0565b80156106ac57506106ac83838360208801356106896106848a613236565b6106e2576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8660400135886040516020016106f89190613305565b6040516020818303038152906040528051906020012014610745576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001358760200135600161075b9190613343565b14610792576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107da886107a0868061335b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d4192505050565b6107e388611e9c565b8360400135886040516020016107f99190613305565b6040516020818303038152906040528051906020012003610846576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505073ffffffffffffffffffffffffffffffffffffffff9590951660009081526015602090815260408083209683529590529390932080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117905550505050565b60016108bb601060026134e2565b6108c591906134ee565b81565b60006108d48686612738565b90506108e1836008613343565b8211806108ee5750602083115b15610925576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b606081156109b6576109af86866127e5565b90506109f0565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610a1d57505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610a9e8260601c63ffffffff1690565b63ffffffff169050333214610adf576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aef8260801c63ffffffff1690565b63ffffffff16600003610b2e576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b388260c01c90565b67ffffffffffffffff1615610b79576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610bb2576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bbf89898d888661285e565b83516020850160888204881415608883061715610be4576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610c94578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610c89576001821615610c695782818b0152610c89565b8981015160009081526020938452604090209260019290921c9101610c4c565b505050608801610bf1565b50505050600160106002610ca891906134e2565b610cb291906134ee565b811115610ceb576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d60610cfe8360401c63ffffffff1690565b610d0e9063ffffffff168a613343565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b91508415610ded5777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b179150610d9a8260801c63ffffffff1690565b63ffffffff16610db08360401c63ffffffff1690565b63ffffffff1614610ded576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e84529091529020610e1390846010612a90565b50503360008181526017602090815260408083208e8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055928252601581528282209c82529b909b52909920989098555050505050505050565b60038160108110610e9d57600080fd5b0154905081565b60176020528260005260406000206020528160005260406000208181548110610ecc57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b604435600080600883018610610f1c5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa905080610f4957600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b7f0000000000000000000000000000000000000000000000000000000000000000421015611053576040517f299f254900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080603087600037602060006030600060025afa8061107b5763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa9250826110fd576309bde3396000526004601cfd5b602886106111135763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061123257600080fd5b0154925083915050565b7f0000000000000000000000000000000000000000000000000000000000000000421015611296576040517f299f254900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806080838582378381207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06000000000000000000000000000000000000000000000000000000000000001792506000808583600a5afa6000848152600260209081526040808320838052825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155878452808352818420848052835281842060f89590951b909455958252819052939093209290925550505050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156113d6576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006114018260c01c90565b6114159067ffffffffffffffff16426134ee565b1161144c576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006114588b8b610527565b905061147187878360208c01356106896106848e613236565b801561148f575061148f84848360208901356106896106848b613236565b6114c5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016114db9190613305565b6040516020818303038152906040528051906020012014611528576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84602001358860200135600161153e9190613343565b141580611570575060016115588360601c63ffffffff1690565b6115629190613505565b63ffffffff16856020013514155b156115a7576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115b5896107a0878061335b565b6115be89611e9c565b60006115c98a6129b1565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f020000000000000000000000000000000000000000000000000000000000000017905060006116208460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054600160008481526020019081526020016000206000838152602001908152602001600020819055506116f28460801c63ffffffff1690565b60009283526020839052604090922063ffffffff909216909155505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff166117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546117bf816008613343565b6117ca856020613343565b106117e857836117db826008613343565b6117e591906134ee565b91505b506000938452600160209081526040808620948652939052919092205492909150565b6044356000806008830186106118295763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b600061191f8686610527565b905061193883838360208801356106896106848a613236565b61196e576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840135156119aa576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119b2612ace565b6119c0816107a0878061335b565b6119c981611e9c565b8460400135816040516020016119df9190613305565b6040516020818303038152906040528051906020012003611a2c576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505073ffffffffffffffffffffffffffffffffffffffff9290921660009081526015602090815260408083209383529290522080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117905550565b333214611ac6576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ad181600861352a565b63ffffffff168263ffffffff1610611b15576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008163ffffffff161015611b75576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601560209081526040808320878452825280832080547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1660a09790971b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff169690961760809590951b9490941790945582518084019093529082529181019283526013805460018101825592525160029091027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0908101805473ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff00000000000000000000000000000000000000009093169290921790915590517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09190910155565b6000816000015182602001518360400151604051602001611cc393929190613552565b604051602081830303815290604052805190602001209050919050565b60008160005b6010811015611d34578060051b880135600186831c1660018114611d195760008481526020839052604090209350611d2a565b600082815260208590526040902093505b5050600101611ce6565b5090931495945050505050565b6088815114611d4f57600080fd5b6020810160208301611dd0565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b1717179050611dca81611db5868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b611ddc60008383611d5c565b611de860018383611d5c565b611df460028383611d5c565b611e0060038383611d5c565b611e0c60048383611d5c565b611e1860058383611d5c565b611e2460068383611d5c565b611e3060078383611d5c565b611e3c60088383611d5c565b611e4860098383611d5c565b611e54600a8383611d5c565b611e60600b8383611d5c565b611e6c600c8383611d5c565b611e78600d8383611d5c565b611e84600e8383611d5c565b611e90600f8383611d5c565b611dca60108383611d5c565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e00160405160208183030381529060405290506020820160208201612618565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c61204f8660011b67ffffffffffffffff1690565b18188584603f1c61206a8660011b67ffffffffffffffff1690565b18188584603f1c6120858660011b67ffffffffffffffff1690565b181895508483603f1c6120a28560011b67ffffffffffffffff1690565b181894508387603f1c6120bf8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525050505050565b61243f81611f92565b805160208201805160408401805160608601805160808801805167ffffffffffffffff871986168a188116808c528619851689188216909952831982169095188516909552841988169091188316909152941990921618811690925260a08301805160c0808601805160e0880180516101008a0180516101208c018051861985168a188d16909a528319821686188c16909652801989169092188a169092528619861618881690529219909216909218841690526101408401805161016086018051610180880180516101a08a0180516101c08c0180518619851689188d169099528319821686188c16909652801988169092188a169092528519851618881690529119909116909118841690526101e08401805161020086018051610220880180516102408a0180516102608c0180518619851689188d169099528319821686188c16909652801988169092188a16909252851985161888169052911990911690911884169052610280840180516102a0860180516102c0880180516102e08a0180516103008c0180518619851689188d169099528319821686188c16909652801988169092188a16909252851985161888169052911990911690911884169052600386901b850151901c9081189091168252611dca565b61262460008284612436565b61263060018284612436565b61263c60028284612436565b61264860038284612436565b61265460048284612436565b61266060058284612436565b61266c60068284612436565b61267860078284612436565b61268460088284612436565b61269060098284612436565b61269c600a8284612436565b6126a8600b8284612436565b6126b4600c8284612436565b6126c0600d8284612436565b6126cc600e8284612436565b6126d8600f8284612436565b6126e460108284612436565b6126f060118284612436565b6126fc60128284612436565b61270860138284612436565b61271460148284612436565b61272060158284612436565b61272c60168284612436565b611dca60178284612436565b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316176127de818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b606060405190508160208201818101828683376088830680801561282e5760888290038501848101848103803687375060806001820353506001845160001a1784538652612845565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b60006128708260a01c63ffffffff1690565b67ffffffffffffffff169050600061288e8360801c63ffffffff1690565b63ffffffff16905060006128a88460401c63ffffffff1690565b63ffffffff1690506008831080156128be575080155b156128f25760c082901b6000908152883560085283513382526016602090815260408084208a8552909152909120556129a7565b6008831015801561291057508061290a6008856134ee565b93508310155b801561292457506129218782613343565b83105b156129a757600061293582856134ee565b905087612943826020613343565b1015801561294f575085155b15612986576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526016602090815260408083208a845290915290209089013590555b5050505050505050565b6000612a34565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff006129e28360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612a0f8360101b67ffffffffffffffff1690565b1617905060008160201c612a2d8360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612a4c906129b8565b6129b8565b6040820151612a5a906129b8565b60401b17612a72612a4760018460059190911b015190565b825160809190911b90612a84906129b8565b60c01b17179392505050565b8260108101928215612abe579160200282015b82811115612abe578251825591602001919060010190612aa3565b50612aca929150612ae6565b5090565b6040518060200160405280612ae1612afb565b905290565b5b80821115612aca5760008155600101612ae7565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612b2c57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b5757600080fd5b919050565b60008060408385031215612b6f57600080fd5b612b7883612b33565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612bd957612bd9612b86565b60405290565b6040516060810167ffffffffffffffff81118282101715612bd957612bd9612b86565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612c4957612c49612b86565b604052919050565b6000610320808385031215612c6557600080fd5b604051602080820167ffffffffffffffff8382108183111715612c8a57612c8a612b86565b8160405283955087601f880112612ca057600080fd5b612ca8612bb5565b9487019491508188861115612cbc57600080fd5b875b86811015612ce45780358381168114612cd75760008081fd5b8452928401928401612cbe565b50909352509295945050505050565b600060608284031215612d0557600080fd5b50919050565b60008083601f840112612d1d57600080fd5b50813567ffffffffffffffff811115612d3557600080fd5b6020830191508360208260051b8501011115612d5057600080fd5b9250929050565b60008060008060008060008060006103e08a8c031215612d7657600080fd5b612d7f8a612b33565b985060208a01359750612d958b60408c01612c51565b96506103608a013567ffffffffffffffff80821115612db357600080fd5b612dbf8d838e01612cf3565b97506103808c0135915080821115612dd657600080fd5b612de28d838e01612d0b565b90975095506103a08c0135915080821115612dfc57600080fd5b612e088d838e01612cf3565b94506103c08c0135915080821115612e1f57600080fd5b50612e2c8c828d01612d0b565b915080935050809150509295985092959850929598565b600080600080600060a08688031215612e5b57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060408385031215612e9157600080fd5b50508035926020909101359150565b60008083601f840112612eb257600080fd5b50813567ffffffffffffffff811115612eca57600080fd5b602083019150836020828501011115612d5057600080fd5b600080600080600080600060a0888a031215612efd57600080fd5b8735965060208801359550604088013567ffffffffffffffff80821115612f2357600080fd5b612f2f8b838c01612ea0565b909750955060608a0135915080821115612f4857600080fd5b50612f558a828b01612d0b565b90945092505060808801358015158114612f6e57600080fd5b8091505092959891949750929550565b600080600060608486031215612f9357600080fd5b612f9c84612b33565b95602085013595506040909401359392505050565b600080600060408486031215612fc657600080fd5b83359250602084013567ffffffffffffffff811115612fe457600080fd5b612ff086828701612ea0565b9497909650939450505050565b600080600080600080600060a0888a03121561301857600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561303e57600080fd5b61304a8b838c01612ea0565b909750955060608a013591508082111561306357600080fd5b506130708a828b01612ea0565b989b979a50959894979596608090950135949350505050565b6000806020838503121561309c57600080fd5b823567ffffffffffffffff8111156130b357600080fd5b6130bf85828601612ea0565b90969095509350505050565b6000806000806000608086880312156130e357600080fd5b6130ec86612b33565b945060208601359350604086013567ffffffffffffffff8082111561311057600080fd5b61311c89838a01612cf3565b9450606088013591508082111561313257600080fd5b5061313f88828901612d0b565b969995985093965092949392505050565b803563ffffffff81168114612b5757600080fd5b60008060006060848603121561317957600080fd5b8335925061318960208501613150565b915061319760408501613150565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361322f5761322f6131cf565b5060010190565b60006060823603121561324857600080fd5b613250612bdf565b823567ffffffffffffffff8082111561326857600080fd5b9084019036601f83011261327b57600080fd5b813560208282111561328f5761328f612b86565b6132bf817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612c02565b925081835236818386010111156132d557600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b601981101561333a57825167ffffffffffffffff16825260209283019290910190600101613311565b50505092915050565b60008219821115613356576133566131cf565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261339057600080fd5b83018035915067ffffffffffffffff8211156133ab57600080fd5b602001915036819003821315612d5057600080fd5b600181815b8085111561341957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133ff576133ff6131cf565b8085161561340c57918102915b93841c93908002906133c5565b509250929050565b600082613430575060016134dc565b8161343d575060006134dc565b8160018114613453576002811461345d57613479565b60019150506134dc565b60ff84111561346e5761346e6131cf565b50506001821b6134dc565b5060208310610133831016604e8410600b841016171561349c575081810a6134dc565b6134a683836133c0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134d8576134d86131cf565b0290505b92915050565b60006127de8383613421565b600082821015613500576135006131cf565b500390565b600063ffffffff83811690831681811015613522576135226131cf565b039392505050565b600063ffffffff808316818516808303821115613549576135496131cf565b01949350505050565b6000845160005b818110156135735760208188018101518583015201613559565b81811115613582576000828501525b509190910192835250602082015260400191905056fea164736f6c634300080f000a",
} }
// PreimageOracleABI is the input ABI used to generate the binding from. // PreimageOracleABI is the input ABI used to generate the binding from.
...@@ -873,6 +873,27 @@ func (_PreimageOracle *PreimageOracleTransactorSession) LoadBlobPreimagePart(_z ...@@ -873,6 +873,27 @@ func (_PreimageOracle *PreimageOracleTransactorSession) LoadBlobPreimagePart(_z
return _PreimageOracle.Contract.LoadBlobPreimagePart(&_PreimageOracle.TransactOpts, _z, _y, _commitment, _proof, _partOffset) return _PreimageOracle.Contract.LoadBlobPreimagePart(&_PreimageOracle.TransactOpts, _z, _y, _commitment, _proof, _partOffset)
} }
// LoadKZGPointEvaluationPreimage is a paid mutator transaction binding the contract method 0xb893f82c.
//
// Solidity: function loadKZGPointEvaluationPreimage(bytes _input) returns()
func (_PreimageOracle *PreimageOracleTransactor) LoadKZGPointEvaluationPreimage(opts *bind.TransactOpts, _input []byte) (*types.Transaction, error) {
return _PreimageOracle.contract.Transact(opts, "loadKZGPointEvaluationPreimage", _input)
}
// LoadKZGPointEvaluationPreimage is a paid mutator transaction binding the contract method 0xb893f82c.
//
// Solidity: function loadKZGPointEvaluationPreimage(bytes _input) returns()
func (_PreimageOracle *PreimageOracleSession) LoadKZGPointEvaluationPreimage(_input []byte) (*types.Transaction, error) {
return _PreimageOracle.Contract.LoadKZGPointEvaluationPreimage(&_PreimageOracle.TransactOpts, _input)
}
// LoadKZGPointEvaluationPreimage is a paid mutator transaction binding the contract method 0xb893f82c.
//
// Solidity: function loadKZGPointEvaluationPreimage(bytes _input) returns()
func (_PreimageOracle *PreimageOracleTransactorSession) LoadKZGPointEvaluationPreimage(_input []byte) (*types.Transaction, error) {
return _PreimageOracle.Contract.LoadKZGPointEvaluationPreimage(&_PreimageOracle.TransactOpts, _input)
}
// LoadKeccak256PreimagePart is a paid mutator transaction binding the contract method 0xe1592611. // LoadKeccak256PreimagePart is a paid mutator transaction binding the contract method 0xe1592611.
// //
// Solidity: function loadKeccak256PreimagePart(uint256 _partOffset, bytes _preimage) returns() // Solidity: function loadKeccak256PreimagePart(uint256 _partOffset, bytes _preimage) returns()
......
...@@ -13,7 +13,7 @@ const PreimageOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contrac ...@@ -13,7 +13,7 @@ const PreimageOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contrac
var PreimageOracleStorageLayout = new(solc.StorageLayout) var PreimageOracleStorageLayout = new(solc.StorageLayout)
var PreimageOracleDeployedBin = "0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c80639d53a648116100ee578063dd24f9bf11610097578063ec5efcbc11610071578063ec5efcbc14610458578063f3f480d91461046b578063faf37bc714610491578063fef2b4ed146104a457600080fd5b8063dd24f9bf146103f7578063e03110e11461041d578063e15926111461044557600080fd5b8063b4801e61116100c8578063b4801e61146103c9578063d18534b5146103dc578063da35c664146103ef57600080fd5b80639d53a648146103495780639d7e87691461038b578063b2e67ba81461039e57600080fd5b806361238bde1161015b5780637ac54767116101355780637ac54767146102b95780638542cf50146102cc578063882856ef1461030a5780638dc4be111461033657600080fd5b806361238bde146102505780636551927b1461027b5780637917de1d146102a657600080fd5b80633909af5c1161018c5780633909af5c146102205780634d52b4c91461023557806352f0f3ad1461023d57600080fd5b8063013cf08b146101b35780630359a563146101f75780632055b36b14610218575b600080fd5b6101c66101c13660046129d5565b6104c4565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b61020a610205366004612a17565b610509565b6040519081526020016101ee565b61020a601081565b61023361022e366004612c12565b610641565b005b61020a61088f565b61020a61024b366004612cfe565b6108aa565b61020a61025e366004612d39565b600160209081526000928352604080842090915290825290205481565b61020a610289366004612a17565b601560209081526000928352604080842090915290825290205481565b6102336102b4366004612d9d565b61097f565b61020a6102c73660046129d5565b610e6f565b6102fa6102da366004612d39565b600260209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101ee565b61031d610318366004612e39565b610e86565b60405167ffffffffffffffff90911681526020016101ee565b610233610344366004612e6c565b610ee0565b61020a610357366004612a17565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601760209081526040808320938352929052205490565b610233610399366004612eb8565b610fdb565b61020a6103ac366004612a17565b601660209081526000928352604080842090915290825290205481565b61020a6103d7366004612e39565b6111ec565b6102336103ea366004612c12565b61121e565b60135461020a565b7f000000000000000000000000000000000000000000000000000000000000000061020a565b61043061042b366004612d39565b6115d5565b604080519283526020830191909152016101ee565b610233610453366004612e6c565b6116c6565b610233610466366004612f44565b6117ce565b7f000000000000000000000000000000000000000000000000000000000000000061020a565b61023361049f366004612fdd565b611948565b61020a6104b23660046129d5565b60006020819052908152604090205481565b601381815481106104d457600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061054c9060601c63ffffffff1690565b63ffffffff16905060005b601081101561063957816001166001036105df5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106105ac576105ac613019565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250610620565b82600382601081106105f3576105f3613019565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c908061063181613077565b915050610557565b505092915050565b600061064d8a8a610509565b905061067086868360208b013561066b6106668d6130af565b611b5b565b611b9b565b801561068e575061068e838383602088013561066b6106668a6130af565b6106c4576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8660400135886040516020016106da919061317e565b6040516020818303038152906040528051906020012014610727576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001358760200135600161073d91906131bc565b14610774576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107bc8861078286806131d4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bfc92505050565b6107c588611d57565b8360400135886040516020016107db919061317e565b6040516020818303038152906040528051906020012003610828576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505073ffffffffffffffffffffffffffffffffffffffff9590951660009081526015602090815260408083209683529590529390932080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117905550505050565b600161089d6010600261335b565b6108a79190613367565b81565b60006108b686866125f3565b90506108c38360086131bc565b8211806108d05750602083115b15610907576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b606081156109985761099186866126a0565b90506109d2565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b8154815260200190600101908083116109ff57505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610a808260601c63ffffffff1690565b63ffffffff169050333214610ac1576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ad18260801c63ffffffff1690565b63ffffffff16600003610b10576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b1a8260c01c90565b67ffffffffffffffff1615610b5b576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610b94576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba189898d8886612719565b83516020850160888204881415608883061715610bc6576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610c76578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610c6b576001821615610c4b5782818b0152610c6b565b8981015160009081526020938452604090209260019290921c9101610c2e565b505050608801610bd3565b50505050600160106002610c8a919061335b565b610c949190613367565b811115610ccd576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d42610ce08360401c63ffffffff1690565b610cf09063ffffffff168a6131bc565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b91508415610dcf5777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b179150610d7c8260801c63ffffffff1690565b63ffffffff16610d928360401c63ffffffff1690565b63ffffffff1614610dcf576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e84529091529020610df59084601061294b565b50503360008181526017602090815260408083208e8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055928252601581528282209c82529b909b52909920989098555050505050505050565b60038160108110610e7f57600080fd5b0154905081565b60176020528260005260406000206020528160005260406000208181548110610eae57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b604435600080600883018610610efe5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa905080610f2b57600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b7f0000000000000000000000000000000000000000000000000000000000000000421015611035576040517f299f254900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080603087600037602060006030600060025afa8061105d5763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa9250826110df576309bde3396000526004601cfd5b602886106110f55763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061121457600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff811615611291576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006112bc8260c01c90565b6112d09067ffffffffffffffff1642613367565b11611307576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113138b8b610509565b905061132c87878360208c013561066b6106668e6130af565b801561134a575061134a848483602089013561066b6106668b6130af565b611380576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b876040013589604051602001611396919061317e565b60405160208183030381529060405280519060200120146113e3576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460200135886020013560016113f991906131bc565b14158061142b575060016114138360601c63ffffffff1690565b61141d919061337e565b63ffffffff16856020013514155b15611462576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114708961078287806131d4565b61147989611d57565b60006114848a61286c565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f020000000000000000000000000000000000000000000000000000000000000017905060006114db8460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054600160008481526020019081526020016000206000838152602001908152602001600020819055506115ad8460801c63ffffffff1690565b60009283526020839052604090922063ffffffff909216909155505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff1661165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b506000838152602081815260409091205461167a8160086131bc565b6116858560206131bc565b106116a357836116968260086131bc565b6116a09190613367565b91505b506000938452600160209081526040808620948652939052919092205492909150565b6044356000806008830186106116e45763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b60006117da8686610509565b90506117f3838383602088013561066b6106668a6130af565b611829576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611865576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61186d612989565b61187b8161078287806131d4565b61188481611d57565b84604001358160405160200161189a919061317e565b60405160208183030381529060405280519060200120036118e7576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505073ffffffffffffffffffffffffffffffffffffffff9290921660009081526015602090815260408083209383529290522080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117905550565b333214611981576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61198c8160086133a3565b63ffffffff168263ffffffff16106119d0576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008163ffffffff161015611a30576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601560209081526040808320878452825280832080547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1660a09790971b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff169690961760809590951b9490941790945582518084019093529082529181019283526013805460018101825592525160029091027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0908101805473ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff00000000000000000000000000000000000000009093169290921790915590517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09190910155565b6000816000015182602001518360400151604051602001611b7e939291906133cb565b604051602081830303815290604052805190602001209050919050565b60008160005b6010811015611bef578060051b880135600186831c1660018114611bd45760008481526020839052604090209350611be5565b600082815260208590526040902093505b5050600101611ba1565b5090931495945050505050565b6088815114611c0a57600080fd5b6020810160208301611c8b565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b1717179050611c8581611c70868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b611c9760008383611c17565b611ca360018383611c17565b611caf60028383611c17565b611cbb60038383611c17565b611cc760048383611c17565b611cd360058383611c17565b611cdf60068383611c17565b611ceb60078383611c17565b611cf760088383611c17565b611d0360098383611c17565b611d0f600a8383611c17565b611d1b600b8383611c17565b611d27600c8383611c17565b611d33600d8383611c17565b611d3f600e8383611c17565b611d4b600f8383611c17565b611c8560108383611c17565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e001604051602081830303815290604052905060208201602082016124d3565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c611f0a8660011b67ffffffffffffffff1690565b18188584603f1c611f258660011b67ffffffffffffffff1690565b18188584603f1c611f408660011b67ffffffffffffffff1690565b181895508483603f1c611f5d8560011b67ffffffffffffffff1690565b181894508387603f1c611f7a8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525050505050565b6122fa81611e4d565b805160208201805160408401805160608601805160808801805167ffffffffffffffff871986168a188116808c528619851689188216909952831982169095188516909552841988169091188316909152941990921618811690925260a08301805160c0808601805160e0880180516101008a0180516101208c018051861985168a188d16909a528319821686188c16909652801989169092188a169092528619861618881690529219909216909218841690526101408401805161016086018051610180880180516101a08a0180516101c08c0180518619851689188d169099528319821686188c16909652801988169092188a169092528519851618881690529119909116909118841690526101e08401805161020086018051610220880180516102408a0180516102608c0180518619851689188d169099528319821686188c16909652801988169092188a16909252851985161888169052911990911690911884169052610280840180516102a0860180516102c0880180516102e08a0180516103008c0180518619851689188d169099528319821686188c16909652801988169092188a16909252851985161888169052911990911690911884169052600386901b850151901c9081189091168252611c85565b6124df600082846122f1565b6124eb600182846122f1565b6124f7600282846122f1565b612503600382846122f1565b61250f600482846122f1565b61251b600582846122f1565b612527600682846122f1565b612533600782846122f1565b61253f600882846122f1565b61254b600982846122f1565b612557600a82846122f1565b612563600b82846122f1565b61256f600c82846122f1565b61257b600d82846122f1565b612587600e82846122f1565b612593600f82846122f1565b61259f601082846122f1565b6125ab601182846122f1565b6125b7601282846122f1565b6125c3601382846122f1565b6125cf601482846122f1565b6125db601582846122f1565b6125e7601682846122f1565b611c85601782846122f1565b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831617612699818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b60606040519050816020820181810182868337608883068080156126e95760888290038501848101848103803687375060806001820353506001845160001a1784538652612700565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b600061272b8260a01c63ffffffff1690565b67ffffffffffffffff16905060006127498360801c63ffffffff1690565b63ffffffff16905060006127638460401c63ffffffff1690565b63ffffffff169050600883108015612779575080155b156127ad5760c082901b6000908152883560085283513382526016602090815260408084208a855290915290912055612862565b600883101580156127cb5750806127c5600885613367565b93508310155b80156127df57506127dc87826131bc565b83105b156128625760006127f08285613367565b9050876127fe8260206131bc565b1015801561280a575085155b15612841576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526016602090815260408083208a845290915290209089013590555b5050505050505050565b60006128ef565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff0061289d8360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff00006128ca8360101b67ffffffffffffffff1690565b1617905060008160201c6128e88360201b67ffffffffffffffff1690565b1792915050565b6080820151602083019061290790612873565b612873565b604082015161291590612873565b60401b1761292d61290260018460059190911b015190565b825160809190911b9061293f90612873565b60c01b17179392505050565b8260108101928215612979579160200282015b8281111561297957825182559160200191906001019061295e565b506129859291506129a1565b5090565b604051806020016040528061299c6129b6565b905290565b5b8082111561298557600081556001016129a2565b6040518061032001604052806019906020820280368337509192915050565b6000602082840312156129e757600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a1257600080fd5b919050565b60008060408385031215612a2a57600080fd5b612a33836129ee565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612a9457612a94612a41565b60405290565b6040516060810167ffffffffffffffff81118282101715612a9457612a94612a41565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612b0457612b04612a41565b604052919050565b6000610320808385031215612b2057600080fd5b604051602080820167ffffffffffffffff8382108183111715612b4557612b45612a41565b8160405283955087601f880112612b5b57600080fd5b612b63612a70565b9487019491508188861115612b7757600080fd5b875b86811015612b9f5780358381168114612b925760008081fd5b8452928401928401612b79565b50909352509295945050505050565b600060608284031215612bc057600080fd5b50919050565b60008083601f840112612bd857600080fd5b50813567ffffffffffffffff811115612bf057600080fd5b6020830191508360208260051b8501011115612c0b57600080fd5b9250929050565b60008060008060008060008060006103e08a8c031215612c3157600080fd5b612c3a8a6129ee565b985060208a01359750612c508b60408c01612b0c565b96506103608a013567ffffffffffffffff80821115612c6e57600080fd5b612c7a8d838e01612bae565b97506103808c0135915080821115612c9157600080fd5b612c9d8d838e01612bc6565b90975095506103a08c0135915080821115612cb757600080fd5b612cc38d838e01612bae565b94506103c08c0135915080821115612cda57600080fd5b50612ce78c828d01612bc6565b915080935050809150509295985092959850929598565b600080600080600060a08688031215612d1657600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060408385031215612d4c57600080fd5b50508035926020909101359150565b60008083601f840112612d6d57600080fd5b50813567ffffffffffffffff811115612d8557600080fd5b602083019150836020828501011115612c0b57600080fd5b600080600080600080600060a0888a031215612db857600080fd5b8735965060208801359550604088013567ffffffffffffffff80821115612dde57600080fd5b612dea8b838c01612d5b565b909750955060608a0135915080821115612e0357600080fd5b50612e108a828b01612bc6565b90945092505060808801358015158114612e2957600080fd5b8091505092959891949750929550565b600080600060608486031215612e4e57600080fd5b612e57846129ee565b95602085013595506040909401359392505050565b600080600060408486031215612e8157600080fd5b83359250602084013567ffffffffffffffff811115612e9f57600080fd5b612eab86828701612d5b565b9497909650939450505050565b600080600080600080600060a0888a031215612ed357600080fd5b8735965060208801359550604088013567ffffffffffffffff80821115612ef957600080fd5b612f058b838c01612d5b565b909750955060608a0135915080821115612f1e57600080fd5b50612f2b8a828b01612d5b565b989b979a50959894979596608090950135949350505050565b600080600080600060808688031215612f5c57600080fd5b612f65866129ee565b945060208601359350604086013567ffffffffffffffff80821115612f8957600080fd5b612f9589838a01612bae565b94506060880135915080821115612fab57600080fd5b50612fb888828901612bc6565b969995985093965092949392505050565b803563ffffffff81168114612a1257600080fd5b600080600060608486031215612ff257600080fd5b8335925061300260208501612fc9565b915061301060408501612fc9565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036130a8576130a8613048565b5060010190565b6000606082360312156130c157600080fd5b6130c9612a9a565b823567ffffffffffffffff808211156130e157600080fd5b9084019036601f8301126130f457600080fd5b813560208282111561310857613108612a41565b613138817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612abd565b9250818352368183860101111561314e57600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b60198110156131b357825167ffffffffffffffff1682526020928301929091019060010161318a565b50505092915050565b600082198211156131cf576131cf613048565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261320957600080fd5b83018035915067ffffffffffffffff82111561322457600080fd5b602001915036819003821315612c0b57600080fd5b600181815b8085111561329257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561327857613278613048565b8085161561328557918102915b93841c939080029061323e565b509250929050565b6000826132a957506001613355565b816132b657506000613355565b81600181146132cc57600281146132d6576132f2565b6001915050613355565b60ff8411156132e7576132e7613048565b50506001821b613355565b5060208310610133831016604e8410600b8410161715613315575081810a613355565b61331f8383613239565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561335157613351613048565b0290505b92915050565b6000612699838361329a565b60008282101561337957613379613048565b500390565b600063ffffffff8381169083168181101561339b5761339b613048565b039392505050565b600063ffffffff8083168185168083038211156133c2576133c2613048565b01949350505050565b6000845160005b818110156133ec57602081880181015185830152016133d2565b818111156133fb576000828501525b509190910192835250602082015260400191905056fea164736f6c634300080f000a" var PreimageOracleDeployedBin = "0x608060405234801561001057600080fd5b50600436106101b95760003560e01c80639d53a648116100f9578063dd24f9bf11610097578063ec5efcbc11610071578063ec5efcbc14610476578063f3f480d914610489578063faf37bc7146104af578063fef2b4ed146104c257600080fd5b8063dd24f9bf14610415578063e03110e11461043b578063e15926111461046357600080fd5b8063b4801e61116100d3578063b4801e61146103d4578063b893f82c146103e7578063d18534b5146103fa578063da35c6641461040d57600080fd5b80639d53a648146103545780639d7e876914610396578063b2e67ba8146103a957600080fd5b806361238bde116101665780637ac54767116101405780637ac54767146102c45780638542cf50146102d7578063882856ef146103155780638dc4be111461034157600080fd5b806361238bde1461025b5780636551927b146102865780637917de1d146102b157600080fd5b80633909af5c116101975780633909af5c1461022b5780634d52b4c91461024057806352f0f3ad1461024857600080fd5b8063013cf08b146101be5780630359a563146102025780632055b36b14610223575b600080fd5b6101d16101cc366004612b1a565b6104e2565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b610215610210366004612b5c565b610527565b6040519081526020016101f9565b610215601081565b61023e610239366004612d57565b61065f565b005b6102156108ad565b610215610256366004612e43565b6108c8565b610215610269366004612e7e565b600160209081526000928352604080842090915290825290205481565b610215610294366004612b5c565b601560209081526000928352604080842090915290825290205481565b61023e6102bf366004612ee2565b61099d565b6102156102d2366004612b1a565b610e8d565b6103056102e5366004612e7e565b600260209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101f9565b610328610323366004612f7e565b610ea4565b60405167ffffffffffffffff90911681526020016101f9565b61023e61034f366004612fb1565b610efe565b610215610362366004612b5c565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601760209081526040808320938352929052205490565b61023e6103a4366004612ffd565b610ff9565b6102156103b7366004612b5c565b601660209081526000928352604080842090915290825290205481565b6102156103e2366004612f7e565b61120a565b61023e6103f5366004613089565b61123c565b61023e610408366004612d57565b611363565b601354610215565b7f0000000000000000000000000000000000000000000000000000000000000000610215565b61044e610449366004612e7e565b61171a565b604080519283526020830191909152016101f9565b61023e610471366004612fb1565b61180b565b61023e6104843660046130cb565b611913565b7f0000000000000000000000000000000000000000000000000000000000000000610215565b61023e6104bd366004613164565b611a8d565b6102156104d0366004612b1a565b60006020819052908152604090205481565b601381815481106104f257600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061056a9060601c63ffffffff1690565b63ffffffff16905060005b601081101561065757816001166001036105fd5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106105ca576105ca6131a0565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925061063e565b8260038260108110610611576106116131a0565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c908061064f816131fe565b915050610575565b505092915050565b600061066b8a8a610527565b905061068e86868360208b01356106896106848d613236565b611ca0565b611ce0565b80156106ac57506106ac83838360208801356106896106848a613236565b6106e2576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8660400135886040516020016106f89190613305565b6040516020818303038152906040528051906020012014610745576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001358760200135600161075b9190613343565b14610792576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107da886107a0868061335b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d4192505050565b6107e388611e9c565b8360400135886040516020016107f99190613305565b6040516020818303038152906040528051906020012003610846576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505073ffffffffffffffffffffffffffffffffffffffff9590951660009081526015602090815260408083209683529590529390932080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117905550505050565b60016108bb601060026134e2565b6108c591906134ee565b81565b60006108d48686612738565b90506108e1836008613343565b8211806108ee5750602083115b15610925576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b606081156109b6576109af86866127e5565b90506109f0565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610a1d57505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610a9e8260601c63ffffffff1690565b63ffffffff169050333214610adf576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aef8260801c63ffffffff1690565b63ffffffff16600003610b2e576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b388260c01c90565b67ffffffffffffffff1615610b79576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610bb2576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bbf89898d888661285e565b83516020850160888204881415608883061715610be4576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610c94578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610c89576001821615610c695782818b0152610c89565b8981015160009081526020938452604090209260019290921c9101610c4c565b505050608801610bf1565b50505050600160106002610ca891906134e2565b610cb291906134ee565b811115610ceb576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d60610cfe8360401c63ffffffff1690565b610d0e9063ffffffff168a613343565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b91508415610ded5777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b179150610d9a8260801c63ffffffff1690565b63ffffffff16610db08360401c63ffffffff1690565b63ffffffff1614610ded576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e84529091529020610e1390846010612a90565b50503360008181526017602090815260408083208e8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055928252601581528282209c82529b909b52909920989098555050505050505050565b60038160108110610e9d57600080fd5b0154905081565b60176020528260005260406000206020528160005260406000208181548110610ecc57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b604435600080600883018610610f1c5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa905080610f4957600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b7f0000000000000000000000000000000000000000000000000000000000000000421015611053576040517f299f254900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080603087600037602060006030600060025afa8061107b5763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa9250826110fd576309bde3396000526004601cfd5b602886106111135763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061123257600080fd5b0154925083915050565b7f0000000000000000000000000000000000000000000000000000000000000000421015611296576040517f299f254900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806080838582378381207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06000000000000000000000000000000000000000000000000000000000000001792506000808583600a5afa6000848152600260209081526040808320838052825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155878452808352818420848052835281842060f89590951b909455958252819052939093209290925550505050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156113d6576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006114018260c01c90565b6114159067ffffffffffffffff16426134ee565b1161144c576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006114588b8b610527565b905061147187878360208c01356106896106848e613236565b801561148f575061148f84848360208901356106896106848b613236565b6114c5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016114db9190613305565b6040516020818303038152906040528051906020012014611528576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84602001358860200135600161153e9190613343565b141580611570575060016115588360601c63ffffffff1690565b6115629190613505565b63ffffffff16856020013514155b156115a7576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115b5896107a0878061335b565b6115be89611e9c565b60006115c98a6129b1565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f020000000000000000000000000000000000000000000000000000000000000017905060006116208460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054600160008481526020019081526020016000206000838152602001908152602001600020819055506116f28460801c63ffffffff1690565b60009283526020839052604090922063ffffffff909216909155505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff166117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546117bf816008613343565b6117ca856020613343565b106117e857836117db826008613343565b6117e591906134ee565b91505b506000938452600160209081526040808620948652939052919092205492909150565b6044356000806008830186106118295763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b600061191f8686610527565b905061193883838360208801356106896106848a613236565b61196e576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840135156119aa576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119b2612ace565b6119c0816107a0878061335b565b6119c981611e9c565b8460400135816040516020016119df9190613305565b6040516020818303038152906040528051906020012003611a2c576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505073ffffffffffffffffffffffffffffffffffffffff9290921660009081526015602090815260408083209383529290522080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117905550565b333214611ac6576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ad181600861352a565b63ffffffff168263ffffffff1610611b15576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008163ffffffff161015611b75576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601560209081526040808320878452825280832080547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1660a09790971b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff169690961760809590951b9490941790945582518084019093529082529181019283526013805460018101825592525160029091027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0908101805473ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff00000000000000000000000000000000000000009093169290921790915590517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09190910155565b6000816000015182602001518360400151604051602001611cc393929190613552565b604051602081830303815290604052805190602001209050919050565b60008160005b6010811015611d34578060051b880135600186831c1660018114611d195760008481526020839052604090209350611d2a565b600082815260208590526040902093505b5050600101611ce6565b5090931495945050505050565b6088815114611d4f57600080fd5b6020810160208301611dd0565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b1717179050611dca81611db5868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b611ddc60008383611d5c565b611de860018383611d5c565b611df460028383611d5c565b611e0060038383611d5c565b611e0c60048383611d5c565b611e1860058383611d5c565b611e2460068383611d5c565b611e3060078383611d5c565b611e3c60088383611d5c565b611e4860098383611d5c565b611e54600a8383611d5c565b611e60600b8383611d5c565b611e6c600c8383611d5c565b611e78600d8383611d5c565b611e84600e8383611d5c565b611e90600f8383611d5c565b611dca60108383611d5c565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e00160405160208183030381529060405290506020820160208201612618565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c61204f8660011b67ffffffffffffffff1690565b18188584603f1c61206a8660011b67ffffffffffffffff1690565b18188584603f1c6120858660011b67ffffffffffffffff1690565b181895508483603f1c6120a28560011b67ffffffffffffffff1690565b181894508387603f1c6120bf8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525050505050565b61243f81611f92565b805160208201805160408401805160608601805160808801805167ffffffffffffffff871986168a188116808c528619851689188216909952831982169095188516909552841988169091188316909152941990921618811690925260a08301805160c0808601805160e0880180516101008a0180516101208c018051861985168a188d16909a528319821686188c16909652801989169092188a169092528619861618881690529219909216909218841690526101408401805161016086018051610180880180516101a08a0180516101c08c0180518619851689188d169099528319821686188c16909652801988169092188a169092528519851618881690529119909116909118841690526101e08401805161020086018051610220880180516102408a0180516102608c0180518619851689188d169099528319821686188c16909652801988169092188a16909252851985161888169052911990911690911884169052610280840180516102a0860180516102c0880180516102e08a0180516103008c0180518619851689188d169099528319821686188c16909652801988169092188a16909252851985161888169052911990911690911884169052600386901b850151901c9081189091168252611dca565b61262460008284612436565b61263060018284612436565b61263c60028284612436565b61264860038284612436565b61265460048284612436565b61266060058284612436565b61266c60068284612436565b61267860078284612436565b61268460088284612436565b61269060098284612436565b61269c600a8284612436565b6126a8600b8284612436565b6126b4600c8284612436565b6126c0600d8284612436565b6126cc600e8284612436565b6126d8600f8284612436565b6126e460108284612436565b6126f060118284612436565b6126fc60128284612436565b61270860138284612436565b61271460148284612436565b61272060158284612436565b61272c60168284612436565b611dca60178284612436565b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316176127de818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b606060405190508160208201818101828683376088830680801561282e5760888290038501848101848103803687375060806001820353506001845160001a1784538652612845565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b60006128708260a01c63ffffffff1690565b67ffffffffffffffff169050600061288e8360801c63ffffffff1690565b63ffffffff16905060006128a88460401c63ffffffff1690565b63ffffffff1690506008831080156128be575080155b156128f25760c082901b6000908152883560085283513382526016602090815260408084208a8552909152909120556129a7565b6008831015801561291057508061290a6008856134ee565b93508310155b801561292457506129218782613343565b83105b156129a757600061293582856134ee565b905087612943826020613343565b1015801561294f575085155b15612986576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526016602090815260408083208a845290915290209089013590555b5050505050505050565b6000612a34565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff006129e28360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612a0f8360101b67ffffffffffffffff1690565b1617905060008160201c612a2d8360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612a4c906129b8565b6129b8565b6040820151612a5a906129b8565b60401b17612a72612a4760018460059190911b015190565b825160809190911b90612a84906129b8565b60c01b17179392505050565b8260108101928215612abe579160200282015b82811115612abe578251825591602001919060010190612aa3565b50612aca929150612ae6565b5090565b6040518060200160405280612ae1612afb565b905290565b5b80821115612aca5760008155600101612ae7565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612b2c57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b5757600080fd5b919050565b60008060408385031215612b6f57600080fd5b612b7883612b33565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612bd957612bd9612b86565b60405290565b6040516060810167ffffffffffffffff81118282101715612bd957612bd9612b86565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612c4957612c49612b86565b604052919050565b6000610320808385031215612c6557600080fd5b604051602080820167ffffffffffffffff8382108183111715612c8a57612c8a612b86565b8160405283955087601f880112612ca057600080fd5b612ca8612bb5565b9487019491508188861115612cbc57600080fd5b875b86811015612ce45780358381168114612cd75760008081fd5b8452928401928401612cbe565b50909352509295945050505050565b600060608284031215612d0557600080fd5b50919050565b60008083601f840112612d1d57600080fd5b50813567ffffffffffffffff811115612d3557600080fd5b6020830191508360208260051b8501011115612d5057600080fd5b9250929050565b60008060008060008060008060006103e08a8c031215612d7657600080fd5b612d7f8a612b33565b985060208a01359750612d958b60408c01612c51565b96506103608a013567ffffffffffffffff80821115612db357600080fd5b612dbf8d838e01612cf3565b97506103808c0135915080821115612dd657600080fd5b612de28d838e01612d0b565b90975095506103a08c0135915080821115612dfc57600080fd5b612e088d838e01612cf3565b94506103c08c0135915080821115612e1f57600080fd5b50612e2c8c828d01612d0b565b915080935050809150509295985092959850929598565b600080600080600060a08688031215612e5b57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060408385031215612e9157600080fd5b50508035926020909101359150565b60008083601f840112612eb257600080fd5b50813567ffffffffffffffff811115612eca57600080fd5b602083019150836020828501011115612d5057600080fd5b600080600080600080600060a0888a031215612efd57600080fd5b8735965060208801359550604088013567ffffffffffffffff80821115612f2357600080fd5b612f2f8b838c01612ea0565b909750955060608a0135915080821115612f4857600080fd5b50612f558a828b01612d0b565b90945092505060808801358015158114612f6e57600080fd5b8091505092959891949750929550565b600080600060608486031215612f9357600080fd5b612f9c84612b33565b95602085013595506040909401359392505050565b600080600060408486031215612fc657600080fd5b83359250602084013567ffffffffffffffff811115612fe457600080fd5b612ff086828701612ea0565b9497909650939450505050565b600080600080600080600060a0888a03121561301857600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561303e57600080fd5b61304a8b838c01612ea0565b909750955060608a013591508082111561306357600080fd5b506130708a828b01612ea0565b989b979a50959894979596608090950135949350505050565b6000806020838503121561309c57600080fd5b823567ffffffffffffffff8111156130b357600080fd5b6130bf85828601612ea0565b90969095509350505050565b6000806000806000608086880312156130e357600080fd5b6130ec86612b33565b945060208601359350604086013567ffffffffffffffff8082111561311057600080fd5b61311c89838a01612cf3565b9450606088013591508082111561313257600080fd5b5061313f88828901612d0b565b969995985093965092949392505050565b803563ffffffff81168114612b5757600080fd5b60008060006060848603121561317957600080fd5b8335925061318960208501613150565b915061319760408501613150565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361322f5761322f6131cf565b5060010190565b60006060823603121561324857600080fd5b613250612bdf565b823567ffffffffffffffff8082111561326857600080fd5b9084019036601f83011261327b57600080fd5b813560208282111561328f5761328f612b86565b6132bf817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612c02565b925081835236818386010111156132d557600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b601981101561333a57825167ffffffffffffffff16825260209283019290910190600101613311565b50505092915050565b60008219821115613356576133566131cf565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261339057600080fd5b83018035915067ffffffffffffffff8211156133ab57600080fd5b602001915036819003821315612d5057600080fd5b600181815b8085111561341957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133ff576133ff6131cf565b8085161561340c57918102915b93841c93908002906133c5565b509250929050565b600082613430575060016134dc565b8161343d575060006134dc565b8160018114613453576002811461345d57613479565b60019150506134dc565b60ff84111561346e5761346e6131cf565b50506001821b6134dc565b5060208310610133831016604e8410600b841016171561349c575081810a6134dc565b6134a683836133c0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134d8576134d86131cf565b0290505b92915050565b60006127de8383613421565b600082821015613500576135006131cf565b500390565b600063ffffffff83811690831681811015613522576135226131cf565b039392505050565b600063ffffffff808316818516808303821115613549576135496131cf565b01949350505050565b6000845160005b818110156135735760208188018101518583015201613559565b81811115613582576000828501525b509190910192835250602082015260400191905056fea164736f6c634300080f000a"
func init() { func init() {
......
...@@ -26,6 +26,7 @@ const ( ...@@ -26,6 +26,7 @@ const (
methodLoadKeccak256PreimagePart = "loadKeccak256PreimagePart" methodLoadKeccak256PreimagePart = "loadKeccak256PreimagePart"
methodLoadSha256PreimagePart = "loadSha256PreimagePart" methodLoadSha256PreimagePart = "loadSha256PreimagePart"
methodLoadBlobPreimagePart = "loadBlobPreimagePart" methodLoadBlobPreimagePart = "loadBlobPreimagePart"
methodLoadKZGPointEvaluationPreimage = "loadKZGPointEvaluationPreimage"
methodProposalCount = "proposalCount" methodProposalCount = "proposalCount"
methodProposals = "proposals" methodProposals = "proposals"
methodProposalMetadata = "proposalMetadata" methodProposalMetadata = "proposalMetadata"
...@@ -102,6 +103,9 @@ func (c *PreimageOracleContract) AddGlobalDataTx(data *types.PreimageOracleData) ...@@ -102,6 +103,9 @@ func (c *PreimageOracleContract) AddGlobalDataTx(data *types.PreimageOracleData)
data.BlobProof, data.BlobProof,
new(big.Int).SetUint64(uint64(data.OracleOffset))) new(big.Int).SetUint64(uint64(data.OracleOffset)))
return call.ToTxCandidate() return call.ToTxCandidate()
case preimage.KZGPointEvaluationKeyType:
call := c.contract.Call(methodLoadKZGPointEvaluationPreimage, data.GetPreimageWithoutSize())
return call.ToTxCandidate()
default: default:
return txmgr.TxCandidate{}, fmt.Errorf("%w: %v", ErrUnsupportedKeyType, keyType) return txmgr.TxCandidate{}, fmt.Errorf("%w: %v", ErrUnsupportedKeyType, keyType)
} }
......
...@@ -70,6 +70,19 @@ func TestPreimageOracleContract_AddGlobalDataTx(t *testing.T) { ...@@ -70,6 +70,19 @@ func TestPreimageOracleContract_AddGlobalDataTx(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
stubRpc.VerifyTxCandidate(tx) stubRpc.VerifyTxCandidate(tx)
}) })
t.Run("KZGPointEvaluation", func(t *testing.T) {
stubRpc, oracle := setupPreimageOracleTest(t)
input := testutils.RandomData(rand.New(rand.NewSource(23)), 200)
data := types.NewPreimageOracleKZGPointEvaluationData(common.Hash{byte(preimage.KZGPointEvaluationKeyType), 0xcc}.Bytes(), input)
stubRpc.SetResponse(oracleAddr, methodLoadKZGPointEvaluationPreimage, batching.BlockLatest, []interface{}{
data.GetPreimageWithoutSize(),
}, nil)
tx, err := oracle.AddGlobalDataTx(data)
require.NoError(t, err)
stubRpc.VerifyTxCandidate(tx)
})
} }
func TestPreimageOracleContract_ChallengePeriod(t *testing.T) { func TestPreimageOracleContract_ChallengePeriod(t *testing.T) {
......
...@@ -33,7 +33,7 @@ func (d *DirectPreimageUploader) UploadPreimage(ctx context.Context, claimIdx ui ...@@ -33,7 +33,7 @@ func (d *DirectPreimageUploader) UploadPreimage(ctx context.Context, claimIdx ui
if data == nil { if data == nil {
return ErrNilPreimageData return ErrNilPreimageData
} }
d.log.Info("Updating oracle data", "key", data.OracleKey) d.log.Info("Updating oracle data", "key", fmt.Sprintf("%x", data.OracleKey))
candidate, err := d.contract.UpdateOracleTx(ctx, claimIdx, data) candidate, err := d.contract.UpdateOracleTx(ctx, claimIdx, data)
if err != nil { if err != nil {
return fmt.Errorf("failed to create pre-image oracle tx: %w", err) return fmt.Errorf("failed to create pre-image oracle tx: %w", err)
......
...@@ -46,6 +46,8 @@ func (l *preimageLoader) LoadPreimage(proof *proofData) (*types.PreimageOracleDa ...@@ -46,6 +46,8 @@ func (l *preimageLoader) LoadPreimage(proof *proofData) (*types.PreimageOracleDa
switch preimage.KeyType(proof.OracleKey[0]) { switch preimage.KeyType(proof.OracleKey[0]) {
case preimage.BlobKeyType: case preimage.BlobKeyType:
return l.loadBlobPreimage(proof) return l.loadBlobPreimage(proof)
case preimage.KZGPointEvaluationKeyType:
return l.loadKZGPointEvaluationPreimage(proof)
default: default:
return types.NewPreimageOracleData(proof.OracleKey, proof.OracleValue, proof.OracleOffset), nil return types.NewPreimageOracleData(proof.OracleKey, proof.OracleValue, proof.OracleOffset), nil
} }
...@@ -96,8 +98,23 @@ func (l *preimageLoader) loadBlobPreimage(proof *proofData) (*types.PreimageOrac ...@@ -96,8 +98,23 @@ func (l *preimageLoader) loadBlobPreimage(proof *proofData) (*types.PreimageOrac
return nil, fmt.Errorf("failed to verify proof: %w", err) return nil, fmt.Errorf("failed to verify proof: %w", err)
} }
claimWithLength := make([]byte, len(claim)+lengthPrefixSize) claimWithLength := lengthPrefixed(claim[:])
binary.BigEndian.PutUint64(claimWithLength[:lengthPrefixSize], uint64(len(claim)))
copy(claimWithLength[lengthPrefixSize:], claim[:])
return types.NewPreimageOracleBlobData(proof.OracleKey, claimWithLength, proof.OracleOffset, requiredFieldElement, commitment, kzgProof[:]), nil return types.NewPreimageOracleBlobData(proof.OracleKey, claimWithLength, proof.OracleOffset, requiredFieldElement, commitment, kzgProof[:]), nil
} }
func (l *preimageLoader) loadKZGPointEvaluationPreimage(proof *proofData) (*types.PreimageOracleData, error) {
inputKey := preimage.Keccak256Key(proof.OracleKey).PreimageKey()
input, err := l.getPreimage(inputKey)
if err != nil {
return nil, fmt.Errorf("failed to get key preimage: %w", err)
}
inputWithLength := lengthPrefixed(input)
return types.NewPreimageOracleKZGPointEvaluationData(proof.OracleKey, inputWithLength), nil
}
func lengthPrefixed(data []byte) []byte {
dataWithLength := make([]byte, len(data)+lengthPrefixSize)
binary.BigEndian.PutUint64(dataWithLength[:lengthPrefixSize], uint64(len(data)))
copy(dataWithLength[lengthPrefixSize:], data)
return dataWithLength
}
...@@ -152,6 +152,31 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) { ...@@ -152,6 +152,31 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) {
}) })
} }
func TestPreimageLoader_KZGPointEvaluationPreimage(t *testing.T) {
input := []byte("test input")
key := preimage.KZGPointEvaluationKey(crypto.Keccak256Hash(input)).PreimageKey()
proof := &proofData{
OracleKey: key[:],
}
t.Run("NoInputPreimage", func(t *testing.T) {
kv := kvstore.NewMemKV()
loader := newPreimageLoader(kv.Get)
_, err := loader.LoadPreimage(proof)
require.ErrorIs(t, err, kvstore.ErrNotFound)
})
t.Run("Valid", func(t *testing.T) {
kv := kvstore.NewMemKV()
loader := newPreimageLoader(kv.Get)
require.NoError(t, kv.Put(preimage.Keccak256Key(proof.OracleKey).PreimageKey(), input))
actual, err := loader.LoadPreimage(proof)
require.NoError(t, err)
inputWithLength := lengthPrefixed(input)
expected := types.NewPreimageOracleKZGPointEvaluationData(proof.OracleKey, inputWithLength)
require.Equal(t, expected, actual)
})
}
// Returns a serialized random field element in big-endian // Returns a serialized random field element in big-endian
func fieldElement(val uint64) [32]byte { func fieldElement(val uint64) [32]byte {
r := fr.NewElement(val) r := fr.NewElement(val)
......
...@@ -265,6 +265,10 @@ func FirstKeccakPreimageLoad() PreimageOpt { ...@@ -265,6 +265,10 @@ func FirstKeccakPreimageLoad() PreimageOpt {
return FirstPreimageLoadOfType("keccak") return FirstPreimageLoadOfType("keccak")
} }
func FirstKZGPointEvaluationPreimageLoad() PreimageOpt {
return FirstPreimageLoadOfType("kzg-point-evaluation")
}
func PreimageLargerThan(size int) PreimageOpt { func PreimageLargerThan(size int) PreimageOpt {
return func() preimageOpts { return func() preimageOpts {
return []string{"--stop-at-preimage-larger-than", strconv.Itoa(size)} return []string{"--stop-at-preimage-larger-than", strconv.Itoa(size)}
......
...@@ -79,6 +79,15 @@ func NewPreimageOracleBlobData(key []byte, data []byte, offset uint32, fieldInde ...@@ -79,6 +79,15 @@ func NewPreimageOracleBlobData(key []byte, data []byte, offset uint32, fieldInde
} }
} }
func NewPreimageOracleKZGPointEvaluationData(key []byte, input []byte) *PreimageOracleData {
return &PreimageOracleData{
IsLocal: false,
OracleKey: key,
oracleData: input,
OracleOffset: 0,
}
}
// StepCallData encapsulates the data needed to perform a step. // StepCallData encapsulates the data needed to perform a step.
type StepCallData struct { type StepCallData struct {
ClaimIndex uint64 ClaimIndex uint64
......
...@@ -15,6 +15,7 @@ import ( ...@@ -15,6 +15,7 @@ import (
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
keccakTypes "github.com/ethereum-optimism/optimism/op-challenger/game/keccak/types" keccakTypes "github.com/ethereum-optimism/optimism/op-challenger/game/keccak/types"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
preimage "github.com/ethereum-optimism/optimism/op-preimage"
"github.com/ethereum-optimism/optimism/op-service/sources/batching" "github.com/ethereum-optimism/optimism/op-service/sources/batching"
"github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
...@@ -558,7 +559,13 @@ func (g *OutputGameHelper) uploadPreimage(ctx context.Context, data *types.Preim ...@@ -558,7 +559,13 @@ func (g *OutputGameHelper) uploadPreimage(ctx context.Context, data *types.Preim
oracle := g.oracle(ctx) oracle := g.oracle(ctx)
boundOracle, err := bindings.NewPreimageOracle(oracle.Addr(), g.client) boundOracle, err := bindings.NewPreimageOracle(oracle.Addr(), g.client)
g.require.NoError(err) g.require.NoError(err)
tx, err := boundOracle.LoadKeccak256PreimagePart(g.opts, new(big.Int).SetUint64(uint64(data.OracleOffset)), data.GetPreimageWithoutSize()) var tx *gethtypes.Transaction
switch data.OracleKey[0] {
case byte(preimage.KZGPointEvaluationKeyType):
tx, err = boundOracle.LoadKZGPointEvaluationPreimage(g.opts, data.GetPreimageWithoutSize())
default:
tx, err = boundOracle.LoadKeccak256PreimagePart(g.opts, new(big.Int).SetUint64(uint64(data.OracleOffset)), data.GetPreimageWithoutSize())
}
g.require.NoError(err, "Failed to load preimage part") g.require.NoError(err, "Failed to load preimage part")
_, err = wait.ForReceiptOK(ctx, g.client, tx.Hash()) _, err = wait.ForReceiptOK(ctx, g.client, tx.Hash())
g.require.NoError(err) g.require.NoError(err)
......
...@@ -84,6 +84,17 @@ func ForUnsafeBlock(ctx context.Context, rollupCl *sources.RollupClient, n uint6 ...@@ -84,6 +84,17 @@ func ForUnsafeBlock(ctx context.Context, rollupCl *sources.RollupClient, n uint6
return err return err
} }
func ForSafeBlock(ctx context.Context, rollupClient *sources.RollupClient, n uint64) error {
ctx, cancel := context.WithTimeout(ctx, 60*time.Second)
defer cancel()
_, err := AndGet(ctx, time.Second, func() (*eth.SyncStatus, error) {
return rollupClient.SyncStatus(ctx)
}, func(syncStatus *eth.SyncStatus) bool {
return syncStatus.SafeL2.Number >= n
})
return err
}
func ForNextSafeBlock(ctx context.Context, client BlockCaller) (*types.Block, error) { func ForNextSafeBlock(ctx context.Context, client BlockCaller) (*types.Block, error) {
safeBlockNumber := big.NewInt(rpc.SafeBlockNumber.Int64()) safeBlockNumber := big.NewInt(rpc.SafeBlockNumber.Int64())
current, err := client.BlockByNumber(ctx, safeBlockNumber) current, err := client.BlockByNumber(ctx, safeBlockNumber)
......
...@@ -294,6 +294,46 @@ func TestOutputCannonStepWithPreimage(t *testing.T) { ...@@ -294,6 +294,46 @@ func TestOutputCannonStepWithPreimage(t *testing.T) {
}) })
} }
func TestOutputCannonStepWithKZGPointEvaluation(t *testing.T) {
testPreimageStep := func(t *testing.T, preloadPreimage bool) {
op_e2e.InitParallel(t, op_e2e.UsesCannon)
ctx := context.Background()
sys, _ := startFaultDisputeSystem(t, withEcotone())
t.Cleanup(sys.Close)
receipt := sendKZGPointEvaluationTx(t, sys, "sequencer", sys.Cfg.Secrets.Alice)
precompileBlock := receipt.BlockNumber
t.Logf("KZG Point Evaluation block number: %d", precompileBlock)
disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", precompileBlock.Uint64(), common.Hash{0x01, 0xaa})
require.NotNil(t, game)
outputRootClaim := game.DisputeLastBlock(ctx)
game.LogGameData(ctx)
game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
// Wait for the honest challenger to dispute the outputRootClaim. This creates a root of an execution game that we challenge by coercing
// a step at a preimage trace index.
outputRootClaim = outputRootClaim.WaitForCounterClaim(ctx)
// Now the honest challenger is positioned as the defender of the execution game
// We then move to challenge it to induce a preimage load
preimageLoadCheck := game.CreateStepPreimageLoadCheck(ctx)
game.ChallengeToPreimageLoad(ctx, outputRootClaim, sys.Cfg.Secrets.Alice, cannon.FirstKZGPointEvaluationPreimageLoad(), preimageLoadCheck, preloadPreimage)
// The above method already verified the image was uploaded and step called successfully
// So we don't waste time resolving the game - that's tested elsewhere.
}
t.Run("non-existing preimage", func(t *testing.T) {
testPreimageStep(t, false)
})
t.Run("preimage already exists", func(t *testing.T) {
testPreimageStep(t, true)
})
}
func TestOutputCannonProposedOutputRootValid(t *testing.T) { func TestOutputCannonProposedOutputRootValid(t *testing.T) {
// honestStepsFail attempts to perform both an attack and defend step using the correct trace. // honestStepsFail attempts to perform both an attack and defend step using the correct trace.
honestStepsFail := func(ctx context.Context, game *disputegame.OutputCannonGameHelper, correctTrace *disputegame.OutputHonestHelper, parentClaimIdx int64) { honestStepsFail := func(ctx context.Context, game *disputegame.OutputCannonGameHelper, correctTrace *disputegame.OutputHonestHelper, parentClaimIdx int64) {
......
package faultproofs
import (
"context"
"encoding/json"
"fmt"
"math"
"path/filepath"
"testing"
"github.com/ethereum-optimism/optimism/cannon/mipsevm"
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/cannon"
"github.com/ethereum-optimism/optimism/op-challenger/metrics"
op_e2e "github.com/ethereum-optimism/optimism/op-e2e"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
"github.com/ethereum-optimism/optimism/op-service/client"
"github.com/ethereum-optimism/optimism/op-service/ioutil"
"github.com/ethereum-optimism/optimism/op-service/sources"
"github.com/ethereum-optimism/optimism/op-service/testlog"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/rpc"
"github.com/stretchr/testify/require"
)
func TestPrecompiles(t *testing.T) {
// precompile test vectors copied from go-ethereum
tests := []struct {
name string
address common.Address
input []byte
}{
{
name: "ecrecover",
address: common.BytesToAddress([]byte{0x01}),
input: common.FromHex("18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549"),
},
{
name: "sha256",
address: common.BytesToAddress([]byte{0x02}),
input: common.FromHex("68656c6c6f20776f726c64"),
},
{
name: "ripemd160",
address: common.BytesToAddress([]byte{0x03}),
input: common.FromHex("68656c6c6f20776f726c64"),
},
{
name: "bn256Pairing",
address: common.BytesToAddress([]byte{0x08}),
input: common.FromHex("1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa"),
},
{
name: "blake2F",
address: common.BytesToAddress([]byte{0x09}),
input: common.FromHex("0000000048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001"),
},
{
name: "kzgPointEvaluation",
address: common.BytesToAddress([]byte{0x0a}),
input: common.FromHex("01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a"),
},
}
for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) {
op_e2e.InitParallel(t, op_e2e.UsesCannon)
ctx := context.Background()
cfg := op_e2e.DefaultSystemConfig(t)
// We don't need a verifier - just the sequencer is enough
delete(cfg.Nodes, "verifier")
// Use a small sequencer window size to avoid test timeout while waiting for empty blocks
// But not too small to ensure that our claim and subsequent state change is published
cfg.DeployConfig.SequencerWindowSize = 16
minTs := hexutil.Uint64(0)
cfg.DeployConfig.L2GenesisDeltaTimeOffset = &minTs
cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &minTs
sys, err := cfg.Start(t)
require.Nil(t, err, "Error starting up system")
defer sys.Close()
log := testlog.Logger(t, log.LevelInfo)
log.Info("genesis", "l2", sys.RollupConfig.Genesis.L2, "l1", sys.RollupConfig.Genesis.L1, "l2_time", sys.RollupConfig.Genesis.L2Time)
l1Client := sys.Clients["l1"]
l2Seq := sys.Clients["sequencer"]
rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint())
require.Nil(t, err)
rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient))
aliceKey := cfg.Secrets.Alice
t.Log("Capture current L2 head as agreed starting point")
latestBlock, err := l2Seq.BlockByNumber(ctx, nil)
require.NoError(t, err)
agreedL2Output, err := rollupClient.OutputAtBlock(ctx, latestBlock.NumberU64())
require.NoError(t, err, "could not retrieve l2 agreed block")
l2Head := agreedL2Output.BlockRef.Hash
l2OutputRoot := agreedL2Output.OutputRoot
receipt := op_e2e.SendL2Tx(t, cfg, l2Seq, aliceKey, func(opts *op_e2e.TxOpts) {
opts.Gas = 1_000_000
opts.ToAddr = &test.address
opts.Nonce = 0
opts.Data = test.input
})
t.Log("Determine L2 claim")
l2ClaimBlockNumber := receipt.BlockNumber
l2Output, err := rollupClient.OutputAtBlock(ctx, l2ClaimBlockNumber.Uint64())
require.NoError(t, err, "could not get expected output")
l2Claim := l2Output.OutputRoot
t.Log("Determine L1 head that includes all batches required for L2 claim block")
require.NoError(t, wait.ForSafeBlock(ctx, rollupClient, l2ClaimBlockNumber.Uint64()))
l1HeadBlock, err := l1Client.BlockByNumber(ctx, nil)
require.NoError(t, err, "get l1 head block")
l1Head := l1HeadBlock.Hash()
inputs := cannon.LocalGameInputs{
L1Head: l1Head,
L2Head: l2Head,
L2Claim: common.Hash(l2Claim),
L2OutputRoot: common.Hash(l2OutputRoot),
L2BlockNumber: l2ClaimBlockNumber,
}
runCannon(t, ctx, sys, inputs, "sequencer")
})
}
}
func runCannon(t *testing.T, ctx context.Context, sys *op_e2e.System, inputs cannon.LocalGameInputs, l2Node string) {
l1Endpoint := sys.NodeEndpoint("l1")
l1Beacon := sys.L1BeaconEndpoint()
cannonOpts := challenger.WithCannon(t, sys.RollupCfg(), sys.L2Genesis(), sys.RollupEndpoint(l2Node), sys.NodeEndpoint(l2Node))
dir := t.TempDir()
proofsDir := filepath.Join(dir, "cannon-proofs")
cfg := config.NewConfig(common.Address{}, l1Endpoint, l1Beacon, dir)
cannonOpts(&cfg)
logger := testlog.Logger(t, log.LevelInfo).New("role", "cannon")
executor := cannon.NewExecutor(logger, metrics.NoopMetrics, &cfg, inputs)
t.Log("Running cannon")
err := executor.GenerateProof(ctx, proofsDir, math.MaxUint)
require.NoError(t, err, "failed to generate proof")
state, err := parseState(filepath.Join(proofsDir, "final.json.gz"))
require.NoError(t, err, "failed to parse state")
t.Logf("Completed in %d steps", state.Step)
}
func parseState(path string) (*mipsevm.State, error) {
file, err := ioutil.OpenDecompressed(path)
if err != nil {
return nil, fmt.Errorf("cannot open state file (%v): %w", path, err)
}
defer file.Close()
var state mipsevm.State
err = json.NewDecoder(file).Decode(&state)
if err != nil {
return nil, fmt.Errorf("invalid mipsevm state (%v): %w", path, err)
}
return &state, nil
}
package faultproofs package faultproofs
import ( import (
"crypto/ecdsa"
"testing" "testing"
batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags"
op_e2e "github.com/ethereum-optimism/optimism/op-e2e" op_e2e "github.com/ethereum-optimism/optimism/op-e2e"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/ethclient"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
...@@ -29,6 +32,15 @@ func withBlobBatches() faultDisputeConfigOpts { ...@@ -29,6 +32,15 @@ func withBlobBatches() faultDisputeConfigOpts {
} }
} }
func withEcotone() faultDisputeConfigOpts {
return func(cfg *op_e2e.SystemConfig) {
genesisActivation := hexutil.Uint64(0)
cfg.DeployConfig.L1CancunTimeOffset = &genesisActivation
cfg.DeployConfig.L2GenesisDeltaTimeOffset = &genesisActivation
cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &genesisActivation
}
}
func startFaultDisputeSystem(t *testing.T, opts ...faultDisputeConfigOpts) (*op_e2e.System, *ethclient.Client) { func startFaultDisputeSystem(t *testing.T, opts ...faultDisputeConfigOpts) (*op_e2e.System, *ethclient.Client) {
cfg := op_e2e.DefaultSystemConfig(t) cfg := op_e2e.DefaultSystemConfig(t)
delete(cfg.Nodes, "verifier") delete(cfg.Nodes, "verifier")
...@@ -44,3 +56,12 @@ func startFaultDisputeSystem(t *testing.T, opts ...faultDisputeConfigOpts) (*op_ ...@@ -44,3 +56,12 @@ func startFaultDisputeSystem(t *testing.T, opts ...faultDisputeConfigOpts) (*op_
require.Nil(t, err, "Error starting up system") require.Nil(t, err, "Error starting up system")
return sys, sys.Clients["l1"] return sys, sys.Clients["l1"]
} }
func sendKZGPointEvaluationTx(t *testing.T, sys *op_e2e.System, l2Node string, privateKey *ecdsa.PrivateKey) *types.Receipt {
return op_e2e.SendL2Tx(t, sys.Cfg, sys.Clients[l2Node], privateKey, func(opts *op_e2e.TxOpts) {
precompile := common.BytesToAddress([]byte{0x0a})
opts.Gas = 100_000
opts.ToAddr = &precompile
opts.Data = common.FromHex("01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a")
})
}
...@@ -40,6 +40,8 @@ const ( ...@@ -40,6 +40,8 @@ const (
Sha256KeyType KeyType = 4 Sha256KeyType KeyType = 4
// BlobKeyType is for blob point pre-images. // BlobKeyType is for blob point pre-images.
BlobKeyType KeyType = 5 BlobKeyType KeyType = 5
// KZGPointEvaluationKeyType is for KZG point-evaluation pre-images.
KZGPointEvaluationKeyType KeyType = 6
) )
// LocalIndexKey is a key local to the program, indexing a special program input. // LocalIndexKey is a key local to the program, indexing a special program input.
...@@ -102,6 +104,23 @@ func (k BlobKey) TerminalString() string { ...@@ -102,6 +104,23 @@ func (k BlobKey) TerminalString() string {
return "0x" + hex.EncodeToString(k[:]) return "0x" + hex.EncodeToString(k[:])
} }
// KZGPointEvaluationKey is the hash of a KZG point-evaluation EVM call input-data
type KZGPointEvaluationKey [32]byte
func (k KZGPointEvaluationKey) PreimageKey() (out [32]byte) {
out = k
out[0] = byte(KZGPointEvaluationKeyType)
return
}
func (k KZGPointEvaluationKey) String() string {
return "0x" + hex.EncodeToString(k[:])
}
func (k KZGPointEvaluationKey) TerminalString() string {
return "0x" + hex.EncodeToString(k[:])
}
// Hint is an interface to enable any program type to function as a hint, // Hint is an interface to enable any program type to function as a hint,
// when passed to the Hinter interface, returning a string representation // when passed to the Hinter interface, returning a string representation
// of what data the host should prepare pre-images for. // of what data the host should prepare pre-images for.
......
...@@ -62,4 +62,19 @@ func TestPreimageKeyTypes(t *testing.T) { ...@@ -62,4 +62,19 @@ func TestPreimageKeyTypes(t *testing.T) {
// String encoding // String encoding
require.Equal(t, "0x00000000000000000000000000000000000000000000000000000000000000ff", actual.String()) require.Equal(t, "0x00000000000000000000000000000000000000000000000000000000000000ff", actual.String())
}) })
t.Run("KZGPointEvaluationKey", func(t *testing.T) {
fauxHash := [32]byte{}
fauxHash[31] = 0xFF
actual := KZGPointEvaluationKey(fauxHash)
// PreimageKey encoding
expected := [32]byte{}
expected[0] = byte(KZGPointEvaluationKeyType)
expected[31] = 0xFF
require.Equal(t, expected, actual.PreimageKey())
// String encoding
require.Equal(t, "0x00000000000000000000000000000000000000000000000000000000000000ff", actual.String())
})
} }
...@@ -38,6 +38,9 @@ func WithVerification(source PreimageGetter) PreimageGetter { ...@@ -38,6 +38,9 @@ func WithVerification(source PreimageGetter) PreimageGetter {
case BlobKeyType: case BlobKeyType:
// Can't verify an individual field element without having a kzg proof // Can't verify an individual field element without having a kzg proof
return data, nil return data, nil
case KZGPointEvaluationKeyType:
// Can't verify the KZG point evaluation result without having a kzg proof
return data, nil
default: default:
return nil, fmt.Errorf("%w: %v", ErrUnsupportedKeyType, key[0]) return nil, fmt.Errorf("%w: %v", ErrUnsupportedKeyType, key[0])
} }
......
...@@ -39,6 +39,12 @@ func TestWithVerification(t *testing.T) { ...@@ -39,6 +39,12 @@ func TestWithVerification(t *testing.T) {
data: []byte{4, 3, 5, 7, 3}, data: []byte{4, 3, 5, 7, 3},
expectedData: []byte{4, 3, 5, 7, 3}, expectedData: []byte{4, 3, 5, 7, 3},
}, },
{
name: "KZGPointEvaluationKey NoVerification",
key: KZGPointEvaluationKey([32]byte{1, 2, 3, 4}),
data: []byte{4, 3, 5, 7, 3},
expectedData: []byte{4, 3, 5, 7, 3},
},
{ {
name: "UnknownKey", name: "UnknownKey",
key: invalidKey([32]byte{0xaa}), key: invalidKey([32]byte{0xaa}),
......
...@@ -22,6 +22,7 @@ type CachingOracle struct { ...@@ -22,6 +22,7 @@ type CachingOracle struct {
txs *simplelru.LRU[common.Hash, types.Transactions] txs *simplelru.LRU[common.Hash, types.Transactions]
rcpts *simplelru.LRU[common.Hash, types.Receipts] rcpts *simplelru.LRU[common.Hash, types.Receipts]
blobs *simplelru.LRU[common.Hash, *eth.Blob] blobs *simplelru.LRU[common.Hash, *eth.Blob]
ptEvals *simplelru.LRU[common.Hash, bool]
} }
func NewCachingOracle(oracle Oracle) *CachingOracle { func NewCachingOracle(oracle Oracle) *CachingOracle {
...@@ -29,12 +30,14 @@ func NewCachingOracle(oracle Oracle) *CachingOracle { ...@@ -29,12 +30,14 @@ func NewCachingOracle(oracle Oracle) *CachingOracle {
txsLRU, _ := simplelru.NewLRU[common.Hash, types.Transactions](cacheSize, nil) txsLRU, _ := simplelru.NewLRU[common.Hash, types.Transactions](cacheSize, nil)
rcptsLRU, _ := simplelru.NewLRU[common.Hash, types.Receipts](cacheSize, nil) rcptsLRU, _ := simplelru.NewLRU[common.Hash, types.Receipts](cacheSize, nil)
blobsLRU, _ := simplelru.NewLRU[common.Hash, *eth.Blob](cacheSize, nil) blobsLRU, _ := simplelru.NewLRU[common.Hash, *eth.Blob](cacheSize, nil)
ptEvals, _ := simplelru.NewLRU[common.Hash, bool](cacheSize, nil)
return &CachingOracle{ return &CachingOracle{
oracle: oracle, oracle: oracle,
blocks: blockLRU, blocks: blockLRU,
txs: txsLRU, txs: txsLRU,
rcpts: rcptsLRU, rcpts: rcptsLRU,
blobs: blobsLRU, blobs: blobsLRU,
ptEvals: ptEvals,
} }
} }
...@@ -86,3 +89,14 @@ func (o *CachingOracle) GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHash ...@@ -86,3 +89,14 @@ func (o *CachingOracle) GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHash
o.blobs.Add(cacheKey, blob) o.blobs.Add(cacheKey, blob)
return blob return blob
} }
func (o *CachingOracle) KZGPointEvaluation(input []byte) bool {
cacheKey := crypto.Keccak256Hash(input)
ptEval, ok := o.ptEvals.Get(cacheKey)
if ok {
return ptEval
}
ptEval = o.oracle.KZGPointEvaluation(input)
o.ptEvals.Add(cacheKey, ptEval)
return ptEval
}
...@@ -7,6 +7,7 @@ import ( ...@@ -7,6 +7,7 @@ import (
"github.com/ethereum-optimism/optimism/op-program/client/l1/test" "github.com/ethereum-optimism/optimism/op-program/client/l1/test"
"github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum-optimism/optimism/op-service/testutils" "github.com/ethereum-optimism/optimism/op-service/testutils"
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
...@@ -91,3 +92,20 @@ func TestCachingOracle_GetBlobs(t *testing.T) { ...@@ -91,3 +92,20 @@ func TestCachingOracle_GetBlobs(t *testing.T) {
actualBlob = oracle.GetBlob(l1BlockRef, indexedBlobHash) actualBlob = oracle.GetBlob(l1BlockRef, indexedBlobHash)
require.Equal(t, &blob, actualBlob) require.Equal(t, &blob, actualBlob)
} }
func TestCachingOracle_KZGPointEvaluation(t *testing.T) {
stub := test.NewStubOracle(t)
oracle := NewCachingOracle(stub)
input := []byte{0x01, 0x02, 0x03, 0x04}
// Initial call retrieves from the stub
stub.PtEvals[crypto.Keccak256Hash(input)] = true
actualPtEval := oracle.KZGPointEvaluation(input)
require.True(t, actualPtEval)
// Later calls should retrieve from cache
delete(stub.PtEvals, crypto.Keccak256Hash(input))
actualPtEval = oracle.KZGPointEvaluation(input)
require.True(t, actualPtEval)
}
...@@ -12,6 +12,7 @@ const ( ...@@ -12,6 +12,7 @@ const (
HintL1Transactions = "l1-transactions" HintL1Transactions = "l1-transactions"
HintL1Receipts = "l1-receipts" HintL1Receipts = "l1-receipts"
HintL1Blob = "l1-blob" HintL1Blob = "l1-blob"
HintL1KZGPointEvaluation = "l1-kzg-point-evaluation"
) )
type BlockHeaderHint common.Hash type BlockHeaderHint common.Hash
...@@ -45,3 +46,11 @@ var _ preimage.Hint = BlobHint{} ...@@ -45,3 +46,11 @@ var _ preimage.Hint = BlobHint{}
func (l BlobHint) Hint() string { func (l BlobHint) Hint() string {
return HintL1Blob + " " + hexutil.Encode(l) return HintL1Blob + " " + hexutil.Encode(l)
} }
type KZGPointEvaluationHint []byte
var _ preimage.Hint = KZGPointEvaluationHint{}
func (l KZGPointEvaluationHint) Hint() string {
return HintL1KZGPointEvaluation + " " + hexutil.Encode(l)
}
...@@ -27,6 +27,9 @@ type Oracle interface { ...@@ -27,6 +27,9 @@ type Oracle interface {
// GetBlobField retrieves the field element at the given index from the blob with the given hash. // GetBlobField retrieves the field element at the given index from the blob with the given hash.
GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHash) *eth.Blob GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHash) *eth.Blob
// KZGPointEvaluation retriees the result of the Cancun KZG point evaluation precompile for the given input.
KZGPointEvaluation(input []byte) bool
} }
// PreimageOracle implements Oracle using by interfacing with the pure preimage.Oracle // PreimageOracle implements Oracle using by interfacing with the pure preimage.Oracle
...@@ -115,3 +118,13 @@ func (p *PreimageOracle) GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHas ...@@ -115,3 +118,13 @@ func (p *PreimageOracle) GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHas
return &blob return &blob
} }
func (p *PreimageOracle) KZGPointEvaluation(input []byte) bool {
p.hint.Hint(KZGPointEvaluationHint(input))
key := preimage.KZGPointEvaluationKey(crypto.Keccak256Hash(input[:]))
result := p.oracle.Get(key)
if len(result) != 1 || result[0] > 1 {
panic(fmt.Errorf("unexpected preimage oracle KZGPointEvaluation behavior, got result: %x", result))
}
return result[0] == 1
}
...@@ -6,6 +6,7 @@ import ( ...@@ -6,6 +6,7 @@ import (
"github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
) )
type StubOracle struct { type StubOracle struct {
...@@ -22,6 +23,9 @@ type StubOracle struct { ...@@ -22,6 +23,9 @@ type StubOracle struct {
// Blobs maps indexed blob hash to l1 block ref to blob // Blobs maps indexed blob hash to l1 block ref to blob
Blobs map[eth.L1BlockRef]map[eth.IndexedBlobHash]*eth.Blob Blobs map[eth.L1BlockRef]map[eth.IndexedBlobHash]*eth.Blob
// PtEvals maps hashed input to whether the KZG point evaluation was successful
PtEvals map[common.Hash]bool
} }
func NewStubOracle(t *testing.T) *StubOracle { func NewStubOracle(t *testing.T) *StubOracle {
...@@ -31,6 +35,7 @@ func NewStubOracle(t *testing.T) *StubOracle { ...@@ -31,6 +35,7 @@ func NewStubOracle(t *testing.T) *StubOracle {
Txs: make(map[common.Hash]types.Transactions), Txs: make(map[common.Hash]types.Transactions),
Rcpts: make(map[common.Hash]types.Receipts), Rcpts: make(map[common.Hash]types.Receipts),
Blobs: make(map[eth.L1BlockRef]map[eth.IndexedBlobHash]*eth.Blob), Blobs: make(map[eth.L1BlockRef]map[eth.IndexedBlobHash]*eth.Blob),
PtEvals: make(map[common.Hash]bool),
} }
} }
...@@ -69,3 +74,11 @@ func (o StubOracle) GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHash) *e ...@@ -69,3 +74,11 @@ func (o StubOracle) GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHash) *e
} }
return blob return blob
} }
func (o StubOracle) KZGPointEvaluation(input []byte) bool {
result, ok := o.PtEvals[crypto.Keccak256Hash(input)]
if !ok {
o.t.Fatalf("unknown kzg point evaluation %x", input)
}
return result
}
...@@ -40,7 +40,7 @@ type OracleBackedL2Chain struct { ...@@ -40,7 +40,7 @@ type OracleBackedL2Chain struct {
var _ engineapi.EngineBackend = (*OracleBackedL2Chain)(nil) var _ engineapi.EngineBackend = (*OracleBackedL2Chain)(nil)
func NewOracleBackedL2Chain(logger log.Logger, oracle Oracle, chainCfg *params.ChainConfig, l2OutputRoot common.Hash) (*OracleBackedL2Chain, error) { func NewOracleBackedL2Chain(logger log.Logger, oracle Oracle, kzgOracle engineapi.KZGPointEvaluationOracle, chainCfg *params.ChainConfig, l2OutputRoot common.Hash) (*OracleBackedL2Chain, error) {
output := oracle.OutputByRoot(l2OutputRoot) output := oracle.OutputByRoot(l2OutputRoot)
outputV0, ok := output.(*eth.OutputV0) outputV0, ok := output.(*eth.OutputV0)
if !ok { if !ok {
...@@ -66,6 +66,9 @@ func NewOracleBackedL2Chain(logger log.Logger, oracle Oracle, chainCfg *params.C ...@@ -66,6 +66,9 @@ func NewOracleBackedL2Chain(logger log.Logger, oracle Oracle, chainCfg *params.C
oracleHead: head.Header(), oracleHead: head.Header(),
blocks: make(map[common.Hash]*types.Block), blocks: make(map[common.Hash]*types.Block),
db: NewOracleBackedDB(oracle), db: NewOracleBackedDB(oracle),
vmCfg: vm.Config{
OptimismPrecompileOverrides: precompileOverrides(kzgOracle),
},
}, nil }, nil
} }
...@@ -229,3 +232,15 @@ func (o *OracleBackedL2Chain) SetFinalized(header *types.Header) { ...@@ -229,3 +232,15 @@ func (o *OracleBackedL2Chain) SetFinalized(header *types.Header) {
func (o *OracleBackedL2Chain) SetSafe(header *types.Header) { func (o *OracleBackedL2Chain) SetSafe(header *types.Header) {
o.safe = header o.safe = header
} }
var kzgPointEvaluationPrecompileAddress = common.BytesToAddress([]byte{0xa})
func precompileOverrides(kzgOracle engineapi.KZGPointEvaluationOracle) vm.PrecompileOverrides {
return func(rules params.Rules, address common.Address) (vm.PrecompiledContract, bool) {
// NOTE: Ignoring chain rules for now. We assume that precompile behavior won't change for the foreseeable future
if address != kzgPointEvaluationPrecompileAddress {
return nil, false
}
return &engineapi.OracleKZGPointEvaluation{Oracle: kzgOracle}, true
}
}
...@@ -28,6 +28,9 @@ var fundedKey, _ = crypto.GenerateKey() ...@@ -28,6 +28,9 @@ var fundedKey, _ = crypto.GenerateKey()
var fundedAddress = crypto.PubkeyToAddress(fundedKey.PublicKey) var fundedAddress = crypto.PubkeyToAddress(fundedKey.PublicKey)
var targetAddress = common.HexToAddress("0x001122334455") var targetAddress = common.HexToAddress("0x001122334455")
// Also a valid input to the kzg point evaluation precompile
var inputData = common.FromHex("01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a")
func TestInitialState(t *testing.T) { func TestInitialState(t *testing.T) {
blocks, chain := setupOracleBackedChain(t, 5) blocks, chain := setupOracleBackedChain(t, 5)
head := blocks[5] head := blocks[5]
...@@ -186,6 +189,25 @@ func TestGetHeaderByNumber(t *testing.T) { ...@@ -186,6 +189,25 @@ func TestGetHeaderByNumber(t *testing.T) {
}) })
} }
func TestKZGPointEvaluationPrecompile(t *testing.T) {
blockCount := 3
headBlockNumber := 3
logger := testlog.Logger(t, log.LevelDebug)
chainCfg, blocks, oracle := setupOracle(t, blockCount, headBlockNumber, true)
head := blocks[headBlockNumber].Hash()
stubOutput := eth.OutputV0{BlockHash: head}
kzgOracle := new(l2test.StubKZGOracle)
kzgOracle.PtEvals = map[common.Hash]bool{
crypto.Keccak256Hash(inputData): true,
}
chain, err := NewOracleBackedL2Chain(logger, oracle, kzgOracle, chainCfg, common.Hash(eth.OutputRoot(&stubOutput)))
require.NoError(t, err)
newBlock := createKZGBlock(t, chain)
require.NoError(t, chain.InsertBlockWithoutSetHead(newBlock))
require.Equal(t, 1, kzgOracle.Calls)
}
func assertBlockDataAvailable(t *testing.T, chain *OracleBackedL2Chain, block *types.Block, blockNumber uint64) { func assertBlockDataAvailable(t *testing.T, chain *OracleBackedL2Chain, block *types.Block, blockNumber uint64) {
require.Equal(t, block, chain.GetBlockByHash(block.Hash()), "get block %v by hash", blockNumber) require.Equal(t, block, chain.GetBlockByHash(block.Hash()), "get block %v by hash", blockNumber)
require.Equal(t, block.Header(), chain.GetHeaderByHash(block.Hash()), "get header %v by hash", blockNumber) require.Equal(t, block.Header(), chain.GetHeaderByHash(block.Hash()), "get header %v by hash", blockNumber)
...@@ -200,15 +222,16 @@ func setupOracleBackedChain(t *testing.T, blockCount int) ([]*types.Block, *Orac ...@@ -200,15 +222,16 @@ func setupOracleBackedChain(t *testing.T, blockCount int) ([]*types.Block, *Orac
func setupOracleBackedChainWithLowerHead(t *testing.T, blockCount int, headBlockNumber int) ([]*types.Block, *OracleBackedL2Chain) { func setupOracleBackedChainWithLowerHead(t *testing.T, blockCount int, headBlockNumber int) ([]*types.Block, *OracleBackedL2Chain) {
logger := testlog.Logger(t, log.LevelDebug) logger := testlog.Logger(t, log.LevelDebug)
chainCfg, blocks, oracle := setupOracle(t, blockCount, headBlockNumber) chainCfg, blocks, oracle := setupOracle(t, blockCount, headBlockNumber, false)
head := blocks[headBlockNumber].Hash() head := blocks[headBlockNumber].Hash()
stubOutput := eth.OutputV0{BlockHash: head} stubOutput := eth.OutputV0{BlockHash: head}
chain, err := NewOracleBackedL2Chain(logger, oracle, chainCfg, common.Hash(eth.OutputRoot(&stubOutput))) kzgOracle := new(l2test.StubKZGOracle)
chain, err := NewOracleBackedL2Chain(logger, oracle, kzgOracle, chainCfg, common.Hash(eth.OutputRoot(&stubOutput)))
require.NoError(t, err) require.NoError(t, err)
return blocks, chain return blocks, chain
} }
func setupOracle(t *testing.T, blockCount int, headBlockNumber int) (*params.ChainConfig, []*types.Block, *l2test.StubBlockOracle) { func setupOracle(t *testing.T, blockCount int, headBlockNumber int, enableEcotone bool) (*params.ChainConfig, []*types.Block, *l2test.StubBlockOracle) {
deployConfig := &genesis.DeployConfig{ deployConfig := &genesis.DeployConfig{
L1ChainID: 900, L1ChainID: 900,
L2ChainID: 901, L2ChainID: 901,
...@@ -219,6 +242,13 @@ func setupOracle(t *testing.T, blockCount int, headBlockNumber int) (*params.Cha ...@@ -219,6 +242,13 @@ func setupOracle(t *testing.T, blockCount int, headBlockNumber int) (*params.Cha
// This is slightly weird for a chain starting post-merge but it happens so need to make sure it works // This is slightly weird for a chain starting post-merge but it happens so need to make sure it works
L2GenesisBlockDifficulty: (*hexutil.Big)(big.NewInt(100)), L2GenesisBlockDifficulty: (*hexutil.Big)(big.NewInt(100)),
} }
if enableEcotone {
ts := hexutil.Uint64(0)
deployConfig.L2GenesisRegolithTimeOffset = &ts
deployConfig.L2GenesisCanyonTimeOffset = &ts
deployConfig.L2GenesisDeltaTimeOffset = &ts
deployConfig.L2GenesisEcotoneTimeOffset = &ts
}
l1Genesis, err := genesis.NewL1Genesis(deployConfig) l1Genesis, err := genesis.NewL1Genesis(deployConfig)
require.NoError(t, err) require.NoError(t, err)
l2Genesis, err := genesis.NewL2Genesis(deployConfig, l1Genesis.ToBlock()) l2Genesis, err := genesis.NewL2Genesis(deployConfig, l1Genesis.ToBlock())
...@@ -246,7 +276,7 @@ func setupOracle(t *testing.T, blockCount int, headBlockNumber int) (*params.Cha ...@@ -246,7 +276,7 @@ func setupOracle(t *testing.T, blockCount int, headBlockNumber int) (*params.Cha
return chainCfg, blocks, oracle return chainCfg, blocks, oracle
} }
func createBlock(t *testing.T, chain *OracleBackedL2Chain) *types.Block { func createBlockWithTargetAddress(t *testing.T, chain *OracleBackedL2Chain, target *common.Address) *types.Block {
parent := chain.GetBlockByHash(chain.CurrentHeader().Hash()) parent := chain.GetBlockByHash(chain.CurrentHeader().Hash())
parentDB, err := chain.StateAt(parent.Root()) parentDB, err := chain.StateAt(parent.Root())
require.NoError(t, err) require.NoError(t, err)
...@@ -257,10 +287,11 @@ func createBlock(t *testing.T, chain *OracleBackedL2Chain) *types.Block { ...@@ -257,10 +287,11 @@ func createBlock(t *testing.T, chain *OracleBackedL2Chain) *types.Block {
rawTx := &types.DynamicFeeTx{ rawTx := &types.DynamicFeeTx{
ChainID: config.ChainID, ChainID: config.ChainID,
Nonce: nonce, Nonce: nonce,
To: &targetAddress, To: target,
GasTipCap: big.NewInt(0), GasTipCap: big.NewInt(0),
GasFeeCap: parent.BaseFee(), GasFeeCap: parent.BaseFee(),
Gas: 21_000, Gas: 210_000,
Data: inputData,
Value: big.NewInt(1), Value: big.NewInt(1),
} }
tx := types.MustSignNewTx(fundedKey, types.NewLondonSigner(config.ChainID), rawTx) tx := types.MustSignNewTx(fundedKey, types.NewLondonSigner(config.ChainID), rawTx)
...@@ -269,6 +300,14 @@ func createBlock(t *testing.T, chain *OracleBackedL2Chain) *types.Block { ...@@ -269,6 +300,14 @@ func createBlock(t *testing.T, chain *OracleBackedL2Chain) *types.Block {
return blocks[0] return blocks[0]
} }
func createBlock(t *testing.T, chain *OracleBackedL2Chain) *types.Block {
return createBlockWithTargetAddress(t, chain, &targetAddress)
}
func createKZGBlock(t *testing.T, chain *OracleBackedL2Chain) *types.Block {
return createBlockWithTargetAddress(t, chain, &kzgPointEvaluationPrecompileAddress)
}
func TestEngineAPITests(t *testing.T) { func TestEngineAPITests(t *testing.T) {
test.RunEngineAPITests(t, func(t *testing.T) engineapi.EngineBackend { test.RunEngineAPITests(t, func(t *testing.T) engineapi.EngineBackend {
_, chain := setupOracleBackedChain(t, 0) _, chain := setupOracleBackedChain(t, 0)
......
...@@ -84,7 +84,12 @@ func NewBlockProcessorFromHeader(provider BlockDataProvider, h *types.Header) (* ...@@ -84,7 +84,12 @@ func NewBlockProcessorFromHeader(provider BlockDataProvider, h *types.Header) (*
// Unfortunately this is not part of any Geth environment setup, // Unfortunately this is not part of any Geth environment setup,
// we just have to apply it, like how the Geth block-builder worker does. // we just have to apply it, like how the Geth block-builder worker does.
context := core.NewEVMBlockContext(header, provider, nil, provider.Config(), statedb) context := core.NewEVMBlockContext(header, provider, nil, provider.Config(), statedb)
vmenv := vm.NewEVM(context, vm.TxContext{}, statedb, provider.Config(), vm.Config{}) // NOTE: Unlikely to be needed for the beacon block root, but we setup any precompile overrides anyways for forwards-compatibility
var precompileOverrides vm.PrecompileOverrides
if vmConfig := provider.GetVMConfig(); vmConfig != nil && vmConfig.OptimismPrecompileOverrides != nil {
precompileOverrides = vmConfig.OptimismPrecompileOverrides
}
vmenv := vm.NewEVM(context, vm.TxContext{}, statedb, provider.Config(), vm.Config{OptimismPrecompileOverrides: precompileOverrides})
core.ProcessBeaconBlockRoot(*header.ParentBeaconRoot, vmenv, statedb) core.ProcessBeaconBlockRoot(*header.ParentBeaconRoot, vmenv, statedb)
} }
return &BlockProcessor{ return &BlockProcessor{
......
// This file contains code of the upstream go-ethereum kzgPointEvaluation implementation.
// Modifications have been made, primarily to substitute kzg4844.VerifyProof with a preimage oracle call.
//
// Original copyright disclaimer, applicable only to this file:
// -------------------------------------------------------------------
// Copyright 2014 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
package engineapi
import (
"errors"
"fmt"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto/kzg4844"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum-optimism/optimism/op-service/eth"
)
// OracleKZGPointEvaluation implements the EIP-4844 point evaluation precompile,
// using the preimage-oracle to perform the evaluation.
type OracleKZGPointEvaluation struct {
Oracle KZGPointEvaluationOracle
}
// KZGPointEvaluationOracle defines the high-level API used to retrieve the result of the KZG point evaluation precompile
type KZGPointEvaluationOracle interface {
KZGPointEvaluation(input []byte) bool
}
// RequiredGas estimates the gas required for running the point evaluation precompile.
func (b *OracleKZGPointEvaluation) RequiredGas(input []byte) uint64 {
return params.BlobTxPointEvaluationPrecompileGas
}
const (
blobVerifyInputLength = 192 // Max input length for the point evaluation precompile.
blobPrecompileReturnValue = "000000000000000000000000000000000000000000000000000000000000100073eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001"
)
var (
errBlobVerifyInvalidInputLength = errors.New("invalid input length")
errBlobVerifyMismatchedVersion = errors.New("mismatched versioned hash")
errBlobVerifyKZGProof = errors.New("error verifying kzg proof")
)
// Run executes the point evaluation precompile.
func (b *OracleKZGPointEvaluation) Run(input []byte) ([]byte, error) {
// Modification note: the L1 precompile behavior may change, but not in incompatible ways.
// We want to enforce the subset that represents the EVM behavior activated in L2.
// Below is a copy of the Cancun behavior. L1 might expand on that at a later point.
if len(input) != blobVerifyInputLength {
return nil, errBlobVerifyInvalidInputLength
}
// versioned hash: first 32 bytes
var versionedHash common.Hash
copy(versionedHash[:], input[:])
var (
point kzg4844.Point
claim kzg4844.Claim
)
// Evaluation point: next 32 bytes
copy(point[:], input[32:])
// Expected output: next 32 bytes
copy(claim[:], input[64:])
// input kzg point: next 48 bytes
var commitment kzg4844.Commitment
copy(commitment[:], input[96:])
if eth.KZGToVersionedHash(commitment) != versionedHash {
return nil, errBlobVerifyMismatchedVersion
}
// Proof: next 48 bytes
var proof kzg4844.Proof
copy(proof[:], input[144:])
// Modification note: below replaces the kzg4844.VerifyProof call
ok := b.Oracle.KZGPointEvaluation(input)
if !ok {
return nil, fmt.Errorf("%w: invalid KZG point evaluation", errBlobVerifyKZGProof)
}
return common.FromHex(blobPrecompileReturnValue), nil
}
...@@ -7,6 +7,7 @@ import ( ...@@ -7,6 +7,7 @@ import (
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethdb"
) )
...@@ -122,3 +123,18 @@ func (o *StubStateOracle) CodeByHash(hash common.Hash) []byte { ...@@ -122,3 +123,18 @@ func (o *StubStateOracle) CodeByHash(hash common.Hash) []byte {
} }
return data return data
} }
type StubKZGOracle struct {
t *testing.T
PtEvals map[common.Hash]bool
Calls int
}
func (o *StubKZGOracle) KZGPointEvaluation(input []byte) bool {
result, ok := o.PtEvals[crypto.Keccak256Hash(input)]
if !ok {
o.t.Fatalf("no value for point evaluation %v", input)
}
o.Calls++
return result
}
...@@ -64,7 +64,7 @@ func RunProgram(logger log.Logger, preimageOracle io.ReadWriter, preimageHinter ...@@ -64,7 +64,7 @@ func RunProgram(logger log.Logger, preimageOracle io.ReadWriter, preimageHinter
func runDerivation(logger log.Logger, cfg *rollup.Config, l2Cfg *params.ChainConfig, l1Head common.Hash, l2OutputRoot common.Hash, l2Claim common.Hash, l2ClaimBlockNum uint64, l1Oracle l1.Oracle, l2Oracle l2.Oracle) error { func runDerivation(logger log.Logger, cfg *rollup.Config, l2Cfg *params.ChainConfig, l1Head common.Hash, l2OutputRoot common.Hash, l2Claim common.Hash, l2ClaimBlockNum uint64, l1Oracle l1.Oracle, l2Oracle l2.Oracle) error {
l1Source := l1.NewOracleL1Client(logger, l1Oracle, l1Head) l1Source := l1.NewOracleL1Client(logger, l1Oracle, l1Head)
l1BlobsSource := l1.NewBlobFetcher(logger, l1Oracle) l1BlobsSource := l1.NewBlobFetcher(logger, l1Oracle)
engineBackend, err := l2.NewOracleBackedL2Chain(logger, l2Oracle, l2Cfg, l2OutputRoot) engineBackend, err := l2.NewOracleBackedL2Chain(logger, l2Oracle, l1Oracle /* kzg oracle */, l2Cfg, l2OutputRoot)
if err != nil { if err != nil {
return fmt.Errorf("failed to create oracle-backed L2 chain: %w", err) return fmt.Errorf("failed to create oracle-backed L2 chain: %w", err)
} }
......
...@@ -16,11 +16,17 @@ import ( ...@@ -16,11 +16,17 @@ import (
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/params"
) )
var (
kzgPointEvaluationSuccess = [1]byte{1}
kzgPointEvaluationFailure = [1]byte{0}
)
type L1Source interface { type L1Source interface {
InfoByHash(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, error) InfoByHash(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, error)
InfoAndTxsByHash(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Transactions, error) InfoAndTxsByHash(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Transactions, error)
...@@ -32,6 +38,10 @@ type L1BlobSource interface { ...@@ -32,6 +38,10 @@ type L1BlobSource interface {
GetBlobs(ctx context.Context, ref eth.L1BlockRef, hashes []eth.IndexedBlobHash) ([]*eth.Blob, error) GetBlobs(ctx context.Context, ref eth.L1BlockRef, hashes []eth.IndexedBlobHash) ([]*eth.Blob, error)
} }
type L1PrecompileSource interface {
KZGPointEvaluation(input []byte) ([]byte, error)
}
type L2Source interface { type L2Source interface {
InfoAndTxsByHash(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Transactions, error) InfoAndTxsByHash(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Transactions, error)
NodeByHash(ctx context.Context, hash common.Hash) ([]byte, error) NodeByHash(ctx context.Context, hash common.Hash) ([]byte, error)
...@@ -165,6 +175,22 @@ func (p *Prefetcher) prefetch(ctx context.Context, hint string) error { ...@@ -165,6 +175,22 @@ func (p *Prefetcher) prefetch(ctx context.Context, hint string) error {
} }
} }
return nil return nil
case l1.HintL1KZGPointEvaluation:
precompile := vm.PrecompiledContractsCancun[common.BytesToAddress([]byte{0x0a})]
// KZG Point Evaluation precompile also verifies hintBytes length
_, err := precompile.Run(hintBytes)
var result [1]byte
if err == nil {
result = kzgPointEvaluationSuccess
} else {
result = kzgPointEvaluationFailure
}
inputHash := crypto.Keccak256Hash(hintBytes)
// Put the input preimage so it can be loaded later
if err := p.kvStore.Put(preimage.Keccak256Key(inputHash).PreimageKey(), hintBytes); err != nil {
return err
}
return p.kvStore.Put(preimage.KZGPointEvaluationKey(inputHash).PreimageKey(), result[:])
case l2.HintL2BlockHeader, l2.HintL2Transactions: case l2.HintL2BlockHeader, l2.HintL2Transactions:
if len(hintBytes) != 32 { if len(hintBytes) != 32 {
return fmt.Errorf("invalid L2 header/tx hint: %x", hint) return fmt.Errorf("invalid L2 header/tx hint: %x", hint)
......
...@@ -231,6 +231,45 @@ func TestFetchL1Blob(t *testing.T) { ...@@ -231,6 +231,45 @@ func TestFetchL1Blob(t *testing.T) {
}) })
} }
func TestFetchKZGPointEvaluation(t *testing.T) {
runTest := func(name string, input []byte, expected bool) {
t.Run(name, func(t *testing.T) {
prefetcher, _, _, _, _ := createPrefetcher(t)
oracle := l1.NewPreimageOracle(asOracleFn(t, prefetcher), asHinter(t, prefetcher))
result := oracle.KZGPointEvaluation(input)
require.Equal(t, expected, result)
val, err := prefetcher.kvStore.Get(preimage.Keccak256Key(crypto.Keccak256Hash(input)).PreimageKey())
require.NoError(t, err)
require.EqualValues(t, input, val)
key := preimage.KZGPointEvaluationKey(crypto.Keccak256Hash(input)).PreimageKey()
val, err = prefetcher.kvStore.Get(key)
require.NoError(t, err)
if expected {
require.EqualValues(t, kzgPointEvaluationSuccess[:], val)
} else {
require.EqualValues(t, kzgPointEvaluationFailure[:], val)
}
})
}
validInput := common.FromHex("01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a")
runTest("Valid input", validInput, true)
runTest("Invalid input", []byte{0x00}, false)
t.Run("Already Known", func(t *testing.T) {
input := []byte("test input")
prefetcher, _, _, _, kv := createPrefetcher(t)
err := kv.Put(preimage.KZGPointEvaluationKey(crypto.Keccak256Hash(input)).PreimageKey(), kzgPointEvaluationSuccess[:])
require.NoError(t, err)
oracle := l1.NewPreimageOracle(asOracleFn(t, prefetcher), asHinter(t, prefetcher))
result := oracle.KZGPointEvaluation(input)
require.True(t, result)
})
}
func TestFetchL2Block(t *testing.T) { func TestFetchL2Block(t *testing.T) {
rng := rand.New(rand.NewSource(123)) rng := rand.New(rand.NewSource(123))
block, rcpts := testutils.RandomBlock(rng, 10) block, rcpts := testutils.RandomBlock(rng, 10)
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
"requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", "requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000",
"recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", "recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000",
"faultGameAbsolutePrestate": "0x03c7ae758795765c6664a5d39bf63841c71ff191e9189522bad8ebff5d4eca98", "faultGameAbsolutePrestate": "0x03c7ae758795765c6664a5d39bf63841c71ff191e9189522bad8ebff5d4eca98",
"faultGameMaxDepth": 46, "faultGameMaxDepth": 50,
"faultGameMaxDuration": 2400, "faultGameMaxDuration": 2400,
"faultGameGenesisBlock": 0, "faultGameGenesisBlock": 0,
"faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", "faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
......
...@@ -301,6 +301,19 @@ ...@@ -301,6 +301,19 @@
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"type": "function" "type": "function"
}, },
{
"inputs": [
{
"internalType": "bytes",
"name": "_input",
"type": "bytes"
}
],
"name": "loadKZGPointEvaluationPreimage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{ {
"inputs": [ "inputs": [
{ {
......
...@@ -329,6 +329,45 @@ contract PreimageOracle is IPreimageOracle { ...@@ -329,6 +329,45 @@ contract PreimageOracle is IPreimageOracle {
preimageLengths[key] = 32; preimageLengths[key] = 32;
} }
/// @inheritdoc IPreimageOracle
function loadKZGPointEvaluationPreimage(bytes calldata _input) external {
// Prior to Cancun activation, the blob preimage precompile is not available.
if (block.timestamp < CANCUN_ACTIVATION) revert CancunNotActive();
bytes32 key;
bytes32 part;
assembly {
// we leave solidity slots 0x40 and 0x60 untouched, and everything after as scratch-memory.
let ptr := 0x80
// copy input into memory
calldatacopy(ptr, _input.offset, _input.length)
// compute the hash
let h := keccak256(ptr, _input.length)
// mask out prefix byte, replace with type 6 byte
key := or(and(h, not(shl(248, 0xFF))), shl(248, 0x06))
// Verify the KZG proof by calling the point evaluation precompile.
// Capture the verification result
part :=
staticcall(
gas(), // forward all gas
0x0A, // point evaluation precompile address
ptr, // input ptr
_input.length, // we may want to load differently sized point-evaluation calls in the future
0x00, // output ptr
0x00 // output size
)
// "part" will be 0 on error, and 1 on success, of the KZG Point-evaluation precompile call
// We do have to shift it to the left-most byte of the bytes32 however, since we only read that byte.
part := shl(248, part)
}
// the part offset is always 0
preimagePartOk[key][0] = true;
preimageParts[key][0] = part;
preimageLengths[key] = 1;
}
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
// Large Preimage Proposals (External) // // Large Preimage Proposals (External) //
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
......
...@@ -69,4 +69,8 @@ interface IPreimageOracle { ...@@ -69,4 +69,8 @@ interface IPreimageOracle {
uint256 _partOffset uint256 _partOffset
) )
external; external;
/// @notice Prepares a point evaluation precompile result to be read by the keccak256 of its input.
/// @param _input The point evaluation precompile input.
function loadKZGPointEvaluationPreimage(bytes calldata _input) external;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment