Skip to content

Commit 2bc0fc6

Browse files
authored
Merge pull request #113 from gnoswap-labs/GSW-627-add-non-register-token
GSW-627 chore: add 2 non register grc20 tokens
2 parents 04a0aeb + 6ec8955 commit 2bc0fc6

File tree

7 files changed

+418
-1
lines changed

7 files changed

+418
-1
lines changed

_setup/fred/fred_test.gno

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package fred
2+
3+
import (
4+
"std"
5+
"testing"
6+
7+
"gno.land/p/demo/testutils"
8+
9+
"gno.land/r/demo/users"
10+
)
11+
12+
var (
13+
a1 = testutils.TestAddress("a1")
14+
a2 = testutils.TestAddress("a2")
15+
a3 = testutils.TestAddress("a3")
16+
a4 = testutils.TestAddress("a4")
17+
)
18+
19+
func init() {
20+
std.TestSetOrigCaller(a1)
21+
Faucet()
22+
}
23+
24+
func TestTransfer(t *testing.T) {
25+
std.TestSetOrigCaller(a1)
26+
Transfer(a2u(a2), 100)
27+
28+
std.TestSetOrigCaller(a2)
29+
Transfer(a2u(a3), 95)
30+
31+
shouldPanicWithMsg(t, func() { Transfer(a2u(a3), 10) }, "insufficient balance")
32+
}
33+
34+
func TestApprove(t *testing.T) {
35+
std.TestSetOrigCaller(std.Address(""))
36+
shouldPanicWithMsg(t, func() { Approve(a2u(a2), 1000) }, "invalid address")
37+
38+
std.TestSetOrigCaller(a1)
39+
shouldPanicWithMsg(t, func() { Approve(a2u(std.Address("")), 1000) }, "invalid address")
40+
}
41+
42+
func TestTransferFrom(t *testing.T) {
43+
std.TestSetOrigCaller(a1)
44+
Approve(a2u(a2), 1000)
45+
46+
std.TestSetOrigCaller(a2)
47+
TransferFrom(a2u(a1), a2u(a3), 100)
48+
49+
// not enough allowance
50+
shouldPanicWithMsg(t, func() { TransferFrom(a2u(a1), a2u(a3), 901) }, "insufficient allowance")
51+
52+
// didn't approve
53+
std.TestSetOrigCaller(a3)
54+
shouldPanicWithMsg(t, func() { TransferFrom(a2u(a1), a2u(a4), 100) }, "insufficient allowance")
55+
56+
}
57+
58+
func a2u(addr std.Address) users.AddressOrName {
59+
return users.AddressOrName(addr)
60+
}
61+
62+
func shouldPanicWithMsg(t *testing.T, f func(), msg string) {
63+
defer func() {
64+
if r := recover(); r == nil {
65+
t.Errorf("The code did not panic")
66+
} else {
67+
if r != msg {
68+
t.Errorf("excepted panic(%v), got(%v)", msg, r)
69+
}
70+
}
71+
}()
72+
f()
73+
}

_setup/fred/gno.mod

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module gno.land/r/fred

_setup/fred/thud.gno

+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package fred
2+
3+
import (
4+
"std"
5+
"strings"
6+
7+
"gno.land/p/demo/grc/grc20"
8+
"gno.land/p/demo/ufmt"
9+
"gno.land/r/demo/users"
10+
)
11+
12+
var (
13+
fred *grc20.AdminToken
14+
admin std.Address = "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5" // TODO: helper to change admin
15+
)
16+
17+
func init() {
18+
fred = grc20.NewAdminToken("Fred", "FRED", 4)
19+
fred.Mint(admin, 1000000*10000) // @administrator (1M)
20+
}
21+
22+
// method proxies as public functions.
23+
//
24+
25+
// getters.
26+
func GetGRC20() *grc20.AdminToken {
27+
return fred
28+
}
29+
30+
func TotalSupply() uint64 {
31+
return fred.TotalSupply()
32+
}
33+
34+
func BalanceOf(owner users.AddressOrName) uint64 {
35+
balance, err := fred.BalanceOf(owner.Resolve())
36+
if err != nil {
37+
panic(err)
38+
}
39+
return balance
40+
}
41+
42+
func Allowance(owner, spender users.AddressOrName) uint64 {
43+
allowance, err := fred.Allowance(owner.Resolve(), spender.Resolve())
44+
if err != nil {
45+
panic(err)
46+
}
47+
return allowance
48+
}
49+
50+
// setters.
51+
52+
func Transfer(to users.AddressOrName, amount uint64) {
53+
caller := std.PrevRealm().Addr()
54+
err := fred.Transfer(caller, to.Resolve(), amount)
55+
if err != nil {
56+
panic(err.Error())
57+
}
58+
}
59+
60+
func Approve(spender users.AddressOrName, amount uint64) {
61+
caller := std.PrevRealm().Addr()
62+
err := fred.Approve(caller, spender.Resolve(), amount)
63+
if err != nil {
64+
panic(err.Error())
65+
}
66+
}
67+
68+
func TransferFrom(from, to users.AddressOrName, amount uint64) {
69+
caller := std.PrevRealm().Addr()
70+
err := fred.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)
71+
if err != nil {
72+
panic(err.Error())
73+
}
74+
}
75+
76+
// faucet.
77+
78+
func Faucet() {
79+
// FIXME: add limits?
80+
// FIXME: add payment in gnot?
81+
caller := std.PrevRealm().Addr()
82+
fred.Mint(caller, 1000*10000) // 1k
83+
}
84+
85+
func FaucetL() {
86+
// FIXME: add limits?
87+
// FIXME: add payment in gnot?
88+
caller := std.PrevRealm().Addr()
89+
fred.Mint(caller, 50000000000000) // 50_000_000_000
90+
}
91+
92+
// administration.
93+
94+
func Mint(address users.AddressOrName, amount uint64) {
95+
caller := std.PrevRealm().Addr()
96+
assertIsAdmin(caller)
97+
fred.Mint(address.Resolve(), amount)
98+
}
99+
100+
func Burn(address users.AddressOrName, amount uint64) {
101+
caller := std.PrevRealm().Addr()
102+
assertIsAdmin(caller)
103+
fred.Burn(address.Resolve(), amount)
104+
}
105+
106+
// render.
107+
//
108+
109+
func Render(path string) string {
110+
parts := strings.Split(path, "/")
111+
c := len(parts)
112+
113+
switch {
114+
case path == "":
115+
return fred.RenderHome()
116+
case c == 2 && parts[0] == "balance":
117+
owner := users.AddressOrName(parts[1])
118+
balance, _ := fred.BalanceOf(owner.Resolve())
119+
return ufmt.Sprintf("%d\n", balance)
120+
default:
121+
return "404\n"
122+
}
123+
}
124+
125+
func assertIsAdmin(address std.Address) {
126+
if address != admin {
127+
panic("restricted access")
128+
}
129+
}

