Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
leohhhn committed Feb 22, 2024
1 parent 9079f54 commit 724656a
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 67 deletions.
68 changes: 26 additions & 42 deletions examples/gno.land/r/demo/disperse/disperse.gno
Original file line number Diff line number Diff line change
Expand Up @@ -5,63 +5,47 @@ import (
)

// SendSingleCoin parses receivers and amounts and sends out a single coin
// Currently sending slices as arguments with `maketx call` is unsupported,
// which is why we parse strings by delimiter here
func SendSingleCoin(addresses string, coins std.Coins) {
coinSent := std.GetOrigSend() // get Coin value & denom sent with call
func SendSingleCoin(addresses []std.Address, coins std.Coins) {
coinSent := std.GetOrigSend() // get Coins sent with call
caller := std.GetOrigCaller() // get tx sender

if len(coinSent) != 1 && len(coins) != 1 {
panic(errMultipleCoinsSent)
if len(coinSent) != len(coins) {
panic(ErrArgLenAndSentLenMismatch)
}

// Extract denom from Coins
denom := coinSent[0].Denom
if len(addresses) != len(coins) {
panic(errNumAddrValMismatch)
}

for _, coin := range coins {
if coins.AmountOf(coin.Denom) != coinSent.AmountOf(coin.Denom) {
panic(ErrWrongAmount)
}
}

// Get address of Disperse realm
realmAddr := std.CurrentRealm().Addr()

// Get Banker
banker := std.GetBanker(std.BankerTypeOrigSend)

parsedAddresses, err := parseAddresses(addresses)
if err != nil {
panic(err)
}

parsedAmounts, err := parseAmounts(sendAmounts)
if err != nil {
panic(err)
}

// Check if arg lengths are good
if len(parsedAddresses) != len(parsedAmounts) {
panic(errNumAddrValMismatch)
}

var totalToSend int64
for _, val := range parsedAmounts {
totalToSend += val
// Send coins
for i, _ := range addresses {
banker.SendCoins(realmAddr, addresses[i], std.Coins{coins[i]})
}

// Check if user sent enough coin
// Possibly not needed, added for error clarity
if coinSent.AmountOf(denom) < totalToSend {
panic(errNotEnoughCoin)
// Return possible leftover coins
for _, coin := range coinSent {
leftoverAmt := banker.GetCoins(realmAddr).AmountOf(coin.Denom)
if leftoverAmt > 0 {
send := std.Coins{{coin.Denom, leftoverAmt}}
banker.SendCoins(realmAddr, caller, send)
}
}
}

for i, val := range parsedAmounts {
send := std.Coins{{denom, val}}
receiver := parsedAddresses[i]
func main() {

// Send coin from realm to receiver address
banker.SendCoins(realmAddr, receiver, send)
}
toSend := std.Coins{{"ugnot", 1000}}

// Return possible leftover coin
leftover := banker.GetCoins(realmAddr).AmountOf(denom)
if leftover > 0 {
send := std.Coins{{denom, leftover}}
banker.SendCoins(realmAddr, caller, send)
}
}
13 changes: 7 additions & 6 deletions examples/gno.land/r/demo/disperse/errors.gno
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ package disperse
import "errors"

var (
errNotEnoughCoin = errors.New("not enough coin sent in")
errNumAddrValMismatch = errors.New("number of addresses and values to send doesn't match")
errInvalidAddress = errors.New("invalid address")
errNegativeCoinAmount = errors.New("coin amount cannot be negative")
errMultipleCoinsSent = errors.New("cannot send multiple tokens")
errBalanceNotZero = errors.New("balance needs to be equal to zero")
errNotEnoughCoin = errors.New("not enough coin sent in")
errNumAddrValMismatch = errors.New("number of addresses and values to send doesn't match")
errInvalidAddress = errors.New("invalid address")
errNegativeCoinAmount = errors.New("coin amount cannot be negative")
errBalanceNotZero = errors.New("balance needs to be equal to zero")
ErrArgLenAndSentLenMismatch = errors.New("mismatch between coins sent and args called")
ErrWrongAmount = errors.New("wrong coin amount")
)
31 changes: 12 additions & 19 deletions gno.land/cmd/gnoland/testdata/disperse.txtar
Original file line number Diff line number Diff line change
@@ -1,28 +1,21 @@
gnoland start

# Query initial balances
# Sender
gnokey query bank/balances/g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5
stdout 'height: 0\ndata: "9999870000000ugnot"'
gnokey maketx run -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 $WORK/script.gno

# Recipient 1
gnokey query bank/balances/g1x8uj9wc3wevvn3glvfallt5e5ercfcs520wy4j
stdout 'height: 0\ndata: ""'
-- script.gno --
package main

# Recipient 2
gnokey query bank/balances/g1uvdmvvj76nfgjhfe69n4lwafsu7lh2m8f3ycfp
stdout 'height: 0\ndata: ""'
import (
"gno.land/r/demo/disperse"
"std"
)

# Make call to Disperse
gnokey maketx call -pkgpath gno.land/r/demo/disperse -send 700ugnot -func SendSingleCoin -args g1x8uj9wc3wevvn3glvfallt5e5ercfcs520wy4j,g1uvdmvvj76nfgjhfe69n4lwafsu7lh2m8f3ycfp -args 150,500 -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid tendermint_test test1
func main() {

# Query balances again
# Recipient 1
gnokey query bank/balances/g1x8uj9wc3wevvn3glvfallt5e5ercfcs520wy4j
stdout 'height: 0\ndata: "150ugnot"'

# Recipient 2
gnokey query bank/balances/g1uvdmvvj76nfgjhfe69n4lwafsu7lh2m8f3ycfp
stdout 'height: 0\ndata: "500ugnot"'

toSend := std.Coins{}



}

0 comments on commit 724656a

Please sign in to comment.