Skip to content

Commit 5f90ec5

Browse files
committed
change payg-price with exchange price ratio
1 parent a4e5b21 commit 5f90ec5

File tree

3 files changed

+120
-21
lines changed

3 files changed

+120
-21
lines changed

apps/indexer-proxy/proxy/src/graphql.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,23 @@ pub const PROJECT_QUERY: &str =
4040

4141
pub const PAYG_QUERY: &str = "query { getAlivePaygs { id price token expiration overflow } }";
4242

43+
pub fn exchange_rate_query(exchange_rate: &str) -> String {
44+
format!(
45+
r#"
46+
query {{
47+
getAlivePaygs(exchangeRate: "{}") {{
48+
id
49+
price
50+
token
51+
expiration
52+
overflow
53+
}}
54+
}}
55+
"#,
56+
exchange_rate
57+
)
58+
}
59+
4360
pub const CHANNEL_QUERY: &str =
4461
"query { getAliveChannels { id consumer deploymentId agent total spent remote price lastFinal expiredAt } }";
4562

apps/indexer-proxy/proxy/src/payg.rs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ use subql_indexer_utils::{
4040
QueryState, MULTIPLE_RANGE_MAX,
4141
},
4242
request::{graphql_request, GraphQLQuery},
43-
tools::{cid_deployment, deployment_cid},
43+
tools::{cid_deployment, deployment_cid, string_u256},
4444
types::Result,
4545
};
4646

@@ -53,6 +53,7 @@ use crate::metrics::{MetricsNetwork, MetricsQuery};
5353
use crate::p2p::report_conflict;
5454
use crate::project::{get_project, list_projects, Project};
5555
use crate::sentry_log::make_sentry_message;
56+
use crate::server::RawPaygPriceItem;
5657
const CURRENT_VERSION: u8 = 3;
5758

5859
#[derive(Debug)]
@@ -237,6 +238,55 @@ async fn build_project_price(
237238
)))
238239
}
239240

