@@ -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 > ,
@@ -201,12 +220,12 @@ fn ethereum_call(
201
220
ctx. metrics . cheap_clone ( ) ,
202
221
) ?;
203
222
match result {
204
- Some ( tokens) => Ok ( asc_new ( ctx. heap , tokens. as_slice ( ) , & ctx. gas ) ?) ,
223
+ Some ( tokens) => Ok ( asc_new ( ctx. heap , tokens. as_slice ( ) , & ctx. gas ) . await ?) ,
205
224
None => Ok ( AscPtr :: null ( ) ) ,
206
225
}
207
226
}
208
227
209
- fn eth_get_balance (
228
+ async fn eth_get_balance (
210
229
eth_adapter : & EthereumAdapter ,
211
230
ctx : HostFnCtx < ' _ > ,
212
231
wasm_ptr : u32 ,
@@ -230,7 +249,7 @@ fn eth_get_balance(
230
249
match result {
231
250
Ok ( v) => {
232
251
let bigint = BigInt :: from_unsigned_u256 ( & v) ;
233
- Ok ( asc_new ( ctx. heap , & bigint, & ctx. gas ) ?)
252
+ Ok ( asc_new ( ctx. heap , & bigint, & ctx. gas ) . await ?)
234
253
}
235
254
// Retry on any kind of error
236
255
Err ( EthereumRpcError :: Web3Error ( e) ) => Err ( HostExportError :: PossibleReorg ( e. into ( ) ) ) ,
@@ -240,7 +259,7 @@ fn eth_get_balance(
240
259
}
241
260
}
242
261
243
- fn eth_has_code (
262
+ async fn eth_has_code (
244
263
eth_adapter : & EthereumAdapter ,
245
264
ctx : HostFnCtx < ' _ > ,
246
265
wasm_ptr : u32 ,
@@ -263,7 +282,7 @@ fn eth_has_code(
263
282
. map ( |v| !v. 0 . is_empty ( ) ) ;
264
283
265
284
match result {
266
- Ok ( v) => Ok ( asc_new ( ctx. heap , & AscWrapped { inner : v } , & ctx. gas ) ?) ,
285
+ Ok ( v) => Ok ( asc_new ( ctx. heap , & AscWrapped { inner : v } , & ctx. gas ) . await ?) ,
267
286
// Retry on any kind of error
268
287
Err ( EthereumRpcError :: Web3Error ( e) ) => Err ( HostExportError :: PossibleReorg ( e. into ( ) ) ) ,
269
288
Err ( EthereumRpcError :: Timeout ) => Err ( HostExportError :: PossibleReorg (
0 commit comments