1+ use std:: vec;
2+
13use cosmwasm_std:: { Decimal , DepsMut , Env , IbcChannel , Response , Timestamp } ;
24use cw2:: set_contract_version;
35use cw_storage_plus:: Item ;
46use cw_utils:: nonpayable;
5- use sylvia:: types:: { InstantiateCtx , QueryCtx , SudoCtx } ;
7+ use mesh_apis:: ibc:: { encode_request, ibc_query_packet, ArithmeticTwapToNowRequest , CosmosQuery } ;
8+ use osmosis_std:: shim:: Timestamp as OsmosisTimestamp ;
9+ use osmosis_std:: types:: tendermint:: abci:: RequestQuery ;
10+ use sylvia:: types:: { ExecCtx , InstantiateCtx , QueryCtx , SudoCtx } ;
611use sylvia:: { contract, schemars} ;
712
813use mesh_apis:: price_feed_api:: { self , PriceFeedApi , PriceResponse } ;
914
1015use crate :: error:: ContractError ;
11- use crate :: ibc:: { make_ibc_packet, AUTH_ENDPOINT } ;
12- use crate :: msg:: AuthorizedEndpoint ;
16+ use crate :: ibc:: make_ibc_packet;
1317use crate :: state:: TradingPair ;
1418use mesh_price_feed:: { Action , PriceKeeper , Scheduler } ;
1519
1620pub const CONTRACT_NAME : & str = env ! ( "CARGO_PKG_NAME" ) ;
1721pub const CONTRACT_VERSION : & str = env ! ( "CARGO_PKG_VERSION" ) ;
1822
23+ pub const OSMOSIS_QUERY_TWAP_PATH : & str = "/osmosis.twap.v1beta1.Query/ArithmeticTwapToNow" ;
24+
1925pub struct RemotePriceFeedContract {
2026 pub channel : Item < ' static , IbcChannel > ,
2127 pub trading_pair : Item < ' static , TradingPair > ,
@@ -53,7 +59,6 @@ impl RemotePriceFeedContract {
5359 & self ,
5460 mut ctx : InstantiateCtx ,
5561 trading_pair : TradingPair ,
56- auth_endpoint : AuthorizedEndpoint ,
5762 epoch_in_secs : u64 ,
5863 price_info_ttl_in_secs : u64 ,
5964 ) -> Result < Response , ContractError > {
@@ -65,12 +70,15 @@ impl RemotePriceFeedContract {
6570 self . price_keeper
6671 . init ( & mut ctx. deps , price_info_ttl_in_secs) ?;
6772 self . scheduler . init ( & mut ctx. deps , epoch_in_secs) ?;
68-
69- AUTH_ENDPOINT . save ( ctx. deps . storage , & auth_endpoint) ?;
70-
7173 Ok ( Response :: new ( ) )
7274 }
7375
76+ #[ sv:: msg( exec) ]
77+ pub fn request ( & self , ctx : ExecCtx ) -> Result < Response , ContractError > {
78+ let ExecCtx { deps, env, info : _ } = ctx;
79+ query_twap ( deps, & env)
80+ }
81+
7482 pub ( crate ) fn update_twap (
7583 & self ,
7684 deps : DepsMut ,
@@ -116,19 +124,39 @@ pub fn query_twap(deps: DepsMut, env: &Env) -> Result<Response, ContractError> {
116124 . may_load ( deps. storage ) ?
117125 . ok_or ( ContractError :: IbcChannelNotOpen ) ?;
118126
119- let packet = mesh_apis :: ibc :: RemotePriceFeedPacket :: QueryTwap {
127+ let request = ArithmeticTwapToNowRequest {
120128 pool_id,
121129 base_asset,
122130 quote_asset,
131+ start_time : Some ( OsmosisTimestamp {
132+ seconds : env. block . time . seconds ( ) as i64 ,
133+ nanos : 0 ,
134+ } ) ,
135+ } ;
136+ let packet = CosmosQuery {
137+ requests : vec ! [ RequestQuery {
138+ path: OSMOSIS_QUERY_TWAP_PATH . to_string( ) ,
139+ data: encode_request( & request) ,
140+ height: 0 ,
141+ prove: false ,
142+ } ] ,
123143 } ;
124- let msg = make_ibc_packet ( & env. block . time , channel, packet) ?;
144+
145+ let msg = make_ibc_packet ( & env. block . time , channel, ibc_query_packet ( packet) ) ?;
125146
126147 Ok ( Response :: new ( ) . add_message ( msg) )
127148}
128149
129150#[ cfg( test) ]
130151mod tests {
131- use cosmwasm_std:: testing:: { mock_dependencies, mock_env, mock_info} ;
152+ use cosmwasm_std:: {
153+ from_json,
154+ testing:: { mock_dependencies, mock_env, mock_info} ,
155+ Binary ,
156+ } ;
157+ use mesh_apis:: ibc:: {
158+ decode_response, AcknowledgementResult , CosmosResponse , InterchainQueryPacketAck ,
159+ } ;
132160
133161 use super :: * ;
134162
@@ -144,10 +172,6 @@ mod tests {
144172 base_asset : "base" . to_string ( ) ,
145173 quote_asset : "quote" . to_string ( ) ,
146174 } ;
147- let auth_endpoint = AuthorizedEndpoint {
148- connection_id : "connection" . to_string ( ) ,
149- port_id : "port" . to_string ( ) ,
150- } ;
151175
152176 contract
153177 . instantiate (
@@ -157,10 +181,29 @@ mod tests {
157181 info,
158182 } ,
159183 trading_pair,
160- auth_endpoint,
161184 10 ,
162185 50 ,
163186 )
164187 . unwrap ( ) ;
165188 }
189+
190+ #[ test]
191+ fn json_binary ( ) {
192+ let resp = Binary :: from_base64 ( "eyJyZXN1bHQiOiJleUprWVhSaElqb2lRMmhqTmtaUmIxUk5WRUYzVFVSQmQwMUVRWGROUkVGM1RVUkJkMDFFUVhkTlFUMDlJbjA9In0=" ) . unwrap ( ) ;
193+
194+ let ack_result: AcknowledgementResult = from_json ( resp) . unwrap ( ) ;
195+ assert_eq ! (
196+ ack_result. result. to_string( ) ,
197+ String :: from( "eyJkYXRhIjoiQ2hjNkZRb1RNVEF3TURBd01EQXdNREF3TURBd01EQXdNQT09In0=" )
198+ ) ;
199+
200+ let packet_ack: InterchainQueryPacketAck = from_json ( & ack_result. result ) . unwrap ( ) ;
201+ assert_eq ! (
202+ packet_ack. data. to_string( ) ,
203+ String :: from( "Chc6FQoTMTAwMDAwMDAwMDAwMDAwMDAwMA==" )
204+ ) ;
205+
206+ let response: CosmosResponse = decode_response ( & packet_ack. data ) . unwrap ( ) ;
207+ assert_eq ! ( response. responses. len( ) , 1 ) ;
208+ }
166209}
0 commit comments