@@ -14,6 +14,7 @@ use graph::data::store::scalar::BigInt;
1414use graph:: data:: subgraph:: { API_VERSION_0_0_4 , API_VERSION_0_0_9 } ;
1515use graph:: data_source;
1616use graph:: data_source:: common:: { ContractCall , MappingABI } ;
17+ use graph:: futures03:: FutureExt as _;
1718use graph:: prelude:: web3:: types:: H160 ;
1819use graph:: runtime:: gas:: Gas ;
1920use graph:: runtime:: { AscIndexId , IndexForAscTypeId } ;
@@ -95,20 +96,27 @@ impl blockchain::RuntimeAdapter<Chain> for RuntimeAdapter {
9596 let call_cache = call_cache. clone( ) ;
9697 let abis = abis. clone( ) ;
9798 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( )
112120 }
113121 } ) ,
114122 } ,
@@ -117,26 +125,37 @@ impl blockchain::RuntimeAdapter<Chain> for RuntimeAdapter {
117125 func: Arc :: new( {
118126 let eth_adapters = eth_adapters. clone( ) ;
119127 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( )
126140 }
127141 } ) ,
128142 } ,
129143 HostFn {
130144 name: "ethereum.hasCode" ,
131145 func: Arc :: new( {
132- let eth_adapters = eth_adapters. clone( ) ;
133146 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( )
140159 }
141160 } ) ,
142161 } ,
@@ -170,10 +189,10 @@ impl blockchain::RuntimeAdapter<Chain> for RuntimeAdapter {
170189}
171190
172191/// function ethereum.call(call: SmartContractCall): Array<Token> | null
173- fn ethereum_call (
192+ async fn ethereum_call (
174193 eth_adapter : & EthereumAdapter ,
175194 call_cache : Arc < dyn EthereumCallCache > ,
176- ctx : HostFnCtx ,
195+ ctx : HostFnCtx < ' _ > ,
177196 wasm_ptr : u32 ,
178197 abis : & [ Arc < MappingABI > ] ,
179198 eth_call_gas : Option < u32 > ,
@@ -199,14 +218,15 @@ fn ethereum_call(
199218 abis,
200219 eth_call_gas,
201220 ctx. metrics . cheap_clone ( ) ,
202- ) ?;
221+ )
222+ . await ?;
203223 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 ?) ,
205225 None => Ok ( AscPtr :: null ( ) ) ,
206226 }
207227}
208228
209- fn eth_get_balance (
229+ async fn eth_get_balance (
210230 eth_adapter : & EthereumAdapter ,
211231 ctx : HostFnCtx < ' _ > ,
212232 wasm_ptr : u32 ,
@@ -225,12 +245,14 @@ fn eth_get_balance(
225245
226246 let address: H160 = asc_get ( ctx. heap , wasm_ptr. into ( ) , & ctx. gas , 0 ) ?;
227247
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 ;
229251
230252 match result {
231253 Ok ( v) => {
232254 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 ?)
234256 }
235257 // Retry on any kind of error
236258 Err ( EthereumRpcError :: Web3Error ( e) ) => Err ( HostExportError :: PossibleReorg ( e. into ( ) ) ) ,
@@ -240,7 +262,7 @@ fn eth_get_balance(
240262 }
241263}
242264
243- fn eth_has_code (
265+ async fn eth_has_code (
244266 eth_adapter : & EthereumAdapter ,
245267 ctx : HostFnCtx < ' _ > ,
246268 wasm_ptr : u32 ,
@@ -259,11 +281,13 @@ fn eth_has_code(
259281
260282 let address: H160 = asc_get ( ctx. heap , wasm_ptr. into ( ) , & ctx. gas , 0 ) ?;
261283
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
263287 . map ( |v| !v. 0 . is_empty ( ) ) ;
264288
265289 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 ?) ,
267291 // Retry on any kind of error
268292 Err ( EthereumRpcError :: Web3Error ( e) ) => Err ( HostExportError :: PossibleReorg ( e. into ( ) ) ) ,
269293 Err ( EthereumRpcError :: Timeout ) => Err ( HostExportError :: PossibleReorg (
@@ -273,7 +297,7 @@ fn eth_has_code(
273297}
274298
275299/// Returns `Ok(None)` if the call was reverted.
276- fn eth_call (
300+ async fn eth_call (
277301 eth_adapter : & EthereumAdapter ,
278302 call_cache : Arc < dyn EthereumCallCache > ,
279303 logger : & Logger ,
@@ -331,11 +355,10 @@ fn eth_call(
331355 // Run Ethereum call in tokio runtime
332356 let logger1 = logger. clone ( ) ;
333357 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+ } ;
339362 let result = match result {
340363 Ok ( res) => Ok ( res) ,
341364
0 commit comments