_setup/thud/gno.mod

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module gno.land/r/thud

_setup/thud/thud.gno

+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package thud
2+
3+
import (
4+
"std"
5+
"strings"
6+
7+
"gno.land/p/demo/grc/grc20"
8+
"gno.land/p/demo/ufmt"
9+
"gno.land/r/demo/users"
10+
)
11+
12+
var (
13+
thud *grc20.AdminToken
14+
admin std.Address = "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5" // TODO: helper to change admin
15+
)
16+
17+
func init() {
18+
thud = grc20.NewAdminToken("Thud", "THUD", 4)
19+
thud.Mint(admin, 1000000*10000) // @administrator (1M)
20+
}
21+
22+
// method proxies as public functions.
23+
//
24+
25+
// getters.
26+
func GetGRC20() *grc20.AdminToken {
27+
return thud
28+
}
29+
30+
func TotalSupply() uint64 {
31+
return thud.TotalSupply()
32+
}
33+
34+
func BalanceOf(owner users.AddressOrName) uint64 {
35+
balance, err := thud.BalanceOf(owner.Resolve())
36+
if err != nil {
37+
panic(err)
38+
}
39+
return balance
40+
}
41+
42+
func Allowance(owner, spender users.AddressOrName) uint64 {
43+
allowance, err := thud.Allowance(owner.Resolve(), spender.Resolve())
44+
if err != nil {
45+
panic(err)
46+
}
47+
return allowance
48+
}
49+
50+
// setters.
51+
52+
func Transfer(to users.AddressOrName, amount uint64) {
53+
caller := std.PrevRealm().Addr()
54+
err := thud.Transfer(caller, to.Resolve(), amount)
55+
if err != nil {
56+
panic(err.Error())
57+
}
58+
}
59+
60+
func Approve(spender users.AddressOrName, amount uint64) {
61+
caller := std.PrevRealm().Addr()
62+
err := thud.Approve(caller, spender.Resolve(), amount)
63+
if err != nil {
64+
panic(err.Error())
65+
}
66+
}
67+
68+
func TransferFrom(from, to users.AddressOrName, amount uint64) {
69+
caller := std.PrevRealm().Addr()
70+
err := thud.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)
71+
if err != nil {
72+
panic(err.Error())
73+
}
74+
}
75+
76+
// faucet.
77+
78+
func Faucet() {
79+
// FIXME: add limits?
80+
// FIXME: add payment in gnot?
81+
caller := std.PrevRealm().Addr()
82+
thud.Mint(caller, 1000*10000) // 1k
83+
}
84+
85+
func FaucetL() {
86+
// FIXME: add limits?
87+
// FIXME: add payment in gnot?
88+
caller := std.PrevRealm().Addr()
89+
thud.Mint(caller, 50000000000000) // 50_000_000_000
90+
}
91+
92+
// administration.
93+
94+
func Mint(address users.AddressOrName, amount uint64) {
95+
caller := std.PrevRealm().Addr()
96+
assertIsAdmin(caller)
97+
thud.Mint(address.Resolve(), amount)
98+
}
99+
100+
func Burn(address users.AddressOrName, amount uint64) {
101+
caller := std.PrevRealm().Addr()
102+
assertIsAdmin(caller)
103+
thud.Burn(address.Resolve(), amount)
104+
}
105+
106+
// render.
107+
//
108+
109+
func Render(path string) string {
110+
parts := strings.Split(path, "/")
111+
c := len(parts)
112+
113+
switch {
114+
case path == "":
115+
return thud.RenderHome()
116+
case c == 2 && parts[0] == "balance":
117+
owner := users.AddressOrName(parts[1])
118+
balance, _ := thud.BalanceOf(owner.Resolve())
119+
return ufmt.Sprintf("%d\n", balance)
120+
default:
121+
return "404\n"
122+
}
123+
}
124+
125+
func assertIsAdmin(address std.Address) {
126+
if address != admin {
127+
panic("restricted access")
128+
}
129+
}

0 commit comments

Comments
 (0)