public class Wallet extends BaseTaggableObject implements Serializable, BlockChainListener, PeerFilterProvider, KeyBag, TransactionBag
A Wallet stores keys and a record of transactions that send and receive value from those keys. Using these, it is able to create new transactions that spend the recorded transactions, and this is the fundamental operation of the Bitcoin protocol.
To learn more about this class, read working with the wallet.
To fill up a Wallet with transactions, you need to use it in combination with a BlockChain
and various
other objects, see the Getting started tutorial
on the website to learn more about how to set everything up.
Wallets can be serialized using either Java serialization - this is not compatible across versions of bitcoinj,
or protocol buffer serialization. You need to save the wallet whenever it changes, there is an auto-save feature
that simplifies this for you although you're still responsible for manually triggering a save when your app is about
to quit because the auto-save feature waits a moment before actually committing to disk to avoid IO thrashing when
the wallet is changing very fast (eg due to a block chain sync). See
autosaveToFile(java.io.File, long, java.util.concurrent.TimeUnit, org.bitcoinj.wallet.WalletFiles.Listener)
for more information about this.
Modifier and Type | Class and Description |
---|---|
static class |
Wallet.BalanceType
It's possible to calculate a wallets balance from multiple points of view.
|
static class |
Wallet.CompletionException |
static class |
Wallet.CouldNotAdjustDownwards
Thrown when we were trying to empty the wallet, and the total amount of money we were trying to empty after
being reduced for the fee was smaller than the min payment.
|
static class |
Wallet.DustySendRequested |
static class |
Wallet.ExceededMaxTransactionSize |
static class |
Wallet.MissingSigsMode
Enumerates possible resolutions for missing signatures.
|
static class |
Wallet.SendRequest
A SendRequest gives the wallet information about precisely how to send money to a recipient or set of recipients.
|
static class |
Wallet.SendResult
A SendResult is returned to you as part of sending coins to a recipient.
|
Modifier and Type | Field and Description |
---|---|
protected CoinSelector |
coinSelector |
protected KeyChainGroup |
keychain |
protected ReentrantLock |
lock |
protected NetworkParameters |
params |
protected Map<Sha256Hash,Transaction> |
transactions |
protected WalletFiles |
vFileManager |
protected TransactionBroadcaster |
vTransactionBroadcaster |
tags
Constructor and Description |
---|
Wallet(NetworkParameters params)
Creates a new, empty wallet with no keys and no transactions.
|
Wallet(NetworkParameters params,
KeyChainGroup keyChainGroup)
For internal use only.
|
Modifier and Type | Method and Description |
---|---|
void |
addEventListener(WalletEventListener listener)
Adds an event listener object.
|
void |
addEventListener(WalletEventListener listener,
Executor executor)
Adds an event listener object.
|
void |
addExtension(WalletExtension extension)
By providing an object implementing the
WalletExtension interface, you can save and load arbitrary
additional data that will be stored with the wallet. |
void |
addFollowingAccountKeys(List<DeterministicKey> followingAccountKeys)
Alias for
addFollowingAccountKeys(followingAccountKeys, (followingAccountKeys.size() + 1) / 2 + 1) |
void |
addFollowingAccountKeys(List<DeterministicKey> followingAccountKeys,
int threshold)
Makes given account keys follow the account key of the active keychain.
|
boolean |
addKey(ECKey key)
Deprecated.
|
int |
addKeys(List<ECKey> keys)
Deprecated.
|
WalletExtension |
addOrGetExistingExtension(WalletExtension extension)
Atomically adds extension or returns an existing extension if there is one with the same id already present.
|
void |
addOrUpdateExtension(WalletExtension extension)
Either adds extension as a new extension or replaces the existing extension if one already exists with the same
id.
|
void |
addTransactionSigner(TransactionSigner signer)
Adds given transaction signer to the list of signers.
|
void |
addWalletTransaction(WalletTransaction wtx)
Adds a transaction that has been associated with a particular wallet pool.
|
boolean |
addWatchedAddress(Address address)
Same as
addWatchedAddress(Address, long) with the current time as the creation time. |
boolean |
addWatchedAddress(Address address,
long creationTime)
Adds the given address to the wallet to be watched.
|
int |
addWatchedAddresses(List<Address> addresses,
long creationTime)
Adds the given address to the wallet to be watched.
|
int |
addWatchedScripts(List<Script> scripts)
Adds the given output scripts to the wallet to be watched.
|
void |
allowSpendingUnconfirmedTransactions()
Convenience wrapper for setCoinSelector(Wallet.AllowUnconfirmedCoinSelector.get()).
|
WalletFiles |
autosaveToFile(File f,
long delayTime,
TimeUnit timeUnit,
WalletFiles.Listener eventListener)
Sets up the wallet to auto-save itself to the given file, using temp files with atomic renames to ensure
consistency.
|
LinkedList<TransactionOutput> |
calculateAllSpendCandidates(boolean excludeImmatureCoinbases)
Returns a list of all possible outputs we could possibly spend, potentially even including immature coinbases
(which the protocol may forbid us from spending).
|
org.bitcoinj.core.Wallet.FeeCalculation |
calculateFee(Wallet.SendRequest req,
Coin value,
List<TransactionInput> originalInputs,
boolean needAtLeastReferenceFee,
LinkedList<TransactionOutput> candidates) |
boolean |
checkAESKey(org.spongycastle.crypto.params.KeyParameter aesKey)
Check whether the AES key can decrypt the first encrypted key in the wallet.
|
boolean |
checkForFilterExhaustion(FilteredBlock block)
Used by
Peer to decide whether or not to discard this block and any blocks building upon it, in case
the Bloom filter used to request them may be exhausted, that is, not have sufficient keys in the deterministic
sequence within it to reliably find relevant transactions. |
boolean |
checkPassword(CharSequence password)
Check whether the password can decrypt the first key in the wallet.
|
void |
cleanup()
Clean up the wallet.
|
void |
clearTransactions(int fromHeight)
Deletes transactions which appeared above the given block height from the wallet, but does not touch the keys.
|
void |
commitTx(Transaction tx)
Updates the wallet with the given transaction: puts it into the pending pool, sets the spent flags and runs
the onCoinsSent/onCoinsReceived event listener.
|
void |
completeTx(Wallet.SendRequest req)
Given a spend request containing an incomplete transaction, makes it valid by adding outputs and signed inputs
according to the instructions in the request.
|
Transaction |
createSend(Address address,
Coin value)
Statelessly creates a transaction that sends the given value to address.
|
Address |
currentAddress(KeyChain.KeyPurpose purpose)
Returns address for a
currentKey(org.bitcoinj.wallet.KeyChain.KeyPurpose) |
DeterministicKey |
currentKey(KeyChain.KeyPurpose purpose)
Returns a key that hasn't been seen in a transaction yet, and which is suitable for displaying in a wallet
user interface as "a convenient key to receive funds on" when the purpose parameter is
KeyChain.KeyPurpose.RECEIVE_FUNDS . |
Address |
currentReceiveAddress()
An alias for calling
currentAddress(org.bitcoinj.wallet.KeyChain.KeyPurpose) with
KeyChain.KeyPurpose.RECEIVE_FUNDS as the parameter. |
DeterministicKey |
currentReceiveKey()
An alias for calling
currentKey(org.bitcoinj.wallet.KeyChain.KeyPurpose) with
KeyChain.KeyPurpose.RECEIVE_FUNDS as the parameter. |
void |
decrypt(CharSequence password)
Decrypt the wallet with the wallets keyCrypter and password.
|
void |
decrypt(org.spongycastle.crypto.params.KeyParameter aesKey)
Decrypt the wallet with the wallets keyCrypter and AES key.
|
boolean |
doesAcceptRiskyTransactions()
See
setAcceptRiskyTransactions(boolean) for an explanation of this property. |
void |
encrypt(CharSequence password)
Convenience wrapper around
encrypt(org.bitcoinj.crypto.KeyCrypter,
org.spongycastle.crypto.params.KeyParameter) which uses the default Scrypt key derivation algorithm and
parameters to derive a key from the given password. |
void |
encrypt(KeyCrypter keyCrypter,
org.spongycastle.crypto.params.KeyParameter aesKey)
Encrypt the wallet using the KeyCrypter and the AES key.
|
ECKey |
findKeyFromPubHash(byte[] pubkeyHash)
Locates a keypair from the basicKeyChain given the hash of the public key.
|
ECKey |
findKeyFromPubKey(byte[] pubkey)
Locates a keypair from the basicKeyChain given the raw public key bytes.
|
RedeemData |
findRedeemDataFromScriptHash(byte[] payToScriptHash)
Locates a redeem data (redeem script and keys) from the keychain given the hash of the script.
|
Address |
freshAddress(KeyChain.KeyPurpose purpose)
Returns address for a
freshKey(org.bitcoinj.wallet.KeyChain.KeyPurpose) |
DeterministicKey |
freshKey(KeyChain.KeyPurpose purpose)
Returns a key that has not been returned by this method before (fresh).
|
List<DeterministicKey> |
freshKeys(KeyChain.KeyPurpose purpose,
int numberOfKeys)
Returns a key/s that has not been returned by this method before (fresh).
|
Address |
freshReceiveAddress()
An alias for calling
freshAddress(org.bitcoinj.wallet.KeyChain.KeyPurpose) with
KeyChain.KeyPurpose.RECEIVE_FUNDS as the parameter. |
DeterministicKey |
freshReceiveKey()
An alias for calling
freshKey(org.bitcoinj.wallet.KeyChain.KeyPurpose) with
KeyChain.KeyPurpose.RECEIVE_FUNDS as the parameter. |
static Wallet |
fromSeed(NetworkParameters params,
DeterministicSeed seed) |
static Wallet |
fromWatchingKey(NetworkParameters params,
DeterministicKey watchKey)
Creates a wallet that tracks payments to and from the HD key hierarchy rooted by the given watching key.
|
static Wallet |
fromWatchingKey(NetworkParameters params,
DeterministicKey watchKey,
long creationTimeSeconds)
Creates a wallet that tracks payments to and from the HD key hierarchy rooted by the given watching key.
|
Coin |
getBalance()
Returns the AVAILABLE balance of this wallet.
|
Coin |
getBalance(CoinSelector selector)
Returns the balance that would be considered spendable by the given coin selector.
|
Coin |
getBalance(Wallet.BalanceType balanceType)
Returns the balance of this wallet as calculated by the provided balanceType.
|
ListenableFuture<Coin> |
getBalanceFuture(Coin value,
Wallet.BalanceType type)
Returns a future that will complete when the balance of the given type has becom equal or larger to the given
value.
|
BloomFilter |
getBloomFilter(double falsePositiveRate)
Gets a bloom filter that contains all of the public keys from this wallet, and which will provide the given
false-positive rate.
|
BloomFilter |
getBloomFilter(int size,
double falsePositiveRate,
long nTweak)
Gets a bloom filter that contains all of the public keys from this wallet, and which will provide the given
false-positive rate if it has size elements.
|
int |
getBloomFilterElementCount()
Returns the number of distinct data items (note: NOT keys) that will be inserted into a bloom filter, when it
is constructed.
|
Address |
getChangeAddress()
Returns the address used for change outputs.
|
CoinSelector |
getCoinSelector()
Returns the
CoinSelector object which controls which outputs can be spent by this wallet. |
String |
getDescription()
Get the description of the wallet.
|
long |
getEarliestKeyCreationTime()
Returns the earliest creation time of keys or watched scripts in this wallet, in seconds since the epoch, ie the min
of
ECKey.getCreationTimeSeconds() . |
Protos.Wallet.EncryptionType |
getEncryptionType()
Get the type of encryption used for this wallet.
|
Map<String,WalletExtension> |
getExtensions()
Returns a snapshot of all registered extension objects.
|
List<ECKey> |
getImportedKeys()
Returns a list of the non-deterministic keys that have been imported into the wallet, or the empty list if none.
|
DeterministicKey |
getKeyByPath(List<ChildNumber> path)
Returns a key for the given HD path, assuming it's already been derived.
|
int |
getKeychainLookaheadSize()
See
DeterministicKeyChain.setLookaheadSize(int) for more info on this. |
int |
getKeychainLookaheadThreshold()
See
DeterministicKeyChain.setLookaheadThreshold(int) for more info on this. |
DeterministicSeed |
getKeyChainSeed()
Returns the immutable seed for the current active HD chain.
|
int |
getKeychainSize()
Returns the number of keys in the key chain, including lookahead keys.
|
KeyCrypter |
getKeyCrypter()
Get the wallet's KeyCrypter, or null if the wallet is not encrypted.
|
Date |
getKeyRotationTime()
Returns a UNIX time since the epoch in seconds, or zero if unconfigured.
|
Sha256Hash |
getLastBlockSeenHash()
Returns the hash of the last seen best-chain block, or null if the wallet is too old to store this data.
|
int |
getLastBlockSeenHeight()
Returns the height of the last seen best-chain block.
|
Date |
getLastBlockSeenTime()
Returns a
Date representing the time extracted from the last best seen block header. |
long |
getLastBlockSeenTimeSecs()
Returns the UNIX time in seconds since the epoch extracted from the last best seen block header.
|
ReentrantLock |
getLock()
Returns the wallet lock under which most operations happen.
|
NetworkParameters |
getNetworkParameters() |
NetworkParameters |
getParams()
Returns the parameters this wallet was created with.
|
Collection<Transaction> |
getPendingTransactions()
Returns an immutable view of the transactions currently waiting for network confirmations.
|
List<Transaction> |
getRecentTransactions(int numTransactions,
boolean includeDead)
Returns an list of N transactions, ordered by increasing age.
|
RiskAnalysis.Analyzer |
getRiskAnalyzer()
Gets the current
RiskAnalysis implementation. |
int |
getSigsRequiredToSpend()
Returns the number of signatures required to spend from this wallet.
|
Transaction |
getTransaction(Sha256Hash hash)
Returns a transaction object given its hash, if it exists in this wallet, or null otherwise.
|
Map<Sha256Hash,Transaction> |
getTransactionPool(WalletTransaction.Pool pool)
Returns transactions from a specific pool.
|
Set<Transaction> |
getTransactions(boolean includeDead)
Returns a set of all transactions in the wallet.
|
List<Transaction> |
getTransactionsByTime()
Returns all non-dead, active transactions ordered by recency.
|
List<TransactionSigner> |
getTransactionSigners() |
int |
getVersion()
Get the version of the Wallet.
|
Iterable<WalletTransaction> |
getWalletTransactions()
Returns a set of all WalletTransactions in the wallet.
|
List<Address> |
getWatchedAddresses()
Returns all addresses watched by this wallet.
|
Coin |
getWatchedBalance()
Returns the available balance, including any unspent balance at watched addresses
|
Coin |
getWatchedBalance(CoinSelector selector)
Returns the balance that would be considered spendable by the given coin selector, including
any unspent balance at watched addresses.
|
List<TransactionOutput> |
getWatchedOutputs(boolean excludeImmatureCoinbases)
Returns all the outputs that match addresses or scripts added via
addWatchedAddress(Address) or
addWatchedScripts(java.util.List) . |
List<Script> |
getWatchedScripts()
Returns a snapshot of the watched scripts.
|
DeterministicKey |
getWatchingKey()
Returns a public-only DeterministicKey that can be used to set up a watching wallet: that is, a wallet that
can import transactions from the block chain just as the normal wallet can, but which cannot spend.
|
boolean |
hasKey(ECKey key)
Returns true if the given key is in the wallet, false otherwise.
|
boolean |
importKey(ECKey key)
Imports the given ECKey to the wallet.
|
int |
importKeys(List<ECKey> keys)
Imports the given keys to the wallet.
|
int |
importKeysAndEncrypt(List<ECKey> keys,
CharSequence password)
Takes a list of keys and a password, then encrypts and imports them in one step using the current keycrypter.
|
int |
importKeysAndEncrypt(List<ECKey> keys,
org.spongycastle.crypto.params.KeyParameter aesKey)
Takes a list of keys and an AES key, then encrypts and imports them in one step using the current keycrypter.
|
boolean |
isAddressWatched(Address address)
Return true if we are watching this address.
|
boolean |
isConsistent() |
boolean |
isDeterministicUpgradeRequired()
Returns true if the wallet contains random keys and no HD chains, in which case you should call
upgradeToDeterministic(org.spongycastle.crypto.params.KeyParameter) before attempting to do anything
that would require a new address or key. |
boolean |
isEncrypted()
Returns true if the wallet is encrypted using any scheme, false if not.
|
boolean |
isKeyRotating(ECKey key)
Returns whether the keys creation time is before the key rotation time, if one was set.
|
boolean |
isPayToScriptHashMine(byte[] payToScriptHash)
Returns true if this wallet knows the script corresponding to the given hash.
|
boolean |
isPendingTransactionRelevant(Transaction tx)
This method is used by a
Peer to find out if a transaction that has been announced is interesting,
that is, whether we should bother downloading its dependencies and exploring the transaction to decide how
risky it is. |
boolean |
isPubKeyHashMine(byte[] pubkeyHash)
Returns true if this wallet contains a public key which hashes to the given hash.
|
boolean |
isPubKeyMine(byte[] pubkey)
Returns true if this wallet contains a keypair with the given public key.
|
boolean |
isRequiringUpdateAllBloomFilter()
If we are watching any scripts, the bloom filter must update on peers whenever an output is
identified.
|
boolean |
isTransactionRelevant(Transaction tx)
Returns true if the given transaction sends coins to any of our keys, or has inputs spending any of our outputs,
and also returns true if tx has inputs that are spending outputs which are
not ours but which are spent by pending transactions.
|
boolean |
isTransactionRisky(Transaction tx,
List<Transaction> dependencies)
Given a transaction and an optional list of dependencies (recursive/flattened), returns true if the given
transaction would be rejected by the analyzer, or false otherwise.
|
boolean |
isWatchedScript(Script script)
Returns true if this wallet is watching transactions for outputs with the script.
|
static Wallet |
loadFromFile(File f)
Returns a wallet deserialized from the given file.
|
static Wallet |
loadFromFileStream(InputStream stream)
Returns a wallet deserialized from the given input stream.
|
boolean |
maybeCommitTx(Transaction tx)
Calls
commitTx(org.bitcoinj.core.Transaction) if tx is not already in the pending pool |
ListenableFuture<List<Transaction>> |
maybeDoMaintenance(org.spongycastle.crypto.params.KeyParameter aesKey,
boolean andSend)
A wallet app should call this from time to time if key rotation is enabled in order to let the wallet craft and
send transactions needed to re-organise coins internally.
|
protected void |
maybeQueueOnWalletChanged() |
void |
notifyNewBestBlock(StoredBlock block)
Called by the
BlockChain when a new block on the best chain is seen, AFTER relevant wallet
transactions are extracted and sent to us UNLESS the new block caused a re-org, in which case this will
not be called (the reorganize(StoredBlock, java.util.List, java.util.List) method will
call this one in that case). |
boolean |
notifyTransactionIsInBlock(Sha256Hash txHash,
StoredBlock block,
AbstractBlockChain.NewBlockType blockType,
int relativityOffset)
Called by the
BlockChain when we receive a new filtered block that contains a transactions previously
received by a call to receivePending(org.bitcoinj.core.Transaction, java.util.List<org.bitcoinj.core.Transaction>, boolean) . |
protected void |
queueOnCoinsReceived(Transaction tx,
Coin balance,
Coin newBalance) |
protected void |
queueOnCoinsSent(Transaction tx,
Coin prevBalance,
Coin newBalance) |
protected void |
queueOnReorganize() |
protected void |
queueOnScriptsAdded(List<Script> scripts) |
void |
receiveFromBlock(Transaction tx,
StoredBlock block,
AbstractBlockChain.NewBlockType blockType,
int relativityOffset)
Called by the
BlockChain when we receive a new block that sends coins to one of our addresses or
spends coins from one of our addresses (note that a single transaction can do both). |
void |
receivePending(Transaction tx,
List<Transaction> dependencies)
Called when we have found a transaction (via network broadcast or otherwise) that is relevant to this wallet
and want to record it.
|
void |
receivePending(Transaction tx,
List<Transaction> dependencies,
boolean overrideIsRelevant)
Called when we have found a transaction (via network broadcast or otherwise) that is relevant to this wallet
and want to record it.
|
boolean |
removeEventListener(WalletEventListener listener)
Removes the given event listener object.
|
boolean |
removeKey(ECKey key)
Removes the given key from the basicKeyChain.
|
void |
reorganize(StoredBlock splitPoint,
List<StoredBlock> oldBlocks,
List<StoredBlock> newBlocks)
Don't call this directly.
|
protected void |
saveLater()
Requests an asynchronous save on a background thread
|
protected void |
saveNow()
If auto saving is enabled, do an immediate sync write to disk ignoring any delays.
|
void |
saveToFile(File f)
Uses protobuf serialization to save the wallet to the given file.
|
void |
saveToFile(File temp,
File destFile)
Saves the wallet first to the given temp file, then renames to the dest file.
|
void |
saveToFileStream(OutputStream f)
Uses protobuf serialization to save the wallet to the given file stream.
|
Transaction |
sendCoins(Peer peer,
Wallet.SendRequest request)
Sends coins to the given address, via the given
Peer . |
Wallet.SendResult |
sendCoins(TransactionBroadcaster broadcaster,
Address to,
Coin value)
Sends coins to the given address, via the given
PeerGroup . |
Wallet.SendResult |
sendCoins(TransactionBroadcaster broadcaster,
Wallet.SendRequest request)
Sends coins according to the given request, via the given
TransactionBroadcaster . |
Wallet.SendResult |
sendCoins(Wallet.SendRequest request)
Satisfies the given
Wallet.SendRequest using the default transaction broadcaster configured either via
PeerGroup.addWallet(Wallet) or directly with setTransactionBroadcaster(TransactionBroadcaster) . |
Transaction |
sendCoinsOffline(Wallet.SendRequest request)
Sends coins to the given address but does not broadcast the resulting pending transaction.
|
List<Protos.Key> |
serializeKeychainToProtobuf()
Internal use only.
|
void |
setAcceptRiskyTransactions(boolean acceptRiskyTransactions)
Whether or not the wallet will ignore received pending transactions that fail the selected
RiskAnalysis . |
void |
setCoinSelector(CoinSelector coinSelector)
A coin selector is responsible for choosing which outputs to spend when creating transactions.
|
void |
setDescription(String description)
Set the description of the wallet.
|
void |
setKeychainLookaheadSize(int lookaheadSize)
See
DeterministicKeyChain.setLookaheadSize(int) for more info on this. |
void |
setKeychainLookaheadThreshold(int num)
See
DeterministicKeyChain.setLookaheadThreshold(int) for more info on this. |
void |
setKeyRotationEnabled(boolean enabled)
Toggles key rotation on and off.
|
void |
setKeyRotationTime(Date time)
When a key rotation time is set, and money controlled by keys created before the given timestamp T will be
automatically respent to any key that was created after T.
|
void |
setKeyRotationTime(long unixTimeSeconds)
When a key rotation time is set, and money controlled by keys created before the given timestamp T will be
automatically respent to any key that was created after T.
|
void |
setLastBlockSeenHash(Sha256Hash lastBlockSeenHash) |
void |
setLastBlockSeenHeight(int lastBlockSeenHeight) |
void |
setLastBlockSeenTimeSecs(long timeSecs) |
void |
setRiskAnalyzer(RiskAnalysis.Analyzer analyzer)
Sets the
RiskAnalysis implementation to use for deciding whether received pending transactions are risky
or not. |
void |
setTag(String tag,
com.google.protobuf.ByteString value)
Associates the given immutable byte array with the string tag.
|
void |
setTransactionBroadcaster(TransactionBroadcaster broadcaster)
Specifies that the given
TransactionBroadcaster , typically a PeerGroup , should be used for
sending transactions to the Bitcoin network by default. |
void |
setVersion(int version)
Set the version number of the wallet.
|
void |
shutdownAutosaveAndWait()
Disables auto-saving, after it had been enabled with
autosaveToFile(java.io.File, long, java.util.concurrent.TimeUnit, org.bitcoinj.wallet.WalletFiles.Listener)
before. |
void |
signTransaction(Wallet.SendRequest req)
Given a send request containing transaction, attempts to sign it's inputs.
|
String |
toString() |
String |
toString(boolean includePrivateKeys,
boolean includeTransactions,
boolean includeExtensions,
AbstractBlockChain chain)
Formats the wallet as a human readable piece of text.
|
void |
upgradeToDeterministic(org.spongycastle.crypto.params.KeyParameter aesKey)
Upgrades the wallet to be deterministic (BIP32).
|
getTag, getTags, maybeGetTag
protected final ReentrantLock lock
protected final Map<Sha256Hash,Transaction> transactions
protected KeyChainGroup keychain
protected final NetworkParameters params
protected volatile WalletFiles vFileManager
protected volatile TransactionBroadcaster vTransactionBroadcaster
protected transient CoinSelector coinSelector
public Wallet(NetworkParameters params)
public Wallet(NetworkParameters params, KeyChainGroup keyChainGroup)
public static Wallet fromSeed(NetworkParameters params, DeterministicSeed seed)
public static Wallet fromWatchingKey(NetworkParameters params, DeterministicKey watchKey, long creationTimeSeconds)
public static Wallet fromWatchingKey(NetworkParameters params, DeterministicKey watchKey)
public NetworkParameters getNetworkParameters()
public int getSigsRequiredToSpend()
addFollowingAccountKeys(java.util.List, int)
)
or, if not specified, calculated implicitly as a simple majority of keys.public void addTransactionSigner(TransactionSigner signer)
Adds given transaction signer to the list of signers. It will be added to the end of the signers list, so if this wallet already has some signers added, given signer will be executed after all of them.
Transaction signer should be fully initialized before adding to the wallet, otherwise IllegalStateException
will be thrown
public List<TransactionSigner> getTransactionSigners()
public DeterministicKey currentKey(KeyChain.KeyPurpose purpose)
KeyChain.KeyPurpose.RECEIVE_FUNDS
. The returned key is stable until
it's actually seen in a pending or confirmed transaction, at which point this method will start returning
a different key (for each purpose independently).public DeterministicKey currentReceiveKey()
currentKey(org.bitcoinj.wallet.KeyChain.KeyPurpose)
with
KeyChain.KeyPurpose.RECEIVE_FUNDS
as the parameter.public Address currentAddress(KeyChain.KeyPurpose purpose)
currentKey(org.bitcoinj.wallet.KeyChain.KeyPurpose)
public Address currentReceiveAddress()
currentAddress(org.bitcoinj.wallet.KeyChain.KeyPurpose)
with
KeyChain.KeyPurpose.RECEIVE_FUNDS
as the parameter.public DeterministicKey freshKey(KeyChain.KeyPurpose purpose)
DeterministicKeyChain
. When the parameter is
KeyChain.KeyPurpose.RECEIVE_FUNDS
the returned key is suitable for being put
into a receive coins wizard type UI. You should use this when the user is definitely going to hand this key out
to someone who wishes to send money.public List<DeterministicKey> freshKeys(KeyChain.KeyPurpose purpose, int numberOfKeys)
DeterministicKeyChain
. When the parameter is
KeyChain.KeyPurpose.RECEIVE_FUNDS
the returned key is suitable for being put
into a receive coins wizard type UI. You should use this when the user is definitely going to hand this key/s out
to someone who wishes to send money.public DeterministicKey freshReceiveKey()
freshKey(org.bitcoinj.wallet.KeyChain.KeyPurpose)
with
KeyChain.KeyPurpose.RECEIVE_FUNDS
as the parameter.public Address freshAddress(KeyChain.KeyPurpose purpose)
freshKey(org.bitcoinj.wallet.KeyChain.KeyPurpose)
public Address freshReceiveAddress()
freshAddress(org.bitcoinj.wallet.KeyChain.KeyPurpose)
with
KeyChain.KeyPurpose.RECEIVE_FUNDS
as the parameter.public void upgradeToDeterministic(@Nullable org.spongycastle.crypto.params.KeyParameter aesKey) throws DeterministicUpgradeRequiresPassword
public boolean isDeterministicUpgradeRequired()
upgradeToDeterministic(org.spongycastle.crypto.params.KeyParameter)
before attempting to do anything
that would require a new address or key.public List<Script> getWatchedScripts()
public boolean removeKey(ECKey key)
public int getKeychainSize()
public List<ECKey> getImportedKeys()
public Address getChangeAddress()
@Deprecated public boolean addKey(ECKey key)
Deprecated alias for importKey(ECKey)
.
Replace with either freshReceiveKey()
if your call is addKey(new ECKey()), or with importKey(ECKey)
which does the same thing this method used to, but with a better name.
public boolean importKey(ECKey key)
Imports the given ECKey to the wallet.
If the wallet is configured to auto save to a file, triggers a save immediately. Runs the onKeysAdded event handler. If the key already exists in the wallet, does nothing and returns false.
@Deprecated public int addKeys(List<ECKey> keys)
importKeys(java.util.List)
, which does the same thing but with a better name.public int importKeys(List<ECKey> keys)
autosaveToFile(java.io.File, long, java.util.concurrent.TimeUnit, org.bitcoinj.wallet.WalletFiles.Listener)
has been called, triggers an auto save bypassing the normal coalescing delay and event handlers.
Returns the number of keys added, after duplicates are ignored. The onKeyAdded event will be called for each key
in the list that was not already present.public int importKeysAndEncrypt(List<ECKey> keys, CharSequence password)
public int importKeysAndEncrypt(List<ECKey> keys, org.spongycastle.crypto.params.KeyParameter aesKey)
public void addFollowingAccountKeys(List<DeterministicKey> followingAccountKeys)
Alias for addFollowingAccountKeys(followingAccountKeys, (followingAccountKeys.size() + 1) / 2 + 1)
Creates married wallet requiring majority of keys to spend (2-of-3, 3-of-5 and so on)
IMPORTANT: As of Bitcoin Core 0.9 all multisig transactions which require more than 3 public keys are non-standard and such spends won't be processed by peers with default settings, essentially making such transactions almost nonspendable
public void addFollowingAccountKeys(List<DeterministicKey> followingAccountKeys, int threshold)
IMPORTANT: As of Bitcoin Core 0.9 all multisig transactions which require more than 3 public keys are non-standard and such spends won't be processed by peers with default settings, essentially making such transactions almost nonspendable
This method should be called only once before key rotation, otherwise it will throw an IllegalStateException.public void setKeychainLookaheadSize(int lookaheadSize)
DeterministicKeyChain.setLookaheadSize(int)
for more info on this.public int getKeychainLookaheadSize()
DeterministicKeyChain.setLookaheadSize(int)
for more info on this.public void setKeychainLookaheadThreshold(int num)
DeterministicKeyChain.setLookaheadThreshold(int)
for more info on this.public int getKeychainLookaheadThreshold()
DeterministicKeyChain.setLookaheadThreshold(int)
for more info on this.public DeterministicKey getWatchingKey()
public boolean isAddressWatched(Address address)
public boolean addWatchedAddress(Address address)
addWatchedAddress(Address, long)
with the current time as the creation time.public boolean addWatchedAddress(Address address, long creationTime)
getWatchedOutputs(boolean)
.creationTime
- creation time in seconds since the epoch, for scanning the blockchainpublic int addWatchedAddresses(List<Address> addresses, long creationTime)
getWatchedOutputs(boolean)
.public int addWatchedScripts(List<Script> scripts)
getWatchedOutputs(boolean)
.public List<Address> getWatchedAddresses()
@Nullable public ECKey findKeyFromPubHash(byte[] pubkeyHash)
findKeyFromPubHash
in interface KeyBag
public boolean hasKey(ECKey key)
public boolean isPubKeyHashMine(byte[] pubkeyHash)
isPubKeyHashMine
in interface TransactionBag
public boolean isWatchedScript(Script script)
isWatchedScript
in interface TransactionBag
@Nullable public ECKey findKeyFromPubKey(byte[] pubkey)
findKeyFromPubKey
in interface KeyBag
public boolean isPubKeyMine(byte[] pubkey)
isPubKeyMine
in interface TransactionBag
@Nullable public RedeemData findRedeemDataFromScriptHash(byte[] payToScriptHash)
findRedeemDataFromScriptHash
in interface KeyBag
public boolean isPayToScriptHashMine(byte[] payToScriptHash)
isPayToScriptHashMine
in interface TransactionBag
public DeterministicSeed getKeyChainSeed()
ECKey.MissingPrivateKeyException
- if the seed is unavailable (watching wallet)public DeterministicKey getKeyByPath(List<ChildNumber> path)
public void encrypt(CharSequence password)
encrypt(org.bitcoinj.crypto.KeyCrypter,
org.spongycastle.crypto.params.KeyParameter)
which uses the default Scrypt key derivation algorithm and
parameters to derive a key from the given password.public void encrypt(KeyCrypter keyCrypter, org.spongycastle.crypto.params.KeyParameter aesKey)
KeyCrypterScrypt
.keyCrypter
- The KeyCrypter that specifies how to encrypt/ decrypt a keyaesKey
- AES key to use (normally created using KeyCrypter#deriveKey and cached as it is time consuming to create from a password)KeyCrypterException
- Thrown if the wallet encryption fails. If so, the wallet state is unchanged.public void decrypt(CharSequence password)
KeyCrypterException
- Thrown if the wallet decryption fails. If so, the wallet state is unchanged.public void decrypt(org.spongycastle.crypto.params.KeyParameter aesKey)
aesKey
- AES key to use (normally created using KeyCrypter#deriveKey and cached as it is time consuming to create from a password)KeyCrypterException
- Thrown if the wallet decryption fails. If so, the wallet state is unchanged.public boolean checkPassword(CharSequence password)
IllegalStateException
- if the wallet is not encrypted.public boolean checkAESKey(org.spongycastle.crypto.params.KeyParameter aesKey)
@Nullable public KeyCrypter getKeyCrypter()
public Protos.Wallet.EncryptionType getEncryptionType()
public boolean isEncrypted()
public List<Protos.Key> serializeKeychainToProtobuf()
public void saveToFile(File temp, File destFile) throws IOException
IOException
public void saveToFile(File f) throws IOException
WalletProtobufSerializer
. Writes out first to a temporary file in the same directory and then renames
once written.IOException
public void setAcceptRiskyTransactions(boolean acceptRiskyTransactions)
Whether or not the wallet will ignore received pending transactions that fail the selected
RiskAnalysis
. By default, if a transaction is considered risky then it won't enter the wallet
and won't trigger any event listeners. If you set this property to true, then all transactions will
be allowed in regardless of risk. Currently, the DefaultRiskAnalysis
checks for non-finality of
transactions. You should not encounter these outside of special protocols.
Note that this property is not serialized. You have to set it each time a Wallet object is constructed, even if it's loaded from a protocol buffer.
public boolean doesAcceptRiskyTransactions()
setAcceptRiskyTransactions(boolean)
for an explanation of this property.public void setRiskAnalyzer(RiskAnalysis.Analyzer analyzer)
RiskAnalysis
implementation to use for deciding whether received pending transactions are risky
or not. If the analyzer says a transaction is risky, by default it will be dropped. You can customize this
behaviour with setAcceptRiskyTransactions(boolean)
.public RiskAnalysis.Analyzer getRiskAnalyzer()
RiskAnalysis
implementation. The default is DefaultRiskAnalysis
.public WalletFiles autosaveToFile(File f, long delayTime, TimeUnit timeUnit, @Nullable WalletFiles.Listener eventListener)
Sets up the wallet to auto-save itself to the given file, using temp files with atomic renames to ensure consistency. After connecting to a file, you no longer need to save the wallet manually, it will do it whenever necessary. Protocol buffer serialization will be used.
If delayTime is set, a background thread will be created and the wallet will only be saved to disk every so many time units. If no changes have occurred for the given time period, nothing will be written. In this way disk IO can be rate limited. It's a good idea to set this as otherwise the wallet can change very frequently, eg if there are a lot of transactions in it or during block sync, and there will be a lot of redundant writes. Note that when a new key is added, that always results in an immediate save regardless of delayTime. You should still save the wallet manually when your program is about to shut down as the JVM will not wait for the background thread.
An event listener can be provided. If a delay >0 was specified, it will be called on a background thread with the wallet locked when an auto-save occurs. If delay is zero or you do something that always triggers an immediate save, like adding a key, the event listener will be invoked on the calling threads.
f
- The destination file to save to.delayTime
- How many time units to wait until saving the wallet on a background thread.timeUnit
- the unit of measurement for delayTime.eventListener
- callback to be informed when the auto-save thread does things, or nullpublic void shutdownAutosaveAndWait()
Disables auto-saving, after it had been enabled with
autosaveToFile(java.io.File, long, java.util.concurrent.TimeUnit, org.bitcoinj.wallet.WalletFiles.Listener)
before. This method blocks until finished.
protected void saveLater()
protected void saveNow()
public void saveToFileStream(OutputStream f) throws IOException
WalletProtobufSerializer
.IOException
public NetworkParameters getParams()
public static Wallet loadFromFile(File f) throws UnreadableWalletException
UnreadableWalletException
public boolean isConsistent()
public static Wallet loadFromFileStream(InputStream stream) throws UnreadableWalletException
UnreadableWalletException
public boolean notifyTransactionIsInBlock(Sha256Hash txHash, StoredBlock block, AbstractBlockChain.NewBlockType blockType, int relativityOffset) throws VerificationException
BlockChain
when we receive a new filtered block that contains a transactions previously
received by a call to receivePending(org.bitcoinj.core.Transaction, java.util.List<org.bitcoinj.core.Transaction>, boolean)
.This is necessary for the internal book-keeping Wallet does. When a transaction is received that sends us coins it is added to a pool so we can use it later to create spends. When a transaction is received that consumes outputs they are marked as spent so they won't be used in future.
A transaction that spends our own coins can be received either because a spend we created was accepted by the network and thus made it into a block, or because our keys are being shared between multiple instances and some other node spent the coins instead. We still have to know about that to avoid accidentally trying to double spend.
A transaction may be received multiple times if is included into blocks in parallel chains. The blockType parameter describes whether the containing block is on the main/best chain or whether it's on a presently inactive side chain. We must still record these transactions and the blocks they appear in because a future block might change which chain is best causing a reorganize. A re-org can totally change our balance!
notifyTransactionIsInBlock
in interface BlockChainListener
VerificationException
public void receivePending(Transaction tx, @Nullable List<Transaction> dependencies, boolean overrideIsRelevant) throws VerificationException
Called when we have found a transaction (via network broadcast or otherwise) that is relevant to this wallet and want to record it. Note that we cannot verify these transactions at all, they may spend fictional coins or be otherwise invalid. They are useful to inform the user about coins they can expect to receive soon, and if you trust the sender of the transaction you can choose to assume they are in fact valid and will not be double spent as an optimization.
This is the same as receivePending(Transaction, java.util.List)
but allows you to override the
isPendingTransactionRelevant(Transaction)
sanity-check to keep track of transactions that are not
spendable or spend our coins. This can be useful when you want to keep track of transaction confidence on
arbitrary transactions. Note that transactions added in this way will still be relayed to peers and appear in
transaction lists like any other pending transaction (even when not relevant).
VerificationException
public boolean isTransactionRisky(Transaction tx, @Nullable List<Transaction> dependencies)
doesAcceptRiskyTransactions()
. Risky transactions yield a logged warning. If you
want to know the reason why a transaction is risky, create an instance of the RiskAnalysis
yourself
using the factory returned by getRiskAnalyzer()
and use it directly.public void receivePending(Transaction tx, @Nullable List<Transaction> dependencies) throws VerificationException
Called when we have found a transaction (via network broadcast or otherwise) that is relevant to this wallet and want to record it. Note that we cannot verify these transactions at all, they may spend fictional coins or be otherwise invalid. They are useful to inform the user about coins they can expect to receive soon, and if you trust the sender of the transaction you can choose to assume they are in fact valid and will not be double spent as an optimization.
Before this method is called, isPendingTransactionRelevant(Transaction)
should have been
called to decide whether the wallet cares about the transaction - if it does, then this method expects the
transaction and any dependencies it has which are still in the memory pool.
VerificationException
public boolean isPendingTransactionRelevant(Transaction tx) throws ScriptException
Peer
to find out if a transaction that has been announced is interesting,
that is, whether we should bother downloading its dependencies and exploring the transaction to decide how
risky it is. If this method returns true then receivePending(Transaction, java.util.List)
will soon be called with the transactions dependencies as well.ScriptException
public boolean isTransactionRelevant(Transaction tx) throws ScriptException
Returns true if the given transaction sends coins to any of our keys, or has inputs spending any of our outputs, and also returns true if tx has inputs that are spending outputs which are not ours but which are spent by pending transactions.
Note that if the tx has inputs containing one of our keys, but the connected transaction is not in the wallet, it will not be considered relevant.
isTransactionRelevant
in interface BlockChainListener
ScriptException
public void receiveFromBlock(Transaction tx, StoredBlock block, AbstractBlockChain.NewBlockType blockType, int relativityOffset) throws VerificationException
BlockChain
when we receive a new block that sends coins to one of our addresses or
spends coins from one of our addresses (note that a single transaction can do both).This is necessary for the internal book-keeping Wallet does. When a transaction is received that sends us coins it is added to a pool so we can use it later to create spends. When a transaction is received that consumes outputs they are marked as spent so they won't be used in future.
A transaction that spends our own coins can be received either because a spend we created was accepted by the network and thus made it into a block, or because our keys are being shared between multiple instances and some other node spent the coins instead. We still have to know about that to avoid accidentally trying to double spend.
A transaction may be received multiple times if is included into blocks in parallel chains. The blockType parameter describes whether the containing block is on the main/best chain or whether it's on a presently inactive side chain. We must still record these transactions and the blocks they appear in because a future block might change which chain is best causing a reorganize. A re-org can totally change our balance!
receiveFromBlock
in interface BlockChainListener
VerificationException
public void notifyNewBestBlock(StoredBlock block) throws VerificationException
Called by the BlockChain
when a new block on the best chain is seen, AFTER relevant wallet
transactions are extracted and sent to us UNLESS the new block caused a re-org, in which case this will
not be called (the reorganize(StoredBlock, java.util.List, java.util.List)
method will
call this one in that case).
Used to update confidence data in each transaction and last seen block hash. Triggers auto saving. Invokes the onWalletChanged event listener if there were any affected transactions.
notifyNewBestBlock
in interface BlockChainListener
VerificationException
public boolean maybeCommitTx(Transaction tx) throws VerificationException
commitTx(org.bitcoinj.core.Transaction)
if tx is not already in the pending poolVerificationException
public void commitTx(Transaction tx) throws VerificationException
Updates the wallet with the given transaction: puts it into the pending pool, sets the spent flags and runs the onCoinsSent/onCoinsReceived event listener. Used in two situations:
Triggers an auto save.
VerificationException
public void addEventListener(WalletEventListener listener)
public void addEventListener(WalletEventListener listener, Executor executor)
public boolean removeEventListener(WalletEventListener listener)
protected void maybeQueueOnWalletChanged()
protected void queueOnCoinsReceived(Transaction tx, Coin balance, Coin newBalance)
protected void queueOnCoinsSent(Transaction tx, Coin prevBalance, Coin newBalance)
protected void queueOnReorganize()
public Set<Transaction> getTransactions(boolean includeDead)
includeDead
- If true, transactions that were overridden by a double spend are included.public Iterable<WalletTransaction> getWalletTransactions()
public void addWalletTransaction(WalletTransaction wtx)
WalletProtobufSerializer
class. It isn't normally useful for
applications. It does not trigger auto saving.public List<Transaction> getTransactionsByTime()
public List<Transaction> getRecentTransactions(int numTransactions, boolean includeDead)
Note: the current implementation is O(num transactions in wallet). Regardless of how many transactions are requested, the cost is always the same. In future, requesting smaller numbers of transactions may be faster depending on how the wallet is implemented (eg if backed by a database).
@Nullable public Transaction getTransaction(Sha256Hash hash)
public Map<Sha256Hash,Transaction> getTransactionPool(WalletTransaction.Pool pool)
getTransactionPool
in interface TransactionBag
public void clearTransactions(int fromHeight)
public List<TransactionOutput> getWatchedOutputs(boolean excludeImmatureCoinbases)
addWatchedAddress(Address)
or
addWatchedScripts(java.util.List)
.excludeImmatureCoinbases
- Whether to ignore outputs that are unspendable due to being immature.public void cleanup()
public String toString(boolean includePrivateKeys, boolean includeTransactions, boolean includeExtensions, @Nullable AbstractBlockChain chain)
includePrivateKeys
- Whether raw private key data should be included.includeTransactions
- Whether to print transaction data.includeExtensions
- Whether to print extension data.chain
- If set, will be used to estimate lock times for block timelocked transactions.public Collection<Transaction> getPendingTransactions()
public long getEarliestKeyCreationTime()
ECKey.getCreationTimeSeconds()
. This can return zero if at least one key does
not have that data (was created before key timestamping was implemented).
This method is most often used in conjunction with PeerGroup.setFastCatchupTimeSecs(long)
in order to
optimize chain download for new users of wallet apps. Backwards compatibility notice: if you get zero from this
method, you can instead use the time of the first release of your software, as it's guaranteed no users will
have wallets pre-dating this time.
If there are no keys in the wallet, the current time is returned.
getEarliestKeyCreationTime
in interface PeerFilterProvider
@Nullable public Sha256Hash getLastBlockSeenHash()
public void setLastBlockSeenHash(@Nullable Sha256Hash lastBlockSeenHash)
public void setLastBlockSeenHeight(int lastBlockSeenHeight)
public void setLastBlockSeenTimeSecs(long timeSecs)
public long getLastBlockSeenTimeSecs()
@Nullable public Date getLastBlockSeenTime()
Date
representing the time extracted from the last best seen block header. This timestamp
is not the local time at which the block was first observed by this application but rather what the block
(i.e. miner) self declares. It is allowed to have some significant drift from the real time at which the block
was found, although most miners do use accurate times. If this wallet is old and does not have a recorded
time then this method returns null.public int getLastBlockSeenHeight()
public int getVersion()
public void setVersion(int version)
getVersion()
.public void setDescription(String description)
public String getDescription()
Wallet#setDescription(String))
public Coin getBalance()
Wallet.BalanceType.AVAILABLE
for details on what this
means.public Coin getBalance(Wallet.BalanceType balanceType)
public Coin getBalance(CoinSelector selector)
public Coin getWatchedBalance()
public Coin getWatchedBalance(CoinSelector selector)
public ListenableFuture<Coin> getBalanceFuture(Coin value, Wallet.BalanceType type)
Returns a future that will complete when the balance of the given type has becom equal or larger to the given value. If the wallet already has a large enough balance the future is returned in a pre-completed state. Note that this method is not blocking, if you want to actually wait immediately, you have to call .get() on the result.
Also note that by the time the future completes, the wallet may have changed yet again if something else
is going on in parallel, so you should treat the returned balance as advisory and be prepared for sending
money to fail! Finally please be aware that any listeners on the future will run either on the calling thread
if it completes immediately, or eventually on a background thread if the balance is not yet at the right
level. If you do something that means you know the balance should be sufficient to trigger the future,
you can use Threading.waitForUserCode()
to block until the future had a
chance to be updated.
public Transaction createSend(Address address, Coin value) throws InsufficientMoneyException
Statelessly creates a transaction that sends the given value to address. The change is sent to
getChangeAddress()
, so you must have added at least one key.
If you just want to send money quickly, you probably want
sendCoins(TransactionBroadcaster, Address, Coin)
instead. That will create the sending
transaction, commit to the wallet and broadcast it to the network all in one go. This method is lower level
and lets you see the proposed transaction before anything is done with it.
This is a helper method that is equivalent to using Wallet.SendRequest.to(Address, Coin)
followed by completeTx(Wallet.SendRequest)
and returning the requests transaction object.
Note that this means a fee may be automatically added if required, if you want more control over the process,
just do those two steps yourself.
IMPORTANT: This method does NOT update the wallet. If you call createSend again you may get two transactions
that spend the same coins. You have to call commitTx(Transaction)
on the created transaction to
prevent this, but that should only occur once the transaction has been accepted by the network. This implies
you cannot have more than one outstanding sending tx at once.
You MUST ensure that the value is not smaller than Transaction.MIN_NONDUST_OUTPUT
or the transaction
will almost certainly be rejected by the network as dust.
address
- The Bitcoin address to send the money to.value
- How much currency to send.InsufficientMoneyException
- if the request could not be completed due to not enough balance.Wallet.DustySendRequested
- if the resultant transaction would violate the dust rules (an output that's too small to be worthwhile)Wallet.CouldNotAdjustDownwards
- if emptying the wallet was requested and the output can't be shrunk for fees without violating a protocol rule.Wallet.ExceededMaxTransactionSize
- if the resultant transaction is too big for Bitcoin to process (try breaking up the amounts of value)public Transaction sendCoinsOffline(Wallet.SendRequest request) throws InsufficientMoneyException
PeerGroup
or Peer
the transaction will be
announced to the network. The given Wallet.SendRequest
is completed first using
completeTx(Wallet.SendRequest)
to make it valid.InsufficientMoneyException
- if the request could not be completed due to not enough balance.IllegalArgumentException
- if you try and complete the same SendRequest twiceWallet.DustySendRequested
- if the resultant transaction would violate the dust rules (an output that's too small to be worthwhile)Wallet.CouldNotAdjustDownwards
- if emptying the wallet was requested and the output can't be shrunk for fees without violating a protocol rule.Wallet.ExceededMaxTransactionSize
- if the resultant transaction is too big for Bitcoin to process (try breaking up the amounts of value)public Wallet.SendResult sendCoins(TransactionBroadcaster broadcaster, Address to, Coin value) throws InsufficientMoneyException
Sends coins to the given address, via the given PeerGroup
. Change is returned to
getChangeAddress()
. Note that a fee may be automatically added if one may be required for the
transaction to be confirmed.
The returned object provides both the transaction, and a future that can be used to learn when the broadcast is complete. Complete means, if the PeerGroup is limited to only one connection, when it was written out to the socket. Otherwise when the transaction is written out and we heard it back from a different peer.
Note that the sending transaction is committed to the wallet immediately, not when the transaction is successfully broadcast. This means that even if the network hasn't heard about your transaction you won't be able to spend those same coins again.
You MUST ensure that value is not smaller than Transaction.MIN_NONDUST_OUTPUT
or the transaction will
almost certainly be rejected by the network as dust.
broadcaster
- a TransactionBroadcaster
to use to send the transactions out.to
- Which address to send coins to.value
- How much value to send.InsufficientMoneyException
- if the request could not be completed due to not enough balance.Wallet.DustySendRequested
- if the resultant transaction would violate the dust rules (an output that's too small to be worthwhile)Wallet.CouldNotAdjustDownwards
- if emptying the wallet was requested and the output can't be shrunk for fees without violating a protocol rule.Wallet.ExceededMaxTransactionSize
- if the resultant transaction is too big for Bitcoin to process (try breaking up the amounts of value)public Wallet.SendResult sendCoins(TransactionBroadcaster broadcaster, Wallet.SendRequest request) throws InsufficientMoneyException
Sends coins according to the given request, via the given TransactionBroadcaster
.
The returned object provides both the transaction, and a future that can be used to learn when the broadcast is complete. Complete means, if the PeerGroup is limited to only one connection, when it was written out to the socket. Otherwise when the transaction is written out and we heard it back from a different peer.
Note that the sending transaction is committed to the wallet immediately, not when the transaction is successfully broadcast. This means that even if the network hasn't heard about your transaction you won't be able to spend those same coins again.
broadcaster
- the target to use for broadcast.request
- the SendRequest that describes what to do, get one using static methods on SendRequest itself.InsufficientMoneyException
- if the request could not be completed due to not enough balance.IllegalArgumentException
- if you try and complete the same SendRequest twiceWallet.DustySendRequested
- if the resultant transaction would violate the dust rules (an output that's too small to be worthwhile)Wallet.CouldNotAdjustDownwards
- if emptying the wallet was requested and the output can't be shrunk for fees without violating a protocol rule.Wallet.ExceededMaxTransactionSize
- if the resultant transaction is too big for Bitcoin to process (try breaking up the amounts of value)public Wallet.SendResult sendCoins(Wallet.SendRequest request) throws InsufficientMoneyException
Wallet.SendRequest
using the default transaction broadcaster configured either via
PeerGroup.addWallet(Wallet)
or directly with setTransactionBroadcaster(TransactionBroadcaster)
.request
- the SendRequest that describes what to do, get one using static methods on SendRequest itself.IllegalStateException
- if no transaction broadcaster has been configured.InsufficientMoneyException
- if the request could not be completed due to not enough balance.IllegalArgumentException
- if you try and complete the same SendRequest twiceWallet.DustySendRequested
- if the resultant transaction would violate the dust rules (an output that's too small to be worthwhile)Wallet.CouldNotAdjustDownwards
- if emptying the wallet was requested and the output can't be shrunk for fees without violating a protocol rule.Wallet.ExceededMaxTransactionSize
- if the resultant transaction is too big for Bitcoin to process (try breaking up the amounts of value)public Transaction sendCoins(Peer peer, Wallet.SendRequest request) throws InsufficientMoneyException
Peer
. Change is returned to getChangeAddress()
.
If an exception is thrown by PeerSocketHandler.sendMessage(Message)
the transaction is still committed, so the
pending transaction must be broadcast by you at some other time. Note that a fee may be automatically added
if one may be required for the transaction to be confirmed.Transaction
that was created or null if there was insufficient balance to send the coins.InsufficientMoneyException
- if the request could not be completed due to not enough balance.IllegalArgumentException
- if you try and complete the same SendRequest twiceWallet.DustySendRequested
- if the resultant transaction would violate the dust rules (an output that's too small to be worthwhile)Wallet.CouldNotAdjustDownwards
- if emptying the wallet was requested and the output can't be shrunk for fees without violating a protocol rule.Wallet.ExceededMaxTransactionSize
- if the resultant transaction is too big for Bitcoin to process (try breaking up the amounts of value)public void completeTx(Wallet.SendRequest req) throws InsufficientMoneyException
req
- a SendRequest that contains the incomplete transaction and details for how to make it valid.InsufficientMoneyException
- if the request could not be completed due to not enough balance.IllegalArgumentException
- if you try and complete the same SendRequest twiceWallet.DustySendRequested
- if the resultant transaction would violate the dust rules (an output that's too small to be worthwhile)Wallet.CouldNotAdjustDownwards
- if emptying the wallet was requested and the output can't be shrunk for fees without violating a protocol rule.Wallet.ExceededMaxTransactionSize
- if the resultant transaction is too big for Bitcoin to process (try breaking up the amounts of value)public void signTransaction(Wallet.SendRequest req)
Given a send request containing transaction, attempts to sign it's inputs. This method expects transaction to have all necessary inputs connected or they will be ignored.
Actual signing is done by pluggable signers
and it's not guaranteed that
transaction will be complete in the end.
public LinkedList<TransactionOutput> calculateAllSpendCandidates(boolean excludeImmatureCoinbases)
public CoinSelector getCoinSelector()
CoinSelector
object which controls which outputs can be spent by this wallet.public void setCoinSelector(CoinSelector coinSelector)
Wallet.SendRequest.coinSelector
.public void allowSpendingUnconfirmedTransactions()
public void reorganize(StoredBlock splitPoint, List<StoredBlock> oldBlocks, List<StoredBlock> newBlocks) throws VerificationException
Don't call this directly. It's not intended for API users.
Called by the BlockChain
when the best chain (representing total work done) has changed. This can
cause the number of confirmations of a transaction to go higher, lower, drop to zero and can even result in
a transaction going dead (will never confirm) due to a double spend.
The oldBlocks/newBlocks lists are ordered height-wise from top first to bottom last.
reorganize
in interface BlockChainListener
VerificationException
public int getBloomFilterElementCount()
getBloomFilterElementCount
in interface PeerFilterProvider
public boolean isRequiringUpdateAllBloomFilter()
isRequiringUpdateAllBloomFilter
in interface PeerFilterProvider
public BloomFilter getBloomFilter(double falsePositiveRate)
BloomFilter
for a brief explanation of anonymity when using filters.public BloomFilter getBloomFilter(int size, double falsePositiveRate, long nTweak)
Gets a bloom filter that contains all of the public keys from this wallet, and which will provide the given false-positive rate if it has size elements. Keep in mind that you will get 2 elements in the bloom filter for each key in the wallet, for the public key and the hash of the public key (address form).
This is used to generate a BloomFilter which can be BloomFilter.merge(BloomFilter)
d with another.
It could also be used if you have a specific target for the filter's size.
See the docs for BloomFilter(int, double)
for a brief explanation of anonymity when using bloom
filters.
getBloomFilter
in interface PeerFilterProvider
public boolean checkForFilterExhaustion(FilteredBlock block)
Peer
to decide whether or not to discard this block and any blocks building upon it, in case
the Bloom filter used to request them may be exhausted, that is, not have sufficient keys in the deterministic
sequence within it to reliably find relevant transactions.public void addExtension(WalletExtension extension)
WalletExtension
interface, you can save and load arbitrary
additional data that will be stored with the wallet. Each extension is identified by an ID, so attempting to
add the same extension twice (or two different objects that use the same ID) will throw an IllegalStateException.public WalletExtension addOrGetExistingExtension(WalletExtension extension)
public void addOrUpdateExtension(WalletExtension extension)
public Map<String,WalletExtension> getExtensions()
public void setTag(String tag, com.google.protobuf.ByteString value)
BaseTaggableObject
setTag
in interface TaggableObject
setTag
in class BaseTaggableObject
public org.bitcoinj.core.Wallet.FeeCalculation calculateFee(Wallet.SendRequest req, Coin value, List<TransactionInput> originalInputs, boolean needAtLeastReferenceFee, LinkedList<TransactionOutput> candidates) throws InsufficientMoneyException
InsufficientMoneyException
public void setTransactionBroadcaster(@Nullable TransactionBroadcaster broadcaster)
Specifies that the given TransactionBroadcaster
, typically a PeerGroup
, should be used for
sending transactions to the Bitcoin network by default. Some sendCoins methods let you specify a broadcaster
explicitly, in that case, they don't use this broadcaster. If null is specified then the wallet won't attempt
to broadcast transactions itself.
You don't normally need to call this. A PeerGroup
will automatically set itself as the wallets
broadcaster when you use PeerGroup.addWallet(Wallet)
. A wallet can use the broadcaster when you ask
it to send money, but in future also at other times to implement various features that may require asynchronous
re-organisation of the wallet contents on the block chain. For instance, in future the wallet may choose to
optimise itself to reduce fees or improve privacy.
public void setKeyRotationTime(Date time)
public Date getKeyRotationTime()
public void setKeyRotationTime(long unixTimeSeconds)
When a key rotation time is set, and money controlled by keys created before the given timestamp T will be
automatically respent to any key that was created after T. This can be used to recover from a situation where
a set of keys is believed to be compromised. You can stop key rotation by calling this method again with zero
as the argument, or by using setKeyRotationEnabled(boolean)
. Once set up, calling
maybeDoMaintenance(org.spongycastle.crypto.params.KeyParameter, boolean)
will create and possibly
send rotation transactions: but it won't be done automatically (because you might have to ask for the users
password).
Note that this method won't do anything unless you call setKeyRotationEnabled(boolean)
first.
The given time cannot be in the future.
public void setKeyRotationEnabled(boolean enabled)
public boolean isKeyRotating(ECKey key)
public ListenableFuture<List<Transaction>> maybeDoMaintenance(@Nullable org.spongycastle.crypto.params.KeyParameter aesKey, boolean andSend)
aesKey
- the users password, if any.andSend
- if true, send the transactions via the tx broadcaster and return them, if false just return them.public ReentrantLock getLock()
PeerFilterProvider
interface and generally should not be used directly by apps.
In particular, do not hold this lock if you're display a send confirm screen to the user or for any other
long length of time, as it may cause processing holdups elsewhere. Instead, for the "confirm payment screen"
use case you should complete a candidate transaction, present it to the user (e.g. for fee purposes) and then
when they confirm - which may be quite some time later - recalculate the transaction and check if it's the same.
If not, redisplay the confirm window and try again.getLock
in interface PeerFilterProvider
Copyright © 2014. All rights reserved.