diff --git a/client/engine/chainservice/adjudicator/NitroAdjudicator.go b/client/engine/chainservice/adjudicator/NitroAdjudicator.go index a3439af71..7fdd8043c 100644 --- a/client/engine/chainservice/adjudicator/NitroAdjudicator.go +++ b/client/engine/chainservice/adjudicator/NitroAdjudicator.go @@ -88,7 +88,7 @@ type INitroTypesVariablePart struct { // NitroAdjudicatorMetaData contains all meta data concerning the NitroAdjudicator contract. var NitroAdjudicatorMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assetIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"initialHoldings\",\"type\":\"uint256\"}],\"name\":\"AllocationUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"newTurnNumRecord\",\"type\":\"uint48\"}],\"name\":\"ChallengeCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"turnNumRecord\",\"type\":\"uint48\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"finalizesAt\",\"type\":\"uint48\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"participants\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"channelNonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"appDefinition\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"challengeDuration\",\"type\":\"uint48\"}],\"indexed\":false,\"internalType\":\"structINitroTypes.FixedPart\",\"name\":\"fixedPart\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structINitroTypes.SignedVariablePart[]\",\"name\":\"proof\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structINitroTypes.SignedVariablePart\",\"name\":\"candidate\",\"type\":\"tuple\"}],\"name\":\"ChallengeRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"finalizesAt\",\"type\":\"uint48\"}],\"name\":\"Concluded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountDeposited\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"destinationHoldings\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assetIndex\",\"type\":\"uint256\"}],\"name\":\"Reclaimed\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"participants\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"channelNonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"appDefinition\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"challengeDuration\",\"type\":\"uint48\"}],\"internalType\":\"structINitroTypes.FixedPart\",\"name\":\"fixedPart\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structINitroTypes.SignedVariablePart[]\",\"name\":\"proof\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structINitroTypes.SignedVariablePart\",\"name\":\"candidate\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature\",\"name\":\"challengerSig\",\"type\":\"tuple\"}],\"name\":\"challenge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"participants\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"channelNonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"appDefinition\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"challengeDuration\",\"type\":\"uint48\"}],\"internalType\":\"structINitroTypes.FixedPart\",\"name\":\"fixedPart\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structINitroTypes.SignedVariablePart[]\",\"name\":\"proof\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structINitroTypes.SignedVariablePart\",\"name\":\"candidate\",\"type\":\"tuple\"}],\"name\":\"checkpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"sourceAllocations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"targetAllocations\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"indexOfTargetInSource\",\"type\":\"uint256\"}],\"name\":\"compute_reclaim_effects\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"initialHoldings\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[]\",\"name\":\"indices\",\"type\":\"uint256[]\"}],\"name\":\"compute_transfer_effects_and_interactions\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"newAllocations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"allocatesOnlyZeros\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"exitAllocations\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"totalPayouts\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"participants\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"channelNonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"appDefinition\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"challengeDuration\",\"type\":\"uint48\"}],\"internalType\":\"structINitroTypes.FixedPart\",\"name\":\"fixedPart\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structINitroTypes.SignedVariablePart[]\",\"name\":\"proof\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structINitroTypes.SignedVariablePart\",\"name\":\"candidate\",\"type\":\"tuple\"}],\"name\":\"conclude\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"participants\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"channelNonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"appDefinition\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"challengeDuration\",\"type\":\"uint48\"}],\"internalType\":\"structINitroTypes.FixedPart\",\"name\":\"fixedPart\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structINitroTypes.SignedVariablePart[]\",\"name\":\"proof\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structINitroTypes.SignedVariablePart\",\"name\":\"candidate\",\"type\":\"tuple\"}],\"name\":\"concludeAndTransferAllAssets\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"expectedHeld\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"holdings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChannelId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"sourceStateHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"sourceOutcomeBytes\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"sourceAssetIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"indexOfTargetInSource\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"targetStateHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"targetOutcomeBytes\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"targetAssetIndex\",\"type\":\"uint256\"}],\"internalType\":\"structIMultiAssetHolder.ReclaimArgs\",\"name\":\"reclaimArgs\",\"type\":\"tuple\"}],\"name\":\"reclaim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"participants\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"channelNonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"appDefinition\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"challengeDuration\",\"type\":\"uint48\"}],\"internalType\":\"structINitroTypes.FixedPart\",\"name\":\"fixedPart\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structINitroTypes.SignedVariablePart[]\",\"name\":\"proof\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"appData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"turnNum\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"isFinal\",\"type\":\"bool\"}],\"internalType\":\"structINitroTypes.VariablePart\",\"name\":\"variablePart\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structINitroTypes.Signature[]\",\"name\":\"sigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structINitroTypes.SignedVariablePart\",\"name\":\"candidate\",\"type\":\"tuple\"}],\"name\":\"requireStateSupported\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"statusOf\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assetIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"fromChannelId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"outcomeBytes\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"stateHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"indices\",\"type\":\"uint256[]\"}],\"name\":\"transfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destination\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"allocationType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"structExitFormat.Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"internalType\":\"structExitFormat.SingleAssetExit[]\",\"name\":\"outcome\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes32\",\"name\":\"stateHash\",\"type\":\"bytes32\"}],\"name\":\"transferAllAssets\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"unpackStatus\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"turnNumRecord\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"finalizesAt\",\"type\":\"uint48\"},{\"internalType\":\"uint160\",\"name\":\"fingerprint\",\"type\":\"uint160\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60808060405234610016576135a2908161001c8239f35b600080fdfe608060405260048036101561001357600080fd5b600090813560e01c80630b34a39d146113cc57806311e9f1781461133a578063166e56cd146112f7578063180257e614610fe15780632fb1d27014610c995780633033730e14610a675780634c3dc5ff14610853578063552cfa501461080c578063564b81ef146107f1578063566d54c6146107825780637a776076146106d2578063af69c9d7146103f7578063c7df14e2146103cf578063d36fd009146103b05763d3c4e738146100c457600080fd5b346103ac57602060031981813601126103a8578235926001600160401b03908185116103a457610100809386360301126103a4576040519283018381108382111761038f576040528481013583528383019160248601358352604486013581811161038b576101389083369189010161195d565b956040850196875260608501966064820135885260808601916084810135835260a087019360a4820135855260c48201359081116103875761018160e49187369185010161195d565b918260c08a015201359060e08801948286526101be895194516101b98d51966101a981612f80565b8d8c519084519085012090612f17565b613274565b96876101c984613274565b956001600160a01b0390600260ff6040610200816101f586886101ec828c611f30565b51511699611f30565b5101518d5190611f30565b510151160361034357610226604061021b61022f938e611f30565b5101518a5190611f30565b51519688611f30565b515116036102ff575061029f6102aa9460406102948e61028d7f4d3754632451ebba9812a9305e7bca17b67a17186a5cff93d2e9ae1b01e3d27b9f9e9d9b988f6102f29e9c99869961028084612f80565b5191815191012090612f17565b5189611f30565b510151945190611f30565b510151905191612acd565b9184519260406102bb8a5185611f30565b51015251906040516102e9816102db898201948a86526040830190612a5c565b03601f1981018352826117d9565b51902091612fd9565b519251604051908152a280f35b60405162461bcd60e51b81529081018b9052601d60248201527f746172676574417373657420213d2067756172616e74656541737365740000006044820152606490fd5b60405162461bcd60e51b81528085018f9052601a60248201527f6e6f7420612067756172616e74656520616c6c6f636174696f6e0000000000006044820152606490fd5b8a80fd5b8780fd5b604182634e487b7160e01b6000525260246000fd5b8580fd5b8380fd5b5080fd5b82346103cc576103c86103c236611e4b565b916121bb565b5080f35b80fd5b50346103ac5760203660031901126103ac576020916040913581528083522054604051908152f35b50346103ac576060806003193601126106ce57813591602435906001600160401b0382116106ca5761042b91369101611a81565b926044359261043981612f80565b61044c8161044687613215565b86612f17565b60019480519361045b856117fa565b9461046960405196876117d9565b808652610478601f19916117fa565b019060005b82811061069a575050506104918151611ea6565b9261049c8251611ea6565b966000915b8351831015610596576104b48385611f30565b5160408101519093908a6001600160a01b036104d08489611f30565b51511691826000526105216020916001835260406000208b60005283528b6104fe8760406000205492611f30565b52610509868d611f30565b519060405191610518836117be565b600083526127d2565b919992999490941561058d575b98839291610541886105869a9b9c611f30565b52604061054e888d611f30565b5101520151906040519361056185611775565b84528301526040820152610575828a611f30565b526105808189611f30565b50611ed8565b91906104a1565b6000985061052e565b9150959491929460005b84518110156106375761063290877fb3917fd12b23b8d48703d554ab284c5b1912bb5c67e710c7534a56c13063767960408c6105f1856001600160a01b036105e8828e611f30565b51511692611f30565b5190600052602090600182528260002085600052825261061683600020918254611f44565b9055610622858c611f30565b51825191868352820152a2611ed8565b6105a0565b5085849188600014610683575090506000526000602052600060408120555b60005b82518110156103c8578061067961067361067e9386611f30565b51612dcc565b611ed8565b610659565b61068f61069593613215565b91612fd9565b610656565b6020906040999699516106ac81611775565b60008152828481830152846040830152828a0101520197949761047d565b8480fd5b8280fd5b82346103cc576107457f07da0a0674fb921e484018c8b81d80e292745e5d8ed134b580c8b9c631c5e9e0602061070736611e4b565b6107148396929651612368565b61071d836130ef565b9565ffffffffffff6040835101511693610736886126c9565b6107408589612665565b6123f0565b61076d60405161075481611744565b82815286848201528660408201528660608201526134d0565b8486528583526040862055604051908152a280f35b50346103ac5760603660031901126103ac576001600160401b0381358181116103a8576107b290369084016119b2565b926024359182116103cc576107ed6107d9856107d0368688016119b2565b60443591612acd565b604051918291602083526020830190611dcd565b0390f35b82346103cc57806003193601126103cc576020604051468152f35b5090346103cc5760203660031901126103cc57606061082b8335613541565b6040805165ffffffffffff94851681529390921660208401526001600160a01b031690820152f35b5090346103cc57600319916060368401126103ac5780356001600160401b03938482116103a857818301928236039060a0838301126103a457602480359088821161038b573660238301121561038b578183013595898711610a635736828860051b85010111610a6357604435928a8411610a5f576040878536030112610a5f576064820180359860018060a01b0392838b16809b03610a5b576109319161090d610913926109038f3690611867565b9289369201611c9a565b906124c4565b9561092b610921368e611867565b9136908a01611b5a565b90612562565b96893b15610a57576040516321c580b960e11b81526060888201529a3560648c0152838501359060221901811215610a57578301958487019601359b808d11610a57578c60051b36038713610a575760a060848c01528c6101048c01526101248b01968d8d905b8110610a36575050888c986109fe8d998b998b998f996109ea6084828e9c6109de8e9d8e60a4610a0d9f6109d5604465ffffffffffff9b01611840565b1691015261182c565b1660c48d015201611854565b1660e4890152858884030190880152612033565b91848303016044850152612013565b03915afa8015610a2b57610a1f575080f35b610a2890611790565b80f35b6040513d84823e3d90fd5b909760019085610a458b61182c565b1681526020809101990191018e610998565b8b80fd5b8c80fd5b8980fd5b8880fd5b5090346103cc5760a03660031901126103cc576001600160401b039160446024803583358335878111610c9557610aa1903690870161195d565b956064978835906084359081116106ce57610abf9036908901611d27565b93825b60018101808211610c83578651811015610b3a57610aeb610ae38389611f30565b519188611f30565b511115610b0057610afb90611ed8565b610ac2565b60405162461bcd60e51b81526020818b015260168189015275125b991a58d95cc81b5d5cdd081899481cdbdc9d195960521b818a01528b90fd5b50508881869495610b4a82612f80565b82519260209485948583012090610b619188612f17565b610b6a90613274565b6001600160a01b039690929087610b818486611f30565b51511696878a526001865260408a20838b52865260408a205491610ba58587611f30565b516040015190610bb591846127d2565b9150998c526001885260408c20858d52885260408c2090815490610bd891611f44565b9055610be48587611f30565b5160400152604051868101908782528060408101610c029089612a5c565b03601f1981018252610c1490826117d9565b519020610c219184612fd9565b604051908382528582015260407fb3917fd12b23b8d48703d554ab284c5b1912bb5c67e710c7534a56c13063767991a2610c5a91611f30565b51938451169301519060405193610c7085611775565b84528301526040820152610a2890612dcc565b634e487b7160e01b855260118a528785fd5b8680fd5b5060803660031901126103ac57610cae611811565b90602480359060449182356064958635908360a01c15610fa05760018060a01b0316928389526020936001855260408a20828b52855260408a205493808510610f5f57610cfb8482612555565b851015610f1e5790610d1885610d13868e9695612555565b611f44565b948887898d8d86159889600014610e3b57505050505050843403610dfa5760608695949392610d698e987f2dcdaad87b561ba5a69835009b4c53ef9d3c41ca6cc9574049187659d6c6a71594612555565b81895260018a5260408920858a528a528060408a2055604051918252878a8301526040820152a2610d98578280f35b82610da581938293611f44565b335af1610db0612736565b5015610dbd578581808280f35b60405162461bcd60e51b815293840152601d908301527f436f756c64206e6f7420726566756e64206578636573732066756e647300000090820152fd5b60405162461bcd60e51b8152808b01889052601f818a01527f496e636f7272656374206d73672e76616c756520666f72206465706f73697400818b01528b90fd5b8b60405196879586946323b872dd60e01b865233908601523090850152830152875af1908115610f13578d91610ee6575b5015610ea55760608695949392610d698e987f2dcdaad87b561ba5a69835009b4c53ef9d3c41ca6cc9574049187659d6c6a71594612555565b60405162461bcd60e51b8152808b018890526018818a01527f436f756c64206e6f74206465706f736974204552433230730000000000000000818b01528b90fd5b610f069150883d8a11610f0c575b610efe81836117d9565b81019061271e565b38610e6c565b503d610ef4565b6040513d8f823e3d90fd5b60405162461bcd60e51b8152808a01879052601b818901527f686f6c64696e677320616c72656164792073756666696369656e740000000000818a01528a90fd5b60405162461bcd60e51b8152808a018790526017818901527f686f6c64696e6773203c20657870656374656448656c64000000000000000000818a01528a90fd5b60405162461bcd60e51b8152602081890152601f818701527f4465706f73697420746f2065787465726e616c2064657374696e6174696f6e00818801528890fd5b50346103ac5790610fff91610ff536611e4b565b94919085916121bb565b9251519261100c81612f80565b61101584613215565b9061101f81613541565b94915050604051936020948581019487865260408201526040815261104381611775565b519093206001600160a01b0393908416908416036112bb575060019285519261106b846117fa565b9361107960405195866117d9565b808552611088601f19916117fa565b0182875b828110611292575050506110a08751611ea6565b906110ab8851611ea6565b90875b895181101561117f576110c1818b611f30565b518a6040820151918b61111d866110d88786611f30565b5151169485835260018b52604083208c84528b5260408320546110fb888c611f30565b52611106878b611f30565b519060405191611115836117be565b8483526127d2565b91959293909515611177575b5091604061114b8880989796948e966111456111729c8f611f30565b52611f30565b51015201516040519261115d84611775565b8352888301526040820152610575828a611f30565b6110ae565b9d508e611129565b5088889293949796835b82518110156112045780846111a16111ff9386611f30565b5151166111ae8289611f30565b5190875260018c52604087208a88528c526111ce60408820918254611f44565b9055887fb3917fd12b23b8d48703d554ab284c5b1912bb5c67e710c7534a56c13063767960408d610622858d611f30565b611189565b508387818b858c1561123e575090918252528060408120555b805b82518110156103c857806106796106736112399386611f30565b61121f565b61124a61128491613215565b61125385613541565b5091906040519261126384611744565b65ffffffffffff8092168452168483015284604083015260608201526134d0565b92825252604082205561121d565b60405161129e81611775565b89815260608084830152604082015282828901015201839061108c565b60405162461bcd60e51b815290810184905260156024820152741a5b98dbdc9c9958dd08199a5b99d95c9c1c9a5b9d605a1b6044820152606490fd5b82346103cc5760403660031901126103cc576020906040906001600160a01b0361131f611811565b16815260018352818120602435825283522054604051908152f35b5090346103cc5760603660031901126103cc576001600160401b036024358181116106ce5761136c90369085016119b2565b916044359182116103cc576113ad6113c2611395868661138e36888401611d27565b91356127d2565b92939190604051958695608087526080870190611dcd565b91151560208601528482036040860152611dcd565b9060608301520390f35b5090346103cc5760c03660031901126103cc576001600160401b039180358381116106ce576113fe9036908301611867565b926024358181116103a8576114169036908401611d09565b936044358281116106ca5761142e9036908501611b5a565b9060603660631901126106ca576040519061144882611775565b60643560ff81168103610c95578252608435602083015260a43560408301526114718151612368565b61147a816130ef565b9465ffffffffffff60408551015116946114938761349d565b61149c81612088565b6117135765ffffffffffff6114b088613541565b50501686106116cf575b6114c5858a856123f0565b6114d085518461319e565b9360208401519160405160208101918783526040808301526009606083015268666f7263654d6f766560b81b60808301526080825260a0820190828210908211176116bc5760405251902061152e92916115299161302a565b6123a9565b156116785750608081019661158a61155765ffffffffffff8a511665ffffffffffff42166120a8565b92606086510151151565ffffffffffff60405195898752166020860152604085015260c0606085015260c08401906120c2565b8281036080840152815180825260208201916020808360051b8301019401928a915b83831061164b57505050505061160f65ffffffffffff87989961163c987f11f9d0a22f085bac11f2dd6b9e2efa2dbe0f826da2fe74ac2be2410dbeefa559868061160288879a6116179a0360a08401528c61214b565b0390a251168342166120a8565b935151613215565b926040519461162586611744565b8552166020840152604083015260608201526134d0565b90825281602052604082205580f35b9091929394602080611669600193601f19868203018752895161214b565b970193019301919392906115ac565b60649060206040519162461bcd60e51b8352820152601f60248201527f4368616c6c656e676572206973206e6f742061207061727469636970616e74006044820152fd5b634e487b7160e01b8c526041865260248cfd5b60405162461bcd60e51b8152602081840152601860248201527f7475726e4e756d5265636f7264206465637265617365642e00000000000000006044820152606490fd5b600161171e8861349d565b61172781612088565b0361173b576117368688612665565b6114ba565b611736876126c9565b608081019081106001600160401b0382111761175f57604052565b634e487b7160e01b600052604160045260246000fd5b606081019081106001600160401b0382111761175f57604052565b6001600160401b03811161175f57604052565b604081019081106001600160401b0382111761175f57604052565b602081019081106001600160401b0382111761175f57604052565b90601f801991011681019081106001600160401b0382111761175f57604052565b6001600160401b03811161175f5760051b60200190565b600435906001600160a01b038216820361182757565b600080fd5b35906001600160a01b038216820361182757565b35906001600160401b038216820361182757565b359065ffffffffffff8216820361182757565b91909160a081840312611827576040519060a08201936001600160401b03948381108682111761175f57604052829482358452602090818401359081116118275783019180601f840112156118275782356118c1816117fa565b936118cf60405195866117d9565b818552838086019260051b820101928311611827578301905b82821061192b5750505060809261192692849286015261190a60408201611840565b604086015261191b6060820161182c565b606086015201611854565b910152565b8380916119378461182c565b8152019101906118e8565b6001600160401b03811161175f57601f01601f191660200190565b81601f820112156118275780359061197482611942565b9261198260405194856117d9565b8284526020838301011161182757816000926020809301838601378301015290565b359060ff8216820361182757565b9080601f830112156118275781356119c9816117fa565b926040916119d9835195866117d9565b808552602093848087019260051b8401019381851161182757858401925b858410611a08575050505050505090565b6001600160401b03843581811161182757860191608080601f19858803011261182757845190611a3782611744565b8a8501358252858501358b830152606090611a538287016119a4565b8784015285013593841161182757611a72878c8097968197010161195d565b908201528152019301926119f7565b9080601f83011215611827578135611a98816117fa565b92604091611aa8835195866117d9565b808552602093848087019260051b8401019381851161182757858401925b858410611ad7575050505050505090565b6001600160401b03843581811161182757860191606080601f19858803011261182757845190611b0682611775565b611b118b860161182c565b82528585013584811161182757878c611b2c9288010161195d565b8b83015284013592831161182757611b4b868b809695819601016119b2565b85820152815201930192611ac6565b91906040928381830312611827578351848101916001600160401b03958284108785111761175f57838152829682358181116118275783019260808488031261182757611ba686611744565b83358281116118275787611bbb918601611a81565b8652602095868501358381116118275788611bd791870161195d565b606095869182890152611beb868201611854565b6080890152013580151581036118275760a087015285528581013591821161182757019085601f8301121561182757813590611c26826117fa565b96611c33825198896117d9565b8288528685818a01940285010193818511611827578701925b848410611c5d575050505050500152565b8584830312611827578786918451611c7481611775565b611c7d876119a4565b815282870135838201528587013586820152815201930192611c4c565b92919092611ca7846117fa565b91611cb560405193846117d9565b829480845260208094019060051b8301928284116118275780915b848310611cdf57505050505050565b82356001600160401b038111611827578691611cfe8684938601611b5a565b815201920191611cd0565b9080601f8301121561182757816020611d2493359101611c9a565b90565b81601f8201121561182757803591611d3e836117fa565b92611d4c60405194856117d9565b808452602092838086019260051b820101928311611827578301905b828210611d76575050505090565b81358152908301908301611d68565b60005b838110611d985750506000910152565b8181015183820152602001611d88565b90602091611dc181518092818552858086019101611d85565b601f01601f1916010190565b90815180825260208092019182818360051b85019501936000915b848310611df85750505050505090565b9091929394958480611e3b83856001950387528a51805182528381015184830152604060ff81830151169083015260608091015191608080928201520190611da8565b9801930193019194939290611de8565b6060600319820112611827576001600160401b03916004358381116118275782611e7791600401611867565b926024358181116118275783611e8f91600401611d09565b9260443591821161182757611d2491600401611b5a565b90611eb0826117fa565b611ebd60405191826117d9565b8281528092611ece601f19916117fa565b0190602036910137565b6000198114611ee75760010190565b634e487b7160e01b600052601160045260246000fd5b805115611f0a5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015611f0a5760400190565b8051821015611f0a5760209160051b010190565b91908203918211611ee757565b9060808101825160808352805180925260a0830160a08360051b850101926020809301916000905b828210611fba5750505050611f9d6060928284938701519086830390870152611da8565b9365ffffffffffff60408201511660408501520151151591015290565b909192948480612005600193609f198b82030186528951858060a01b038151168252611ff28482015160608087860152840190611da8565b9160408092015191818403910152611dcd565b970192019201909291611f79565b9060208061202a8451604085526040850190611f51565b93015191015290565b90815180825260208092019182818360051b82019501936000915b84831061205e5750505050505090565b909192939495848061207883856001950387528a51612013565b980193019301919493929061204e565b6003111561209257565b634e487b7160e01b600052602160045260246000fd5b91909165ffffffffffff80809416911601918211611ee757565b9060a0810191805182526020808201519360a08285015284518091528160c0850195019160005b82811061212e575050506040808301516001600160401b031690840152506060808201516001600160a01b03169083015260809081015165ffffffffffff1691015290565b83516001600160a01b0316875295810195928101926001016120e9565b80519061216060409283855283850190611f51565b9060208091015193818184039101528080855193848152019401926000905b83821061218e57505050505090565b8451805160ff1687528084015187850152810151868201526060909501949382019360019091019061217f565b9092916121c88251612368565b6121d1826130ef565b936121db856126c9565b5161232357606081510151156122e857602091826121f98383612562565b01519083826000935b6122c0575060ff9101515191160361228d5783917f4f465027a3d06ea73dd12be0f5c5fc0a34e21f19d6eaed4834a7a944edabc9019161227661224f65ffffffffffff4216925151613215565b6040519061225c82611744565b6000825283858301526000604083015260608201526134d0565b8460005260008352604060002055604051908152a2565b60405162461bcd60e51b815260048101839052600b60248201526a21756e616e696e6d6f757360a81b6044820152606490fd5b60001981019150808211611ee757169160ff809116908114611ee75760010191849080612202565b60405162461bcd60e51b815260206004820152601360248201527214dd185d19481b5d5cdd08189948199a5b985b606a1b6044820152606490fd5b60405162461bcd60e51b815260206004820152601b60248201527f4d757374207375626d69742065786163746c79203120737461746500000000006044820152606490fd5b460361237057565b60405162461bcd60e51b8152602060048201526011602482015270125b98dbdc9c9958dd0818da185a5b9259607a1b6044820152606490fd5b60005b82518110156123e8576001600160a01b03806123c88386611f30565b5116908316146123e0576123db90611ed8565b6123ac565b505050600190565b505050600090565b60608101516001600160a01b031692916124159061240e90836124c4565b9282612562565b92803b156118275761244f6109fe92612462600095604051978896879586956321c580b960e11b87526060600488015260648701906120c2565b6003199384878303016024880152612033565b03915afa801561247e576124735750565b61247c90611790565b565b6040513d6000823e3d90fd5b60405190612497826117a3565b60006020836040516124a881611744565b6060815260608382015283604082015283606082015281520152565b8151916124d0836117fa565b926124de60405194856117d9565b8084526124ed601f19916117fa565b0160005b81811061253e57505060005b8151811015612538578061251e6125176125339385611f30565b5185612562565b6125288287611f30565b526105808186611f30565b6124fd565b50505090565b60209061254961248a565b828288010152016124f1565b91908201809211611ee757565b9161256b61248a565b508151916040519261257c846117a3565b83526020908184019260009283855283955b818401805151881015612659576125be906125b7896125b0889598518d61319e565b9251611f30565b519061302a565b6001600160a01b0390811694909390865b848b01518051821015612647576125e7828892611f30565b511687146125fd576125f890611ed8565b6125cf565b80929993949a965060ff9195501161263357906126216001612628931b8851612555565b8752611ed8565b95919690929661258e565b634e487b7160e01b86526011600452602486fd5b50509350966126289192989450611ed8565b50955050945050505090565b61266e90613541565b505065ffffffffffff8091169116111561268457565b60405162461bcd60e51b815260206004820152601c60248201527f7475726e4e756d5265636f7264206e6f7420696e637265617365642e000000006044820152606490fd5b6126d460029161349d565b6126dd81612088565b146126e457565b60405162461bcd60e51b815260206004820152601260248201527121b430b73732b6103334b730b634bd32b21760711b6044820152606490fd5b90816020910312611827575180151581036118275790565b3d15612761573d9061274782611942565b9161275560405193846117d9565b82523d6000602084013e565b606090565b90612770826117fa565b60409061277f825191826117d9565b8381528093612790601f19916117fa565b0191600091825b8481106127a5575050505050565b60209083516127b381611744565b8581528286818301528686830152606080830152828501015201612797565b9192908351801515600014612a51576127ea90612766565b916000916127f88151612766565b95600190818097938960009586935b612815575b50505050505050565b909192939495978351851015612a485761282f8585611f30565b515161283b8685611f30565b515260409060ff808361284e8989611f30565b510151168361285d8988611f30565b51015260608061286d8989611f30565b5101518161287b8a89611f30565b5101526020938461288c8a8a611f30565b51015186811115612a42575085965b8d8b51908b8215928315612a18575b5050506000146129e75750600283828f6128c4908c611f30565b51015116146129a4578f96959493868f918f6129619061296794612973988f988f908f9161296d9a898f9461293c8f869288612917836129118884612909848e611f30565b510151611f44565b93611f30565b5101526129248187611f30565b515198856129328389611f30565b5101511695611f30565b5101519482519661294c88611744565b87528601528401528201526111458383611f30565b50612555565b9c611ed8565b95611f30565b51015161299b575b61298e9161298891611f44565b93611ed8565b91909493928a9085612807565b60009a5061297b565b5162461bcd60e51b815260048101859052601b60248201527f63616e6e6f74207472616e7366657220612067756172616e74656500000000006044820152606490fd5b9050612973925088915084612a0283959e989796958a611f30565b51015184612a108484611f30565b510152611f30565b821092509082612a2d575b50508e8b386128aa565b612a399192508d611f30565b51148a8f612a23565b9661289b565b9782915061280c565b506127ea8151612766565b90815180825260208092019182818360051b82019501936000915b848310612a875750505050505090565b9091929394958480612abd83856001950387528a51858060a01b038151168252611ff28482015160608087860152840190611da8565b9801930193019194939290612a77565b80516000198101908111611ee757612ae490612766565b91612aef8483611f30565b51606081015192604094855191612b05836117a3565b600095868452866020809501528781805181010312610c955787805191612b2b836117a3565b85810151835201519084810191825287998890899c8a988b5b87518d1015612cad578f848e14612c9e578c8f8f90612bb1858f8f908f612b6b8782611f30565b51519582612b798984611f30565b5101516060612b8f8a60ff856129328389611f30565b51015193825198612b9f8a611744565b89528801528601526060850152611f30565b52612bbc848d611f30565b5087159081612c88575b50612c4e575b501580612c39575b612beb575b612967612be591611ed8565b9b612b44565b9e5098612c2e908f612c198b612c0f8f612c058391611f20565b510151938d611f30565b5101918251612555565b905289612c258d611f20565b51015190612555565b60019e909990612bd9565b50612c448d89611f30565b5151875114612bd4565b829c919650612c25818c612c778f612c0f612c7e9882612c6e8199611efd565b51015194611f30565b9052611efd565b996001948c612bcc565b612c9391508b611f30565b51518851148f612bc6565b509b9d50612be560019e611ed8565b509899509c969a99505093999250505015612d905715612d565715612d1b5783015103612cd957505090565b60649250519062461bcd60e51b825280600483015260248201527f746f74616c5265636c61696d6564213d67756172616e7465652e616d6f756e746044820152fd5b825162461bcd60e51b815260048101859052601460248201527318dbdd5b19081b9bdd08199a5b99081c9a59da1d60621b6044820152606490fd5b835162461bcd60e51b815260048101869052601360248201527218dbdd5b19081b9bdd08199a5b99081b19599d606a1b6044820152606490fd5b845162461bcd60e51b815260048101879052601560248201527418dbdd5b19081b9bdd08199a5b99081d185c99d95d605a1b6044820152606490fd5b80516001600160a01b03908116919060005b604080840190815191825184101561280c5784612dfc858095611f30565b515191612e0d602095869251611f30565b510151918060a01c15600014612eec571687612e8657600080809381935af1612e34612736565b5015612e4a575050612e4590611ed8565b612dde565b60649250519062461bcd60e51b825260048201526016602482015275086deead8c840dcdee840e8e4c2dce6cccae4408aa8960531b6044820152fd5b919081519263a9059cbb60e01b845260048401526024830152828260448160008b5af1908115612ee2575090612e45939291612ec4575b5050611ed8565b81612eda92903d10610f0c57610efe81836117d9565b503880612ebd565b513d6000823e3d90fd5b60008981526001865284812091815294525091208054612e459392612f1091612555565b9055611ed8565b91612f2190613541565b936001600160a01b0393849350612f39925090613514565b16911603612f4357565b60405162461bcd60e51b81526020600482015260156024820152741a5b98dbdc9c9958dd08199a5b99d95c9c1c9a5b9d605a1b6044820152606490fd5b612f8b60029161349d565b612f9481612088565b03612f9b57565b60405162461bcd60e51b815260206004820152601660248201527521b430b73732b6103737ba103334b730b634bd32b21760511b6044820152606490fd5b919061301991612fe884613541565b50929060405193612ff885611744565b65ffffffffffff8092168552166020840152604083015260608201526134d0565b906000526000602052604060002055565b90600060806020926040948551858101917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008352603c820152603c815261307081611775565b5190209060ff8151169086868201519101519187519384528684015286830152606082015282805260015afa15612ee257600051906001600160a01b038216156130b8575090565b5162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606490fd5b805160209182810151916001600160401b036040830151169260018060a01b039265ffffffffffff60808560608401511692015116906040519586948886019860c08701918a5260a0604088015285518092528060e088019601976000905b83821061318157505050506060850152608084015260a083015203601f198101835261317b9150826117d9565b51902090565b895181168852988201988a9850968201966001919091019061314e565b61317b6131ad6131eb926130ef565b926020810151815191606065ffffffffffff60408301511691015115156131fe60405196879460208601998a5260a0604087015260c0860190611da8565b601f199586868303016060870152612a5c565b91608084015260a0830152039081018352826117d9565b60405161317b816102db6020820194602086526040830190612a5c565b81601f8201121561182757805161324881611942565b9261325660405194856117d9565b8184526020828401011161182757611d249160208085019101611d85565b805181016020828203126118275760208201516001600160401b0381116118275760208201603f8285010112156118275760208184010151906132b6826117fa565b936132c460405195866117d9565b82855260208501916020850160408560051b83850101011161182757604081830101925b60408560051b838501010184106133025750505050505090565b83516001600160401b03811161182757838301016060818803601f190112611827576040519061333182611775565b60408101516001600160a01b038116810361182757825260608101516001600160401b0381116118275761336e90604060208b0191840101613232565b602083015260808101516001600160401b0381116118275760208901605f8284010112156118275760408183010151906133a7826117fa565b926133b560405194856117d9565b828452602084019060208c0160608560051b85840101011161182757606083820101915b60608560051b8584010101831061340257505050505060408201528152602093840193016132e8565b82516001600160401b03811161182757608083860182018f03603f190112611827576040519161343183611744565b8386018201606081015184526080810151602085015260a0015160ff8116810361182757604084015260c082878601010151926001600160401b038411611827578f60209493606086958661348d9401928b8a01010101613232565b60608201528152019201916133d9565b6134ad65ffffffffffff91613541565b5090501680156000146134c05750600090565b42106134cb57600290565b600190565b65ffffffffffff60d01b815160d01b1665ffffffffffff60a01b602083015160a01b16179061350f6040820151606060018060a01b0393015190613514565b161790565b604051916020830191825260408301526040825261353182611775565b905190206001600160a01b031690565b60005260006020526040600020548060d01c9165ffffffffffff8260a01c169160018060a01b03169056fea26469706673582212202da7c7007c16fceeed57542d685d0b19dd1df655cab3f25c244cf95fef7377f664736f6c63430008110033", + Bin: "0x6080806040523461001657613680908161001c8239f35b600080fdfe608060405260048036101561001357600080fd5b600090813560e01c80630b34a39d1461145d57806311e9f178146113cb578063166e56cd14611388578063180257e6146110725780632fb1d27014610c995780633033730e14610a675780634c3dc5ff14610853578063552cfa501461080c578063564b81ef146107f1578063566d54c6146107825780637a776076146106d2578063af69c9d7146103f7578063c7df14e2146103cf578063d36fd009146103b05763d3c4e738146100c457600080fd5b346103ac57602060031981813601126103a8578235926001600160401b03908185116103a457610100809386360301126103a4576040519283018381108382111761038f576040528481013583528383019160248601358352604486013581811161038b57610138908336918901016119e7565b956040850196875260608501966064820135885260808601916084810135835260a087019360a4820135855260c48201359081116103875761018160e4918736918501016119e7565b918260c08a015201359060e08801948286526101be895194516101b98d51966101a98161301a565b8d8c519084519085012090612fb1565b61330e565b96876101c98461330e565b956001600160a01b0390600260ff6040610200816101f586886101ec828c611fba565b51511699611fba565b5101518d5190611fba565b510151160361034357610226604061021b61022f938e611fba565b5101518a5190611fba565b51519688611fba565b515116036102ff575061029f6102aa9460406102948e61028d7f4d3754632451ebba9812a9305e7bca17b67a17186a5cff93d2e9ae1b01e3d27b9f9e9d9b988f6102f29e9c9986996102808461301a565b5191815191012090612fb1565b5189611fba565b510151945190611fba565b510151905191612b3f565b9184519260406102bb8a5185611fba565b51015251906040516102e9816102db898201948a86526040830190612ace565b03601f198101835282611863565b51902091613073565b519251604051908152a280f35b60405162461bcd60e51b81529081018b9052601d60248201527f746172676574417373657420213d2067756172616e74656541737365740000006044820152606490fd5b60405162461bcd60e51b81528085018f9052601a60248201527f6e6f7420612067756172616e74656520616c6c6f636174696f6e0000000000006044820152606490fd5b8a80fd5b8780fd5b604182634e487b7160e01b6000525260246000fd5b8580fd5b8380fd5b5080fd5b82346103cc576103c86103c236611ed5565b91612245565b5080f35b80fd5b50346103ac5760203660031901126103ac576020916040913581528083522054604051908152f35b50346103ac576060806003193601126106ce57813591602435906001600160401b0382116106ca5761042b91369101611b0b565b92604435926104398161301a565b61044c81610446876132af565b86612fb1565b60019480519361045b85611884565b946104696040519687611863565b808652610478601f1991611884565b019060005b82811061069a575050506104918151611f30565b9261049c8251611f30565b966000915b8351831015610596576104b48385611fba565b5160408101519093908a6001600160a01b036104d08489611fba565b51511691826000526105216020916001835260406000208b60005283528b6104fe8760406000205492611fba565b52610509868d611fba565b51906040519161051883611848565b60008352612844565b919992999490941561058d575b98839291610541886105869a9b9c611fba565b52604061054e888d611fba565b51015201519060405193610561856117e4565b84528301526040820152610575828a611fba565b526105808189611fba565b50611f62565b91906104a1565b6000985061052e565b9150959491929460005b84518110156106375761063290877fb3917fd12b23b8d48703d554ab284c5b1912bb5c67e710c7534a56c13063767960408c6105f1856001600160a01b036105e8828e611fba565b51511692611fba565b5190600052602090600182528260002085600052825261061683600020918254611fce565b9055610622858c611fba565b51825191868352820152a2611f62565b6105a0565b5085849188600014610683575090506000526000602052600060408120555b60005b82518110156103c8578061067961067361067e9386611fba565b51612e3e565b611f62565b610659565b61068f610695936132af565b91613073565b610656565b6020906040999699516106ac816117e4565b60008152828481830152846040830152828a0101520197949761047d565b8480fd5b8280fd5b82346103cc576107457f07da0a0674fb921e484018c8b81d80e292745e5d8ed134b580c8b9c631c5e9e0602061070736611ed5565b61071483969296516123f2565b61071d83613189565b9565ffffffffffff604083510151169361073688612753565b61074085896126ef565b61247a565b61076d604051610754816117b3565b828152868482015286604082015286606082015261356a565b8486528583526040862055604051908152a280f35b50346103ac5760603660031901126103ac576001600160401b0381358181116103a8576107b29036908401611a3c565b926024359182116103cc576107ed6107d9856107d036868801611a3c565b60443591612b3f565b604051918291602083526020830190611e57565b0390f35b82346103cc57806003193601126103cc576020604051468152f35b5090346103cc5760203660031901126103cc57606061082b83356135db565b6040805165ffffffffffff94851681529390921660208401526001600160a01b031690820152f35b5090346103cc57600319916060368401126103ac5780356001600160401b03938482116103a857818301928236039060a0838301126103a457602480359088821161038b573660238301121561038b578183013595898711610a635736828860051b85010111610a6357604435928a8411610a5f576040878536030112610a5f576064820180359860018060a01b0392838b16809b03610a5b576109319161090d610913926109038f36906118f1565b9289369201611d24565b9061254e565b9561092b610921368e6118f1565b9136908a01611be4565b906125ec565b96893b15610a57576040516321c580b960e11b81526060888201529a3560648c0152838501359060221901811215610a57578301958487019601359b808d11610a57578c60051b36038713610a575760a060848c01528c6101048c01526101248b01968d8d905b8110610a36575050888c986109fe8d998b998b998f996109ea6084828e9c6109de8e9d8e60a4610a0d9f6109d5604465ffffffffffff9b016118ca565b169101526118b6565b1660c48d0152016118de565b1660e48901528588840301908801526120bd565b9184830301604485015261209d565b03915afa8015610a2b57610a1f575080f35b610a28906117ff565b80f35b6040513d84823e3d90fd5b909760019085610a458b6118b6565b1681526020809101990191018e610998565b8b80fd5b8c80fd5b8980fd5b8880fd5b5090346103cc5760a03660031901126103cc576001600160401b039160446024803583358335878111610c9557610aa190369087016119e7565b956064978835906084359081116106ce57610abf9036908901611db1565b93825b60018101808211610c83578651811015610b3a57610aeb610ae38389611fba565b519188611fba565b511115610b0057610afb90611f62565b610ac2565b60405162461bcd60e51b81526020818b015260168189015275125b991a58d95cc81b5d5cdd081899481cdbdc9d195960521b818a01528b90fd5b50508881869495610b4a8261301a565b82519260209485948583012090610b619188612fb1565b610b6a9061330e565b6001600160a01b039690929087610b818486611fba565b51511696878a526001865260408a20838b52865260408a205491610ba58587611fba565b516040015190610bb59184612844565b9150998c526001885260408c20858d52885260408c2090815490610bd891611fce565b9055610be48587611fba565b5160400152604051868101908782528060408101610c029089612ace565b03601f1981018252610c149082611863565b519020610c219184613073565b604051908382528582015260407fb3917fd12b23b8d48703d554ab284c5b1912bb5c67e710c7534a56c13063767991a2610c5a91611fba565b51938451169301519060405193610c70856117e4565b84528301526040820152610a2890612e3e565b634e487b7160e01b855260118a528785fd5b8680fd5b5060803660031901126103ac57610cae61189b565b90602480359060449182356064958635908360a01c156110315760018060a01b0316918289526020936001855260408a20818b52855260408a205491808310610ff057610cfb84826125df565b831015610faf5782610d1085610d15936125df565b611fce565b938015928315610e2b57843403610dea5760608695949392610d598e987f2dcdaad87b561ba5a69835009b4c53ef9d3c41ca6cc9574049187659d6c6a715946125df565b81895260018a5260408920858a528a528060408a2055604051918252878a8301526040820152a2610d88578280f35b82610d9581938293611fce565b335af1610da06127a8565b5015610dad578581808280f35b60405162461bcd60e51b815293840152601d908301527f436f756c64206e6f7420726566756e64206578636573732066756e647300000090820152fd5b60405162461bcd60e51b8152808b01889052601f818a01527f496e636f7272656374206d73672e76616c756520666f72206465706f73697400818b01528b90fd5b6040518781016323b872dd60e01b8152338a830152308b830152878d8301528c8252610e568261182d565b60405191610e6383611812565b8983527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648a840152843b15610f6e57918e80610eb593819b9a9998979695519082885af1610eaf6127a8565b90613606565b88815180610eef575b5050507f2dcdaad87b561ba5a69835009b4c53ef9d3c41ca6cc9574049187659d6c6a71591610d59876060936125df565b610f06939495969798995081908301019101612f99565b15610f1a57908b9594939291388881610ebe565b60405162461bcd60e51b8152808b01889052602a818a01527f5361666545524332303a204552433230206f7065726174696f6e20646964206e818b0152691bdd081cdd58d8d9595960b21b818d0152608490fd5b60405162461bcd60e51b8152808e018b9052601d818d01527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000818e01528e90fd5b60405162461bcd60e51b8152808a01879052601b818901527f686f6c64696e677320616c72656164792073756666696369656e740000000000818a01528a90fd5b60405162461bcd60e51b8152808a018790526017818901527f686f6c64696e6773203c20657870656374656448656c64000000000000000000818a01528a90fd5b60405162461bcd60e51b8152602081890152601f818701527f4465706f73697420746f2065787465726e616c2064657374696e6174696f6e00818801528890fd5b50346103ac57906110909161108636611ed5565b9491908591612245565b9251519261109d8161301a565b6110a6846132af565b906110b0816135db565b9491505060405193602094858101948786526040820152604081526110d4816117e4565b519093206001600160a01b03939084169084160361134c57506001928551926110fc84611884565b9361110a6040519586611863565b808552611119601f1991611884565b0182875b828110611323575050506111318751611f30565b9061113c8851611f30565b90875b895181101561121057611152818b611fba565b518a6040820151918b6111ae866111698786611fba565b5151169485835260018b52604083208c84528b52604083205461118c888c611fba565b52611197878b611fba565b5190604051916111a683611848565b848352612844565b91959293909515611208575b509160406111dc8880989796948e966111d66112039c8f611fba565b52611fba565b5101520151604051926111ee846117e4565b8352888301526040820152610575828a611fba565b61113f565b9d508e6111ba565b5088889293949796835b82518110156112955780846112326112909386611fba565b51511661123f8289611fba565b5190875260018c52604087208a88528c5261125f60408820918254611fce565b9055887fb3917fd12b23b8d48703d554ab284c5b1912bb5c67e710c7534a56c13063767960408d610622858d611fba565b61121a565b508387818b858c156112cf575090918252528060408120555b805b82518110156103c857806106796106736112ca9386611fba565b6112b0565b6112db611315916132af565b6112e4856135db565b509190604051926112f4846117b3565b65ffffffffffff80921684521684830152846040830152606082015261356a565b9282525260408220556112ae565b60405161132f816117e4565b89815260608084830152604082015282828901015201839061111d565b60405162461bcd60e51b815290810184905260156024820152741a5b98dbdc9c9958dd08199a5b99d95c9c1c9a5b9d605a1b6044820152606490fd5b82346103cc5760403660031901126103cc576020906040906001600160a01b036113b061189b565b16815260018352818120602435825283522054604051908152f35b5090346103cc5760603660031901126103cc576001600160401b036024358181116106ce576113fd9036908501611a3c565b916044359182116103cc5761143e611453611426868661141f36888401611db1565b9135612844565b92939190604051958695608087526080870190611e57565b91151560208601528482036040860152611e57565b9060608301520390f35b5090346103cc5760c03660031901126103cc576001600160401b039180358381116106ce5761148f90369083016118f1565b906024358481116103a8576114a79036908301611d93565b936044359081116103a8576114bf9036908301611be4565b60603660631901126103a8576040516114d7816117e4565b60643560ff811681036103a4578152608435602082015260a435604082015261150084516123f2565b61150984613189565b9365ffffffffffff604084510151169361152286613537565b61152b81612112565b6117825765ffffffffffff61153f876135db565b505016851061173e575b61155484898461247a565b6115b0611562855184613238565b936115ab60208501519160405160208101908882526040808201526009606082015268666f7263654d6f766560b81b6080820152608081526115a38161182d565b5190206130c4565b612433565b156116fa5750608081019661160c6115d965ffffffffffff8a511665ffffffffffff4216612132565b92606086510151151565ffffffffffff60405195898752166020860152604085015260c0606085015260c084019061214c565b8281036080840152815180825260208201916020808360051b8301019401928a915b8383106116cd57505050505061169165ffffffffffff8798996116be987f11f9d0a22f085bac11f2dd6b9e2efa2dbe0f826da2fe74ac2be2410dbeefa559868061168488879a6116999a0360a08401528c6121d5565b0390a25116834216612132565b9351516132af565b92604051946116a7866117b3565b85521660208401526040830152606082015261356a565b90825281602052604082205580f35b90919293946020806116eb600193601f1986820301875289516121d5565b9701930193019193929061162e565b60649060206040519162461bcd60e51b8352820152601f60248201527f4368616c6c656e676572206973206e6f742061207061727469636970616e74006044820152fd5b60649060206040519162461bcd60e51b8352820152601860248201527f7475726e4e756d5265636f7264206465637265617365642e00000000000000006044820152fd5b600161178d87613537565b61179681612112565b036117aa576117a585876126ef565b611549565b6117a586612753565b608081019081106001600160401b038211176117ce57604052565b634e487b7160e01b600052604160045260246000fd5b606081019081106001600160401b038211176117ce57604052565b6001600160401b0381116117ce57604052565b604081019081106001600160401b038211176117ce57604052565b60a081019081106001600160401b038211176117ce57604052565b602081019081106001600160401b038211176117ce57604052565b90601f801991011681019081106001600160401b038211176117ce57604052565b6001600160401b0381116117ce5760051b60200190565b600435906001600160a01b03821682036118b157565b600080fd5b35906001600160a01b03821682036118b157565b35906001600160401b03821682036118b157565b359065ffffffffffff821682036118b157565b91909160a0818403126118b1576040519060a08201936001600160401b0394838110868211176117ce57604052829482358452602090818401359081116118b15783019180601f840112156118b157823561194b81611884565b936119596040519586611863565b818552838086019260051b8201019283116118b1578301905b8282106119b5575050506080926119b0928492860152611994604082016118ca565b60408601526119a5606082016118b6565b6060860152016118de565b910152565b8380916119c1846118b6565b815201910190611972565b6001600160401b0381116117ce57601f01601f191660200190565b81601f820112156118b1578035906119fe826119cc565b92611a0c6040519485611863565b828452602083830101116118b157816000926020809301838601378301015290565b359060ff821682036118b157565b9080601f830112156118b1578135611a5381611884565b92604091611a6383519586611863565b808552602093848087019260051b840101938185116118b157858401925b858410611a92575050505050505090565b6001600160401b0384358181116118b157860191608080601f1985880301126118b157845190611ac1826117b3565b8a8501358252858501358b830152606090611add828701611a2e565b878401528501359384116118b157611afc878c809796819701016119e7565b90820152815201930192611a81565b9080601f830112156118b1578135611b2281611884565b92604091611b3283519586611863565b808552602093848087019260051b840101938185116118b157858401925b858410611b61575050505050505090565b6001600160401b0384358181116118b157860191606080601f1985880301126118b157845190611b90826117e4565b611b9b8b86016118b6565b8252858501358481116118b157878c611bb6928801016119e7565b8b8301528401359283116118b157611bd5868b80969581960101611a3c565b85820152815201930192611b50565b919060409283818303126118b1578351848101916001600160401b0395828410878511176117ce57838152829682358181116118b1578301926080848803126118b157611c30866117b3565b83358281116118b15787611c45918601611b0b565b8652602095868501358381116118b15788611c619187016119e7565b606095869182890152611c758682016118de565b6080890152013580151581036118b15760a08701528552858101359182116118b157019085601f830112156118b157813590611cb082611884565b96611cbd82519889611863565b8288528685818a019402850101938185116118b1578701925b848410611ce7575050505050500152565b85848303126118b1578786918451611cfe816117e4565b611d0787611a2e565b815282870135838201528587013586820152815201930192611cd6565b92919092611d3184611884565b91611d3f6040519384611863565b829480845260208094019060051b8301928284116118b15780915b848310611d6957505050505050565b82356001600160401b0381116118b1578691611d888684938601611be4565b815201920191611d5a565b9080601f830112156118b157816020611dae93359101611d24565b90565b81601f820112156118b157803591611dc883611884565b92611dd66040519485611863565b808452602092838086019260051b8201019283116118b1578301905b828210611e00575050505090565b81358152908301908301611df2565b60005b838110611e225750506000910152565b8181015183820152602001611e12565b90602091611e4b81518092818552858086019101611e0f565b601f01601f1916010190565b90815180825260208092019182818360051b85019501936000915b848310611e825750505050505090565b9091929394958480611ec583856001950387528a51805182528381015184830152604060ff81830151169083015260608091015191608080928201520190611e32565b9801930193019194939290611e72565b60606003198201126118b1576001600160401b03916004358381116118b15782611f01916004016118f1565b926024358181116118b15783611f1991600401611d93565b926044359182116118b157611dae91600401611be4565b90611f3a82611884565b611f476040519182611863565b8281528092611f58601f1991611884565b0190602036910137565b6000198114611f715760010190565b634e487b7160e01b600052601160045260246000fd5b805115611f945760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015611f945760400190565b8051821015611f945760209160051b010190565b91908203918211611f7157565b9060808101825160808352805180925260a0830160a08360051b850101926020809301916000905b82821061204457505050506120276060928284938701519086830390870152611e32565b9365ffffffffffff60408201511660408501520151151591015290565b90919294848061208f600193609f198b82030186528951858060a01b03815116825261207c8482015160608087860152840190611e32565b9160408092015191818403910152611e57565b970192019201909291612003565b906020806120b48451604085526040850190611fdb565b93015191015290565b90815180825260208092019182818360051b82019501936000915b8483106120e85750505050505090565b909192939495848061210283856001950387528a5161209d565b98019301930191949392906120d8565b6003111561211c57565b634e487b7160e01b600052602160045260246000fd5b91909165ffffffffffff80809416911601918211611f7157565b9060a0810191805182526020808201519360a08285015284518091528160c0850195019160005b8281106121b8575050506040808301516001600160401b031690840152506060808201516001600160a01b03169083015260809081015165ffffffffffff1691015290565b83516001600160a01b031687529581019592810192600101612173565b8051906121ea60409283855283850190611fdb565b9060208091015193818184039101528080855193848152019401926000905b83821061221857505050505090565b8451805160ff16875280840151878501528101518682015260609095019493820193600190910190612209565b90929161225282516123f2565b61225b82613189565b9361226585612753565b516123ad5760608151015115612372576020918261228383836125ec565b01519083826000935b61234a575060ff910151519116036123175783917f4f465027a3d06ea73dd12be0f5c5fc0a34e21f19d6eaed4834a7a944edabc901916123006122d965ffffffffffff42169251516132af565b604051906122e6826117b3565b60008252838583015260006040830152606082015261356a565b8460005260008352604060002055604051908152a2565b60405162461bcd60e51b815260048101839052600b60248201526a21756e616e696e6d6f757360a81b6044820152606490fd5b60001981019150808211611f7157169160ff809116908114611f71576001019184908061228c565b60405162461bcd60e51b815260206004820152601360248201527214dd185d19481b5d5cdd08189948199a5b985b606a1b6044820152606490fd5b60405162461bcd60e51b815260206004820152601b60248201527f4d757374207375626d69742065786163746c79203120737461746500000000006044820152606490fd5b46036123fa57565b60405162461bcd60e51b8152602060048201526011602482015270125b98dbdc9c9958dd0818da185a5b9259607a1b6044820152606490fd5b60005b8251811015612472576001600160a01b03806124528386611fba565b51169083161461246a5761246590611f62565b612436565b505050600190565b505050600090565b60608101516001600160a01b0316929161249f90612498908361254e565b92826125ec565b92803b156118b1576124d96109fe926124ec600095604051978896879586956321c580b960e11b875260606004880152606487019061214c565b60031993848783030160248801526120bd565b03915afa8015612508576124fd5750565b612506906117ff565b565b6040513d6000823e3d90fd5b6040519061252182611812565b6000602083604051612532816117b3565b6060815260608382015283604082015283606082015281520152565b81519161255a83611884565b926125686040519485611863565b808452612577601f1991611884565b0160005b8181106125c857505060005b81518110156125c257806125a86125a16125bd9385611fba565b51856125ec565b6125b28287611fba565b526105808186611fba565b612587565b50505090565b6020906125d3612514565b8282880101520161257b565b91908201809211611f7157565b916125f5612514565b508151916040519261260684611812565b83526020908184019260009283855283955b8184018051518810156126e357612648906126418961263a889598518d613238565b9251611fba565b51906130c4565b6001600160a01b0390811694909390865b848b015180518210156126d157612671828892611fba565b511687146126875761268290611f62565b612659565b80929993949a965060ff919550116126bd57906126ab60016126b2931b88516125df565b8752611f62565b959196909296612618565b634e487b7160e01b86526011600452602486fd5b50509350966126b29192989450611f62565b50955050945050505090565b6126f8906135db565b505065ffffffffffff8091169116111561270e57565b60405162461bcd60e51b815260206004820152601c60248201527f7475726e4e756d5265636f7264206e6f7420696e637265617365642e000000006044820152606490fd5b61275e600291613537565b61276781612112565b1461276e57565b60405162461bcd60e51b815260206004820152601260248201527121b430b73732b6103334b730b634bd32b21760711b6044820152606490fd5b3d156127d3573d906127b9826119cc565b916127c76040519384611863565b82523d6000602084013e565b606090565b906127e282611884565b6040906127f182519182611863565b8381528093612802601f1991611884565b0191600091825b848110612817575050505050565b6020908351612825816117b3565b8581528286818301528686830152606080830152828501015201612809565b9192908351801515600014612ac35761285c906127d8565b9160009161286a81516127d8565b95600190818097938960009586935b612887575b50505050505050565b909192939495978351851015612aba576128a18585611fba565b51516128ad8685611fba565b515260409060ff80836128c08989611fba565b51015116836128cf8988611fba565b5101526060806128df8989611fba565b510151816128ed8a89611fba565b510152602093846128fe8a8a611fba565b51015186811115612ab4575085965b8d8b51908b8215928315612a8a575b505050600014612a595750600283828f612936908c611fba565b5101511614612a16578f96959493868f918f6129d3906129d9946129e5988f988f908f916129df9a898f946129ae8f86928861298983612983888461297b848e611fba565b510151611fce565b93611fba565b5101526129968187611fba565b515198856129a48389611fba565b5101511695611fba565b510151948251966129be886117b3565b87528601528401528201526111d68383611fba565b506125df565b9c611f62565b95611fba565b510151612a0d575b612a00916129fa91611fce565b93611f62565b91909493928a9085612879565b60009a506129ed565b5162461bcd60e51b815260048101859052601b60248201527f63616e6e6f74207472616e7366657220612067756172616e74656500000000006044820152606490fd5b90506129e5925088915084612a7483959e989796958a611fba565b51015184612a828484611fba565b510152611fba565b821092509082612a9f575b50508e8b3861291c565b612aab9192508d611fba565b51148a8f612a95565b9661290d565b9782915061287e565b5061285c81516127d8565b90815180825260208092019182818360051b82019501936000915b848310612af95750505050505090565b9091929394958480612b2f83856001950387528a51858060a01b03815116825261207c8482015160608087860152840190611e32565b9801930193019194939290612ae9565b80516000198101908111611f7157612b56906127d8565b91612b618483611fba565b51606081015192604094855191612b7783611812565b600095868452866020809501528781805181010312610c955787805191612b9d83611812565b85810151835201519084810191825287998890899c8a988b5b87518d1015612d1f578f848e14612d10578c8f8f90612c23858f8f908f612bdd8782611fba565b51519582612beb8984611fba565b5101516060612c018a60ff856129a48389611fba565b51015193825198612c118a6117b3565b89528801528601526060850152611fba565b52612c2e848d611fba565b5087159081612cfa575b50612cc0575b501580612cab575b612c5d575b6129d9612c5791611f62565b9b612bb6565b9e5098612ca0908f612c8b8b612c818f612c778391611faa565b510151938d611fba565b51019182516125df565b905289612c978d611faa565b510151906125df565b60019e909990612c4b565b50612cb68d89611fba565b5151875114612c46565b829c919650612c97818c612ce98f612c81612cf09882612ce08199611f87565b51015194611fba565b9052611f87565b996001948c612c3e565b612d0591508b611fba565b51518851148f612c38565b509b9d50612c5760019e611f62565b509899509c969a99505093999250505015612e025715612dc85715612d8d5783015103612d4b57505090565b60649250519062461bcd60e51b825280600483015260248201527f746f74616c5265636c61696d6564213d67756172616e7465652e616d6f756e746044820152fd5b825162461bcd60e51b815260048101859052601460248201527318dbdd5b19081b9bdd08199a5b99081c9a59da1d60621b6044820152606490fd5b835162461bcd60e51b815260048101869052601360248201527218dbdd5b19081b9bdd08199a5b99081b19599d606a1b6044820152606490fd5b845162461bcd60e51b815260048101879052601560248201527418dbdd5b19081b9bdd08199a5b99081d185c99d95d605a1b6044820152606490fd5b80516001600160a01b03908116919060005b604080840190815191825184101561287e5784612e6e858095611fba565b515191612e7f602095869251611fba565b510151918060a01c15600014612f6e571687612ef857600080809381935af1612ea66127a8565b5015612ebc575050612eb790611f62565b612e50565b60649250519062461bcd60e51b825260048201526016602482015275086deead8c840dcdee840e8e4c2dce6cccae4408aa8960531b6044820152fd5b919081519263a9059cbb60e01b845260048401526024830152828260448160008b5af1908115612f64575090612eb7939291612f36575b5050611f62565b81612f5592903d10612f5d575b612f4d8183611863565b810190612f99565b503880612f2f565b503d612f43565b513d6000823e3d90fd5b60008981526001865284812091815294525091208054612eb79392612f92916125df565b9055611f62565b908160209103126118b1575180151581036118b15790565b91612fbb906135db565b936001600160a01b0393849350612fd39250906135ae565b16911603612fdd57565b60405162461bcd60e51b81526020600482015260156024820152741a5b98dbdc9c9958dd08199a5b99d95c9c1c9a5b9d605a1b6044820152606490fd5b613025600291613537565b61302e81612112565b0361303557565b60405162461bcd60e51b815260206004820152601660248201527521b430b73732b6103737ba103334b730b634bd32b21760511b6044820152606490fd5b91906130b391613082846135db565b50929060405193613092856117b3565b65ffffffffffff80921685521660208401526040830152606082015261356a565b906000526000602052604060002055565b90600060806020926040948551858101917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008352603c820152603c815261310a816117e4565b5190209060ff8151169086868201519101519187519384528684015286830152606082015282805260015afa15612f6457600051906001600160a01b03821615613152575090565b5162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606490fd5b805160209182810151916001600160401b036040830151169260018060a01b039265ffffffffffff60808560608401511692015116906040519586948886019860c08701918a5260a0604088015285518092528060e088019601976000905b83821061321b57505050506060850152608084015260a083015203601f1981018352613215915082611863565b51902090565b895181168852988201988a985096820196600191909101906131e8565b61321561324761328592613189565b926020810151815191606065ffffffffffff604083015116910151151561329860405196879460208601998a5260a0604087015260c0860190611e32565b601f199586868303016060870152612ace565b91608084015260a083015203908101835282611863565b604051613215816102db6020820194602086526040830190612ace565b81601f820112156118b15780516132e2816119cc565b926132f06040519485611863565b818452602082840101116118b157611dae9160208085019101611e0f565b805181016020828203126118b15760208201516001600160401b0381116118b15760208201603f8285010112156118b157602081840101519061335082611884565b9361335e6040519586611863565b82855260208501916020850160408560051b8385010101116118b157604081830101925b60408560051b8385010101841061339c5750505050505090565b83516001600160401b0381116118b157838301016060818803601f1901126118b157604051906133cb826117e4565b60408101516001600160a01b03811681036118b157825260608101516001600160401b0381116118b15761340890604060208b01918401016132cc565b602083015260808101516001600160401b0381116118b15760208901605f8284010112156118b157604081830101519061344182611884565b9261344f6040519485611863565b828452602084019060208c0160608560051b8584010101116118b157606083820101915b60608560051b8584010101831061349c5750505050506040820152815260209384019301613382565b82516001600160401b0381116118b157608083860182018f03603f1901126118b157604051916134cb836117b3565b8386018201606081015184526080810151602085015260a0015160ff811681036118b157604084015260c082878601010151926001600160401b0384116118b1578f6020949360608695866135279401928b8a010101016132cc565b6060820152815201920191613473565b61354765ffffffffffff916135db565b50905016801560001461355a5750600090565b421061356557600290565b600190565b65ffffffffffff60d01b815160d01b1665ffffffffffff60a01b602083015160a01b1617906135a96040820151606060018060a01b03930151906135ae565b161790565b60405191602083019182526040830152604082526135cb826117e4565b905190206001600160a01b031690565b60005260006020526040600020548060d01c9165ffffffffffff8260a01c169160018060a01b031690565b90919015613612575090565b8151156136225750805190602001fd5b60405162461bcd60e51b815260206004820152908190613646906024830190611e32565b0390fdfea2646970667358221220bc2ee2146bc3932f0e209156facd9f1fe82ef51f619e5af6a7f8378e8611f95b64736f6c63430008110033", } // NitroAdjudicatorABI is the input ABI used to generate the binding from. diff --git a/nitro-protocol/.env b/nitro-protocol/.env index 0fb5726c2..7f0e565d1 100644 --- a/nitro-protocol/.env +++ b/nitro-protocol/.env @@ -12,4 +12,5 @@ SINGLE_ASSET_PAYMENT_ADDRESS= 0x0000000000000000000000000000000000000000 TRIVIAL_APP_ADDRESS= 0x0000000000000000000000000000000000000000 TEST_FORCE_MOVE_ADDRESS= 0x0000000000000000000000000000000000000000 TEST_NITRO_ADJUDICATOR_ADDRESS= 0x0000000000000000000000000000000000000000 -TEST_TOKEN_ADDRESS= 0x0000000000000000000000000000000000000000 \ No newline at end of file +TEST_TOKEN_ADDRESS= 0x0000000000000000000000000000000000000000 +BAD_TOKEN_ADDRESS= 0x0000000000000000000000000000000000000000 \ No newline at end of file diff --git a/nitro-protocol/.solhintignore b/nitro-protocol/.solhintignore index 3c3629e64..e98972fec 100644 --- a/nitro-protocol/.solhintignore +++ b/nitro-protocol/.solhintignore @@ -1 +1,2 @@ node_modules +./contracts/test/BadToken.sol \ No newline at end of file diff --git a/nitro-protocol/contracts/MultiAssetHolder.sol b/nitro-protocol/contracts/MultiAssetHolder.sol index a8c666260..bde26d8d3 100644 --- a/nitro-protocol/contracts/MultiAssetHolder.sol +++ b/nitro-protocol/contracts/MultiAssetHolder.sol @@ -4,12 +4,15 @@ pragma experimental ABIEncoderV2; import {ExitFormat as Outcome} from '@statechannels/exit-format/contracts/ExitFormat.sol'; import './ForceMove.sol'; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; +import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import './interfaces/IMultiAssetHolder.sol'; /** @dev An implementation of the IMultiAssetHolder interface. The AssetHolder contract escrows ETH or tokens against state channels. It allows assets to be internally accounted for, and ultimately prepared for transfer from one channel to other channels and/or external destinations, as well as for guarantees to be reclaimed. */ contract MultiAssetHolder is IMultiAssetHolder, StatusManager { + using SafeERC20 for IERC20; + // ******* // Storage // ******* @@ -56,11 +59,7 @@ contract MultiAssetHolder is IMultiAssetHolder, StatusManager { if (asset == address(0)) { require(msg.value == amount, 'Incorrect msg.value for deposit'); } else { - // require successful deposit before updating holdings (protect against reentrancy) - require( - IERC20(asset).transferFrom(msg.sender, address(this), amountDeposited), - 'Could not deposit ERC20s' - ); + IERC20(asset).safeTransferFrom(msg.sender, address(this), amountDeposited); } uint256 nowHeld = held + amountDeposited; diff --git a/nitro-protocol/contracts/test/BadToken.sol b/nitro-protocol/contracts/test/BadToken.sol new file mode 100644 index 000000000..d39f17087 --- /dev/null +++ b/nitro-protocol/contracts/test/BadToken.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) + +pragma solidity 0.8.17; + +/** + * @dev Copy-pasted from Openzeppelin ERC20 contract, but with the inheritance from IERC20 interface removed and no return value for transferFrom. + */ +contract BadToken { + function transferFrom( + address from, + address to, + uint256 amount + ) public virtual { + address spender = msg.sender; + _spendAllowance(from, spender, amount); + _transfer(from, to, amount); + // return true; // purposefully ommitted because bad token + } + + constructor(address owner) { + _mint(owner, 10_000_000_000); + } + + // The rest of the file is as it is in the Openzeppelin ERC20 contract. + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + mapping(address => uint256) private _balances; + mapping(address => mapping(address => uint256)) private _allowances; + uint256 private _totalSupply; + string private _name; + string private _symbol; + + function balanceOf(address account) public view virtual returns (uint256) { + return _balances[account]; + } + + function transfer(address to, uint256 amount) public virtual returns (bool) { + address owner = msg.sender; + _transfer(owner, to, amount); + return true; + } + + function allowance(address owner, address spender) public view virtual returns (uint256) { + return _allowances[owner][spender]; + } + + function approve(address spender, uint256 amount) public virtual returns (bool) { + address owner = msg.sender; + _approve(owner, spender, amount); + return true; + } + + function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { + address owner = msg.sender; + _approve(owner, spender, allowance(owner, spender) + addedValue); + return true; + } + + function _transfer( + address from, + address to, + uint256 amount + ) internal virtual { + require(from != address(0), 'ERC20: transfer from the zero address'); + require(to != address(0), 'ERC20: transfer to the zero address'); + _beforeTokenTransfer(from, to, amount); + uint256 fromBalance = _balances[from]; + require(fromBalance >= amount, 'ERC20: transfer amount exceeds balance'); + unchecked { + _balances[from] = fromBalance - amount; + } + _balances[to] += amount; + emit Transfer(from, to, amount); + _afterTokenTransfer(from, to, amount); + } + + function _mint(address account, uint256 amount) internal virtual { + require(account != address(0), 'ERC20: mint to the zero address'); + _beforeTokenTransfer(address(0), account, amount); + _totalSupply += amount; + _balances[account] += amount; + emit Transfer(address(0), account, amount); + _afterTokenTransfer(address(0), account, amount); + } + + function _approve( + address owner, + address spender, + uint256 amount + ) internal virtual { + require(owner != address(0), 'ERC20: approve from the zero address'); + require(spender != address(0), 'ERC20: approve to the zero address'); + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + function _spendAllowance( + address owner, + address spender, + uint256 amount + ) internal virtual { + uint256 currentAllowance = allowance(owner, spender); + if (currentAllowance != type(uint256).max) { + require(currentAllowance >= amount, 'ERC20: insufficient allowance'); + unchecked { + _approve(owner, spender, currentAllowance - amount); + } + } + } + + function _beforeTokenTransfer( + address from, + address to, + uint256 amount + ) internal virtual {} + + function _afterTokenTransfer( + address from, + address to, + uint256 amount + ) internal virtual {} +} diff --git a/nitro-protocol/deployment/deploy-test-contracts.ts b/nitro-protocol/deployment/deploy-test-contracts.ts index 89f240b7e..2f3beedd4 100644 --- a/nitro-protocol/deployment/deploy-test-contracts.ts +++ b/nitro-protocol/deployment/deploy-test-contracts.ts @@ -13,6 +13,7 @@ import testStrictTurnTakingArtifact from '../artifacts/contracts/test/TESTStrict import testConsensusArtifact from '../artifacts/contracts/test/TESTConsensus.sol/TESTConsensus.json'; import testNitroAdjudicatorArtifact from '../artifacts/contracts/test/TESTNitroAdjudicator.sol/TESTNitroAdjudicator.json'; import tokenArtifact from '../artifacts/contracts/Token.sol/Token.json'; +import badTokenArtifact from '../artifacts/contracts/test/BadToken.sol/BadToken.json'; import trivialAppArtifact from '../artifacts/contracts/TrivialApp.sol/TrivialApp.json'; import consensusAppArtifact from '../artifacts/contracts/ConsensusApp.sol/ConsensusApp.json'; import virtualPaymentAppArtifact from '../artifacts/contracts/VirtualPaymentApp.sol/VirtualPaymentApp.json'; @@ -32,6 +33,7 @@ const [ testConsensusFactory, testNitroAdjudicatorFactory, tokenFactory, + badTokenFactory, trivialAppFactory, consensusAppFactory, virtualPaymentAppFactory, @@ -46,6 +48,7 @@ const [ testConsensusArtifact, testNitroAdjudicatorArtifact, tokenArtifact, + badTokenArtifact, trivialAppArtifact, consensusAppArtifact, virtualPaymentAppArtifact, @@ -72,6 +75,11 @@ export async function deploy(): Promise> { const TEST_TOKEN_ADDRESS = ( await tokenFactory.deploy(new Wallet(TEST_ACCOUNTS[0].privateKey).address) ).address; + + const BAD_TOKEN_ADDRESS = ( + await badTokenFactory.deploy(new Wallet(TEST_ACCOUNTS[0].privateKey).address) + ).address; + return { NITRO_ADJUDICATOR_ADDRESS, COUNTING_APP_ADDRESS, @@ -86,5 +94,6 @@ export async function deploy(): Promise> { TEST_CONSENSUS_ADDRESS, TEST_NITRO_ADJUDICATOR_ADDRESS, TEST_TOKEN_ADDRESS, + BAD_TOKEN_ADDRESS, }; } diff --git a/nitro-protocol/gas-benchmarks/gasResults.json b/nitro-protocol/gas-benchmarks/gasResults.json index 90938d1ee..9b90a80b9 100644 --- a/nitro-protocol/gas-benchmarks/gasResults.json +++ b/nitro-protocol/gas-benchmarks/gasResults.json @@ -1,56 +1,56 @@ { "deployInfrastructureContracts": { "satp": { - "NitroAdjudicator": 3316515 + "NitroAdjudicator": 3363358 } }, "directlyFundAChannelWithETHFirst": { - "satp": 47318 + "satp": 47279 }, "directlyFundAChannelWithETHSecond": { - "satp": 30230 + "satp": 30191 }, "directlyFundAChannelWithERC20First": { "satp": { "approve": 46218, - "deposit": 70026 + "deposit": 70595 } }, "directlyFundAChannelWithERC20Second": { "satp": { "approve": 46218, - "deposit": 52938 + "deposit": 53507 } }, "ETHexit": { "satp": 110949 }, "ERC20exit": { - "satp": 112231 + "satp": 112233 }, "ETHexitSad": { "satp": { - "challenge": 113232, + "challenge": 113241, "transferAllAssets": 80967, - "total": 194199 + "total": 194208 } }, "ETHexitSadLedgerFunded": { "satp": { - "challengeX": 113232, - "challengeL": 106643, + "challengeX": 113241, + "challengeL": 106652, "transferAllAssetsL": 61079, "transferAllAssetsX": 80967, - "total": 361921 + "total": 361939 } }, "ETHexitSadVirtualFunded": { "satp": { - "challengeL": 122187, - "challengeV": 172745, + "challengeL": 122196, + "challengeV": 172754, "reclaimL": 60323, "transferAllAssetsL": 112667, - "total": 467922 + "total": 467940 } } } \ No newline at end of file diff --git a/nitro-protocol/test/contracts/MultiAssetHolder/deposit.test.ts b/nitro-protocol/test/contracts/MultiAssetHolder/deposit.test.ts index 854590f7a..03d2665a2 100644 --- a/nitro-protocol/test/contracts/MultiAssetHolder/deposit.test.ts +++ b/nitro-protocol/test/contracts/MultiAssetHolder/deposit.test.ts @@ -4,6 +4,7 @@ import {it} from '@jest/globals'; const {AddressZero} = ethers.constants; import TokenArtifact from '../../../artifacts/contracts/Token.sol/Token.json'; +import BadTokenArtifact from '../../../artifacts/contracts/test/BadToken.sol/BadToken.json'; import {getChannelId} from '../../../src/contract/channel'; import { getCountingAppContractAddress, @@ -11,7 +12,7 @@ import { getTestProvider, setupContract, } from '../../test-helpers'; -import {Token, TESTNitroAdjudicator} from '../../../typechain-types'; +import {Token, BadToken, TESTNitroAdjudicator} from '../../../typechain-types'; // eslint-disable-next-line import/order import TESTNitroAdjudicatorArtifact from '../../../artifacts/contracts/test/TESTNitroAdjudicator.sol/TESTNitroAdjudicator.json'; import {MAGIC_ADDRESS_INDICATING_ETH} from '../../../src/transactions'; @@ -28,6 +29,12 @@ const token = setupContract( process.env.TEST_TOKEN_ADDRESS ) as unknown as Token & Contract; +const badToken = setupContract( + provider, + BadTokenArtifact, + process.env.BAD_TOKEN_ADDRESS +) as unknown as BadToken & Contract; + const signer0 = getTestProvider().getSigner(0); // Convention matches setupContract function let signer0Address: string; const chainId = process.env.CHAIN_NETWORK_ID; @@ -37,6 +44,7 @@ let appDefinition: string; const ETH = MAGIC_ADDRESS_INDICATING_ETH; const ERC20 = token.address; +const BadERC20 = badToken.address; // Populate destinations array for (let i = 0; i < 3; i++) { @@ -59,6 +67,7 @@ const description7 = 'Reverts deposit of ETH (msg.value = amount, expectedHeld + amount < holdings)'; const description8 = 'Deposits ETH (msg.value = amount, amount < holdings < amount + expectedHeld)'; +const description9 = 'Deposits a Bad token (expectedHeld = 0)'; describe('deposit', () => { let channelNonce = getRandomNonce('deposit'); @@ -66,16 +75,17 @@ describe('deposit', () => { channelNonce = BigNumber.from(channelNonce).add(1).toHexString(); }); it.each` - description | asset | held | expectedHeld | amount | heldAfter | reasonString - ${description0} | ${ERC20} | ${0} | ${0} | ${1} | ${1} | ${undefined} - ${description1} | ${ERC20} | ${1} | ${1} | ${1} | ${2} | ${undefined} - ${description2} | ${ERC20} | ${0} | ${1} | ${2} | ${0} | ${'holdings < expectedHeld'} - ${description3} | ${ERC20} | ${3} | ${1} | ${1} | ${3} | ${'holdings already sufficient'} - ${description4} | ${ERC20} | ${3} | ${2} | ${2} | ${4} | ${undefined} - ${description5} | ${ETH} | ${0} | ${0} | ${1} | ${1} | ${undefined} - ${description6} | ${ETH} | ${0} | ${1} | ${2} | ${0} | ${'holdings < expectedHeld'} - ${description7} | ${ETH} | ${3} | ${1} | ${1} | ${3} | ${'holdings already sufficient'} - ${description8} | ${ETH} | ${3} | ${2} | ${2} | ${4} | ${undefined} + description | asset | held | expectedHeld | amount | heldAfter | reasonString + ${description0} | ${ERC20} | ${0} | ${0} | ${1} | ${1} | ${undefined} + ${description1} | ${ERC20} | ${1} | ${1} | ${1} | ${2} | ${undefined} + ${description2} | ${ERC20} | ${0} | ${1} | ${2} | ${0} | ${'holdings < expectedHeld'} + ${description3} | ${ERC20} | ${3} | ${1} | ${1} | ${3} | ${'holdings already sufficient'} + ${description4} | ${ERC20} | ${3} | ${2} | ${2} | ${4} | ${undefined} + ${description5} | ${ETH} | ${0} | ${0} | ${1} | ${1} | ${undefined} + ${description6} | ${ETH} | ${0} | ${1} | ${2} | ${0} | ${'holdings < expectedHeld'} + ${description7} | ${ETH} | ${3} | ${1} | ${1} | ${3} | ${'holdings already sufficient'} + ${description8} | ${ETH} | ${3} | ${2} | ${2} | ${4} | ${undefined} + ${description9} | ${BadERC20} | ${0} | ${0} | ${1} | ${1} | ${undefined} `('$description', async ({asset, held, expectedHeld, amount, reasonString, heldAfter}) => { held = BigNumber.from(held); expectedHeld = BigNumber.from(expectedHeld); @@ -105,6 +115,23 @@ describe('deposit', () => { expect(allowance.sub(amount).sub(held).gte(0)).toBe(true); } + if (asset === BadERC20) { + // Check msg.sender has enough tokens + const balance = await badToken.balanceOf(signer0Address); + await expect(balance.gte(held.add(amount))).toBe(true); + + // Increase allowance + await ( + await badToken.increaseAllowance(testNitroAdjudicator.address, held.add(amount)) + ).wait(); // Approve enough for setup and main test + + // Check allowance updated + const allowance = BigNumber.from( + await badToken.allowance(signer0Address, testNitroAdjudicator.address) + ); + expect(allowance.sub(amount).sub(held).gte(0)).toBe(true); + } + if (held > 0) { // Set holdings by depositing in the 'safest' way const {events} = await ( @@ -119,7 +146,7 @@ describe('deposit', () => { } expect(await testNitroAdjudicator.holdings(asset, destination)).toEqual(held); - if (asset === ERC20) { + if (asset === ERC20 || asset == BadERC20) { const {data: amountTransferred} = getTransferEvent(events); expect(held.eq(amountTransferred)).toBe(true); } @@ -146,7 +173,7 @@ describe('deposit', () => { destinationHoldings: heldAfter, }); - if (asset == ERC20) { + if (asset == ERC20 || asset == BadERC20) { const amountTransferred = BigNumber.from(getTransferEvent(events).data); expect(heldAfter.sub(held).eq(amountTransferred)).toBe(true); const balanceAfter = await getBalance(asset, signer0Address); @@ -168,7 +195,13 @@ const getTransferEvent = (events: ethers.Event[]) => events.find(({topics}) => topics[0] === token.filters.Transfer(AddressZero).topics![0])!; async function getBalance(asset: string, address: string) { - return asset === ETH - ? BigNumber.from(await provider.getBalance(address)) - : BigNumber.from(await token.balanceOf(address)); + switch (asset) { + case ETH: + return BigNumber.from(await provider.getBalance(address)); + case ERC20: + return BigNumber.from(await token.balanceOf(address)); + case BadERC20: + return BigNumber.from(await badToken.balanceOf(address)); + } + throw Error('unrecognized asset'); } diff --git a/nitro-protocol/test/environment.d.ts b/nitro-protocol/test/environment.d.ts index ed12109e6..7487886a2 100644 --- a/nitro-protocol/test/environment.d.ts +++ b/nitro-protocol/test/environment.d.ts @@ -23,6 +23,7 @@ declare global { TEST_FORCE_MOVE_ADDRESS: string; TEST_NITRO_ADJUDICATOR_ADDRESS: string; TEST_TOKEN_ADDRESS: string; + BAD_TOKEN_ADDRESS: string; } } }