Files
atomic-swap/rpc/database.go

92 lines
2.5 KiB
Go

// Copyright 2023 Athanor Labs (ON)
// SPDX-License-Identifier: LGPL-3.0-only
package rpc
import (
"math/big"
"net/http"
"github.com/athanorlabs/atomic-swap/common/types"
mcrypto "github.com/athanorlabs/atomic-swap/crypto/monero"
"github.com/athanorlabs/atomic-swap/db"
contracts "github.com/athanorlabs/atomic-swap/ethereum"
ethcommon "github.com/ethereum/go-ethereum/common"
)
// RecoveryDB contains methods for retrieving swap recovery info from the database.
type RecoveryDB interface {
GetContractSwapInfo(id types.Hash) (*db.EthereumSwapInfo, error)
GetSwapPrivateKey(id types.Hash) (*mcrypto.PrivateSpendKey, error)
GetCounterpartySwapPrivateKey(id types.Hash) (*mcrypto.PrivateSpendKey, error)
}
// DatabaseService ...
type DatabaseService struct {
rdb RecoveryDB
}
// NewDatabaseService returns a new DatabaseService.
func NewDatabaseService(rdb RecoveryDB) *DatabaseService {
return &DatabaseService{
rdb: rdb,
}
}
// GetContractSwapInfoRequest ...
type GetContractSwapInfoRequest struct {
OfferID types.Hash `json:"offerID" validate:"required"`
}
// GetContractSwapInfoResponse ...
type GetContractSwapInfoResponse struct {
StartNumber *big.Int `json:"startBlockNumber" validate:"required"`
SwapID types.Hash `json:"swapID" validate:"required"`
Swap *contracts.SwapCreatorSwap `json:"swap" validate:"required"`
SwapCreatorAddr ethcommon.Address `json:"swapCreatorAddr" validate:"required"`
}
// GetContractSwapInfo returns the contract swap info for the given swap ID from the database.
func (s *DatabaseService) GetContractSwapInfo(
_ *http.Request,
req *GetContractSwapInfoRequest,
resp *GetContractSwapInfoResponse,
) error {
info, err := s.rdb.GetContractSwapInfo(req.OfferID)
if err != nil {
return err
}
resp.StartNumber = info.StartNumber
resp.SwapID = info.SwapID
resp.Swap = info.Swap
resp.SwapCreatorAddr = info.SwapCreatorAddr
return nil
}
// GetSwapSecretRequest ...
type GetSwapSecretRequest struct {
OfferID types.Hash `json:"offerID" validate:"required"`
}
// GetSwapSecretResponse ...
type GetSwapSecretResponse struct {
Secret *mcrypto.PrivateSpendKey `json:"secret" validate:"required"`
}
// GetSwapSecret returns our swap secret for the given swap ID from the database.
func (s *DatabaseService) GetSwapSecret(
_ *http.Request,
req *GetSwapSecretRequest,
resp *GetSwapSecretResponse,
) error {
key, err := s.rdb.GetSwapPrivateKey(req.OfferID)
if err != nil {
return err
}
resp.Secret = key
return nil
}