StoredPaymentChannelServerStates.smali

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

# interfaces
.implements Lorg/bitcoinj/wallet/WalletExtension;


# static fields
.field public static final CHANNEL_EXPIRE_OFFSET:J = -0x1c20L

.field static final EXTENSION_ID:Ljava/lang/String;

.field static final MAX_SECONDS_TO_WAIT_FOR_BROADCASTER_TO_BE_SET:I = 0xa

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


# instance fields
.field private final broadcasterFuture:Lcom/google/common/util/concurrent/ao;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Lcom/google/common/util/concurrent/ao",
            "<",
            "Lorg/bitcoinj/core/TransactionBroadcaster;",
            ">;"
        }
    .end annotation
.end field

.field private final channelTimeoutHandler:Ljava/util/Timer;

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

.field final mapChannels:Ljava/util/Map;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/util/Map",
            "<",
            "Lorg/bitcoinj/core/Sha256Hash;",
            "Lorg/bitcoinj/protocols/channels/StoredServerChannel;",
            ">;"
        }
    .end annotation
.end field

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


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

    .prologue
    .line 45
    const-class v0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;

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

    move-result-object v0

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

    .line 47
    const-class v0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;

    invoke-virtual {v0}, Ljava/lang/Class;->getName()Ljava/lang/String;

    move-result-object v0

    sput-object v0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->EXTENSION_ID:Ljava/lang/String;

    return-void
.end method

.method public constructor <init>(Lorg/bitcoinj/wallet/Wallet;)V
    .registers 4

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

    .line 50
    new-instance v0, Ljava/util/HashMap;

    invoke-direct {v0}, Ljava/util/HashMap;-><init>()V

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->mapChannels:Ljava/util/Map;

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

    move-result-object v0

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->broadcasterFuture:Lcom/google/common/util/concurrent/ao;

    .line 54
    new-instance v0, Ljava/util/Timer;

    const/4 v1, 0x1

    invoke-direct {v0, v1}, Ljava/util/Timer;-><init>(Z)V

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->channelTimeoutHandler:Ljava/util/Timer;

    .line 56
    const-string v0, "StoredPaymentChannelServerStates"

    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/StoredPaymentChannelServerStates;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    .line 82
    iput-object p1, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->wallet:Lorg/bitcoinj/wallet/Wallet;

    .line 83
    return-void
.end method

.method public constructor <init>(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/TransactionBroadcaster;)V
    .registers 5

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

    .line 50
    new-instance v0, Ljava/util/HashMap;

    invoke-direct {v0}, Ljava/util/HashMap;-><init>()V

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->mapChannels:Ljava/util/Map;

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

    move-result-object v0

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->broadcasterFuture:Lcom/google/common/util/concurrent/ao;

    .line 54
    new-instance v0, Ljava/util/Timer;

    const/4 v1, 0x1

    invoke-direct {v0, v1}, Ljava/util/Timer;-><init>(Z)V

    iput-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->channelTimeoutHandler:Ljava/util/Timer;

    .line 56
    const-string v0, "StoredPaymentChannelServerStates"

    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/StoredPaymentChannelServerStates;->lock:Ljava/util/concurrent/locks/ReentrantLock;

    .line 72
    invoke-virtual {p0, p2}, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->setTransactionBroadcaster(Lorg/bitcoinj/core/TransactionBroadcaster;)V

    .line 73
    iput-object p1, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->wallet:Lorg/bitcoinj/wallet/Wallet;

    .line 74
    return-void
.end method

.method static synthetic access$000()Lorg/slf4j/Logger;
    .registers 1

    .prologue
    .line 44
    sget-object v0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->log:Lorg/slf4j/Logger;

    return-object v0
.end method

