LocalTransactionSigner.smali

.class public Lorg/bitcoinj/signers/LocalTransactionSigner;
.super Lorg/bitcoinj/signers/StatelessTransactionSigner;
.source "LocalTransactionSigner.java"


# static fields
.field private static final MINIMUM_VERIFY_FLAGS:Ljava/util/EnumSet;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/util/EnumSet",
            "<",
            "Lorg/bitcoinj/script/Script$VerifyFlag;",
            ">;"
        }
    .end annotation
.end field

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


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

    .prologue
    .line 46
    const-class v0, Lorg/bitcoinj/signers/LocalTransactionSigner;

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

    move-result-object v0

    sput-object v0, Lorg/bitcoinj/signers/LocalTransactionSigner;->log:Lorg/slf4j/Logger;

    .line 52
    sget-object v0, Lorg/bitcoinj/script/Script$VerifyFlag;->P2SH:Lorg/bitcoinj/script/Script$VerifyFlag;

    sget-object v1, Lorg/bitcoinj/script/Script$VerifyFlag;->NULLDUMMY:Lorg/bitcoinj/script/Script$VerifyFlag;

    invoke-static {v0, v1}, Ljava/util/EnumSet;->of(Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;

    move-result-object v0

    sput-object v0, Lorg/bitcoinj/signers/LocalTransactionSigner;->MINIMUM_VERIFY_FLAGS:Ljava/util/EnumSet;

    return-void
.end method

.method public constructor <init>()V
    .registers 1

    .prologue
    .line 45
    invoke-direct {p0}, Lorg/bitcoinj/signers/StatelessTransactionSigner;-><init>()V

    return-void
.end method


# virtual methods
.method public isReady()Z
    .registers 2

    .prologue
    .line 57
    const/4 v0, 0x1

    return v0
.end method

.method public signInputs(Lorg/bitcoinj/signers/TransactionSigner$ProposedTransaction;Lorg/bitcoinj/wallet/KeyBag;)Z
    .registers 15

    .prologue
    const/4 v8, 0x0

    .line 62
    iget-object v1, p1, Lorg/bitcoinj/signers/TransactionSigner$ProposedTransaction;->partialTx:Lorg/bitcoinj/core/Transaction;

    .line 63
    invoke-virtual {v1}, Lorg/bitcoinj/core/Transaction;->getInputs()Ljava/util/List;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/List;->size()I

    move-result v9

    move v7, v8

    .line 64
    :goto_c
    if-ge v7, v9, :cond_ab

    .line 65
    int-to-long v2, v7

    invoke-virtual {v1, v2, v3}, Lorg/bitcoinj/core/Transaction;->getInput(J)Lorg/bitcoinj/core/TransactionInput;

    move-result-object v10

    .line 66
    invoke-virtual {v10}, Lorg/bitcoinj/core/TransactionInput;->getConnectedOutput()Lorg/bitcoinj/core/TransactionOutput;

    move-result-object v0

    if-nez v0, :cond_28

    .line 67
    sget-object v0, Lorg/bitcoinj/signers/LocalTransactionSigner;->log:Lorg/slf4j/Logger;

    const-string v2, "Missing connected output, assuming input {} is already signed."

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

    move-result-object v3

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

    .line 64
    :goto_24
    add-int/lit8 v0, v7, 0x1

    move v7, v0

    goto :goto_c

    .line 75
    :cond_28
    :try_start_28
    invoke-virtual {v10}, Lorg/bitcoinj/core/TransactionInput;->getScriptSig()Lorg/bitcoinj/script/Script;

    move-result-object v0

    int-to-long v2, v7

    invoke-virtual {v10}, Lorg/bitcoinj/core/TransactionInput;->getConnectedOutput()Lorg/bitcoinj/core/TransactionOutput;

    move-result-object v4

    invoke-virtual {v4}, Lorg/bitcoinj/core/TransactionOutput;->getScriptPubKey()Lorg/bitcoinj/script/Script;

    move-result-object v4

    sget-object v5, Lorg/bitcoinj/signers/LocalTransactionSigner;->MINIMUM_VERIFY_FLAGS:Ljava/util/EnumSet;

    invoke-virtual/range {v0 .. v5}, Lorg/bitcoinj/script/Script;->correctlySpends(Lorg/bitcoinj/core/Transaction;JLorg/bitcoinj/script/Script;Ljava/util/Set;)V

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

    const-string v2, "Input {} already correctly spends output, assuming SIGHASH type used will be safe and skipping signing."

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

    move-result-object v3

    invoke-interface {v0, v2, v3}, Lorg/slf4j/Logger;->warn(Ljava/lang/String;Ljava/lang/Object;)V
    :try_end_45
    .catch Lorg/bitcoinj/core/ScriptException; {:try_start_28 .. :try_end_45} :catch_46

    goto :goto_24

    .line 82
    :catch_46
    move-exception v0

    invoke-virtual {v10, p2}, Lorg/bitcoinj/core/TransactionInput;->getConnectedRedeemData(Lorg/bitcoinj/wallet/KeyBag;)Lorg/bitcoinj/wallet/RedeemData;

    move-result-object v2

    .line 84
    invoke-virtual {v10}, Lorg/bitcoinj/core/TransactionInput;->getConnectedOutput()Lorg/bitcoinj/core/TransactionOutput;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/core/TransactionOutput;->getScriptPubKey()Lorg/bitcoinj/script/Script;

    move-result-object v11

    .line 89
    iget-object v0, v2, Lorg/bitcoinj/wallet/RedeemData;->keys:Ljava/util/List;

    invoke-interface {v0, v8}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v0

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

    .line 90
    instance-of v3, v0, Lorg/bitcoinj/crypto/DeterministicKey;

    if-eqz v3, :cond_6a

    .line 91
    iget-object v3, p1, Lorg/bitcoinj/signers/TransactionSigner$ProposedTransaction;->keyPaths:Ljava/util/Map;

    check-cast v0, Lorg/bitcoinj/crypto/DeterministicKey;

    invoke-virtual {v0}, Lorg/bitcoinj/crypto/DeterministicKey;->getPath()Lcom/google/common/collect/ImmutableList;

    move-result-object v0

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

    .line 97
    :cond_6a
    invoke-virtual {v2}, Lorg/bitcoinj/wallet/RedeemData;->getFullKey()Lorg/bitcoinj/core/ECKey;

    move-result-object v3

    if-nez v3, :cond_7c

    .line 98
    sget-object v0, Lorg/bitcoinj/signers/LocalTransactionSigner;->log:Lorg/slf4j/Logger;

    const-string v2, "No local key found for input {}"

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

    move-result-object v3

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

    goto :goto_24

    .line 102
    :cond_7c
    invoke-virtual {v10}, Lorg/bitcoinj/core/TransactionInput;->getScriptSig()Lorg/bitcoinj/script/Script;

    move-result-object v0

    .line 105
    iget-object v2, v2, Lorg/bitcoinj/wallet/RedeemData;->redeemScript:Lorg/bitcoinj/script/Script;

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

    move-result-object v4

    .line 107
    :try_start_86
    sget-object v5, Lorg/bitcoinj/core/Transaction$SigHash;->ALL:Lorg/bitcoinj/core/Transaction$SigHash;

    const/4 v6, 0x0

    move v2, v7

    invoke-virtual/range {v1 .. v6}, Lorg/bitcoinj/core/Transaction;->calculateSignature(ILorg/bitcoinj/core/ECKey;[BLorg/bitcoinj/core/Transaction$SigHash;Z)Lorg/bitcoinj/crypto/TransactionSignature;

    move-result-object v2

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

    move-result-object v2

    const/4 v3, 0x0

    invoke-virtual {v11, v0, v2, v3}, Lorg/bitcoinj/script/Script;->getScriptSigWithSignature(Lorg/bitcoinj/script/Script;[BI)Lorg/bitcoinj/script/Script;

    move-result-object v0

    .line 118
    invoke-virtual {v10, v0}, Lorg/bitcoinj/core/TransactionInput;->setScriptSig(Lorg/bitcoinj/script/Script;)V
    :try_end_9a
    .catch Lorg/bitcoinj/core/ECKey$KeyIsEncryptedException; {:try_start_86 .. :try_end_9a} :catch_9b
    .catch Lorg/bitcoinj/core/ECKey$MissingPrivateKeyException; {:try_start_86 .. :try_end_9a} :catch_9d

    goto :goto_24

    .line 120
    :catch_9b
    move-exception v0

    throw v0

    .line 122
    :catch_9d
    move-exception v0

    sget-object v0, Lorg/bitcoinj/signers/LocalTransactionSigner;->log:Lorg/slf4j/Logger;

    const-string v2, "No private key in keypair for input {}"

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

    move-result-object v3

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

    goto/16 :goto_24

    .line 126
    :cond_ab
    const/4 v0, 0x1

    return v0
.end method