PaymentChannelClient.smali

.class public Lorg/bitcoinj/protocols/channels/PaymentChannelClient;
.super Ljava/lang/Object;
.source "PaymentChannelClient.java"

# interfaces
.implements Lorg/bitcoinj/protocols/channels/IPaymentChannelClient;


# static fields
.field public static final DEFAULT_TIME_WINDOW:J = 0x15144L

.field private static final log:Lorg/slf4j/Logger;


# instance fields
.field private final conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

.field connectionOpen:Z

.field increasePaymentFuture:Lcom/google/common/util/concurrent/ao;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Lcom/google/common/util/concurrent/ao",
            "<",
            "Lorg/bitcoinj/protocols/channels/PaymentIncrementAck;",
            ">;"
        }
    .end annotation
.end field

.field lastPaymentActualAmount:Lorg/bitcoinj/core/Coin;

.field protected final lock:Ljava/util/concurrent/locks/ReentrantLock;

.field private majorVersion:I

.field private final maxValue:Lorg/bitcoinj/core/Coin;

.field private minPayment:J

.field private missing:Lorg/bitcoinj/core/Coin;

.field private final myKey:Lorg/bitcoinj/core/ECKey;

.field private final serverId:Lorg/bitcoinj/core/Sha256Hash;

.field private state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

.field private step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

.field private storedChannel:Lorg/bitcoinj/protocols/channels/StoredClientChannel;

.field private final timeWindow:J

.field private userKeySetup:Lorg/spongycastle/crypto/params/KeyParameter;

.field private final versionSelector:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;

.field private final wallet:Lorg/bitcoinj/wallet/Wallet;


# direct methods
.method static constructor <clinit>()V
    .registers 1

    .prologue
    .line 56
    const-class v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;

    invoke-static {v0}, Lorg/slf4j/LoggerFactory;->getLogger(Ljava/lang/Class;)Lorg/slf4j/Logger;

    move-result-object v0

    sput-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    return-void
.end method

.method public constructor <init>(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/Coin;Lorg/bitcoinj/core/Sha256Hash;JLorg/spongycastle/crypto/params/KeyParameter;Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;)V
    .registers 20

    .prologue
    .line 224
    sget-object v10, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;->VERSION_2_ALLOW_1:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;

    move-object v1, p0

    move-object v2, p1

    move-object v3, p2

    move-object v4, p3

    move-object v5, p4

    move-wide/from16 v6, p5

    move-object/from16 v8, p7

    move-object/from16 v9, p8

    invoke-direct/range {v1 .. v10}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;-><init>(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/Coin;Lorg/bitcoinj/core/Sha256Hash;JLorg/spongycastle/crypto/params/KeyParameter;Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;)V

    .line 225
    return-void
.end method

.method public constructor <init>(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/Coin;Lorg/bitcoinj/core/Sha256Hash;JLorg/spongycastle/crypto/params/KeyParameter;Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;)V
    .registers 15

    .prologue
    const/4 v1, 0x0

    .line 252
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 58
    const-string v0, "channelclient"

    invoke-static {v0}, Lorg/bitcoinj/utils/Threading;->lock(Ljava/lang/String;)Ljava/util/concurrent/locks/ReentrantLock;

    move-result-object v0

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    .line 66
    iput-boolean v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->connectionOpen:Z

    .line 82
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_CONNECTION_OPEN:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    .line 253
    invoke-static {p1}, Lcom/google/common/base/n;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/wallet/Wallet;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->wallet:Lorg/bitcoinj/wallet/Wallet;

    .line 254
    invoke-static {p2}, Lcom/google/common/base/n;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/core/ECKey;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->myKey:Lorg/bitcoinj/core/ECKey;

    .line 255
    invoke-static {p3}, Lcom/google/common/base/n;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/core/Coin;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->maxValue:Lorg/bitcoinj/core/Coin;

    .line 256
    invoke-static {p4}, Lcom/google/common/base/n;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/core/Sha256Hash;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->serverId:Lorg/bitcoinj/core/Sha256Hash;

    .line 257
    const-wide/16 v2, 0x0

    cmp-long v0, p5, v2

    if-ltz v0, :cond_4b

    const/4 v0, 0x1

    :goto_39
    invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V

    .line 258
    iput-wide p5, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->timeWindow:J

    .line 259
    invoke-static {p8}, Lcom/google/common/base/n;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    .line 260
    iput-object p7, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->userKeySetup:Lorg/spongycastle/crypto/params/KeyParameter;

    .line 261
    iput-object p9, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->versionSelector:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;

    .line 262
    return-void

    :cond_4b
    move v0, v1

    .line 257
    goto :goto_39
.end method

.method public constructor <init>(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/Coin;Lorg/bitcoinj/core/Sha256Hash;Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;)V
    .registers 13

    .prologue
    .line 172
    sget-object v6, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;->VERSION_2_ALLOW_1:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;

    move-object v0, p0

    move-object v1, p1

    move-object v2, p2

    move-object v3, p3

    move-object v4, p4

    move-object v5, p5

    invoke-direct/range {v0 .. v6}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;-><init>(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/Coin;Lorg/bitcoinj/core/Sha256Hash;Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;)V

    .line 173
    return-void
.end method

.method public constructor <init>(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/Coin;Lorg/bitcoinj/core/Sha256Hash;Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;)V
    .registers 18

    .prologue
    .line 199
    const-wide/32 v6, 0x15144

    const/4 v8, 0x0

    move-object v1, p0

    move-object v2, p1

    move-object v3, p2

    move-object v4, p3

    move-object v5, p4

    move-object/from16 v9, p5

    move-object/from16 v10, p6

    invoke-direct/range {v1 .. v10}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;-><init>(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/Coin;Lorg/bitcoinj/core/Sha256Hash;JLorg/spongycastle/crypto/params/KeyParameter;Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;)V

    .line 200
    return-void
.end method

.method private receiveChannelOpen()V
    .registers 5

    .prologue
    const/4 v2, 0x1

    const/4 v1, 0x0

    .line 415
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    sget-object v3, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_CHANNEL_OPEN:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    if-eq v0, v3, :cond_12

    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    sget-object v3, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_INITIATE:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    if-ne v0, v3, :cond_41

    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->storedChannel:Lorg/bitcoinj/protocols/channels/StoredClientChannel;

    if-eqz v0, :cond_41

    :cond_12
    move v0, v2

    :goto_13
    iget-object v3, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    invoke-static {v0, v3}, Lcom/google/common/base/n;->checkState(ZLjava/lang/Object;)V

    .line 416
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v3, "Got CHANNEL_OPEN message, ready to pay"

    invoke-interface {v0, v3}, Lorg/slf4j/Logger;->info(Ljava/lang/String;)V

    .line 419
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    sget-object v3, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_INITIATE:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    if-ne v0, v3, :cond_64

    .line 422
    iget v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->majorVersion:I

    packed-switch v0, :pswitch_data_66

    .line 430
    new-instance v0, Ljava/lang/IllegalStateException;

    new-instance v1, Ljava/lang/StringBuilder;

    const-string v2, "Invalid version number "

    invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    iget v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->majorVersion:I

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V

    throw v0

    :cond_41
    move v0, v1

    .line 415
    goto :goto_13

    .line 424
    :pswitch_43
    new-instance v0, Lorg/bitcoinj/protocols/channels/PaymentChannelV1ClientState;

    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->storedChannel:Lorg/bitcoinj/protocols/channels/StoredClientChannel;

    iget-object v3, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->wallet:Lorg/bitcoinj/wallet/Wallet;

    invoke-direct {v0, v2, v3}, Lorg/bitcoinj/protocols/channels/PaymentChannelV1ClientState;-><init>(Lorg/bitcoinj/protocols/channels/StoredClientChannel;Lorg/bitcoinj/wallet/Wallet;)V

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    .line 433
    :goto_4e
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->CHANNEL_OPEN:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    .line 436
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    invoke-interface {v0, v1}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->channelOpen(Z)V

    .line 437
    return-void

    .line 427
    :pswitch_58
    new-instance v0, Lorg/bitcoinj/protocols/channels/PaymentChannelV2ClientState;

    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->storedChannel:Lorg/bitcoinj/protocols/channels/StoredClientChannel;

    iget-object v3, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->wallet:Lorg/bitcoinj/wallet/Wallet;

    invoke-direct {v0, v2, v3}, Lorg/bitcoinj/protocols/channels/PaymentChannelV2ClientState;-><init>(Lorg/bitcoinj/protocols/channels/StoredClientChannel;Lorg/bitcoinj/wallet/Wallet;)V

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    goto :goto_4e

    :cond_64
    move v1, v2

    goto :goto_4e

    .line 422
    :pswitch_data_66
    .packed-switch 0x1
        :pswitch_43
        :pswitch_58
    .end packed-switch
