@@ -6,13 +6,15 @@ import (
6
6
7
7
"github.com/ethereum/go-ethereum/accounts/abi"
8
8
"github.com/ethereum/go-ethereum/common"
9
+ ethcommon "github.com/ethereum/go-ethereum/common"
9
10
"github.com/ethereum/go-ethereum/core/vm"
10
11
11
12
sdk "github.com/cosmos/cosmos-sdk/types"
12
13
13
14
"github.com/xpladev/ethermint/x/evm/statedb"
14
15
15
16
"github.com/xpladev/xpla/precompile/util"
17
+ xplatypes "github.com/xpladev/xpla/types"
16
18
)
17
19
18
20
var _ vm.PrecompiledContract = PrecompiledAuth {}
@@ -64,6 +66,14 @@ func (p PrecompiledAuth) Run(evm *vm.EVM, input []byte) ([]byte, error) {
64
66
switch MethodAuth (abiMethod .Name ) {
65
67
case Account :
66
68
return p .account (ctx , abiMethod , args )
69
+ case ModuleAccountByName :
70
+ return p .moduleAccountByName (ctx , abiMethod , args )
71
+ case Bech32Prefix :
72
+ return p .bech32Prefix (ctx , abiMethod , args )
73
+ case AddressBytesToString :
74
+ return p .addressBytesToString (ctx , abiMethod , args )
75
+ case AddressStringToBytes :
76
+ return p .addressStringToBytes (ctx , abiMethod , args )
67
77
default :
68
78
return nil , errors .New ("method not found" )
69
79
}
@@ -81,9 +91,50 @@ func (p PrecompiledAuth) account(ctx sdk.Context, method *abi.Method, args []int
81
91
account := p .ak .GetAccount (ctx , address )
82
92
strAddress = account .GetAddress ().String ()
83
93
} else {
84
- // should be address type
85
- strAddress = address . String ()
94
+ // cannot query
95
+ strAddress = ""
86
96
}
87
97
88
- return method .Outputs .Pack ([]byte (strAddress ))
98
+ return method .Outputs .Pack (strAddress )
99
+ }
100
+
101
+ func (p PrecompiledAuth ) moduleAccountByName (ctx sdk.Context , method * abi.Method , args []interface {}) ([]byte , error ) {
102
+ moduleName , err := util .GetString (args [0 ])
103
+ if err != nil {
104
+ return nil , err
105
+ }
106
+
107
+ account := p .ak .GetModuleAccount (ctx , moduleName )
108
+ if account == nil {
109
+ return method .Outputs .Pack ("" )
110
+ } else {
111
+ return method .Outputs .Pack (account .GetAddress ().String ())
112
+ }
113
+ }
114
+
115
+ func (p PrecompiledAuth ) bech32Prefix (_ sdk.Context , method * abi.Method , _ []interface {}) ([]byte , error ) {
116
+ return method .Outputs .Pack (xplatypes .Bech32MainPrefix )
117
+ }
118
+
119
+ func (p PrecompiledAuth ) addressBytesToString (_ sdk.Context , method * abi.Method , args []interface {}) ([]byte , error ) {
120
+ address , err := util .GetAccAddress (args [0 ])
121
+ if err != nil {
122
+ return nil , err
123
+ }
124
+
125
+ return method .Outputs .Pack (address .String ())
126
+ }
127
+
128
+ func (p PrecompiledAuth ) addressStringToBytes (_ sdk.Context , method * abi.Method , args []interface {}) ([]byte , error ) {
129
+ stringAddress , err := util .GetString (args [0 ])
130
+ if err != nil {
131
+ return nil , err
132
+ }
133
+
134
+ byteAddress , err := sdk .AccAddressFromBech32 (stringAddress )
135
+ if err != nil {
136
+ return nil , err
137
+ }
138
+
139
+ return method .Outputs .Pack (ethcommon .BytesToAddress (byteAddress .Bytes ()))
89
140
}
0 commit comments