114 lines
2.8 KiB
Go
114 lines
2.8 KiB
Go
package mutations
|
|
|
|
import (
|
|
"context"
|
|
|
|
gql "github.com/llehouerou/go-graphql-client"
|
|
"github.com/pkg/errors"
|
|
"github.com/shopspring/decimal"
|
|
|
|
"git.lehouerou.net/laurent/sorare/graphql"
|
|
"git.lehouerou.net/laurent/sorare/types"
|
|
)
|
|
|
|
type bidInput struct {
|
|
Approvals []AuthorizationApprovalInput `json:"approvals"`
|
|
AuctionId string `json:"auctionId"`
|
|
Amount decimal.Decimal `json:"amount"`
|
|
SettlementInfo SettlementInfo `json:"settlementInfo"`
|
|
ClientMutationId string `json:"clientMutationId"`
|
|
}
|
|
|
|
type BidPayload struct {
|
|
Bid struct {
|
|
Id graphql.Id `graphql:"id"`
|
|
} `graphql:"bid"`
|
|
BaseMutationPayload
|
|
}
|
|
|
|
type BidParams struct {
|
|
Input bidInput `graphql:"input"`
|
|
}
|
|
|
|
func (m *Mutations) newBidMutation() *graphql.Mutation[BidPayload, BidParams] {
|
|
return graphql.NewMutation[BidPayload, BidParams](m.c, "bid")
|
|
}
|
|
|
|
type BidOptions struct {
|
|
PaymentMethod types.PaymentMethod
|
|
}
|
|
|
|
func WithBidPaymentMethod(paymentMethod types.PaymentMethod) func(*BidOptions) {
|
|
return func(o *BidOptions) {
|
|
o.PaymentMethod = paymentMethod
|
|
}
|
|
}
|
|
|
|
func (m *Mutations) BidOnAuction(
|
|
ctx context.Context,
|
|
auctionId string,
|
|
amount decimal.Decimal,
|
|
currency types.SupportedCurrency,
|
|
privateKey string,
|
|
options ...func(*BidOptions),
|
|
) (string, error) {
|
|
|
|
opts := BidOptions{
|
|
PaymentMethod: types.PaymentMethodWallet,
|
|
}
|
|
for _, opt := range options {
|
|
opt(&opts)
|
|
}
|
|
exchangeRate, err := m.ExchangeRate.Get(ctx, graphql.EmptyParams{})
|
|
if err != nil {
|
|
return "", errors.Wrap(err, "getting exchange rate")
|
|
}
|
|
si := SettlementInfo{
|
|
Currency: currency,
|
|
PaymentMethod: opts.PaymentMethod,
|
|
ExchangeRateId: exchangeRate.Id.String(),
|
|
}
|
|
currencyShift := 2
|
|
if currency == types.SupportedCurrencyWEI {
|
|
currencyShift = 18
|
|
}
|
|
amount = amount.Shift(int32(currencyShift))
|
|
|
|
prepareBidRes, err := m.newPrepareBidMutation().Execute(ctx, PrepareBidParams{
|
|
Input: prepareBidInput{
|
|
AuctionId: gql.ID(auctionId),
|
|
Amount: amount,
|
|
SettlementInfo: si,
|
|
}})
|
|
if err != nil {
|
|
return "", errors.Wrap(err, "preparing bid")
|
|
}
|
|
if len(prepareBidRes.Errors) > 0 {
|
|
return "", errors.Wrap(errors.New(prepareBidRes.Errors[0].Message), "preparing bid")
|
|
}
|
|
|
|
approvals, err := signAuthorizationRequests(
|
|
privateKey,
|
|
prepareBidRes.Authorizations,
|
|
)
|
|
if err != nil {
|
|
return "", errors.Wrap(err, "signing authorization requests")
|
|
}
|
|
|
|
bidRes, err := m.newBidMutation().Execute(ctx, BidParams{
|
|
Input: bidInput{
|
|
Approvals: approvals,
|
|
AuctionId: auctionId,
|
|
Amount: amount,
|
|
SettlementInfo: si,
|
|
ClientMutationId: GetRandomId(),
|
|
}})
|
|
if err != nil {
|
|
return "", errors.Wrap(err, "placing bid")
|
|
}
|
|
if len(bidRes.Errors) > 0 {
|
|
return "", errors.Wrap(errors.New(bidRes.Errors[0].Message), "placing bid")
|
|
}
|
|
return bidRes.Bid.Id.String(), nil
|
|
}
|