From b427d46eb6b9e67d01b336c0a154ba19a1df84ea Mon Sep 17 00:00:00 2001 From: leohhhn Date: Tue, 28 Nov 2023 19:05:29 +0100 Subject: [PATCH 01/14] wip disperse --- examples/gno.land/r/demo/disperse/disperse.gno | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 examples/gno.land/r/demo/disperse/disperse.gno diff --git a/examples/gno.land/r/demo/disperse/disperse.gno b/examples/gno.land/r/demo/disperse/disperse.gno new file mode 100644 index 00000000000..59ba3fa219b --- /dev/null +++ b/examples/gno.land/r/demo/disperse/disperse.gno @@ -0,0 +1,10 @@ +package disperse + +import "std" + +func SendNative(addresses []std.Address, values []uint64) { + + for _, receiver := range addresses { + + } +} From 0c80d55b8a11ad9331ad8e31867a4d5a9fcb0c55 Mon Sep 17 00:00:00 2001 From: leohhhn Date: Tue, 5 Dec 2023 14:33:22 +0100 Subject: [PATCH 02/14] add disperse PoC --- .../gno.land/r/demo/disperse/disperse.gno | 43 ++++++++++++++++++- examples/gno.land/r/demo/disperse/errors.gno | 9 ++++ examples/gno.land/r/demo/disperse/gno.mod | 1 + 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 examples/gno.land/r/demo/disperse/errors.gno create mode 100644 examples/gno.land/r/demo/disperse/gno.mod diff --git a/examples/gno.land/r/demo/disperse/disperse.gno b/examples/gno.land/r/demo/disperse/disperse.gno index 59ba3fa219b..20045aebe36 100644 --- a/examples/gno.land/r/demo/disperse/disperse.gno +++ b/examples/gno.land/r/demo/disperse/disperse.gno @@ -2,9 +2,48 @@ package disperse import "std" -func SendNative(addresses []std.Address, values []uint64) { +func SendGNOT(addresses []std.Address, sendValues []int64) { + std.AssertOriginCall() // assert the call was by a user? + sent := std.GetOrigSend() // get GNOT value sent with call + caller := std.GetOrigCaller() // get tx caller - for _, receiver := range addresses { + var totalToSend int64 + for _, val := range sendValues { + totalToSend += val + } + + if sent.AmountOf("ugnot") < totalToSend { // check if user sent enough GNOT// possibly not needed if banker breaks anyway? + panic(ErrNotEnoughGnot) + } + + // Check if args are good + if len(addresses) != len(sendValues) { + panic(ErrNumAddrValMismatch) + } + + // Get address of Disperse realm + pkgaddr := std.GetOrigPkgAddr() + + // Get Banker + banker := std.GetBanker(std.BankerTypeOrigSend) + + for i, val := range sendValues { + send := std.Coins{{"ugnot", val}} + + receiver := addresses[i] + if !receiver.IsValid() { + panic(ErrInvalidAddress) + } + + // Send GNOT from realm to receiver address + banker.SendCoins(pkgaddr, receiver, send) + } + + // Return possible leftover GNOT + leftover := banker.GetCoins(std.GetOrigPkgAddr()).AmountOf("ugnot") + if leftover > 0 { + send := std.Coins{{"ugnot", leftover}} + banker.SendCoins(pkgaddr, caller, send) } } diff --git a/examples/gno.land/r/demo/disperse/errors.gno b/examples/gno.land/r/demo/disperse/errors.gno new file mode 100644 index 00000000000..ce17cce7ad6 --- /dev/null +++ b/examples/gno.land/r/demo/disperse/errors.gno @@ -0,0 +1,9 @@ +package disperse + +import "errors" + +var ( + ErrNotEnoughGnot = errors.New("not enough gnot sent in") + ErrNumAddrValMismatch = errors.New("number of addresses and values to send doesn't match") + ErrInvalidAddress = errors.New("invalid address") +) diff --git a/examples/gno.land/r/demo/disperse/gno.mod b/examples/gno.land/r/demo/disperse/gno.mod new file mode 100644 index 00000000000..06e81884dfa --- /dev/null +++ b/examples/gno.land/r/demo/disperse/gno.mod @@ -0,0 +1 @@ +module gno.land/r/demo/disperse From 405f690f9d08e56ea92e8b2f4823a3f28b3e69c4 Mon Sep 17 00:00:00 2001 From: leohhhn Date: Tue, 5 Dec 2023 15:23:39 +0100 Subject: [PATCH 03/14] GNOT disperse PoC complete --- .../gno.land/r/demo/disperse/disperse.gno | 48 +++++++++++-------- examples/gno.land/r/demo/disperse/errors.gno | 1 + examples/gno.land/r/demo/disperse/util.gno | 37 ++++++++++++++ 3 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 examples/gno.land/r/demo/disperse/util.gno diff --git a/examples/gno.land/r/demo/disperse/disperse.gno b/examples/gno.land/r/demo/disperse/disperse.gno index 20045aebe36..d194afd04de 100644 --- a/examples/gno.land/r/demo/disperse/disperse.gno +++ b/examples/gno.land/r/demo/disperse/disperse.gno @@ -2,41 +2,49 @@ package disperse import "std" -func SendGNOT(addresses []std.Address, sendValues []int64) { - std.AssertOriginCall() // assert the call was by a user? - sent := std.GetOrigSend() // get GNOT value sent with call - caller := std.GetOrigCaller() // get tx caller - - var totalToSend int64 - for _, val := range sendValues { - totalToSend += val +// SendGNOT parses receivers and amounts and sends out GNOT +// Currently sending slices as arguments with `maketx call` is unsupported +func SendGNOT(addresses string, sendAmounts string) { + std.AssertOriginCall() // assert the call was by a user? + coinsSent := std.GetOrigSend() // get GNOT value sent with call + caller := std.GetOrigCaller() // get tx caller + + parsedAddresses, err := parseAddresses(addresses) + if err != nil { + panic(err) } - if sent.AmountOf("ugnot") < totalToSend { // check if user sent enough GNOT// possibly not needed if banker breaks anyway? - panic(ErrNotEnoughGnot) + parsedAmounts, err := parseAmounts(sendAmounts) + if err != nil { + panic(err) } // Check if args are good - if len(addresses) != len(sendValues) { + if len(parsedAddresses) != len(parsedAmounts) { panic(ErrNumAddrValMismatch) } + var totalToSend int64 + for _, val := range parsedAmounts { + totalToSend += val + } + + if coinsSent.AmountOf("ugnot") < totalToSend { // check if user sent enough GNOT// possibly not needed if banker breaks anyway? + panic(ErrNotEnoughGnot) + } + // Get address of Disperse realm - pkgaddr := std.GetOrigPkgAddr() + realmAddr := std.GetOrigPkgAddr() // Get Banker banker := std.GetBanker(std.BankerTypeOrigSend) - for i, val := range sendValues { + for i, val := range parsedAmounts { send := std.Coins{{"ugnot", val}} - - receiver := addresses[i] - if !receiver.IsValid() { - panic(ErrInvalidAddress) - } + receiver := parsedAddresses[i] // Send GNOT from realm to receiver address - banker.SendCoins(pkgaddr, receiver, send) + banker.SendCoins(realmAddr, receiver, send) } // Return possible leftover GNOT @@ -44,6 +52,6 @@ func SendGNOT(addresses []std.Address, sendValues []int64) { if leftover > 0 { send := std.Coins{{"ugnot", leftover}} - banker.SendCoins(pkgaddr, caller, send) + 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 ce17cce7ad6..2908b4f2f55 100644 --- a/examples/gno.land/r/demo/disperse/errors.gno +++ b/examples/gno.land/r/demo/disperse/errors.gno @@ -6,4 +6,5 @@ var ( ErrNotEnoughGnot = errors.New("not enough gnot 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") ) diff --git a/examples/gno.land/r/demo/disperse/util.gno b/examples/gno.land/r/demo/disperse/util.gno new file mode 100644 index 00000000000..9f6614005f4 --- /dev/null +++ b/examples/gno.land/r/demo/disperse/util.gno @@ -0,0 +1,37 @@ +package disperse + +import ( + "std" + "strconv" + "strings" +) + +func parseAddresses(addresses string) ([]std.Address, error) { + var ret []std.Address + + for _, str := range strings.Split(addresses, ",") { + addr := std.Address(str) + if !addr.IsValid() { + return nil, ErrInvalidAddress + } + + ret = append(ret, addr) + } + + return ret, nil +} + +func parseAmounts(amounts string) ([]int64, error) { + var ret []int64 + for _, amt := range strings.Split(amounts, ",") { + amount, _ := strconv.Atoi(amt) + + if amount < 0 { + return nil, ErrNegativeCoinAmount + } + + ret = append(ret, int64(amount)) + } + + return ret, nil +} From b0889c7cc49d087b6ea3d76408a170bd930ffc92 Mon Sep 17 00:00:00 2001 From: leohhhn Date: Tue, 5 Dec 2023 15:41:54 +0100 Subject: [PATCH 04/14] comments, formatting --- examples/gno.land/r/demo/disperse/disperse.gno | 9 ++++++--- examples/gno.land/r/demo/disperse/util.gno | 4 +--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/gno.land/r/demo/disperse/disperse.gno b/examples/gno.land/r/demo/disperse/disperse.gno index d194afd04de..055e1dd375b 100644 --- a/examples/gno.land/r/demo/disperse/disperse.gno +++ b/examples/gno.land/r/demo/disperse/disperse.gno @@ -3,9 +3,10 @@ package disperse import "std" // SendGNOT parses receivers and amounts and sends out GNOT -// Currently sending slices as arguments with `maketx call` is unsupported +// Currently sending slices as arguments with `maketx call` is unsupported, +// which is why we parse strings by delimiter here func SendGNOT(addresses string, sendAmounts string) { - std.AssertOriginCall() // assert the call was by a user? + std.AssertOriginCall() // assert the call was by a user coinsSent := std.GetOrigSend() // get GNOT value sent with call caller := std.GetOrigCaller() // get tx caller @@ -29,7 +30,9 @@ func SendGNOT(addresses string, sendAmounts string) { totalToSend += val } - if coinsSent.AmountOf("ugnot") < totalToSend { // check if user sent enough GNOT// possibly not needed if banker breaks anyway? + // Check if user sent enough GNOT + // FIXME: possibly not needed, added for error clarity + if coinsSent.AmountOf("ugnot") < totalToSend { panic(ErrNotEnoughGnot) } diff --git a/examples/gno.land/r/demo/disperse/util.gno b/examples/gno.land/r/demo/disperse/util.gno index 9f6614005f4..5bded5bc83c 100644 --- a/examples/gno.land/r/demo/disperse/util.gno +++ b/examples/gno.land/r/demo/disperse/util.gno @@ -14,7 +14,6 @@ func parseAddresses(addresses string) ([]std.Address, error) { if !addr.IsValid() { return nil, ErrInvalidAddress } - ret = append(ret, addr) } @@ -23,13 +22,12 @@ func parseAddresses(addresses string) ([]std.Address, error) { func parseAmounts(amounts string) ([]int64, error) { var ret []int64 + for _, amt := range strings.Split(amounts, ",") { amount, _ := strconv.Atoi(amt) - if amount < 0 { return nil, ErrNegativeCoinAmount } - ret = append(ret, int64(amount)) } From 70354ef11a16fcec9b880ee471bf089554c2869b Mon Sep 17 00:00:00 2001 From: leohhhn Date: Sun, 10 Dec 2023 11:22:42 +0100 Subject: [PATCH 05/14] save --- .../gno.land/r/demo/disperse/disperse.gno | 36 ++++++++++-------- .../r/demo/disperse/disperse_test.gno | 38 +++++++++++++++++++ examples/gno.land/r/demo/disperse/errors.gno | 8 ++-- examples/gno.land/r/demo/disperse/util.gno | 4 +- 4 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 examples/gno.land/r/demo/disperse/disperse_test.gno diff --git a/examples/gno.land/r/demo/disperse/disperse.gno b/examples/gno.land/r/demo/disperse/disperse.gno index 055e1dd375b..0894c85c878 100644 --- a/examples/gno.land/r/demo/disperse/disperse.gno +++ b/examples/gno.land/r/demo/disperse/disperse.gno @@ -1,15 +1,26 @@ package disperse -import "std" +import ( + "std" +) // SendGNOT parses receivers and amounts and sends out GNOT // Currently sending slices as arguments with `maketx call` is unsupported, // which is why we parse strings by delimiter here -func SendGNOT(addresses string, sendAmounts string) { +func SendGNOT(addresses, sendAmounts string) { std.AssertOriginCall() // assert the call was by a user coinsSent := std.GetOrigSend() // get GNOT value sent with call caller := std.GetOrigCaller() // get tx caller + // Get address of Disperse realm + realmAddr := std.GetOrigPkgAddr() + + // Get Banker + banker := std.GetBanker(std.BankerTypeOrigSend) + + leftover := banker.GetCoins(realmAddr).AmountOf("ugnot") + println(leftover) + parsedAddresses, err := parseAddresses(addresses) if err != nil { panic(err) @@ -22,7 +33,7 @@ func SendGNOT(addresses string, sendAmounts string) { // Check if args are good if len(parsedAddresses) != len(parsedAmounts) { - panic(ErrNumAddrValMismatch) + panic(errNumAddrValMismatch) } var totalToSend int64 @@ -33,15 +44,9 @@ func SendGNOT(addresses string, sendAmounts string) { // Check if user sent enough GNOT // FIXME: possibly not needed, added for error clarity if coinsSent.AmountOf("ugnot") < totalToSend { - panic(ErrNotEnoughGnot) + panic(errNotEnoughGnot) } - // Get address of Disperse realm - realmAddr := std.GetOrigPkgAddr() - - // Get Banker - banker := std.GetBanker(std.BankerTypeOrigSend) - for i, val := range parsedAmounts { send := std.Coins{{"ugnot", val}} receiver := parsedAddresses[i] @@ -51,10 +56,9 @@ func SendGNOT(addresses string, sendAmounts string) { } // Return possible leftover GNOT - leftover := banker.GetCoins(std.GetOrigPkgAddr()).AmountOf("ugnot") - - if leftover > 0 { - send := std.Coins{{"ugnot", leftover}} - banker.SendCoins(realmAddr, caller, send) - } + // + //if leftover > 0 { + // send := std.Coins{{"ugnot", leftover}} + // banker.SendCoins(realmAddr, caller, send) + //} } diff --git a/examples/gno.land/r/demo/disperse/disperse_test.gno b/examples/gno.land/r/demo/disperse/disperse_test.gno new file mode 100644 index 00000000000..d8e518e5f74 --- /dev/null +++ b/examples/gno.land/r/demo/disperse/disperse_test.gno @@ -0,0 +1,38 @@ +package disperse + +import ( + "std" + "strings" + "testing" +) + +func TestSendCoin(t *testing.T) { + sender := std.Address("g1l9aypkr8xfvs82zeux486ddzec88ty69lue9de") + receiverArr := []string{"g127jydsh6cms3lrtdenydxsckh23a8d6emqcvfa", "g1x8uj9wc3wevvn3glvfallt5e5ercfcs520wy4j"} + amountArr := []string{"100", "150"} + + // Mint test GNOT + alice := testutils.TestAddress("alice") + bob := testutils.TestAddress("bob") + // Set caller to sender + std.TestSetOrigCaller(sender) + + std.TestSetOrigSend(std.Coins{{"ugnot", 250}}, nil) + + // Get readonly banker to check balances + //banker := std.GetBanker(std.BankerTypeReadonly) + + addresses := strings.Join(receiverArr, ",") + amounts := strings.Join(amountArr, ",") + + //balSenderBefore := banker.GetCoins(sender) + SendGNOT(addresses, amounts) + + //balSenderAfter := banker.GetCoins(sender) + // + //println("balSenderBefore:") + //println(balSenderBefore) + //println("balSenderAfter:") + //println(balSenderAfter) + +} diff --git a/examples/gno.land/r/demo/disperse/errors.gno b/examples/gno.land/r/demo/disperse/errors.gno index 2908b4f2f55..075dd632bdb 100644 --- a/examples/gno.land/r/demo/disperse/errors.gno +++ b/examples/gno.land/r/demo/disperse/errors.gno @@ -3,8 +3,8 @@ package disperse import "errors" var ( - ErrNotEnoughGnot = errors.New("not enough gnot 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") + errNotEnoughGnot = errors.New("not enough gnot 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") ) diff --git a/examples/gno.land/r/demo/disperse/util.gno b/examples/gno.land/r/demo/disperse/util.gno index 5bded5bc83c..6ed265890d2 100644 --- a/examples/gno.land/r/demo/disperse/util.gno +++ b/examples/gno.land/r/demo/disperse/util.gno @@ -12,7 +12,7 @@ func parseAddresses(addresses string) ([]std.Address, error) { for _, str := range strings.Split(addresses, ",") { addr := std.Address(str) if !addr.IsValid() { - return nil, ErrInvalidAddress + return nil, errInvalidAddress } ret = append(ret, addr) } @@ -26,7 +26,7 @@ func parseAmounts(amounts string) ([]int64, error) { for _, amt := range strings.Split(amounts, ",") { amount, _ := strconv.Atoi(amt) if amount < 0 { - return nil, ErrNegativeCoinAmount + return nil, errNegativeCoinAmount } ret = append(ret, int64(amount)) } From a5a5324405e8e50b554bf9fa315fbca070b3fcb2 Mon Sep 17 00:00:00 2001 From: leohhhn Date: Tue, 12 Dec 2023 13:23:20 +0100 Subject: [PATCH 06/14] wip add tests --- .../gno.land/r/demo/disperse/disperse.gno | 40 ++++----- .../r/demo/disperse/disperse_test.gno | 81 +++++++++++++++---- examples/gno.land/r/demo/disperse/errors.gno | 2 + 3 files changed, 88 insertions(+), 35 deletions(-) diff --git a/examples/gno.land/r/demo/disperse/disperse.gno b/examples/gno.land/r/demo/disperse/disperse.gno index 0894c85c878..c6d8af988c2 100644 --- a/examples/gno.land/r/demo/disperse/disperse.gno +++ b/examples/gno.land/r/demo/disperse/disperse.gno @@ -4,13 +4,20 @@ import ( "std" ) -// SendGNOT parses receivers and amounts and sends out GNOT +// SendCoin parses receivers and amounts and sends out GNOT // Currently sending slices as arguments with `maketx call` is unsupported, // which is why we parse strings by delimiter here -func SendGNOT(addresses, sendAmounts string) { - std.AssertOriginCall() // assert the call was by a user - coinsSent := std.GetOrigSend() // get GNOT value sent with call - caller := std.GetOrigCaller() // get tx caller +func SendCoin(addresses, sendAmounts string) { + std.AssertOriginCall() // assert the call was by a user + coinSent := std.GetOrigSend() // get Coin value & denom sent with call + caller := std.GetOrigCaller() // get tx caller + + if len(coinSent) != 1 { + panic(errMultipleCoinsSent) + } + + // Extract denom from Coins + denom := coinSent[0].Denom // Get address of Disperse realm realmAddr := std.GetOrigPkgAddr() @@ -18,9 +25,6 @@ func SendGNOT(addresses, sendAmounts string) { // Get Banker banker := std.GetBanker(std.BankerTypeOrigSend) - leftover := banker.GetCoins(realmAddr).AmountOf("ugnot") - println(leftover) - parsedAddresses, err := parseAddresses(addresses) if err != nil { panic(err) @@ -31,7 +35,7 @@ func SendGNOT(addresses, sendAmounts string) { panic(err) } - // Check if args are good + // Check if arg lengths are good if len(parsedAddresses) != len(parsedAmounts) { panic(errNumAddrValMismatch) } @@ -42,23 +46,23 @@ func SendGNOT(addresses, sendAmounts string) { } // Check if user sent enough GNOT - // FIXME: possibly not needed, added for error clarity - if coinsSent.AmountOf("ugnot") < totalToSend { + // Possibly not needed, added for error clarity + if coinSent.AmountOf(denom) < totalToSend { panic(errNotEnoughGnot) } for i, val := range parsedAmounts { - send := std.Coins{{"ugnot", val}} + send := std.Coins{{denom, val}} receiver := parsedAddresses[i] - // Send GNOT from realm to receiver address + // Send coin from realm to receiver address banker.SendCoins(realmAddr, receiver, send) } // Return possible leftover GNOT - // - //if leftover > 0 { - // send := std.Coins{{"ugnot", leftover}} - // banker.SendCoins(realmAddr, caller, send) - //} + 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/disperse_test.gno b/examples/gno.land/r/demo/disperse/disperse_test.gno index d8e518e5f74..c0bb3ae2ea2 100644 --- a/examples/gno.land/r/demo/disperse/disperse_test.gno +++ b/examples/gno.land/r/demo/disperse/disperse_test.gno @@ -1,38 +1,85 @@ package disperse import ( + "gno.land/p/demo/testutils" "std" "strings" "testing" ) func TestSendCoin(t *testing.T) { - sender := std.Address("g1l9aypkr8xfvs82zeux486ddzec88ty69lue9de") - receiverArr := []string{"g127jydsh6cms3lrtdenydxsckh23a8d6emqcvfa", "g1x8uj9wc3wevvn3glvfallt5e5ercfcs520wy4j"} - amountArr := []string{"100", "150"} + //cleanUpRealm() - // Mint test GNOT + // Define test addresses alice := testutils.TestAddress("alice") bob := testutils.TestAddress("bob") - // Set caller to sender - std.TestSetOrigCaller(sender) + charlie := testutils.TestAddress("bob") - std.TestSetOrigSend(std.Coins{{"ugnot", 250}}, nil) + totalSendAmount := std.Coins{{"ugnot", 250}} + // Mint test GNOT + std.TestIssueCoins(alice, totalSendAmount) - // Get readonly banker to check balances - //banker := std.GetBanker(std.BankerTypeReadonly) + // Set tx caller to alice + std.TestSetOrigCaller(alice) + + // Send 250ugnot in total to Disperse realm + std.TestSetOrigSend(totalSendAmount, nil) + + // Format array for SendCoin function + receiverArr := []string{bob.String(), charlie.String()} + + // How many tokens to send to bob & charlie + amountArr := []string{"100", "150"} // TODO parse from & to coins properly addresses := strings.Join(receiverArr, ",") amounts := strings.Join(amountArr, ",") - //balSenderBefore := banker.GetCoins(sender) - SendGNOT(addresses, amounts) + banker := std.GetBanker(std.BankerTypeReadonly) + + // Get Disperse realm address + realmAddr := std.GetOrigPkgAddr() + + // Balance of realm should be zero + if initialRealmBalance := banker.GetCoins(realmAddr).AmountOf("ugnot"); initialRealmBalance != 0 { + t.Fatal(errBalanceNotZero) + } + + // Get all balances before sending + aliceBalBefore := banker.GetCoins(alice).AmountOf("ugnot") + bobBalBefore := banker.GetCoins(bob).AmountOf("ugnot") + charlieBalBefore := banker.GetCoins(charlie).AmountOf("ugnot") + + // Send coin + SendCoin(addresses, amounts) + + // Get all balances after sending + aliceBalAfter := banker.GetCoins(alice).AmountOf("ugnot") + //bobBalAfter := banker.GetCoins(bob).AmountOf("ugnot") + //charlieBalAfter := banker.GetCoins(charlie).AmountOf("ugnot") + + if aliceBalBefore-aliceBalAfter != totalSendAmount.AmountOf("ugnot") { + t.Fatal("alice's balance not correct") + } + + if aliceBalBefore-aliceBalAfter != totalSendAmount.AmountOf("ugnot") { + t.Fatal("alice's balance not correct") + } + +} + +// Remove any existing coin balances for testing purposes +func cleanUpRealm() { + // Get readonly banker to check balances + banker := std.GetBanker(std.BankerTypeRealmSend) + + // Get Disperse realm address + realmAddr := std.GetOrigPkgAddr() + + // Get initial realm balance + initialBalance := banker.GetCoins(realmAddr) - //balSenderAfter := banker.GetCoins(sender) - // - //println("balSenderBefore:") - //println(balSenderBefore) - //println("balSenderAfter:") - //println(balSenderAfter) + // Get random burn address + zeroAddr := testutils.TestAddress("0x0") + banker.SendCoins(realmAddr, zeroAddr, initialBalance) } diff --git a/examples/gno.land/r/demo/disperse/errors.gno b/examples/gno.land/r/demo/disperse/errors.gno index 075dd632bdb..f4388c2a29e 100644 --- a/examples/gno.land/r/demo/disperse/errors.gno +++ b/examples/gno.land/r/demo/disperse/errors.gno @@ -7,4 +7,6 @@ var ( 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") ) From fe220f3579e5f8e2041004dcb7f391eb472ae771 Mon Sep 17 00:00:00 2001 From: leohhhn Date: Thu, 14 Dec 2023 18:41:52 +0100 Subject: [PATCH 07/14] wip tests --- .../r/demo/disperse/disperse_test.gno | 72 ++++++++---------- gno.land/data/keys.db/CURRENT | 1 + gno.land/data/keys.db/CURRENT.bak | 1 + gno.land/data/keys.db/LOCK | 0 gno.land/data/keys.db/LOG | 52 +++++++++++++ gno.land/data/keys.db/MANIFEST-000009 | Bin 0 -> 41 bytes 6 files changed, 87 insertions(+), 39 deletions(-) create mode 100644 gno.land/data/keys.db/CURRENT create mode 100644 gno.land/data/keys.db/CURRENT.bak create mode 100644 gno.land/data/keys.db/LOCK create mode 100644 gno.land/data/keys.db/LOG create mode 100644 gno.land/data/keys.db/MANIFEST-000009 diff --git a/examples/gno.land/r/demo/disperse/disperse_test.gno b/examples/gno.land/r/demo/disperse/disperse_test.gno index c0bb3ae2ea2..a13ff733661 100644 --- a/examples/gno.land/r/demo/disperse/disperse_test.gno +++ b/examples/gno.land/r/demo/disperse/disperse_test.gno @@ -8,7 +8,12 @@ import ( ) func TestSendCoin(t *testing.T) { - //cleanUpRealm() + // Get readonly banker to check balances + bankerTestIssueCoin := std.GetBanker(std.BankerTypeRealmIssue) + //cleanUpRealm(banker) + + // Get Disperse realm address + realmAddr := std.GetOrigPkgAddr() // Define test addresses alice := testutils.TestAddress("alice") @@ -16,6 +21,8 @@ func TestSendCoin(t *testing.T) { charlie := testutils.TestAddress("bob") totalSendAmount := std.Coins{{"ugnot", 250}} + //bankerRealmSend := std.GetBanker(std.BankerTypeRealmSend) + // Mint test GNOT std.TestIssueCoins(alice, totalSendAmount) @@ -23,63 +30,50 @@ func TestSendCoin(t *testing.T) { std.TestSetOrigCaller(alice) // Send 250ugnot in total to Disperse realm - std.TestSetOrigSend(totalSendAmount, nil) + std.TestSetOrigSend(totalSendAmount, nil) // todo add issue for this - // Format array for SendCoin function + //Format array for SendCoin function receiverArr := []string{bob.String(), charlie.String()} + // Get initial realm balance + //initialBalance := bankerRealmSend.GetCoins(realmAddr) + + // Get random burn address + //zeroAddr := testutils.TestAddress("0x0") + + bankerRealmSend.SendCoins(realmAddr, "g1l9aypkr8xfvs82zeux486ddzec88ty69lue9de", initialBalance) + // How many tokens to send to bob & charlie amountArr := []string{"100", "150"} // TODO parse from & to coins properly addresses := strings.Join(receiverArr, ",") amounts := strings.Join(amountArr, ",") - banker := std.GetBanker(std.BankerTypeReadonly) - - // Get Disperse realm address - realmAddr := std.GetOrigPkgAddr() - // Balance of realm should be zero - if initialRealmBalance := banker.GetCoins(realmAddr).AmountOf("ugnot"); initialRealmBalance != 0 { - t.Fatal(errBalanceNotZero) - } + //if initialRealmBalance := banker.GetCoins(realmAddr).AmountOf("ugnot"); initialRealmBalance != 0 { + // t.Fatal(errBalanceNotZero) + //} // Get all balances before sending - aliceBalBefore := banker.GetCoins(alice).AmountOf("ugnot") - bobBalBefore := banker.GetCoins(bob).AmountOf("ugnot") - charlieBalBefore := banker.GetCoins(charlie).AmountOf("ugnot") + //aliceBalBefore := banker.GetCoins(alice).AmountOf("ugnot") + //bobBalBefore := banker.GetCoins(bob).AmountOf("ugnot") + //charlieBalBefore := banker.GetCoins(charlie).AmountOf("ugnot") // Send coin SendCoin(addresses, amounts) // Get all balances after sending - aliceBalAfter := banker.GetCoins(alice).AmountOf("ugnot") + //aliceBalAfter := banker.GetCoins(alice).AmountOf("ugnot") //bobBalAfter := banker.GetCoins(bob).AmountOf("ugnot") //charlieBalAfter := banker.GetCoins(charlie).AmountOf("ugnot") - if aliceBalBefore-aliceBalAfter != totalSendAmount.AmountOf("ugnot") { - t.Fatal("alice's balance not correct") - } - - if aliceBalBefore-aliceBalAfter != totalSendAmount.AmountOf("ugnot") { - t.Fatal("alice's balance not correct") - } - + //if aliceBalBefore-aliceBalAfter != totalSendAmount.AmountOf("ugnot") { + // t.Fatal("alice's balance not correct") + //} } -// Remove any existing coin balances for testing purposes -func cleanUpRealm() { - // Get readonly banker to check balances - banker := std.GetBanker(std.BankerTypeRealmSend) - - // Get Disperse realm address - realmAddr := std.GetOrigPkgAddr() - - // Get initial realm balance - initialBalance := banker.GetCoins(realmAddr) - - // Get random burn address - zeroAddr := testutils.TestAddress("0x0") - - banker.SendCoins(realmAddr, zeroAddr, initialBalance) -} +//// Remove any existing coin balances for testing purposes +//func cleanUpRealm(banker std.BankerTypeRealmSend) { +// +// +//} diff --git a/gno.land/data/keys.db/CURRENT b/gno.land/data/keys.db/CURRENT new file mode 100644 index 00000000000..6ba31a31e7d --- /dev/null +++ b/gno.land/data/keys.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000009 diff --git a/gno.land/data/keys.db/CURRENT.bak b/gno.land/data/keys.db/CURRENT.bak new file mode 100644 index 00000000000..875cf233554 --- /dev/null +++ b/gno.land/data/keys.db/CURRENT.bak @@ -0,0 +1 @@ +MANIFEST-000007 diff --git a/gno.land/data/keys.db/LOCK b/gno.land/data/keys.db/LOCK new file mode 100644 index 00000000000..e69de29bb2d diff --git a/gno.land/data/keys.db/LOG b/gno.land/data/keys.db/LOG new file mode 100644 index 00000000000..d4515eeba13 --- /dev/null +++ b/gno.land/data/keys.db/LOG @@ -0,0 +1,52 @@ +=============== Dec 6, 2023 (CET) =============== +14:33:40.760622 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +14:33:40.768942 db@open opening +14:33:40.769814 version@stat F·[] S·0B[] Sc·[] +14:33:40.775912 db@janitor F·2 G·0 +14:33:40.775949 db@open done T·6.98825ms +14:33:40.776013 db@close closing +14:33:40.776082 db@close done T·65.875µs +=============== Dec 6, 2023 (CET) =============== +14:37:58.429171 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +14:37:58.430096 version@stat F·[] S·0B[] Sc·[] +14:37:58.430110 db@open opening +14:37:58.430146 journal@recovery F·1 +14:37:58.432543 journal@recovery recovering @1 +14:37:58.433021 version@stat F·[] S·0B[] Sc·[] +14:37:58.438919 db@janitor F·2 G·0 +14:37:58.439117 db@open done T·9.001125ms +14:37:58.439514 db@close closing +14:37:58.439563 db@close done T·48.375µs +=============== Dec 6, 2023 (CET) =============== +14:38:17.182927 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +14:38:17.183486 version@stat F·[] S·0B[] Sc·[] +14:38:17.183505 db@open opening +14:38:17.183555 journal@recovery F·1 +14:38:17.184133 journal@recovery recovering @2 +14:38:17.185192 version@stat F·[] S·0B[] Sc·[] +14:38:17.195685 db@janitor F·2 G·0 +14:38:17.195711 db@open done T·12.196083ms +14:38:17.195738 db@close closing +14:38:17.198153 db@close done T·2.414583ms +=============== Dec 6, 2023 (CET) =============== +14:58:23.794004 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +14:58:23.794908 version@stat F·[] S·0B[] Sc·[] +14:58:23.794918 db@open opening +14:58:23.794948 journal@recovery F·1 +14:58:23.795655 journal@recovery recovering @4 +14:58:23.796212 version@stat F·[] S·0B[] Sc·[] +14:58:23.808272 db@janitor F·2 G·0 +14:58:23.808302 db@open done T·13.37775ms +14:58:23.808357 db@close closing +14:58:23.808404 db@close done T·46.208µs +=============== Dec 6, 2023 (CET) =============== +15:01:04.612603 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +15:01:04.613703 version@stat F·[] S·0B[] Sc·[] +15:01:04.613722 db@open opening +15:01:04.613807 journal@recovery F·1 +15:01:04.614355 journal@recovery recovering @6 +15:01:04.615331 version@stat F·[] S·0B[] Sc·[] +15:01:04.624404 db@janitor F·2 G·0 +15:01:04.624440 db@open done T·10.7065ms +15:01:04.624467 db@close closing +15:01:04.624602 db@close done T·135.25µs diff --git a/gno.land/data/keys.db/MANIFEST-000009 b/gno.land/data/keys.db/MANIFEST-000009 new file mode 100644 index 0000000000000000000000000000000000000000..3dd087faafcf675e7e2353d1a64ac454a750fb85 GIT binary patch literal 41 wcmZ1(ru0UMfss)vC$%g!CnZVGsj?)sJhM2}IX|}`u_&=5zle#0nTv%103#a=*8l(j literal 0 HcmV?d00001 From 3637e81b8dd122ac027486b228c7b007e5b3417e Mon Sep 17 00:00:00 2001 From: leohhhn Date: Thu, 14 Dec 2023 18:50:47 +0100 Subject: [PATCH 08/14] remove blocked tests --- .../r/demo/disperse/disperse_test.gno | 79 ------------------- 1 file changed, 79 deletions(-) diff --git a/examples/gno.land/r/demo/disperse/disperse_test.gno b/examples/gno.land/r/demo/disperse/disperse_test.gno index a13ff733661..e69de29bb2d 100644 --- a/examples/gno.land/r/demo/disperse/disperse_test.gno +++ b/examples/gno.land/r/demo/disperse/disperse_test.gno @@ -1,79 +0,0 @@ -package disperse - -import ( - "gno.land/p/demo/testutils" - "std" - "strings" - "testing" -) - -func TestSendCoin(t *testing.T) { - // Get readonly banker to check balances - bankerTestIssueCoin := std.GetBanker(std.BankerTypeRealmIssue) - //cleanUpRealm(banker) - - // Get Disperse realm address - realmAddr := std.GetOrigPkgAddr() - - // Define test addresses - alice := testutils.TestAddress("alice") - bob := testutils.TestAddress("bob") - charlie := testutils.TestAddress("bob") - - totalSendAmount := std.Coins{{"ugnot", 250}} - //bankerRealmSend := std.GetBanker(std.BankerTypeRealmSend) - - // Mint test GNOT - std.TestIssueCoins(alice, totalSendAmount) - - // Set tx caller to alice - std.TestSetOrigCaller(alice) - - // Send 250ugnot in total to Disperse realm - std.TestSetOrigSend(totalSendAmount, nil) // todo add issue for this - - //Format array for SendCoin function - receiverArr := []string{bob.String(), charlie.String()} - - // Get initial realm balance - //initialBalance := bankerRealmSend.GetCoins(realmAddr) - - // Get random burn address - //zeroAddr := testutils.TestAddress("0x0") - - bankerRealmSend.SendCoins(realmAddr, "g1l9aypkr8xfvs82zeux486ddzec88ty69lue9de", initialBalance) - - // How many tokens to send to bob & charlie - amountArr := []string{"100", "150"} // TODO parse from & to coins properly - - addresses := strings.Join(receiverArr, ",") - amounts := strings.Join(amountArr, ",") - - // Balance of realm should be zero - //if initialRealmBalance := banker.GetCoins(realmAddr).AmountOf("ugnot"); initialRealmBalance != 0 { - // t.Fatal(errBalanceNotZero) - //} - - // Get all balances before sending - //aliceBalBefore := banker.GetCoins(alice).AmountOf("ugnot") - //bobBalBefore := banker.GetCoins(bob).AmountOf("ugnot") - //charlieBalBefore := banker.GetCoins(charlie).AmountOf("ugnot") - - // Send coin - SendCoin(addresses, amounts) - - // Get all balances after sending - //aliceBalAfter := banker.GetCoins(alice).AmountOf("ugnot") - //bobBalAfter := banker.GetCoins(bob).AmountOf("ugnot") - //charlieBalAfter := banker.GetCoins(charlie).AmountOf("ugnot") - - //if aliceBalBefore-aliceBalAfter != totalSendAmount.AmountOf("ugnot") { - // t.Fatal("alice's balance not correct") - //} -} - -//// Remove any existing coin balances for testing purposes -//func cleanUpRealm(banker std.BankerTypeRealmSend) { -// -// -//} From 6cb1b0e6df855aa1ce991170defb4949c6bc64f3 Mon Sep 17 00:00:00 2001 From: leohhhn Date: Sun, 24 Dec 2023 17:37:50 +0100 Subject: [PATCH 09/14] generalize to sendcoin --- examples/gno.land/r/demo/disperse/disperse.gno | 10 +++++----- examples/gno.land/r/demo/disperse/disperse_test.gno | 0 examples/gno.land/r/demo/disperse/errors.gno | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 examples/gno.land/r/demo/disperse/disperse_test.gno diff --git a/examples/gno.land/r/demo/disperse/disperse.gno b/examples/gno.land/r/demo/disperse/disperse.gno index c6d8af988c2..6406624effc 100644 --- a/examples/gno.land/r/demo/disperse/disperse.gno +++ b/examples/gno.land/r/demo/disperse/disperse.gno @@ -4,10 +4,10 @@ import ( "std" ) -// SendCoin parses receivers and amounts and sends out GNOT +// 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 SendCoin(addresses, sendAmounts string) { +func SendSingleCoin(addresses, sendAmounts string) { std.AssertOriginCall() // assert the call was by a user coinSent := std.GetOrigSend() // get Coin value & denom sent with call caller := std.GetOrigCaller() // get tx caller @@ -45,10 +45,10 @@ func SendCoin(addresses, sendAmounts string) { totalToSend += val } - // Check if user sent enough GNOT + // Check if user sent enough coin // Possibly not needed, added for error clarity if coinSent.AmountOf(denom) < totalToSend { - panic(errNotEnoughGnot) + panic(errNotEnoughCoin) } for i, val := range parsedAmounts { @@ -59,7 +59,7 @@ func SendCoin(addresses, sendAmounts string) { banker.SendCoins(realmAddr, receiver, send) } - // Return possible leftover GNOT + // Return possible leftover coin leftover := banker.GetCoins(realmAddr).AmountOf(denom) if leftover > 0 { send := std.Coins{{denom, leftover}} diff --git a/examples/gno.land/r/demo/disperse/disperse_test.gno b/examples/gno.land/r/demo/disperse/disperse_test.gno deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/examples/gno.land/r/demo/disperse/errors.gno b/examples/gno.land/r/demo/disperse/errors.gno index f4388c2a29e..29cb11062b3 100644 --- a/examples/gno.land/r/demo/disperse/errors.gno +++ b/examples/gno.land/r/demo/disperse/errors.gno @@ -3,7 +3,7 @@ package disperse import "errors" var ( - errNotEnoughGnot = errors.New("not enough gnot sent in") + 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") From 39aaf1b2f6d03da3f1d0ab4ba304ab5341a43bd5 Mon Sep 17 00:00:00 2001 From: leohhhn Date: Mon, 25 Dec 2023 15:56:11 +0100 Subject: [PATCH 10/14] txtar testing basics --- gno.land/cmd/gnoland/testdata/disperse.txtar | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 gno.land/cmd/gnoland/testdata/disperse.txtar diff --git a/gno.land/cmd/gnoland/testdata/disperse.txtar b/gno.land/cmd/gnoland/testdata/disperse.txtar new file mode 100644 index 00000000000..19ac7d0e3d4 --- /dev/null +++ b/gno.land/cmd/gnoland/testdata/disperse.txtar @@ -0,0 +1,3 @@ +gnoland start + +gnokey maketx call -pkgpath gno.land/r/demo/disperse -home /Users/sasurai/gnokey -send 700ugnot -func SendSingleCoin -args "g1x8uj9wc3wevvn3glvfallt5e5ercfcs520wy4j,g1uvdmvvj76nfgjhfe69n4lwafsu7lh2m8f3ycfp" -args "150,500" -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast newhome From eac2b1030975bbba42554e5b32f44f0a784f87bd Mon Sep 17 00:00:00 2001 From: leohhhn Date: Mon, 5 Feb 2024 18:12:22 +0100 Subject: [PATCH 11/14] remove keys db --- gno.land/data/keys.db/CURRENT | 1 - gno.land/data/keys.db/CURRENT.bak | 1 - gno.land/data/keys.db/LOCK | 0 gno.land/data/keys.db/LOG | 52 -------------------------- gno.land/data/keys.db/MANIFEST-000009 | Bin 41 -> 0 bytes 5 files changed, 54 deletions(-) delete mode 100644 gno.land/data/keys.db/CURRENT delete mode 100644 gno.land/data/keys.db/CURRENT.bak delete mode 100644 gno.land/data/keys.db/LOCK delete mode 100644 gno.land/data/keys.db/LOG delete mode 100644 gno.land/data/keys.db/MANIFEST-000009 diff --git a/gno.land/data/keys.db/CURRENT b/gno.land/data/keys.db/CURRENT deleted file mode 100644 index 6ba31a31e7d..00000000000 --- a/gno.land/data/keys.db/CURRENT +++ /dev/null @@ -1 +0,0 @@ -MANIFEST-000009 diff --git a/gno.land/data/keys.db/CURRENT.bak b/gno.land/data/keys.db/CURRENT.bak deleted file mode 100644 index 875cf233554..00000000000 --- a/gno.land/data/keys.db/CURRENT.bak +++ /dev/null @@ -1 +0,0 @@ -MANIFEST-000007 diff --git a/gno.land/data/keys.db/LOCK b/gno.land/data/keys.db/LOCK deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/gno.land/data/keys.db/LOG b/gno.land/data/keys.db/LOG deleted file mode 100644 index d4515eeba13..00000000000 --- a/gno.land/data/keys.db/LOG +++ /dev/null @@ -1,52 +0,0 @@ -=============== Dec 6, 2023 (CET) =============== -14:33:40.760622 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -14:33:40.768942 db@open opening -14:33:40.769814 version@stat F·[] S·0B[] Sc·[] -14:33:40.775912 db@janitor F·2 G·0 -14:33:40.775949 db@open done T·6.98825ms -14:33:40.776013 db@close closing -14:33:40.776082 db@close done T·65.875µs -=============== Dec 6, 2023 (CET) =============== -14:37:58.429171 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -14:37:58.430096 version@stat F·[] S·0B[] Sc·[] -14:37:58.430110 db@open opening -14:37:58.430146 journal@recovery F·1 -14:37:58.432543 journal@recovery recovering @1 -14:37:58.433021 version@stat F·[] S·0B[] Sc·[] -14:37:58.438919 db@janitor F·2 G·0 -14:37:58.439117 db@open done T·9.001125ms -14:37:58.439514 db@close closing -14:37:58.439563 db@close done T·48.375µs -=============== Dec 6, 2023 (CET) =============== -14:38:17.182927 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -14:38:17.183486 version@stat F·[] S·0B[] Sc·[] -14:38:17.183505 db@open opening -14:38:17.183555 journal@recovery F·1 -14:38:17.184133 journal@recovery recovering @2 -14:38:17.185192 version@stat F·[] S·0B[] Sc·[] -14:38:17.195685 db@janitor F·2 G·0 -14:38:17.195711 db@open done T·12.196083ms -14:38:17.195738 db@close closing -14:38:17.198153 db@close done T·2.414583ms -=============== Dec 6, 2023 (CET) =============== -14:58:23.794004 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -14:58:23.794908 version@stat F·[] S·0B[] Sc·[] -14:58:23.794918 db@open opening -14:58:23.794948 journal@recovery F·1 -14:58:23.795655 journal@recovery recovering @4 -14:58:23.796212 version@stat F·[] S·0B[] Sc·[] -14:58:23.808272 db@janitor F·2 G·0 -14:58:23.808302 db@open done T·13.37775ms -14:58:23.808357 db@close closing -14:58:23.808404 db@close done T·46.208µs -=============== Dec 6, 2023 (CET) =============== -15:01:04.612603 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -15:01:04.613703 version@stat F·[] S·0B[] Sc·[] -15:01:04.613722 db@open opening -15:01:04.613807 journal@recovery F·1 -15:01:04.614355 journal@recovery recovering @6 -15:01:04.615331 version@stat F·[] S·0B[] Sc·[] -15:01:04.624404 db@janitor F·2 G·0 -15:01:04.624440 db@open done T·10.7065ms -15:01:04.624467 db@close closing -15:01:04.624602 db@close done T·135.25µs diff --git a/gno.land/data/keys.db/MANIFEST-000009 b/gno.land/data/keys.db/MANIFEST-000009 deleted file mode 100644 index 3dd087faafcf675e7e2353d1a64ac454a750fb85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41 wcmZ1(ru0UMfss)vC$%g!CnZVGsj?)sJhM2}IX|}`u_&=5zle#0nTv%103#a=*8l(j From 40ba91832f9acc26d2b68e37f7e98d7ad3cc33bf Mon Sep 17 00:00:00 2001 From: leohhhn Date: Mon, 5 Feb 2024 18:18:23 +0100 Subject: [PATCH 12/14] add tests --- gno.land/cmd/gnoland/testdata/disperse.txtar | 27 +++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/gno.land/cmd/gnoland/testdata/disperse.txtar b/gno.land/cmd/gnoland/testdata/disperse.txtar index 19ac7d0e3d4..9732010629c 100644 --- a/gno.land/cmd/gnoland/testdata/disperse.txtar +++ b/gno.land/cmd/gnoland/testdata/disperse.txtar @@ -1,3 +1,28 @@ gnoland start -gnokey maketx call -pkgpath gno.land/r/demo/disperse -home /Users/sasurai/gnokey -send 700ugnot -func SendSingleCoin -args "g1x8uj9wc3wevvn3glvfallt5e5ercfcs520wy4j,g1uvdmvvj76nfgjhfe69n4lwafsu7lh2m8f3ycfp" -args "150,500" -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast newhome +# Query initial balances +# Sender +gnokey query bank/balances/g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 +stdout 'height: 0\ndata: "9999870000000ugnot"' + +# Recipient 1 +gnokey query bank/balances/g1x8uj9wc3wevvn3glvfallt5e5ercfcs520wy4j +stdout 'height: 0\ndata: ""' + +# Recipient 2 +gnokey query bank/balances/g1uvdmvvj76nfgjhfe69n4lwafsu7lh2m8f3ycfp +stdout 'height: 0\ndata: ""' + +# 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 + +# 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"' + + From 9079f54b1c97c224afc5ecdd4d010a1b4951e4f2 Mon Sep 17 00:00:00 2001 From: leohhhn Date: Wed, 7 Feb 2024 14:47:26 +0100 Subject: [PATCH 13/14] wip --- examples/gno.land/r/demo/disperse/disperse.gno | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/gno.land/r/demo/disperse/disperse.gno b/examples/gno.land/r/demo/disperse/disperse.gno index 6406624effc..6e3de9a3606 100644 --- a/examples/gno.land/r/demo/disperse/disperse.gno +++ b/examples/gno.land/r/demo/disperse/disperse.gno @@ -7,12 +7,11 @@ 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, sendAmounts string) { - std.AssertOriginCall() // assert the call was by a user +func SendSingleCoin(addresses string, coins std.Coins) { coinSent := std.GetOrigSend() // get Coin value & denom sent with call - caller := std.GetOrigCaller() // get tx caller + caller := std.GetOrigCaller() // get tx sender - if len(coinSent) != 1 { + if len(coinSent) != 1 && len(coins) != 1 { panic(errMultipleCoinsSent) } @@ -20,7 +19,7 @@ func SendSingleCoin(addresses, sendAmounts string) { denom := coinSent[0].Denom // Get address of Disperse realm - realmAddr := std.GetOrigPkgAddr() + realmAddr := std.CurrentRealm().Addr() // Get Banker banker := std.GetBanker(std.BankerTypeOrigSend) From 724656a29b45d92c40b30640eff4f29945ccc94c Mon Sep 17 00:00:00 2001 From: leohhhn Date: Thu, 22 Feb 2024 12:46:33 +0100 Subject: [PATCH 14/14] 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{} + + +}