     function consensusCloseChannel(
         bytes32 _lcID,
         uint256 _sequence,
         uint256[4] _balances,  
         string _sigA,
         string _sigI
     )
         public
     {
         require(Channels[_lcID].isOpen == true);
         uint256 totalEthDeposit = Channels[_lcID].initialDeposit[0] + Channels[_lcID].ethBalances[2] + Channels[_lcID].ethBalances[3];
         uint256 totalTokenDeposit = Channels[_lcID].initialDeposit[1] + Channels[_lcID].erc20Balances[2] + Channels[_lcID].erc20Balances[3];
         require(totalEthDeposit == _balances[0] + _balances[1]);
         require(totalTokenDeposit == _balances[2] + _balances[3]);
         bytes32 _state = keccak256(
             abi.encodePacked(
                 _lcID,
                 true,
                 _sequence,
                 uint256(0),
                 bytes32(0x0),
                 Channels[_lcID].partyAddresses[0],
                 Channels[_lcID].partyAddresses[1],
                 _balances[0],
                 _balances[1],
                 _balances[2],
                 _balances[3]
             )
         );
         require(Channels[_lcID].partyAddresses[0] == ECTools.recoverSigner(_state, _sigA));
         require(Channels[_lcID].partyAddresses[1] == ECTools.recoverSigner(_state, _sigI));
         Channels[_lcID].isOpen = false;
         if(_balances[0] != 0 || _balances[1] != 0) {
             Channels[_lcID].partyAddresses[0].transfer(_balances[0]);
             Channels[_lcID].partyAddresses[1].transfer(_balances[1]);
         }
         if(_balances[2] != 0 || _balances[3] != 0) {
             require(Channels[_lcID].token.transfer(Channels[_lcID].partyAddresses[0], _balances[2]),"happyCloseChannel: token transfer failure");
             require(Channels[_lcID].token.transfer(Channels[_lcID].partyAddresses[1], _balances[3]),"happyCloseChannel: token transfer failure");
         }
         numChannels--;
         emit DidLCClose(_lcID, _sequence, _balances[0], _balances[1], _balances[2], _balances[3]);
     }