mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-03-04 02:54:00 +01:00
* Remove support for v19 of bitcoind * Remove downloading v19 bitcoind inside of bitcoind-rpc.sbt * Clean up docs * Move unit tests in BitcoindV19RpcClientTest into other test files so we don't remove them, these rpcs are supported in future versions of bitcoind
83 lines
4.1 KiB
Markdown
83 lines
4.1 KiB
Markdown
---
|
|
title: Wallet Callbacks
|
|
id: wallet-callbacks
|
|
---
|
|
|
|
#### Wallet Callbacks
|
|
|
|
Bitcoin-S support call backs for the following events that happen in the wallet:
|
|
|
|
1. onTransactionProcessed
|
|
2. onTransactionBroadcast
|
|
3. onReservedUtxos
|
|
4. onNewAddressGenerated
|
|
5. onBlockProcessed
|
|
6. onRescanComplete
|
|
|
|
That means every time one of these events happens, we will call your callback
|
|
so that you can be notified of the event. These callbacks will be run after the message has been
|
|
recieved and will execute synchronously. If any of them fail an error log will be output, and the remainder of the callbacks will continue.
|
|
Let's make an easy one:
|
|
|
|
#### DLC Wallet callbacks
|
|
Bitcoin-s support callbacks for the following events in the DLC wallet:
|
|
1. onStateChange
|
|
|
|
That means everytime a DLC's state changes, your callback will be executed so
|
|
that you are notified of the event. For instance, if your DLC transitions from
|
|
`Offered` -> `Accepted`, your callback will be executed.
|
|
|
|
#### Example
|
|
|
|
Here is an example of constructing a wallet and registering a callback, so you can be notified of an event.
|
|
|
|
```scala mdoc:invisible
|
|
import akka.actor.ActorSystem
|
|
import org.bitcoins.crypto._
|
|
import org.bitcoins.core.protocol.transaction.Transaction
|
|
import org.bitcoins.core.wallet.fee._
|
|
import org.bitcoins.feeprovider._
|
|
import org.bitcoins.rpc.client.common.BitcoindRpcClient
|
|
import org.bitcoins.rpc.config.BitcoindInstanceLocal
|
|
import org.bitcoins.testkit.BitcoinSTestAppConfig
|
|
import org.bitcoins.wallet._
|
|
import org.bitcoins.wallet.config.WalletAppConfig
|
|
import scala.concurrent.{ExecutionContextExecutor, Future}
|
|
```
|
|
|
|
```scala mdoc:compile-only
|
|
|
|
implicit val system: ActorSystem = ActorSystem("example")
|
|
implicit val ec: ExecutionContextExecutor = system.dispatcher
|
|
implicit val walletConf: WalletAppConfig =
|
|
BitcoinSTestAppConfig.getNeutrinoTestConfig().walletConf
|
|
|
|
val bitcoind = BitcoindRpcClient(BitcoindInstanceLocal.fromConfFile())
|
|
val aesPasswordOpt = Some(AesPassword.fromString("password"))
|
|
|
|
// Here is a super simple example of a callback, this could be replaced with anything, from
|
|
// relaying the transaction on the network, finding relevant wallet outputs, verifying the transaction,
|
|
// or writing it to disk
|
|
val exampleProcessTx: OnTransactionProcessed = (tx: Transaction) =>
|
|
Future.successful(println(s"Processed Tx: ${tx.txIdBE}"))
|
|
|
|
// Create our WalletCallbacks that
|
|
val exampleCallbacks = WalletCallbacks(
|
|
onTransactionProcessed = Vector(exampleProcessTx))
|
|
|
|
// Now we can create a wallet
|
|
val wallet =
|
|
Wallet(
|
|
nodeApi = bitcoind,
|
|
chainQueryApi = bitcoind,
|
|
feeRateApi = ConstantFeeRateProvider(SatoshisPerVirtualByte.one))
|
|
|
|
// Finally, we can add the callbacks to our wallet config
|
|
walletConf.addCallbacks(exampleCallbacks)
|
|
|
|
// Then to trigger the event we can run
|
|
val exampleTx = Transaction(
|
|
"0200000000010258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7500000000da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752aeffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d01000000232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00000000")
|
|
wallet.processTransaction(exampleTx, None)
|
|
|
|
```
|