Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
b0e0383
allow fillers to sumbmit pair price using membership and non membersh…
dharjeezy Mar 11, 2026
fad61b6
vec
dharjeezy Mar 11, 2026
c8257eb
Merge branch 'main' of github.com:polytope-labs/hyperbridge into dami…
dharjeezy Mar 12, 2026
004dd9c
dual-path price submission system for verified prices and unverified …
dharjeezy Mar 12, 2026
cb2c312
TreasuryAccount in config
dharjeezy Mar 12, 2026
9d13e85
fmt
dharjeezy Mar 12, 2026
6e47e72
introduce price range input, include docs
dharjeezy Mar 13, 2026
6b7dcc1
cross-chain filler verification by inspecting RedeemEscrow messages …
dharjeezy Mar 13, 2026
00d16dd
fully reserve deposit price submission
dharjeezy Mar 16, 2026
4fd12d4
simplex integration for price update
dharjeezy Mar 16, 2026
fb824aa
address concerns
dharjeezy Mar 16, 2026
789d109
tested out implementation
dharjeezy Mar 17, 2026
dae9ad7
update to doc
dharjeezy Mar 17, 2026
d925949
block price submissions when a withdrawal is in progress, use H256 fo…
dharjeezy Mar 17, 2026
9307348
Merge main: resolve conflicts in FX strategy and simplex config
dharjeezy Mar 17, 2026
561ad9d
remove service
dharjeezy Mar 17, 2026
ffc5a1e
use price policy to get points
dharjeezy Mar 17, 2026
f9cbd1d
clear stale prices per pair, compute pair ids automatically, submit a…
dharjeezy Mar 18, 2026
6762e78
simplify pair IDs to keccak256("base/quote"), replace timestamp with …
dharjeezy Mar 18, 2026
ef25136
benchmarks, simplified price entries
dharjeezy Mar 18, 2026
a73292f
configurable stablecoin addresses, update simtest, and add per-entry …
dharjeezy Mar 19, 2026
dcfb1c1
update docs
dharjeezy Mar 19, 2026
790e716
getQuotes method
dharjeezy Mar 20, 2026
37d57f3
Merge branches 'dami/filler-price-pair-update' and 'main' of github.c…
dharjeezy Mar 20, 2026
51bc01d
refacoring
dharjeezy Mar 20, 2026
46c3574
introduce side to differentiate prices for asks and bids,
dharjeezy Mar 20, 2026
93e5fe6
interpolate
dharjeezy Mar 20, 2026
03dff76
revert side
dharjeezy Mar 20, 2026
8a3f9cd
register pair via reserve deposits
dharjeezy Mar 23, 2026
b243ee4
Merge branch 'main' of github.com:polytope-labs/hyperbridge into dami…
dharjeezy Mar 24, 2026
80d0398
fee based submission
dharjeezy Mar 24, 2026
231c1f2
filter 24 hours prices
dharjeezy Mar 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions modules/pallets/intents-coprocessor/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ anyhow = { workspace = true }
alloy-primitives = { workspace = true }
alloy-sol-macro = { workspace = true }
alloy-sol-types = { workspace = true }
hex-literal = { workspace = true }

crypto-utils = { workspace = true }
ismp = { workspace = true }
pallet-ismp = { workspace = true }

Expand All @@ -49,6 +51,7 @@ std = [
"scale-info/std",
"anyhow/std",
"alloy-primitives/std",
"crypto-utils/std",
"sp-io/std",
"pallet-ismp/std",
]
Expand Down
1 change: 1 addition & 0 deletions modules/pallets/intents-coprocessor/rpc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ log = { workspace = true, default-features = true }
tokio = { workspace = true, features = ["sync", "time"] }
futures = { workspace = true }
hex = { workspace = true, default-features = true }
primitive-types = { workspace = true, default-features = true }
pallet-intents-coprocessor = { workspace = true, default-features = true }

[dependencies.polkadot-sdk]
Expand Down
70 changes: 70 additions & 0 deletions modules/pallets/intents-coprocessor/rpc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,27 @@ pub struct RpcBidInfo {
pub user_op: Vec<u8>,
}