.end method

.method private receiveClose(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;)V
    .registers 6

    .prologue
    .line 540
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->isHeldByCurrentThread()Z

    move-result v0

    invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V

    .line 541
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->hasSettlement()Z

    move-result v0

    if-eqz v0, :cond_5a

    .line 542
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->wallet:Lorg/bitcoinj/wallet/Wallet;

    invoke-virtual {v0}, Lorg/bitcoinj/wallet/Wallet;->getParams()Lorg/bitcoinj/core/NetworkParameters;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/core/NetworkParameters;->getDefaultSerializer()Lorg/bitcoinj/core/MessageSerializer;

    move-result-object v0

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getSettlement()Lorg/bitcoin/paymentchannel/Protos$Settlement;

    move-result-object v1

    invoke-virtual {v1}, Lorg/bitcoin/paymentchannel/Protos$Settlement;->getTx()Lcom/google/protobuf/ByteString;

    move-result-object v1

    invoke-virtual {v1}, Lcom/google/protobuf/ByteString;->toByteArray()[B

    move-result-object v1

    invoke-virtual {v0, v1}, Lorg/bitcoinj/core/MessageSerializer;->makeTransaction([B)Lorg/bitcoinj/core/Transaction;

    move-result-object v0

    .line 543
    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v2, "CLOSE message received with settlement tx {}"

    invoke-virtual {v0}, Lorg/bitcoinj/core/Transaction;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v3

    invoke-interface {v1, v2, v3}, Lorg/slf4j/Logger;->info(Ljava/lang/String;Ljava/lang/Object;)V

    .line 545
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    if-eqz v1, :cond_48

    invoke-virtual {p0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state()Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    move-result-object v1

    invoke-virtual {v1, v0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->isSettlementTransaction(Lorg/bitcoinj/core/Transaction;)Z

    move-result v1

    if-eqz v1, :cond_48

    .line 549
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->wallet:Lorg/bitcoinj/wallet/Wallet;

    const/4 v2, 0x0

    invoke-virtual {v1, v0, v2}, Lorg/bitcoinj/wallet/Wallet;->receivePending(Lorg/bitcoinj/core/Transaction;Ljava/util/List;)V

    .line 554
    :cond_48
    :goto_48
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_CHANNEL_CLOSE:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    if-ne v0, v1, :cond_62

    .line 555
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->CLIENT_REQUESTED_CLOSE:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    invoke-interface {v0, v1}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->destroyConnection(Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;)V

    .line 558
    :goto_55
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->CHANNEL_CLOSED:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    .line 559
    return-void

    .line 552
    :cond_5a
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v1, "CLOSE message received without settlement tx"

    invoke-interface {v0, v1}, Lorg/slf4j/Logger;->info(Ljava/lang/String;)V

    goto :goto_48

    .line 557
    :cond_62
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->SERVER_REQUESTED_CLOSE:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    invoke-interface {v0, v1}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->destroyConnection(Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;)V

    goto :goto_55
.end method

.method private receiveInitiate(Lorg/bitcoin/paymentchannel/Protos$Initiate;Lorg/bitcoinj/core/Coin;Lorg/bitcoin/paymentchannel/Protos$Error$Builder;)Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;
    .registers 13

    .prologue
    const-wide/16 v4, 0x0

    const/4 v8, 0x0

    .line 278
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v1, "Got INITIATE message:\n{}"

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$Initiate;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v0, v1, v2}, Lorg/slf4j/Logger;->info(Ljava/lang/String;Ljava/lang/Object;)V

    .line 280
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->wallet:Lorg/bitcoinj/wallet/Wallet;

    invoke-virtual {v0}, Lorg/bitcoinj/wallet/Wallet;->isEncrypted()Z

    move-result v0

    if-eqz v0, :cond_20

    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->userKeySetup:Lorg/spongycastle/crypto/params/KeyParameter;

    if-nez v0, :cond_20

    .line 281
    new-instance v0, Lorg/bitcoinj/core/ECKey$KeyIsEncryptedException;

    invoke-direct {v0}, Lorg/bitcoinj/core/ECKey$KeyIsEncryptedException;-><init>()V

    throw v0

    .line 283
    :cond_20
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$Initiate;->getExpireTimeSecs()J

    move-result-wide v6

    .line 284
    cmp-long v0, v6, v4

    if-ltz v0, :cond_56

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$Initiate;->getMinAcceptedChannelSize()J

    move-result-wide v0

    cmp-long v0, v0, v4

    if-ltz v0, :cond_56

    const/4 v0, 0x1

    :goto_31
    invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V

    .line 286
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    invoke-interface {v0, v6, v7}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->acceptExpireTime(J)Z

    move-result v0

    if-nez v0, :cond_58

    .line 287
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v1, "Server suggested expire time was out of our allowed bounds: {} ({} s)"

    const-wide/16 v2, 0x3e8

    mul-long/2addr v2, v6

    invoke-static {v2, v3}, Lorg/bitcoinj/core/Utils;->dateTimeFormat(J)Ljava/lang/String;

    move-result-object v2

    invoke-static {v6, v7}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;

    move-result-object v3

    invoke-interface {v0, v1, v2, v3}, Lorg/slf4j/Logger;->error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V

    .line 288
    sget-object v0, Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;->TIME_WINDOW_UNACCEPTABLE:Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;

    invoke-virtual {p3, v0}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->setCode(Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;)Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    .line 289
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->TIME_WINDOW_UNACCEPTABLE:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    .line 377
    :goto_55
    return-object v0

    .line 284
    :cond_56
    const/4 v0, 0x0

    goto :goto_31

    .line 292
    :cond_58
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$Initiate;->getMinAcceptedChannelSize()J

    move-result-wide v0

    invoke-static {v0, v1}, Lorg/bitcoinj/core/Coin;->valueOf(J)Lorg/bitcoinj/core/Coin;

    move-result-object v0

    .line 293
    invoke-virtual {p2, v0}, Lorg/bitcoinj/core/Coin;->compareTo(Lorg/bitcoinj/core/Coin;)I

    move-result v1

    if-gez v1, :cond_7b

    .line 294
    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v2, "Server requested too much value"

    invoke-interface {v1, v2}, Lorg/slf4j/Logger;->error(Ljava/lang/String;)V

    .line 295
    sget-object v1, Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;->CHANNEL_VALUE_TOO_LARGE:Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;

    invoke-virtual {p3, v1}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->setCode(Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;)Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    .line 296
    invoke-virtual {v0, p2}, Lorg/bitcoinj/core/Coin;->subtract(Lorg/bitcoinj/core/Coin;)Lorg/bitcoinj/core/Coin;

    move-result-object v0

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->missing:Lorg/bitcoinj/core/Coin;

    .line 297
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->SERVER_REQUESTED_TOO_MUCH_VALUE:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    goto :goto_55

    .line 302
    :cond_7b
    sget-object v0, Lorg/bitcoinj/core/Transaction;->REFERENCE_DEFAULT_MIN_TX_FEE:Lorg/bitcoinj/core/Coin;

    iget-wide v0, v0, Lorg/bitcoinj/core/Coin;->value:J

    .line 303
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$Initiate;->getMinPayment()J

    move-result-wide v2

    cmp-long v2, v2, v0

    if-eqz v2, :cond_b1

    .line 304
    sget-object v2, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v3, "Server requested a min payment of {} but we expected {}"

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$Initiate;->getMinPayment()J

    move-result-wide v4

    invoke-static {v4, v5}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;

    move-result-object v4

    invoke-static {v0, v1}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;

    move-result-object v5

    invoke-interface {v2, v3, v4, v5}, Lorg/slf4j/Logger;->error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V

    .line 305
    sget-object v2, Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;->MIN_PAYMENT_TOO_LARGE:Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;

    invoke-virtual {p3, v2}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->setCode(Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;)Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    .line 306
    invoke-virtual {p3, v0, v1}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->setExpectedValue(J)Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    .line 307
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$Initiate;->getMinPayment()J

    move-result-wide v2

    sub-long v0, v2, v0

    invoke-static {v0, v1}, Lorg/bitcoinj/core/Coin;->valueOf(J)Lorg/bitcoinj/core/Coin;

    move-result-object v0

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->missing:Lorg/bitcoinj/core/Coin;

    .line 308
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->SERVER_REQUESTED_TOO_MUCH_VALUE:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    goto :goto_55

    .line 311
    :cond_b1
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$Initiate;->getMultisigKey()Lcom/google/protobuf/ByteString;

    move-result-object v0

    invoke-virtual {v0}, Lcom/google/protobuf/ByteString;->toByteArray()[B

    move-result-object v0

    .line 312
    invoke-static {v0}, Lorg/bitcoinj/core/ECKey;->isPubKeyCanonical([B)Z

    move-result v1

    if-nez v1, :cond_c7

    .line 313
    new-instance v0, Lorg/bitcoinj/core/VerificationException;

    const-string v1, "Server gave us a non-canonical public key, protocol error."

    invoke-direct {v0, v1}, Lorg/bitcoinj/core/VerificationException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 314
    :cond_c7
    iget v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->majorVersion:I

    packed-switch v1, :pswitch_data_1d6

    .line 322
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->NO_ACCEPTABLE_VERSION:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    goto :goto_55

    .line 316
    :pswitch_cf
    new-instance v1, Lorg/bitcoinj/protocols/channels/PaymentChannelV1ClientState;

    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->wallet:Lorg/bitcoinj/wallet/Wallet;

    iget-object v3, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->myKey:Lorg/bitcoinj/core/ECKey;

    invoke-static {v0}, Lorg/bitcoinj/core/ECKey;->fromPublicOnly([B)Lorg/bitcoinj/core/ECKey;

    move-result-object v4

    move-object v5, p2

    invoke-direct/range {v1 .. v7}, Lorg/bitcoinj/protocols/channels/PaymentChannelV1ClientState;-><init>(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/Coin;J)V

    iput-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    .line 325
    :goto_df
    :try_start_df
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->userKeySetup:Lorg/spongycastle/crypto/params/KeyParameter;

    invoke-virtual {v0, v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->initiate(Lorg/spongycastle/crypto/params/KeyParameter;)V
    :try_end_e6
    .catch Lorg/bitcoinj/protocols/channels/ValueOutOfRangeException; {:try_start_df .. :try_end_e6} :catch_106

    .line 331
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$Initiate;->getMinPayment()J

    move-result-wide v0

    iput-wide v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->minPayment:J

    .line 332
    iget v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->majorVersion:I

    packed-switch v0, :pswitch_data_1de

    .line 375
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->NO_ACCEPTABLE_VERSION:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    goto/16 :goto_55

    .line 319
    :pswitch_f5
    new-instance v1, Lorg/bitcoinj/protocols/channels/PaymentChannelV2ClientState;

    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->wallet:Lorg/bitcoinj/wallet/Wallet;

    iget-object v3, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->myKey:Lorg/bitcoinj/core/ECKey;

    invoke-static {v0}, Lorg/bitcoinj/core/ECKey;->fromPublicOnly([B)Lorg/bitcoinj/core/ECKey;

    move-result-object v4

    move-object v5, p2

    invoke-direct/range {v1 .. v7}, Lorg/bitcoinj/protocols/channels/PaymentChannelV2ClientState;-><init>(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/Coin;J)V

    iput-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    goto :goto_df

    .line 326
    :catch_106
    move-exception v0

    .line 327
    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v2, "Value out of range when trying to initiate"

    invoke-interface {v1, v2, v0}, Lorg/slf4j/Logger;->error(Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 328
    sget-object v0, Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;->CHANNEL_VALUE_TOO_LARGE:Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;

    invoke-virtual {p3, v0}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->setCode(Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;)Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    .line 329
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->SERVER_REQUESTED_TOO_MUCH_VALUE:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    goto/16 :goto_55

    .line 334
    :pswitch_117
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_REFUND_RETURN:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    .line 336
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$ProvideRefund;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$ProvideRefund$Builder;

    move-result-object v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->myKey:Lorg/bitcoinj/core/ECKey;

    .line 337
    invoke-virtual {v1}, Lorg/bitcoinj/core/ECKey;->getPubKey()[B

    move-result-object v1

    invoke-static {v1}, Lcom/google/protobuf/ByteString;->copyFrom([B)Lcom/google/protobuf/ByteString;

    move-result-object v1

    invoke-virtual {v0, v1}, Lorg/bitcoin/paymentchannel/Protos$ProvideRefund$Builder;->setMultisigKey(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/paymentchannel/Protos$ProvideRefund$Builder;

    move-result-object v1

    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    check-cast v0, Lorg/bitcoinj/protocols/channels/PaymentChannelV1ClientState;

    .line 338
    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/PaymentChannelV1ClientState;->getIncompleteRefundTransaction()Lorg/bitcoinj/core/Transaction;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/core/Transaction;->unsafeBitcoinSerialize()[B

    move-result-object v0

    invoke-static {v0}, Lcom/google/protobuf/ByteString;->copyFrom([B)Lcom/google/protobuf/ByteString;

    move-result-object v0

    invoke-virtual {v1, v0}, Lorg/bitcoin/paymentchannel/Protos$ProvideRefund$Builder;->setTx(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/paymentchannel/Protos$ProvideRefund$Builder;

    move-result-object v0

    .line 340
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v2

    .line 341
    invoke-virtual {v2, v0}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setProvideRefund(Lorg/bitcoin/paymentchannel/Protos$ProvideRefund$Builder;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v0

    sget-object v2, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;->PROVIDE_REFUND:Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;

    .line 342
    invoke-virtual {v0, v2}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setType(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v0

    .line 343
    invoke-virtual {v0}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->build()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;

    move-result-object v0

    .line 340
    invoke-interface {v1, v0}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->sendToServer(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;)V

    :goto_158
    move-object v0, v8

    .line 377
    goto/16 :goto_55

    .line 346
    :pswitch_15b
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_CHANNEL_OPEN:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    .line 350
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->serverId:Lorg/bitcoinj/core/Sha256Hash;

    invoke-virtual {v0, v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->storeChannelInWallet(Lorg/bitcoinj/core/Sha256Hash;)V

    .line 352
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$ProvideContract;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;

    move-result-object v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    .line 353
    invoke-virtual {v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->getContract()Lorg/bitcoinj/core/Transaction;

    move-result-object v1

    invoke-virtual {v1}, Lorg/bitcoinj/core/Transaction;->unsafeBitcoinSerialize()[B

    move-result-object v1

    invoke-static {v1}, Lcom/google/protobuf/ByteString;->copyFrom([B)Lcom/google/protobuf/ByteString;

    move-result-object v1

    invoke-virtual {v0, v1}, Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;->setTx(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;

    move-result-object v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->myKey:Lorg/bitcoinj/core/ECKey;

    .line 354
    invoke-virtual {v1}, Lorg/bitcoinj/core/ECKey;->getPubKey()[B

    move-result-object v1

    invoke-static {v1}, Lcom/google/protobuf/ByteString;->copyFrom([B)Lcom/google/protobuf/ByteString;

    move-result-object v1

    invoke-virtual {v0, v1}, Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;->setClientKey(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;

    move-result-object v0

    .line 358
    :try_start_18a
    invoke-virtual {p0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state()Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    move-result-object v1

    iget-wide v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->minPayment:J

    invoke-static {v2, v3}, Lorg/bitcoinj/core/Coin;->valueOf(J)Lorg/bitcoinj/core/Coin;

    move-result-object v2

    iget-object v3, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->userKeySetup:Lorg/spongycastle/crypto/params/KeyParameter;

    invoke-virtual {v1, v2, v3}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->incrementPaymentBy(Lorg/bitcoinj/core/Coin;Lorg/spongycastle/crypto/params/KeyParameter;)Lorg/bitcoinj/protocols/channels/PaymentChannelClientState$IncrementedPayment;

    move-result-object v1

    .line 359
    invoke-virtual {v0}, Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;->getInitialPaymentBuilder()Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;

    move-result-object v2

    .line 360
    iget-object v1, v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState$IncrementedPayment;->signature:Lorg/bitcoinj/crypto/TransactionSignature;

    invoke-virtual {v1}, Lorg/bitcoinj/crypto/TransactionSignature;->encodeToBitcoin()[B

    move-result-object v1

    invoke-static {v1}, Lcom/google/protobuf/ByteString;->copyFrom([B)Lcom/google/protobuf/ByteString;

    move-result-object v1

    invoke-virtual {v2, v1}, Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;->setSignature(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;

    .line 361
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    invoke-virtual {v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->getValueRefunded()Lorg/bitcoinj/core/Coin;

    move-result-object v1

    iget-wide v4, v1, Lorg/bitcoinj/core/Coin;->value:J

    invoke-virtual {v2, v4, v5}, Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;->setClientChangeValue(J)Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;
    :try_end_1b6
    .catch Lorg/bitcoinj/protocols/channels/ValueOutOfRangeException; {:try_start_18a .. :try_end_1b6} :catch_1ce

    .line 367
    iput-object v8, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->userKeySetup:Lorg/spongycastle/crypto/params/KeyParameter;

    .line 369
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v1

    .line 370
    invoke-virtual {v1, v0}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setProvideContract(Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    .line 371
    sget-object v0, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;->PROVIDE_CONTRACT:Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;

    invoke-virtual {v1, v0}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setType(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    .line 372
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    invoke-virtual {v1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->build()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;

    move-result-object v1

    invoke-interface {v0, v1}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->sendToServer(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;)V

    goto :goto_158

    .line 362
    :catch_1ce
    move-exception v0

    .line 363
    new-instance v1, Ljava/lang/IllegalStateException;

    invoke-direct {v1, v0}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/Throwable;)V

    throw v1

    .line 314
    nop

    :pswitch_data_1d6
    .packed-switch 0x1
        :pswitch_cf
        :pswitch_f5
    .end packed-switch

    .line 332
    :pswitch_data_1de
    .packed-switch 0x1
        :pswitch_117
        :pswitch_15b
    .end packed-switch
.end method

.method private receivePaymentAck(Lorg/bitcoin/paymentchannel/Protos$PaymentAck;)V
    .registers 6

    .prologue
    .line 743
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V

    .line 745
    :try_start_5
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->increasePaymentFuture:Lcom/google/common/util/concurrent/ao;
    :try_end_7
    .catchall {:try_start_5 .. :try_end_7} :catchall_33

    if-nez v0, :cond_f

    .line 751
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    .line 756
    :goto_e
    return-void

    .line 746
    :cond_f
    :try_start_f
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->increasePaymentFuture:Lcom/google/common/util/concurrent/ao;

    const-string v1, "Server sent a PAYMENT_ACK with no outstanding payment"

    invoke-static {v0, v1}, Lcom/google/common/base/n;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    .line 747
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v1, "Received a PAYMENT_ACK from the server"

    invoke-interface {v0, v1}, Lorg/slf4j/Logger;->info(Ljava/lang/String;)V

    .line 748
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->increasePaymentFuture:Lcom/google/common/util/concurrent/ao;

    .line 749
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lastPaymentActualAmount:Lorg/bitcoinj/core/Coin;
    :try_end_21
    .catchall {:try_start_f .. :try_end_21} :catchall_33

    .line 751
    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v2}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    .line 755
    new-instance v2, Lorg/bitcoinj/protocols/channels/PaymentIncrementAck;

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$PaymentAck;->getInfo()Lcom/google/protobuf/ByteString;

    move-result-object v3

    invoke-direct {v2, v1, v3}, Lorg/bitcoinj/protocols/channels/PaymentIncrementAck;-><init>(Lorg/bitcoinj/core/Coin;Lcom/google/protobuf/ByteString;)V

    invoke-virtual {v0, v2}, Lcom/google/common/util/concurrent/ao;->set(Ljava/lang/Object;)Z

    goto :goto_e

    .line 751
    :catchall_33
    move-exception v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    throw v0
.end method

.method private receiveRefund(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;Lorg/spongycastle/crypto/params/KeyParameter;)V
    .registers 9

    .prologue
    const/4 v2, 0x0

    const/4 v1, 0x1

    .line 382
    iget v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->majorVersion:I

    if-ne v0, v1, :cond_94

    move v0, v1

    :goto_7
    invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V

    .line 383
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    sget-object v3, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_REFUND_RETURN:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    if-ne v0, v3, :cond_97

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->hasReturnRefund()Z

    move-result v0

    if-eqz v0, :cond_97

    :goto_16
    invoke-static {v1}, Lcom/google/common/base/n;->checkState(Z)V

    .line 384
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v1, "Got RETURN_REFUND message, providing signed contract"

    invoke-interface {v0, v1}, Lorg/slf4j/Logger;->info(Ljava/lang/String;)V

    .line 385
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getReturnRefund()Lorg/bitcoin/paymentchannel/Protos$ReturnRefund;

    move-result-object v1

    .line 387
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    check-cast v0, Lorg/bitcoinj/protocols/channels/PaymentChannelV1ClientState;

    invoke-virtual {v1}, Lorg/bitcoin/paymentchannel/Protos$ReturnRefund;->getSignature()Lcom/google/protobuf/ByteString;

    move-result-object v1

    invoke-virtual {v1}, Lcom/google/protobuf/ByteString;->toByteArray()[B

    move-result-object v1

    invoke-virtual {v0, v1, p2}, Lorg/bitcoinj/protocols/channels/PaymentChannelV1ClientState;->provideRefundSignature([BLorg/spongycastle/crypto/params/KeyParameter;)V

    .line 388
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_CHANNEL_OPEN:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    .line 392
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->serverId:Lorg/bitcoinj/core/Sha256Hash;

    invoke-virtual {v0, v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->storeChannelInWallet(Lorg/bitcoinj/core/Sha256Hash;)V

    .line 394
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$ProvideContract;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;

    move-result-object v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    .line 395
    invoke-virtual {v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->getContract()Lorg/bitcoinj/core/Transaction;

    move-result-object v1

    invoke-virtual {v1}, Lorg/bitcoinj/core/Transaction;->unsafeBitcoinSerialize()[B

    move-result-object v1

    invoke-static {v1}, Lcom/google/protobuf/ByteString;->copyFrom([B)Lcom/google/protobuf/ByteString;

    move-result-object v1

    invoke-virtual {v0, v1}, Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;->setTx(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;

    move-result-object v0

    .line 399
    :try_start_54
    invoke-virtual {p0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state()Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    move-result-object v1

    iget-wide v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->minPayment:J

    invoke-static {v2, v3}, Lorg/bitcoinj/core/Coin;->valueOf(J)Lorg/bitcoinj/core/Coin;

    move-result-object v2

    invoke-virtual {v1, v2, p2}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->incrementPaymentBy(Lorg/bitcoinj/core/Coin;Lorg/spongycastle/crypto/params/KeyParameter;)Lorg/bitcoinj/protocols/channels/PaymentChannelClientState$IncrementedPayment;

    move-result-object v1

    .line 400
    invoke-virtual {v0}, Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;->getInitialPaymentBuilder()Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;

    move-result-object v2

    .line 401
    iget-object v1, v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState$IncrementedPayment;->signature:Lorg/bitcoinj/crypto/TransactionSignature;

    invoke-virtual {v1}, Lorg/bitcoinj/crypto/TransactionSignature;->encodeToBitcoin()[B

    move-result-object v1

    invoke-static {v1}, Lcom/google/protobuf/ByteString;->copyFrom([B)Lcom/google/protobuf/ByteString;

    move-result-object v1

    invoke-virtual {v2, v1}, Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;->setSignature(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;

    .line 402
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    invoke-virtual {v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->getValueRefunded()Lorg/bitcoinj/core/Coin;

    move-result-object v1

    iget-wide v4, v1, Lorg/bitcoinj/core/Coin;->value:J

    invoke-virtual {v2, v4, v5}, Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;->setClientChangeValue(J)Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;
    :try_end_7e
    .catch Lorg/bitcoinj/protocols/channels/ValueOutOfRangeException; {:try_start_54 .. :try_end_7e} :catch_9a

    .line 407
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v1

    .line 408
    invoke-virtual {v1, v0}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setProvideContract(Lorg/bitcoin/paymentchannel/Protos$ProvideContract$Builder;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    .line 409
    sget-object v0, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;->PROVIDE_CONTRACT:Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;

    invoke-virtual {v1, v0}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setType(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    .line 410
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    invoke-virtual {v1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->build()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;

    move-result-object v1

    invoke-interface {v0, v1}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->sendToServer(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;)V

    .line 411
    return-void

    :cond_94
    move v0, v2

    .line 382
    goto/16 :goto_7

    :cond_97
    move v1, v2

    .line 383
    goto/16 :goto_16

    .line 403
    :catch_9a
    move-exception v0

    .line 404
    new-instance v1, Ljava/lang/IllegalStateException;

    invoke-direct {v1, v0}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method private setIncreasePaymentFutureIfNeeded(Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;Ljava/lang/String;)V
    .registers 5

    .prologue
    .line 533
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->increasePaymentFuture:Lcom/google/common/util/concurrent/ao;

    if-eqz v0, :cond_16

    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->increasePaymentFuture:Lcom/google/common/util/concurrent/ao;

    invoke-virtual {v0}, Lcom/google/common/util/concurrent/ao;->isDone()Z

    move-result v0

    if-nez v0, :cond_16

    .line 534
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->increasePaymentFuture:Lcom/google/common/util/concurrent/ao;

    new-instance v1, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException;

    invoke-direct {v1, p2, p1}, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException;-><init>(Ljava/lang/String;Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;)V

    invoke-virtual {v0, v1}, Lcom/google/common/util/concurrent/ao;->setException(Ljava/lang/Throwable;)Z

    .line 536
    :cond_16
    return-void
.end method


# virtual methods
.method public connectionClosed()V
    .registers 3

    .prologue
    .line 574
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V

    .line 576
    const/4 v0, 0x0

    :try_start_6
    iput-boolean v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->connectionOpen:Z

    .line 577
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    if-eqz v0, :cond_11

    .line 578
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->disconnectFromChannel()V
    :try_end_11
    .catchall {:try_start_6 .. :try_end_11} :catchall_17

    .line 580
    :cond_11
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    .line 581
    return-void

    .line 580
    :catchall_17
    move-exception v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    throw v0
.end method

.method public connectionOpen()V
    .registers 5

    .prologue
    .line 618
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V

    .line 620
    const/4 v0, 0x1

    :try_start_6
    iput-boolean v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->connectionOpen:Z

    .line 622
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->wallet:Lorg/bitcoinj/wallet/Wallet;

    invoke-virtual {v0}, Lorg/bitcoinj/wallet/Wallet;->getExtensions()Ljava/util/Map;

    move-result-object v0

    sget-object v1, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelClientStates;->EXTENSION_ID:Ljava/lang/String;

    invoke-interface {v0, v1}, Ljava/util/Map;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelClientStates;

    .line 623
    if-eqz v0, :cond_20

    .line 624
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->serverId:Lorg/bitcoinj/core/Sha256Hash;

    invoke-virtual {v0, v1}, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelClientStates;->getUsableChannelForServerID(Lorg/bitcoinj/core/Sha256Hash;)Lorg/bitcoinj/protocols/channels/StoredClientChannel;

    move-result-object v0

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->storedChannel:Lorg/bitcoinj/protocols/channels/StoredClientChannel;

    .line 626
    :cond_20
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_VERSION_NEGOTIATION:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    .line 628
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$ClientVersion;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$ClientVersion$Builder;

    move-result-object v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->versionSelector:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;

    .line 629
    invoke-virtual {v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;->getRequestedMajorVersion()I

    move-result v1

    invoke-virtual {v0, v1}, Lorg/bitcoin/paymentchannel/Protos$ClientVersion$Builder;->setMajor(I)Lorg/bitcoin/paymentchannel/Protos$ClientVersion$Builder;

    move-result-object v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->versionSelector:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;

    .line 630
    invoke-virtual {v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;->getRequestedMinorVersion()I

    move-result v1

    invoke-virtual {v0, v1}, Lorg/bitcoin/paymentchannel/Protos$ClientVersion$Builder;->setMinor(I)Lorg/bitcoin/paymentchannel/Protos$ClientVersion$Builder;

    move-result-object v0

    iget-wide v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->timeWindow:J

    .line 631
    invoke-virtual {v0, v2, v3}, Lorg/bitcoin/paymentchannel/Protos$ClientVersion$Builder;->setTimeWindowSecs(J)Lorg/bitcoin/paymentchannel/Protos$ClientVersion$Builder;

    move-result-object v0

    .line 633
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->storedChannel:Lorg/bitcoinj/protocols/channels/StoredClientChannel;

    if-eqz v1, :cond_85

    .line 634
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->storedChannel:Lorg/bitcoinj/protocols/channels/StoredClientChannel;

    iget-object v1, v1, Lorg/bitcoinj/protocols/channels/StoredClientChannel;->contract:Lorg/bitcoinj/core/Transaction;

    invoke-virtual {v1}, Lorg/bitcoinj/core/Transaction;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v1

    invoke-virtual {v1}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v1

    invoke-static {v1}, Lcom/google/protobuf/ByteString;->copyFrom([B)Lcom/google/protobuf/ByteString;

    move-result-object v1

    invoke-virtual {v0, v1}, Lorg/bitcoin/paymentchannel/Protos$ClientVersion$Builder;->setPreviousChannelContractHash(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/paymentchannel/Protos$ClientVersion$Builder;

    .line 635
    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v2, "Begun version handshake, attempting to reopen channel with contract hash {}"

    iget-object v3, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->storedChannel:Lorg/bitcoinj/protocols/channels/StoredClientChannel;

    iget-object v3, v3, Lorg/bitcoinj/protocols/channels/StoredClientChannel;->contract:Lorg/bitcoinj/core/Transaction;

    invoke-virtual {v3}, Lorg/bitcoinj/core/Transaction;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v3

    invoke-interface {v1, v2, v3}, Lorg/slf4j/Logger;->info(Ljava/lang/String;Ljava/lang/Object;)V

    .line 639
    :goto_68
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v2

    sget-object v3, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;->CLIENT_VERSION:Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;

    .line 640
    invoke-virtual {v2, v3}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setType(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v2

    .line 641
    invoke-virtual {v2, v0}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setClientVersion(Lorg/bitcoin/paymentchannel/Protos$ClientVersion$Builder;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v0

    .line 642
    invoke-virtual {v0}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->build()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;

    move-result-object v0

    .line 639
    invoke-interface {v1, v0}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->sendToServer(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;)V
    :try_end_7f
    .catchall {:try_start_6 .. :try_end_7f} :catchall_8d

    .line 644
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    .line 645
    return-void

    .line 637
    :cond_85
    :try_start_85
    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v2, "Begun version handshake creating new channel"

    invoke-interface {v1, v2}, Lorg/slf4j/Logger;->info(Ljava/lang/String;)V
    :try_end_8c
    .catchall {:try_start_85 .. :try_end_8c} :catchall_8d

    goto :goto_68

    .line 644
    :catchall_8d
    move-exception v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    throw v0
.end method

.method public getMissing()Lorg/bitcoinj/core/Coin;
    .registers 2

    .prologue
    .line 271
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->missing:Lorg/bitcoinj/core/Coin;

    return-object v0
.end method

.method public incrementPayment(Lorg/bitcoinj/core/Coin;)Lcom/google/common/util/concurrent/y;
    .registers 3
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(",
            "Lorg/bitcoinj/core/Coin;",
            ")",
            "Lcom/google/common/util/concurrent/y",
            "<",
            "Lorg/bitcoinj/protocols/channels/PaymentIncrementAck;",
            ">;"
        }
    .end annotation

    .prologue
    const/4 v0, 0x0

    .line 679
    invoke-virtual {p0, p1, v0, v0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->incrementPayment(Lorg/bitcoinj/core/Coin;Lcom/google/protobuf/ByteString;Lorg/spongycastle/crypto/params/KeyParameter;)Lcom/google/common/util/concurrent/y;

    move-result-object v0

    return-object v0
.end method

.method public incrementPayment(Lorg/bitcoinj/core/Coin;Lcom/google/protobuf/ByteString;Lorg/spongycastle/crypto/params/KeyParameter;)Lcom/google/common/util/concurrent/y;
    .registers 10
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(",
            "Lorg/bitcoinj/core/Coin;",
            "Lcom/google/protobuf/ByteString;",
            "Lorg/spongycastle/crypto/params/KeyParameter;",
            ")",
            "Lcom/google/common/util/concurrent/y",
            "<",
            "Lorg/bitcoinj/protocols/channels/PaymentIncrementAck;",
            ">;"
        }
    .end annotation

    .prologue
    .line 703
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V

    .line 705
    :try_start_5
    invoke-virtual {p0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state()Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    move-result-object v0

    if-eqz v0, :cond_15

    iget-boolean v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->connectionOpen:Z

    if-eqz v0, :cond_15

    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->CHANNEL_OPEN:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    if-eq v0, v1, :cond_24

    .line 706
    :cond_15
    new-instance v0, Ljava/lang/IllegalStateException;

    const-string v1, "Channel is not fully initialized/has already been closed"

    invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V

    throw v0
    :try_end_1d
    .catchall {:try_start_5 .. :try_end_1d} :catchall_1d

    .line 735
    :catchall_1d
    move-exception v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    throw v0

    .line 707
    :cond_24
    :try_start_24
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->increasePaymentFuture:Lcom/google/common/util/concurrent/ao;

    if-eqz v0, :cond_30

    .line 708
    new-instance v0, Ljava/lang/IllegalStateException;

    const-string v1, "Already incrementing paying, wait for previous payment to complete."

    invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 709
    :cond_30
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->wallet:Lorg/bitcoinj/wallet/Wallet;

    invoke-virtual {v0}, Lorg/bitcoinj/wallet/Wallet;->isEncrypted()Z

    move-result v0

    if-eqz v0, :cond_40

    if-nez p3, :cond_40

    .line 710
    new-instance v0, Lorg/bitcoinj/core/ECKey$KeyIsEncryptedException;

    invoke-direct {v0}, Lorg/bitcoinj/core/ECKey$KeyIsEncryptedException;-><init>()V

    throw v0

    .line 712
    :cond_40
    invoke-virtual {p0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state()Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    move-result-object v0

    invoke-virtual {v0, p1, p3}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->incrementPaymentBy(Lorg/bitcoinj/core/Coin;Lorg/spongycastle/crypto/params/KeyParameter;)Lorg/bitcoinj/protocols/channels/PaymentChannelClientState$IncrementedPayment;

    move-result-object v0

    .line 713
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$UpdatePayment;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;

    move-result-object v1

    iget-object v2, v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState$IncrementedPayment;->signature:Lorg/bitcoinj/crypto/TransactionSignature;

    .line 714
    invoke-virtual {v2}, Lorg/bitcoinj/crypto/TransactionSignature;->encodeToBitcoin()[B

    move-result-object v2

    invoke-static {v2}, Lcom/google/protobuf/ByteString;->copyFrom([B)Lcom/google/protobuf/ByteString;

    move-result-object v2

    invoke-virtual {v1, v2}, Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;->setSignature(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;

    move-result-object v1

    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;

    .line 715
    invoke-virtual {v2}, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;->getValueRefunded()Lorg/bitcoinj/core/Coin;

    move-result-object v2

    iget-wide v2, v2, Lorg/bitcoinj/core/Coin;->value:J

    invoke-virtual {v1, v2, v3}, Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;->setClientChangeValue(J)Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;

    move-result-object v1

    .line 716
    if-eqz p2, :cond_6b

    invoke-virtual {v1, p2}, Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;->setInfo(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;

    .line 718
    :cond_6b
    invoke-static {}, Lcom/google/common/util/concurrent/ao;->yj()Lcom/google/common/util/concurrent/ao;

    move-result-object v2

    iput-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->increasePaymentFuture:Lcom/google/common/util/concurrent/ao;

    .line 719
    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->increasePaymentFuture:Lcom/google/common/util/concurrent/ao;

    new-instance v3, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$1;

    invoke-direct {v3, p0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$1;-><init>(Lorg/bitcoinj/protocols/channels/PaymentChannelClient;)V

    .line 1270
    new-instance v4, Lcom/google/common/util/concurrent/ah;

    const/4 v5, 0x0

    invoke-direct {v4, v5}, Lcom/google/common/util/concurrent/ah;-><init>(B)V

    .line 719
    invoke-virtual {v2, v3, v4}, Lcom/google/common/util/concurrent/ao;->a(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)V

    .line 728
    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v3

    .line 729
    invoke-virtual {v3, v1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setUpdatePayment(Lorg/bitcoin/paymentchannel/Protos$UpdatePayment$Builder;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v1

    sget-object v3, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;->UPDATE_PAYMENT:Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;

    .line 730
    invoke-virtual {v1, v3}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setType(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v1

    .line 731
    invoke-virtual {v1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->build()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;

    move-result-object v1

    .line 728
    invoke-interface {v2, v1}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->sendToServer(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;)V

    .line 732
    iget-object v0, v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClientState$IncrementedPayment;->amount:Lorg/bitcoinj/core/Coin;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lastPaymentActualAmount:Lorg/bitcoinj/core/Coin;

    .line 733
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->increasePaymentFuture:Lcom/google/common/util/concurrent/ao;
    :try_end_9e
    .catchall {:try_start_24 .. :try_end_9e} :catchall_1d

    .line 735
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    .line 733
    return-object v0
.end method

.method public receiveMessage(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;)V
    .registers 7

    .prologue
    const/4 v0, 0x1

    const/4 v1, 0x0

    .line 444
    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v2}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V

    .line 446
    :try_start_7
    iget-boolean v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->connectionOpen:Z

    invoke-static {v2}, Lcom/google/common/base/n;->checkState(Z)V
    :try_end_c
    .catchall {:try_start_7 .. :try_end_c} :catchall_18d

    .line 451
    :try_start_c
    sget-object v2, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$2;->$SwitchMap$org$bitcoin$paymentchannel$Protos$TwoWayChannelMessage$MessageType:[I

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getType()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;

    move-result-object v3

    invoke-virtual {v3}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;->ordinal()I

    move-result v3

    aget v2, v2, v3

    packed-switch v2, :pswitch_data_194

    .line 497
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v1, "Got unknown message type or type that doesn\'t apply to clients."

    invoke-interface {v0, v1}, Lorg/slf4j/Logger;->error(Ljava/lang/String;)V

    .line 498
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$Error;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    move-result-object v0

    sget-object v1, Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;->SYNTAX_ERROR:Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;

    .line 499
    invoke-virtual {v0, v1}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->setCode(Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;)Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    move-result-object v1

    .line 500
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->REMOTE_SENT_INVALID_MESSAGE:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    const-string v2, ""

    invoke-direct {p0, v0, v2}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->setIncreasePaymentFutureIfNeeded(Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;Ljava/lang/String;)V

    .line 501
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->REMOTE_SENT_INVALID_MESSAGE:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;
    :try_end_35
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_c .. :try_end_35} :catch_da
    .catch Ljava/lang/IllegalStateException; {:try_start_c .. :try_end_35} :catch_177
    .catchall {:try_start_c .. :try_end_35} :catchall_18d

    .line 516
    :goto_35
    :try_start_35
    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v3

    .line 517
    invoke-virtual {v3, v1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setError(Lorg/bitcoin/paymentchannel/Protos$Error$Builder;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v1

    sget-object v3, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;->ERROR:Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;

    .line 518
    invoke-virtual {v1, v3}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setType(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v1

    .line 519
    invoke-virtual {v1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->build()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;

    move-result-object v1

    .line 516
    invoke-interface {v2, v1}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->sendToServer(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;)V

    .line 520
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    invoke-interface {v1, v0}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->destroyConnection(Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;)V
    :try_end_51
    .catchall {:try_start_35 .. :try_end_51} :catchall_18d

    .line 522
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    .line 523
    :goto_56
    return-void

    .line 453
    :pswitch_57
    :try_start_57
    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    sget-object v3, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_VERSION_NEGOTIATION:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    if-ne v2, v3, :cond_8f

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->hasServerVersion()Z

    move-result v2

    if-eqz v2, :cond_8f

    :goto_63
    invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V

    .line 456
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getServerVersion()Lorg/bitcoin/paymentchannel/Protos$ServerVersion;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoin/paymentchannel/Protos$ServerVersion;->getMajor()I

    move-result v0

    iput v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->majorVersion:I

    .line 457
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->versionSelector:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;

    iget v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->majorVersion:I

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getServerVersion()Lorg/bitcoin/paymentchannel/Protos$ServerVersion;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoin/paymentchannel/Protos$ServerVersion;->getMinor()I

    move-result v2

    invoke-virtual {v0, v1, v2}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$VersionSelector;->isServerVersionAccepted(II)Z

    move-result v0

    if-nez v0, :cond_91

    .line 458
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$Error;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    move-result-object v0

    sget-object v1, Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;->NO_ACCEPTABLE_VERSION:Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;

    .line 459
    invoke-virtual {v0, v1}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->setCode(Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;)Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    move-result-object v1

    .line 460
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->NO_ACCEPTABLE_VERSION:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    goto :goto_35

    :cond_8f
    move v0, v1

    .line 453
    goto :goto_63

    .line 463
    :cond_91
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v1, "Got version handshake, awaiting INITIATE or resume CHANNEL_OPEN"

    invoke-interface {v0, v1}, Lorg/slf4j/Logger;->info(Ljava/lang/String;)V

    .line 464
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_INITIATE:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;
    :try_end_9c
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_57 .. :try_end_9c} :catch_da
    .catch Ljava/lang/IllegalStateException; {:try_start_57 .. :try_end_9c} :catch_177
    .catchall {:try_start_57 .. :try_end_9c} :catchall_18d

    .line 522
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    goto :goto_56

    .line 467
    :pswitch_a2
    :try_start_a2
    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    sget-object v3, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_INITIATE:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    if-ne v2, v3, :cond_c7

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->hasInitiate()Z

    move-result v2

    if-eqz v2, :cond_c7

    :goto_ae
    invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V

    .line 468
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getInitiate()Lorg/bitcoin/paymentchannel/Protos$Initiate;

    move-result-object v0

    .line 469
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$Error;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    move-result-object v1

    .line 470
    iget-object v2, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->maxValue:Lorg/bitcoinj/core/Coin;

    invoke-direct {p0, v0, v2, v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->receiveInitiate(Lorg/bitcoin/paymentchannel/Protos$Initiate;Lorg/bitcoinj/core/Coin;Lorg/bitcoin/paymentchannel/Protos$Error$Builder;)Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;
    :try_end_be
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_a2 .. :try_end_be} :catch_da
    .catch Ljava/lang/IllegalStateException; {:try_start_a2 .. :try_end_be} :catch_177
    .catchall {:try_start_a2 .. :try_end_be} :catchall_18d

    move-result-object v0

    .line 471
    if-nez v0, :cond_c9

    .line 522
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    goto :goto_56

    :cond_c7
    move v0, v1

    .line 467
    goto :goto_ae

    .line 473
    :cond_c9
    :try_start_c9
    sget-object v2, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v3, "Initiate failed with error: {}"

    invoke-virtual {v1}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->build()Lorg/bitcoin/paymentchannel/Protos$Error;

    move-result-object v4

    invoke-virtual {v4}, Lorg/bitcoin/paymentchannel/Protos$Error;->toString()Ljava/lang/String;

    move-result-object v4

    invoke-interface {v2, v3, v4}, Lorg/slf4j/Logger;->error(Ljava/lang/String;Ljava/lang/Object;)V
    :try_end_d8
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_c9 .. :try_end_d8} :catch_da
    .catch Ljava/lang/IllegalStateException; {:try_start_c9 .. :try_end_d8} :catch_177
    .catchall {:try_start_c9 .. :try_end_d8} :catchall_18d

    goto/16 :goto_35

    .line 504
    :catch_da
    move-exception v0

    .line 505
    :try_start_db
    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v2, "Caught verification exception handling message from server"

    invoke-interface {v1, v2, v0}, Lorg/slf4j/Logger;->error(Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 506
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$Error;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    move-result-object v1

    sget-object v2, Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;->BAD_TRANSACTION:Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;

    .line 507
    invoke-virtual {v1, v2}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->setCode(Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;)Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    move-result-object v1

    .line 508
    invoke-virtual {v0}, Lorg/bitcoinj/core/VerificationException;->getMessage()Ljava/lang/String;

    move-result-object v0

    invoke-virtual {v1, v0}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->setExplanation(Ljava/lang/String;)Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    move-result-object v1

    .line 509
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->REMOTE_SENT_INVALID_MESSAGE:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;
    :try_end_f6
    .catchall {:try_start_db .. :try_end_f6} :catchall_18d

    goto/16 :goto_35

    .line 476
    :pswitch_f8
    :try_start_f8
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->userKeySetup:Lorg/spongycastle/crypto/params/KeyParameter;

    invoke-direct {p0, p1, v0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->receiveRefund(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;Lorg/spongycastle/crypto/params/KeyParameter;)V

    .line 478
    const/4 v0, 0x0

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->userKeySetup:Lorg/spongycastle/crypto/params/KeyParameter;
    :try_end_100
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_f8 .. :try_end_100} :catch_da
    .catch Ljava/lang/IllegalStateException; {:try_start_f8 .. :try_end_100} :catch_177
    .catchall {:try_start_f8 .. :try_end_100} :catchall_18d

    .line 522
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    goto/16 :goto_56

    .line 481
    :pswitch_107
    :try_start_107
    invoke-direct {p0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->receiveChannelOpen()V
    :try_end_10a
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_107 .. :try_end_10a} :catch_da
    .catch Ljava/lang/IllegalStateException; {:try_start_107 .. :try_end_10a} :catch_177
    .catchall {:try_start_107 .. :try_end_10a} :catchall_18d

    .line 522
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    goto/16 :goto_56

    .line 484
    :pswitch_111
    :try_start_111
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getPaymentAck()Lorg/bitcoin/paymentchannel/Protos$PaymentAck;

    move-result-object v0

    invoke-direct {p0, v0}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->receivePaymentAck(Lorg/bitcoin/paymentchannel/Protos$PaymentAck;)V
    :try_end_118
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_111 .. :try_end_118} :catch_da
    .catch Ljava/lang/IllegalStateException; {:try_start_111 .. :try_end_118} :catch_177
    .catchall {:try_start_111 .. :try_end_118} :catchall_18d

    .line 522
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    goto/16 :goto_56

    .line 487
    :pswitch_11f
    :try_start_11f
    invoke-direct {p0, p1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->receiveClose(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;)V
    :try_end_122
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_11f .. :try_end_122} :catch_da
    .catch Ljava/lang/IllegalStateException; {:try_start_11f .. :try_end_122} :catch_177
    .catchall {:try_start_11f .. :try_end_122} :catchall_18d

    .line 522
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    goto/16 :goto_56

    .line 490
    :pswitch_129
    :try_start_129
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->hasError()Z

    move-result v0

    invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V

    .line 491
    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v2, "Server sent ERROR {} with explanation {}"

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getError()Lorg/bitcoin/paymentchannel/Protos$Error;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoin/paymentchannel/Protos$Error;->getCode()Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;->name()Ljava/lang/String;

    move-result-object v3

    .line 492
    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getError()Lorg/bitcoin/paymentchannel/Protos$Error;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoin/paymentchannel/Protos$Error;->hasExplanation()Z

    move-result v0

    if-eqz v0, :cond_174

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getError()Lorg/bitcoin/paymentchannel/Protos$Error;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoin/paymentchannel/Protos$Error;->getExplanation()Ljava/lang/String;

    move-result-object v0

    .line 491
    :goto_152
    invoke-interface {v1, v2, v3, v0}, Lorg/slf4j/Logger;->error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V

    .line 493
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->REMOTE_SENT_ERROR:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    invoke-virtual {p1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->getError()Lorg/bitcoin/paymentchannel/Protos$Error;

    move-result-object v1

    invoke-virtual {v1}, Lorg/bitcoin/paymentchannel/Protos$Error;->getCode()Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;

    move-result-object v1

    invoke-virtual {v1}, Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;->name()Ljava/lang/String;

    move-result-object v1

    invoke-direct {p0, v0, v1}, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->setIncreasePaymentFutureIfNeeded(Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;Ljava/lang/String;)V

    .line 494
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->REMOTE_SENT_ERROR:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;

    invoke-interface {v0, v1}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->destroyConnection(Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;)V
    :try_end_16d
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_129 .. :try_end_16d} :catch_da
    .catch Ljava/lang/IllegalStateException; {:try_start_129 .. :try_end_16d} :catch_177
    .catchall {:try_start_129 .. :try_end_16d} :catchall_18d

    .line 522
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    goto/16 :goto_56

    .line 492
    :cond_174
    :try_start_174
    const-string v0, ""
    :try_end_176
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_174 .. :try_end_176} :catch_da
    .catch Ljava/lang/IllegalStateException; {:try_start_174 .. :try_end_176} :catch_177
    .catchall {:try_start_174 .. :try_end_176} :catchall_18d

    goto :goto_152

    .line 510
    :catch_177
    move-exception v0

    .line 511
    :try_start_178
    sget-object v1, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v2, "Caught illegal state exception handling message from server"

    invoke-interface {v1, v2, v0}, Lorg/slf4j/Logger;->error(Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 512
    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$Error;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    move-result-object v0

    sget-object v1, Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;->SYNTAX_ERROR:Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;

    .line 513
    invoke-virtual {v0, v1}, Lorg/bitcoin/paymentchannel/Protos$Error$Builder;->setCode(Lorg/bitcoin/paymentchannel/Protos$Error$ErrorCode;)Lorg/bitcoin/paymentchannel/Protos$Error$Builder;

    move-result-object v1

    .line 514
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;->REMOTE_SENT_INVALID_MESSAGE:Lorg/bitcoinj/protocols/channels/PaymentChannelCloseException$CloseReason;
    :try_end_18b
    .catchall {:try_start_178 .. :try_end_18b} :catchall_18d

    goto/16 :goto_35

    .line 522
    :catchall_18d
    move-exception v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    throw v0

    .line 451
    :pswitch_data_194
    .packed-switch 0x1
        :pswitch_57
        :pswitch_a2
        :pswitch_f8
        :pswitch_107
        :pswitch_111
        :pswitch_11f
        :pswitch_129
    .end packed-switch
.end method

.method public settle()V
    .registers 4

    .prologue
    .line 597
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V

    .line 599
    :try_start_5
    iget-boolean v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->connectionOpen:Z

    invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V

    .line 600
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;->WAITING_FOR_CHANNEL_CLOSE:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->step:Lorg/bitcoinj/protocols/channels/PaymentChannelClient$InitStep;

    .line 601
    sget-object v0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->log:Lorg/slf4j/Logger;

    const-string v1, "Sending a CLOSE message to the server and waiting for response indicating successful settlement."

    invoke-interface {v0, v1}, Lorg/slf4j/Logger;->info(Ljava/lang/String;)V

    .line 602
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->conn:Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;

    invoke-static {}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;->newBuilder()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v1

    sget-object v2, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;->CLOSE:Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;

    .line 603
    invoke-virtual {v1, v2}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->setType(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$MessageType;)Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;

    move-result-object v1

    .line 604
    invoke-virtual {v1}, Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage$Builder;->build()Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;

    move-result-object v1

    .line 602
    invoke-interface {v0, v1}, Lorg/bitcoinj/protocols/channels/IPaymentChannelClient$ClientConnection;->sendToServer(Lorg/bitcoin/paymentchannel/Protos$TwoWayChannelMessage;)V
    :try_end_28
    .catchall {:try_start_5 .. :try_end_28} :catchall_2e

    .line 606
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    .line 607
    return-void

    .line 606
    :catchall_2e
    move-exception v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    throw v0
.end method

.method public state()Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;
    .registers 3

    .prologue
    .line 656
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V

    .line 658
    :try_start_5
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelClientState;
    :try_end_7
    .catchall {:try_start_5 .. :try_end_7} :catchall_d

    .line 660
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    .line 658
    return-object v0

    .line 660
    :catchall_d
    move-exception v0

    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/PaymentChannelClient;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V

    throw v0
.end method