11package gh
2+
3+ import (
4+ "std"
5+
6+ "gno.land/p/demo/avl"
7+ )
8+
29var (
3- addressesToAccount avl.Tree // address -> AccountLink
4- adminAddr std.Address = "g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq"
5- )
6- func LinkAccount(accountID string, address std.Address) {
10+ addressToAccount avl.Tree // address -> Account
11+ guardian std.Address // guardian address
12+ )
13+
14+ func init() {
15+ addressToAccount = avl.Tree{}
16+ setAdminAddress(std.GetOrigCaller())
17+ }
18+
19+ // Todo maybe we should gave multi guardian
20+ func SetGuardian(address std.Address) {
721 assertIsAdmin()
8- account := AccountByID(id string)
22+ guardian = address
23+ }
24+
25+ func LinkAccount(accountID string, address std.Address, signature string) {
26+ verifySignature(accountID+" "+address.String(), signature)
27+
28+ account := AccountByID(accountID)
929 if account == nil {
1030 panic("account not found")
1131 }
12-
13- addressesToAccount .Set(address, account)
32+
33+ addressToAccount .Set(address.String() , account)
1434}
1535
16- func assertIsAdmin() {
17- if std.GetOrigCaller() != adminAddr {
18- panic("restricted area")
36+ func RenderAccount(address std.Address) string {
37+ account, ok := addressToAccount.Get(address.String())
38+ if !ok {
39+ panic("account not found")
40+ }
41+
42+ return account.(*Account).Render()
43+ }
44+
45+ func Render(address string) string {
46+ if address != "" {
47+ return RenderAccount(std.Address(address))
1948 }
20- }
49+ str := "["
50+ addressToAccount.Iterate("", "", func(key string, value interface{}) bool {
51+ account := value.(*Account)
52+ str += account.Render()
53+ str += ","
54+ return false
55+ })
56+ str += "]"
57+
58+ return str
59+ }
60+
61+ func verifySignature(message, signature string) bool {
62+ return true
63+ }
0 commit comments