External payout addresses for acceptdlc (#4121)

This commit is contained in:
rorp 2022-02-22 12:47:48 -08:00 committed by GitHub
parent 96d11163a6
commit 34b7d18268
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 66 additions and 24 deletions

View file

@ -31,11 +31,16 @@ case class DLCRoutes(dlcNode: DLCNodeApi)(implicit system: ActorSystem)
case ServerCommand("acceptdlc", arr) =>
withValidServerCommand(AcceptDLC.fromJsArr(arr)) {
case AcceptDLC(offer, address) =>
case AcceptDLC(offer, address, payoutAddressOpt, changeAddressOpt) =>
complete {
dlcNode.acceptDLCOffer(address, offer).map { _ =>
Server.httpSuccess(ujson.Null)
}
dlcNode
.acceptDLCOffer(address,
offer,
payoutAddressOpt,
changeAddressOpt)
.map { accept =>
Server.httpSuccess(accept.toMessage.hex)
}
}
}

View file

@ -920,21 +920,41 @@ object AcceptDLCOffer extends ServerJsonModels {
}
}
case class AcceptDLC(offer: LnMessage[DLCOfferTLV], peerAddr: InetSocketAddress)
case class AcceptDLC(
offer: LnMessage[DLCOfferTLV],
peerAddr: InetSocketAddress,
externalPayoutAddressOpt: Option[BitcoinAddress],
externalChangeAddressOpt: Option[BitcoinAddress])
object AcceptDLC extends ServerJsonModels {
def fromJsArr(jsArr: ujson.Arr): Try[AcceptDLC] = {
def parseParameters(
offerJs: Value,
addrJs: Value,
payoutAddressJs: Value,
changeAddressJs: Value) = Try {
val offer = LnMessageFactory(DLCOfferTLV).fromHex(offerJs.str)
val uri = new URI("tcp://" + addrJs.str)
val peerAddr =
InetSocketAddress.createUnresolved(uri.getHost, uri.getPort)
val payoutAddressJsOpt = nullToOpt(payoutAddressJs)
val payoutAddressOpt =
payoutAddressJsOpt.map(js => jsToBitcoinAddress(js))
val changeAddressJsOpt = nullToOpt(changeAddressJs)
val changeAddressOpt =
changeAddressJsOpt.map(js => jsToBitcoinAddress(js))
AcceptDLC(offer, peerAddr, payoutAddressOpt, changeAddressOpt)
}
jsArr.arr.toList match {
case offerJs :: addrJs :: Nil =>
Try {
val offer = LnMessageFactory(DLCOfferTLV).fromHex(offerJs.str)
val uri = new URI("tcp://" + addrJs.str)
val peerAddr =
InetSocketAddress.createUnresolved(uri.getHost, uri.getPort)
AcceptDLC(offer, peerAddr)
}
parseParameters(offerJs, addrJs, Null, Null)
case offerJs :: addrJs :: payoutAddressJs :: Nil =>
parseParameters(offerJs, addrJs, payoutAddressJs, Null)
case offerJs :: addrJs :: payoutAddressJs :: changeAddressJs :: Nil =>
parseParameters(offerJs, addrJs, payoutAddressJs, changeAddressJs)
case Nil =>
Failure(
new IllegalArgumentException("Missing offer and peerAddr argument"))

View file

@ -1,6 +1,8 @@
package org.bitcoins.core.api.dlc.node
import org.bitcoins.core.api.dlc.wallet.DLCWalletApi
import org.bitcoins.core.protocol.BitcoinAddress
import org.bitcoins.core.protocol.dlc.models.DLCMessage
import org.bitcoins.core.protocol.tlv._
import org.bitcoins.core.util.StartStopAsync
@ -13,7 +15,10 @@ trait DLCNodeApi extends StartStopAsync[Unit] {
def acceptDLCOffer(
peerAddress: InetSocketAddress,
dlcOffer: LnMessage[DLCOfferTLV]): Future[Unit]
dlcOffer: LnMessage[DLCOfferTLV],
externalPayoutAddress: Option[BitcoinAddress],
externalChangeAddress: Option[BitcoinAddress]): Future[
DLCMessage.DLCAccept]
def getHostAddress: Future[InetSocketAddress]
}

View file

@ -39,7 +39,7 @@ class DLCNodeTest extends BitcoinSDLCNodeTest {
None,
None)
_ <- nodeB.acceptDLCOffer(addrA, offer.toMessage)
_ <- nodeB.acceptDLCOffer(addrA, offer.toMessage, None, None)
_ <- TestAsyncUtil.awaitConditionF(
() =>

View file

@ -11,12 +11,17 @@ class DLCDataHandler(dlcWalletApi: DLCWalletApi, connectionHandler: ActorRef)
extends Actor
with ActorLogging {
implicit val ec: ExecutionContextExecutor = context.system.dispatcher
import DLCDataHandler.{Send, SendLnMessage}
override def preStart(): Unit = {
val _ = context.watch(connectionHandler)
}
override def receive: Receive = LoggingReceive {
case Send(tlv) =>
connectionHandler ! tlv
case SendLnMessage(lnMessage) =>
connectionHandler ! lnMessage
case lnMessage: LnMessage[TLV] =>
log.info(s"Received LnMessage ${lnMessage.typeName}")
val f: Future[Unit] = handleTLVMessage(lnMessage)
@ -74,6 +79,7 @@ object DLCDataHandler {
sealed trait Command
case class Received(tlv: TLV) extends Command
case class Send(tlv: TLV) extends Command
case class SendLnMessage(message: LnMessage[TLV]) extends Command
def defaultFactory(
dlcWalletApi: DLCWalletApi,

View file

@ -4,6 +4,8 @@ import akka.actor.{ActorRef, ActorSystem}
import grizzled.slf4j.Logging
import org.bitcoins.core.api.dlc.node.DLCNodeApi
import org.bitcoins.core.api.dlc.wallet.DLCWalletApi
import org.bitcoins.core.protocol.BitcoinAddress
import org.bitcoins.core.protocol.dlc.models.DLCMessage
import org.bitcoins.core.protocol.tlv._
import org.bitcoins.dlc.node.config._
import org.bitcoins.dlc.node.peer.Peer
@ -55,9 +57,13 @@ case class DLCNode(wallet: DLCWalletApi)(implicit
}
}
private[node] def connectAndSendToPeer(
def acceptDLCOffer(
peerAddress: InetSocketAddress,
message: LnMessage[TLV]): Future[Unit] = {
dlcOffer: LnMessage[DLCOfferTLV],
externalPayoutAddress: Option[BitcoinAddress],
externalChangeAddress: Option[BitcoinAddress]): Future[
DLCMessage.DLCAccept] = {
val peer =
Peer(socket = peerAddress, socks5ProxyParams = config.socks5ProxyParams)
@ -66,12 +72,12 @@ case class DLCNode(wallet: DLCWalletApi)(implicit
for {
_ <- DLCClient.connect(peer, wallet, Some(handlerP))
handler <- handlerP.future
} yield handler ! message
}
def acceptDLCOffer(
peerAddress: InetSocketAddress,
dlcOffer: LnMessage[DLCOfferTLV]): Future[Unit] = {
connectAndSendToPeer(peerAddress, dlcOffer)
accept <- wallet.acceptDLCOffer(dlcOffer.tlv,
externalPayoutAddress,
externalChangeAddress)
} yield {
handler ! DLCDataHandler.SendLnMessage(accept.toMessage)
accept
}
}
}