11package clightning
22
33import (
4+ "context"
45 "crypto/rand"
56 "encoding/hex"
67 "errors"
@@ -12,6 +13,8 @@ import (
1213
1314 "github.com/elementsproject/peerswap/log"
1415 "github.com/elementsproject/peerswap/peerswaprpc"
16+ "github.com/elementsproject/peerswap/peersync"
17+ "github.com/elementsproject/peerswap/peersync/format"
1518 "github.com/elementsproject/peerswap/premium"
1619
1720 "github.com/elementsproject/glightning/glightning"
@@ -225,8 +228,10 @@ func (l *SwapOut) Call() (jrpc2.Result, error) {
225228 }
226229
227230 // Skip this check when `force` is set.
228- if ! l .Force && ! l .cl .peerRunsPeerSwap (fundingChannels .Id ) {
229- return nil , fmt .Errorf ("peer does not run peerswap" )
231+ if ! l .Force {
232+ if l .cl .peerSync == nil || ! l .cl .peerSync .HasCompatiblePeer (fundingChannels .Id ) {
233+ return nil , fmt .Errorf ("peer does not run peerswap" )
234+ }
230235 }
231236
232237 if ! l .cl .isPeerConnected (fundingChannels .Id ) {
@@ -345,8 +350,10 @@ func (l *SwapIn) Call() (jrpc2.Result, error) {
345350 }
346351
347352 // Skip this check when `force` is set.
348- if ! l .Force && ! l .cl .peerRunsPeerSwap (fundingChannels .Id ) {
349- return nil , fmt .Errorf ("peer does not run peerswap" )
353+ if ! l .Force {
354+ if l .cl .peerSync == nil || ! l .cl .peerSync .HasCompatiblePeer (fundingChannels .Id ) {
355+ return nil , fmt .Errorf ("peer does not run peerswap" )
356+ }
350357 }
351358
352359 if ! l .cl .isPeerConnected (fundingChannels .Id ) {
@@ -559,91 +566,26 @@ func (l *ListPeers) Call() (jrpc2.Result, error) {
559566 fundingChannels [channel .ShortChannelId ] = channel
560567 }
561568
562- // get polls
563- polls , err := l .cl .pollService .GetCompatiblePolls ()
564- if err != nil {
565- return nil , err
569+ compatible := make (map [string ]* peersync.Peer )
570+ if l .cl .peerSync != nil {
571+ compatible , err = l .cl .peerSync .CompatiblePeers ()
572+ if err != nil {
573+ return nil , err
574+ }
566575 }
567576
568577 peerSwappers := []* peerswaprpc.PeerSwapPeer {}
569578 for _ , peer := range peers {
570- if p , ok := polls [peer .Id ]; ok {
579+ peerState , ok := compatible [peer .Id ]
580+ if ok {
581+ capability := peerState .Capability ()
571582 swaps , err := l .cl .swaps .ListSwapsByPeer (peer .Id )
572583 if err != nil {
573584 return nil , err
574585 }
575586
576- var paidFees uint64
577- var ReceiverSwapsOut , ReceiverSwapsIn , ReceiverSatsOut , ReceiverSatsIn uint64
578- var SenderSwapsOut , SenderSwapsIn , SenderSatsOut , SenderSatsIn uint64
579- for _ , s := range swaps {
580- // We only list successful swaps. They all end in an
581- // State_ClaimedPreimage state.
582- if s .Current == swap .State_ClaimedPreimage {
583- if s .Role == swap .SWAPROLE_SENDER {
584- paidFees += s .Data .OpeningTxFee
585- if s .Type == swap .SWAPTYPE_OUT {
586- SenderSwapsOut ++
587- SenderSatsOut += s .Data .GetAmount ()
588- } else {
589- SenderSwapsIn ++
590- SenderSatsIn += s .Data .GetAmount ()
591- }
592- } else {
593- if s .Type == swap .SWAPTYPE_OUT {
594- ReceiverSwapsOut ++
595- ReceiverSatsOut += s .Data .GetAmount ()
596- } else {
597- ReceiverSwapsIn ++
598- ReceiverSatsIn += s .Data .GetAmount ()
599- }
600- }
601- }
602- }
603-
604- peerSwapPeer := & peerswaprpc.PeerSwapPeer {
605- NodeId : peer .Id ,
606- SwapsAllowed : p .PeerAllowed ,
607- SupportedAssets : p .Assets ,
608- AsSender : & peerswaprpc.SwapStats {
609- SwapsOut : SenderSwapsOut ,
610- SwapsIn : SenderSwapsIn ,
611- SatsOut : SenderSatsOut ,
612- SatsIn : SenderSatsIn ,
613- },
614- AsReceiver : & peerswaprpc.SwapStats {
615- SwapsOut : ReceiverSwapsOut ,
616- SwapsIn : ReceiverSwapsIn ,
617- SatsOut : ReceiverSatsOut ,
618- SatsIn : ReceiverSatsIn ,
619- },
620- PaidFee : paidFees ,
621- PeerPremium : & peerswaprpc.PeerPremium {
622- NodeId : peer .Id ,
623- Rates : []* peerswaprpc.PremiumRate {
624- {
625- Asset : peerswaprpc .AssetType_BTC ,
626- Operation : peerswaprpc .OperationType_SWAP_IN ,
627- PremiumRatePpm : p .BTCSwapInPremiumRatePPM ,
628- },
629- {
630- Asset : peerswaprpc .AssetType_BTC ,
631- Operation : peerswaprpc .OperationType_SWAP_OUT ,
632- PremiumRatePpm : p .BTCSwapOutPremiumRatePPM ,
633- },
634- {
635- Asset : peerswaprpc .AssetType_LBTC ,
636- Operation : peerswaprpc .OperationType_SWAP_IN ,
637- PremiumRatePpm : p .LBTCSwapInPremiumRatePPM ,
638- },
639- {
640- Asset : peerswaprpc .AssetType_LBTC ,
641- Operation : peerswaprpc .OperationType_SWAP_OUT ,
642- PremiumRatePpm : p .LBTCSwapOutPremiumRatePPM ,
643- },
644- },
645- },
646- }
587+ view := format .BuildPeerView (peer .Id , capability , swaps )
588+ peerSwapPeer := peerswaprpc .NewPeerSwapPeerFromView (view )
647589 channels , err := l .cl .glightning .ListChannelsBySource (peer .Id )
648590 if err != nil {
649591 return nil , err
@@ -754,8 +696,10 @@ func (c ReloadPolicyFile) Call() (jrpc2.Result, error) {
754696 if err != nil {
755697 return nil , err
756698 }
757- // Resend poll
758- c .cl .pollService .PollAllPeers ()
699+ // Resend capability updates
700+ if c .cl .peerSync != nil {
701+ c .cl .peerSync .ForcePollAllPeers (context .Background ())
702+ }
759703 return c .cl .policy .Get (), nil
760704}
761705
@@ -1217,10 +1161,13 @@ func (c *UpdatePremiumRate) Call() (jrpc2.Result, error) {
12171161 if err != nil {
12181162 return nil , fmt .Errorf ("error creating premium rate: %v" , err )
12191163 }
1220- err = c .cl .ps .SetRate (c .PeerID , rate )
1164+ err = c .cl .ps .SetRate (context . Background (), c .PeerID , rate )
12211165 if err != nil {
12221166 return nil , fmt .Errorf ("error setting premium rate: %v" , err )
12231167 }
1168+ if c .cl .peerSync != nil {
1169+ c .cl .peerSync .ForcePollAllPeers (context .Background ())
1170+ }
12241171 return & peerswaprpc.PremiumRate {
12251172 Asset : peerswaprpc .ToAssetType (rate .Asset ()),
12261173 Operation : peerswaprpc .ToOperationType (rate .Operation ()),
@@ -1263,11 +1210,14 @@ func (c *DeletePremiumRate) Call() (jrpc2.Result, error) {
12631210 if ! c .cl .isReady {
12641211 return nil , ErrWaitingForReady
12651212 }
1266- err := c .cl .ps .DeleteRate (c .PeerID , toPremiumAssetType (c .Asset ),
1213+ err := c .cl .ps .DeleteRate (context . Background (), c .PeerID , toPremiumAssetType (c .Asset ),
12671214 toPremiumOperationType (c .Operation ))
12681215 if err != nil {
12691216 return nil , fmt .Errorf ("error deleting premium rate: %v" , err )
12701217 }
1218+ if c .cl .peerSync != nil {
1219+ c .cl .peerSync .ForcePollAllPeers (context .Background ())
1220+ }
12711221 return & peerswaprpc.PremiumRate {
12721222 Asset : peerswaprpc .ToAssetType (toPremiumAssetType (c .Asset )),
12731223 Operation : peerswaprpc .ToOperationType (toPremiumOperationType (c .Operation )),
@@ -1315,10 +1265,13 @@ func (c *UpdateGlobalPremiumRate) Call() (jrpc2.Result, error) {
13151265 if err != nil {
13161266 return nil , fmt .Errorf ("error creating premium rate: %v" , err )
13171267 }
1318- err = c .cl .ps .SetDefaultRate (rate )
1268+ err = c .cl .ps .SetDefaultRate (context . Background (), rate )
13191269 if err != nil {
13201270 return nil , fmt .Errorf ("error setting default premium rate: %v" , err )
13211271 }
1272+ if c .cl .peerSync != nil {
1273+ c .cl .peerSync .ForcePollAllPeers (context .Background ())
1274+ }
13221275 return & peerswaprpc.PremiumRate {
13231276 Asset : peerswaprpc .ToAssetType (rate .Asset ()),
13241277 Operation : peerswaprpc .ToOperationType (rate .Operation ()),
0 commit comments