{
    "address": "0x928892Ad7E2fD6745A5b37732D647904Dc3D6D6a",
    "abi": [
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": false,
                    "internalType": "address",
                    "name": "assetId",
                    "type": "address"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "amount",
                    "type": "uint256"
                }
            ],
            "name": "AliceDeposited",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": false,
                    "internalType": "address",
                    "name": "defunder",
                    "type": "address"
                },
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "channelAddress",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "alice",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "bob",
                            "type": "address"
                        },
                        {
                            "internalType": "address[]",
                            "name": "assetIds",
                            "type": "address[]"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256[2]",
                                    "name": "amount",
                                    "type": "uint256[2]"
                                },
                                {
                                    "internalType": "address payable[2]",
                                    "name": "to",
                                    "type": "address[2]"
                                }
                            ],
                            "internalType": "struct Balance[]",
                            "name": "balances",
                            "type": "tuple[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "processedDepositsA",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "processedDepositsB",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "defundNonces",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256",
                            "name": "timeout",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "merkleRoot",
                            "type": "bytes32"
                        }
                    ],
                    "indexed": false,
                    "internalType": "struct ICMCAdjudicator.CoreChannelState",
                    "name": "state",
                    "type": "tuple"
                },
                {
                    "components": [
                        {
                            "internalType": "bytes32",
                            "name": "channelStateHash",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "merkleRoot",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "uint256",
                            "name": "consensusExpiry",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "defundExpiry",
                            "type": "uint256"
                        }
                    ],
                    "indexed": false,
                    "internalType": "struct ICMCAdjudicator.ChannelDispute",
                    "name": "dispute",
                    "type": "tuple"
                },
                {
                    "indexed": false,
                    "internalType": "address[]",
                    "name": "assetIds",
                    "type": "address[]"
                }
            ],
            "name": "ChannelDefunded",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": false,
                    "internalType": "address",
                    "name": "disputer",
                    "type": "address"
                },
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "channelAddress",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "alice",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "bob",
                            "type": "address"
                        },
                        {
                            "internalType": "address[]",
                            "name": "assetIds",
                            "type": "address[]"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256[2]",
                                    "name": "amount",
                                    "type": "uint256[2]"
                                },
                                {
                                    "internalType": "address payable[2]",
                                    "name": "to",
                                    "type": "address[2]"
                                }
                            ],
                            "internalType": "struct Balance[]",
                            "name": "balances",
                            "type": "tuple[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "processedDepositsA",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "processedDepositsB",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "defundNonces",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256",
                            "name": "timeout",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "merkleRoot",
                            "type": "bytes32"
                        }
                    ],
                    "indexed": false,
                    "internalType": "struct ICMCAdjudicator.CoreChannelState",
                    "name": "state",
                    "type": "tuple"
                },
                {
                    "components": [
                        {
                            "internalType": "bytes32",
                            "name": "channelStateHash",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "merkleRoot",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "uint256",
                            "name": "consensusExpiry",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "defundExpiry",
                            "type": "uint256"
                        }
                    ],
                    "indexed": false,
                    "internalType": "struct ICMCAdjudicator.ChannelDispute",
                    "name": "dispute",
                    "type": "tuple"
                }
            ],
            "name": "ChannelDisputed",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": false,
                    "internalType": "address",
                    "name": "defunder",
                    "type": "address"
                },
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "channelAddress",
                            "type": "address"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "transferId",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "address",
                            "name": "transferDefinition",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "initiator",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "responder",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "assetId",
                            "type": "address"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256[2]",
                                    "name": "amount",
                                    "type": "uint256[2]"
                                },
                                {
                                    "internalType": "address payable[2]",
                                    "name": "to",
                                    "type": "address[2]"
                                }
                            ],
                            "internalType": "struct Balance",
                            "name": "balance",
                            "type": "tuple"
                        },
                        {
                            "internalType": "uint256",
                            "name": "transferTimeout",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "initialStateHash",
                            "type": "bytes32"
                        }
                    ],
                    "indexed": false,
                    "internalType": "struct ICMCAdjudicator.CoreTransferState",
                    "name": "state",
                    "type": "tuple"
                },
                {
                    "components": [
                        {
                            "internalType": "bytes32",
                            "name": "transferStateHash",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "uint256",
                            "name": "transferDisputeExpiry",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bool",
                            "name": "isDefunded",
                            "type": "bool"
                        }
                    ],
                    "indexed": false,
                    "internalType": "struct ICMCAdjudicator.TransferDispute",
                    "name": "dispute",
                    "type": "tuple"
                },
                {
                    "indexed": false,
                    "internalType": "bytes",
                    "name": "encodedInitialState",
                    "type": "bytes"
                },
                {
                    "indexed": false,
                    "internalType": "bytes",
                    "name": "encodedResolver",
                    "type": "bytes"
                },
                {
                    "components": [
                        {
                            "internalType": "uint256[2]",
                            "name": "amount",
                            "type": "uint256[2]"
                        },
                        {
                            "internalType": "address payable[2]",
                            "name": "to",
                            "type": "address[2]"
                        }
                    ],
                    "indexed": false,
                    "internalType": "struct Balance",
                    "name": "balance",
                    "type": "tuple"
                }
            ],
            "name": "TransferDefunded",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": false,
                    "internalType": "address",
                    "name": "disputer",
                    "type": "address"
                },
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "channelAddress",
                            "type": "address"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "transferId",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "address",
                            "name": "transferDefinition",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "initiator",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "responder",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "assetId",
                            "type": "address"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256[2]",
                                    "name": "amount",
                                    "type": "uint256[2]"
                                },
                                {
                                    "internalType": "address payable[2]",
                                    "name": "to",
                                    "type": "address[2]"
                                }
                            ],
                            "internalType": "struct Balance",
                            "name": "balance",
                            "type": "tuple"
                        },
                        {
                            "internalType": "uint256",
                            "name": "transferTimeout",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "initialStateHash",
                            "type": "bytes32"
                        }
                    ],
                    "indexed": false,
                    "internalType": "struct ICMCAdjudicator.CoreTransferState",
                    "name": "state",
                    "type": "tuple"
                },
                {
                    "components": [
                        {
                            "internalType": "bytes32",
                            "name": "transferStateHash",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "uint256",
                            "name": "transferDisputeExpiry",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bool",
                            "name": "isDefunded",
                            "type": "bool"
                        }
                    ],
                    "indexed": false,
                    "internalType": "struct ICMCAdjudicator.TransferDispute",
                    "name": "dispute",
                    "type": "tuple"
                }
            ],
            "name": "TransferDisputed",
            "type": "event"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "channelAddress",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "alice",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "bob",
                            "type": "address"
                        },
                        {
                            "internalType": "address[]",
                            "name": "assetIds",
                            "type": "address[]"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256[2]",
                                    "name": "amount",
                                    "type": "uint256[2]"
                                },
                                {
                                    "internalType": "address payable[2]",
                                    "name": "to",
                                    "type": "address[2]"
                                }
                            ],
                            "internalType": "struct Balance[]",
                            "name": "balances",
                            "type": "tuple[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "processedDepositsA",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "processedDepositsB",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "defundNonces",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256",
                            "name": "timeout",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "merkleRoot",
                            "type": "bytes32"
                        }
                    ],
                    "internalType": "struct ICMCAdjudicator.CoreChannelState",
                    "name": "ccs",
                    "type": "tuple"
                },
                {
                    "internalType": "address[]",
                    "name": "assetIds",
                    "type": "address[]"
                },
                {
                    "internalType": "uint256[]",
                    "name": "indices",
                    "type": "uint256[]"
                }
            ],
            "name": "defundChannel",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "channelAddress",
                            "type": "address"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "transferId",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "address",
                            "name": "transferDefinition",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "initiator",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "responder",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "assetId",
                            "type": "address"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256[2]",
                                    "name": "amount",
                                    "type": "uint256[2]"
                                },
                                {
                                    "internalType": "address payable[2]",
                                    "name": "to",
                                    "type": "address[2]"
                                }
                            ],
                            "internalType": "struct Balance",
                            "name": "balance",
                            "type": "tuple"
                        },
                        {
                            "internalType": "uint256",
                            "name": "transferTimeout",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "initialStateHash",
                            "type": "bytes32"
                        }
                    ],
                    "internalType": "struct ICMCAdjudicator.CoreTransferState",
                    "name": "cts",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes",
                    "name": "encodedInitialTransferState",
                    "type": "bytes"
                },
                {
                    "internalType": "bytes",
                    "name": "encodedTransferResolver",
                    "type": "bytes"
                },
                {
                    "internalType": "bytes",
                    "name": "responderSignature",
                    "type": "bytes"
                }
            ],
            "name": "defundTransfer",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "assetId",
                    "type": "address"
                },
                {
                    "internalType": "uint256",
                    "name": "amount",
                    "type": "uint256"
                }
            ],
            "name": "depositAlice",
            "outputs": [],
            "stateMutability": "payable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "channelAddress",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "alice",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "bob",
                            "type": "address"
                        },
                        {
                            "internalType": "address[]",
                            "name": "assetIds",
                            "type": "address[]"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256[2]",
                                    "name": "amount",
                                    "type": "uint256[2]"
                                },
                                {
                                    "internalType": "address payable[2]",
                                    "name": "to",
                                    "type": "address[2]"
                                }
                            ],
                            "internalType": "struct Balance[]",
                            "name": "balances",
                            "type": "tuple[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "processedDepositsA",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "processedDepositsB",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "defundNonces",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256",
                            "name": "timeout",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "merkleRoot",
                            "type": "bytes32"
                        }
                    ],
                    "internalType": "struct ICMCAdjudicator.CoreChannelState",
                    "name": "ccs",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes",
                    "name": "aliceSignature",
                    "type": "bytes"
                },
                {
                    "internalType": "bytes",
                    "name": "bobSignature",
                    "type": "bytes"
                }
            ],
            "name": "disputeChannel",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "channelAddress",
                            "type": "address"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "transferId",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "address",
                            "name": "transferDefinition",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "initiator",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "responder",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "assetId",
                            "type": "address"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256[2]",
                                    "name": "amount",
                                    "type": "uint256[2]"
                                },
                                {
                                    "internalType": "address payable[2]",
                                    "name": "to",
                                    "type": "address[2]"
                                }
                            ],
                            "internalType": "struct Balance",
                            "name": "balance",
                            "type": "tuple"
                        },
                        {
                            "internalType": "uint256",
                            "name": "transferTimeout",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "initialStateHash",
                            "type": "bytes32"
                        }
                    ],
                    "internalType": "struct ICMCAdjudicator.CoreTransferState",
                    "name": "cts",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes32[]",
                    "name": "merkleProofData",
                    "type": "bytes32[]"
                }
            ],
            "name": "disputeTransfer",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "assetId",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "owner",
                    "type": "address"
                },
                {
                    "internalType": "address payable",
                    "name": "recipient",
                    "type": "address"
                }
            ],
            "name": "exit",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "getAlice",
            "outputs": [
                {
                    "internalType": "address",
                    "name": "",
                    "type": "address"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "getBob",
            "outputs": [
                {
                    "internalType": "address",
                    "name": "",
                    "type": "address"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "getChannelDispute",
            "outputs": [
                {
                    "components": [
                        {
                            "internalType": "bytes32",
                            "name": "channelStateHash",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes32",
                            "name": "merkleRoot",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "uint256",
                            "name": "consensusExpiry",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "defundExpiry",
                            "type": "uint256"
                        }
                    ],
                    "internalType": "struct ICMCAdjudicator.ChannelDispute",
                    "name": "",
                    "type": "tuple"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "assetId",
                    "type": "address"
                }
            ],
            "name": "getDefundNonce",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "assetId",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "owner",
                    "type": "address"
                }
            ],
            "name": "getExitableAmount",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "assetId",
                    "type": "address"
                }
            ],
            "name": "getTotalDepositsAlice",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "assetId",
                    "type": "address"
                }
            ],
            "name": "getTotalDepositsBob",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "assetId",
                    "type": "address"
                }
            ],
            "name": "getTotalTransferred",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "bytes32",
                    "name": "transferId",
                    "type": "bytes32"
                }
            ],
            "name": "getTransferDispute",
            "outputs": [
                {
                    "components": [
                        {
                            "internalType": "bytes32",
                            "name": "transferStateHash",
                            "type": "bytes32"
                        },
                        {
                            "internalType": "uint256",
                            "name": "transferDisputeExpiry",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bool",
                            "name": "isDefunded",
                            "type": "bool"
                        }
                    ],
                    "internalType": "struct ICMCAdjudicator.TransferDispute",
                    "name": "",
                    "type": "tuple"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "channelAddress",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "assetId",
                            "type": "address"
                        },
                        {
                            "internalType": "address payable",
                            "name": "recipient",
                            "type": "address"
                        },
                        {
                            "internalType": "uint256",
                            "name": "amount",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "address",
                            "name": "callTo",
                            "type": "address"
                        },
                        {
                            "internalType": "bytes",
                            "name": "callData",
                            "type": "bytes"
                        }
                    ],
                    "internalType": "struct WithdrawData",
                    "name": "wd",
                    "type": "tuple"
                }
            ],
            "name": "getWithdrawalTransactionRecord",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "lock",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_alice",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_bob",
                    "type": "address"
                }
            ],
            "name": "setup",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "channelAddress",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "assetId",
                            "type": "address"
                        },
                        {
                            "internalType": "address payable",
                            "name": "recipient",
                            "type": "address"
                        },
                        {
                            "internalType": "uint256",
                            "name": "amount",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "address",
                            "name": "callTo",
                            "type": "address"
                        },
                        {
                            "internalType": "bytes",
                            "name": "callData",
                            "type": "bytes"
                        }
                    ],
                    "internalType": "struct WithdrawData",
                    "name": "wd",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes",
                    "name": "aliceSignature",
                    "type": "bytes"
                },
                {
                    "internalType": "bytes",
                    "name": "bobSignature",
                    "type": "bytes"
                }
            ],
            "name": "withdraw",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "stateMutability": "payable",
            "type": "receive"
        }
    ],
    "transactionHash": "0x96c815e725b4630c0f3b2a4704cee05672dd5462fe6bebdb51dbd8215c2ff470",
    "receipt": {
        "to": null,
        "from": "0x627306090abaB3A6e1400e9345bC60c78a8BEf57",
        "contractAddress": "0x928892Ad7E2fD6745A5b37732D647904Dc3D6D6a",
        "transactionIndex": 1,
        "gasUsed": "3585396",
        "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
        "blockHash": "0x6fd9f3839a4872b85915ba75698e7b4421e3d349a39f0a4b0cfd679a196dbfc6",
        "transactionHash": "0x96c815e725b4630c0f3b2a4704cee05672dd5462fe6bebdb51dbd8215c2ff470",
        "logs": [],
        "blockNumber": 2827235,
        "cumulativeGasUsed": "3618041",
        "status": 1,
        "byzantium": true
    },
    "args": [],
    "solcInputHash": "89c55d5a88f10637860a9ea31a1daad3",
    "metadata": "{\"compiler\":{\"version\":\"0.7.1+commit.f4a555be\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AliceDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"defunder\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"channelAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"alice\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"bob\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"assetIds\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"amount\",\"type\":\"uint256[2]\"},{\"internalType\":\"address payable[2]\",\"name\":\"to\",\"type\":\"address[2]\"}],\"internalType\":\"struct Balance[]\",\"name\":\"balances\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[]\",\"name\":\"processedDepositsA\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"processedDepositsB\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"defundNonces\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"struct ICMCAdjudicator.CoreChannelState\",\"name\":\"state\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"channelStateHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"consensusExpiry\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"defundExpiry\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"struct ICMCAdjudicator.ChannelDispute\",\"name\":\"dispute\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"assetIds\",\"type\":\"address[]\"}],\"name\":\"ChannelDefunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"disputer\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"channelAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"alice\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"bob\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"assetIds\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"amount\",\"type\":\"uint256[2]\"},{\"internalType\":\"address payable[2]\",\"name\":\"to\",\"type\":\"address[2]\"}],\"internalType\":\"struct Balance[]\",\"name\":\"balances\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[]\",\"name\":\"processedDepositsA\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"processedDepositsB\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"defundNonces\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"struct ICMCAdjudicator.CoreChannelState\",\"name\":\"state\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"channelStateHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"consensusExpiry\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"defundExpiry\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"struct ICMCAdjudicator.ChannelDispute\",\"name\":\"dispute\",\"type\":\"tuple\"}],\"name\":\"ChannelDisputed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"defunder\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"channelAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"transferId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"transferDefinition\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"initiator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"responder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"amount\",\"type\":\"uint256[2]\"},{\"internalType\":\"address payable[2]\",\"name\":\"to\",\"type\":\"address[2]\"}],\"internalType\":\"struct Balance\",\"name\":\"balance\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"transferTimeout\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"initialStateHash\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"struct ICMCAdjudicator.CoreTransferState\",\"name\":\"state\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transferStateHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"transferDisputeExpiry\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isDefunded\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"struct ICMCAdjudicator.TransferDispute\",\"name\":\"dispute\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"encodedInitialState\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"encodedResolver\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"amount\",\"type\":\"uint256[2]\"},{\"internalType\":\"address payable[2]\",\"name\":\"to\",\"type\":\"address[2]\"}],\"indexed\":false,\"internalType\":\"struct Balance\",\"name\":\"balance\",\"type\":\"tuple\"}],\"name\":\"TransferDefunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"disputer\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"channelAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"transferId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"transferDefinition\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"initiator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"responder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"amount\",\"type\":\"uint256[2]\"},{\"internalType\":\"address payable[2]\",\"name\":\"to\",\"type\":\"address[2]\"}],\"internalType\":\"struct Balance\",\"name\":\"balance\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"transferTimeout\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"initialStateHash\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"struct ICMCAdjudicator.CoreTransferState\",\"name\":\"state\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transferStateHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"transferDisputeExpiry\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isDefunded\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"struct ICMCAdjudicator.TransferDispute\",\"name\":\"dispute\",\"type\":\"tuple\"}],\"name\":\"TransferDisputed\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"channelAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"alice\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"bob\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"assetIds\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"amount\",\"type\":\"uint256[2]\"},{\"internalType\":\"address payable[2]\",\"name\":\"to\",\"type\":\"address[2]\"}],\"internalType\":\"struct Balance[]\",\"name\":\"balances\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[]\",\"name\":\"processedDepositsA\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"processedDepositsB\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"defundNonces\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"struct ICMCAdjudicator.CoreChannelState\",\"name\":\"ccs\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"assetIds\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"indices\",\"type\":\"uint256[]\"}],\"name\":\"defundChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"channelAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"transferId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"transferDefinition\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"initiator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"responder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"amount\",\"type\":\"uint256[2]\"},{\"internalType\":\"address payable[2]\",\"name\":\"to\",\"type\":\"address[2]\"}],\"internalType\":\"struct Balance\",\"name\":\"balance\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"transferTimeout\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"initialStateHash\",\"type\":\"bytes32\"}],\"internalType\":\"struct ICMCAdjudicator.CoreTransferState\",\"name\":\"cts\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"encodedInitialTransferState\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"encodedTransferResolver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"responderSignature\",\"type\":\"bytes\"}],\"name\":\"defundTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"depositAlice\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"channelAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"alice\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"bob\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"assetIds\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"amount\",\"type\":\"uint256[2]\"},{\"internalType\":\"address payable[2]\",\"name\":\"to\",\"type\":\"address[2]\"}],\"internalType\":\"struct Balance[]\",\"name\":\"balances\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[]\",\"name\":\"processedDepositsA\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"processedDepositsB\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"defundNonces\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"struct ICMCAdjudicator.CoreChannelState\",\"name\":\"ccs\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"aliceSignature\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"bobSignature\",\"type\":\"bytes\"}],\"name\":\"disputeChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"channelAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"transferId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"transferDefinition\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"initiator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"responder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"amount\",\"type\":\"uint256[2]\"},{\"internalType\":\"address payable[2]\",\"name\":\"to\",\"type\":\"address[2]\"}],\"internalType\":\"struct Balance\",\"name\":\"balance\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"transferTimeout\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"initialStateHash\",\"type\":\"bytes32\"}],\"internalType\":\"struct ICMCAdjudicator.CoreTransferState\",\"name\":\"cts\",\"type\":\"tuple\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProofData\",\"type\":\"bytes32[]\"}],\"name\":\"disputeTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"exit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAlice\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBob\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChannelDispute\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"channelStateHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"consensusExpiry\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"defundExpiry\",\"type\":\"uint256\"}],\"internalType\":\"struct ICMCAdjudicator.ChannelDispute\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"}],\"name\":\"getDefundNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"getExitableAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"}],\"name\":\"getTotalDepositsAlice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"}],\"name\":\"getTotalDepositsBob\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"}],\"name\":\"getTotalTransferred\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transferId\",\"type\":\"bytes32\"}],\"name\":\"getTransferDispute\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transferStateHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"transferDisputeExpiry\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isDefunded\",\"type\":\"bool\"}],\"internalType\":\"struct ICMCAdjudicator.TransferDispute\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"channelAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"callTo\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct WithdrawData\",\"name\":\"wd\",\"type\":\"tuple\"}],\"name\":\"getWithdrawalTransactionRecord\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_alice\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_bob\",\"type\":\"address\"}],\"name\":\"setup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"channelAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"assetId\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"callTo\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct WithdrawData\",\"name\":\"wd\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"aliceSignature\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"bobSignature\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"author\":\"Connext <support@connext.network>\",\"kind\":\"dev\",\"methods\":{\"getAlice()\":{\"returns\":{\"_0\":\"Bob's signer address\"}},\"getBob()\":{\"returns\":{\"_0\":\"Alice's signer address\"}},\"setup(address,address)\":{\"params\":{\"_alice\":\": Address representing user with function deposit\",\"_bob\":\": Address representing user with multisig deposit\"}},\"withdraw((address,address,address,uint256,uint256,address,bytes),bytes,bytes)\":{\"params\":{\"aliceSignature\":\"Signature of owner a\",\"bobSignature\":\"Signature of owner b\",\"wd\":\"The withdraw data consisting of semantic withdraw information, i.e. assetId, recipient, and amount; information to make an optional call in addition to the actual transfer, i.e. target address for the call and call payload; additional information, i.e. channel address and nonce.\"}}},\"title\":\"ChannelMastercopy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAlice()\":{\"notice\":\"A getter function for the bob of the multisig\"},\"getBob()\":{\"notice\":\"A getter function for the bob of the multisig\"},\"setup(address,address)\":{\"notice\":\"Contract constructor for Proxied copies\"}},\"notice\":\"Contains the logic used by all Vector multisigs. A proxy to this         contract is deployed per-channel using the ChannelFactory.sol.         Supports channel adjudication logic, deposit logic, and arbitrary         calls when a commitment is double-signed.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src.sol/ChannelMastercopy.sol\":\"ChannelMastercopy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n            revert(\\\"ECDSA: invalid signature 's' value\\\");\\n        }\\n\\n        if (v != 27 && v != 28) {\\n            revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n        }\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xf25c49d2be2d28918ae6de7e9724238367dabe50631ec8fd23d1cdae2cb70262\",\"license\":\"MIT\"},\"@openzeppelin/contracts/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle trees (hash trees),\\n */\\nlibrary MerkleProof {\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     */\\n    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n        bytes32 computedHash = leaf;\\n\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            bytes32 proofElement = proof[i];\\n\\n            if (computedHash <= proofElement) {\\n                // Hash(current computed hash + current element of the proof)\\n                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));\\n            } else {\\n                // Hash(current element of the proof + current computed hash)\\n                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));\\n            }\\n        }\\n\\n        // Check if the computed hash (root) is equal to the provided root\\n        return computedHash == root;\\n    }\\n}\\n\",\"keccak256\":\"0x4959be2683e7af3439cb94f06aa6c40cb42ca9336747d0c7dce54f07196489bc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    /**\\n     * @dev Returns the largest of two numbers.\\n     */\\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a >= b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the smallest of two numbers.\\n     */\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a < b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the average of two numbers. The result is rounded towards\\n     * zero.\\n     */\\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b) / 2 can overflow, so we distribute\\n        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\\n    }\\n}\\n\",\"keccak256\":\"0xa4fdec0ea7d943692cac780111ff2ff9d89848cad0494a59cfaed63a705054b4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xba96bc371ba999f452985a98717cca1e4c4abb598dc038a9a9c3db08129b1ba4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xbd74f587ab9b9711801baf667db1426e4a03fd2d7f15af33e0e0d0394e7cef76\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts\\n        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned\\n        // for accounts without code, i.e. `keccak256('')`\\n        bytes32 codehash;\\n        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { codehash := extcodehash(account) }\\n        return (codehash != accountHash && codehash != 0x0);\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return _functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        return _functionCallWithValue(target, data, value, errorMessage);\\n    }\\n\\n    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x698f929f1097637d051976b322a2d532c27df022b09010e8d091e2888a5ebdf8\",\"license\":\"MIT\"},\"src.sol/CMCAdjudicator.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./interfaces/Commitment.sol\\\";\\nimport \\\"./interfaces/ICMCAdjudicator.sol\\\";\\nimport \\\"./interfaces/ITransferDefinition.sol\\\";\\nimport \\\"./interfaces/Types.sol\\\";\\nimport \\\"./CMCCore.sol\\\";\\nimport \\\"./CMCAsset.sol\\\";\\nimport \\\"./CMCDeposit.sol\\\";\\nimport \\\"./lib/LibChannelCrypto.sol\\\";\\nimport \\\"./lib/LibMath.sol\\\";\\nimport \\\"@openzeppelin/contracts/cryptography/MerkleProof.sol\\\";\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\n\\n/// @title CMCAdjudicator\\n/// @author Connext <support@connext.network>\\n/// @notice Contains logic for disputing a single channel and all active\\n///         transfers associated with the channel. Contains two major phases:\\n///         (1) consensus: settle on latest channel state\\n///         (2) defund: remove assets and dispute active transfers\\ncontract CMCAdjudicator is CMCCore, CMCAsset, CMCDeposit, ICMCAdjudicator {\\n    using LibChannelCrypto for bytes32;\\n    using LibMath for uint256;\\n    using SafeMath for uint256;\\n\\n    uint256 private constant INITIAL_DEFUND_NONCE = 1;\\n\\n    ChannelDispute private channelDispute;\\n    mapping(address => uint256) private defundNonces;\\n    mapping(bytes32 => TransferDispute) private transferDisputes;\\n\\n    modifier validateChannel(CoreChannelState calldata ccs) {\\n        require(\\n            ccs.channelAddress == address(this) &&\\n                ccs.alice == alice &&\\n                ccs.bob == bob,\\n            \\\"CMCAdjudicator: INVALID_CHANNEL\\\"\\n        );\\n        _;\\n    }\\n\\n    modifier validateTransfer(CoreTransferState calldata cts) {\\n        require(\\n            cts.channelAddress == address(this),\\n            \\\"CMCAdjudicator: INVALID_TRANSFER\\\"\\n        );\\n        _;\\n    }\\n\\n    function getChannelDispute()\\n        external\\n        view\\n        override\\n        onlyViaProxy\\n        nonReentrantView\\n        returns (ChannelDispute memory)\\n    {\\n        return channelDispute;\\n    }\\n\\n    function getDefundNonce(address assetId)\\n        external\\n        view\\n        override\\n        onlyViaProxy\\n        nonReentrantView\\n        returns (uint256)\\n    {\\n        return defundNonces[assetId];\\n    }\\n\\n    function getTransferDispute(bytes32 transferId)\\n        external\\n        view\\n        override\\n        onlyViaProxy\\n        nonReentrantView\\n        returns (TransferDispute memory)\\n    {\\n        return transferDisputes[transferId];\\n    }\\n\\n    function disputeChannel(\\n        CoreChannelState calldata ccs,\\n        bytes calldata aliceSignature,\\n        bytes calldata bobSignature\\n    ) external override onlyViaProxy nonReentrant validateChannel(ccs) {\\n        // Generate hash\\n        bytes32 ccsHash = hashChannelState(ccs);\\n\\n        // Verify Alice's and Bob's signature on the channel state\\n        verifySignaturesOnChannelStateHash(ccs, ccsHash, aliceSignature, bobSignature);\\n\\n        // We cannot dispute a channel in its defund phase\\n        require(!inDefundPhase(), \\\"CMCAdjudicator: INVALID_PHASE\\\");\\n\\n        // New nonce must be strictly greater than the stored one\\n        require(\\n            channelDispute.nonce < ccs.nonce,\\n            \\\"CMCAdjudicator: INVALID_NONCE\\\"\\n        );\\n\\n        if (!inConsensusPhase()) {\\n            // We are not already in a dispute\\n            // Set expiries\\n            // TODO: offchain-ensure that there can't be an overflow\\n            channelDispute.consensusExpiry = block.timestamp.add(ccs.timeout);\\n            channelDispute.defundExpiry = block.timestamp.add(\\n                ccs.timeout.mul(2)\\n            );\\n        }\\n\\n        // Store newer state\\n        channelDispute.channelStateHash = ccsHash;\\n        channelDispute.nonce = ccs.nonce;\\n        channelDispute.merkleRoot = ccs.merkleRoot;\\n\\n        // Emit event\\n        emit ChannelDisputed(msg.sender, ccs, channelDispute);\\n    }\\n\\n    function defundChannel(\\n        CoreChannelState calldata ccs,\\n        address[] calldata assetIds,\\n        uint256[] calldata indices\\n    ) external override onlyViaProxy nonReentrant validateChannel(ccs) {\\n        // These checks are not strictly necessary, but it's a bit cleaner this way\\n        require(assetIds.length > 0, \\\"CMCAdjudicator: NO_ASSETS_GIVEN\\\");\\n        require(\\n            indices.length <= assetIds.length,\\n            \\\"CMCAdjudicator: WRONG_ARRAY_LENGTHS\\\"\\n        );\\n\\n        // Verify that the given channel state matches the stored one\\n        require(\\n            hashChannelState(ccs) == channelDispute.channelStateHash,\\n            \\\"CMCAdjudicator: INVALID_CHANNEL_HASH\\\"\\n        );\\n\\n        // We need to be in defund phase for that\\n        require(inDefundPhase(), \\\"CMCAdjudicator: INVALID_PHASE\\\");\\n\\n        // TODO SECURITY: Beware of reentrancy\\n        // TODO: offchain-ensure that all arrays have the same length:\\n        // assetIds, balances, processedDepositsA, processedDepositsB, defundNonces\\n        // Make sure there are no duplicates in the assetIds -- duplicates are often a source of double-spends\\n\\n        // Defund all assets given\\n        for (uint256 i = 0; i < assetIds.length; i++) {\\n            address assetId = assetIds[i];\\n\\n            // Verify or find the index of the assetId in the ccs.assetIds\\n            uint256 index;\\n            if (i < indices.length) {\\n                // The index was supposedly given -- we verify\\n                index = indices[i];\\n                require(\\n                    assetId == ccs.assetIds[index],\\n                    \\\"CMCAdjudicator: INDEX_MISMATCH\\\"\\n                );\\n            } else {\\n                // we search through the assets in ccs\\n                for (index = 0; index < ccs.assetIds.length; index++) {\\n                    if (assetId == ccs.assetIds[index]) {\\n                        break;\\n                    }\\n                }\\n            }\\n\\n            // Now, if `index`  is equal to the number of assets in ccs,\\n            // then the current asset is not in ccs;\\n            // otherwise, `index` is the index in ccs for the current asset\\n\\n            // Check the assets haven't already been defunded + update the\\n            // defundNonce for that asset\\n            {\\n                // Open a new block to avoid \\\"stack too deep\\\" error\\n                uint256 defundNonce =\\n                    (index == ccs.assetIds.length)\\n                        ? INITIAL_DEFUND_NONCE\\n                        : ccs.defundNonces[index];\\n                require(\\n                    defundNonces[assetId] < defundNonce,\\n                    \\\"CMCAdjudicator: CHANNEL_ALREADY_DEFUNDED\\\"\\n                );\\n                defundNonces[assetId] = defundNonce;\\n            }\\n\\n            // Get total deposits\\n            uint256 tdAlice = _getTotalDepositsAlice(assetId);\\n            uint256 tdBob = _getTotalDepositsBob(assetId);\\n\\n            Balance memory balance;\\n\\n            if (index == ccs.assetIds.length) {\\n                // The current asset is not a part of ccs; refund what has been deposited\\n                balance = Balance({\\n                    amount: [tdAlice, tdBob],\\n                    to: [payable(ccs.alice), payable(ccs.bob)]\\n                });\\n            } else {\\n                // Start with the final balances in ccs\\n                balance = ccs.balances[index];\\n                // Add unprocessed deposits\\n                balance.amount[0] = balance.amount[0].satAdd(\\n                    tdAlice - ccs.processedDepositsA[index]\\n                );\\n                balance.amount[1] = balance.amount[1].satAdd(\\n                    tdBob - ccs.processedDepositsB[index]\\n                );\\n            }\\n\\n            // Add result to exitable amounts\\n            makeBalanceExitable(assetId, balance);\\n        }\\n\\n        emit ChannelDefunded(\\n            msg.sender,\\n            ccs,\\n            channelDispute,\\n            assetIds\\n        );\\n    }\\n\\n    function disputeTransfer(\\n        CoreTransferState calldata cts,\\n        bytes32[] calldata merkleProofData\\n    ) external override onlyViaProxy nonReentrant validateTransfer(cts) {\\n        // Verify that the given transfer state is included in the \\\"finalized\\\" channel state\\n        bytes32 transferStateHash = hashTransferState(cts);\\n        verifyMerkleProof(\\n            merkleProofData,\\n            channelDispute.merkleRoot,\\n            transferStateHash\\n        );\\n\\n        // The channel needs to be in defund phase for that, i.e. channel state is \\\"finalized\\\"\\n        require(inDefundPhase(), \\\"CMCAdjudicator: INVALID_PHASE\\\");\\n\\n        // Get stored dispute for this transfer\\n        TransferDispute storage transferDispute =\\n            transferDisputes[cts.transferId];\\n\\n        // Verify that this transfer has not been disputed before\\n        require(\\n            transferDispute.transferDisputeExpiry == 0,\\n            \\\"CMCAdjudicator: TRANSFER_ALREADY_DISPUTED\\\"\\n        );\\n\\n        // Store transfer state and set expiry\\n        transferDispute.transferStateHash = transferStateHash;\\n        // TODO: offchain-ensure that there can't be an overflow\\n        transferDispute.transferDisputeExpiry = block.timestamp.add(\\n            cts.transferTimeout\\n        );\\n\\n        emit TransferDisputed(\\n            msg.sender,\\n            cts,\\n            transferDispute\\n        );\\n    }\\n\\n    function defundTransfer(\\n        CoreTransferState calldata cts,\\n        bytes calldata encodedInitialTransferState,\\n        bytes calldata encodedTransferResolver,\\n        bytes calldata responderSignature\\n    ) external override onlyViaProxy nonReentrant validateTransfer(cts) {\\n        // Get stored dispute for this transfer\\n        TransferDispute storage transferDispute =\\n            transferDisputes[cts.transferId];\\n\\n        // Verify that a dispute for this transfer has already been started\\n        require(\\n            transferDispute.transferDisputeExpiry != 0,\\n            \\\"CMCAdjudicator: TRANSFER_NOT_DISPUTED\\\"\\n        );\\n\\n        // Verify that the given transfer state matches the stored one\\n        require(\\n            hashTransferState(cts) == transferDispute.transferStateHash,\\n            \\\"CMCAdjudicator: INVALID_TRANSFER_HASH\\\"\\n        );\\n\\n        // We can't defund twice\\n        require(\\n            !transferDispute.isDefunded,\\n            \\\"CMCAdjudicator: TRANSFER_ALREADY_DEFUNDED\\\"\\n        );\\n        transferDispute.isDefunded = true;\\n\\n        Balance memory balance;\\n\\n        if (block.timestamp < transferDispute.transferDisputeExpiry) {\\n            // Ensure the correct hash is provided\\n            require(\\n                keccak256(encodedInitialTransferState) == cts.initialStateHash,\\n                \\\"CMCAdjudicator: INVALID_TRANSFER_HASH\\\"\\n            );\\n            \\n            // Before dispute expiry, responder or responder-authorized\\n            // agent (i.e. watchtower) can resolve\\n            require(\\n                msg.sender == cts.responder || cts.initialStateHash.checkSignature(responderSignature, cts.responder),\\n                \\\"CMCAdjudicator: INVALID_RESOLVER\\\"\\n            );\\n            \\n            ITransferDefinition transferDefinition =\\n                ITransferDefinition(cts.transferDefinition);\\n            balance = transferDefinition.resolve(\\n                abi.encode(cts.balance),\\n                encodedInitialTransferState,\\n                encodedTransferResolver\\n            );\\n            // Verify that returned balances don't exceed initial balances\\n            require(\\n                balance.amount[0].add(balance.amount[1]) <=\\n                    cts.balance.amount[0].add(cts.balance.amount[1]),\\n                \\\"CMCAdjudicator: INVALID_BALANCES\\\"\\n            );\\n        } else {\\n            // After dispute expiry, if the responder hasn't resolved, we defund the initial balance\\n            balance = cts.balance;\\n        }\\n\\n        // Depending on previous code path, defund either resolved or initial balance\\n        makeBalanceExitable(cts.assetId, balance);\\n\\n        // Emit event\\n        emit TransferDefunded(\\n            msg.sender,\\n            cts,\\n            transferDispute,\\n            encodedInitialTransferState,\\n            encodedTransferResolver,\\n            balance\\n        );\\n    }\\n\\n    function verifySignaturesOnChannelStateHash(\\n        CoreChannelState calldata ccs,\\n        bytes32 ccsHash,\\n        bytes calldata aliceSignature,\\n        bytes calldata bobSignature\\n    ) internal pure {\\n        bytes32 commitment =\\n            keccak256(abi.encode(CommitmentType.ChannelState, ccsHash));\\n        require(\\n            commitment.checkSignature(aliceSignature, ccs.alice),\\n            \\\"CMCAdjudicator: INVALID_ALICE_SIG\\\"\\n        );\\n        require(\\n            commitment.checkSignature(bobSignature, ccs.bob),\\n            \\\"CMCAdjudicator: INVALID_BOB_SIG\\\"\\n        );\\n    }\\n\\n    function verifyMerkleProof(\\n        bytes32[] calldata proof,\\n        bytes32 root,\\n        bytes32 leaf\\n    ) internal pure {\\n        require(\\n            MerkleProof.verify(proof, root, leaf),\\n            \\\"CMCAdjudicator: INVALID_MERKLE_PROOF\\\"\\n        );\\n    }\\n\\n    function inConsensusPhase() internal view returns (bool) {\\n        return block.timestamp < channelDispute.consensusExpiry;\\n    }\\n\\n    function inDefundPhase() internal view returns (bool) {\\n        return\\n            channelDispute.consensusExpiry <= block.timestamp &&\\n            block.timestamp < channelDispute.defundExpiry;\\n    }\\n\\n    function hashChannelState(CoreChannelState calldata ccs)\\n        internal\\n        pure\\n        returns (bytes32)\\n    {\\n        return keccak256(abi.encode(ccs));\\n    }\\n\\n    function hashTransferState(CoreTransferState calldata cts)\\n        internal\\n        pure\\n        returns (bytes32)\\n    {\\n        return keccak256(abi.encode(cts));\\n    }\\n}\\n\",\"keccak256\":\"0x351fb7770cbb6fbb6f3470e63d5a9e93c817722f9c8e2e5c62e38ebf8c6e389b\",\"license\":\"UNLICENSED\"},\"src.sol/CMCAsset.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./interfaces/ICMCAsset.sol\\\";\\nimport \\\"./interfaces/Types.sol\\\";\\nimport \\\"./CMCCore.sol\\\";\\nimport \\\"./lib/LibAsset.sol\\\";\\nimport \\\"./lib/LibMath.sol\\\";\\nimport \\\"@openzeppelin/contracts/math/Math.sol\\\";\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\n/// @title CMCAsset\\n/// @author Connext <support@connext.network>\\n/// @notice Contains logic to safely transfer channel assets (even if they are\\n///         noncompliant). During adjudication, balances from defunding the\\n///         channel or defunding transfers are registered as withdrawable. Once\\n///         they are registered, the owner (or a watchtower on behalf of the\\n///         owner), may call `exit` to reclaim funds from the multisig.\\n\\ncontract CMCAsset is CMCCore, ICMCAsset {\\n    using SafeMath for uint256;\\n    using LibMath for uint256;\\n\\n    mapping(address => uint256) internal totalTransferred;\\n    mapping(address => mapping(address => uint256))\\n        private exitableAmount;\\n\\n    function registerTransfer(address assetId, uint256 amount) internal {\\n        totalTransferred[assetId] += amount;\\n    }\\n\\n    function getTotalTransferred(address assetId)\\n        external\\n        view\\n        override\\n        onlyViaProxy\\n        nonReentrantView\\n        returns (uint256)\\n    {\\n        return totalTransferred[assetId];\\n    }\\n\\n    function makeExitable(\\n        address assetId,\\n        address recipient,\\n        uint256 amount\\n    ) internal {\\n        exitableAmount[assetId][\\n            recipient\\n        ] = exitableAmount[assetId][recipient].satAdd(amount);\\n    }\\n\\n    function makeBalanceExitable(\\n        address assetId,\\n        Balance memory balance\\n    ) internal {\\n        for (uint256 i = 0; i < 2; i++) {\\n            uint256 amount = balance.amount[i];\\n            if (amount > 0) {\\n                makeExitable(assetId, balance.to[i], amount);\\n            }\\n        }\\n    }\\n\\n    function getExitableAmount(address assetId, address owner)\\n        external\\n        view\\n        override\\n        onlyViaProxy\\n        nonReentrantView\\n        returns (uint256)\\n    {\\n        return exitableAmount[assetId][owner];\\n    }\\n\\n    function getAvailableAmount(address assetId, uint256 maxAmount)\\n        internal\\n        view\\n        returns (uint256)\\n    {\\n        // Taking the min protects against the case where the multisig\\n        // holds less than the amount that is trying to be withdrawn\\n        // while still allowing the total of the funds to be removed\\n        // without the transaction reverting.\\n        return Math.min(maxAmount, LibAsset.getOwnBalance(assetId));\\n    }\\n\\n    function transferAsset(\\n        address assetId,\\n        address payable recipient,\\n        uint256 amount\\n    ) internal {\\n        registerTransfer(assetId, amount);\\n        require(\\n            LibAsset.unregisteredTransfer(assetId, recipient, amount),\\n            \\\"CMCAsset: TRANSFER_FAILED\\\"\\n        );\\n    }\\n\\n    function exit(\\n        address assetId,\\n        address owner,\\n        address payable recipient\\n    ) external override onlyViaProxy nonReentrant {\\n        // Either the owner must be the recipient, or in control\\n        // of setting the recipient of the funds to whomever they\\n        // choose\\n        require(\\n            msg.sender == owner || owner == recipient,\\n            \\\"CMCAsset: OWNER_MISMATCH\\\"\\n        );\\n\\n        uint256 amount =\\n            getAvailableAmount(\\n                assetId,\\n                exitableAmount[assetId][owner]\\n            );\\n\\n        // Revert if amount is 0\\n        require(amount > 0, \\\"CMCAsset: NO_OP\\\");\\n\\n        // Reduce the amount claimable from the multisig by the owner\\n        exitableAmount[assetId][\\n            owner\\n        ] = exitableAmount[assetId][owner].sub(amount);\\n\\n        // Perform transfer\\n        transferAsset(assetId, recipient, amount);\\n    }\\n}\\n\",\"keccak256\":\"0x39c1bd81d8ec2a0fa7c23aad683017f5e2ec28a2db43643020649f935b5b74bf\",\"license\":\"UNLICENSED\"},\"src.sol/CMCCore.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./interfaces/ICMCCore.sol\\\";\\nimport \\\"./ReentrancyGuard.sol\\\";\\n\\n/// @title CMCCore\\n/// @author Connext <support@connext.network>\\n/// @notice Contains logic pertaining to the participants of a channel,\\n///         including setting and retrieving the participants and the\\n///         mastercopy.\\n\\ncontract CMCCore is ReentrancyGuard, ICMCCore {\\n    address private immutable mastercopyAddress;\\n\\n    address internal alice;\\n    address internal bob;\\n\\n    /// @notice Set invalid participants to block the mastercopy from being used directly\\n    ///         Nonzero address also prevents the mastercopy from being setup\\n    ///         Only setting alice is sufficient, setting bob too wouldn't change anything\\n    constructor() {\\n        mastercopyAddress = address(this);\\n    }\\n\\n    // Prevents us from calling methods directly from the mastercopy contract\\n    modifier onlyViaProxy {\\n        require(\\n            address(this) != mastercopyAddress,\\n            \\\"Mastercopy: ONLY_VIA_PROXY\\\"\\n        );\\n        _;\\n    }\\n\\n    /// @notice Contract constructor for Proxied copies\\n    /// @param _alice: Address representing user with function deposit\\n    /// @param _bob: Address representing user with multisig deposit\\n    function setup(address _alice, address _bob)\\n        external\\n        override\\n        onlyViaProxy\\n    {\\n        require(alice == address(0), \\\"CMCCore: ALREADY_SETUP\\\");\\n        require(\\n            _alice != address(0) && _bob != address(0),\\n            \\\"CMCCore: INVALID_PARTICIPANT\\\"\\n        );\\n        require(_alice != _bob, \\\"CMCCore: IDENTICAL_PARTICIPANTS\\\");\\n        ReentrancyGuard.setup();\\n        alice = _alice;\\n        bob = _bob;\\n    }\\n\\n    /// @notice A getter function for the bob of the multisig\\n    /// @return Bob's signer address\\n    function getAlice()\\n        external\\n        view\\n        override\\n        onlyViaProxy\\n        nonReentrantView\\n        returns (address)\\n    {\\n        return alice;\\n    }\\n\\n    /// @notice A getter function for the bob of the multisig\\n    /// @return Alice's signer address\\n    function getBob()\\n        external\\n        view\\n        override\\n        onlyViaProxy\\n        nonReentrantView\\n        returns (address)\\n    {\\n        return bob;\\n    }\\n}\\n\",\"keccak256\":\"0x37324d80a19f1feb6e413fe6a41d82b5dba38bca62e0e05ae6f420000dd93c53\",\"license\":\"UNLICENSED\"},\"src.sol/CMCDeposit.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./interfaces/ICMCDeposit.sol\\\";\\nimport \\\"./CMCCore.sol\\\";\\nimport \\\"./CMCAsset.sol\\\";\\nimport \\\"./lib/LibAsset.sol\\\";\\nimport \\\"./lib/LibERC20.sol\\\";\\n\\n/// @title CMCDeposit\\n/// @author Connext <support@connext.network>\\n/// @notice Contains logic supporting channel multisig deposits. Channel\\n///         funding is asymmetric, with `alice` having to call a deposit\\n///         function which tracks the total amount she has deposited so far,\\n///         and any other funds in the multisig being attributed to `bob`.\\n\\ncontract CMCDeposit is CMCCore, CMCAsset, ICMCDeposit {\\n    mapping(address => uint256) private depositsAlice;\\n\\n    receive() external payable onlyViaProxy nonReentrant {}\\n\\n    function getTotalDepositsAlice(address assetId)\\n        external\\n        view\\n        override\\n        onlyViaProxy\\n        nonReentrantView\\n        returns (uint256)\\n    {\\n        return _getTotalDepositsAlice(assetId);\\n    }\\n\\n    function _getTotalDepositsAlice(address assetId)\\n        internal\\n        view\\n        returns (uint256)\\n    {\\n        return depositsAlice[assetId];\\n    }\\n\\n    function getTotalDepositsBob(address assetId)\\n        external\\n        view\\n        override\\n        onlyViaProxy\\n        nonReentrantView\\n        returns (uint256)\\n    {\\n        return _getTotalDepositsBob(assetId);\\n    }\\n\\n    // Calculated using invariant onchain properties. Note we DONT use safemath here\\n    function _getTotalDepositsBob(address assetId)\\n        internal\\n        view\\n        returns (uint256)\\n    {\\n        return\\n            LibAsset.getOwnBalance(assetId) +\\n            totalTransferred[assetId] -\\n            depositsAlice[assetId];\\n    }\\n\\n    function depositAlice(address assetId, uint256 amount)\\n        external\\n        payable\\n        override\\n        onlyViaProxy\\n        nonReentrant\\n    {\\n        if (LibAsset.isEther(assetId)) {\\n            require(msg.value == amount, \\\"CMCDeposit: VALUE_MISMATCH\\\");\\n        } else {\\n            // If ETH is sent along, it will be attributed to bob\\n            require(msg.value == 0, \\\"CMCDeposit: ETH_WITH_ERC_TRANSFER\\\");\\n            require(\\n                LibERC20.transferFrom(\\n                    assetId,\\n                    msg.sender,\\n                    address(this),\\n                    amount\\n                ),\\n                \\\"CMCDeposit: ERC20_TRANSFER_FAILED\\\"\\n            );\\n        }\\n        // NOTE: explicitly do NOT use safemath here\\n        depositsAlice[assetId] += amount;\\n        emit AliceDeposited(assetId, amount);\\n    }\\n}\\n\",\"keccak256\":\"0x4d3dd828158289df93d6b5a6419bc5e8d95888aba81e62cd913af1e4c540bece\",\"license\":\"UNLICENSED\"},\"src.sol/CMCWithdraw.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./interfaces/Commitment.sol\\\";\\nimport \\\"./interfaces/ICMCWithdraw.sol\\\";\\nimport \\\"./interfaces/WithdrawHelper.sol\\\";\\nimport \\\"./CMCCore.sol\\\";\\nimport \\\"./CMCAsset.sol\\\";\\nimport \\\"./lib/LibAsset.sol\\\";\\nimport \\\"./lib/LibChannelCrypto.sol\\\";\\nimport \\\"./lib/LibUtils.sol\\\";\\n\\n/// @title CMCWithdraw\\n/// @author Connext <support@connext.network>\\n/// @notice Contains logic for all cooperative channel multisig withdrawals.\\n///         Cooperative withdrawal commitments must be signed by both channel\\n///         participants. As part of the channel withdrawals, an arbitrary\\n///         call can be made, which is extracted from the withdraw data.\\n\\ncontract CMCWithdraw is CMCCore, CMCAsset, ICMCWithdraw {\\n    using LibChannelCrypto for bytes32;\\n\\n    mapping(bytes32 => bool) private isExecuted;\\n\\n    modifier validateWithdrawData(WithdrawData calldata wd) {\\n        require(\\n            wd.channelAddress == address(this),\\n            \\\"CMCWithdraw: CHANNEL_MISMATCH\\\"\\n        );\\n        _;\\n    }\\n\\n    function getWithdrawalTransactionRecord(WithdrawData calldata wd)\\n        external\\n        view\\n        override\\n        onlyViaProxy\\n        nonReentrantView\\n        returns (bool)\\n    {\\n        return isExecuted[hashWithdrawData(wd)];\\n    }\\n\\n    /// @param wd The withdraw data consisting of\\n    /// semantic withdraw information, i.e. assetId, recipient, and amount;\\n    /// information to make an optional call in addition to the actual transfer,\\n    /// i.e. target address for the call and call payload;\\n    /// additional information, i.e. channel address and nonce.\\n    /// @param aliceSignature Signature of owner a\\n    /// @param bobSignature Signature of owner b\\n    function withdraw(\\n        WithdrawData calldata wd,\\n        bytes calldata aliceSignature,\\n        bytes calldata bobSignature\\n    ) external override onlyViaProxy nonReentrant validateWithdrawData(wd) {\\n        // Generate hash\\n        bytes32 wdHash = hashWithdrawData(wd);\\n\\n        // Verify Alice's and Bob's signature on the withdraw data\\n        verifySignaturesOnWithdrawDataHash(wdHash, aliceSignature, bobSignature);\\n\\n        // Replay protection\\n        require(!isExecuted[wdHash], \\\"CMCWithdraw: ALREADY_EXECUTED\\\");\\n        isExecuted[wdHash] = true;\\n\\n        // Determine actually transferable amount\\n        uint256 actualAmount = getAvailableAmount(wd.assetId, wd.amount);\\n\\n        // Revert if actualAmount is zero && callTo is 0\\n        require(\\n            actualAmount > 0 || wd.callTo != address(0),\\n            \\\"CMCWithdraw: NO_OP\\\"\\n        );\\n\\n        // Register and execute the transfer\\n        transferAsset(wd.assetId, wd.recipient, actualAmount);\\n\\n        // Do we have to make a call in addition to the actual transfer?\\n        if (wd.callTo != address(0)) {\\n            WithdrawHelper(wd.callTo).execute(wd, actualAmount);\\n        }\\n    }\\n\\n    function verifySignaturesOnWithdrawDataHash(\\n        bytes32 wdHash,\\n        bytes calldata aliceSignature,\\n        bytes calldata bobSignature\\n    ) internal view {\\n        bytes32 commitment =\\n            keccak256(abi.encode(CommitmentType.WithdrawData, wdHash));\\n        require(\\n            commitment.checkSignature(aliceSignature, alice),\\n            \\\"CMCWithdraw: INVALID_ALICE_SIG\\\"\\n        );\\n        require(\\n            commitment.checkSignature(bobSignature, bob),\\n            \\\"CMCWithdraw: INVALID_BOB_SIG\\\"\\n        );\\n    }\\n\\n    function hashWithdrawData(WithdrawData calldata wd)\\n        internal\\n        pure\\n        returns (bytes32)\\n    {\\n        return keccak256(abi.encode(wd));\\n    }\\n}\\n\",\"keccak256\":\"0x7fde93a55cab8b4a9497471af1f8321a6d9463a93c3c6b11cf6d5ada26326beb\",\"license\":\"UNLICENSED\"},\"src.sol/ChannelMastercopy.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./interfaces/IVectorChannel.sol\\\";\\nimport \\\"./CMCCore.sol\\\";\\nimport \\\"./CMCAsset.sol\\\";\\nimport \\\"./CMCDeposit.sol\\\";\\nimport \\\"./CMCWithdraw.sol\\\";\\nimport \\\"./CMCAdjudicator.sol\\\";\\n\\n/// @title ChannelMastercopy\\n/// @author Connext <support@connext.network>\\n/// @notice Contains the logic used by all Vector multisigs. A proxy to this\\n///         contract is deployed per-channel using the ChannelFactory.sol.\\n///         Supports channel adjudication logic, deposit logic, and arbitrary\\n///         calls when a commitment is double-signed.\\ncontract ChannelMastercopy is\\n    CMCCore,\\n    CMCAsset,\\n    CMCDeposit,\\n    CMCWithdraw,\\n    CMCAdjudicator,\\n    IVectorChannel\\n{\\n\\n}\\n\",\"keccak256\":\"0x96d68c908eb39a0002b574c423306ef1b9991da56087cb8f5e2d8b908676b3c7\",\"license\":\"UNLICENSED\"},\"src.sol/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\n/// @title CMCWithdraw\\n/// @author Connext <support@connext.network>\\n/// @notice A \\\"mutex\\\" reentrancy guard, heavily influenced by OpenZeppelin.\\n\\ncontract ReentrancyGuard {\\n    uint256 private constant OPEN = 1;\\n    uint256 private constant LOCKED = 2;\\n\\n    uint256 public lock;\\n\\n    function setup() internal {\\n        lock = OPEN;\\n    }\\n\\n    modifier nonReentrant() {\\n        require(lock == OPEN, \\\"ReentrancyGuard: REENTRANT_CALL\\\");\\n        lock = LOCKED;\\n        _;\\n        lock = OPEN;\\n    }\\n\\n    modifier nonReentrantView() {\\n        require(lock == OPEN, \\\"ReentrancyGuard: REENTRANT_CALL\\\");\\n        _;\\n    }\\n}\\n\",\"keccak256\":\"0xf7adf3f05703e0176d892051633e6ca3291e5a3d7ab769f880c03a0d0849dfa7\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/Commitment.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nenum CommitmentType {ChannelState, WithdrawData}\\n\",\"keccak256\":\"0xabfb62d2dbe45e307fc08742f87d2ff5d6faa9ab065f0c2395dc4adcbe0a9c20\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/ICMCAdjudicator.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./Types.sol\\\";\\n\\ninterface ICMCAdjudicator {\\n    struct CoreChannelState {\\n        address channelAddress;\\n        address alice;\\n        address bob;\\n        address[] assetIds;\\n        Balance[] balances;\\n        uint256[] processedDepositsA;\\n        uint256[] processedDepositsB;\\n        uint256[] defundNonces;\\n        uint256 timeout;\\n        uint256 nonce;\\n        bytes32 merkleRoot;\\n    }\\n\\n    struct CoreTransferState {\\n        address channelAddress;\\n        bytes32 transferId;\\n        address transferDefinition;\\n        address initiator;\\n        address responder;\\n        address assetId;\\n        Balance balance;\\n        uint256 transferTimeout;\\n        bytes32 initialStateHash;\\n    }\\n\\n    struct ChannelDispute {\\n        bytes32 channelStateHash;\\n        uint256 nonce;\\n        bytes32 merkleRoot;\\n        uint256 consensusExpiry;\\n        uint256 defundExpiry;\\n    }\\n\\n    struct TransferDispute {\\n        bytes32 transferStateHash;\\n        uint256 transferDisputeExpiry;\\n        bool isDefunded;\\n    }\\n\\n    event ChannelDisputed(\\n        address disputer,\\n        CoreChannelState state,\\n        ChannelDispute dispute\\n    );\\n\\n    event ChannelDefunded(\\n        address defunder,\\n        CoreChannelState state,\\n        ChannelDispute dispute,\\n        address[] assetIds\\n    );\\n\\n    event TransferDisputed(\\n        address disputer,\\n        CoreTransferState state,\\n        TransferDispute dispute\\n    );\\n\\n    event TransferDefunded(\\n        address defunder,\\n        CoreTransferState state,\\n        TransferDispute dispute,\\n        bytes encodedInitialState,\\n        bytes encodedResolver,\\n        Balance balance\\n    );\\n\\n    function getChannelDispute() external view returns (ChannelDispute memory);\\n\\n    function getDefundNonce(address assetId) external view returns (uint256);\\n\\n    function getTransferDispute(bytes32 transferId)\\n        external\\n        view\\n        returns (TransferDispute memory);\\n\\n    function disputeChannel(\\n        CoreChannelState calldata ccs,\\n        bytes calldata aliceSignature,\\n        bytes calldata bobSignature\\n    ) external;\\n\\n    function defundChannel(\\n        CoreChannelState calldata ccs,\\n        address[] calldata assetIds,\\n        uint256[] calldata indices\\n    ) external;\\n\\n    function disputeTransfer(\\n        CoreTransferState calldata cts,\\n        bytes32[] calldata merkleProofData\\n    ) external;\\n\\n    function defundTransfer(\\n        CoreTransferState calldata cts,\\n        bytes calldata encodedInitialTransferState,\\n        bytes calldata encodedTransferResolver,\\n        bytes calldata responderSignature\\n    ) external;\\n}\\n\",\"keccak256\":\"0x88522bb51c2b9991b24ef33a3c776ac76d96060ebbc33cd5b2b14513fb21d237\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/ICMCAsset.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\ninterface ICMCAsset {\\n    function getTotalTransferred(address assetId)\\n        external\\n        view\\n        returns (uint256);\\n\\n    function getExitableAmount(address assetId, address owner)\\n        external\\n        view\\n        returns (uint256);\\n\\n    function exit(\\n        address assetId,\\n        address owner,\\n        address payable recipient\\n    ) external;\\n}\\n\",\"keccak256\":\"0x895d89536e8ca469afe642b7001f0dfff497ce29d5d73f862b07a1cdc483f3f7\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/ICMCCore.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\ninterface ICMCCore {\\n    function setup(address _alice, address _bob) external;\\n\\n    function getAlice() external view returns (address);\\n\\n    function getBob() external view returns (address);\\n}\\n\",\"keccak256\":\"0x8e8da2d8fb5198441ba6cdff018dff9e4145b07d575647c990659adad637ec8c\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/ICMCDeposit.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\ninterface ICMCDeposit {\\n    event AliceDeposited(address assetId, uint256 amount);\\n    \\n    function getTotalDepositsAlice(address assetId)\\n        external\\n        view\\n        returns (uint256);\\n\\n    function getTotalDepositsBob(address assetId)\\n        external\\n        view\\n        returns (uint256);\\n\\n    function depositAlice(address assetId, uint256 amount) external payable;\\n}\\n\",\"keccak256\":\"0xdf6f284e44d88013cf9d51220315fb37e63086e470442685891c90aadd138295\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/ICMCWithdraw.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nstruct WithdrawData {\\n    address channelAddress;\\n    address assetId;\\n    address payable recipient;\\n    uint256 amount;\\n    uint256 nonce;\\n    address callTo;\\n    bytes callData;\\n}\\n\\ninterface ICMCWithdraw {\\n    function getWithdrawalTransactionRecord(WithdrawData calldata wd)\\n        external\\n        view\\n        returns (bool);\\n\\n    function withdraw(\\n        WithdrawData calldata wd,\\n        bytes calldata aliceSignature,\\n        bytes calldata bobSignature\\n    ) external;\\n}\\n\",\"keccak256\":\"0x097dfe95ad19096f9a3dd0138b4a51680c26e665d1639278a7c0a5c9f7fc5c78\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/ITransferDefinition.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./ITransferRegistry.sol\\\";\\nimport \\\"./Types.sol\\\";\\n\\ninterface ITransferDefinition {\\n    // Validates the initial state of the transfer.\\n    // Called by validator.ts during `create` updates.\\n    function create(bytes calldata encodedBalance, bytes calldata)\\n        external\\n        view\\n        returns (bool);\\n\\n    // Performs a state transition to resolve a transfer and returns final balances.\\n    // Called by validator.ts during `resolve` updates.\\n    function resolve(\\n        bytes calldata encodedBalance,\\n        bytes calldata,\\n        bytes calldata\\n    ) external view returns (Balance memory);\\n\\n    // Should also have the following properties:\\n    // string public constant override Name = \\\"...\\\";\\n    // string public constant override StateEncoding = \\\"...\\\";\\n    // string public constant override ResolverEncoding = \\\"...\\\";\\n    // These properties are included on the transfer specifically\\n    // to make it easier for implementers to add new transfers by\\n    // only include a `.sol` file\\n    function Name() external view returns (string memory);\\n\\n    function StateEncoding() external view returns (string memory);\\n\\n    function ResolverEncoding() external view returns (string memory);\\n\\n    function EncodedCancel() external view returns (bytes memory);\\n\\n    function getRegistryInformation()\\n        external\\n        view\\n        returns (RegisteredTransfer memory);\\n}\\n\",\"keccak256\":\"0xd8eef575aa791b187397c9096e6cf40431b590d3999f0a80e38f3e59f4cf4764\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/ITransferRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental \\\"ABIEncoderV2\\\";\\n\\nstruct RegisteredTransfer {\\n    string name;\\n    address definition;\\n    string stateEncoding;\\n    string resolverEncoding;\\n    bytes encodedCancel;\\n}\\n\\ninterface ITransferRegistry {\\n    event TransferAdded(RegisteredTransfer transfer);\\n\\n    event TransferRemoved(RegisteredTransfer transfer);\\n\\n    // Should add a transfer definition to the registry\\n    // onlyOwner\\n    function addTransferDefinition(RegisteredTransfer memory transfer) external;\\n\\n    // Should remove a transfer definition to the registry\\n    // onlyOwner\\n    function removeTransferDefinition(string memory name) external;\\n\\n    // Should return all transfer defintions in registry\\n    function getTransferDefinitions()\\n        external\\n        view\\n        returns (RegisteredTransfer[] memory);\\n}\\n\",\"keccak256\":\"0xd13be6d976c64e381a0d9df10c621cd964454b6916f25df4ea6c1b4cd873a58a\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/IVectorChannel.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./ICMCCore.sol\\\";\\nimport \\\"./ICMCAsset.sol\\\";\\nimport \\\"./ICMCDeposit.sol\\\";\\nimport \\\"./ICMCWithdraw.sol\\\";\\nimport \\\"./ICMCAdjudicator.sol\\\";\\n\\ninterface IVectorChannel is\\n    ICMCCore,\\n    ICMCAsset,\\n    ICMCDeposit,\\n    ICMCWithdraw,\\n    ICMCAdjudicator\\n{}\\n\",\"keccak256\":\"0x9e21e3b6510bb5aecab999bfcbefe6184bd2be5a80179ef8ecadb63ddd2c8d53\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/Types.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nstruct Balance {\\n    uint256[2] amount; // [alice, bob] in channel, [initiator, responder] in transfer\\n    address payable[2] to; // [alice, bob] in channel, [initiator, responder] in transfer\\n}\\n\",\"keccak256\":\"0xf8c71b155b630cde965f5d1db5f0d2751a9763f5a797f15d946613e9224f1046\",\"license\":\"UNLICENSED\"},\"src.sol/interfaces/WithdrawHelper.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./ICMCWithdraw.sol\\\";\\n\\ninterface WithdrawHelper {\\n    function execute(WithdrawData calldata wd, uint256 actualAmount) external;\\n}\\n\",\"keccak256\":\"0x45bd70363bc7a45001589d55d8d068a3baa321c50382c0c73f1ffae45adfc4bb\",\"license\":\"UNLICENSED\"},\"src.sol/lib/LibAsset.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./LibERC20.sol\\\";\\nimport \\\"./LibUtils.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\n\\n/// @title LibAsset\\n/// @author Connext <support@connext.network>\\n/// @notice This library contains helpers for dealing with onchain transfers\\n///         of in-channel assets. It is designed to safely handle all asset\\n///         transfers out of channel in the event of an onchain dispute. Also\\n///         safely handles ERC20 transfers that may be non-compliant\\nlibrary LibAsset {\\n    address constant ETHER_ASSETID = address(0);\\n\\n    function isEther(address assetId) internal pure returns (bool) {\\n        return assetId == ETHER_ASSETID;\\n    }\\n\\n    function getOwnBalance(address assetId) internal view returns (uint256) {\\n        return\\n            isEther(assetId)\\n                ? address(this).balance\\n                : IERC20(assetId).balanceOf(address(this));\\n    }\\n\\n    function transferEther(address payable recipient, uint256 amount)\\n        internal\\n        returns (bool)\\n    {\\n        (bool success, bytes memory returnData) =\\n            recipient.call{value: amount}(\\\"\\\");\\n        LibUtils.revertIfCallFailed(success, returnData);\\n        return true;\\n    }\\n\\n    function transferERC20(\\n        address assetId,\\n        address recipient,\\n        uint256 amount\\n    ) internal returns (bool) {\\n        return LibERC20.transfer(assetId, recipient, amount);\\n    }\\n\\n    // This function is a wrapper for transfers of Ether or ERC20 tokens,\\n    // both standard-compliant ones as well as tokens that exhibit the\\n    // missing-return-value bug.\\n    // Although it behaves very much like Solidity's `transfer` function\\n    // or the ERC20 `transfer` and is, in fact, designed to replace direct\\n    // usage of those, it is deliberately named `unregisteredTransfer`,\\n    // because we need to register every transfer out of the channel.\\n    // Therefore, it should normally not be used directly, with the single\\n    // exception of the `transferAsset` function in `CMCAsset.sol`,\\n    // which combines the \\\"naked\\\" unregistered transfer given below\\n    // with a registration.\\n    // USING THIS FUNCTION SOMEWHERE ELSE IS PROBABLY WRONG!\\n    function unregisteredTransfer(\\n        address assetId,\\n        address payable recipient,\\n        uint256 amount\\n    ) internal returns (bool) {\\n        return\\n            isEther(assetId)\\n                ? transferEther(recipient, amount)\\n                : transferERC20(assetId, recipient, amount);\\n    }\\n}\\n\",\"keccak256\":\"0x02e7b660846ad2f56f8005f786e0e2eb1d625c83f4cfcf9fc07a9566ca86195c\",\"license\":\"UNLICENSED\"},\"src.sol/lib/LibChannelCrypto.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts/cryptography/ECDSA.sol\\\";\\n\\t\\t\\n/// @author Connext <support@connext.network>\\t\\t\\n/// @notice This library contains helpers for recovering signatures from a\\t\\t\\n///         Vector commitments. Channels do not allow for arbitrary signing of\\t\\t\\n///         messages to prevent misuse of private keys by injected providers,\\t\\t\\n///         and instead only sign messages with a Vector channel prefix.\\nlibrary LibChannelCrypto {\\n    function checkSignature(\\n        bytes32 hash,\\n        bytes memory signature,\\n        address allegedSigner\\n    ) internal pure returns (bool) {\\n        return recoverChannelMessageSigner(hash, signature) == allegedSigner;\\n    }\\n\\n    function recoverChannelMessageSigner(bytes32 hash, bytes memory signature)\\n        internal\\n        pure\\n        returns (address)\\n    {\\n        bytes32 digest = toChannelSignedMessage(hash);\\n        return ECDSA.recover(digest, signature);\\n    }\\n\\n    function toChannelSignedMessage(bytes32 hash)\\n        internal\\n        pure\\n        returns (bytes32)\\n    {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return\\n            keccak256(abi.encodePacked(\\\"\\\\x16Vector Signed Message:\\\\n32\\\", hash));\\n    }\\n\\n    function checkUtilitySignature(\\n        bytes32 hash,\\n        bytes memory signature,\\n        address allegedSigner\\n    ) internal pure returns (bool) {\\n        return recoverChannelMessageSigner(hash, signature) == allegedSigner;\\n    }\\n\\n    function recoverUtilityMessageSigner(bytes32 hash, bytes memory signature)\\n        internal\\n        pure\\n        returns (address)\\n    {\\n        bytes32 digest = toUtilitySignedMessage(hash);\\n        return ECDSA.recover(digest, signature);\\n    }\\n\\n    function toUtilitySignedMessage(bytes32 hash)\\n        internal\\n        pure\\n        returns (bytes32)\\n    {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return\\n            keccak256(abi.encodePacked(\\\"\\\\x17Utility Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xb8aa3679b75f2a1a5785f614f5dff9a76a689c18caa56a8df1f4e3c3167d6ece\",\"license\":\"UNLICENSED\"},\"src.sol/lib/LibERC20.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./LibUtils.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\n/// @title LibERC20\\n/// @author Connext <support@connext.network>\\n/// @notice This library provides several functions to safely handle\\n///         noncompliant tokens (i.e. does not return a boolean from\\n///         the transfer function)\\n\\nlibrary LibERC20 {\\n    function wrapCall(address assetId, bytes memory callData)\\n        internal\\n        returns (bool)\\n    {\\n        require(Address.isContract(assetId), \\\"LibERC20: NO_CODE\\\");\\n        (bool success, bytes memory returnData) = assetId.call(callData);\\n        LibUtils.revertIfCallFailed(success, returnData);\\n        return returnData.length == 0 || abi.decode(returnData, (bool));\\n    }\\n\\n    function approve(\\n        address assetId,\\n        address spender,\\n        uint256 amount\\n    ) internal returns (bool) {\\n        return\\n            wrapCall(\\n                assetId,\\n                abi.encodeWithSignature(\\n                    \\\"approve(address,uint256)\\\",\\n                    spender,\\n                    amount\\n                )\\n            );\\n    }\\n\\n    function transferFrom(\\n        address assetId,\\n        address sender,\\n        address recipient,\\n        uint256 amount\\n    ) internal returns (bool) {\\n        return\\n            wrapCall(\\n                assetId,\\n                abi.encodeWithSignature(\\n                    \\\"transferFrom(address,address,uint256)\\\",\\n                    sender,\\n                    recipient,\\n                    amount\\n                )\\n            );\\n    }\\n\\n    function transfer(\\n        address assetId,\\n        address recipient,\\n        uint256 amount\\n    ) internal returns (bool) {\\n        return\\n            wrapCall(\\n                assetId,\\n                abi.encodeWithSignature(\\n                    \\\"transfer(address,uint256)\\\",\\n                    recipient,\\n                    amount\\n                )\\n            );\\n    }\\n}\\n\",\"keccak256\":\"0x5bad1474c93a295939c23f976786f0d086abc063f19ff9c8c1d069759c4a7ff5\",\"license\":\"UNLICENSED\"},\"src.sol/lib/LibMath.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\n/// @title LibMath\\n/// @author Connext <support@connext.network>\\n/// @notice This library allows functions that would otherwise overflow and\\n///         revert if SafeMath was used to instead return the UINT_MAX. In the\\n///         adjudicator, this is used to ensure you can get the majority of\\n///         funds out in the event your balance > UINT_MAX and there is an\\n///         onchain dispute.\\nlibrary LibMath {\\n    /// @dev Returns the maximum uint256 for an addition that would overflow\\n    ///      (saturation arithmetic)\\n    function satAdd(uint256 x, uint256 y) internal pure returns (uint256) {\\n        uint256 sum = x + y;\\n        return sum >= x ? sum : type(uint256).max;\\n    }\\n}\\n\",\"keccak256\":\"0x1e6307538bfdb12a0f5234db5b9b22365b6abe2b96baa37f2e4b5d2d3f6683b8\",\"license\":\"UNLICENSED\"},\"src.sol/lib/LibUtils.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.7.1;\\npragma experimental ABIEncoderV2;\\n\\n/// @title LibUtils\\n/// @author Connext <support@connext.network>\\n/// @notice Contains a helper to revert if a call was not successfully\\n///         made\\nlibrary LibUtils {\\n    // If success is false, reverts and passes on the revert string.\\n    function revertIfCallFailed(bool success, bytes memory returnData)\\n        internal\\n        pure\\n    {\\n        if (!success) {\\n            assembly {\\n                revert(add(returnData, 0x20), mload(returnData))\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf31897ed92b88739ca9c6e74d089e01c5dbf432183d2ab0b959b539842374ccd\",\"license\":\"UNLICENSED\"}},\"version\":1}",
    "bytecode": "0x60a060405234801561001057600080fd5b5030606081901b608052613ffa61008b60003980610128528061041b52806107c752806108425280610a765280610b945280610c3d528061114652806112bb5280611423528061156e52806115ea528061167e52806116f252806118f6528061197f5280611a085280611aa15280611b245250613ffa6000f3fe6080604052600436106101185760003560e01c80636f33389e116100a0578063e7283a8d11610064578063e7283a8d14610384578063e9852569146103a4578063eeb30fea146103c4578063f19eb10e146103d9578063f83d08ba146103fb57610198565b80636f33389e146102ca5780638c048fc2146102f7578063b081e9c814610324578063c60939be14610344578063cefa51221461036457610198565b80633ff0da16116100e75780633ff0da161461022a5780634d3fcbda146102575780635bc9d96d146102775780635fd334d914610297578063635ae901146102b757610198565b8063072f25fd1461019d578063241686a0146101bf5780632c889aa1146101ea5780632d34ba791461020a57610198565b3661019857306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561016f5760405162461bcd60e51b815260040161016690613cab565b60405180910390fd5b6001600054146101915760405162461bcd60e51b815260040161016690613a67565b6001600055005b600080fd5b3480156101a957600080fd5b506101bd6101b8366004612b84565b610410565b005b3480156101cb57600080fd5b506101d46107ba565b6040516101e191906131ad565b60405180910390f35b3480156101f657600080fd5b506101bd610205366004612c61565b610837565b34801561021657600080fd5b506101bd6102253660046127a8565b610a6b565b34801561023657600080fd5b5061024a610245366004612875565b610b81565b6040516101e19190613dc6565b34801561026357600080fd5b506101bd610272366004612a22565b610c32565b34801561028357600080fd5b506101bd6102923660046127e0565b61113b565b3480156102a357600080fd5b506101bd6102b2366004612b31565b6112b0565b6101bd6102c536600461282a565b611418565b3480156102d657600080fd5b506102ea6102e536600461278c565b611561565b6040516101e19190613e1e565b34801561030357600080fd5b50610317610312366004612c2f565b6115dd565b6040516101e1919061337b565b34801561033057600080fd5b506102ea61033f36600461278c565b611671565b34801561035057600080fd5b506101bd61035f366004612ab2565b6116e7565b34801561037057600080fd5b506102ea61037f36600461278c565b6118e9565b34801561039057600080fd5b506102ea61039f36600461278c565b611972565b3480156103b057600080fd5b506102ea6103bf3660046127a8565b6119fb565b3480156103d057600080fd5b506101d4611a94565b3480156103e557600080fd5b506103ee611b11565b6040516101e19190613d6a565b34801561040757600080fd5b506102ea611bb9565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156104595760405162461bcd60e51b815260040161016690613cab565b60016000541461047b5760405162461bcd60e51b815260040161016690613a67565b6002600055863061048f602083018361278c565b6001600160a01b0316146104b55760405162461bcd60e51b81526004016101669061358d565b6020808901356000908152600d9091526040902060018101546104ea5760405162461bcd60e51b8152600401610166906139b6565b80546104f58a611bbf565b146105125760405162461bcd60e51b815260040161016690613d17565b600281015460ff16156105375760405162461bcd60e51b8152600401610166906136d5565b60028101805460ff1916600117905561054e61262e565b816001015442101561073657896101600135898960405161057092919061314d565b6040518091039020146105955760405162461bcd60e51b815260040161016690613d17565b6105a560a08b0160808c0161278c565b6001600160a01b0316336001600160a01b03161480610616575061061685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106099250505060a08d0160808e0161278c565b6101608d01359190611bef565b6106325760405162461bcd60e51b815260040161016690613c76565b600061064460608c0160408d0161278c565b9050806001600160a01b0316638ef98a7e8c60c0016040516020016106699190613d5c565b6040516020818303038152906040528c8c8c8c6040518663ffffffff1660e01b815260040161069c9594939291906133a4565b60806040518083038186803b1580156106b457600080fd5b505afa1580156106c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ec919061295f565b915061070060c08c013560e08d0135611c17565b82516020810151905161071291611c17565b11156107305760405162461bcd60e51b815260040161016690613ce2565b5061074b565b610748368b90038b0160c08c0161288d565b90505b61076461075e60c08c0160a08d0161278c565b82611c43565b7f93f6b8187e81bd7d01ce234c043cd6ae4feda2e2ae91daae0962c68a656da8c7338b848c8c8c8c886040516107a1989796959493929190613273565b60405180910390a1505060016000555050505050505050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156108055760405162461bcd60e51b815260040161016690613cab565b6001600054146108275760405162461bcd60e51b815260040161016690613a67565b506002546001600160a01b031690565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156108805760405162461bcd60e51b815260040161016690613cab565b6001600054146108a25760405162461bcd60e51b815260040161016690613a67565b600260005584306108b6602083018361278c565b6001600160a01b0316146108dc5760405162461bcd60e51b8152600401610166906134bc565b60006108e787611c99565b90506108f68187878787611cac565b60008181526006602052604090205460ff16156109255760405162461bcd60e51b8152600401610166906138c5565b6000818152600660209081526040808320805460ff1916600117905561095d91610953918b01908b0161278c565b8960600135611db6565b905060008111806109875750600061097b60c08a0160a08b0161278c565b6001600160a01b031614155b6109a35760405162461bcd60e51b8152600401610166906134f3565b6109cc6109b660408a0160208b0161278c565b6109c660608b0160408c0161278c565b83611dca565b60006109de60c08a0160a08b0161278c565b6001600160a01b031614610a5c576109fc60c0890160a08a0161278c565b6001600160a01b031663f50cd32c89836040518363ffffffff1660e01b8152600401610a29929190613dfc565b600060405180830381600087803b158015610a4357600080fd5b505af1158015610a57573d6000803e3d6000fd5b505050505b50506001600055505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610ab45760405162461bcd60e51b815260040161016690613cab565b6001546001600160a01b031615610add5760405162461bcd60e51b815260040161016690613bc2565b6001600160a01b03821615801590610afd57506001600160a01b03811615155b610b195760405162461bcd60e51b81526004016101669061384d565b806001600160a01b0316826001600160a01b03161415610b4b5760405162461bcd60e51b8152600401610166906135c2565b610b53611dfb565b600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b610b89612653565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610bd25760405162461bcd60e51b815260040161016690613cab565b600160005414610bf45760405162461bcd60e51b815260040161016690613a67565b506000908152600d60209081526040918290208251606081018452815481526001820154928101929092526002015460ff1615159181019190915290565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610c7b5760405162461bcd60e51b815260040161016690613cab565b600160005414610c9d5760405162461bcd60e51b815260040161016690613a67565b60026000558430610cb1602083018361278c565b6001600160a01b0316148015610ce957506001546001600160a01b0316610cde604083016020840161278c565b6001600160a01b0316145b8015610d1757506002546001600160a01b0316610d0c606083016040840161278c565b6001600160a01b0316145b610d335760405162461bcd60e51b815260040161016690613755565b83610d505760405162461bcd60e51b81526004016101669061371e565b83821115610d705760405162461bcd60e51b815260040161016690613bf2565b600754610d7c87611e02565b14610d995760405162461bcd60e51b815260040161016690613441565b610da1611e15565b610dbd5760405162461bcd60e51b815260040161016690613556565b60005b848110156110ed576000868683818110610dd657fe5b9050602002016020810190610deb919061278c565b9050600084831015610e7057858584818110610e0357fe5b905060200201359050888060600190610e1c9190613e27565b82818110610e2657fe5b9050602002016020810190610e3b919061278c565b6001600160a01b0316826001600160a01b031614610e6b5760405162461bcd60e51b815260040161016690613485565b610edc565b5060005b610e8160608a018a613e27565b9050811015610edc57610e9760608a018a613e27565b82818110610ea157fe5b9050602002016020810190610eb6919061278c565b6001600160a01b0316826001600160a01b03161415610ed457610edc565b600101610e74565b6000610eeb60608b018b613e27565b90508214610f1657610f0060e08b018b613e27565b83818110610f0a57fe5b90506020020135610f19565b60015b6001600160a01b0384166000908152600c60205260409020549091508111610f535760405162461bcd60e51b8152600401610166906137ce565b6001600160a01b0383166000908152600c6020526040812091909155610f7883611e32565b90506000610f8584611e4d565b9050610f8f61262e565b610f9c60608d018d613e27565b9050841415611026576040518060400160405280604051806040016040528086815260200185815250815260200160405180604001604052808f6020016020810190610fe8919061278c565b6001600160a01b03166001600160a01b031681526020018f6040016020810190611012919061278c565b6001600160a01b03169052905290506110d2565b61103360808d018d613e6d565b8581811061103d57fe5b905060800201803603810190611053919061288d565b905061109461106560a08e018e613e27565b8681811061106f57fe5b905060200201358403826000015160006002811061108957fe5b602002015190611e82565b8151526110cb6110a760c08e018e613e27565b868181106110b157fe5b905060200201358303826000015160016002811061108957fe5b8151602001525b6110dc8582611c43565b505060019093019250610dc0915050565b507f49cbb28c69ffbdb6b3893f83d64557662a5dd43ffd6045b6a5180ab0a027f2243387600788886040516111269594939291906131f4565b60405180910390a15050600160005550505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156111845760405162461bcd60e51b815260040161016690613cab565b6001600054146111a65760405162461bcd60e51b815260040161016690613a67565b6002600055336001600160a01b03831614806111d35750806001600160a01b0316826001600160a01b0316145b6111ef5760405162461bcd60e51b815260040161016690613b8b565b6001600160a01b038084166000908152600460209081526040808320938616835292905290812054611222908590611db6565b9050600081116112445760405162461bcd60e51b815260040161016690613ae2565b6001600160a01b038085166000908152600460209081526040808320938716835292905220546112749082611e9b565b6001600160a01b038086166000908152600460209081526040808320938816835292905220556112a5848383611dca565b505060016000555050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156112f95760405162461bcd60e51b815260040161016690613cab565b60016000541461131b5760405162461bcd60e51b815260040161016690613a67565b6002600055823061132f602083018361278c565b6001600160a01b0316146113555760405162461bcd60e51b81526004016101669061358d565b600061136085611bbf565b9050611373848460076002015484611edd565b61137b611e15565b6113975760405162461bcd60e51b815260040161016690613556565b6020808601356000908152600d909152604090206001810154156113cd5760405162461bcd60e51b815260040161016690613b42565b8181556113df42610140880135611c17565b60018201556040517f87b348a76dd4ef431d45553a1d8c5934db960e64201a5776ab64e3eb397f4cfa9061112690339089908590613247565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156114615760405162461bcd60e51b815260040161016690613cab565b6001600054146114835760405162461bcd60e51b815260040161016690613a67565b600260005561149182611f3f565b156114ba578034146114b55760405162461bcd60e51b8152600401610166906138fc565b611500565b34156114d85760405162461bcd60e51b815260040161016690613975565b6114e482333084611f4c565b6115005760405162461bcd60e51b815260040161016690613884565b6001600160a01b03821660009081526005602052604090819020805483019055517fb52926ac8ed62d53d4b88d81b71c48639bd63aa53950fcf3e1d7676ca7c26140906115509084908490613362565b60405180910390a150506001600055565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156115ac5760405162461bcd60e51b815260040161016690613cab565b6001600054146115ce5760405162461bcd60e51b815260040161016690613a67565b6115d782611e32565b92915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156116285760405162461bcd60e51b815260040161016690613cab565b60016000541461164a5760405162461bcd60e51b815260040161016690613a67565b6006600061165784611c99565b815260208101919091526040016000205460ff1692915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156116bc5760405162461bcd60e51b815260040161016690613cab565b6001600054146116de5760405162461bcd60e51b815260040161016690613a67565b6115d782611e4d565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156117305760405162461bcd60e51b815260040161016690613cab565b6001600054146117525760405162461bcd60e51b815260040161016690613a67565b60026000558430611766602083018361278c565b6001600160a01b031614801561179e57506001546001600160a01b0316611793604083016020840161278c565b6001600160a01b0316145b80156117cc57506002546001600160a01b03166117c1606083016040840161278c565b6001600160a01b0316145b6117e85760405162461bcd60e51b815260040161016690613755565b60006117f387611e02565b9050611803878288888888611f9f565b61180b611e15565b156118285760405162461bcd60e51b815260040161016690613556565b6008546101208801351161184e5760405162461bcd60e51b8152600401610166906135f9565b6118566120a9565b61188a5761186942610100890135611c17565b600a5561188661187f61010089013560026120b1565b4290611c17565b600b555b60078181556101208801356008556101408801356009556040517fef03cf86f2e77e1a0ae5cb25b50519e55b94788b920ace71f92341df2dab97ed916118d39133918b916131c1565b60405180910390a1505060016000555050505050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156119345760405162461bcd60e51b815260040161016690613cab565b6001600054146119565760405162461bcd60e51b815260040161016690613a67565b506001600160a01b031660009081526003602052604090205490565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156119bd5760405162461bcd60e51b815260040161016690613cab565b6001600054146119df5760405162461bcd60e51b815260040161016690613a67565b506001600160a01b03166000908152600c602052604090205490565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611a465760405162461bcd60e51b815260040161016690613cab565b600160005414611a685760405162461bcd60e51b815260040161016690613a67565b506001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611adf5760405162461bcd60e51b815260040161016690613cab565b600160005414611b015760405162461bcd60e51b815260040161016690613a67565b506001546001600160a01b031690565b611b19612673565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611b625760405162461bcd60e51b815260040161016690613cab565b600160005414611b845760405162461bcd60e51b815260040161016690613a67565b506040805160a0810182526007548152600854602082015260095491810191909152600a546060820152600b54608082015290565b60005481565b600081604051602001611bd29190613db7565b604051602081830303815290604052805190602001209050919050565b6000816001600160a01b0316611c0585856120eb565b6001600160a01b031614949350505050565b600082820183811015611c3c5760405162461bcd60e51b81526004016101669061369e565b9392505050565b60005b6002811015611c945781516000908260028110611c5f57fe5b602002015190508015611c8b57611c8b8484602001518460028110611c8057fe5b602002015183612103565b50600101611c46565b505050565b600081604051602001611bd29190613de9565b6000600186604051602001611cc29291906133df565b604051602081830303815290604052805190602001209050611d2885858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050600154859392506001600160a01b03169050611bef565b611d445760405162461bcd60e51b815260040161016690613b0b565b611d9283838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050600254859392506001600160a01b03169050611bef565b611dae5760405162461bcd60e51b815260040161016690613816565b505050505050565b6000611c3c82611dc585612164565b6121fb565b611dd48382612211565b611ddf838383612233565b611c945760405162461bcd60e51b815260040161016690613630565b6001600055565b600081604051602001611bd29190613da4565b60004260076003015411158015611e2d5750600b5442105b905090565b6001600160a01b031660009081526005602052604090205490565b6001600160a01b0381166000908152600560209081526040808320546003909252822054611e7a84612164565b010392915050565b600082820183811015611c3c576000195b949350505050565b6000611c3c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061225c565b611f1d8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508692508591506122889050565b611f395760405162461bcd60e51b815260040161016690613a9e565b50505050565b6001600160a01b03161590565b6000611f9685858585604051602401611f679392919061333e565b60408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b179052612325565b95945050505050565b60008086604051602001611fb49291906133df565b60405160208183030381529060405280519060200120905061201e85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120169250505060408a0160208b0161278c565b839190611bef565b61203a5760405162461bcd60e51b815260040161016690613c35565b61208483838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120169250505060608a0160408b0161278c565b6120a05760405162461bcd60e51b815260040161016690613667565b50505050505050565b600a54421090565b6000826120c0575060006115d7565b828202828482816120cd57fe5b0414611c3c5760405162461bcd60e51b8152600401610166906139fb565b6000806120f7846123d6565b9050611e9381846123e9565b6001600160a01b038084166000908152600460209081526040808320938616835292905220546121339082611e82565b6001600160a01b03938416600090815260046020908152604080832095909616825293909352929091209190915550565b600061216f82611f3f565b6121f4576040516370a0823160e01b81526001600160a01b038316906370a082319061219f9030906004016131ad565b60206040518083038186803b1580156121b757600080fd5b505afa1580156121cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ef9190612c9a565b6115d7565b5047919050565b600081831061220a5781611c3c565b5090919050565b6001600160a01b03909116600090815260036020526040902080549091019055565b600061223e84611f3f565b6122525761224d848484612517565b611e93565b611e938383612524565b600081848411156122805760405162461bcd60e51b815260040161016691906133f7565b505050900390565b600081815b855181101561231a5760008682815181106122a457fe5b602002602001015190508083116122e55782816040516020016122c892919061313f565b604051602081830303815290604052805190602001209250612311565b80836040516020016122f892919061313f565b6040516020818303038152906040528051906020012092505b5060010161228d565b509092149392505050565b60006123308361259c565b61234c5760405162461bcd60e51b815260040161016690613a3c565b60006060846001600160a01b031684604051612368919061315d565b6000604051808303816000865af19150503d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b50915091506123b982826125d5565b80511580611f96575080806020019051810190611f969190612855565b600081604051602001611bd29190613179565b6000815160411461240c5760405162461bcd60e51b81526004016101669061351f565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561245e5760405162461bcd60e51b81526004016101669061378c565b8060ff16601b1415801561247657508060ff16601c14155b156124935760405162461bcd60e51b815260040161016690613933565b6000600187838686604051600081526020016040526040516124b89493929190613386565b6020604051602081039080840390855afa1580156124da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661250d5760405162461bcd60e51b81526004016101669061340a565b9695505050505050565b6000611e938484846125e6565b6000806060846001600160a01b031684604051612540906131aa565b60006040518083038185875af1925050503d806000811461257d576040519150601f19603f3d011682016040523d82523d6000602084013e612582565b606091505b509150915061259182826125d5565b506001949350505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611e93575050151592915050565b816125e257805160208201fd5b5050565b6000611e938484846040516024016125ff929190613362565b60408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b179052612325565b60405180604001604052806126416126a1565b815260200161264e6126a1565b905290565b604080516060810182526000808252602082018190529181019190915290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60405180604001604052806002906020820280368337509192915050565b80356115d781613fac565b60008083601f8401126126db578182fd5b5081356001600160401b038111156126f1578182fd5b602083019150836020808302850101111561270b57600080fd5b9250929050565b60008083601f840112612723578182fd5b5081356001600160401b03811115612739578182fd5b60208301915083602082850101111561270b57600080fd5b60006101608284031215612763578081fd5b50919050565b60006101808284031215612763578081fd5b600060e08284031215612763578081fd5b60006020828403121561279d578081fd5b8135611c3c81613fac565b600080604083850312156127ba578081fd5b82356127c581613fac565b915060208301356127d581613fac565b809150509250929050565b6000806000606084860312156127f4578081fd5b83356127ff81613fac565b9250602084013561280f81613fac565b9150604084013561281f81613fac565b809150509250925092565b6000806040838503121561283c578182fd5b823561284781613fac565b946020939093013593505050565b600060208284031215612866578081fd5b81518015158114611c3c578182fd5b600060208284031215612886578081fd5b5035919050565b60006080828403121561289e578081fd5b6128a86040613eb3565b83601f8401126128b6578182fd5b6128c06040613eb3565b808460408601878111156128d2578586fd5b855b60028110156128f35782358552602094850194909201916001016128d4565b5082855287605f880112612905578586fd5b61290f6040613eb3565b9350839250905060808601871015612925578485fd5b845b600281101561295057813561293b81613fac565b84526020938401939190910190600101612927565b50506020830152509392505050565b600060808284031215612970578081fd5b61297a6040613eb3565b83601f840112612988578182fd5b6129926040613eb3565b808460408601878111156129a4578586fd5b855b60028110156129c55782518552602094850194909201916001016129a6565b5082855287605f8801126129d7578586fd5b6129e16040613eb3565b93508392509050608086018710156129f7578485fd5b845b6002811015612950578151612a0d81613fac565b845260209384019391909101906001016129f9565b600080600080600060608688031215612a39578283fd5b85356001600160401b0380821115612a4f578485fd5b612a5b89838a01612751565b96506020880135915080821115612a70578485fd5b612a7c89838a016126ca565b90965094506040880135915080821115612a94578283fd5b50612aa1888289016126ca565b969995985093965092949392505050565b600080600080600060608688031215612ac9578283fd5b85356001600160401b0380821115612adf578485fd5b612aeb89838a01612751565b96506020880135915080821115612b00578485fd5b612b0c89838a01612712565b90965094506040880135915080821115612b24578283fd5b50612aa188828901612712565b60008060006101a08486031215612b46578081fd5b612b508585612769565b92506101808401356001600160401b03811115612b6b578182fd5b612b77868287016126ca565b9497909650939450505050565b60008060008060008060006101e0888a031215612b9f578485fd5b612ba98989612769565b96506101808801356001600160401b0380821115612bc5578687fd5b612bd18b838c01612712565b90985096506101a08a0135915080821115612bea578384fd5b612bf68b838c01612712565b90965094506101c08a0135915080821115612c0f578384fd5b50612c1c8a828b01612712565b989b979a50959850939692959293505050565b600060208284031215612c40578081fd5b81356001600160401b03811115612c55578182fd5b611e938482850161277b565b600080600080600060608688031215612c78578283fd5b85356001600160401b0380821115612c8e578485fd5b612aeb89838a0161277b565b600060208284031215612cab578081fd5b5051919050565b6001600160a01b03169052565b60008284526020808501945082825b85811015612cfc578135612ce181613fac565b6001600160a01b031687529582019590820190600101612cce565b509495945050505050565b60008284526020808501945082825b85811015612cfc576040808389378781018581529083019085905b6002821015612d62578235612d4581613fac565b6001600160a01b0316815291850191600191909101908501612d31565b5050506080968701969190910190600101612d16565b81835260006001600160fb1b03831115612d90578081fd5b6020830280836020870137939093016020019283525090919050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612dee816020860160208601613f80565b601f01601f19169290920160200192915050565b604081833760006040838101828152908301915b6002811015612e475760208335612e2c81613fac565b6001600160a01b031683529283019290910190600101612e16565b5050505050565b8054825260018101546020830152600281015460408301526003810154606083015260040154608090910152565b600061016060208301612e9885612e9383876126bf565b612cb2565b612ea28185613ed9565b9050612eb16020860182612cb2565b50612ebf6040840184613ed9565b612ecc6040860182612cb2565b50612eda6060840184613ee6565b826060870152612eed8387018284612cbf565b92505050612efe6080840184613f2d565b8583036080870152612f11838284612d07565b92505050612f2260a0840184613ee6565b85830360a0870152612f35838284612d78565b92505050612f4660c0840184613ee6565b85830360c0870152612f59838284612d78565b92505050612f6a60e0840184613ee6565b85830360e0870152612f7d838284612d78565b6101008681013590880152610120808701359088015261014095860135959096019490945250929392505050565b8035612fb681613fac565b6001600160a01b03908116835260208281013590840152604082013590612fdc82613fac565b166040830152612fef6060820182613ed9565b612ffc6060840182612cb2565b5061300a6080820182613ed9565b6130176080840182612cb2565b5061302560a0820182613ed9565b61303260a0840182612cb2565b5061304360c0830160c08301612e02565b610140818101359083015261016090810135910152565b80548252600181015460208301526002015460ff161515604090910152565b6000813561308681613fac565b6001600160a01b0390811684526020830135906130a282613fac565b90811660208501526040830135906130b982613fac565b8082166040860152606084013560608601526080840135608086015260a084013591506130e582613fac565b1660a084015260c082013536839003601e19018112613102578182fd5b820180356001600160401b03811115613119578283fd5b803603841315613127578283fd5b60e060c0860152611f9660e086018260208501612dac565b918252602082015260400190565b6000828483379101908152919050565b6000825161316f818460208701613f80565b9190910192915050565b7f16566563746f72205369676e6564204d6573736167653a0a33320000000000008152601a810191909152603a0190565b90565b6001600160a01b0391909116815260200190565b6001600160a01b038416815260e0602082018190526000906131e590830185612e7c565b9050611e936040830184612e4e565b6001600160a01b03861681526101006020820181905260009061321983820188612e7c565b90506132286040840187612e4e565b82810360e084015261323b818587612cbf565b98975050505050505050565b6001600160a01b038416815261020081016132656020830185612fab565b611e936101a083018461305a565b6001600160a01b038916815260006102c060206132928185018c612fab565b6132a06101a085018b61305a565b816102008501526132b4828501898b612dac565b91508382036102208501526132ca828789612dac565b85519093509150600061024085015b60028210156132f85783518152928201926001919091019082016132d9565b5050808501519150610280840160005b600281101561332d5761331b8451613f74565b82529282019290820190600101613308565b505050509998505050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000606082526133b76060830188612dd6565b82810360208401526133ca818789612dac565b9050828103604084015261323b818587612dac565b60408101600284106133ed57fe5b9281526020015290565b600060208252611c3c6020830184612dd6565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526024908201527f434d4341646a7564696361746f723a20494e56414c49445f4348414e4e454c5f60408201526309082a6960e31b606082015260800190565b6020808252601e908201527f434d4341646a7564696361746f723a20494e4445585f4d49534d415443480000604082015260600190565b6020808252601d908201527f434d4357697468647261773a204348414e4e454c5f4d49534d41544348000000604082015260600190565b6020808252601290820152710434d4357697468647261773a204e4f5f4f560741b604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252601d908201527f434d4341646a7564696361746f723a20494e56414c49445f5048415345000000604082015260600190565b6020808252818101527f434d4341646a7564696361746f723a20494e56414c49445f5452414e53464552604082015260600190565b6020808252601f908201527f434d43436f72653a204944454e544943414c5f5041525449434950414e545300604082015260600190565b6020808252601d908201527f434d4341646a7564696361746f723a20494e56414c49445f4e4f4e4345000000604082015260600190565b60208082526019908201527f434d4341737365743a205452414e534645525f4641494c454400000000000000604082015260600190565b6020808252601f908201527f434d4341646a7564696361746f723a20494e56414c49445f424f425f53494700604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526029908201527f434d4341646a7564696361746f723a205452414e534645525f414c524541445960408201526817d11151955391115160ba1b606082015260800190565b6020808252601f908201527f434d4341646a7564696361746f723a204e4f5f4153534554535f474956454e00604082015260600190565b6020808252601f908201527f434d4341646a7564696361746f723a20494e56414c49445f4348414e4e454c00604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526028908201527f434d4341646a7564696361746f723a204348414e4e454c5f414c52454144595f604082015267111151955391115160c21b606082015260800190565b6020808252601c908201527f434d4357697468647261773a20494e56414c49445f424f425f53494700000000604082015260600190565b6020808252601c908201527f434d43436f72653a20494e56414c49445f5041525449434950414e5400000000604082015260600190565b60208082526021908201527f434d434465706f7369743a2045524332305f5452414e534645525f4641494c456040820152601160fa1b606082015260800190565b6020808252601d908201527f434d4357697468647261773a20414c52454144595f4558454355544544000000604082015260600190565b6020808252601a908201527f434d434465706f7369743a2056414c55455f4d49534d41544348000000000000604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b60208082526021908201527f434d434465706f7369743a204554485f574954485f4552435f5452414e5346456040820152602960f91b606082015260800190565b60208082526025908201527f434d4341646a7564696361746f723a205452414e534645525f4e4f545f444953604082015264141555115160da1b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601190820152704c696245524332303a204e4f5f434f444560781b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a205245454e5452414e545f43414c4c00604082015260600190565b60208082526024908201527f434d4341646a7564696361746f723a20494e56414c49445f4d45524b4c455f506040820152632927a7a360e11b606082015260800190565b6020808252600f908201526e0434d4341737365743a204e4f5f4f5608c1b604082015260600190565b6020808252601e908201527f434d4357697468647261773a20494e56414c49445f414c4943455f5349470000604082015260600190565b60208082526029908201527f434d4341646a7564696361746f723a205452414e534645525f414c524541445960408201526817d11254d41555115160ba1b606082015260800190565b60208082526018908201527f434d4341737365743a204f574e45525f4d49534d415443480000000000000000604082015260600190565b6020808252601690820152750434d43436f72653a20414c52454144595f53455455560541b604082015260600190565b60208082526023908201527f434d4341646a7564696361746f723a2057524f4e475f41525241595f4c454e4760408201526254485360e81b606082015260800190565b60208082526021908201527f434d4341646a7564696361746f723a20494e56414c49445f414c4943455f53496040820152604760f81b606082015260800190565b6020808252818101527f434d4341646a7564696361746f723a20494e56414c49445f5245534f4c564552604082015260600190565b6020808252601a908201527f4d6173746572636f70793a204f4e4c595f5649415f50524f5859000000000000604082015260600190565b6020808252818101527f434d4341646a7564696361746f723a20494e56414c49445f42414c414e434553604082015260600190565b60208082526025908201527f434d4341646a7564696361746f723a20494e56414c49445f5452414e534645526040820152640be9082a6960db1b606082015260800190565b608081016115d78284612e02565b600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b600060208252611c3c6020830184612e7c565b61018081016115d78284612fab565b815181526020808301519082015260409182015115159181019190915260600190565b600060208252611c3c6020830184613079565b600060408252613e0f6040830185613079565b90508260208301529392505050565b90815260200190565b6000808335601e19843603018112613e3d578283fd5b8301803591506001600160401b03821115613e56578283fd5b602090810192508102360382131561270b57600080fd5b6000808335601e19843603018112613e83578283fd5b8301803591506001600160401b03821115613e9c578283fd5b602001915060808102360382131561270b57600080fd5b6040518181016001600160401b0381118282101715613ed157600080fd5b604052919050565b60008235611c3c81613fac565b6000808335601e19843603018112613efc578283fd5b83016020810192503590506001600160401b03811115613f1b57600080fd5b60208102360383131561270b57600080fd5b6000808335601e19843603018112613f43578283fd5b83016020810192503590506001600160401b03811115613f6257600080fd5b60808102360383131561270b57600080fd5b6001600160a01b031690565b60005b83811015613f9b578181015183820152602001613f83565b83811115611f395750506000910152565b6001600160a01b0381168114613fc157600080fd5b5056fea26469706673582212200c5761a7a244ea0132fa44dddcf0e7db8a07d95db5eae27e73fff5d050f1145c64736f6c63430007010033",
    "deployedBytecode": "0x6080604052600436106101185760003560e01c80636f33389e116100a0578063e7283a8d11610064578063e7283a8d14610384578063e9852569146103a4578063eeb30fea146103c4578063f19eb10e146103d9578063f83d08ba146103fb57610198565b80636f33389e146102ca5780638c048fc2146102f7578063b081e9c814610324578063c60939be14610344578063cefa51221461036457610198565b80633ff0da16116100e75780633ff0da161461022a5780634d3fcbda146102575780635bc9d96d146102775780635fd334d914610297578063635ae901146102b757610198565b8063072f25fd1461019d578063241686a0146101bf5780632c889aa1146101ea5780632d34ba791461020a57610198565b3661019857306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561016f5760405162461bcd60e51b815260040161016690613cab565b60405180910390fd5b6001600054146101915760405162461bcd60e51b815260040161016690613a67565b6001600055005b600080fd5b3480156101a957600080fd5b506101bd6101b8366004612b84565b610410565b005b3480156101cb57600080fd5b506101d46107ba565b6040516101e191906131ad565b60405180910390f35b3480156101f657600080fd5b506101bd610205366004612c61565b610837565b34801561021657600080fd5b506101bd6102253660046127a8565b610a6b565b34801561023657600080fd5b5061024a610245366004612875565b610b81565b6040516101e19190613dc6565b34801561026357600080fd5b506101bd610272366004612a22565b610c32565b34801561028357600080fd5b506101bd6102923660046127e0565b61113b565b3480156102a357600080fd5b506101bd6102b2366004612b31565b6112b0565b6101bd6102c536600461282a565b611418565b3480156102d657600080fd5b506102ea6102e536600461278c565b611561565b6040516101e19190613e1e565b34801561030357600080fd5b50610317610312366004612c2f565b6115dd565b6040516101e1919061337b565b34801561033057600080fd5b506102ea61033f36600461278c565b611671565b34801561035057600080fd5b506101bd61035f366004612ab2565b6116e7565b34801561037057600080fd5b506102ea61037f36600461278c565b6118e9565b34801561039057600080fd5b506102ea61039f36600461278c565b611972565b3480156103b057600080fd5b506102ea6103bf3660046127a8565b6119fb565b3480156103d057600080fd5b506101d4611a94565b3480156103e557600080fd5b506103ee611b11565b6040516101e19190613d6a565b34801561040757600080fd5b506102ea611bb9565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156104595760405162461bcd60e51b815260040161016690613cab565b60016000541461047b5760405162461bcd60e51b815260040161016690613a67565b6002600055863061048f602083018361278c565b6001600160a01b0316146104b55760405162461bcd60e51b81526004016101669061358d565b6020808901356000908152600d9091526040902060018101546104ea5760405162461bcd60e51b8152600401610166906139b6565b80546104f58a611bbf565b146105125760405162461bcd60e51b815260040161016690613d17565b600281015460ff16156105375760405162461bcd60e51b8152600401610166906136d5565b60028101805460ff1916600117905561054e61262e565b816001015442101561073657896101600135898960405161057092919061314d565b6040518091039020146105955760405162461bcd60e51b815260040161016690613d17565b6105a560a08b0160808c0161278c565b6001600160a01b0316336001600160a01b03161480610616575061061685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106099250505060a08d0160808e0161278c565b6101608d01359190611bef565b6106325760405162461bcd60e51b815260040161016690613c76565b600061064460608c0160408d0161278c565b9050806001600160a01b0316638ef98a7e8c60c0016040516020016106699190613d5c565b6040516020818303038152906040528c8c8c8c6040518663ffffffff1660e01b815260040161069c9594939291906133a4565b60806040518083038186803b1580156106b457600080fd5b505afa1580156106c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ec919061295f565b915061070060c08c013560e08d0135611c17565b82516020810151905161071291611c17565b11156107305760405162461bcd60e51b815260040161016690613ce2565b5061074b565b610748368b90038b0160c08c0161288d565b90505b61076461075e60c08c0160a08d0161278c565b82611c43565b7f93f6b8187e81bd7d01ce234c043cd6ae4feda2e2ae91daae0962c68a656da8c7338b848c8c8c8c886040516107a1989796959493929190613273565b60405180910390a1505060016000555050505050505050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156108055760405162461bcd60e51b815260040161016690613cab565b6001600054146108275760405162461bcd60e51b815260040161016690613a67565b506002546001600160a01b031690565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156108805760405162461bcd60e51b815260040161016690613cab565b6001600054146108a25760405162461bcd60e51b815260040161016690613a67565b600260005584306108b6602083018361278c565b6001600160a01b0316146108dc5760405162461bcd60e51b8152600401610166906134bc565b60006108e787611c99565b90506108f68187878787611cac565b60008181526006602052604090205460ff16156109255760405162461bcd60e51b8152600401610166906138c5565b6000818152600660209081526040808320805460ff1916600117905561095d91610953918b01908b0161278c565b8960600135611db6565b905060008111806109875750600061097b60c08a0160a08b0161278c565b6001600160a01b031614155b6109a35760405162461bcd60e51b8152600401610166906134f3565b6109cc6109b660408a0160208b0161278c565b6109c660608b0160408c0161278c565b83611dca565b60006109de60c08a0160a08b0161278c565b6001600160a01b031614610a5c576109fc60c0890160a08a0161278c565b6001600160a01b031663f50cd32c89836040518363ffffffff1660e01b8152600401610a29929190613dfc565b600060405180830381600087803b158015610a4357600080fd5b505af1158015610a57573d6000803e3d6000fd5b505050505b50506001600055505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610ab45760405162461bcd60e51b815260040161016690613cab565b6001546001600160a01b031615610add5760405162461bcd60e51b815260040161016690613bc2565b6001600160a01b03821615801590610afd57506001600160a01b03811615155b610b195760405162461bcd60e51b81526004016101669061384d565b806001600160a01b0316826001600160a01b03161415610b4b5760405162461bcd60e51b8152600401610166906135c2565b610b53611dfb565b600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b610b89612653565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610bd25760405162461bcd60e51b815260040161016690613cab565b600160005414610bf45760405162461bcd60e51b815260040161016690613a67565b506000908152600d60209081526040918290208251606081018452815481526001820154928101929092526002015460ff1615159181019190915290565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610c7b5760405162461bcd60e51b815260040161016690613cab565b600160005414610c9d5760405162461bcd60e51b815260040161016690613a67565b60026000558430610cb1602083018361278c565b6001600160a01b0316148015610ce957506001546001600160a01b0316610cde604083016020840161278c565b6001600160a01b0316145b8015610d1757506002546001600160a01b0316610d0c606083016040840161278c565b6001600160a01b0316145b610d335760405162461bcd60e51b815260040161016690613755565b83610d505760405162461bcd60e51b81526004016101669061371e565b83821115610d705760405162461bcd60e51b815260040161016690613bf2565b600754610d7c87611e02565b14610d995760405162461bcd60e51b815260040161016690613441565b610da1611e15565b610dbd5760405162461bcd60e51b815260040161016690613556565b60005b848110156110ed576000868683818110610dd657fe5b9050602002016020810190610deb919061278c565b9050600084831015610e7057858584818110610e0357fe5b905060200201359050888060600190610e1c9190613e27565b82818110610e2657fe5b9050602002016020810190610e3b919061278c565b6001600160a01b0316826001600160a01b031614610e6b5760405162461bcd60e51b815260040161016690613485565b610edc565b5060005b610e8160608a018a613e27565b9050811015610edc57610e9760608a018a613e27565b82818110610ea157fe5b9050602002016020810190610eb6919061278c565b6001600160a01b0316826001600160a01b03161415610ed457610edc565b600101610e74565b6000610eeb60608b018b613e27565b90508214610f1657610f0060e08b018b613e27565b83818110610f0a57fe5b90506020020135610f19565b60015b6001600160a01b0384166000908152600c60205260409020549091508111610f535760405162461bcd60e51b8152600401610166906137ce565b6001600160a01b0383166000908152600c6020526040812091909155610f7883611e32565b90506000610f8584611e4d565b9050610f8f61262e565b610f9c60608d018d613e27565b9050841415611026576040518060400160405280604051806040016040528086815260200185815250815260200160405180604001604052808f6020016020810190610fe8919061278c565b6001600160a01b03166001600160a01b031681526020018f6040016020810190611012919061278c565b6001600160a01b03169052905290506110d2565b61103360808d018d613e6d565b8581811061103d57fe5b905060800201803603810190611053919061288d565b905061109461106560a08e018e613e27565b8681811061106f57fe5b905060200201358403826000015160006002811061108957fe5b602002015190611e82565b8151526110cb6110a760c08e018e613e27565b868181106110b157fe5b905060200201358303826000015160016002811061108957fe5b8151602001525b6110dc8582611c43565b505060019093019250610dc0915050565b507f49cbb28c69ffbdb6b3893f83d64557662a5dd43ffd6045b6a5180ab0a027f2243387600788886040516111269594939291906131f4565b60405180910390a15050600160005550505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156111845760405162461bcd60e51b815260040161016690613cab565b6001600054146111a65760405162461bcd60e51b815260040161016690613a67565b6002600055336001600160a01b03831614806111d35750806001600160a01b0316826001600160a01b0316145b6111ef5760405162461bcd60e51b815260040161016690613b8b565b6001600160a01b038084166000908152600460209081526040808320938616835292905290812054611222908590611db6565b9050600081116112445760405162461bcd60e51b815260040161016690613ae2565b6001600160a01b038085166000908152600460209081526040808320938716835292905220546112749082611e9b565b6001600160a01b038086166000908152600460209081526040808320938816835292905220556112a5848383611dca565b505060016000555050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156112f95760405162461bcd60e51b815260040161016690613cab565b60016000541461131b5760405162461bcd60e51b815260040161016690613a67565b6002600055823061132f602083018361278c565b6001600160a01b0316146113555760405162461bcd60e51b81526004016101669061358d565b600061136085611bbf565b9050611373848460076002015484611edd565b61137b611e15565b6113975760405162461bcd60e51b815260040161016690613556565b6020808601356000908152600d909152604090206001810154156113cd5760405162461bcd60e51b815260040161016690613b42565b8181556113df42610140880135611c17565b60018201556040517f87b348a76dd4ef431d45553a1d8c5934db960e64201a5776ab64e3eb397f4cfa9061112690339089908590613247565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156114615760405162461bcd60e51b815260040161016690613cab565b6001600054146114835760405162461bcd60e51b815260040161016690613a67565b600260005561149182611f3f565b156114ba578034146114b55760405162461bcd60e51b8152600401610166906138fc565b611500565b34156114d85760405162461bcd60e51b815260040161016690613975565b6114e482333084611f4c565b6115005760405162461bcd60e51b815260040161016690613884565b6001600160a01b03821660009081526005602052604090819020805483019055517fb52926ac8ed62d53d4b88d81b71c48639bd63aa53950fcf3e1d7676ca7c26140906115509084908490613362565b60405180910390a150506001600055565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156115ac5760405162461bcd60e51b815260040161016690613cab565b6001600054146115ce5760405162461bcd60e51b815260040161016690613a67565b6115d782611e32565b92915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156116285760405162461bcd60e51b815260040161016690613cab565b60016000541461164a5760405162461bcd60e51b815260040161016690613a67565b6006600061165784611c99565b815260208101919091526040016000205460ff1692915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156116bc5760405162461bcd60e51b815260040161016690613cab565b6001600054146116de5760405162461bcd60e51b815260040161016690613a67565b6115d782611e4d565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156117305760405162461bcd60e51b815260040161016690613cab565b6001600054146117525760405162461bcd60e51b815260040161016690613a67565b60026000558430611766602083018361278c565b6001600160a01b031614801561179e57506001546001600160a01b0316611793604083016020840161278c565b6001600160a01b0316145b80156117cc57506002546001600160a01b03166117c1606083016040840161278c565b6001600160a01b0316145b6117e85760405162461bcd60e51b815260040161016690613755565b60006117f387611e02565b9050611803878288888888611f9f565b61180b611e15565b156118285760405162461bcd60e51b815260040161016690613556565b6008546101208801351161184e5760405162461bcd60e51b8152600401610166906135f9565b6118566120a9565b61188a5761186942610100890135611c17565b600a5561188661187f61010089013560026120b1565b4290611c17565b600b555b60078181556101208801356008556101408801356009556040517fef03cf86f2e77e1a0ae5cb25b50519e55b94788b920ace71f92341df2dab97ed916118d39133918b916131c1565b60405180910390a1505060016000555050505050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156119345760405162461bcd60e51b815260040161016690613cab565b6001600054146119565760405162461bcd60e51b815260040161016690613a67565b506001600160a01b031660009081526003602052604090205490565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156119bd5760405162461bcd60e51b815260040161016690613cab565b6001600054146119df5760405162461bcd60e51b815260040161016690613a67565b506001600160a01b03166000908152600c602052604090205490565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611a465760405162461bcd60e51b815260040161016690613cab565b600160005414611a685760405162461bcd60e51b815260040161016690613a67565b506001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611adf5760405162461bcd60e51b815260040161016690613cab565b600160005414611b015760405162461bcd60e51b815260040161016690613a67565b506001546001600160a01b031690565b611b19612673565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611b625760405162461bcd60e51b815260040161016690613cab565b600160005414611b845760405162461bcd60e51b815260040161016690613a67565b506040805160a0810182526007548152600854602082015260095491810191909152600a546060820152600b54608082015290565b60005481565b600081604051602001611bd29190613db7565b604051602081830303815290604052805190602001209050919050565b6000816001600160a01b0316611c0585856120eb565b6001600160a01b031614949350505050565b600082820183811015611c3c5760405162461bcd60e51b81526004016101669061369e565b9392505050565b60005b6002811015611c945781516000908260028110611c5f57fe5b602002015190508015611c8b57611c8b8484602001518460028110611c8057fe5b602002015183612103565b50600101611c46565b505050565b600081604051602001611bd29190613de9565b6000600186604051602001611cc29291906133df565b604051602081830303815290604052805190602001209050611d2885858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050600154859392506001600160a01b03169050611bef565b611d445760405162461bcd60e51b815260040161016690613b0b565b611d9283838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050600254859392506001600160a01b03169050611bef565b611dae5760405162461bcd60e51b815260040161016690613816565b505050505050565b6000611c3c82611dc585612164565b6121fb565b611dd48382612211565b611ddf838383612233565b611c945760405162461bcd60e51b815260040161016690613630565b6001600055565b600081604051602001611bd29190613da4565b60004260076003015411158015611e2d5750600b5442105b905090565b6001600160a01b031660009081526005602052604090205490565b6001600160a01b0381166000908152600560209081526040808320546003909252822054611e7a84612164565b010392915050565b600082820183811015611c3c576000195b949350505050565b6000611c3c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061225c565b611f1d8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508692508591506122889050565b611f395760405162461bcd60e51b815260040161016690613a9e565b50505050565b6001600160a01b03161590565b6000611f9685858585604051602401611f679392919061333e565b60408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b179052612325565b95945050505050565b60008086604051602001611fb49291906133df565b60405160208183030381529060405280519060200120905061201e85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120169250505060408a0160208b0161278c565b839190611bef565b61203a5760405162461bcd60e51b815260040161016690613c35565b61208483838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120169250505060608a0160408b0161278c565b6120a05760405162461bcd60e51b815260040161016690613667565b50505050505050565b600a54421090565b6000826120c0575060006115d7565b828202828482816120cd57fe5b0414611c3c5760405162461bcd60e51b8152600401610166906139fb565b6000806120f7846123d6565b9050611e9381846123e9565b6001600160a01b038084166000908152600460209081526040808320938616835292905220546121339082611e82565b6001600160a01b03938416600090815260046020908152604080832095909616825293909352929091209190915550565b600061216f82611f3f565b6121f4576040516370a0823160e01b81526001600160a01b038316906370a082319061219f9030906004016131ad565b60206040518083038186803b1580156121b757600080fd5b505afa1580156121cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ef9190612c9a565b6115d7565b5047919050565b600081831061220a5781611c3c565b5090919050565b6001600160a01b03909116600090815260036020526040902080549091019055565b600061223e84611f3f565b6122525761224d848484612517565b611e93565b611e938383612524565b600081848411156122805760405162461bcd60e51b815260040161016691906133f7565b505050900390565b600081815b855181101561231a5760008682815181106122a457fe5b602002602001015190508083116122e55782816040516020016122c892919061313f565b604051602081830303815290604052805190602001209250612311565b80836040516020016122f892919061313f565b6040516020818303038152906040528051906020012092505b5060010161228d565b509092149392505050565b60006123308361259c565b61234c5760405162461bcd60e51b815260040161016690613a3c565b60006060846001600160a01b031684604051612368919061315d565b6000604051808303816000865af19150503d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b50915091506123b982826125d5565b80511580611f96575080806020019051810190611f969190612855565b600081604051602001611bd29190613179565b6000815160411461240c5760405162461bcd60e51b81526004016101669061351f565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561245e5760405162461bcd60e51b81526004016101669061378c565b8060ff16601b1415801561247657508060ff16601c14155b156124935760405162461bcd60e51b815260040161016690613933565b6000600187838686604051600081526020016040526040516124b89493929190613386565b6020604051602081039080840390855afa1580156124da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661250d5760405162461bcd60e51b81526004016101669061340a565b9695505050505050565b6000611e938484846125e6565b6000806060846001600160a01b031684604051612540906131aa565b60006040518083038185875af1925050503d806000811461257d576040519150601f19603f3d011682016040523d82523d6000602084013e612582565b606091505b509150915061259182826125d5565b506001949350505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611e93575050151592915050565b816125e257805160208201fd5b5050565b6000611e938484846040516024016125ff929190613362565b60408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b179052612325565b60405180604001604052806126416126a1565b815260200161264e6126a1565b905290565b604080516060810182526000808252602082018190529181019190915290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60405180604001604052806002906020820280368337509192915050565b80356115d781613fac565b60008083601f8401126126db578182fd5b5081356001600160401b038111156126f1578182fd5b602083019150836020808302850101111561270b57600080fd5b9250929050565b60008083601f840112612723578182fd5b5081356001600160401b03811115612739578182fd5b60208301915083602082850101111561270b57600080fd5b60006101608284031215612763578081fd5b50919050565b60006101808284031215612763578081fd5b600060e08284031215612763578081fd5b60006020828403121561279d578081fd5b8135611c3c81613fac565b600080604083850312156127ba578081fd5b82356127c581613fac565b915060208301356127d581613fac565b809150509250929050565b6000806000606084860312156127f4578081fd5b83356127ff81613fac565b9250602084013561280f81613fac565b9150604084013561281f81613fac565b809150509250925092565b6000806040838503121561283c578182fd5b823561284781613fac565b946020939093013593505050565b600060208284031215612866578081fd5b81518015158114611c3c578182fd5b600060208284031215612886578081fd5b5035919050565b60006080828403121561289e578081fd5b6128a86040613eb3565b83601f8401126128b6578182fd5b6128c06040613eb3565b808460408601878111156128d2578586fd5b855b60028110156128f35782358552602094850194909201916001016128d4565b5082855287605f880112612905578586fd5b61290f6040613eb3565b9350839250905060808601871015612925578485fd5b845b600281101561295057813561293b81613fac565b84526020938401939190910190600101612927565b50506020830152509392505050565b600060808284031215612970578081fd5b61297a6040613eb3565b83601f840112612988578182fd5b6129926040613eb3565b808460408601878111156129a4578586fd5b855b60028110156129c55782518552602094850194909201916001016129a6565b5082855287605f8801126129d7578586fd5b6129e16040613eb3565b93508392509050608086018710156129f7578485fd5b845b6002811015612950578151612a0d81613fac565b845260209384019391909101906001016129f9565b600080600080600060608688031215612a39578283fd5b85356001600160401b0380821115612a4f578485fd5b612a5b89838a01612751565b96506020880135915080821115612a70578485fd5b612a7c89838a016126ca565b90965094506040880135915080821115612a94578283fd5b50612aa1888289016126ca565b969995985093965092949392505050565b600080600080600060608688031215612ac9578283fd5b85356001600160401b0380821115612adf578485fd5b612aeb89838a01612751565b96506020880135915080821115612b00578485fd5b612b0c89838a01612712565b90965094506040880135915080821115612b24578283fd5b50612aa188828901612712565b60008060006101a08486031215612b46578081fd5b612b508585612769565b92506101808401356001600160401b03811115612b6b578182fd5b612b77868287016126ca565b9497909650939450505050565b60008060008060008060006101e0888a031215612b9f578485fd5b612ba98989612769565b96506101808801356001600160401b0380821115612bc5578687fd5b612bd18b838c01612712565b90985096506101a08a0135915080821115612bea578384fd5b612bf68b838c01612712565b90965094506101c08a0135915080821115612c0f578384fd5b50612c1c8a828b01612712565b989b979a50959850939692959293505050565b600060208284031215612c40578081fd5b81356001600160401b03811115612c55578182fd5b611e938482850161277b565b600080600080600060608688031215612c78578283fd5b85356001600160401b0380821115612c8e578485fd5b612aeb89838a0161277b565b600060208284031215612cab578081fd5b5051919050565b6001600160a01b03169052565b60008284526020808501945082825b85811015612cfc578135612ce181613fac565b6001600160a01b031687529582019590820190600101612cce565b509495945050505050565b60008284526020808501945082825b85811015612cfc576040808389378781018581529083019085905b6002821015612d62578235612d4581613fac565b6001600160a01b0316815291850191600191909101908501612d31565b5050506080968701969190910190600101612d16565b81835260006001600160fb1b03831115612d90578081fd5b6020830280836020870137939093016020019283525090919050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612dee816020860160208601613f80565b601f01601f19169290920160200192915050565b604081833760006040838101828152908301915b6002811015612e475760208335612e2c81613fac565b6001600160a01b031683529283019290910190600101612e16565b5050505050565b8054825260018101546020830152600281015460408301526003810154606083015260040154608090910152565b600061016060208301612e9885612e9383876126bf565b612cb2565b612ea28185613ed9565b9050612eb16020860182612cb2565b50612ebf6040840184613ed9565b612ecc6040860182612cb2565b50612eda6060840184613ee6565b826060870152612eed8387018284612cbf565b92505050612efe6080840184613f2d565b8583036080870152612f11838284612d07565b92505050612f2260a0840184613ee6565b85830360a0870152612f35838284612d78565b92505050612f4660c0840184613ee6565b85830360c0870152612f59838284612d78565b92505050612f6a60e0840184613ee6565b85830360e0870152612f7d838284612d78565b6101008681013590880152610120808701359088015261014095860135959096019490945250929392505050565b8035612fb681613fac565b6001600160a01b03908116835260208281013590840152604082013590612fdc82613fac565b166040830152612fef6060820182613ed9565b612ffc6060840182612cb2565b5061300a6080820182613ed9565b6130176080840182612cb2565b5061302560a0820182613ed9565b61303260a0840182612cb2565b5061304360c0830160c08301612e02565b610140818101359083015261016090810135910152565b80548252600181015460208301526002015460ff161515604090910152565b6000813561308681613fac565b6001600160a01b0390811684526020830135906130a282613fac565b90811660208501526040830135906130b982613fac565b8082166040860152606084013560608601526080840135608086015260a084013591506130e582613fac565b1660a084015260c082013536839003601e19018112613102578182fd5b820180356001600160401b03811115613119578283fd5b803603841315613127578283fd5b60e060c0860152611f9660e086018260208501612dac565b918252602082015260400190565b6000828483379101908152919050565b6000825161316f818460208701613f80565b9190910192915050565b7f16566563746f72205369676e6564204d6573736167653a0a33320000000000008152601a810191909152603a0190565b90565b6001600160a01b0391909116815260200190565b6001600160a01b038416815260e0602082018190526000906131e590830185612e7c565b9050611e936040830184612e4e565b6001600160a01b03861681526101006020820181905260009061321983820188612e7c565b90506132286040840187612e4e565b82810360e084015261323b818587612cbf565b98975050505050505050565b6001600160a01b038416815261020081016132656020830185612fab565b611e936101a083018461305a565b6001600160a01b038916815260006102c060206132928185018c612fab565b6132a06101a085018b61305a565b816102008501526132b4828501898b612dac565b91508382036102208501526132ca828789612dac565b85519093509150600061024085015b60028210156132f85783518152928201926001919091019082016132d9565b5050808501519150610280840160005b600281101561332d5761331b8451613f74565b82529282019290820190600101613308565b505050509998505050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000606082526133b76060830188612dd6565b82810360208401526133ca818789612dac565b9050828103604084015261323b818587612dac565b60408101600284106133ed57fe5b9281526020015290565b600060208252611c3c6020830184612dd6565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526024908201527f434d4341646a7564696361746f723a20494e56414c49445f4348414e4e454c5f60408201526309082a6960e31b606082015260800190565b6020808252601e908201527f434d4341646a7564696361746f723a20494e4445585f4d49534d415443480000604082015260600190565b6020808252601d908201527f434d4357697468647261773a204348414e4e454c5f4d49534d41544348000000604082015260600190565b6020808252601290820152710434d4357697468647261773a204e4f5f4f560741b604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252601d908201527f434d4341646a7564696361746f723a20494e56414c49445f5048415345000000604082015260600190565b6020808252818101527f434d4341646a7564696361746f723a20494e56414c49445f5452414e53464552604082015260600190565b6020808252601f908201527f434d43436f72653a204944454e544943414c5f5041525449434950414e545300604082015260600190565b6020808252601d908201527f434d4341646a7564696361746f723a20494e56414c49445f4e4f4e4345000000604082015260600190565b60208082526019908201527f434d4341737365743a205452414e534645525f4641494c454400000000000000604082015260600190565b6020808252601f908201527f434d4341646a7564696361746f723a20494e56414c49445f424f425f53494700604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526029908201527f434d4341646a7564696361746f723a205452414e534645525f414c524541445960408201526817d11151955391115160ba1b606082015260800190565b6020808252601f908201527f434d4341646a7564696361746f723a204e4f5f4153534554535f474956454e00604082015260600190565b6020808252601f908201527f434d4341646a7564696361746f723a20494e56414c49445f4348414e4e454c00604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526028908201527f434d4341646a7564696361746f723a204348414e4e454c5f414c52454144595f604082015267111151955391115160c21b606082015260800190565b6020808252601c908201527f434d4357697468647261773a20494e56414c49445f424f425f53494700000000604082015260600190565b6020808252601c908201527f434d43436f72653a20494e56414c49445f5041525449434950414e5400000000604082015260600190565b60208082526021908201527f434d434465706f7369743a2045524332305f5452414e534645525f4641494c456040820152601160fa1b606082015260800190565b6020808252601d908201527f434d4357697468647261773a20414c52454144595f4558454355544544000000604082015260600190565b6020808252601a908201527f434d434465706f7369743a2056414c55455f4d49534d41544348000000000000604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b60208082526021908201527f434d434465706f7369743a204554485f574954485f4552435f5452414e5346456040820152602960f91b606082015260800190565b60208082526025908201527f434d4341646a7564696361746f723a205452414e534645525f4e4f545f444953604082015264141555115160da1b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601190820152704c696245524332303a204e4f5f434f444560781b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a205245454e5452414e545f43414c4c00604082015260600190565b60208082526024908201527f434d4341646a7564696361746f723a20494e56414c49445f4d45524b4c455f506040820152632927a7a360e11b606082015260800190565b6020808252600f908201526e0434d4341737365743a204e4f5f4f5608c1b604082015260600190565b6020808252601e908201527f434d4357697468647261773a20494e56414c49445f414c4943455f5349470000604082015260600190565b60208082526029908201527f434d4341646a7564696361746f723a205452414e534645525f414c524541445960408201526817d11254d41555115160ba1b606082015260800190565b60208082526018908201527f434d4341737365743a204f574e45525f4d49534d415443480000000000000000604082015260600190565b6020808252601690820152750434d43436f72653a20414c52454144595f53455455560541b604082015260600190565b60208082526023908201527f434d4341646a7564696361746f723a2057524f4e475f41525241595f4c454e4760408201526254485360e81b606082015260800190565b60208082526021908201527f434d4341646a7564696361746f723a20494e56414c49445f414c4943455f53496040820152604760f81b606082015260800190565b6020808252818101527f434d4341646a7564696361746f723a20494e56414c49445f5245534f4c564552604082015260600190565b6020808252601a908201527f4d6173746572636f70793a204f4e4c595f5649415f50524f5859000000000000604082015260600190565b6020808252818101527f434d4341646a7564696361746f723a20494e56414c49445f42414c414e434553604082015260600190565b60208082526025908201527f434d4341646a7564696361746f723a20494e56414c49445f5452414e534645526040820152640be9082a6960db1b606082015260800190565b608081016115d78284612e02565b600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b600060208252611c3c6020830184612e7c565b61018081016115d78284612fab565b815181526020808301519082015260409182015115159181019190915260600190565b600060208252611c3c6020830184613079565b600060408252613e0f6040830185613079565b90508260208301529392505050565b90815260200190565b6000808335601e19843603018112613e3d578283fd5b8301803591506001600160401b03821115613e56578283fd5b602090810192508102360382131561270b57600080fd5b6000808335601e19843603018112613e83578283fd5b8301803591506001600160401b03821115613e9c578283fd5b602001915060808102360382131561270b57600080fd5b6040518181016001600160401b0381118282101715613ed157600080fd5b604052919050565b60008235611c3c81613fac565b6000808335601e19843603018112613efc578283fd5b83016020810192503590506001600160401b03811115613f1b57600080fd5b60208102360383131561270b57600080fd5b6000808335601e19843603018112613f43578283fd5b83016020810192503590506001600160401b03811115613f6257600080fd5b60808102360383131561270b57600080fd5b6001600160a01b031690565b60005b83811015613f9b578181015183820152602001613f83565b83811115611f395750506000910152565b6001600160a01b0381168114613fc157600080fd5b5056fea26469706673582212200c5761a7a244ea0132fa44dddcf0e7db8a07d95db5eae27e73fff5d050f1145c64736f6c63430007010033",
    "devdoc": {
        "author": "Connext <support@connext.network>",
        "kind": "dev",
        "methods": {
            "getAlice()": {
                "returns": {
                    "_0": "Bob's signer address"
                }
            },
            "getBob()": {
                "returns": {
                    "_0": "Alice's signer address"
                }
            },
            "setup(address,address)": {
                "params": {
                    "_alice": ": Address representing user with function deposit",
                    "_bob": ": Address representing user with multisig deposit"
                }
            },
            "withdraw((address,address,address,uint256,uint256,address,bytes),bytes,bytes)": {
                "params": {
                    "aliceSignature": "Signature of owner a",
                    "bobSignature": "Signature of owner b",
                    "wd": "The withdraw data consisting of semantic withdraw information, i.e. assetId, recipient, and amount; information to make an optional call in addition to the actual transfer, i.e. target address for the call and call payload; additional information, i.e. channel address and nonce."
                }
            }
        },
        "title": "ChannelMastercopy",
        "version": 1
    },
    "userdoc": {
        "kind": "user",
        "methods": {
            "getAlice()": {
                "notice": "A getter function for the bob of the multisig"
            },
            "getBob()": {
                "notice": "A getter function for the bob of the multisig"
            },
            "setup(address,address)": {
                "notice": "Contract constructor for Proxied copies"
            }
        },
        "notice": "Contains the logic used by all Vector multisigs. A proxy to this         contract is deployed per-channel using the ChannelFactory.sol.         Supports channel adjudication logic, deposit logic, and arbitrary         calls when a commitment is double-signed.",
        "version": 1
    },
    "storageLayout": {
        "storage": [
            {
                "astId": 3403,
                "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                "label": "lock",
                "offset": 0,
                "slot": "0",
                "type": "t_uint256"
            },
            {
                "astId": 2597,
                "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                "label": "alice",
                "offset": 0,
                "slot": "1",
                "type": "t_address"
            },
            {
                "astId": 2599,
                "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                "label": "bob",
                "offset": 0,
                "slot": "2",
                "type": "t_address"
            },
            {
                "astId": 2348,
                "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                "label": "totalTransferred",
                "offset": 0,
                "slot": "3",
                "type": "t_mapping(t_address,t_uint256)"
            },
            {
                "astId": 2354,
                "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                "label": "exitableAmount",
                "offset": 0,
                "slot": "4",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
            },
            {
                "astId": 2732,
                "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                "label": "depositsAlice",
                "offset": 0,
                "slot": "5",
                "type": "t_mapping(t_address,t_uint256)"
            },
            {
                "astId": 2895,
                "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                "label": "isExecuted",
                "offset": 0,
                "slot": "6",
                "type": "t_mapping(t_bytes32,t_bool)"
            },
            {
                "astId": 1503,
                "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                "label": "channelDispute",
                "offset": 0,
                "slot": "7",
                "type": "t_struct(ChannelDispute)3596_storage"
            },
            {
                "astId": 1507,
                "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                "label": "defundNonces",
                "offset": 0,
                "slot": "12",
                "type": "t_mapping(t_address,t_uint256)"
            },
            {
                "astId": 1511,
                "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                "label": "transferDisputes",
                "offset": 0,
                "slot": "13",
                "type": "t_mapping(t_bytes32,t_struct(TransferDispute)3603_storage)"
            }
        ],
        "types": {
            "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
            },
            "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
            },
            "t_bytes32": {
                "encoding": "inplace",
                "label": "bytes32",
                "numberOfBytes": "32"
            },
            "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
            },
            "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
            },
            "t_mapping(t_bytes32,t_bool)": {
                "encoding": "mapping",
                "key": "t_bytes32",
                "label": "mapping(bytes32 => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
            },
            "t_mapping(t_bytes32,t_struct(TransferDispute)3603_storage)": {
                "encoding": "mapping",
                "key": "t_bytes32",
                "label": "mapping(bytes32 => struct ICMCAdjudicator.TransferDispute)",
                "numberOfBytes": "32",
                "value": "t_struct(TransferDispute)3603_storage"
            },
            "t_struct(ChannelDispute)3596_storage": {
                "encoding": "inplace",
                "label": "struct ICMCAdjudicator.ChannelDispute",
                "members": [
                    {
                        "astId": 3587,
                        "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                        "label": "channelStateHash",
                        "offset": 0,
                        "slot": "0",
                        "type": "t_bytes32"
                    },
                    {
                        "astId": 3589,
                        "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                        "label": "nonce",
                        "offset": 0,
                        "slot": "1",
                        "type": "t_uint256"
                    },
                    {
                        "astId": 3591,
                        "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                        "label": "merkleRoot",
                        "offset": 0,
                        "slot": "2",
                        "type": "t_bytes32"
                    },
                    {
                        "astId": 3593,
                        "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                        "label": "consensusExpiry",
                        "offset": 0,
                        "slot": "3",
                        "type": "t_uint256"
                    },
                    {
                        "astId": 3595,
                        "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                        "label": "defundExpiry",
                        "offset": 0,
                        "slot": "4",
                        "type": "t_uint256"
                    }
                ],
                "numberOfBytes": "160"
            },
            "t_struct(TransferDispute)3603_storage": {
                "encoding": "inplace",
                "label": "struct ICMCAdjudicator.TransferDispute",
                "members": [
                    {
                        "astId": 3598,
                        "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                        "label": "transferStateHash",
                        "offset": 0,
                        "slot": "0",
                        "type": "t_bytes32"
                    },
                    {
                        "astId": 3600,
                        "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                        "label": "transferDisputeExpiry",
                        "offset": 0,
                        "slot": "1",
                        "type": "t_uint256"
                    },
                    {
                        "astId": 3602,
                        "contract": "src.sol/ChannelMastercopy.sol:ChannelMastercopy",
                        "label": "isDefunded",
                        "offset": 0,
                        "slot": "2",
                        "type": "t_bool"
                    }
                ],
                "numberOfBytes": "96"
            },
            "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
            }
        }
    }
}