.method private getBroadcaster()Lorg/bitcoinj/core/TransactionBroadcaster;
    .registers 5

    .prologue
    .line 138
    :try_start_0
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->broadcasterFuture:Lcom/google/common/util/concurrent/ao;

    const-wide/16 v2, 0xa

    sget-object v1, Ljava/util/concurrent/TimeUnit;->SECONDS:Ljava/util/concurrent/TimeUnit;

    invoke-virtual {v0, v2, v3, v1}, Lcom/google/common/util/concurrent/ao;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/core/TransactionBroadcaster;
    :try_end_c
    .catch Ljava/lang/InterruptedException; {:try_start_0 .. :try_end_c} :catch_d
    .catch Ljava/util/concurrent/ExecutionException; {:try_start_0 .. :try_end_c} :catch_14
    .catch Ljava/util/concurrent/TimeoutException; {:try_start_0 .. :try_end_c} :catch_1b

    return-object v0

    .line 139
    :catch_d
    move-exception v0

    .line 140
    new-instance v1, Ljava/lang/RuntimeException;

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

    throw v1

    .line 141
    :catch_14
    move-exception v0

    .line 142
    new-instance v1, Ljava/lang/RuntimeException;

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

    throw v1

    .line 143
    :catch_1b
    move-exception v0

    .line 144
    const-string v1, "Transaction broadcaster not set"

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

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

    .line 146
    new-instance v2, Ljava/lang/RuntimeException;

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

    throw v2
.end method

.method public static getFromWallet(Lorg/bitcoinj/wallet/Wallet;)Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;
    .registers 3

    .prologue
    .line 98
    invoke-virtual {p0}, Lorg/bitcoinj/wallet/Wallet;->getExtensions()Ljava/util/Map;

    move-result-object v0

    sget-object v1, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->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/StoredPaymentChannelServerStates;

    return-object v0
.end method

.method private getNetworkParameters()Lorg/bitcoinj/core/NetworkParameters;
    .registers 2

    .prologue
    .line 311
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->wallet:Lorg/bitcoinj/wallet/Wallet;

    if-eqz v0, :cond_b

    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->wallet:Lorg/bitcoinj/wallet/Wallet;

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

    move-result-object v0

    :goto_a
    return-object v0

    :cond_b
    const/4 v0, 0x0

    goto :goto_a
.end method


# virtual methods
.method public closeChannel(Lorg/bitcoinj/protocols/channels/StoredServerChannel;)V
    .registers 5

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

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

    .line 112
    :try_start_5
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->mapChannels:Ljava/util/Map;

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

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

    move-result-object v1

    invoke-interface {v0, v1}, Ljava/util/Map;->remove(Ljava/lang/Object;)Ljava/lang/Object;
    :try_end_10
    .catchall {:try_start_5 .. :try_end_10} :catchall_37

    move-result-object v0

    if-nez v0, :cond_19

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

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

    .line 130
    :goto_18
    return-void

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

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

    .line 117
    monitor-enter p1

    .line 118
    :try_start_1f
    invoke-virtual {p1}, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->closeConnectedHandler()V
    :try_end_22
    .catchall {:try_start_1f .. :try_end_22} :catchall_47

    .line 120
    :try_start_22
    invoke-direct {p0}, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->getBroadcaster()Lorg/bitcoinj/core/TransactionBroadcaster;

    move-result-object v0

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

    invoke-virtual {p1, v1, v0}, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->getOrCreateState(Lorg/bitcoinj/wallet/Wallet;Lorg/bitcoinj/core/TransactionBroadcaster;)Lorg/bitcoinj/protocols/channels/PaymentChannelServerState;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/PaymentChannelServerState;->close()Lcom/google/common/util/concurrent/y;
    :try_end_2f
    .catch Lorg/bitcoinj/core/InsufficientMoneyException; {:try_start_22 .. :try_end_2f} :catch_3e
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_22 .. :try_end_2f} :catch_4a
    .catchall {:try_start_22 .. :try_end_2f} :catchall_47

    .line 127
    :goto_2f
    const/4 v0, 0x0

    :try_start_30
    iput-object v0, p1, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->state:Lorg/bitcoinj/protocols/channels/PaymentChannelServerState;

    .line 128
    monitor-exit p1
    :try_end_33
    .catchall {:try_start_30 .. :try_end_33} :catchall_47

    .line 129
    invoke-virtual {p0, p1}, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->updatedChannel(Lorg/bitcoinj/protocols/channels/StoredServerChannel;)V

    goto :goto_18

    .line 115
    :catchall_37
    move-exception v0

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

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

    throw v0

    .line 122
    :catch_3e
    move-exception v0

    .line 123
    :try_start_3f
    sget-object v1, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->log:Lorg/slf4j/Logger;

    const-string v2, "Exception when closing channel"

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

    goto :goto_2f

    .line 128
    :catchall_47
    move-exception v0

    monitor-exit p1
    :try_end_49
    .catchall {:try_start_3f .. :try_end_49} :catchall_47

    throw v0

    .line 124
    :catch_4a
    move-exception v0

    .line 125
    :try_start_4b
    sget-object v1, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->log:Lorg/slf4j/Logger;

    const-string v2, "Exception when closing channel"

    invoke-interface {v1, v2, v0}, Lorg/slf4j/Logger;->error(Ljava/lang/String;Ljava/lang/Throwable;)V
    :try_end_52
    .catchall {:try_start_4b .. :try_end_52} :catchall_47

    goto :goto_2f
