-
Notifications
You must be signed in to change notification settings - Fork 20
/
approve.go
160 lines (135 loc) · 3.83 KB
/
approve.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package types
import (
"bytes"
"fmt"
"sort"
"strings"
btypes "github.com/QOSGroup/qbase/types"
"github.com/QOSGroup/qos/types"
)
// 授权 Common 结构
type Approve struct {
From btypes.AccAddress `json:"from"` // 授权账号
To btypes.AccAddress `json:"to"` // 被授权账号
QOS btypes.BigInt `json:"qos"` // QOS
QSCs types.QSCs `json:"qscs"` // QSCs
}
func NewApprove(from btypes.AccAddress, to btypes.AccAddress, qos btypes.BigInt, qscs types.QSCs) Approve {
return Approve{
From: from,
To: to,
QOS: qos.NilToZero(),
QSCs: qscs,
}
}
// 校验
func (approve Approve) Valid() error {
// 地址不能为空
if len(approve.From) == 0 {
return ErrInvalidInput("from address is empty")
}
if len(approve.To) == 0 {
return ErrInvalidInput("to address is empty")
}
// 地址不能相同
if approve.From.Equals(approve.To) {
return ErrInvalidInput("addresses of from and to are the same")
}
// 币值为正
if !approve.IsPositive() {
return ErrInvalidInput("coins must be positive")
}
// QSCs中不能包含QOS,不能包含重复币种
m := make(map[string]bool)
for _, val := range approve.QSCs {
val.Name = strings.ToUpper(strings.TrimSpace(val.Name))
// 不能包含QOS
if strings.ToUpper(val.Name) == types.QOSCoinName {
return ErrInvalidInput("QSCs can not contain qos, not case sensitive")
}
// 不能重复
if _, ok := m[val.Name]; !ok {
m[val.Name] = true
} else {
return ErrInvalidInput(fmt.Sprintf("repeat qsc:%s", val.Name))
}
}
return nil
}
// 是否为正值
func (approve Approve) IsPositive() bool {
if approve.QOS.IsNil() || approve.QOS.IsZero() {
return approve.QSCs.IsPositive()
} else if approve.QOS.GT(btypes.NewInt(0)) {
return approve.IsNotNegative()
} else {
return false
}
}
// 是否为非负值
func (approve Approve) IsNotNegative() bool {
approve.QOS = approve.QOS.NilToZero()
if approve.QOS.LT(btypes.NewInt(0)) {
return false
}
return approve.QSCs.IsNotNegative()
}
// 返回相反值
func (approve Approve) Negative() Approve {
return NewApprove(approve.From, approve.To, approve.QOS.Neg(), approve.QSCs.Negative())
}
// Plus
func (approve Approve) Plus(qos btypes.BigInt, qscs types.QSCs) Approve {
return NewApprove(approve.From, approve.To, approve.QOS.Add(qos.NilToZero()), approve.QSCs.Plus(qscs))
}
// Minus
func (approve Approve) Minus(qos btypes.BigInt, qscs types.QSCs) Approve {
approve.QOS = approve.QOS.NilToZero()
qos = qos.NilToZero()
return NewApprove(approve.From, approve.To, approve.QOS.Add(qos.Neg()), approve.QSCs.Minus(qscs))
}
// 是否大于等于
func (approve Approve) IsGTE(qos btypes.BigInt, qscs types.QSCs) bool {
approve.QOS = approve.QOS.NilToZero()
qos = qos.NilToZero()
if approve.QOS.LT(qos) {
return false
}
return approve.QSCs.IsGTE(qscs)
}
// 是否大于
func (approve Approve) IsGT(qos btypes.BigInt, qscs types.QSCs) bool {
approve.QOS = approve.QOS.NilToZero()
qos = qos.NilToZero()
if approve.QOS.LT(qos) {
return false
} else if approve.QOS.Equal(qos) {
return !approve.QSCs.IsLT(qscs) && !approve.QSCs.IsEqual(qscs)
} else {
return qscs.IsNotNegative()
}
}
// 重写Equals
func (approve Approve) Equals(approveB Approve) bool {
return approve.String() == approveB.String()
}
// 输出字符串
func (approve Approve) String() string {
approve.QOS = approve.QOS.NilToZero()
var buf bytes.Buffer
buf.WriteString("from:" + approve.From.String() + " ")
buf.WriteString("to:" + approve.To.String() + " ")
buf.WriteString("qos:" + approve.QOS.String() + " ")
names := make([]string, 0, len(approve.QSCs))
m1 := make(map[string]btypes.BigInt)
for _, val := range approve.QSCs {
names = append(names, val.Name)
m1[val.Name] = val.Amount
}
sort.Strings(names)
for _, name := range names {
buf.WriteString(name + ":")
buf.WriteString(m1[name].String() + " ")
}
return buf.String()
}