146 lines
3.8 KiB
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
|
||
|
}
|