From 724656a29b45d92c40b30640eff4f29945ccc94c Mon Sep 17 00:00:00 2001 From: leohhhn Date: Thu, 22 Feb 2024 12:46:33 +0100 Subject: [PATCH] refactor --- .../gno.land/r/demo/disperse/disperse.gno | 68 +++++++------------ examples/gno.land/r/demo/disperse/errors.gno | 13 ++-- gno.land/cmd/gnoland/testdata/disperse.txtar | 31 ++++----- 3 files changed, 45 insertions(+), 67 deletions(-) diff --git a/examples/gno.land/r/demo/disperse/disperse.gno b/examples/gno.land/r/demo/disperse/disperse.gno index 6e3de9a3606..09624862d86 100644 --- a/examples/gno.land/r/demo/disperse/disperse.gno +++ b/examples/gno.land/r/demo/disperse/disperse.gno @@ -5,18 +5,23 @@ 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() @@ -24,44 +29,23 @@ func SendSingleCoin(addresses string, coins std.Coins) { // 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) - } } diff --git a/examples/gno.land/r/demo/disperse/errors.gno b/examples/gno.land/r/demo/disperse/errors.gno index 29cb11062b3..a6f3ada91c6 100644 --- a/examples/gno.land/r/demo/disperse/errors.gno +++ b/examples/gno.land/r/demo/disperse/errors.gno @@ -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") ) diff --git a/gno.land/cmd/gnoland/testdata/disperse.txtar b/gno.land/cmd/gnoland/testdata/disperse.txtar index 9732010629c..435952cfec3 100644 --- a/gno.land/cmd/gnoland/testdata/disperse.txtar +++ b/gno.land/cmd/gnoland/testdata/disperse.txtar @@ -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{} + + +}