disperse.gno
2.75 Kb ยท 103 lines
1package disperse
2
3import (
4 "std"
5
6 tokens "gno.land/r/demo/grc20factory"
7)
8
9var realmAddr = std.CurrentRealm().Address()
10
11// DisperseUgnot parses receivers and amounts and sends out ugnot
12// The function will send out the coins to the addresses and return the leftover coins to the caller
13// if there are any to return
14func DisperseUgnot(cur realm, addresses []std.Address, coins std.Coins) {
15 coinSent := std.OriginSend()
16 caller := std.PreviousRealm().Address()
17 banker := std.NewBanker(std.BankerTypeRealmSend)
18
19 if len(addresses) != len(coins) {
20 panic(ErrNumAddrValMismatch)
21 }
22
23 for _, coin := range coins {
24 if coin.Amount <= 0 {
25 panic(ErrNegativeCoinAmount)
26 }
27
28 if banker.GetCoins(realmAddr).AmountOf(coin.Denom) < coin.Amount {
29 panic(ErrMismatchBetweenSentAndParams)
30 }
31 }
32
33 // Send coins
34 for i := range addresses {
35 banker.SendCoins(realmAddr, addresses[i], std.NewCoins(coins[i]))
36 }
37
38 // Return possible leftover coins
39 for _, coin := range coinSent {
40 leftoverAmt := banker.GetCoins(realmAddr).AmountOf(coin.Denom)
41 if leftoverAmt > 0 {
42 send := std.Coins{std.NewCoin(coin.Denom, leftoverAmt)}
43 banker.SendCoins(realmAddr, caller, send)
44 }
45 }
46}
47
48// DisperseUgnotString receives a string of addresses and a string of amounts
49// and parses them to be used in DisperseUgnot
50func DisperseUgnotString(cur realm, addresses string, amounts string) {
51 parsedAddresses, err := parseAddresses(addresses)
52 if err != nil {
53 panic(err)
54 }
55
56 parsedAmounts, err := parseAmounts(amounts)
57 if err != nil {
58 panic(err)
59 }
60
61 coins := make(std.Coins, len(parsedAmounts))
62 for i, amount := range parsedAmounts {
63 coins[i] = std.NewCoin("ugnot", amount)
64 }
65
66 DisperseUgnot(cur, parsedAddresses, coins)
67}
68
69// DisperseGRC20 disperses tokens to multiple addresses
70// Note that it is necessary to approve the realm to spend the tokens before calling this function
71// see the corresponding filetests for examples
72func DisperseGRC20(cur realm, addresses []std.Address, amounts []int64, symbols []string) {
73 caller := std.PreviousRealm().Address()
74
75 if (len(addresses) != len(amounts)) || (len(amounts) != len(symbols)) {
76 panic(ErrArgLenAndSentLenMismatch)
77 }
78 for _, amount := range amounts {
79 if amount < 0 {
80 panic(ErrInvalidAmount)
81 }
82 }
83
84 for i := 0; i < len(addresses); i++ {
85 tokens.TransferFrom(cross, symbols[i], caller, addresses[i], amounts[i])
86 }
87}
88
89// DisperseGRC20String receives a string of addresses and a string of tokens
90// and parses them to be used in DisperseGRC20
91func DisperseGRC20String(cur realm, addresses string, tokens string) {
92 parsedAddresses, err := parseAddresses(addresses)
93 if err != nil {
94 panic(err)
95 }
96
97 parsedAmounts, parsedSymbols, err := parseTokens(tokens)
98 if err != nil {
99 panic(err)
100 }
101
102 DisperseGRC20(cur, parsedAddresses, parsedAmounts, parsedSymbols)
103}