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