.end method

.method public deserializeWalletExtension(Lorg/bitcoinj/wallet/Wallet;[B)V
    .registers 17

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

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

    .line 268
    :try_start_5
    iput-object p1, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->wallet:Lorg/bitcoinj/wallet/Wallet;

    .line 269
    invoke-static/range {p2 .. p2}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannels;->parseFrom([B)Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannels;

    move-result-object v0

    .line 270
    invoke-virtual {p1}, Lorg/bitcoinj/wallet/Wallet;->getParams()Lorg/bitcoinj/core/NetworkParameters;

    move-result-object v12

    .line 271
    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannels;->getChannelsList()Ljava/util/List;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v13

    :goto_17
    invoke-interface {v13}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_91

    invoke-interface {v13}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;

    .line 272
    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;->getMajorVersion()I

    move-result v3

    .line 273
    const/4 v5, 0x0

    .line 274
    const/4 v9, 0x0

    .line 275
    const/4 v1, 0x1

    if-ne v3, v1, :cond_82

    .line 276
    new-instance v5, Lorg/bitcoinj/core/TransactionOutput;

    const/4 v1, 0x0

    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;->getClientOutput()Lcom/google/protobuf/ByteString;

    move-result-object v2

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

    move-result-object v2

    const/4 v4, 0x0

    invoke-direct {v5, v12, v1, v2, v4}, Lorg/bitcoinj/core/TransactionOutput;-><init>(Lorg/bitcoinj/core/NetworkParameters;Lorg/bitcoinj/core/Transaction;[BI)V

    .line 280
    :goto_3b
    new-instance v1, Lorg/bitcoinj/protocols/channels/StoredServerChannel;

    const/4 v2, 0x0

    .line 282
    invoke-virtual {v12}, Lorg/bitcoinj/core/NetworkParameters;->getDefaultSerializer()Lorg/bitcoinj/core/MessageSerializer;

    move-result-object v4

    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;->getContractTransaction()Lcom/google/protobuf/ByteString;

    move-result-object v6

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

    move-result-object v6

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

    move-result-object v4

    .line 284
    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;->getRefundTransactionUnlockTimeSecs()J

    move-result-wide v6

    .line 285
    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;->getMyKey()Lcom/google/protobuf/ByteString;

    move-result-object v8

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

    move-result-object v8

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

    move-result-object v8

    .line 287
    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;->getBestValueToMe()J

    move-result-wide v10

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

    move-result-object v10

    .line 288
    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;->hasBestValueSignature()Z

    move-result v11

    if-eqz v11, :cond_8f

    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;->getBestValueSignature()Lcom/google/protobuf/ByteString;

    move-result-object v0

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

    move-result-object v11

    :goto_74
    invoke-direct/range {v1 .. v11}, Lorg/bitcoinj/protocols/channels/StoredServerChannel;-><init>(Lorg/bitcoinj/protocols/channels/PaymentChannelServerState;ILorg/bitcoinj/core/Transaction;Lorg/bitcoinj/core/TransactionOutput;JLorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/ECKey;Lorg/bitcoinj/core/Coin;[B)V

    .line 289
    invoke-virtual {p0, v1}, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->putChannel(Lorg/bitcoinj/protocols/channels/StoredServerChannel;)V
    :try_end_7a
    .catchall {:try_start_5 .. :try_end_7a} :catchall_7b

    goto :goto_17

    .line 292
    :catchall_7b
    move-exception v0

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

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

    throw v0

    .line 278
    :cond_82
    :try_start_82
    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;->getClientKey()Lcom/google/protobuf/ByteString;

    move-result-object v1

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

    move-result-object v1

    invoke-static {v1}, Lorg/bitcoinj/core/ECKey;->fromPublicOnly([B)Lorg/bitcoinj/core/ECKey;
    :try_end_8d
    .catchall {:try_start_82 .. :try_end_8d} :catchall_7b

    move-result-object v9

    goto :goto_3b

    .line 288
    :cond_8f
    const/4 v11, 0x0

    goto :goto_74

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

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

    .line 293
    return-void
.end method

.method public getChannel(Lorg/bitcoinj/core/Sha256Hash;)Lorg/bitcoinj/protocols/channels/StoredServerChannel;
    .registers 4

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

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

    .line 156
    :try_start_5
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->mapChannels:Ljava/util/Map;

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

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;
    :try_end_d
    .catchall {:try_start_5 .. :try_end_d} :catchall_13

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

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

    .line 156
    return-object v0

    .line 158
    :catchall_13
    move-exception v0

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

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

    throw v0
.end method

.method public getChannelMap()Ljava/util/Map;
    .registers 3
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "()",
            "Ljava/util/Map",
            "<",
            "Lorg/bitcoinj/core/Sha256Hash;",
            "Lorg/bitcoinj/protocols/channels/StoredServerChannel;",
            ">;"
        }
    .end annotation

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

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

    .line 168
    :try_start_5
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->mapChannels:Ljava/util/Map;

    invoke-static {v0}, Lcom/google/common/collect/ImmutableMap;->copyOf(Ljava/util/Map;)Lcom/google/common/collect/ImmutableMap;
    :try_end_a
    .catchall {:try_start_5 .. :try_end_a} :catchall_11

    move-result-object v0

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

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

    .line 168
    return-object v0

    .line 170
    :catchall_11
    move-exception v0

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

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

    throw v0
.end method

.method public getWalletExtensionID()Ljava/lang/String;
    .registers 2

    .prologue
    .line 219
    sget-object v0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->EXTENSION_ID:Ljava/lang/String;

    return-object v0
.end method

.method public isWalletExtensionMandatory()Z
    .registers 2

    .prologue
    .line 224
    const/4 v0, 0x0

    return v0
.end method

.method public putChannel(Lorg/bitcoinj/protocols/channels/StoredServerChannel;)V
    .registers 10

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

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

    .line 193
    :try_start_5
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->mapChannels:Ljava/util/Map;

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

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

    move-result-object v1

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

    move-result-object v2

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

    move-result-object v0

    if-nez v0, :cond_4c

    const/4 v0, 0x1

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

    .line 195
    new-instance v0, Ljava/util/Date;

    iget-wide v2, p1, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->refundTransactionUnlockTimeSecs:J

    const-wide/16 v4, -0x1c20

    add-long/2addr v2, v4

    const-wide/16 v4, 0x3e8

    mul-long/2addr v2, v4

    .line 196
    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J

    move-result-wide v4

    invoke-static {}, Lorg/bitcoinj/core/Utils;->currentTimeMillis()J

    move-result-wide v6

    sub-long/2addr v4, v6

    add-long/2addr v2, v4

    invoke-direct {v0, v2, v3}, Ljava/util/Date;-><init>(J)V

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

    const-string v2, "Scheduling channel for automatic closure at {}: {}"

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

    .line 198
    iget-object v1, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->channelTimeoutHandler:Ljava/util/Timer;

    new-instance v2, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates$1;

    invoke-direct {v2, p0, p1}, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates$1;-><init>(Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;Lorg/bitcoinj/protocols/channels/StoredServerChannel;)V

    invoke-virtual {v1, v2, v0}, Ljava/util/Timer;->schedule(Ljava/util/TimerTask;Ljava/util/Date;)V
    :try_end_43
    .catchall {:try_start_5 .. :try_end_43} :catchall_4e

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

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

    .line 214
    invoke-virtual {p0, p1}, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->updatedChannel(Lorg/bitcoinj/protocols/channels/StoredServerChannel;)V

    .line 215
    return-void

    .line 193
    :cond_4c
    const/4 v0, 0x0

    goto :goto_18

    .line 212
    :catchall_4e
    move-exception v0

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

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

    throw v0
.end method

.method public serializeWalletExtension()[B
    .registers 13

    .prologue
    const/4 v3, 0x0

    const/4 v2, 0x1

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

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

    .line 231
    :try_start_7
    invoke-direct {p0}, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->getNetworkParameters()Lorg/bitcoinj/core/NetworkParameters;

    move-result-object v1

    .line 233
    if-eqz v1, :cond_bc

    invoke-virtual {v1}, Lorg/bitcoinj/core/NetworkParameters;->hasMaxMoney()Z

    move-result v0

    move v5, v0

    .line 234
    :goto_12
    if-eqz v1, :cond_bf

    invoke-virtual {v1}, Lorg/bitcoinj/core/NetworkParameters;->getMaxMoney()Lorg/bitcoinj/core/Coin;

    move-result-object v0

    move-object v4, v0

    .line 235
    :goto_19
    invoke-static {}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannels;->newBuilder()Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannels$Builder;

    move-result-object v6

    .line 236
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->mapChannels:Ljava/util/Map;

    invoke-interface {v0}, Ljava/util/Map;->values()Ljava/util/Collection;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/Collection;->iterator()Ljava/util/Iterator;

    move-result-object v7

    :goto_27
    invoke-interface {v7}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_d6

    invoke-interface {v7}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

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

    .line 239
    iget-object v1, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->bestValueToMe:Lorg/bitcoinj/core/Coin;

    invoke-virtual {v1}, Lorg/bitcoinj/core/Coin;->signum()I

    move-result v1

    if-ltz v1, :cond_c4

    if-eqz v5, :cond_45

    iget-object v1, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->bestValueToMe:Lorg/bitcoinj/core/Coin;

    .line 240
    invoke-virtual {v1, v4}, Lorg/bitcoinj/core/Coin;->compareTo(Lorg/bitcoinj/core/Coin;)I

    move-result v1

    if-gtz v1, :cond_c4

    :cond_45
    move v1, v2

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

    .line 241
    iget-wide v8, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->refundTransactionUnlockTimeSecs:J

    const-wide/16 v10, 0x0

    cmp-long v1, v8, v10

    if-lez v1, :cond_c6

    move v1, v2

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

    .line 242
    iget-object v1, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->myKey:Lorg/bitcoinj/core/ECKey;

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

    move-result-object v1

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

    .line 243
    invoke-static {}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel;->newBuilder()Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;

    move-result-object v1

    iget v8, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->majorVersion:I

    .line 244
    invoke-virtual {v1, v8}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;->setMajorVersion(I)Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;

    move-result-object v1

    iget-object v8, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->bestValueToMe:Lorg/bitcoinj/core/Coin;

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

    .line 245
    invoke-virtual {v1, v8, v9}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;->setBestValueToMe(J)Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;

    move-result-object v1

    iget-wide v8, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->refundTransactionUnlockTimeSecs:J

    .line 246
    invoke-virtual {v1, v8, v9}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;->setRefundTransactionUnlockTimeSecs(J)Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;

    move-result-object v1

    iget-object v8, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->contract:Lorg/bitcoinj/core/Transaction;

    .line 247
    invoke-virtual {v8}, Lorg/bitcoinj/core/Transaction;->unsafeBitcoinSerialize()[B

    move-result-object v8

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

    move-result-object v8

    invoke-virtual {v1, v8}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;->setContractTransaction(Lcom/google/protobuf/ByteString;)Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;

    move-result-object v1

    iget-object v8, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->myKey:Lorg/bitcoinj/core/ECKey;

    .line 248
    invoke-virtual {v8}, Lorg/bitcoinj/core/ECKey;->getPrivKeyBytes()[B

    move-result-object v8

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

    move-result-object v8

    invoke-virtual {v1, v8}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;->setMyKey(Lcom/google/protobuf/ByteString;)Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;

    move-result-object v1

    .line 249
    iget v8, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->majorVersion:I

    if-ne v8, v2, :cond_c8

    .line 250
    iget-object v8, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->clientOutput:Lorg/bitcoinj/core/TransactionOutput;

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

    move-result-object v8

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

    move-result-object v8

    invoke-virtual {v1, v8}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;->setClientOutput(Lcom/google/protobuf/ByteString;)Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;

    .line 254
    :goto_a3
    iget-object v8, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->bestValueSignature:[B

    if-eqz v8, :cond_b0

    .line 255
    iget-object v0, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->bestValueSignature:[B

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

    move-result-object v0

    invoke-virtual {v1, v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;->setBestValueSignature(Lcom/google/protobuf/ByteString;)Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;

    .line 256
    :cond_b0
    invoke-virtual {v6, v1}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannels$Builder;->addChannels(Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;)Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannels$Builder;
    :try_end_b3
    .catchall {:try_start_7 .. :try_end_b3} :catchall_b5

    goto/16 :goto_27

    .line 260
    :catchall_b5
    move-exception v0

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

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

    throw v0

    :cond_bc
    move v5, v2

    .line 233
    goto/16 :goto_12

    .line 234
    :cond_bf
    :try_start_bf
    sget-object v0, Lorg/bitcoinj/core/NetworkParameters;->MAX_MONEY:Lorg/bitcoinj/core/Coin;

    move-object v4, v0

    goto/16 :goto_19

    :cond_c4
    move v1, v3

    .line 240
    goto :goto_46

    :cond_c6
    move v1, v3

    .line 241
    goto :goto_52

    .line 252
    :cond_c8
    iget-object v8, v0, Lorg/bitcoinj/protocols/channels/StoredServerChannel;->clientKey:Lorg/bitcoinj/core/ECKey;

    invoke-virtual {v8}, Lorg/bitcoinj/core/ECKey;->getPubKey()[B

    move-result-object v8

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

    move-result-object v8

    invoke-virtual {v1, v8}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;->setClientKey(Lcom/google/protobuf/ByteString;)Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannel$Builder;

    goto :goto_a3

    .line 258
    :cond_d6
    invoke-virtual {v6}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannels$Builder;->build()Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannels;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/protocols/channels/ServerState$StoredServerPaymentChannels;->toByteArray()[B
    :try_end_dd
    .catchall {:try_start_bf .. :try_end_dd} :catchall_b5

    move-result-object v0

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

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

    .line 258
    return-object v0
.end method

.method public final setTransactionBroadcaster(Lorg/bitcoinj/core/TransactionBroadcaster;)V
    .registers 4

    .prologue
    .line 92
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->broadcasterFuture:Lcom/google/common/util/concurrent/ao;

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

    move-result-object v1

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

    .line 93
    return-void
.end method

.method public toString()Ljava/lang/String;
    .registers 4

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

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

    .line 300
    :try_start_5
    new-instance v1, Ljava/lang/StringBuilder;

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

    .line 301
    iget-object v0, p0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->mapChannels:Ljava/util/Map;

    invoke-interface {v0}, Ljava/util/Map;->values()Ljava/util/Collection;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/Collection;->iterator()Ljava/util/Iterator;

    move-result-object v2

    :goto_14
    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_2b

    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

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

    .line 302
    invoke-virtual {v1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
    :try_end_23
    .catchall {:try_start_5 .. :try_end_23} :catchall_24

    goto :goto_14

    .line 306
    :catchall_24
    move-exception v0

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

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

    throw v0

    .line 304
    :cond_2b
    :try_start_2b
    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    :try_end_2e
    .catchall {:try_start_2b .. :try_end_2e} :catchall_24

    move-result-object v0

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

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

    .line 304
    return-object v0
.end method

.method public updatedChannel(Lorg/bitcoinj/protocols/channels/StoredServerChannel;)V
    .registers 5

    .prologue
    .line 179
    sget-object v0, Lorg/bitcoinj/protocols/channels/StoredPaymentChannelServerStates;->log:Lorg/slf4j/Logger;

    const-string v1, "Stored server channel {} was updated"

    invoke-virtual {p1}, Ljava/lang/Object;->hashCode()I

    move-result v2

    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v2

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

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

    invoke-virtual {v0, p0}, Lorg/bitcoinj/wallet/Wallet;->addOrUpdateExtension(Lorg/bitcoinj/wallet/WalletExtension;)V

    .line 181
    return-void
.end method