@@ -121,7 +121,7 @@ func (api *localShardApi) CallGetter(
121
121
ctx context.Context ,
122
122
address types.Address ,
123
123
calldata []byte ,
124
- ) ([]byte , error ){
124
+ ) ([]byte , error ) {
125
125
tx , err := api .db .CreateRoTx (ctx )
126
126
if err != nil {
127
127
return nil , err
@@ -148,10 +148,10 @@ func (api *localShardApi) CallGetter(
148
148
}
149
149
150
150
extTxn := & types.ExternalTransaction {
151
- FeeCredit : types .GasToValue (types .DefaultMaxGasInBlock .Uint64 ()),
151
+ FeeCredit : types .GasToValue (types .DefaultMaxGasInBlock .Uint64 ()),
152
152
MaxFeePerGas : types .MaxFeePerGasDefault ,
153
- To : address ,
154
- Data : calldata ,
153
+ To : address ,
154
+ Data : calldata ,
155
155
}
156
156
157
157
txn := extTxn .ToTransaction ()
@@ -170,6 +170,90 @@ func (api *localShardApi) GetTokens1(
170
170
ctx context.Context ,
171
171
address types.Address ,
172
172
blockReference rawapitypes.BlockReference ,
173
+ ) (map [types.TokenId ]types.Value , error ) {
174
+ abi , err := contracts .GetAbi (contracts .NameTokenManager )
175
+ if err != nil {
176
+ return nil , fmt .Errorf ("cannot get ABI: %w" , err )
177
+ }
178
+
179
+ calldata , err := abi .Pack ("getTokens" , address )
180
+ if err != nil {
181
+ return nil , fmt .Errorf ("cannot pack calldata: %w" , err )
182
+ }
183
+
184
+ tokenManagerAddr := types .ShardAndHexToAddress (address .ShardId (), types .TokenManagerPureAddress )
185
+
186
+ ret , err := api .CallGetter (ctx , tokenManagerAddr , calldata )
187
+ if err != nil {
188
+ return nil , fmt .Errorf ("failed to call getter: %w" , err )
189
+ }
190
+
191
+ var tokens []token
192
+ err = abi .UnpackIntoInterface (& tokens , "getTokens" , ret )
193
+ if err != nil {
194
+ return nil , fmt .Errorf ("failed to unpack response: %w" , err )
195
+ }
196
+
197
+ res := make (map [types.TokenId ]types.Value )
198
+ for t := range tokens {
199
+ res [types .TokenId (tokens [t ].Token )] = types .NewValueFromBigMust (tokens [t ].Balance )
200
+ }
201
+ return res , nil
202
+ }
203
+
204
+ func (api * LocalShardApi ) CallGetter (
205
+ ctx context.Context ,
206
+ address types.Address ,
207
+ calldata []byte ,
208
+ ) ([]byte , error ) {
209
+ tx , err := api .db .CreateRoTx (ctx )
210
+ if err != nil {
211
+ return nil , err
212
+ }
213
+ defer tx .Rollback ()
214
+
215
+ block , _ , err := db .ReadLastBlock (tx , address .ShardId ())
216
+ if err != nil {
217
+ return nil , fmt .Errorf ("failed to read last block: %w" , err )
218
+ }
219
+
220
+ cfgAccessor , err := config .NewConfigReader (tx , & block .MainShardHash )
221
+ if err != nil {
222
+ return nil , fmt .Errorf ("failed to create config accessor: %w" , err )
223
+ }
224
+
225
+ es , err := execution .NewExecutionState (tx , address .ShardId (), execution.StateParams {
226
+ Block : block ,
227
+ ConfigAccessor : cfgAccessor ,
228
+ Mode : execution .ModeReadOnly ,
229
+ })
230
+ if err != nil {
231
+ return nil , err
232
+ }
233
+
234
+ extTxn := & types.ExternalTransaction {
235
+ FeeCredit : types .GasToValue (types .DefaultMaxGasInBlock .Uint64 ()),
236
+ MaxFeePerGas : types .MaxFeePerGasDefault ,
237
+ To : address ,
238
+ Data : calldata ,
239
+ }
240
+
241
+ txn := extTxn .ToTransaction ()
242
+
243
+ payer := execution .NewDummyPayer ()
244
+
245
+ es .AddInTransaction (txn )
246
+ res := es .HandleTransaction (ctx , txn , payer )
247
+ if res .Failed () {
248
+ return nil , fmt .Errorf ("transaction failed: %w" , res .GetError ())
249
+ }
250
+ return res .ReturnData , nil
251
+ }
252
+
253
+ func (api * LocalShardApi ) GetTokens1 (
254
+ ctx context.Context ,
255
+ address types.Address ,
256
+ blockReference rawapitypes.BlockReference ,
173
257
) (map [types.TokenId ]types.Value , error ) {
174
258
shardId := address .ShardId ()
175
259
if shardId != api .shardId () {
0 commit comments