2021 02 25 async utils (#2725)

* Refactor AsyncUtil to just use an execution context rather than an actor system

* Create async util project, use it in various projects that depend on it
This commit is contained in:
Chris Stewart 2021-02-25 13:26:38 -06:00 committed by GitHub
parent 06654f4e05
commit 7a068ac036
25 changed files with 73 additions and 60 deletions

View file

@ -23,4 +23,4 @@ jobs:
~/.bitcoin-s/binaries
key: ${{ runner.os }}-cache
- name: run tests
run: sbt ++2.12.12 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls
run: sbt ++2.12.12 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test asyncUtils/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls

View file

@ -23,4 +23,4 @@ jobs:
~/.bitcoin-s/binaries
key: ${{ runner.os }}-cache
- name: run tests
run: sbt ++2.13.5 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls
run: sbt ++2.13.5 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test asyncUtils/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls

View file

@ -23,4 +23,4 @@ jobs:
~/.bitcoin-s/binaries
key: ${{ runner.os }}-cache
- name: run tests
run: sbt ++2.13.5 downloadBitcoind coverage walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls nodeTest/test node/coverageReport node/coverageAggregate node/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coveralls
run: sbt ++2.13.5 downloadBitcoind coverage walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls nodeTest/test node/coverageReport node/coverageAggregate node/coveralls dlcOracleTest/test asyncUtils/test dlcOracle/coverageReport dlcOracle/coveralls

View file

@ -1,8 +1,8 @@
package org.bitcoins.rpc.util
package org.bitcoins.asyncutil
import akka.actor.ActorSystem
import org.bitcoins.core.util.BitcoinSLogger
import java.util.concurrent.{Executors, TimeUnit}
import scala.concurrent._
import scala.concurrent.duration.{DurationInt, FiniteDuration}
@ -24,7 +24,7 @@ abstract class AsyncUtil extends BitcoinSLogger {
condition: => Boolean,
interval: FiniteDuration = AsyncUtil.DEFAULT_INTERVAL,
maxTries: Int = DEFAULT_MAX_TRIES)(implicit
system: ActorSystem): Future[Unit] = {
ec: ExecutionContext): Future[Unit] = {
val f = () => Future.successful(condition)
retryUntilSatisfiedF(f, interval, maxTries)
}
@ -40,7 +40,7 @@ abstract class AsyncUtil extends BitcoinSLogger {
conditionF: () => Future[Boolean],
interval: FiniteDuration = AsyncUtil.DEFAULT_INTERVAL,
maxTries: Int = DEFAULT_MAX_TRIES)(implicit
system: ActorSystem): Future[Unit] = {
ec: ExecutionContext): Future[Unit] = {
val stackTrace: Array[StackTraceElement] =
Thread.currentThread().getStackTrace
@ -81,10 +81,7 @@ abstract class AsyncUtil extends BitcoinSLogger {
counter: Int = 0,
maxTries: Int,
stackTrace: Array[StackTraceElement])(implicit
system: ActorSystem): Future[Unit] = {
import system.dispatcher
ec: ExecutionContext): Future[Unit] = {
conditionF().flatMap { condition =>
if (condition) {
Future.unit
@ -96,7 +93,8 @@ abstract class AsyncUtil extends BitcoinSLogger {
val p = Promise[Boolean]()
val runnable = retryRunnable(condition, p)
system.scheduler.scheduleOnce(delay = interval, runnable = runnable)
AsyncUtil.scheduler
.schedule(runnable, interval.toMillis, TimeUnit.MILLISECONDS)
p.future.flatMap {
case true => Future.unit
@ -122,7 +120,7 @@ abstract class AsyncUtil extends BitcoinSLogger {
condition: () => Boolean,
interval: FiniteDuration = AsyncUtil.DEFAULT_INTERVAL,
maxTries: Int = DEFAULT_MAX_TRIES)(implicit
system: ActorSystem): Future[Unit] = {
ec: ExecutionContext): Future[Unit] = {
//type hackery here to go from () => Boolean to () => Future[Boolean]
//to make sure we re-evaluate every time retryUntilSatisfied is called
@ -137,7 +135,7 @@ abstract class AsyncUtil extends BitcoinSLogger {
conditionF: () => Future[Boolean],
interval: FiniteDuration = AsyncUtil.DEFAULT_INTERVAL,
maxTries: Int = DEFAULT_MAX_TRIES)(implicit
system: ActorSystem): Future[Unit] = {
ec: ExecutionContext): Future[Unit] = {
retryUntilSatisfiedF(conditionF = conditionF,
interval = interval,
@ -148,6 +146,8 @@ abstract class AsyncUtil extends BitcoinSLogger {
object AsyncUtil extends AsyncUtil {
private[bitcoins] val scheduler = Executors.newScheduledThreadPool(2)
/** The default interval between async attempts
*/
private[bitcoins] val DEFAULT_INTERVAL: FiniteDuration = 100.milliseconds
@ -155,5 +155,4 @@ object AsyncUtil extends AsyncUtil {
/** The default number of async attempts before timing out
*/
private[bitcoins] val DEFAULT_MAX_TRIES: Int = 50
}

View file

@ -1,11 +1,11 @@
package org.bitcoins.rpc
import java.io.File
import org.bitcoins.asyncutil.AsyncUtil
import java.io.File
import org.bitcoins.core.currency.Bitcoins
import org.bitcoins.rpc.client.common.BitcoindRpcClient
import org.bitcoins.rpc.util.AsyncUtil.RpcRetryException
import org.bitcoins.rpc.util.{AsyncUtil, RpcUtil}
import org.bitcoins.rpc.util.RpcUtil
import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil
import org.bitcoins.testkit.util.{BitcoindRpcTest, FileUtil}
@ -48,7 +48,7 @@ class TestRpcUtilTest extends BitcoindRpcTest {
}
it should "fail if condition is false" in {
recoverToSucceededIf[RpcRetryException] {
recoverToSucceededIf[AsyncUtil.RpcRetryException] {
AsyncUtil.retryUntilSatisfiedF(conditionF =
() => Future.successful(false),
interval = 0.millis)
@ -70,7 +70,7 @@ class TestRpcUtilTest extends BitcoindRpcTest {
}
it should "timeout if condition is false" in {
recoverToSucceededIf[RpcRetryException] {
recoverToSucceededIf[AsyncUtil.RpcRetryException] {
AsyncUtil
.awaitCondition(condition = () => false, interval = 0.millis)
.map(_ => succeed)

View file

@ -1,5 +1,6 @@
package org.bitcoins.rpc.common
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.commons.jsonmodels.bitcoind.GetBlockChainInfoResultPreV19
import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.{
AddNodeArgument,
@ -9,7 +10,6 @@ import org.bitcoins.core.config.RegTest
import org.bitcoins.core.currency.Bitcoins
import org.bitcoins.core.number.UInt32
import org.bitcoins.rpc.client.common.{BitcoindRpcClient, BitcoindVersion}
import org.bitcoins.rpc.util.AsyncUtil
import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil
import org.bitcoins.testkit.util.BitcoindRpcTest

View file

@ -1,5 +1,6 @@
package org.bitcoins.rpc.v16
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.SignRawTransactionOutputParameter
import org.bitcoins.core.crypto.ECPrivateKeyUtil
import org.bitcoins.core.currency.Bitcoins
@ -14,7 +15,6 @@ import org.bitcoins.core.protocol.transaction.{
import org.bitcoins.crypto.{DoubleSha256DigestBE, ECPrivateKey}
import org.bitcoins.rpc.client.common.BitcoindVersion
import org.bitcoins.rpc.client.v16.BitcoindV16RpcClient
import org.bitcoins.rpc.util.AsyncUtil
import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil
import org.bitcoins.testkit.util.BitcoindRpcTest

View file

@ -1,5 +1,6 @@
package org.bitcoins.rpc.v17
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.{
AddressType,
LabelPurpose,
@ -14,7 +15,6 @@ import org.bitcoins.core.protocol.script.ScriptPubKey
import org.bitcoins.core.protocol.transaction.TransactionInput
import org.bitcoins.crypto.DoubleSha256DigestBE
import org.bitcoins.rpc.client.v17.BitcoindV17RpcClient
import org.bitcoins.rpc.util.AsyncUtil
import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil
import org.bitcoins.testkit.util.BitcoindRpcTest

View file

@ -9,6 +9,7 @@ import akka.http.scaladsl.model._
import akka.stream.StreamTcpException
import akka.util.ByteString
import com.fasterxml.jackson.core.JsonParseException
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts
import org.bitcoins.commons.serializers.JsonSerializers._
import org.bitcoins.core.config.{
@ -27,7 +28,6 @@ import org.bitcoins.rpc.config.BitcoindAuthCredentials.{
PasswordBased
}
import org.bitcoins.rpc.config.{BitcoindAuthCredentials, BitcoindInstance}
import org.bitcoins.rpc.util.AsyncUtil
import play.api.libs.json._
import scala.concurrent._

View file

@ -1,12 +1,12 @@
package org.bitcoins.rpc.util
import java.net.ServerSocket
import org.bitcoins.asyncutil.AsyncUtil
import akka.actor.ActorSystem
import java.net.ServerSocket
import org.bitcoins.rpc.client.common.BitcoindRpcClient
import scala.annotation.tailrec
import scala.concurrent.Future
import scala.concurrent.{ExecutionContext, Future}
import scala.concurrent.duration.FiniteDuration
import scala.concurrent.duration.DurationInt
import scala.util.{Failure, Random, Success, Try}
@ -16,7 +16,7 @@ abstract class RpcUtil extends AsyncUtil {
def awaitServerShutdown(
server: BitcoindRpcClient,
duration: FiniteDuration = 300.milliseconds,
maxTries: Int = 50)(implicit system: ActorSystem): Future[Unit] = {
maxTries: Int = 50)(implicit ec: ExecutionContext): Future[Unit] = {
retryUntilSatisfiedF(() => server.isStoppedF, duration, maxTries)
}

View file

@ -37,15 +37,20 @@ lazy val bitcoindRpc = project
.in(file("bitcoind-rpc"))
.settings(CommonSettings.prodSettings: _*)
.dependsOn(
asyncUtils,
appCommons
)
lazy val eclairRpc = project in file("eclair-rpc")
lazy val eclairRpc = project
.in(file("eclair-rpc"))
.dependsOn(asyncUtils, bitcoindRpc)
// quoting the val name this way makes it appear as
// 'bitcoin-s' in sbt/bloop instead of 'bitcoins'
lazy val `bitcoin-s` = project
.in(file("."))
.aggregate(
asyncUtils,
secp256k1jni,
chain,
chainTest,
@ -267,6 +272,12 @@ lazy val coreTest = project
testkit
)
lazy val asyncUtils = project
.in(file("async-utils"))
.settings(CommonSettings.prodSettings)
.settings(name := "bitcoin-s-async-utils")
.dependsOn(core)
lazy val appCommons = project
.in(file("app-commons"))
.settings(CommonSettings.prodSettings: _*)
@ -463,6 +474,7 @@ lazy val node =
libraryDependencies ++= Deps.node
)
.dependsOn(
asyncUtils,
core,
chain,
dbCommons,
@ -500,6 +512,7 @@ lazy val testkit = project
name := "bitcoin-s-testkit"
)
.dependsOn(
asyncUtils,
core % testAndCompile,
appServer,
chain,

View file

@ -1,5 +1,6 @@
package org.bitcoins.eclair.rpc
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.commons.jsonmodels.eclair._
import org.bitcoins.core.config.RegTest
import org.bitcoins.core.currency.{CurrencyUnits, Satoshis}
@ -22,7 +23,6 @@ import org.bitcoins.eclair.rpc.api._
import org.bitcoins.eclair.rpc.client.EclairRpcClient
import org.bitcoins.eclair.rpc.config.{EclairAuthCredentials, EclairInstance}
import org.bitcoins.rpc.client.common.BitcoindRpcClient
import org.bitcoins.rpc.util.AsyncUtil
import org.bitcoins.testkit.async.TestAsyncUtil
import org.bitcoins.testkit.eclair.rpc.{EclairNodes4, EclairRpcTestUtil}
import org.bitcoins.testkit.util.{BitcoinSAsyncTest, EclairRpcTestClient}

View file

@ -6,8 +6,6 @@ name := "bitcoin-s-eclair-rpc"
libraryDependencies ++= Deps.eclairRpc
dependsOn(Projects.bitcoindRpc)
CommonSettings.prodSettings
TaskKeys.downloadEclair := {

View file

@ -9,6 +9,7 @@ import akka.http.scaladsl.model.headers.{Authorization, BasicHttpCredentials}
import akka.http.scaladsl.model.ws.{Message, TextMessage, WebSocketRequest}
import akka.stream.scaladsl.{Flow, Sink, Source}
import akka.util.ByteString
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.commons.jsonmodels.eclair._
import org.bitcoins.commons.serializers.JsonReaders._
import org.bitcoins.core.currency.{CurrencyUnit, Satoshis}
@ -30,7 +31,6 @@ import org.bitcoins.eclair.rpc.api._
import org.bitcoins.eclair.rpc.config.EclairInstance
import org.bitcoins.eclair.rpc.network.NodeUri
import org.bitcoins.rpc.client.common.BitcoindVersion
import org.bitcoins.rpc.util.AsyncUtil
import org.slf4j.LoggerFactory
import play.api.libs.json._

View file

@ -1,12 +1,12 @@
package org.bitcoins.node
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.core.currency._
import org.bitcoins.core.protocol.script.MultiSignatureScriptPubKey
import org.bitcoins.core.protocol.transaction.TransactionOutput
import org.bitcoins.core.wallet.fee.SatoshisPerByte
import org.bitcoins.crypto.ECPublicKey
import org.bitcoins.rpc.client.common.BitcoindVersion
import org.bitcoins.rpc.util.AsyncUtil
import org.bitcoins.server.BitcoinSAppConfig
import org.bitcoins.testkit.BitcoinSTestAppConfig
import org.bitcoins.testkit.node.{

View file

@ -1,8 +1,8 @@
package org.bitcoins.node
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.core.currency._
import org.bitcoins.crypto.DoubleSha256DigestBE
import org.bitcoins.rpc.util.AsyncUtil
import org.bitcoins.server.BitcoinSAppConfig
import org.bitcoins.testkit.BitcoinSTestAppConfig
import org.bitcoins.testkit.node.{

View file

@ -2,6 +2,7 @@ package org.bitcoins.node
import akka.Done
import akka.actor.ActorSystem
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.chain.blockchain.ChainHandlerCached
import org.bitcoins.chain.config.ChainAppConfig
import org.bitcoins.chain.models.{
@ -25,7 +26,6 @@ import org.bitcoins.node.networking.peer.{
PeerMessageReceiver,
PeerMessageSender
}
import org.bitcoins.rpc.util.AsyncUtil
import scala.concurrent.duration.DurationInt
import scala.concurrent.{ExecutionContext, Future, Promise}

View file

@ -2,6 +2,7 @@ package org.bitcoins.node
import akka.Done
import akka.actor.ActorSystem
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.chain.config.ChainAppConfig
import org.bitcoins.core.api.chain.ChainQueryApi.FilterResponse
import org.bitcoins.core.bloom.BloomFilter
@ -10,7 +11,6 @@ import org.bitcoins.core.protocol.{BitcoinAddress, BlockStamp}
import org.bitcoins.core.util.Mutable
import org.bitcoins.node.config.NodeAppConfig
import org.bitcoins.node.models.Peer
import org.bitcoins.rpc.util.AsyncUtil
import scala.concurrent.{Future, Promise}

View file

@ -1,14 +1,12 @@
package org.bitcoins.testkit.async
import akka.actor.ActorSystem
import org.bitcoins.asyncutil.AsyncUtil
import org.scalatest.exceptions.{StackDepthException, TestFailedException}
import scala.concurrent.{ExecutionContext, Future}
import scala.concurrent.duration.FiniteDuration
abstract class TestAsyncUtil
extends org.bitcoins.rpc.util.AsyncUtil
with Serializable {
abstract class TestAsyncUtil extends AsyncUtil with Serializable {
override protected def retryUntilSatisfiedWithCounter(
conditionF: () => Future[Boolean],
@ -16,7 +14,7 @@ abstract class TestAsyncUtil
counter: Int,
maxTries: Int,
stackTrace: Array[StackTraceElement])(implicit
system: ActorSystem): Future[Unit] = {
ec: ExecutionContext): Future[Unit] = {
val retryF = super
.retryUntilSatisfiedWithCounter(conditionF,
duration,
@ -24,7 +22,7 @@ abstract class TestAsyncUtil
maxTries,
stackTrace)
TestAsyncUtil.transformRetryToTestFailure(retryF)(system.dispatcher)
TestAsyncUtil.transformRetryToTestFailure(retryF)
}
}

View file

@ -244,6 +244,7 @@ trait EclairRpcTestUtil extends BitcoinSLogger {
client: EclairApi,
chanId: ChannelId,
state: ChannelState)(implicit system: ActorSystem): Future[Unit] = {
import system.dispatcher
logger.debug(s"Awaiting ${chanId} to enter ${state} state")
def isState(): Future[Boolean] = {
val chanF = client.channel(chanId)
@ -294,6 +295,7 @@ trait EclairRpcTestUtil extends BitcoinSLogger {
failFast: Boolean)(implicit
system: ActorSystem,
tag: ClassTag[T]): Future[Unit] = {
import system.dispatcher
logger.debug(
s"Awaiting payment ${paymentId} to enter ${tag.runtimeClass.getName} state")
@ -336,6 +338,7 @@ trait EclairRpcTestUtil extends BitcoinSLogger {
maxTries: Int = 60)(implicit
system: ActorSystem,
tag: ClassTag[T]): Future[Unit] = {
import system.dispatcher
logger.debug(
s"Awaiting payment ${paymentHash} to enter ${tag.runtimeClass.getName} state")
@ -719,22 +722,22 @@ trait EclairRpcTestUtil extends BitcoinSLogger {
* Fails the future if they are not sychronized within the given timeout.
*/
def awaitEclairInSync(eclair: EclairRpcClient, bitcoind: BitcoindRpcClient)(
implicit
system: ActorSystem,
ec: ExecutionContext): Future[Unit] = {
def clientInSync(client: EclairRpcClient, bitcoind: BitcoindRpcClient)(
implicit ec: ExecutionContext): Future[Boolean] =
for {
blockCount <- bitcoind.getBlockCount
info <- client.getInfo
} yield info.blockHeight == blockCount
implicit system: ActorSystem): Future[Unit] = {
import system.dispatcher
TestAsyncUtil.retryUntilSatisfiedF(conditionF =
() => clientInSync(eclair, bitcoind),
interval = 1.seconds)
}
private def clientInSync(
client: EclairRpcClient,
bitcoind: BitcoindRpcClient)(implicit
ec: ExecutionContext): Future[Boolean] =
for {
blockCount <- bitcoind.getBlockCount
info <- client.getInfo
} yield info.blockHeight == blockCount
/** Shuts down an eclair daemon and the bitcoind daemon it is associated with
*/
def shutdown(eclairRpcClient: EclairRpcClient)(implicit

View file

@ -4,6 +4,7 @@ import java.io.File
import java.net.URI
import java.nio.file.{Files, Path}
import akka.actor.ActorSystem
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.AddNodeArgument
import org.bitcoins.commons.jsonmodels.bitcoind.{
GetBlockWithTransactionsResult,
@ -43,7 +44,7 @@ import org.bitcoins.rpc.config.{
BitcoindInstance,
ZmqConfig
}
import org.bitcoins.rpc.util.{AsyncUtil, RpcUtil}
import org.bitcoins.rpc.util.RpcUtil
import org.bitcoins.testkit.util.{BitcoindRpcTestClient, FileUtil}
import org.bitcoins.util.ListUtil
@ -589,6 +590,7 @@ trait BitcoindRpcTestUtil extends BitcoinSLogger {
client: BitcoindRpcClient,
interval: FiniteDuration = 100.milliseconds,
maxTries: Int = 50)(implicit system: ActorSystem): Future[Unit] = {
import system.dispatcher
AsyncUtil.retryUntilSatisfiedF(conditionF = { () => client.isStoppedF },
interval = interval,
maxTries = maxTries)

View file

@ -3,10 +3,10 @@ package org.bitcoins.testkit.util
import akka.actor.ActorSystem
import akka.testkit.TestKit
import akka.util.Timeout
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.core.config.{NetworkParameters, RegTest}
import org.bitcoins.core.protocol.blockchain.ChainParams
import org.bitcoins.core.util.BitcoinSLogger
import org.bitcoins.rpc.util.AsyncUtil
import org.scalacheck.{Gen, Shrink}
import org.scalactic.anyvals.PosInt
import org.scalatest._

View file

@ -2,6 +2,7 @@ package org.bitcoins.testkit.wallet
import akka.actor.ActorSystem
import com.typesafe.config.{Config, ConfigFactory}
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.core.api.chain.ChainQueryApi
import org.bitcoins.core.api.chain.ChainQueryApi.FilterResponse
import org.bitcoins.core.api.feeprovider.FeeRateApi
@ -23,7 +24,6 @@ import org.bitcoins.node.{
}
import org.bitcoins.rpc.client.common.{BitcoindRpcClient, BitcoindVersion}
import org.bitcoins.rpc.client.v19.BitcoindV19RpcClient
import org.bitcoins.rpc.util.AsyncUtil
import org.bitcoins.server.BitcoinSAppConfig
import org.bitcoins.server.BitcoinSAppConfig._
import org.bitcoins.testkit.Implicits.GeneratorOps
@ -736,7 +736,7 @@ object BitcoinSWalletTest extends WalletLogger {
system: ActorSystem): Future[Unit] = {
AsyncUtil.retryUntilSatisfiedF(conditionF =
() => isSameWalletBalances(fundedWallet),
interval = 1.seconds)
interval = 1.seconds)(system.dispatcher)
}
private def isSameWalletBalances(fundedWallet: WalletWithBitcoind)(implicit

View file

@ -1,5 +1,6 @@
package org.bitcoins.wallet
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.core.currency.{Bitcoins, Satoshis}
import org.bitcoins.core.protocol.script.EmptyScriptPubKey
import org.bitcoins.core.protocol.transaction.TransactionOutput
@ -9,7 +10,6 @@ import org.bitcoins.core.wallet.utxo.{
AddressLabelTagType,
StorageLocationTagType
}
import org.bitcoins.rpc.util.AsyncUtil
import org.bitcoins.testkit.wallet.FundWalletUtil.FundedWallet
import org.bitcoins.testkit.wallet.{BitcoinSWalletTest, WalletTestUtil}
import org.scalatest.FutureOutcome

View file

@ -1,8 +1,8 @@
package org.bitcoins.wallet
import org.bitcoins.asyncutil.AsyncUtil
import org.bitcoins.core.currency._
import org.bitcoins.db.AppConfig
import org.bitcoins.rpc.util.AsyncUtil
import org.bitcoins.server.{BitcoinSAppConfig, BitcoindRpcBackendUtil}
import org.bitcoins.testkit.fixtures.BitcoinSFixture
import org.bitcoins.testkit.util.BitcoinSAsyncTest