@@ -2,33 +2,31 @@ package disperse
2
2
3
3
import (
4
4
"std"
5
+
6
+ tokens "gno.land/r/demo/grc20factory"
5
7
)
6
8
7
- // SendSingleCoin parses receivers and amounts and sends out a single coin
8
- func SendSingleCoin (addresses []std.Address, coins std.Coins) {
9
+ // DisperseGnot parses receivers and amounts and sends out gnot
10
+ func DisperseGnot (addresses []std.Address, coins std.Coins) {
9
11
coinSent := std.GetOrigSend() // get Coins sent with call
10
12
caller := std.GetOrigCaller() // get tx sender
11
13
12
- if len(coinSent) != len(coins) {
13
- panic(ErrArgLenAndSentLenMismatch)
14
- }
15
-
16
- if len(addresses) != len(coins) {
17
- panic(errNumAddrValMismatch)
18
- }
19
-
20
- for _, coin := range coins {
21
- if coins.AmountOf(coin.Denom) != coinSent.AmountOf(coin.Denom) {
22
- panic(ErrWrongAmount)
23
- }
24
- }
25
-
26
14
// Get address of Disperse realm
27
15
realmAddr := std.CurrentRealm().Addr()
28
16
29
17
// Get Banker
30
18
banker := std.GetBanker(std.BankerTypeOrigSend)
31
19
20
+ var totalAmount int64
21
+ for _, coin := range coins {
22
+ totalAmount += coin.Amount
23
+ }
24
+
25
+ // Check if total amount of coins sent is bigger or equal to total amount of coins to be sent
26
+ if totalAmount > coinSent.AmountOf("ugnot") {
27
+ panic(ErrWrongAmount)
28
+ }
29
+
32
30
// Send coins
33
31
for i, _ := range addresses {
34
32
banker.SendCoins(realmAddr, addresses[i], std.Coins{coins[i]})
@@ -44,8 +42,58 @@ func SendSingleCoin(addresses []std.Address, coins std.Coins) {
44
42
}
45
43
}
46
44
47
- func main() {
45
+ func DisperseToken(addresses []std.Address, coins std.Coins) {
46
+ caller := std.GetOrigCaller() // get tx sender
47
+
48
+ var totalAmount uint64
49
+ for _, coin := range coins {
50
+ totalAmount += uint64(coin.Amount)
51
+ }
48
52
49
- toSend := std.Coins{{"ugnot", 1000}}
53
+ tokens.TransferFrom(coins[0].Denom, caller, std.CurrentRealm().Addr(), totalAmount)
54
+ for i, address := range addresses {
55
+ for y, coin := range coins {
56
+ if y == i {
57
+ tokens.Transfer(coin.Denom, address, uint64(coin.Amount))
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ func DisperseTokenString(symbol string, addresses string, amounts string) {
64
+ parsedAddresses, err := parseAddresses(addresses)
65
+ if err != nil {
66
+ panic(err)
67
+ }
68
+
69
+ parsedAmounts, err := parseAmounts(amounts)
70
+ if err != nil {
71
+ panic(err)
72
+ }
73
+
74
+ coins := make(std.Coins, len(parsedAmounts))
75
+ for i, amount := range parsedAmounts {
76
+ coins[i] = std.Coin{symbol, amount}
77
+ }
78
+
79
+ DisperseToken(parsedAddresses, coins)
80
+ }
81
+
82
+ func DisperseGnotString(addresses string, amounts string) {
83
+ parsedAddresses, err := parseAddresses(addresses)
84
+ if err != nil {
85
+ panic(err)
86
+ }
87
+
88
+ parsedAmounts, err := parseAmounts(amounts)
89
+ if err != nil {
90
+ panic(err)
91
+ }
92
+
93
+ coins := make(std.Coins, len(parsedAmounts))
94
+ for i, amount := range parsedAmounts {
95
+ coins[i] = std.Coin{"ugnot", amount}
96
+ }
50
97
98
+ DisperseGnot(parsedAddresses, coins)
51
99
}
0 commit comments