-
Notifications
You must be signed in to change notification settings - Fork 0
/
handler.go
164 lines (134 loc) · 4.72 KB
/
handler.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
package nameservice
import (
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// NewHandler returns a handler for "nameservice" type messages.
func NewHandler(keeper Keeper) sdk.Handler {
return func(ctx sdk.Context, msg sdk.Msg) sdk.Result {
switch msg := msg.(type) {
case MsgSetName:
return handleMsgSetName(ctx, keeper, msg)
case MsgBuyName:
return handleMsgBuyName(ctx, keeper, msg)
case MsgAddNewCoin:
return handleMsgAddNewCoin(ctx, keeper, msg)
case MsgAddCoin:
return handleMsgAddCoin(ctx, keeper, msg)
case MsgBurnCoin:
return handleMsgBurnCoin(ctx, keeper, msg)
default:
errMsg := fmt.Sprintf("Unrecognized nameservice Msg type: %v", msg.Type())
return sdk.ErrUnknownRequest(errMsg).Result()
}
}
}
// Handle a message to set name
func handleMsgSetName(ctx sdk.Context, keeper Keeper, msg MsgSetName) sdk.Result {
if !msg.Owner.Equals(keeper.GetOwner(ctx, msg.Name)) { // Checks if the the msg sender is the same as the current owner
return sdk.ErrUnauthorized("Incorrect Owner").Result() // If not, throw an error
}
keeper.SetName(ctx, msg.Name, msg.Value) // If so, set the name to the value specified in the msg.
return sdk.Result{} // return
}
// Handle a message to buy name
func handleMsgBuyName(ctx sdk.Context, keeper Keeper, msg MsgBuyName) sdk.Result {
if keeper.GetPrice(ctx, msg.Name).IsAllGT(msg.Bid) { // Checks if the the bid price is greater than the price paid by the current owner
return sdk.ErrInsufficientCoins("Bid not high enough").Result() // If not, throw an error
}
if keeper.HasOwner(ctx, msg.Name) {
err := keeper.coinKeeper.SendCoins(ctx, msg.Buyer, keeper.GetOwner(ctx, msg.Name), msg.Bid)
if err != nil {
return sdk.ErrInsufficientCoins("Buyer does not have enough coins").Result()
}
} else {
_, err := keeper.coinKeeper.SubtractCoins(ctx, msg.Buyer, msg.Bid) // If so, deduct the Bid amount from the sender
if err != nil {
return sdk.ErrInsufficientCoins("Buyer does not have enough coins").Result()
}
}
keeper.SetOwner(ctx, msg.Name, msg.Buyer)
keeper.SetPrice(ctx, msg.Name, msg.Bid)
return sdk.Result{}
}
// ---------------------------------------------
// Add new token to account
func handleMsgAddNewCoin(ctx sdk.Context, keeper Keeper, msg MsgAddNewCoin) sdk.Result {
// 限定一次只发行一个,不能和之前的重复
oldCoins := keeper.coinKeeper.GetCoins(ctx, msg.Owner)
newCoins := msg.Amt
var addCoins sdk.Coins
addCoin := newCoins[0]
addCoins = append(addCoins, addCoin)
// 判断重复, 如果要新发行的coin和原来的重复,该怎么输出错误信息?
in := contain(addCoin, oldCoins)
if !in {
_, err := keeper.AddNewCoins(ctx, msg.Owner, addCoins)
if err != nil {
return sdk.ErrUnknownRequest("Owner address invalid or coins invalid").Result()
}
}
return sdk.Result{}
}
// 增发
func handleMsgAddCoin(ctx sdk.Context, keeper Keeper, msg MsgAddCoin) sdk.Result {
//oldCoins := keeper.coinKeeper.GetCoins(ctx, msg.Owner)
newCoins := msg.Amt
var addCoins sdk.Coins
addCoin := newCoins[0]
addCoins = append(addCoins, addCoin)
// 增发,不用判断重复
_, err := keeper.AddCoin(ctx, msg.Owner, addCoins)
if err != nil {
return sdk.ErrUnknownRequest("Owner address invalid or coins invalid").Result()
}
return sdk.Result{}
}
// 销毁token,
// Burn a token from account
func handleMsgBurnCoin(ctx sdk.Context, keeper Keeper, msg MsgBurnCoin) sdk.Result {
oldCoins := keeper.coinKeeper.GetCoins(ctx, msg.Owner)
amount := msg.Amt
burnCoin := amount[0]
var burnCoins sdk.Coins
burnCoins = append(burnCoins, burnCoin)
//一次销毁一个币,从切片中删除某个Coin,销毁之前要先判断该账户下有没有这个币,还要判断要销毁的币的数量是否超出原来账户下该币的数量
// 如果要销毁的币的数量 > 原来账户下该币的数量,该怎么输出错误信息?
// ok1,********
//ok is:false
ok := safeBurn(burnCoin, oldCoins)
fmt.Println("ok1,********")
fmt.Printf("ok is:%v \n", ok)
if ok {
fmt.Println("ok2,********")
_, err := keeper.BurnCoins(ctx, msg.Owner, burnCoins)
if err != nil {
return sdk.ErrUnknownRequest("Owner address invalid or coins invalid").Result()
}
}
return sdk.Result{}
}
func contain(Coin sdk.Coin, Coins sdk.Coins) bool {
for i := 0; i < Coins.Len(); i++ {
if Coins[i].Denom == Coin.Denom {
return true
}
}
return false
}
//func safeBurn(Coin sdk.Coin, Coins sdk.Coins) bool {
// for i := 0; i < Coins.Len(); i++ {
// if Coins[i].Denom == Coin.Denom && Coins[i].Amount == Coin.Amount {
// return true
// }
// }
// return false
//}
func safeBurn(Coin sdk.Coin, Coins sdk.Coins) bool {
for i := 0; i < Coins.Len(); i++ {
if Coins[i].Denom == Coin.Denom {
return true
}
}
return false
}