mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-02-22 14:33:06 +01:00
External payout addresses for acceptdlc (#4121)
This commit is contained in:
parent
96d11163a6
commit
34b7d18268
6 changed files with 66 additions and 24 deletions
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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]
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ class DLCNodeTest extends BitcoinSDLCNodeTest {
|
|||
None,
|
||||
None)
|
||||
|
||||
_ <- nodeB.acceptDLCOffer(addrA, offer.toMessage)
|
||||
_ <- nodeB.acceptDLCOffer(addrA, offer.toMessage, None, None)
|
||||
|
||||
_ <- TestAsyncUtil.awaitConditionF(
|
||||
() =>
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue