@@ -14,6 +14,7 @@ use graph::data::store::scalar::BigInt;
14
14
use graph:: data:: subgraph:: { API_VERSION_0_0_4 , API_VERSION_0_0_9 } ;
15
15
use graph:: data_source;
16
16
use graph:: data_source:: common:: { ContractCall , MappingABI } ;
17
+ use graph:: futures03:: FutureExt as _;
17
18
use graph:: prelude:: web3:: types:: H160 ;
18
19
use graph:: runtime:: gas:: Gas ;
19
20
use graph:: runtime:: { AscIndexId , IndexForAscTypeId } ;
@@ -95,20 +96,27 @@ impl blockchain::RuntimeAdapter<Chain> for RuntimeAdapter {
95
96
let call_cache = call_cache. clone( ) ;
96
97
let abis = abis. clone( ) ;
97
98
move |ctx, wasm_ptr| {
98
- let eth_adapter =
99
- eth_adapters. call_or_cheapest( Some ( & NodeCapabilities {
100
- archive,
101
- traces: false ,
102
- } ) ) ?;
103
- ethereum_call(
104
- & eth_adapter,
105
- call_cache. clone( ) ,
106
- ctx,
107
- wasm_ptr,
108
- & abis,
109
- eth_call_gas,
110
- )
111
- . map( |ptr| ptr. wasm_ptr( ) )
99
+ let eth_adapters = eth_adapters. cheap_clone( ) ;
100
+ let call_cache = call_cache. cheap_clone( ) ;
101
+ let abis = abis. cheap_clone( ) ;
102
+ async move {
103
+ let eth_adapter =
104
+ eth_adapters. call_or_cheapest( Some ( & NodeCapabilities {
105
+ archive,
106
+ traces: false ,
107
+ } ) ) ?;
108
+ ethereum_call(
109
+ & eth_adapter,
110
+ call_cache. clone( ) ,
111
+ ctx,
112
+ wasm_ptr,
113
+ & abis,
114
+ eth_call_gas,
115
+ )
116
+ . await
117
+ . map( |ptr| ptr. wasm_ptr( ) )
118
+ }
119
+ . boxed( )
112
120
}
113
121
} ) ,
114
122
} ,
@@ -117,26 +125,37 @@ impl blockchain::RuntimeAdapter<Chain> for RuntimeAdapter {
117
125
func: Arc :: new( {
118
126
let eth_adapters = eth_adapters. clone( ) ;
119
127
move |ctx, wasm_ptr| {
120
- let eth_adapter =
121
- eth_adapters. unverified_cheapest_with( & NodeCapabilities {
122
- archive,
123
- traces: false ,
124
- } ) ?;
125
- eth_get_balance( & eth_adapter, ctx, wasm_ptr) . map( |ptr| ptr. wasm_ptr( ) )
128
+ let eth_adapters = eth_adapters. cheap_clone( ) ;
129
+ async move {
130
+ let eth_adapter =
131
+ eth_adapters. unverified_cheapest_with( & NodeCapabilities {
132
+ archive,
133
+ traces: false ,
134
+ } ) ?;
135
+ eth_get_balance( & eth_adapter, ctx, wasm_ptr)
136
+ . await
137
+ . map( |ptr| ptr. wasm_ptr( ) )
138
+ }
139
+ . boxed( )
126
140
}
127
141
} ) ,
128
142
} ,
129
143
HostFn {
130
144
name: "ethereum.hasCode" ,
131
145
func: Arc :: new( {
132
- let eth_adapters = eth_adapters. clone( ) ;
133
146
move |ctx, wasm_ptr| {
134
- let eth_adapter =
135
- eth_adapters. unverified_cheapest_with( & NodeCapabilities {
136
- archive,
137
- traces: false ,
138
- } ) ?;
139
- eth_has_code( & eth_adapter, ctx, wasm_ptr) . map( |ptr| ptr. wasm_ptr( ) )
147
+ let eth_adapters = eth_adapters. cheap_clone( ) ;
148
+ async move {
149
+ let eth_adapter =
150
+ eth_adapters. unverified_cheapest_with( & NodeCapabilities {
151
+ archive,
152
+ traces: false ,
153
+ } ) ?;
154
+ eth_has_code( & eth_adapter, ctx, wasm_ptr)
155
+ . await
156
+ . map( |ptr| ptr. wasm_ptr( ) )
157
+ }
158
+ . boxed( )
140
159
}
141
160
} ) ,
142
161
} ,
@@ -170,10 +189,10 @@ impl blockchain::RuntimeAdapter<Chain> for RuntimeAdapter {
170
189
}
171
190
172
191
/// function ethereum.call(call: SmartContractCall): Array<Token> | null
173
- fn ethereum_call (
192
+ async fn ethereum_call (
174
193
eth_adapter : & EthereumAdapter ,
175
194
call_cache : Arc < dyn EthereumCallCache > ,
176
- ctx : HostFnCtx ,
195
+ ctx : HostFnCtx < ' _ > ,
177
196
wasm_ptr : u32 ,
178
197
abis : & [ Arc < MappingABI > ] ,
179
198
eth_call_gas : Option < u32 > ,
@@ -199,14 +218,15 @@ fn ethereum_call(
199
218
abis,
200
219
eth_call_gas,
201
220
ctx. metrics . cheap_clone ( ) ,
202
- ) ?;
221
+ )
222
+ . await ?;
203
223
match result {
204
- Some ( tokens) => Ok ( asc_new ( ctx. heap , tokens. as_slice ( ) , & ctx. gas ) ?) ,
224
+ Some ( tokens) => Ok ( asc_new ( ctx. heap , tokens. as_slice ( ) , & ctx. gas ) . await ?) ,
205
225
None => Ok ( AscPtr :: null ( ) ) ,
206
226
}
207
227
}
208
228
209
- fn eth_get_balance (
229
+ async fn eth_get_balance (
210
230
eth_adapter : & EthereumAdapter ,
211
231
ctx : HostFnCtx < ' _ > ,
212
232
wasm_ptr : u32 ,
@@ -225,12 +245,14 @@ fn eth_get_balance(
225
245
226
246
let address: H160 = asc_get ( ctx. heap , wasm_ptr. into ( ) , & ctx. gas , 0 ) ?;
227
247
228
- let result = graph:: block_on ( eth_adapter. get_balance ( logger, address, block_ptr. clone ( ) ) ) ;
248
+ let result = eth_adapter
249
+ . get_balance ( logger, address, block_ptr. clone ( ) )
250
+ . await ;
229
251
230
252
match result {
231
253
Ok ( v) => {
232
254
let bigint = BigInt :: from_unsigned_u256 ( & v) ;
233
- Ok ( asc_new ( ctx. heap , & bigint, & ctx. gas ) ?)
255
+ Ok ( asc_new ( ctx. heap , & bigint, & ctx. gas ) . await ?)
234
256
}
235
257
// Retry on any kind of error
236
258
Err ( EthereumRpcError :: Web3Error ( e) ) => Err ( HostExportError :: PossibleReorg ( e. into ( ) ) ) ,
@@ -240,7 +262,7 @@ fn eth_get_balance(
240
262
}
241
263
}
242
264
243
- fn eth_has_code (
265
+ async fn eth_has_code (
244
266
eth_adapter : & EthereumAdapter ,
245
267
ctx : HostFnCtx < ' _ > ,
246
268
wasm_ptr : u32 ,
@@ -259,11 +281,13 @@ fn eth_has_code(
259
281
260
282
let address: H160 = asc_get ( ctx. heap , wasm_ptr. into ( ) , & ctx. gas , 0 ) ?;
261
283
262
- let result = graph:: block_on ( eth_adapter. get_code ( logger, address, block_ptr. clone ( ) ) )
284
+ let result = eth_adapter
285
+ . get_code ( logger, address, block_ptr. clone ( ) )
286
+ . await
263
287
. map ( |v| !v. 0 . is_empty ( ) ) ;
264
288
265
289
match result {
266
- Ok ( v) => Ok ( asc_new ( ctx. heap , & AscWrapped { inner : v } , & ctx. gas ) ?) ,
290
+ Ok ( v) => Ok ( asc_new ( ctx. heap , & AscWrapped { inner : v } , & ctx. gas ) . await ?) ,
267
291
// Retry on any kind of error
268
292
Err ( EthereumRpcError :: Web3Error ( e) ) => Err ( HostExportError :: PossibleReorg ( e. into ( ) ) ) ,
269
293
Err ( EthereumRpcError :: Timeout ) => Err ( HostExportError :: PossibleReorg (
@@ -273,7 +297,7 @@ fn eth_has_code(
273
297
}
274
298
275
299
/// Returns `Ok(None)` if the call was reverted.
276
- fn eth_call (
300
+ async fn eth_call (
277
301
eth_adapter : & EthereumAdapter ,
278
302
call_cache : Arc < dyn EthereumCallCache > ,
279
303
logger : & Logger ,
@@ -331,11 +355,10 @@ fn eth_call(
331
355
// Run Ethereum call in tokio runtime
332
356
let logger1 = logger. clone ( ) ;
333
357
let call_cache = call_cache. clone ( ) ;
334
- let ( result, source) =
335
- match graph:: block_on ( eth_adapter. contract_call ( & logger1, & call, call_cache) ) {
336
- Ok ( ( result, source) ) => ( Ok ( result) , source) ,
337
- Err ( e) => ( Err ( e) , call:: Source :: Rpc ) ,
338
- } ;
358
+ let ( result, source) = match eth_adapter. contract_call ( & logger1, & call, call_cache) . await {
359
+ Ok ( ( result, source) ) => ( Ok ( result) , source) ,
360
+ Err ( e) => ( Err ( e) , call:: Source :: Rpc ) ,
361
+ } ;
339
362
let result = match result {
340
363
Ok ( res) => Ok ( res) ,
341
364
0 commit comments