241+
async fn build_exchange_rate_price(
242+
price_item: &RawPaygPriceItem,
243+
expired: i64,
244+
controller: &LocalWallet,
245+
) -> Result<Value> {
246+
// sign the price
247+
let price = price_item.price.clone();
248+
let token = price_item
249+
.token
250+
.parse()
251+
.map_err(|_e| Error::Serialize(1137))?;
252+
253+
// price + price_token + price_expired
254+
let sign = price_sign(string_u256(&price), token, expired, controller).await?;
255+
256+
Ok(json!((
257+
price_item.id.clone(),
258+
price.to_string(),
259+
price_item.expiration.to_string(),
260+
format!("{:?}", token),
261+
expired,
262+
convert_sign_to_string(&sign)
263+
)))
264+
}
265+
266+
pub async fn merket_price_with_exchange_rate_price(
267+
price_list: &Vec<RawPaygPriceItem>,
268+
) -> Result<Value> {
269+
let account = ACCOUNT.read().await;
270+
let indexer = account.indexer.clone();
271+
let controller = account.controller.clone();
272+
let controller_address = account.controller_address();
273+
drop(account);
274+
let mut values = vec![];
275+
let expired = Utc::now().timestamp() + 86400;
276+
for price_item in price_list {
277+
if string_u256(&price_item.price) > U256::zero() && price_item.expiration > 0 {
278+
let v = build_exchange_rate_price(&price_item, expired, &controller).await?;
279+
values.push(v);
280+
}
281+
}
282+
283+
Ok(json!({
284+
"indexer": format!("{:?}", indexer),
285+
"controller": format!("{:?}", controller_address),
286+
"deployments": values,
287+
}))
288+
}
289+
240290
pub async fn merket_price(project_id: Option<String>) -> Result<Value> {
241291
let account = ACCOUNT.read().await;
242292
let indexer = account.indexer.clone();

apps/indexer-proxy/proxy/src/server.rs

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,26 @@
1717
// along with this program. If not, see <https://www.gnu.org/licenses/>.
1818

1919
#![deny(warnings)]
20+
use crate::ai::api_stream;
21+
use crate::auth::{create_jwt, AuthQuery, AuthQueryLimit, Payload};
22+
use crate::cli::COMMAND;
23+
use crate::contracts::check_agreement_and_consumer;
24+
use crate::graphql::{exchange_rate_query, PAYG_QUERY};
25+
use crate::metrics::{get_owner_metrics, MetricsNetwork, MetricsQuery};
26+
use crate::payg::{
27+
extend_channel, fetch_channel_cache, merket_price, merket_price_with_exchange_rate_price,
28+
open_state, pay_channel, query_multiple_state, query_single_state, AuthPayg,
29+
};
30+
use crate::project::get_project;
31+
use crate::sentry_log::make_sentry_message;
32+
use crate::websocket::{connect_to_project_ws, handle_websocket, validate_project, QueryType};
33+
use crate::{
34+
account::{get_indexer, indexer_healthy},
35+
auth::AuthWhitelistQuery,
36+
};
2037
use axum::extract::ws::WebSocket;
2138
use axum::{
22-
extract::{ConnectInfo, Path, WebSocketUpgrade},
39+
extract::{ConnectInfo, Path, Query, WebSocketUpgrade},
2340
http::{
2441
header::{self, HeaderMap, HeaderValue},
2542
Method, Response, StatusCode,
@@ -34,7 +51,10 @@ use base64::{engine::general_purpose, Engine as _};
3451
use ethers::prelude::U256;
3552
use serde::{Deserialize, Serialize};
3653
use serde_json::{json, Value};
37-
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
54+
use std::{
55+
collections::HashMap,
56+
net::{IpAddr, Ipv4Addr, SocketAddr},
57+
};
3858
use subql_indexer_utils::{
3959
eip712::{recover_consumer_token_payload, recover_indexer_token_payload},
4060
error::Error,
@@ -44,23 +64,6 @@ use subql_indexer_utils::{
4464
};
4565
use tower_http::cors::{Any, CorsLayer};
4666

47-
use crate::ai::api_stream;
48-
use crate::auth::{create_jwt, AuthQuery, AuthQueryLimit, Payload};
49-
use crate::cli::COMMAND;
50-
use crate::contracts::check_agreement_and_consumer;
51-
use crate::metrics::{get_owner_metrics, MetricsNetwork, MetricsQuery};
52-
use crate::payg::{
53-
extend_channel, fetch_channel_cache, merket_price, open_state, pay_channel,
54-
query_multiple_state, query_single_state, AuthPayg,
55-
};
56-
use crate::project::get_project;
57-
use crate::sentry_log::make_sentry_message;
58-
use crate::websocket::{connect_to_project_ws, handle_websocket, validate_project, QueryType};
59-
use crate::{
60-
account::{get_indexer, indexer_healthy},
61-
auth::AuthWhitelistQuery,
62-
};
63-
6467
#[derive(Serialize)]
6568
pub struct QueryUri {
6669
/// the url refer to specific project
@@ -413,7 +416,36 @@ async fn query_limit_handler(
413416
})))
414417
}
415418

416-
async fn payg_price() -> Result<Json<Value>, Error> {
419+
#[derive(Serialize, Deserialize, Debug)]
420+
pub struct RawPaygPriceItem {
421+
pub id: String,
422+
pub price: String,
423+
pub token: String,
424+
pub expiration: u64,
425+
pub overflow: u64,
426+
}
427+
428+
// http://localhost/payg-price?exchange_price=19000000000000000000
429+
async fn payg_price(
430+
Query(query_map): Query<HashMap<String, String>>,
431+
) -> Result<Json<Value>, Error> {
432+
let query = if let Some(exchange_price) = query_map.get("exchange_price") {
433+
GraphQLQuery::query(&exchange_rate_query(exchange_price))
434+
} else {
435+
GraphQLQuery::query(PAYG_QUERY)
436+
};
437+
let url = COMMAND.graphql_url();
438+
if let Ok(value) = graphql_request(&url, &query).await {
439+
if let Some(item) = value.pointer("/data/getAlivePaygs") {
440+
let price_items: Vec<RawPaygPriceItem> =
441+
serde_json::from_str(item.to_string().as_str())
442+
.map_err(|_e| Error::Serialize(1120))?;
443+
// warn!("price_items: {:?}", price_items);
444+
let projects = merket_price_with_exchange_rate_price(&price_items).await?;
445+
return Ok(Json(projects));
446+
}
447+
}
448+
417449
let projects = merket_price(None).await?;
418450
Ok(Json(projects))
419451
}

0 commit comments

Comments
 (0)