bbgo/pkg/types/withdraw.go

146 lines
3.8 KiB
Go

package types
import (
"fmt"
"time"
"github.com/slack-go/slack"
"git.qtrade.icu/lychiyu/bbgo/pkg/fixedpoint"
)
type WithdrawStatus string
const (
WithdrawStatusSent WithdrawStatus = "sent"
WithdrawStatusCancelled WithdrawStatus = "cancelled"
WithdrawStatusAwaitingApproval WithdrawStatus = "awaiting_approval"
WithdrawStatusRejected WithdrawStatus = "rejected"
WithdrawStatusProcessing WithdrawStatus = "processing"
WithdrawStatusFailed WithdrawStatus = "failed"
WithdrawStatusCompleted WithdrawStatus = "completed"
WithdrawStatusUnknown WithdrawStatus = "unknown"
)
type Withdraw struct {
GID int64 `json:"gid" db:"gid"`
Exchange ExchangeName `json:"exchange" db:"exchange"`
Asset string `json:"asset" db:"asset"`
Amount fixedpoint.Value `json:"amount" db:"amount"`
Address string `json:"address" db:"address"`
AddressTag string `json:"addressTag"`
Status WithdrawStatus `json:"status"`
OriginalStatus string `json:"originalStatus"`
TransactionID string `json:"transactionID" db:"txn_id"`
TransactionFee fixedpoint.Value `json:"transactionFee" db:"txn_fee"`
TransactionFeeCurrency string `json:"transactionFeeCurrency" db:"txn_fee_currency"`
WithdrawOrderID string `json:"withdrawOrderId"`
ApplyTime Time `json:"applyTime" db:"time"`
Network string `json:"network" db:"network"`
}
func cutstr(s string, maxLen, head, tail int) string {
if len(s) > maxLen {
l := len(s)
return s[0:head] + "..." + s[l-tail:]
}
return s
}
func (w Withdraw) String() (o string) {
o = fmt.Sprintf("%s WITHDRAW %s %s -> ", w.Exchange, w.Amount.String(), w.Asset)
if len(w.Network) > 0 && w.Network != w.Asset {
o += w.Network + ":"
}
o += fmt.Sprintf("%s @ %s", w.Address, w.ApplyTime.Time())
if !w.TransactionFee.IsZero() {
feeCurrency := w.TransactionFeeCurrency
if feeCurrency == "" {
feeCurrency = w.Asset
}
o += fmt.Sprintf(" FEE %4f %5s", w.TransactionFee.Float64(), feeCurrency)
}
if len(w.TransactionID) > 0 {
o += fmt.Sprintf(" TxID: %s", cutstr(w.TransactionID, 12, 4, 4))
}
o += fmt.Sprintf(" STATUS: %s (%s)", w.Status, w.OriginalStatus)
return o
}
func (w Withdraw) EffectiveTime() time.Time {
return w.ApplyTime.Time()
}
func (w *Withdraw) SlackAttachment() slack.Attachment {
var fields []slack.AttachmentField
if len(w.TransactionID) > 0 {
fields = append(fields, slack.AttachmentField{
Title: "TransactionID",
Value: w.TransactionID,
Short: false,
})
}
if w.TransactionFee.Sign() > 0 {
fields = append(fields, slack.AttachmentField{
Title: "Transaction Fee",
Value: fmt.Sprintf("%s %s", w.TransactionFee.String(), w.TransactionFeeCurrency),
Short: false,
})
}
if len(w.Status) > 0 {
fields = append(fields, slack.AttachmentField{
Title: "Status",
Value: fmt.Sprintf("%s (%s)", w.Status, w.OriginalStatus),
Short: false,
})
}
return slack.Attachment{
Color: withdrawStatusSlackColor(w.Status),
Title: fmt.Sprintf("Withdraw %s %s To %s (Network %s)", w.Amount.String(), w.Asset, w.Address, w.Network),
// TitleLink: "",
Pretext: "",
Text: "",
// ServiceName: "",
// ServiceIcon: "",
// FromURL: "",
// OriginalURL: "",
Fields: fields,
Footer: fmt.Sprintf("Apply Time: %s", w.ApplyTime.Time().Format(time.RFC3339)),
// FooterIcon: "",
}
}
func withdrawStatusSlackColor(status WithdrawStatus) string {
switch status {
case WithdrawStatusCompleted:
return "good"
case WithdrawStatusFailed:
return "red"
case WithdrawStatusCancelled:
return "gray"
default:
return "gray"
}
}
type WithdrawalOptions struct {
Network string
AddressTag string
}