From 1e62a0b7adccfc3b9d937f13c4671c8febc07ba5 Mon Sep 17 00:00:00 2001 From: Inphi Date: Thu, 15 Feb 2024 18:55:21 -0500 Subject: [PATCH] fault-proofs: non-zero bond requirement (#9409) * fault-proofs: non-zero bond requirement * rebase rebase * permissioned game fix * safe transactOpts w/ bonds --------- Co-authored-by: clabby --- op-bindings/bindings/faultdisputegame.go | 2 +- op-bindings/bindings/faultdisputegame_more.go | 2 +- .../disputegame/output_game_helper.go | 22 +++- packages/contracts-bedrock/semver-lock.json | 4 +- .../src/dispute/FaultDisputeGame.sol | 8 +- .../test/dispute/FaultDisputeGame.t.sol | 118 ++++++++++-------- .../dispute/PermissionedDisputeGame.t.sol | 16 ++- 7 files changed, 104 insertions(+), 68 deletions(-) diff --git a/op-bindings/bindings/faultdisputegame.go b/op-bindings/bindings/faultdisputegame.go index 0fc77a48c2e0..225e520ad428 100644 --- a/op-bindings/bindings/faultdisputegame.go +++ b/op-bindings/bindings/faultdisputegame.go @@ -31,7 +31,7 @@ var ( // FaultDisputeGameMetaData contains all meta data concerning the FaultDisputeGame contract. var FaultDisputeGameMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_genesisBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_genesisOutputRoot\",\"type\":\"bytes32\",\"internalType\":\"Hash\"},{\"name\":\"_maxGameDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_splitDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gameDuration\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"_vm\",\"type\":\"address\",\"internalType\":\"contractIBigStepper\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"absolutePrestate\",\"inputs\":[],\"outputs\":[{\"name\":\"absolutePrestate_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addLocalData\",\"inputs\":[{\"name\":\"_ident\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_execLeafIdx\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"attack\",\"inputs\":[{\"name\":\"_parentIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"claimCredit\",\"inputs\":[{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimData\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"parentIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"counteredBy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bond\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"position\",\"type\":\"uint128\",\"internalType\":\"Position\"},{\"name\":\"clock\",\"type\":\"uint128\",\"internalType\":\"Clock\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDataLen\",\"inputs\":[],\"outputs\":[{\"name\":\"len_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimedBondFlag\",\"inputs\":[],\"outputs\":[{\"name\":\"claimedBondFlag_\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"createdAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"credit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defend\",\"inputs\":[{\"name\":\"_parentIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"extraData\",\"inputs\":[],\"outputs\":[{\"name\":\"extraData_\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"gameData\",\"inputs\":[],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"rootClaim_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"extraData_\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameDuration\",\"inputs\":[],\"outputs\":[{\"name\":\"gameDuration_\",\"type\":\"uint64\",\"internalType\":\"Duration\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameType\",\"inputs\":[],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"genesisBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"genesisBlockNumber_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"genesisOutputRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"genesisOutputRoot_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRequiredBond\",\"inputs\":[{\"name\":\"_position\",\"type\":\"uint128\",\"internalType\":\"Position\"}],\"outputs\":[{\"name\":\"requiredBond_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"l1Head\",\"inputs\":[],\"outputs\":[{\"name\":\"l1Head_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"l2BlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"l2BlockNumber_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"maxGameDepth\",\"inputs\":[],\"outputs\":[{\"name\":\"maxGameDepth_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"move\",\"inputs\":[{\"name\":\"_challengeIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_isAttack\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumGameStatus\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolveClaim\",\"inputs\":[{\"name\":\"_claimIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resolvedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rootClaim\",\"inputs\":[],\"outputs\":[{\"name\":\"rootClaim_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"splitDepth\",\"inputs\":[],\"outputs\":[{\"name\":\"splitDepth_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"status\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumGameStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"step\",\"inputs\":[{\"name\":\"_claimIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_isAttack\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_stateData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"vm\",\"inputs\":[],\"outputs\":[{\"name\":\"vm_\",\"type\":\"address\",\"internalType\":\"contractIBigStepper\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Move\",\"inputs\":[{\"name\":\"parentIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"claim\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"Claim\"},{\"name\":\"claimant\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Resolved\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumGameStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BondTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotDefendRootClaim\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAboveSplit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAlreadyResolved\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClockNotExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClockTimeExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GameDepthExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GameNotInProgress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientBond\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidLocalIdent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidParent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPrestate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSplitDepth\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfOrderResolution\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRootClaim\",\"inputs\":[{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]},{\"type\":\"error\",\"name\":\"ValidStep\",\"inputs\":[]}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162003b8b38038062003b8b83398101604081905262000035916200009b565b838310620000565760405163e62ccf3960e01b815260040160405180910390fd5b63ffffffff90971661016052608095909552610120939093526101409190915260a05260c0526001600160401b031660e0526001600160a01b03166101005262000140565b600080600080600080600080610100898b031215620000b957600080fd5b885163ffffffff81168114620000ce57600080fd5b60208a015160408b015160608c015160808d015160a08e015160c08f0151959d50939b509199509750955093506001600160401b03811681146200011157600080fd5b60e08a01519092506001600160a01b03811681146200012f57600080fd5b809150509295985092959890939650565b60805160a05160c05160e0516101005161012051610140516101605161394b62000240600039600081816104d301526120960152600081816104080152612cec0152600081816101ec0152818161122a01528181611eca0152611f000152600081816102f1015281816119840152611c8901526000818161067501528181610e1801526121f40152600081816106a801528181610c4701528181610d10015281816117df01528181611ea00152818161263501528181612878015281816129a601528181612aae0152612b8a01526000818161074a01528181610cb3015281816116ce01526118000152600081816104980152611896015261394b6000f3fe6080604052600436106101d85760003560e01c80638d450a9511610102578063d8cc1a3c11610095578063f8f43ff611610064578063f8f43ff6146106f7578063fa24f74314610717578063fa315aa91461073b578063fdffbb281461076e57600080fd5b8063d8cc1a3c14610646578063e1f0c37614610666578063ec5e630814610699578063f3f7214e146106cc57600080fd5b8063c55cd0c7116100d1578063c55cd0c71461055b578063c6f0308c1461056e578063cf09e0d0146105f8578063d5d44d801461061957600080fd5b80638d450a9514610489578063bbdc02db146104bc578063bcef3b55146104fd578063c395e1ca1461053a57600080fd5b8063609d33341161017a57806368800abf1161014957806368800abf146103f95780638129fc1c1461042c5780638980e0cc146104345780638b85902b1461044957600080fd5b8063609d33341461037157806360e2746414610386578063632247ea146103a65780636361506d146103b957600080fd5b80632810e1d6116101b65780632810e1d6146102a057806335fef567146102b55780633a768463146102ca57806354fd4d501461031b57600080fd5b80630356fe3a146101dd57806319effeb41461021f578063200d2ed214610265575b600080fd5b3480156101e957600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020015b60405180910390f35b34801561022b57600080fd5b5060005461024c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610216565b34801561027157600080fd5b5060005461029390700100000000000000000000000000000000900460ff1681565b6040516102169190613385565b3480156102ac57600080fd5b50610293610781565b6102c86102c33660046133c6565b61097e565b005b3480156102d657600080fd5b5060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561032757600080fd5b506103646040518060400160405280600581526020017f302e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516102169190613453565b34801561037d57600080fd5b5061036461098e565b34801561039257600080fd5b506102c86103a1366004613488565b6109a1565b6102c86103b43660046134c1565b610a51565b3480156103c557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013561020c565b34801561040557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c86111e6565b34801561044057600080fd5b5060015461020c565b34801561045557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013561020c565b34801561049557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156104c857600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561050957600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033561020c565b34801561054657600080fd5b5061020c6105553660046134f6565b50600090565b6102c86105693660046133c6565b61157a565b34801561057a57600080fd5b5061058e610589366004613528565b611586565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610216565b34801561060457600080fd5b5060005461024c9067ffffffffffffffff1681565b34801561062557600080fd5b5061020c610634366004613488565b60026020526000908152604090205481565b34801561065257600080fd5b506102c861066136600461358a565b61161d565b34801561067257600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061024c565b3480156106a557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156106d857600080fd5b506040516fffffffffffffffffffffffffffffffff8152602001610216565b34801561070357600080fd5b506102c8610712366004613614565b611bfb565b34801561072357600080fd5b5061072c612094565b60405161021693929190613640565b34801561074757600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c861077c366004613528565b6120f1565b600080600054700100000000000000000000000000000000900460ff1660028111156107af576107af613356565b146107e6576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16610822576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008154811061084e5761084e61366e565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff161461088957600161088c565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561093d5761093d613356565b02179055600281111561095257610952613356565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b61098a82826000610a51565b5050565b606061099c60406020612552565b905090565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260026020526040808220805490839055905190929083908381818185875af1925050503d8060008114610a0c576040519150601f19603f3d011682016040523d82523d6000602084013e610a11565b606091505b5050905080610a4c576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610a7d57610a7d613356565b14610ab4576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610ac957610ac961366e565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610b8e90839086906125e916565b90506000610c2e826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050861580610c705750610c6d7f000000000000000000000000000000000000000000000000000000000000000060026136cc565b81145b8015610c7a575084155b15610cb1576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610d0b576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d367f000000000000000000000000000000000000000000000000000000000000000060016136cc565b8103610d4857610d48868885886125f1565b835160009063ffffffff90811614610da8576001856000015163ffffffff1681548110610d7757610d7761366e565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b60c0850151600090610dcc9067ffffffffffffffff165b67ffffffffffffffff1690565b67ffffffffffffffff1642610df6610dbf856fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610e0a91906136cc565b610e1491906136e4565b90507f000000000000000000000000000000000000000000000000000000000000000060011c677fffffffffffffff1667ffffffffffffffff82161115610e87576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526003602052604090205490915060ff1615610f05576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008c81526020019081526020016000206001808054905061119a91906136e4565b8154600181018355600092835260208320015560405133918c918e917f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be91a45050505050505050505050565b600554610100900460ff1615611228576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360400135116112df576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560048201526024015b60405180910390fd5b60663611156112f65763c407e0256000526004601cfd5b6040805160e08101825263ffffffff808252600060208301818152329484019485526fffffffffffffffffffffffffffffffff348116606086019081527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033560808701908152600160a088018181524280861660c08b0190815283548085018555938952995160059384027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995192909b167fffffffffffffffff0000000000000000000000000000000000000000000000009099169890981764010000000073ffffffffffffffffffffffffffffffffffffffff928316021790995599517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7870180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919099161790975591517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8850180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016918516919091179055517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9840155935194519481167001000000000000000000000000000000009590911694909402939093177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9093019290925581547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff90931692909217905580546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b61098a82826001610a51565b6001818154811061159657600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff16600281111561164957611649613356565b14611680576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600187815481106116955761169561366e565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b90506116f47f000000000000000000000000000000000000000000000000000000000000000060016136cc565b611790826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff16146117d1576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156118c0576118247f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006136e4565b6001901b611843846fffffffffffffffffffffffffffffffff166127b2565b67ffffffffffffffff16611857919061372a565b156118945761188b61187c60016fffffffffffffffffffffffffffffffff871661373e565b865463ffffffff166000612858565b600301546118b6565b7f00000000000000000000000000000000000000000000000000000000000000005b91508490506118ea565b600385015491506118e761187c6fffffffffffffffffffffffffffffffff8616600161376f565b90505b600882901b60088a8a6040516119019291906137a3565b6040518091039020901b14611942576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061194d8c61293c565b9050600061195c836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced32906119d6908f908f908f908f908a906004016137fc565b6020604051808303816000875af11580156119f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a199190613836565b600485015491149150600090600290611ac4906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611b60896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611b6a919061384f565b611b749190613870565b67ffffffffffffffff161590508115158103611bbc576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff166002811115611c2757611c27613356565b14611c5e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600080611c6d8661296b565b93509350935093506000611c8385858585612d98565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d169190613897565b905060018903611e0e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84611d72367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015611de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e089190613836565b50612089565b60028903611e3a5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489611d72565b60038903611e665773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487611d72565b60048903611fde5760006fffffffffffffffffffffffffffffffff861615611efe57611ec46fffffffffffffffffffffffffffffffff87167f0000000000000000000000000000000000000000000000000000000000000000612e57565b611eee907f00000000000000000000000000000000000000000000000000000000000000006136cc565b611ef99060016136cc565b611f20565b7f00000000000000000000000000000000000000000000000000000000000000005b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015611fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd79190613836565b5050612089565b60058903612057576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390524660c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a401611dc5565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560606120ea61098e565b9050909192565b60008054700100000000000000000000000000000000900460ff16600281111561211d5761211d613356565b14612154576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182815481106121695761216961366e565b6000918252602082206005919091020160048101549092506121ab90700100000000000000000000000000000000900460401c67ffffffffffffffff16610dbf565b60048301549091506000906121dd90700100000000000000000000000000000000900467ffffffffffffffff16610dbf565b6121e7904261384f565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c1661222182846138b4565b67ffffffffffffffff1611612262576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600460205260409020805485158015612282575060055460ff165b156122b9576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801580156122c657508515155b1561232b578454640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156122f95781612315565b600187015473ffffffffffffffffffffffffffffffffffffffff165b90506123218188612f0c565b5050505050505050565b60006fffffffffffffffffffffffffffffffff815b8381101561247157600085828154811061235c5761235c61366e565b60009182526020808320909101548083526004909152604090912054909150156123b2576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182815481106123c7576123c761366e565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff16158015612420575060048101546fffffffffffffffffffffffffffffffff908116908516115b1561245e576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b50508061246a906138d7565b9050612340565b506124b973ffffffffffffffffffffffffffffffffffffffff83161561249757826124b3565b600188015473ffffffffffffffffffffffffffffffffffffffff165b88612f0c565b86547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff84160217875560008881526004602052604081206125159161331c565b8760000361232157600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050505050565b6060600061258984367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036136cc565b90508267ffffffffffffffff1667ffffffffffffffff8111156125ae576125ae61390f565b6040519080825280601f01601f1916602001820160405280156125d8576020820181803683370190505b509150828160208401375092915050565b151760011b90565b60006126106fffffffffffffffffffffffffffffffff8416600161376f565b9050600061262082866001612858565b9050600086901a8380612713575061265960027f000000000000000000000000000000000000000000000000000000000000000061372a565b60048301546002906126fd906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6127079190613870565b67ffffffffffffffff16145b1561276b5760ff81166001148061272d575060ff81166002145b612766576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016112d6565b6127a9565b60ff8116156127a9576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016112d6565b50505050505050565b60008061283f837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b600080826128a15761289c6fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000612ff9565b6128bc565b6128bc856fffffffffffffffffffffffffffffffff166131c0565b9050600184815481106128d1576128d161366e565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461293457815460018054909163ffffffff1690811061291f5761291f61366e565b906000526020600020906005020191506128e2565b509392505050565b600080600080600061294d8661296b565b935093509350935061296184848484612d98565b9695505050505050565b600080600080600085905060006001828154811061298b5761298b61366e565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090612a62906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611612aa3576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090612b6a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169250821115612be657825463ffffffff16612bb07f000000000000000000000000000000000000000000000000000000000000000060016136cc565b8303612bba578391505b60018181548110612bcd57612bcd61366e565b9060005260206000209060050201935080945050612aa7565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff16612c4f612c3a856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015612d34576000612c87836fffffffffffffffffffffffffffffffff166127b2565b67ffffffffffffffff161115612cea576000612cc1612cb960016fffffffffffffffffffffffffffffffff861661373e565b896001612858565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50612d0e9050565b7f00000000000000000000000000000000000000000000000000000000000000009a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750612d8a565b6000612d56612cb96fffffffffffffffffffffffffffffffff8516600161376f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff84168103612dfe578282604051602001612de19291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b604051602081830303815290604052805190602001209050612e4f565b60408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012090505b949350505050565b600080612ee4847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60028101546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff000000000000000000000000000000018101612f7c576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280830180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff17905573ffffffffffffffffffffffffffffffffffffffff84166000908152602091909152604081208054839290612fef9084906136cc565b9091555050505050565b600081613098846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff16116130d9576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130e2836131c0565b905081613181826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff16116131ba576131b761319e8360016136cc565b6fffffffffffffffffffffffffffffffff83169061326c565b90505b92915050565b60008119600183011681613254827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b6000806132f9847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050808303600180821b0385821b179250505092915050565b508054600082559060005260206000209081019061333a919061333d565b50565b5b80821115613352576000815560010161333e565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106133c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600080604083850312156133d957600080fd5b50508035926020909101359150565b6000815180845260005b8181101561340e576020818501810151868301820152016133f2565b81811115613420576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131b760208301846133e8565b73ffffffffffffffffffffffffffffffffffffffff8116811461333a57600080fd5b60006020828403121561349a57600080fd5b81356134a581613466565b9392505050565b803580151581146134bc57600080fd5b919050565b6000806000606084860312156134d657600080fd5b83359250602084013591506134ed604085016134ac565b90509250925092565b60006020828403121561350857600080fd5b81356fffffffffffffffffffffffffffffffff811681146134a557600080fd5b60006020828403121561353a57600080fd5b5035919050565b60008083601f84011261355357600080fd5b50813567ffffffffffffffff81111561356b57600080fd5b60208301915083602082850101111561358357600080fd5b9250929050565b600080600080600080608087890312156135a357600080fd5b863595506135b3602088016134ac565b9450604087013567ffffffffffffffff808211156135d057600080fd5b6135dc8a838b01613541565b909650945060608901359150808211156135f557600080fd5b5061360289828a01613541565b979a9699509497509295939492505050565b60008060006060848603121561362957600080fd5b505081359360208301359350604090920135919050565b63ffffffff8416815282602082015260606040820152600061366560608301846133e8565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156136df576136df61369d565b500190565b6000828210156136f6576136f661369d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613739576137396136fb565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156137675761376761369d565b039392505050565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561379a5761379a61369d565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006138106060830187896137b3565b82810360208401526138238186886137b3565b9150508260408301529695505050505050565b60006020828403121561384857600080fd5b5051919050565b600067ffffffffffffffff838116908316818110156137675761376761369d565b600067ffffffffffffffff8084168061388b5761388b6136fb565b92169190910692915050565b6000602082840312156138a957600080fd5b81516134a581613466565b600067ffffffffffffffff80831681851680830382111561379a5761379a61369d565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139085761390861369d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c634300080f000a", + Bin: "0x6101806040523480156200001257600080fd5b5060405162003bd238038062003bd283398101604081905262000035916200009b565b838310620000565760405163e62ccf3960e01b815260040160405180910390fd5b63ffffffff90971661016052608095909552610120939093526101409190915260a05260c0526001600160401b031660e0526001600160a01b03166101005262000140565b600080600080600080600080610100898b031215620000b957600080fd5b885163ffffffff81168114620000ce57600080fd5b60208a015160408b015160608c015160808d015160a08e015160c08f0151959d50939b509199509750955093506001600160401b03811681146200011157600080fd5b60e08a01519092506001600160a01b03811681146200012f57600080fd5b809150509295985092959890939650565b60805160a05160c05160e0516101005161012051610140516101605161399262000240600039600081816104d301526120dd0152600081816104080152612d330152600081816101ec0152818161127101528181611f110152611f470152600081816102f1015281816119cb0152611cd001526000818161067b01528181610e5f015261223b0152600081816106ae01528181610c4d01528181610d160152818161182601528181611ee70152818161267c015281816128bf015281816129ed01528181612af50152612bd101526000818161075001528181610cb901528181611715015261184701526000818161049801526118dd01526139926000f3fe6080604052600436106101d85760003560e01c80638d450a9511610102578063d8cc1a3c11610095578063f8f43ff611610064578063f8f43ff6146106fd578063fa24f7431461071d578063fa315aa914610741578063fdffbb281461077457600080fd5b8063d8cc1a3c1461064c578063e1f0c3761461066c578063ec5e63081461069f578063f3f7214e146106d257600080fd5b8063c55cd0c7116100d1578063c55cd0c714610561578063c6f0308c14610574578063cf09e0d0146105fe578063d5d44d801461061f57600080fd5b80638d450a9514610489578063bbdc02db146104bc578063bcef3b55146104fd578063c395e1ca1461053a57600080fd5b8063609d33341161017a57806368800abf1161014957806368800abf146103f95780638129fc1c1461042c5780638980e0cc146104345780638b85902b1461044957600080fd5b8063609d33341461037157806360e2746414610386578063632247ea146103a65780636361506d146103b957600080fd5b80632810e1d6116101b65780632810e1d6146102a057806335fef567146102b55780633a768463146102ca57806354fd4d501461031b57600080fd5b80630356fe3a146101dd57806319effeb41461021f578063200d2ed214610265575b600080fd5b3480156101e957600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020015b60405180910390f35b34801561022b57600080fd5b5060005461024c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610216565b34801561027157600080fd5b5060005461029390700100000000000000000000000000000000900460ff1681565b60405161021691906133cc565b3480156102ac57600080fd5b50610293610787565b6102c86102c336600461340d565b610984565b005b3480156102d657600080fd5b5060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561032757600080fd5b506103646040518060400160405280600581526020017f302e352e3000000000000000000000000000000000000000000000000000000081525081565b604051610216919061349a565b34801561037d57600080fd5b50610364610994565b34801561039257600080fd5b506102c86103a13660046134cf565b6109a7565b6102c86103b4366004613508565b610a57565b3480156103c557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013561020c565b34801561040557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c861122d565b34801561044057600080fd5b5060015461020c565b34801561045557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013561020c565b34801561049557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156104c857600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561050957600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033561020c565b34801561054657600080fd5b5061020c61055536600461353d565b50662386f26fc1000090565b6102c861056f36600461340d565b6115c1565b34801561058057600080fd5b5061059461058f36600461356f565b6115cd565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610216565b34801561060a57600080fd5b5060005461024c9067ffffffffffffffff1681565b34801561062b57600080fd5b5061020c61063a3660046134cf565b60026020526000908152604090205481565b34801561065857600080fd5b506102c86106673660046135d1565b611664565b34801561067857600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061024c565b3480156106ab57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156106de57600080fd5b506040516fffffffffffffffffffffffffffffffff8152602001610216565b34801561070957600080fd5b506102c861071836600461365b565b611c42565b34801561072957600080fd5b506107326120db565b60405161021693929190613687565b34801561074d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c861078236600461356f565b612138565b600080600054700100000000000000000000000000000000900460ff1660028111156107b5576107b561339d565b146107ec576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16610828576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600081548110610854576108546136b5565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff161461088f576001610892565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156109435761094361339d565b0217905560028111156109585761095861339d565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b61099082826000610a57565b5050565b60606109a260406020612599565b905090565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260026020526040808220805490839055905190929083908381818185875af1925050503d8060008114610a12576040519150601f19603f3d011682016040523d82523d6000602084013e610a17565b606091505b5050905080610a52576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610a8357610a8361339d565b14610aba576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610acf57610acf6136b5565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610b94908390869061263016565b90506000610c34826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050861580610c765750610c737f00000000000000000000000000000000000000000000000000000000000000006002613713565b81145b8015610c80575084155b15610cb7576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610d11576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d3c7f00000000000000000000000000000000000000000000000000000000000000006001613713565b8103610d4e57610d4e86888588612638565b34662386f26fc100001115610d8f576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835160009063ffffffff90811614610def576001856000015163ffffffff1681548110610dbe57610dbe6136b5565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b60c0850151600090610e139067ffffffffffffffff165b67ffffffffffffffff1690565b67ffffffffffffffff1642610e3d610e06856fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610e519190613713565b610e5b919061372b565b90507f000000000000000000000000000000000000000000000000000000000000000060011c677fffffffffffffff1667ffffffffffffffff82161115610ece576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526003602052604090205490915060ff1615610f4c576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008c8152602001908152602001600020600180805490506111e1919061372b565b8154600181018355600092835260208320015560405133918c918e917f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be91a45050505050505050505050565b600554610100900460ff161561126f576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013511611326576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560048201526024015b60405180910390fd5b606636111561133d5763c407e0256000526004601cfd5b6040805160e08101825263ffffffff808252600060208301818152329484019485526fffffffffffffffffffffffffffffffff348116606086019081527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033560808701908152600160a088018181524280861660c08b0190815283548085018555938952995160059384027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995192909b167fffffffffffffffff0000000000000000000000000000000000000000000000009099169890981764010000000073ffffffffffffffffffffffffffffffffffffffff928316021790995599517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7870180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919099161790975591517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8850180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016918516919091179055517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9840155935194519481167001000000000000000000000000000000009590911694909402939093177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9093019290925581547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff90931692909217905580546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b61099082826001610a57565b600181815481106115dd57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff1660028111156116905761169061339d565b146116c7576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600187815481106116dc576116dc6136b5565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b905061173b7f00000000000000000000000000000000000000000000000000000000000000006001613713565b6117d7826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1614611818576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156119075761186b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061372b565b6001901b61188a846fffffffffffffffffffffffffffffffff166127f9565b67ffffffffffffffff1661189e9190613771565b156118db576118d26118c360016fffffffffffffffffffffffffffffffff8716613785565b865463ffffffff16600061289f565b600301546118fd565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050611931565b6003850154915061192e6118c36fffffffffffffffffffffffffffffffff861660016137b6565b90505b600882901b60088a8a6040516119489291906137ea565b6040518091039020901b14611989576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119948c612983565b905060006119a3836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290611a1d908f908f908f908f908a90600401613843565b6020604051808303816000875af1158015611a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a60919061387d565b600485015491149150600090600290611b0b906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611ba7896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611bb19190613896565b611bbb91906138b7565b67ffffffffffffffff161590508115158103611c03576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff166002811115611c6e57611c6e61339d565b14611ca5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600080611cb4866129b2565b93509350935093506000611cca85858585612ddf565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d91906138de565b905060018903611e555773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84611db9367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015611e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4f919061387d565b506120d0565b60028903611e815773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489611db9565b60038903611ead5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487611db9565b600489036120255760006fffffffffffffffffffffffffffffffff861615611f4557611f0b6fffffffffffffffffffffffffffffffff87167f0000000000000000000000000000000000000000000000000000000000000000612e9e565b611f35907f0000000000000000000000000000000000000000000000000000000000000000613713565b611f40906001613713565b611f67565b7f00000000000000000000000000000000000000000000000000000000000000005b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015611ffa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201e919061387d565b50506120d0565b6005890361209e576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390524660c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a401611e0c565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003356060612131610994565b9050909192565b60008054700100000000000000000000000000000000900460ff1660028111156121645761216461339d565b1461219b576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182815481106121b0576121b06136b5565b6000918252602082206005919091020160048101549092506121f290700100000000000000000000000000000000900460401c67ffffffffffffffff16610e06565b600483015490915060009061222490700100000000000000000000000000000000900467ffffffffffffffff16610e06565b61222e9042613896565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c1661226882846138fb565b67ffffffffffffffff16116122a9576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526004602052604090208054851580156122c9575060055460ff165b15612300576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015801561230d57508515155b15612372578454640100000000900473ffffffffffffffffffffffffffffffffffffffff1660008115612340578161235c565b600187015473ffffffffffffffffffffffffffffffffffffffff165b90506123688188612f53565b5050505050505050565b60006fffffffffffffffffffffffffffffffff815b838110156124b85760008582815481106123a3576123a36136b5565b60009182526020808320909101548083526004909152604090912054909150156123f9576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001828154811061240e5761240e6136b5565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff16158015612467575060048101546fffffffffffffffffffffffffffffffff908116908516115b156124a5576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b5050806124b19061391e565b9050612387565b5061250073ffffffffffffffffffffffffffffffffffffffff8316156124de57826124fa565b600188015473ffffffffffffffffffffffffffffffffffffffff165b88612f53565b86547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff841602178755600088815260046020526040812061255c91613363565b8760000361236857600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050505050565b606060006125d084367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003613713565b90508267ffffffffffffffff1667ffffffffffffffff8111156125f5576125f5613956565b6040519080825280601f01601f19166020018201604052801561261f576020820181803683370190505b509150828160208401375092915050565b151760011b90565b60006126576fffffffffffffffffffffffffffffffff841660016137b6565b905060006126678286600161289f565b9050600086901a838061275a57506126a060027f0000000000000000000000000000000000000000000000000000000000000000613771565b6004830154600290612744906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61274e91906138b7565b67ffffffffffffffff16145b156127b25760ff811660011480612774575060ff81166002145b6127ad576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161131d565b6127f0565b60ff8116156127f0576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161131d565b50505050505050565b600080612886837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b600080826128e8576128e36fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000613040565b612903565b612903856fffffffffffffffffffffffffffffffff16613207565b905060018481548110612918576129186136b5565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461297b57815460018054909163ffffffff16908110612966576129666136b5565b90600052602060002090600502019150612929565b509392505050565b6000806000806000612994866129b2565b93509350935093506129a884848484612ddf565b9695505050505050565b60008060008060008590506000600182815481106129d2576129d26136b5565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090612aa9906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611612aea576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090612bb1906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169250821115612c2d57825463ffffffff16612bf77f00000000000000000000000000000000000000000000000000000000000000006001613713565b8303612c01578391505b60018181548110612c1457612c146136b5565b9060005260206000209060050201935080945050612aee565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff16612c96612c81856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015612d7b576000612cce836fffffffffffffffffffffffffffffffff166127f9565b67ffffffffffffffff161115612d31576000612d08612d0060016fffffffffffffffffffffffffffffffff8616613785565b89600161289f565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50612d559050565b7f00000000000000000000000000000000000000000000000000000000000000009a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750612dd1565b6000612d9d612d006fffffffffffffffffffffffffffffffff851660016137b6565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff84168103612e45578282604051602001612e289291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b604051602081830303815290604052805190602001209050612e96565b60408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012090505b949350505050565b600080612f2b847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60028101546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff000000000000000000000000000000018101612fc3576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280830180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff17905573ffffffffffffffffffffffffffffffffffffffff84166000908152602091909152604081208054839290613036908490613713565b9091555050505050565b6000816130df846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611613120576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61312983613207565b9050816131c8826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611613201576131fe6131e5836001613713565b6fffffffffffffffffffffffffffffffff8316906132b3565b90505b92915050565b6000811960018301168161329b827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b600080613340847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050808303600180821b0385821b179250505092915050565b50805460008255906000526020600020908101906133819190613384565b50565b5b808211156133995760008155600101613385565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613407577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561342057600080fd5b50508035926020909101359150565b6000815180845260005b8181101561345557602081850181015186830182015201613439565b81811115613467576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131fe602083018461342f565b73ffffffffffffffffffffffffffffffffffffffff8116811461338157600080fd5b6000602082840312156134e157600080fd5b81356134ec816134ad565b9392505050565b8035801515811461350357600080fd5b919050565b60008060006060848603121561351d57600080fd5b8335925060208401359150613534604085016134f3565b90509250925092565b60006020828403121561354f57600080fd5b81356fffffffffffffffffffffffffffffffff811681146134ec57600080fd5b60006020828403121561358157600080fd5b5035919050565b60008083601f84011261359a57600080fd5b50813567ffffffffffffffff8111156135b257600080fd5b6020830191508360208285010111156135ca57600080fd5b9250929050565b600080600080600080608087890312156135ea57600080fd5b863595506135fa602088016134f3565b9450604087013567ffffffffffffffff8082111561361757600080fd5b6136238a838b01613588565b9096509450606089013591508082111561363c57600080fd5b5061364989828a01613588565b979a9699509497509295939492505050565b60008060006060848603121561367057600080fd5b505081359360208301359350604090920135919050565b63ffffffff841681528260208201526060604082015260006136ac606083018461342f565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613726576137266136e4565b500190565b60008282101561373d5761373d6136e4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261378057613780613742565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156137ae576137ae6136e4565b039392505050565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156137e1576137e16136e4565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006138576060830187896137fa565b828103602084015261386a8186886137fa565b9150508260408301529695505050505050565b60006020828403121561388f57600080fd5b5051919050565b600067ffffffffffffffff838116908316818110156137ae576137ae6136e4565b600067ffffffffffffffff808416806138d2576138d2613742565b92169190910692915050565b6000602082840312156138f057600080fd5b81516134ec816134ad565b600067ffffffffffffffff8083168185168083038211156137e1576137e16136e4565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361394f5761394f6136e4565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c634300080f000a", } // FaultDisputeGameABI is the input ABI used to generate the binding from. diff --git a/op-bindings/bindings/faultdisputegame_more.go b/op-bindings/bindings/faultdisputegame_more.go index a13ff18140b5..583096b78327 100644 --- a/op-bindings/bindings/faultdisputegame_more.go +++ b/op-bindings/bindings/faultdisputegame_more.go @@ -13,7 +13,7 @@ const FaultDisputeGameStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contr var FaultDisputeGameStorageLayout = new(solc.StorageLayout) -var FaultDisputeGameDeployedBin = "0x6080604052600436106101d85760003560e01c80638d450a9511610102578063d8cc1a3c11610095578063f8f43ff611610064578063f8f43ff6146106f7578063fa24f74314610717578063fa315aa91461073b578063fdffbb281461076e57600080fd5b8063d8cc1a3c14610646578063e1f0c37614610666578063ec5e630814610699578063f3f7214e146106cc57600080fd5b8063c55cd0c7116100d1578063c55cd0c71461055b578063c6f0308c1461056e578063cf09e0d0146105f8578063d5d44d801461061957600080fd5b80638d450a9514610489578063bbdc02db146104bc578063bcef3b55146104fd578063c395e1ca1461053a57600080fd5b8063609d33341161017a57806368800abf1161014957806368800abf146103f95780638129fc1c1461042c5780638980e0cc146104345780638b85902b1461044957600080fd5b8063609d33341461037157806360e2746414610386578063632247ea146103a65780636361506d146103b957600080fd5b80632810e1d6116101b65780632810e1d6146102a057806335fef567146102b55780633a768463146102ca57806354fd4d501461031b57600080fd5b80630356fe3a146101dd57806319effeb41461021f578063200d2ed214610265575b600080fd5b3480156101e957600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020015b60405180910390f35b34801561022b57600080fd5b5060005461024c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610216565b34801561027157600080fd5b5060005461029390700100000000000000000000000000000000900460ff1681565b6040516102169190613385565b3480156102ac57600080fd5b50610293610781565b6102c86102c33660046133c6565b61097e565b005b3480156102d657600080fd5b5060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561032757600080fd5b506103646040518060400160405280600581526020017f302e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516102169190613453565b34801561037d57600080fd5b5061036461098e565b34801561039257600080fd5b506102c86103a1366004613488565b6109a1565b6102c86103b43660046134c1565b610a51565b3480156103c557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013561020c565b34801561040557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c86111e6565b34801561044057600080fd5b5060015461020c565b34801561045557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013561020c565b34801561049557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156104c857600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561050957600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033561020c565b34801561054657600080fd5b5061020c6105553660046134f6565b50600090565b6102c86105693660046133c6565b61157a565b34801561057a57600080fd5b5061058e610589366004613528565b611586565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610216565b34801561060457600080fd5b5060005461024c9067ffffffffffffffff1681565b34801561062557600080fd5b5061020c610634366004613488565b60026020526000908152604090205481565b34801561065257600080fd5b506102c861066136600461358a565b61161d565b34801561067257600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061024c565b3480156106a557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156106d857600080fd5b506040516fffffffffffffffffffffffffffffffff8152602001610216565b34801561070357600080fd5b506102c8610712366004613614565b611bfb565b34801561072357600080fd5b5061072c612094565b60405161021693929190613640565b34801561074757600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c861077c366004613528565b6120f1565b600080600054700100000000000000000000000000000000900460ff1660028111156107af576107af613356565b146107e6576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16610822576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008154811061084e5761084e61366e565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff161461088957600161088c565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561093d5761093d613356565b02179055600281111561095257610952613356565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b61098a82826000610a51565b5050565b606061099c60406020612552565b905090565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260026020526040808220805490839055905190929083908381818185875af1925050503d8060008114610a0c576040519150601f19603f3d011682016040523d82523d6000602084013e610a11565b606091505b5050905080610a4c576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610a7d57610a7d613356565b14610ab4576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610ac957610ac961366e565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610b8e90839086906125e916565b90506000610c2e826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050861580610c705750610c6d7f000000000000000000000000000000000000000000000000000000000000000060026136cc565b81145b8015610c7a575084155b15610cb1576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610d0b576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d367f000000000000000000000000000000000000000000000000000000000000000060016136cc565b8103610d4857610d48868885886125f1565b835160009063ffffffff90811614610da8576001856000015163ffffffff1681548110610d7757610d7761366e565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b60c0850151600090610dcc9067ffffffffffffffff165b67ffffffffffffffff1690565b67ffffffffffffffff1642610df6610dbf856fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610e0a91906136cc565b610e1491906136e4565b90507f000000000000000000000000000000000000000000000000000000000000000060011c677fffffffffffffff1667ffffffffffffffff82161115610e87576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526003602052604090205490915060ff1615610f05576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008c81526020019081526020016000206001808054905061119a91906136e4565b8154600181018355600092835260208320015560405133918c918e917f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be91a45050505050505050505050565b600554610100900460ff1615611228576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360400135116112df576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560048201526024015b60405180910390fd5b60663611156112f65763c407e0256000526004601cfd5b6040805160e08101825263ffffffff808252600060208301818152329484019485526fffffffffffffffffffffffffffffffff348116606086019081527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033560808701908152600160a088018181524280861660c08b0190815283548085018555938952995160059384027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995192909b167fffffffffffffffff0000000000000000000000000000000000000000000000009099169890981764010000000073ffffffffffffffffffffffffffffffffffffffff928316021790995599517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7870180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919099161790975591517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8850180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016918516919091179055517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9840155935194519481167001000000000000000000000000000000009590911694909402939093177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9093019290925581547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff90931692909217905580546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b61098a82826001610a51565b6001818154811061159657600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff16600281111561164957611649613356565b14611680576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600187815481106116955761169561366e565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b90506116f47f000000000000000000000000000000000000000000000000000000000000000060016136cc565b611790826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff16146117d1576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156118c0576118247f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006136e4565b6001901b611843846fffffffffffffffffffffffffffffffff166127b2565b67ffffffffffffffff16611857919061372a565b156118945761188b61187c60016fffffffffffffffffffffffffffffffff871661373e565b865463ffffffff166000612858565b600301546118b6565b7f00000000000000000000000000000000000000000000000000000000000000005b91508490506118ea565b600385015491506118e761187c6fffffffffffffffffffffffffffffffff8616600161376f565b90505b600882901b60088a8a6040516119019291906137a3565b6040518091039020901b14611942576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061194d8c61293c565b9050600061195c836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced32906119d6908f908f908f908f908a906004016137fc565b6020604051808303816000875af11580156119f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a199190613836565b600485015491149150600090600290611ac4906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611b60896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611b6a919061384f565b611b749190613870565b67ffffffffffffffff161590508115158103611bbc576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff166002811115611c2757611c27613356565b14611c5e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600080611c6d8661296b565b93509350935093506000611c8385858585612d98565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d169190613897565b905060018903611e0e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84611d72367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015611de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e089190613836565b50612089565b60028903611e3a5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489611d72565b60038903611e665773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487611d72565b60048903611fde5760006fffffffffffffffffffffffffffffffff861615611efe57611ec46fffffffffffffffffffffffffffffffff87167f0000000000000000000000000000000000000000000000000000000000000000612e57565b611eee907f00000000000000000000000000000000000000000000000000000000000000006136cc565b611ef99060016136cc565b611f20565b7f00000000000000000000000000000000000000000000000000000000000000005b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015611fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd79190613836565b5050612089565b60058903612057576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390524660c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a401611dc5565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560606120ea61098e565b9050909192565b60008054700100000000000000000000000000000000900460ff16600281111561211d5761211d613356565b14612154576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182815481106121695761216961366e565b6000918252602082206005919091020160048101549092506121ab90700100000000000000000000000000000000900460401c67ffffffffffffffff16610dbf565b60048301549091506000906121dd90700100000000000000000000000000000000900467ffffffffffffffff16610dbf565b6121e7904261384f565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c1661222182846138b4565b67ffffffffffffffff1611612262576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600460205260409020805485158015612282575060055460ff165b156122b9576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801580156122c657508515155b1561232b578454640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156122f95781612315565b600187015473ffffffffffffffffffffffffffffffffffffffff165b90506123218188612f0c565b5050505050505050565b60006fffffffffffffffffffffffffffffffff815b8381101561247157600085828154811061235c5761235c61366e565b60009182526020808320909101548083526004909152604090912054909150156123b2576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182815481106123c7576123c761366e565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff16158015612420575060048101546fffffffffffffffffffffffffffffffff908116908516115b1561245e576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b50508061246a906138d7565b9050612340565b506124b973ffffffffffffffffffffffffffffffffffffffff83161561249757826124b3565b600188015473ffffffffffffffffffffffffffffffffffffffff165b88612f0c565b86547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff84160217875560008881526004602052604081206125159161331c565b8760000361232157600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050505050565b6060600061258984367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036136cc565b90508267ffffffffffffffff1667ffffffffffffffff8111156125ae576125ae61390f565b6040519080825280601f01601f1916602001820160405280156125d8576020820181803683370190505b509150828160208401375092915050565b151760011b90565b60006126106fffffffffffffffffffffffffffffffff8416600161376f565b9050600061262082866001612858565b9050600086901a8380612713575061265960027f000000000000000000000000000000000000000000000000000000000000000061372a565b60048301546002906126fd906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6127079190613870565b67ffffffffffffffff16145b1561276b5760ff81166001148061272d575060ff81166002145b612766576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016112d6565b6127a9565b60ff8116156127a9576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016112d6565b50505050505050565b60008061283f837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b600080826128a15761289c6fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000612ff9565b6128bc565b6128bc856fffffffffffffffffffffffffffffffff166131c0565b9050600184815481106128d1576128d161366e565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461293457815460018054909163ffffffff1690811061291f5761291f61366e565b906000526020600020906005020191506128e2565b509392505050565b600080600080600061294d8661296b565b935093509350935061296184848484612d98565b9695505050505050565b600080600080600085905060006001828154811061298b5761298b61366e565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090612a62906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611612aa3576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090612b6a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169250821115612be657825463ffffffff16612bb07f000000000000000000000000000000000000000000000000000000000000000060016136cc565b8303612bba578391505b60018181548110612bcd57612bcd61366e565b9060005260206000209060050201935080945050612aa7565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff16612c4f612c3a856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015612d34576000612c87836fffffffffffffffffffffffffffffffff166127b2565b67ffffffffffffffff161115612cea576000612cc1612cb960016fffffffffffffffffffffffffffffffff861661373e565b896001612858565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50612d0e9050565b7f00000000000000000000000000000000000000000000000000000000000000009a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750612d8a565b6000612d56612cb96fffffffffffffffffffffffffffffffff8516600161376f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff84168103612dfe578282604051602001612de19291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b604051602081830303815290604052805190602001209050612e4f565b60408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012090505b949350505050565b600080612ee4847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60028101546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff000000000000000000000000000000018101612f7c576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280830180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff17905573ffffffffffffffffffffffffffffffffffffffff84166000908152602091909152604081208054839290612fef9084906136cc565b9091555050505050565b600081613098846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff16116130d9576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130e2836131c0565b905081613181826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff16116131ba576131b761319e8360016136cc565b6fffffffffffffffffffffffffffffffff83169061326c565b90505b92915050565b60008119600183011681613254827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b6000806132f9847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050808303600180821b0385821b179250505092915050565b508054600082559060005260206000209081019061333a919061333d565b50565b5b80821115613352576000815560010161333e565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106133c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600080604083850312156133d957600080fd5b50508035926020909101359150565b6000815180845260005b8181101561340e576020818501810151868301820152016133f2565b81811115613420576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131b760208301846133e8565b73ffffffffffffffffffffffffffffffffffffffff8116811461333a57600080fd5b60006020828403121561349a57600080fd5b81356134a581613466565b9392505050565b803580151581146134bc57600080fd5b919050565b6000806000606084860312156134d657600080fd5b83359250602084013591506134ed604085016134ac565b90509250925092565b60006020828403121561350857600080fd5b81356fffffffffffffffffffffffffffffffff811681146134a557600080fd5b60006020828403121561353a57600080fd5b5035919050565b60008083601f84011261355357600080fd5b50813567ffffffffffffffff81111561356b57600080fd5b60208301915083602082850101111561358357600080fd5b9250929050565b600080600080600080608087890312156135a357600080fd5b863595506135b3602088016134ac565b9450604087013567ffffffffffffffff808211156135d057600080fd5b6135dc8a838b01613541565b909650945060608901359150808211156135f557600080fd5b5061360289828a01613541565b979a9699509497509295939492505050565b60008060006060848603121561362957600080fd5b505081359360208301359350604090920135919050565b63ffffffff8416815282602082015260606040820152600061366560608301846133e8565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156136df576136df61369d565b500190565b6000828210156136f6576136f661369d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613739576137396136fb565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156137675761376761369d565b039392505050565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561379a5761379a61369d565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006138106060830187896137b3565b82810360208401526138238186886137b3565b9150508260408301529695505050505050565b60006020828403121561384857600080fd5b5051919050565b600067ffffffffffffffff838116908316818110156137675761376761369d565b600067ffffffffffffffff8084168061388b5761388b6136fb565b92169190910692915050565b6000602082840312156138a957600080fd5b81516134a581613466565b600067ffffffffffffffff80831681851680830382111561379a5761379a61369d565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139085761390861369d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c634300080f000a" +var FaultDisputeGameDeployedBin = "0x6080604052600436106101d85760003560e01c80638d450a9511610102578063d8cc1a3c11610095578063f8f43ff611610064578063f8f43ff6146106fd578063fa24f7431461071d578063fa315aa914610741578063fdffbb281461077457600080fd5b8063d8cc1a3c1461064c578063e1f0c3761461066c578063ec5e63081461069f578063f3f7214e146106d257600080fd5b8063c55cd0c7116100d1578063c55cd0c714610561578063c6f0308c14610574578063cf09e0d0146105fe578063d5d44d801461061f57600080fd5b80638d450a9514610489578063bbdc02db146104bc578063bcef3b55146104fd578063c395e1ca1461053a57600080fd5b8063609d33341161017a57806368800abf1161014957806368800abf146103f95780638129fc1c1461042c5780638980e0cc146104345780638b85902b1461044957600080fd5b8063609d33341461037157806360e2746414610386578063632247ea146103a65780636361506d146103b957600080fd5b80632810e1d6116101b65780632810e1d6146102a057806335fef567146102b55780633a768463146102ca57806354fd4d501461031b57600080fd5b80630356fe3a146101dd57806319effeb41461021f578063200d2ed214610265575b600080fd5b3480156101e957600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020015b60405180910390f35b34801561022b57600080fd5b5060005461024c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610216565b34801561027157600080fd5b5060005461029390700100000000000000000000000000000000900460ff1681565b60405161021691906133cc565b3480156102ac57600080fd5b50610293610787565b6102c86102c336600461340d565b610984565b005b3480156102d657600080fd5b5060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561032757600080fd5b506103646040518060400160405280600581526020017f302e352e3000000000000000000000000000000000000000000000000000000081525081565b604051610216919061349a565b34801561037d57600080fd5b50610364610994565b34801561039257600080fd5b506102c86103a13660046134cf565b6109a7565b6102c86103b4366004613508565b610a57565b3480156103c557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013561020c565b34801561040557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c861122d565b34801561044057600080fd5b5060015461020c565b34801561045557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013561020c565b34801561049557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156104c857600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561050957600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033561020c565b34801561054657600080fd5b5061020c61055536600461353d565b50662386f26fc1000090565b6102c861056f36600461340d565b6115c1565b34801561058057600080fd5b5061059461058f36600461356f565b6115cd565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610216565b34801561060a57600080fd5b5060005461024c9067ffffffffffffffff1681565b34801561062b57600080fd5b5061020c61063a3660046134cf565b60026020526000908152604090205481565b34801561065857600080fd5b506102c86106673660046135d1565b611664565b34801561067857600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061024c565b3480156106ab57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156106de57600080fd5b506040516fffffffffffffffffffffffffffffffff8152602001610216565b34801561070957600080fd5b506102c861071836600461365b565b611c42565b34801561072957600080fd5b506107326120db565b60405161021693929190613687565b34801561074d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c861078236600461356f565b612138565b600080600054700100000000000000000000000000000000900460ff1660028111156107b5576107b561339d565b146107ec576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16610828576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600081548110610854576108546136b5565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff161461088f576001610892565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156109435761094361339d565b0217905560028111156109585761095861339d565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b61099082826000610a57565b5050565b60606109a260406020612599565b905090565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260026020526040808220805490839055905190929083908381818185875af1925050503d8060008114610a12576040519150601f19603f3d011682016040523d82523d6000602084013e610a17565b606091505b5050905080610a52576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610a8357610a8361339d565b14610aba576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610acf57610acf6136b5565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610b94908390869061263016565b90506000610c34826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050861580610c765750610c737f00000000000000000000000000000000000000000000000000000000000000006002613713565b81145b8015610c80575084155b15610cb7576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610d11576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d3c7f00000000000000000000000000000000000000000000000000000000000000006001613713565b8103610d4e57610d4e86888588612638565b34662386f26fc100001115610d8f576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835160009063ffffffff90811614610def576001856000015163ffffffff1681548110610dbe57610dbe6136b5565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b60c0850151600090610e139067ffffffffffffffff165b67ffffffffffffffff1690565b67ffffffffffffffff1642610e3d610e06856fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610e519190613713565b610e5b919061372b565b90507f000000000000000000000000000000000000000000000000000000000000000060011c677fffffffffffffff1667ffffffffffffffff82161115610ece576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526003602052604090205490915060ff1615610f4c576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008c8152602001908152602001600020600180805490506111e1919061372b565b8154600181018355600092835260208320015560405133918c918e917f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be91a45050505050505050505050565b600554610100900460ff161561126f576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013511611326576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560048201526024015b60405180910390fd5b606636111561133d5763c407e0256000526004601cfd5b6040805160e08101825263ffffffff808252600060208301818152329484019485526fffffffffffffffffffffffffffffffff348116606086019081527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033560808701908152600160a088018181524280861660c08b0190815283548085018555938952995160059384027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995192909b167fffffffffffffffff0000000000000000000000000000000000000000000000009099169890981764010000000073ffffffffffffffffffffffffffffffffffffffff928316021790995599517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7870180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919099161790975591517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8850180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016918516919091179055517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9840155935194519481167001000000000000000000000000000000009590911694909402939093177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9093019290925581547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff90931692909217905580546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b61099082826001610a57565b600181815481106115dd57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff1660028111156116905761169061339d565b146116c7576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600187815481106116dc576116dc6136b5565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b905061173b7f00000000000000000000000000000000000000000000000000000000000000006001613713565b6117d7826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1614611818576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156119075761186b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061372b565b6001901b61188a846fffffffffffffffffffffffffffffffff166127f9565b67ffffffffffffffff1661189e9190613771565b156118db576118d26118c360016fffffffffffffffffffffffffffffffff8716613785565b865463ffffffff16600061289f565b600301546118fd565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050611931565b6003850154915061192e6118c36fffffffffffffffffffffffffffffffff861660016137b6565b90505b600882901b60088a8a6040516119489291906137ea565b6040518091039020901b14611989576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119948c612983565b905060006119a3836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290611a1d908f908f908f908f908a90600401613843565b6020604051808303816000875af1158015611a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a60919061387d565b600485015491149150600090600290611b0b906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611ba7896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611bb19190613896565b611bbb91906138b7565b67ffffffffffffffff161590508115158103611c03576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff166002811115611c6e57611c6e61339d565b14611ca5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600080611cb4866129b2565b93509350935093506000611cca85858585612ddf565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d91906138de565b905060018903611e555773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84611db9367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015611e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4f919061387d565b506120d0565b60028903611e815773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489611db9565b60038903611ead5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487611db9565b600489036120255760006fffffffffffffffffffffffffffffffff861615611f4557611f0b6fffffffffffffffffffffffffffffffff87167f0000000000000000000000000000000000000000000000000000000000000000612e9e565b611f35907f0000000000000000000000000000000000000000000000000000000000000000613713565b611f40906001613713565b611f67565b7f00000000000000000000000000000000000000000000000000000000000000005b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015611ffa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201e919061387d565b50506120d0565b6005890361209e576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390524660c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a401611e0c565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003356060612131610994565b9050909192565b60008054700100000000000000000000000000000000900460ff1660028111156121645761216461339d565b1461219b576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182815481106121b0576121b06136b5565b6000918252602082206005919091020160048101549092506121f290700100000000000000000000000000000000900460401c67ffffffffffffffff16610e06565b600483015490915060009061222490700100000000000000000000000000000000900467ffffffffffffffff16610e06565b61222e9042613896565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c1661226882846138fb565b67ffffffffffffffff16116122a9576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526004602052604090208054851580156122c9575060055460ff165b15612300576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015801561230d57508515155b15612372578454640100000000900473ffffffffffffffffffffffffffffffffffffffff1660008115612340578161235c565b600187015473ffffffffffffffffffffffffffffffffffffffff165b90506123688188612f53565b5050505050505050565b60006fffffffffffffffffffffffffffffffff815b838110156124b85760008582815481106123a3576123a36136b5565b60009182526020808320909101548083526004909152604090912054909150156123f9576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001828154811061240e5761240e6136b5565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff16158015612467575060048101546fffffffffffffffffffffffffffffffff908116908516115b156124a5576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b5050806124b19061391e565b9050612387565b5061250073ffffffffffffffffffffffffffffffffffffffff8316156124de57826124fa565b600188015473ffffffffffffffffffffffffffffffffffffffff165b88612f53565b86547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff841602178755600088815260046020526040812061255c91613363565b8760000361236857600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050505050565b606060006125d084367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003613713565b90508267ffffffffffffffff1667ffffffffffffffff8111156125f5576125f5613956565b6040519080825280601f01601f19166020018201604052801561261f576020820181803683370190505b509150828160208401375092915050565b151760011b90565b60006126576fffffffffffffffffffffffffffffffff841660016137b6565b905060006126678286600161289f565b9050600086901a838061275a57506126a060027f0000000000000000000000000000000000000000000000000000000000000000613771565b6004830154600290612744906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61274e91906138b7565b67ffffffffffffffff16145b156127b25760ff811660011480612774575060ff81166002145b6127ad576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161131d565b6127f0565b60ff8116156127f0576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161131d565b50505050505050565b600080612886837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b600080826128e8576128e36fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000613040565b612903565b612903856fffffffffffffffffffffffffffffffff16613207565b905060018481548110612918576129186136b5565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461297b57815460018054909163ffffffff16908110612966576129666136b5565b90600052602060002090600502019150612929565b509392505050565b6000806000806000612994866129b2565b93509350935093506129a884848484612ddf565b9695505050505050565b60008060008060008590506000600182815481106129d2576129d26136b5565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090612aa9906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611612aea576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090612bb1906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169250821115612c2d57825463ffffffff16612bf77f00000000000000000000000000000000000000000000000000000000000000006001613713565b8303612c01578391505b60018181548110612c1457612c146136b5565b9060005260206000209060050201935080945050612aee565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff16612c96612c81856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015612d7b576000612cce836fffffffffffffffffffffffffffffffff166127f9565b67ffffffffffffffff161115612d31576000612d08612d0060016fffffffffffffffffffffffffffffffff8616613785565b89600161289f565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50612d559050565b7f00000000000000000000000000000000000000000000000000000000000000009a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750612dd1565b6000612d9d612d006fffffffffffffffffffffffffffffffff851660016137b6565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff84168103612e45578282604051602001612e289291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b604051602081830303815290604052805190602001209050612e96565b60408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012090505b949350505050565b600080612f2b847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60028101546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff000000000000000000000000000000018101612fc3576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280830180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff17905573ffffffffffffffffffffffffffffffffffffffff84166000908152602091909152604081208054839290613036908490613713565b9091555050505050565b6000816130df846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611613120576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61312983613207565b9050816131c8826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611613201576131fe6131e5836001613713565b6fffffffffffffffffffffffffffffffff8316906132b3565b90505b92915050565b6000811960018301168161329b827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b600080613340847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050808303600180821b0385821b179250505092915050565b50805460008255906000526020600020908101906133819190613384565b50565b5b808211156133995760008155600101613385565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613407577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561342057600080fd5b50508035926020909101359150565b6000815180845260005b8181101561345557602081850181015186830182015201613439565b81811115613467576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131fe602083018461342f565b73ffffffffffffffffffffffffffffffffffffffff8116811461338157600080fd5b6000602082840312156134e157600080fd5b81356134ec816134ad565b9392505050565b8035801515811461350357600080fd5b919050565b60008060006060848603121561351d57600080fd5b8335925060208401359150613534604085016134f3565b90509250925092565b60006020828403121561354f57600080fd5b81356fffffffffffffffffffffffffffffffff811681146134ec57600080fd5b60006020828403121561358157600080fd5b5035919050565b60008083601f84011261359a57600080fd5b50813567ffffffffffffffff8111156135b257600080fd5b6020830191508360208285010111156135ca57600080fd5b9250929050565b600080600080600080608087890312156135ea57600080fd5b863595506135fa602088016134f3565b9450604087013567ffffffffffffffff8082111561361757600080fd5b6136238a838b01613588565b9096509450606089013591508082111561363c57600080fd5b5061364989828a01613588565b979a9699509497509295939492505050565b60008060006060848603121561367057600080fd5b505081359360208301359350604090920135919050565b63ffffffff841681528260208201526060604082015260006136ac606083018461342f565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613726576137266136e4565b500190565b60008282101561373d5761373d6136e4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261378057613780613742565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156137ae576137ae6136e4565b039392505050565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156137e1576137e16136e4565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006138576060830187896137fa565b828103602084015261386a8186886137fa565b9150508260408301529695505050505050565b60006020828403121561388f57600080fd5b5051919050565b600067ffffffffffffffff838116908316818110156137ae576137ae6136e4565b600067ffffffffffffffff808416806138d2576138d2613742565b92169190910692915050565b6000602082840312156138f057600080fd5b81516134ec816134ad565b600067ffffffffffffffff8083168185168083038211156137e1576137e16136e4565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361394f5761394f6136e4565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c634300080f000a" func init() { diff --git a/op-e2e/e2eutils/disputegame/output_game_helper.go b/op-e2e/e2eutils/disputegame/output_game_helper.go index 2bced65a8a82..f19b99e4ce39 100644 --- a/op-e2e/e2eutils/disputegame/output_game_helper.go +++ b/op-e2e/e2eutils/disputegame/output_game_helper.go @@ -451,6 +451,12 @@ func (g *OutputGameHelper) waitForNewClaim(ctx context.Context, checkPoint int64 func (g *OutputGameHelper) AttackWithTransactOpts(ctx context.Context, claimIdx int64, claim common.Hash, opts *bind.TransactOpts) { g.t.Logf("Attacking claim %v with value %v", claimIdx, claim) + + claimData, err := g.game.ClaimData(&bind.CallOpts{Context: ctx}, big.NewInt(claimIdx)) + g.require.NoError(err, "Failed to get claim data") + pos := types.NewPositionFromGIndex(claimData.Position) + opts = g.makeBondedTransactOpts(ctx, pos.Attack().ToGIndex(), opts) + tx, err := g.game.Attack(opts, big.NewInt(claimIdx), claim) if err != nil { g.require.NoErrorf(err, "Attack transaction did not send. Game state: \n%v", g.gameData(ctx)) @@ -467,7 +473,13 @@ func (g *OutputGameHelper) Attack(ctx context.Context, claimIdx int64, claim com func (g *OutputGameHelper) DefendWithTransactOpts(ctx context.Context, claimIdx int64, claim common.Hash, opts *bind.TransactOpts) { g.t.Logf("Defending claim %v with value %v", claimIdx, claim) - tx, err := g.game.Defend(g.opts, big.NewInt(claimIdx), claim) + + claimData, err := g.game.ClaimData(&bind.CallOpts{Context: ctx}, big.NewInt(claimIdx)) + g.require.NoError(err, "Failed to get claim data") + pos := types.NewPositionFromGIndex(claimData.Position) + opts = g.makeBondedTransactOpts(ctx, pos.Defend().ToGIndex(), opts) + + tx, err := g.game.Defend(opts, big.NewInt(claimIdx), claim) if err != nil { g.require.NoErrorf(err, "Defend transaction did not send. Game state: \n%v", g.gameData(ctx)) } @@ -481,6 +493,14 @@ func (g *OutputGameHelper) Defend(ctx context.Context, claimIdx int64, claim com g.DefendWithTransactOpts(ctx, claimIdx, claim, g.opts) } +func (g *OutputGameHelper) makeBondedTransactOpts(ctx context.Context, pos *big.Int, opts *bind.TransactOpts) *bind.TransactOpts { + bopts := *opts + bond, err := g.game.GetRequiredBond(&bind.CallOpts{Context: ctx}, pos) + g.require.NoError(err, "Failed to get required bond") + bopts.Value = bond + return &bopts +} + type ErrWithData interface { ErrorData() interface{} } diff --git a/packages/contracts-bedrock/semver-lock.json b/packages/contracts-bedrock/semver-lock.json index a1eb31ad21b4..5a8d3157c51b 100644 --- a/packages/contracts-bedrock/semver-lock.json +++ b/packages/contracts-bedrock/semver-lock.json @@ -96,8 +96,8 @@ "sourceCodeHash": "0x1e5a6deded88804971fc1847c9eac65921771bff353437c0b29ed2f55513b984" }, "src/dispute/FaultDisputeGame.sol": { - "initCodeHash": "0x206faab5d19598def839adac4f85427b945b222adc8401626fd1d7a58ec52262", - "sourceCodeHash": "0xfafd5423f3ffb2101cba4feb023127a887838423146f1838a9d8c6e9853c73c7" + "initCodeHash": "0x44969c83852ed72e3152bcd98533fefa7b88116a939bf7ee4ad0f87dc9091ea2", + "sourceCodeHash": "0x47a93c22df3b8481be0a553ba0ecccfc63cccf1ce7a5d908f11c940f4924b09a" }, "src/legacy/DeployerWhitelist.sol": { "initCodeHash": "0x8de80fb23b26dd9d849f6328e56ea7c173cd9e9ce1f05c9beea559d1720deb3d", diff --git a/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol b/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol index e8f170c77a88..d91240e8b4b0 100644 --- a/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol +++ b/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol @@ -81,8 +81,8 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { bool internal initialized; /// @notice Semantic version. - /// @custom:semver 0.4.0 - string public constant version = "0.4.0"; + /// @custom:semver 0.5.0 + string public constant version = "0.5.0"; /// @param _gameType The type ID of the game. /// @param _absolutePrestate The absolute prestate of the instruction trace. @@ -535,9 +535,9 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { /// @param _position The position of the bonded interaction. /// @return requiredBond_ The required ETH bond for the given move, in wei. function getRequiredBond(Position _position) public pure returns (uint256 requiredBond_) { - // TODO + // TODO(client-pod#551): For now use a non-zero bond amount to unblock functional tests. _position; - requiredBond_ = 0; + requiredBond_ = 0.01 ether; } /// @notice Claim the credit belonging to the recipient address. diff --git a/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol index 620ce3773546..9c7d757eac91 100644 --- a/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol @@ -92,6 +92,9 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { /// @dev The absolute prestate of the trace. Claim internal absolutePrestate; + /// @dev Minimum bond value that covers all possible moves. + uint256 internal constant MIN_BOND = 0.01 ether; + function setUp() public override { absolutePrestateData = abi.encode(0); absolutePrestate = _changeClaimStatus(Claim.wrap(keccak256(absolutePrestateData)), VMStatuses.UNFINISHED); @@ -295,7 +298,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { if (i == maxDepth) { vm.expectRevert(GameDepthExceeded.selector); } - gameProxy.attack(i, claim); + gameProxy.attack{ value: MIN_BOND }(i, claim); } } @@ -305,7 +308,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { // Warp ahead past the clock time for the first move (3 1/2 days) vm.warp(block.timestamp + 3 days + 12 hours + 1); vm.expectRevert(ClockTimeExceeded.selector); - gameProxy.attack(0, _dummyClaim()); + gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim()); } /// @notice Static unit test for the correctness of the chess clock incrementation. @@ -316,12 +319,12 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { Claim claim = _dummyClaim(); vm.warp(block.timestamp + 15); - gameProxy.attack(0, claim); + gameProxy.attack{ value: MIN_BOND }(0, claim); (,,,,,, clock) = gameProxy.claimData(1); assertEq(clock.raw(), LibClock.wrap(Duration.wrap(15), Timestamp.wrap(uint64(block.timestamp))).raw()); vm.warp(block.timestamp + 10); - gameProxy.attack(1, claim); + gameProxy.attack{ value: MIN_BOND }(1, claim); (,,,,,, clock) = gameProxy.claimData(2); assertEq(clock.raw(), LibClock.wrap(Duration.wrap(10), Timestamp.wrap(uint64(block.timestamp))).raw()); @@ -330,12 +333,12 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { claim = _changeClaimStatus(claim, VMStatuses.PANIC); vm.warp(block.timestamp + 10); - gameProxy.attack(2, claim); + gameProxy.attack{ value: MIN_BOND }(2, claim); (,,,,,, clock) = gameProxy.claimData(3); assertEq(clock.raw(), LibClock.wrap(Duration.wrap(25), Timestamp.wrap(uint64(block.timestamp))).raw()); vm.warp(block.timestamp + 10); - gameProxy.attack(3, claim); + gameProxy.attack{ value: MIN_BOND }(3, claim); (,,,,,, clock) = gameProxy.claimData(4); assertEq(clock.raw(), LibClock.wrap(Duration.wrap(20), Timestamp.wrap(uint64(block.timestamp))).raw()); } @@ -346,11 +349,11 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { Claim claim = _dummyClaim(); // Make the first move. This should succeed. - gameProxy.attack(0, claim); + gameProxy.attack{ value: MIN_BOND }(0, claim); // Attempt to make the same move again. vm.expectRevert(ClaimAlreadyExists.selector); - gameProxy.attack(0, claim); + gameProxy.attack{ value: MIN_BOND }(0, claim); } /// @dev Static unit test asserting that identical claims at the same position can be made in different subgames. @@ -359,13 +362,13 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { Claim claimB = _dummyClaim(); // Make the first moves. This should succeed. - gameProxy.attack(0, claimA); - gameProxy.attack(0, claimB); + gameProxy.attack{ value: MIN_BOND }(0, claimA); + gameProxy.attack{ value: MIN_BOND }(0, claimB); // Perform an attack at the same position with the same claim value in both subgames. // These both should succeed. - gameProxy.attack(1, claimA); - gameProxy.attack(2, claimA); + gameProxy.attack{ value: MIN_BOND }(1, claimA); + gameProxy.attack{ value: MIN_BOND }(2, claimA); } /// @dev Static unit test for the correctness of an opening attack. @@ -378,7 +381,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { // Perform the attack. vm.expectEmit(true, true, true, false); emit Move(0, counter, address(this)); - gameProxy.attack(0, counter); + gameProxy.attack{ value: MIN_BOND }(0, counter); // Grab the claim data of the attack. ( @@ -395,7 +398,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { assertEq(parentIndex, 0); assertEq(counteredBy, address(0)); assertEq(claimant, address(this)); - assertEq(bond, 0); + assertEq(bond, MIN_BOND); assertEq(claim.raw(), counter.raw()); assertEq(position.raw(), Position.wrap(1).move(true).raw()); assertEq(clock.raw(), LibClock.wrap(Duration.wrap(5), Timestamp.wrap(uint64(block.timestamp))).raw()); @@ -417,20 +420,26 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { /// byte reverts with the `UnexpectedRootClaim` error. function test_move_incorrectStatusExecRoot_reverts() public { for (uint256 i; i < 4; i++) { - gameProxy.attack(i, _dummyClaim()); + gameProxy.attack{ value: MIN_BOND }(i, _dummyClaim()); } vm.expectRevert(abi.encodeWithSelector(UnexpectedRootClaim.selector, bytes32(0))); - gameProxy.attack(4, Claim.wrap(bytes32(0))); + gameProxy.attack{ value: MIN_BOND }(4, Claim.wrap(bytes32(0))); } /// @dev Tests that making a claim at the execution trace bisection root level with a valid status /// byte succeeds. function test_move_correctStatusExecRoot_succeeds() public { for (uint256 i; i < 4; i++) { - gameProxy.attack(i, _dummyClaim()); + gameProxy.attack{ value: MIN_BOND }(i, _dummyClaim()); } - gameProxy.attack(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC)); + gameProxy.attack{ value: MIN_BOND }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC)); + } + + /// @dev Static unit test asserting that a move reverts when the bond is insufficient. + function test_move_insufficientBond_reverts() public { + vm.expectRevert(InsufficientBond.selector); + gameProxy.attack{ value: 0 }(0, _dummyClaim()); } /// @dev Static unit test for the correctness an uncontested root resolution. @@ -474,7 +483,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { /// @dev Static unit test for the correctness of resolving a single attack game state. function test_resolve_rootContested_succeeds() public { - gameProxy.attack(0, _dummyClaim()); + gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim()); vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); @@ -484,8 +493,8 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { /// @dev Static unit test for the correctness of resolving a game with a contested challenge claim. function test_resolve_challengeContested_succeeds() public { - gameProxy.attack(0, _dummyClaim()); - gameProxy.defend(1, _dummyClaim()); + gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim()); + gameProxy.defend{ value: MIN_BOND }(1, _dummyClaim()); vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); @@ -496,10 +505,10 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { /// @dev Static unit test for the correctness of resolving a game with multiplayer moves. function test_resolve_teamDeathmatch_succeeds() public { - gameProxy.attack(0, _dummyClaim()); - gameProxy.attack(0, _dummyClaim()); - gameProxy.defend(1, _dummyClaim()); - gameProxy.defend(1, _dummyClaim()); + gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim()); + gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim()); + gameProxy.defend{ value: MIN_BOND }(1, _dummyClaim()); + gameProxy.defend{ value: MIN_BOND }(1, _dummyClaim()); vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); @@ -512,12 +521,12 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { function test_resolve_stepReached_succeeds() public { Claim claim = _dummyClaim(); for (uint256 i; i < gameProxy.splitDepth(); i++) { - gameProxy.attack(i, claim); + gameProxy.attack{ value: MIN_BOND }(i, claim); } claim = _changeClaimStatus(claim, VMStatuses.PANIC); for (uint256 i = gameProxy.claimDataLen() - 1; i < gameProxy.maxGameDepth(); i++) { - gameProxy.attack(i, claim); + gameProxy.attack{ value: MIN_BOND }(i, claim); } vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); @@ -531,35 +540,35 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { /// @dev Static unit test asserting that resolve reverts when attempting to resolve a subgame multiple times function test_resolve_claimAlreadyResolved_reverts() public { - vm.deal(address(this), 1 ether); + vm.deal(address(this), 2 * MIN_BOND); Claim claim = _dummyClaim(); - gameProxy.attack{ value: 1 ether }(0, claim); - gameProxy.attack(1, claim); + gameProxy.attack{ value: MIN_BOND }(0, claim); + gameProxy.attack{ value: MIN_BOND }(1, claim); vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); assertEq(address(this).balance, 0); gameProxy.resolveClaim(1); gameProxy.claimCredit(address(this)); - assertEq(address(this).balance, 1 ether); + assertEq(address(this).balance, MIN_BOND); vm.expectRevert(ClaimAlreadyResolved.selector); gameProxy.resolveClaim(1); - assertEq(address(this).balance, 1 ether); + assertEq(address(this).balance, MIN_BOND); } /// @dev Static unit test asserting that resolve reverts when attempting to resolve a subgame at max depth function test_resolve_claimAtMaxDepthAlreadyResolved_reverts() public { Claim claim = _dummyClaim(); for (uint256 i; i < gameProxy.splitDepth(); i++) { - gameProxy.attack(i, claim); + gameProxy.attack{ value: MIN_BOND }(i, claim); } vm.deal(address(this), 100 ether); claim = _changeClaimStatus(claim, VMStatuses.PANIC); for (uint256 i = gameProxy.claimDataLen() - 1; i < gameProxy.maxGameDepth(); i++) { - gameProxy.attack{ value: 1 ether }(i, claim); + gameProxy.attack{ value: MIN_BOND }(i, claim); } vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); @@ -568,7 +577,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { uint256 balanceBefore = address(this).balance; gameProxy.resolveClaim(8); gameProxy.claimCredit(address(this)); - assertEq(address(this).balance, balanceBefore + 1 ether); + assertEq(address(this).balance, balanceBefore + MIN_BOND); vm.expectRevert(ClaimAlreadyResolved.selector); gameProxy.resolveClaim(8); @@ -576,8 +585,8 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { /// @dev Static unit test asserting that resolve reverts when attempting to resolve subgames out of order function test_resolve_outOfOrderResolution_reverts() public { - gameProxy.attack(0, _dummyClaim()); - gameProxy.attack(1, _dummyClaim()); + gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim()); + gameProxy.attack{ value: MIN_BOND }(1, _dummyClaim()); vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); @@ -750,37 +759,38 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { vm.startPrank(address(reenter)); // Give the test contract some ether to bond. - vm.deal(address(reenter), 1 ether); + vm.deal(address(reenter), MIN_BOND * 2); // Give the game proxy 1 extra ether, unregistered. vm.deal(address(gameProxy), 1 ether); // Perform a bonded move. Claim claim = _dummyClaim(); - gameProxy.attack{ value: 1 ether }(0, claim); - gameProxy.attack(1, claim); + gameProxy.attack{ value: MIN_BOND }(0, claim); + gameProxy.attack{ value: MIN_BOND }(1, claim); // Warp past the finalization period vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); // Ensure that we bonded all the test contract's ETH assertEq(address(reenter).balance, 0); - // Ensure the game proxy has 2 ETH, 1 from bonding and 1 unregistered. - assertEq(address(gameProxy).balance, 2 ether); + // Ensure the game proxy has 1 + 2 * MIN_BOND, 2*MIN_BOND from bonding and 1 unregistered. + assertEq(address(gameProxy).balance, 1 ether + MIN_BOND * 2); // Resolve the claim at gindex 1 and claim the reenter contract's credit. gameProxy.resolveClaim(1); // Ensure that the game registered the `reenter` contract's credit. - assertEq(gameProxy.credit(address(reenter)), 1 ether); + assertEq(gameProxy.credit(address(reenter)), MIN_BOND); // Initiate the reentrant credit claim. reenter.claimCredit(address(reenter)); - // The reenter contract should have performed 5 calls to `claimCredit`, but only received the 1 ETH bonded. The - // unregistered ETH should still exist in the game proxy. + // The reenter contract should have performed 5 calls to `claimCredit`, but only received the amount bonded for + // the gindex 1 subgame. + // The root claim bond and the unregistered ETH should still exist in the game proxy. assertEq(reenter.numCalls(), 5); - assertEq(address(reenter).balance, 1 ether); - assertEq(address(gameProxy).balance, 1 ether); + assertEq(address(reenter).balance, MIN_BOND); + assertEq(address(gameProxy).balance, 1 ether + MIN_BOND); vm.stopPrank(); } @@ -789,9 +799,9 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { function testFuzz_addLocalData_oob_reverts(uint256 _ident) public { // Get a claim below the split depth so that we can add local data for an execution trace subgame. for (uint256 i; i < 4; i++) { - gameProxy.attack(i, _dummyClaim()); + gameProxy.attack{ value: MIN_BOND }(i, _dummyClaim()); } - gameProxy.attack(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC)); + gameProxy.attack{ value: MIN_BOND }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC)); // [1, 5] are valid local data identifiers. if (_ident <= 5) _ident = 0; @@ -807,9 +817,9 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { // Get a claim below the split depth so that we can add local data for an execution trace subgame. for (uint256 i; i < 4; i++) { - gameProxy.attack(i, Claim.wrap(bytes32(i))); + gameProxy.attack{ value: MIN_BOND }(i, Claim.wrap(bytes32(i))); } - gameProxy.attack(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC)); + gameProxy.attack{ value: MIN_BOND }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC)); // Expected start/disputed claims bytes32 startingClaim = gameProxy.genesisOutputRoot().raw(); @@ -847,9 +857,9 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { // Get a claim below the split depth so that we can add local data for an execution trace subgame. for (uint256 i; i < 4; i++) { - gameProxy.attack(i, Claim.wrap(bytes32(i))); + gameProxy.attack{ value: MIN_BOND }(i, Claim.wrap(bytes32(i))); } - gameProxy.defend(4, _changeClaimStatus(ROOT_CLAIM, VMStatuses.VALID)); + gameProxy.defend{ value: MIN_BOND }(4, _changeClaimStatus(ROOT_CLAIM, VMStatuses.VALID)); // Expected start/disputed claims bytes32 startingClaim = bytes32(uint256(3)); @@ -1404,6 +1414,8 @@ contract FaultDispute_1v1_Actors_Test is FaultDisputeGame_Init { _preStateData: _dishonestPreStateData }); + vm.deal(address(honest), 100 ether); + vm.deal(address(dishonest), 100 ether); vm.label(address(honest), "HonestActor"); vm.label(address(dishonest), "DishonestActor"); } diff --git a/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol index fdc4812c1206..ee01e969fc2e 100644 --- a/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol @@ -96,6 +96,8 @@ contract PermissionedDisputeGame_Init is DisputeGameFactory_Init { contract PermissionedDisputeGame_Test is PermissionedDisputeGame_Init { /// @dev The root claim of the game. Claim internal constant ROOT_CLAIM = Claim.wrap(bytes32((uint256(1) << 248) | uint256(10))); + /// @dev Minimum bond value that covers all possible moves. + uint256 internal constant MIN_BOND = 0.01 ether; /// @dev The preimage of the absolute prestate claim bytes internal absolutePrestateData; @@ -134,18 +136,20 @@ contract PermissionedDisputeGame_Test is PermissionedDisputeGame_Init { /// @dev Tests that the challenger can participate in a permissioned dispute game. function test_participateInGame_challenger_succeeds() public { vm.startPrank(CHALLENGER, CHALLENGER); - gameProxy.attack(0, Claim.wrap(0)); - gameProxy.defend(1, Claim.wrap(0)); - gameProxy.move(2, Claim.wrap(0), true); + vm.deal(CHALLENGER, MIN_BOND * 3); + gameProxy.attack{ value: MIN_BOND }(0, Claim.wrap(0)); + gameProxy.defend{ value: MIN_BOND }(1, Claim.wrap(0)); + gameProxy.move{ value: MIN_BOND }(2, Claim.wrap(0), true); vm.stopPrank(); } /// @dev Tests that the proposer can participate in a permissioned dispute game. function test_participateInGame_proposer_succeeds() public { vm.startPrank(PROPOSER, PROPOSER); - gameProxy.attack(0, Claim.wrap(0)); - gameProxy.defend(1, Claim.wrap(0)); - gameProxy.move(2, Claim.wrap(0), true); + vm.deal(PROPOSER, MIN_BOND * 3); + gameProxy.attack{ value: MIN_BOND }(0, Claim.wrap(0)); + gameProxy.defend{ value: MIN_BOND }(1, Claim.wrap(0)); + gameProxy.move{ value: MIN_BOND }(2, Claim.wrap(0), true); vm.stopPrank(); }