def test_close_call(web3, chain, contract, channel):
    (sender, receiver, open_block_number) = channel
    (A) = web3.eth.accounts[3]
    balance = channel_deposit - 10

    balance_msg = get_balance_message(receiver, open_block_number, balance)
    balance_msg_sig, addr = sign.check(balance_msg, tester.k1)

    # Cannot close what was not opened
    with pytest.raises(tester.TransactionFailed):
        contract.transact({
            'from': A
        }).close(receiver, open_block_number, balance, balance_msg_sig)
    with pytest.raises(tester.TransactionFailed):
        contract.transact({
            'from': sender
        }).close(A, open_block_number, balance, balance_msg_sig)

    # Cannot close if arguments not correct
    with pytest.raises(ValueError):
        contract.transact({
            'from': sender
        }).close(receiver, open_block_number, balance)
    with pytest.raises(ValueError):
        contract.transact({
            'from': receiver
        }).close(receiver, open_block_number, balance)
def test_close_by_sender_challenge_settle_by_sender2(web3, chain, contract,
                                                     channel):
    (sender, receiver, open_block_number) = channel
    (A) = web3.eth.accounts[3]

    current_deposit = get_current_deposit(contract, channel)
    balance = 0

    balance_msg = get_balance_message(receiver, open_block_number, balance)
    balance_msg_sig, addr = sign.check(balance_msg, tester.k1)

    receiver_pre_balance = token.call().balanceOf(receiver)
    sender_pre_balance = token.call().balanceOf(sender)
    contract_pre_balance = token.call().balanceOf(contract.address)

    channel_pre_close_tests(contract, channel)
    trxid1 = contract.transact({
        'from': sender
    }).close(receiver, open_block_number, balance, balance_msg_sig)

    channel_data = contract.call().getChannelInfo(sender, receiver,
                                                  open_block_number)
    assert channel_data[2] != 0  # settle_block_number

    with pytest.raises(tester.TransactionFailed):
        contract.transact({'from': sender}).settle(receiver, open_block_number)

    with pytest.raises(tester.TransactionFailed):
        contract.transact({
            'from': receiver
        }).settle(receiver, open_block_number)

    web3.testing.mine(challenge_period + 1)

    with pytest.raises(tester.TransactionFailed):
        contract.transact({
            'from': receiver
        }).settle(receiver, open_block_number)

    trxid2 = contract.transact({
        'from': sender
    }).settle(receiver, open_block_number)

    receiver_post_balance = receiver_pre_balance + balance
    sender_post_balance = sender_pre_balance + (current_deposit - balance)
    contract_post_balance = contract_pre_balance - current_deposit

    assert token.call().balanceOf(receiver) == receiver_post_balance
    assert token.call().balanceOf(sender) == sender_post_balance
    assert token.call().balanceOf(contract.address) == contract_post_balance

    channel_settle_tests(contract, channel)

    print('----------------------------------')
    print('GAS USED test_close_by_sender_challenge_settle_by_sender2',
          get_gas_used(chain, trxid1) + get_gas_used(chain, trxid2))
    print('----------------------------------')
def test_close_by_receiver(web3, chain, contract, channel):
    (sender, receiver, open_block_number) = channel
    (A) = web3.eth.accounts[3]

    channel_pre_close_tests(contract, channel)
    current_deposit = get_current_deposit(contract, channel)
    balance = current_deposit - 1

    balance_msg = get_balance_message(receiver, open_block_number, balance)
    balance_msg_sig, addr = sign.check(balance_msg, tester.k1)
    balance_msg_sig_false, addr = sign.check(balance_msg, tester.k2)

    with pytest.raises(tester.TransactionFailed):
        contract.transact({
            'from': A
        }).close(receiver, open_block_number, balance, balance_msg_sig)
    with pytest.raises(tester.TransactionFailed):
        contract.transact({
            'from': receiver
        }).close(receiver, open_block_number + 1, balance, balance_msg_sig)
    with pytest.raises(tester.TransactionFailed):
        contract.transact({
            'from': receiver
        }).close(receiver, open_block_number, balance + 1, balance_msg_sig)
    with pytest.raises(tester.TransactionFailed):
        contract.transact({
            'from': receiver
        }).close(receiver, open_block_number, balance, balance_msg_sig_false)

    receiver_pre_balance = token.call().balanceOf(receiver)
    sender_pre_balance = token.call().balanceOf(sender)
    contract_pre_balance = token.call().balanceOf(contract.address)

    print('--BALANCES', receiver_pre_balance, sender_pre_balance,
          contract_pre_balance)

    trxid = contract.transact({
        'from': receiver
    }).close(receiver, open_block_number, balance, balance_msg_sig)

    receiver_post_balance = receiver_pre_balance + balance
    sender_post_balance = sender_pre_balance + (current_deposit - balance)
    contract_post_balance = contract_pre_balance - current_deposit

    assert token.call().balanceOf(receiver) == receiver_post_balance
    assert token.call().balanceOf(sender) == sender_post_balance
    assert token.call().balanceOf(contract.address) == contract_post_balance

    channel_settle_tests(contract, channel)

    print('----------------------------------')
    print('GAS USED test_close_by_receiver', get_gas_used(chain, trxid))
    print('----------------------------------')
def test_sign(contract, channel):
    (sender, receiver, open_block_number) = channel
    balance = 23

    msg = get_balance_message(receiver, open_block_number, balance)
    # "Receiver: " + receiver + "\nBalance: " + str(balance) + "\nChannel ID: " + str(open_block_number)

    # hex: 0x19457468657265756d205369676e6564204d6573736167653a0a373852656365697665723a203078646365636561663366633563306136336431393564363962316139303031316237623139363530640a42616c616e63653a2032330a4368616e6e656c2049443a2035

    print('--- test_sign msg', msg)
    balance_msg_sig, addr = sign.check(msg, tester.k2)
    print('--balance_msg_sig', balance_msg_sig, addr)

    addr = contract.call().verifyBalanceProof(receiver, open_block_number,
                                              balance, balance_msg_sig)
    print('--verifyBalanceProof addr', addr)

    # with Timeout(20) as timeout:
    #     timeout.sleep(2)

    assert addr == receiver