1
1
package gh
2
+
3
+ import (
4
+ "std"
5
+
6
+ "gno.land/p/demo/avl"
7
+ )
8
+
2
9
var (
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) {
7
21
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)
9
29
if account == nil {
10
30
panic("account not found")
11
31
}
12
-
13
- addressesToAccount .Set(address, account)
32
+
33
+ addressToAccount .Set(address.String() , account)
14
34
}
15
35
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))
19
48
}
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