From 5a0ff553350fb1a6d1c997629a4be87e64f40278 Mon Sep 17 00:00:00 2001 From: Manfred Touron <94029+moul@users.noreply.github.com> Date: Thu, 7 Dec 2023 11:20:48 +0100 Subject: [PATCH] chore: add contract-contract interation with ownership example (#1262) Addresses https://github.com/gnoswap-labs/gno/issues/7#issuecomment-1763883237 CI is red -> related/depends on #1241, #1249 (cc @gfanton). ```console $ go test -v . -run TestTestdata/grc20-registry === RUN TestTestdata === RUN TestTestdata/grc20-registry === PAUSE TestTestdata/grc20-registry === CONT TestTestdata/grc20-registry transfer from=g1sqt92sa06ugh8nlt98kyghw83qy84paf4csyh6 to=g123456789 some-amount testscript.go:534: WORK=$WORK PATH=/nix/store/xl220d87dlnq05kiz1pjqa9snhlvr1rs-go-1.20.8/share/go/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/moul/bin:/Users/moul/.nix-profile/bin:/etc/profiles/per-user/moul/bin:/run/current-system/sw/bin:/nix/var/nix/profiles/default/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin:/Users/moul/.local/bin:/Users/moul/.local/share/node_modules/bin:/Users/moul/go/bin:/Users/moul/.local/share/rust/cargo/bin:/Users/moul/.local/share/rust/rustup/bin:/Users/moul/.config/zsh/plugins/p10k-config GOTRACEBACK=system HOME=/no-home TMPDIR=$WORK/.tmp devnull=/dev/null /=/ :=: $=$ GOCOVERDIR= exe= USER_SEED_test1=source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast USER_ADDR_test1=g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 GNOROOT=/Users/moul/go/src/github.com/gnolang/gno GNOHOME=/var/folders/22/d9yt75bd2wv9sl3dm_lx85x80000gn/T/TestTestdata1289631443/001/gno # test for add package ## start a new node (1.390s) > gnoland start [stdout] node started successfully # add registry (0.466s) > gnokey maketx addpkg -pkgdir $WORK/registry -pkgpath gno.land/r/registry -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 [stdout] OK! GAS WANTED: 2000000 GAS USED: 274024 [stderr] Enter password. # we call Transfer with foo20, before it's registered (0.454s) > gnokey maketx call -pkgpath gno.land/r/registry -func TransferByName -args 'foo20' -args 'g123456789' -args '42' -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 [stdout] ("not found" string) OK! GAS WANTED: 2000000 GAS USED: 73759 [stderr] Enter password. > stdout 'not found' # add foo20, and foo20wrapper (0.936s) > gnokey maketx addpkg -pkgdir $WORK/foo20 -pkgpath gno.land/r/foo20 -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 [stdout] OK! GAS WANTED: 2000000 GAS USED: 196098 [stderr] Enter password. > gnokey maketx addpkg -pkgdir $WORK/foo20wrapper -pkgpath gno.land/r/foo20wrapper -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 [stdout] OK! GAS WANTED: 2000000 GAS USED: 276276 [stderr] Enter password. # we call Transfer with foo20, after it's registered (0.464s) > gnokey maketx call -pkgpath gno.land/r/registry -func TransferByName -args 'foo20' -args 'g123456789' -args '42' -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 [stdout] ("same address, success!" string) OK! GAS WANTED: 2000000 GAS USED: 132948 [stderr] Enter password. > stdout 'same address, success!' PASS --- PASS: TestTestdata (0.01s) --- PASS: TestTestdata/grc20-registry (4.09s) PASS ok github.com/gnolang/gno/gno.land/cmd/gnoland (cached) ``` --------- Signed-off-by: moul <94029+moul@users.noreply.github.com> Co-authored-by: Guilhem Fanton <8671905+gfanton@users.noreply.github.com> Co-authored-by: Hariom Verma --- .../cmd/gnoland/testdata/grc20-registry.txtar | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 gno.land/cmd/gnoland/testdata/grc20-registry.txtar diff --git a/gno.land/cmd/gnoland/testdata/grc20-registry.txtar b/gno.land/cmd/gnoland/testdata/grc20-registry.txtar new file mode 100644 index 00000000000..224125deb30 --- /dev/null +++ b/gno.land/cmd/gnoland/testdata/grc20-registry.txtar @@ -0,0 +1,64 @@ +# example for contract-contract interation with ownership + +## start a new node +gnoland start + +# add registry +gnokey maketx addpkg -pkgdir $WORK/registry -pkgpath gno.land/r/registry -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 + +# we call Transfer with foo20, before it's registered +gnokey maketx call -pkgpath gno.land/r/registry -func TransferByName -args 'foo20' -args 'g123456789' -args '42' -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 +stdout 'not found' + +# add foo20, and foo20wrapper +gnokey maketx addpkg -pkgdir $WORK/foo20 -pkgpath gno.land/r/foo20 -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 +gnokey maketx addpkg -pkgdir $WORK/foo20wrapper -pkgpath gno.land/r/foo20wrapper -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 + +# we call Transfer with foo20, after it's registered +gnokey maketx call -pkgpath gno.land/r/registry -func TransferByName -args 'foo20' -args 'g123456789' -args '42' -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 +stdout 'same address, success!' + +-- registry/registry.gno -- +package registry + +import "std" + +type transferCb func(to std.Address, amount uint64) string +type pair struct { + name string + cb transferCb +} +var registry = []pair{} +func Register(name string, cb transferCb) { registry = append(registry, pair{name: name, cb: cb}) } +func TransferByName(name string, to string, amount uint64) string { + for _, pair := range registry { + if pair.name != name { + continue + } + if std.CurrentRealm().Addr().String() != pair.cb(std.Address(to), amount) { + return "invalid address, ownership issue :(" + } + return "same address, success!" + } + return "not found" +} + +-- foo20wrapper/foo20wrapper.gno -- +package foo20wrapper + +import "gno.land/r/registry" +import "gno.land/r/foo20" + +func init() { + registry.Register("foo20", foo20.Transfer) +} + +-- foo20/foo20.gno -- +package foo20 + +import "std" + +func Transfer(to std.Address, amount uint64) string { + println("transfer from=" + std.PrevRealm().Addr().String() + " to=" + to.String() + " some-amount") + return std.PrevRealm().Addr().String() +}