mirror of
https://github.com/AthanorLabs/atomic-swap.git
synced 2026-01-10 06:38:04 -05:00
114 lines
2.9 KiB
Go
114 lines
2.9 KiB
Go
package xmrmaker
|
|
|
|
import (
|
|
"github.com/noot/atomic-swap/common"
|
|
"github.com/noot/atomic-swap/common/types"
|
|
"github.com/noot/atomic-swap/net"
|
|
"github.com/noot/atomic-swap/net/message"
|
|
|
|
"github.com/fatih/color" //nolint:misspell
|
|
)
|
|
|
|
// Provides returns types.ProvidesXMR
|
|
func (b *Instance) Provides() types.ProvidesCoin {
|
|
return types.ProvidesXMR
|
|
}
|
|
|
|
func (b *Instance) initiate(offer *types.Offer, offerExtra *types.OfferExtra, providesAmount common.MoneroAmount,
|
|
desiredAmount common.EtherAmount) error {
|
|
b.swapMu.Lock()
|
|
defer b.swapMu.Unlock()
|
|
|
|
if b.swapStates[offer.GetID()] != nil {
|
|
return errProtocolAlreadyInProgress
|
|
}
|
|
|
|
balance, err := b.backend.GetBalance(0)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// check user's balance and that they actually have what they will provide
|
|
if balance.UnlockedBalance <= float64(providesAmount) {
|
|
return errBalanceTooLow
|
|
}
|
|
|
|
s, err := newSwapState(b.backend, offer, b.offerManager, offerExtra.StatusCh,
|
|
offerExtra.InfoFile, providesAmount, desiredAmount)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
go func() {
|
|
<-s.done
|
|
delete(b.swapStates, offer.GetID())
|
|
}()
|
|
|
|
log.Info(color.New(color.Bold).Sprintf("**initiated swap with ID=%s**", s.ID()))
|
|
log.Info(color.New(color.Bold).Sprint("DO NOT EXIT THIS PROCESS OR FUNDS MAY BE LOST!"))
|
|
log.Infof(color.New(color.Bold).Sprintf("receiving %v ETH for %v XMR",
|
|
s.info.ReceivedAmount(),
|
|
s.info.ProvidedAmount()),
|
|
)
|
|
b.swapStates[offer.GetID()] = s
|
|
return nil
|
|
}
|
|
|
|
// HandleInitiateMessage is called when we receive a network message from a peer that they wish to initiate a swap.
|
|
func (b *Instance) HandleInitiateMessage(msg *net.SendKeysMessage) (net.SwapState, net.Message, error) {
|
|
str := color.New(color.Bold).Sprintf("**incoming take of offer %s with provided amount %v**",
|
|
msg.OfferID,
|
|
msg.ProvidedAmount,
|
|
)
|
|
log.Info(str)
|
|
|
|
// get offer and determine expected amount
|
|
id, err := types.HexToHash(msg.OfferID)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
offer, offerExtra := b.offerManager.getAndDeleteOffer(id)
|
|
if offer == nil {
|
|
return nil, nil, errNoOfferWithID
|
|
}
|
|
|
|
providedAmount := offer.ExchangeRate.ToXMR(msg.ProvidedAmount)
|
|
|
|
if providedAmount < offer.MinimumAmount {
|
|
return nil, nil, errAmountProvidedTooLow
|
|
}
|
|
|
|
if providedAmount > offer.MaximumAmount {
|
|
return nil, nil, errAmountProvidedTooHigh
|
|
}
|
|
|
|
if err = b.initiate(offer, offerExtra, common.MoneroToPiconero(providedAmount), common.EtherToWei(msg.ProvidedAmount)); err != nil { //nolint:lll
|
|
return nil, nil, err
|
|
}
|
|
|
|
offerID, err := types.HexToHash(msg.OfferID)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
s, has := b.swapStates[offerID]
|
|
if !has {
|
|
panic("did not store swap state in Instance map")
|
|
}
|
|
|
|
if err = s.handleSendKeysMessage(msg); err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
resp, err := s.SendKeysMessage()
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
defer func() {
|
|
s.setNextExpectedMessage(&message.NotifyETHLocked{})
|
|
}()
|
|
return s, resp, nil
|
|
}
|