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