KeyTimeCoinSelector.smali

.class public Lorg/bitcoinj/wallet/KeyTimeCoinSelector;
.super Ljava/lang/Object;
.source "KeyTimeCoinSelector.java"

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


# static fields
.field public static final MAX_SIMULTANEOUS_INPUTS:I = 0x258

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


# instance fields
.field private final ignorePending:Z

.field private final unixTimeSeconds:J

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


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

    .prologue
    .line 35
    const-class v0, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;

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

    move-result-object v0

    sput-object v0, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->log:Lorg/slf4j/Logger;

    return-void
.end method

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

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

    .line 45
    iput-wide p2, p0, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->unixTimeSeconds:J

    .line 46
    iput-object p1, p0, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->wallet:Lorg/bitcoinj/wallet/Wallet;

    .line 47
    iput-boolean p4, p0, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->ignorePending:Z

    .line 48
    return-void
.end method

.method private isConfirmed(Lorg/bitcoinj/core/TransactionOutput;)Z
    .registers 4

    .prologue
    .line 87
    invoke-virtual {p1}, Lorg/bitcoinj/core/TransactionOutput;->getParentTransaction()Lorg/bitcoinj/core/Transaction;

    move-result-object v0

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

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/core/TransactionConfidence;->getConfidenceType()Lorg/bitcoinj/core/TransactionConfidence$ConfidenceType;

    move-result-object v0

    sget-object v1, Lorg/bitcoinj/core/TransactionConfidence$ConfidenceType;->BUILDING:Lorg/bitcoinj/core/TransactionConfidence$ConfidenceType;

    invoke-virtual {v0, v1}, Lorg/bitcoinj/core/TransactionConfidence$ConfidenceType;->equals(Ljava/lang/Object;)Z

    move-result v0

    return v0
.end method


# virtual methods
.method public select(Lorg/bitcoinj/core/Coin;Ljava/util/List;)Lorg/bitcoinj/wallet/CoinSelection;
    .registers 13
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(",
            "Lorg/bitcoinj/core/Coin;",
            "Ljava/util/List",
            "<",
            "Lorg/bitcoinj/core/TransactionOutput;",
            ">;)",
            "Lorg/bitcoinj/wallet/CoinSelection;"
        }
    .end annotation

    .prologue
    .line 1232
    :try_start_0
    new-instance v3, Ljava/util/LinkedList;

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

    .line 54
    sget-object v1, Lorg/bitcoinj/core/Coin;->ZERO:Lorg/bitcoinj/core/Coin;

    .line 55
    invoke-interface {p2}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v4

    :cond_b
    :goto_b
    invoke-interface {v4}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_8d

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

    move-result-object v0

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

    .line 56
    iget-boolean v2, p0, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->ignorePending:Z

    if-eqz v2, :cond_21

    invoke-direct {p0, v0}, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->isConfirmed(Lorg/bitcoinj/core/TransactionOutput;)Z

    move-result v2

    if-eqz v2, :cond_b

    .line 60
    :cond_21
    invoke-virtual {v0}, Lorg/bitcoinj/core/TransactionOutput;->getScriptPubKey()Lorg/bitcoinj/script/Script;

    move-result-object v2

    .line 62
    invoke-virtual {v2}, Lorg/bitcoinj/script/Script;->isSentToRawPubKey()Z

    move-result v5

    if-eqz v5, :cond_6d

    .line 63
    iget-object v5, p0, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->wallet:Lorg/bitcoinj/wallet/Wallet;

    invoke-virtual {v2}, Lorg/bitcoinj/script/Script;->getPubKey()[B

    move-result-object v2

    invoke-virtual {v5, v2}, Lorg/bitcoinj/wallet/Wallet;->findKeyFromPubKey([B)Lorg/bitcoinj/core/ECKey;

    move-result-object v2

    .line 70
    :goto_35
    const-string v5, "Coin selector given output as candidate for which we lack the key"

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

    .line 71
    invoke-virtual {v2}, Lorg/bitcoinj/core/ECKey;->getCreationTimeSeconds()J

    move-result-wide v6

    iget-wide v8, p0, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->unixTimeSeconds:J

    cmp-long v2, v6, v8

    if-gez v2, :cond_b

    .line 73
    invoke-virtual {v0}, Lorg/bitcoinj/core/TransactionOutput;->getValue()Lorg/bitcoinj/core/Coin;

    move-result-object v2

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

    move-result-object v1

    .line 74
    invoke-virtual {v3, v0}, Ljava/util/LinkedList;->push(Ljava/lang/Object;)V

    .line 75
    invoke-virtual {v3}, Ljava/util/LinkedList;->size()I

    move-result v0

    const/16 v2, 0x258

    if-lt v0, v2, :cond_b

    .line 76
    sget-object v0, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->log:Lorg/slf4j/Logger;

    const-string v2, "Reached {} inputs, going further would yield a tx that is too large, stopping here."

    invoke-virtual {v3}, Ljava/util/LinkedList;->size()I

    move-result v4

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

    move-result-object v4

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

    move-object v0, v1

    .line 80
    :goto_67
    new-instance v1, Lorg/bitcoinj/wallet/CoinSelection;

    invoke-direct {v1, v0, v3}, Lorg/bitcoinj/wallet/CoinSelection;-><init>(Lorg/bitcoinj/core/Coin;Ljava/util/Collection;)V

    return-object v1

    .line 64
    :cond_6d
    invoke-virtual {v2}, Lorg/bitcoinj/script/Script;->isSentToAddress()Z

    move-result v5

    if-eqz v5, :cond_7e

    .line 65
    iget-object v5, p0, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->wallet:Lorg/bitcoinj/wallet/Wallet;

    invoke-virtual {v2}, Lorg/bitcoinj/script/Script;->getPubKeyHash()[B

    move-result-object v2

    invoke-virtual {v5, v2}, Lorg/bitcoinj/wallet/Wallet;->findKeyFromPubHash([B)Lorg/bitcoinj/core/ECKey;

    move-result-object v2

    goto :goto_35

    .line 67
    :cond_7e
    sget-object v2, Lorg/bitcoinj/wallet/KeyTimeCoinSelector;->log:Lorg/slf4j/Logger;

    const-string v5, "Skipping tx output {} because it\'s not of simple form."

    invoke-interface {v2, v5, v0}, Lorg/slf4j/Logger;->info(Ljava/lang/String;Ljava/lang/Object;)V
    :try_end_85
    .catch Lorg/bitcoinj/core/ScriptException; {:try_start_0 .. :try_end_85} :catch_86

    goto :goto_b

    .line 81
    :catch_86
    move-exception v0

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

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

    throw v1

    :cond_8d
    move-object v0, v1

    goto :goto_67
.end method