/// A single price entry returned by the RPC
#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
pub struct RpcPriceEntry {
/// The submitter's encoded account
#[serde(with = "hex_bytes")]
pub submitter: Vec<u8>,
/// The submitted price as a hex-encoded U256
pub price: String,
/// Timestamp of submission (seconds)
pub timestamp: u64,
}

/// Response for the `intents_getPairPrices` RPC method
#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
pub struct RpcPairPrices {
/// High confidence prices (from verified fillers with proofs)
pub verified: Vec<RpcPriceEntry>,
/// Low confidence prices (from unverified submitters)
pub unverified: Vec<RpcPriceEntry>,
}

impl Ord for RpcBidInfo {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.filler.cmp(&other.filler)
Expand Down Expand Up @@ -158,6 +179,17 @@ fn runtime_error_into_rpc_error(e: impl std::fmt::Display) -> ErrorObjectOwned {
ErrorObject::owned(9877, format!("{e}"), None::<String>)
}

/// Construct the full storage key for a `StorageMap` entry with `Blake2_128Concat` hasher.
fn storage_map_key(pallet: &[u8], storage: &[u8], map_key: &H256) -> Vec<u8> {
let mut key = Vec::new();
key.extend_from_slice(&sp_core::hashing::twox_128(pallet));
key.extend_from_slice(&sp_core::hashing::twox_128(storage));
let map_key_bytes = map_key.as_bytes();
key.extend_from_slice(&sp_core::hashing::blake2_128(map_key_bytes));
key.extend_from_slice(map_key_bytes);
key
}

/// Construct the storage key prefix for iterating all fillers in the on-chain
/// `Bids` double-map for a given order commitment.
fn bids_storage_prefix(commitment: &H256) -> Vec<u8> {
Expand All @@ -176,6 +208,10 @@ pub trait IntentsApi {
#[method(name = "intents_getBidsForOrder")]
fn get_bids_for_order(&self, commitment: H256) -> RpcResult<Vec<RpcBidInfo>>;

/// Get all prices for a token pair, separated by confidence level
#[method(name = "intents_getPairPrices")]
fn get_pair_prices(&self, pair_id: H256) -> RpcResult<RpcPairPrices>;

#[subscription(name = "intents_subscribeBids" => "intents_bidNotification", unsubscribe = "intents_unsubscribeBids", item = RpcBidInfo)]
async fn subscribe_bids(&self, commitment: Option<H256>) -> SubscriptionResult;
}
Expand Down Expand Up @@ -259,6 +295,40 @@ where
Ok(bids.into_iter().collect())
}

fn get_pair_prices(&self, pair_id: H256) -> RpcResult<RpcPairPrices> {
let best_hash = self.client.info().best_hash;

let decode_entries = |storage_name: &[u8]| -> Vec<RpcPriceEntry> {
let key = storage_map_key(b"IntentsCoprocessor", storage_name, &pair_id);
let storage_key = sp_core::storage::StorageKey(key);

let data = match self.client.storage(best_hash, &storage_key) {
Ok(Some(data)) => data.0,
_ => return Vec::new(),
};

// Decode Vec<PriceEntry<AccountId32>>
// PriceEntry SCALE-encodes as (AccountId32(32 bytes), U256(32 bytes), u64(8 bytes))
type Entry = (sp_runtime::AccountId32, primitive_types::U256, u64);
match Vec::<Entry>::decode(&mut &data[..]) {
Ok(entries) => entries
.into_iter()
.map(|(submitter, price, timestamp)| RpcPriceEntry {
submitter: submitter.encode(),
price: format!("0x{price:x}"),
timestamp,
})
.collect(),
Err(_) => Vec::new(),
}
};

Ok(RpcPairPrices {
verified: decode_entries(b"VerifiedPrices"),
unverified: decode_entries(b"UnverifiedPrices"),
})
}

async fn subscribe_bids(
&self,
pending: PendingSubscriptionSink,
Expand Down
Loading
Loading