e549e32976
Change-Id: Ib8b7e38f2cb07085655448264f281fd7fc7867dd
120 lines
3.5 KiB
Go
120 lines
3.5 KiB
Go
// Copyright (C) 2019 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package payments
|
|
|
|
import (
|
|
"context"
|
|
"math/big"
|
|
"time"
|
|
|
|
"github.com/skyrings/skyring-common/tools/uuid"
|
|
)
|
|
|
|
// StorjTokens defines all payments STORJ token related functionality.
|
|
//
|
|
// architecture: Service
|
|
type StorjTokens interface {
|
|
// Deposit creates deposit transaction for specified amount in cents.
|
|
Deposit(ctx context.Context, userID uuid.UUID, amount int64) (*Transaction, error)
|
|
// ListTransactionInfos returns all transaction associated with user.
|
|
ListTransactionInfos(ctx context.Context, userID uuid.UUID) ([]TransactionInfo, error)
|
|
}
|
|
|
|
// TransactionStatus defines allowed statuses
|
|
// for deposit transactions.
|
|
type TransactionStatus string
|
|
|
|
// String returns string representation of transaction status.
|
|
func (status TransactionStatus) String() string {
|
|
return string(status)
|
|
}
|
|
|
|
const (
|
|
// TransactionStatusPaid is a transaction which successfully received required funds.
|
|
TransactionStatusPaid TransactionStatus = "paid"
|
|
// TransactionStatusPending is a transaction which accepts funds.
|
|
TransactionStatusPending TransactionStatus = "pending"
|
|
// TransactionStatusCancelled is a transaction that is cancelled and no longer accepting new funds.
|
|
TransactionStatusCancelled TransactionStatus = "cancelled"
|
|
)
|
|
|
|
// TransactionID is a transaction ID type.
|
|
type TransactionID []byte
|
|
|
|
// String returns string representation of transaction id.
|
|
func (id TransactionID) String() string {
|
|
return string(id)
|
|
}
|
|
|
|
// Transaction defines deposit transaction which
|
|
// accepts user funds on a specific wallet address.
|
|
type Transaction struct {
|
|
ID TransactionID
|
|
Amount TokenAmount
|
|
Rate big.Float
|
|
Address string
|
|
Status TransactionStatus
|
|
Timeout time.Duration
|
|
Link string
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
// TransactionInfo holds transaction data with additional information
|
|
// such as links and expiration time.
|
|
type TransactionInfo struct {
|
|
ID TransactionID
|
|
Amount TokenAmount
|
|
Received TokenAmount
|
|
AmountCents int64
|
|
ReceivedCents int64
|
|
Address string
|
|
Status TransactionStatus
|
|
Link string
|
|
ExpiresAt time.Time
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
// TokenAmount is a wrapper type for STORJ token amount.
|
|
// Uses big.Float as inner representation. Precision is set to 32
|
|
// so it can properly handle 8 digits after point which is STORJ token
|
|
// decimal set.
|
|
type TokenAmount struct {
|
|
inner big.Float
|
|
}
|
|
|
|
// STORJTokenPrecision defines STORJ token precision.
|
|
const STORJTokenPrecision = 32
|
|
|
|
// NewTokenAmount creates new zeroed TokenAmount with fixed precision.
|
|
func NewTokenAmount() *TokenAmount {
|
|
return &TokenAmount{inner: *new(big.Float).SetPrec(STORJTokenPrecision)}
|
|
}
|
|
|
|
// BigFloat returns inner representation of TokenAmount.
|
|
func (amount *TokenAmount) BigFloat() *big.Float {
|
|
f := new(big.Float).Set(&amount.inner)
|
|
return f
|
|
}
|
|
|
|
// String representation of TokenValue.
|
|
func (amount *TokenAmount) String() string {
|
|
return amount.inner.Text('f', -1)
|
|
}
|
|
|
|
// ParseTokenAmount parses string representing floating point and returns
|
|
// TokenAmount.
|
|
func ParseTokenAmount(s string) (*TokenAmount, error) {
|
|
inner, _, err := big.ParseFloat(s, 10, STORJTokenPrecision, big.ToNearestEven)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &TokenAmount{inner: *inner}, nil
|
|
}
|
|
|
|
// TokenAmountFromBigFloat converts big.Float to TokenAmount.
|
|
func TokenAmountFromBigFloat(f *big.Float) *TokenAmount {
|
|
inner := (*f).SetMode(big.ToNearestEven).SetPrec(STORJTokenPrecision)
|
|
return &TokenAmount{inner: *inner}
|
|
}
|