Skip to content

Commit 78ee67e

Browse files
committed
feat(api): add showBurnt option to GetByMethodOptions
1 parent 0e29a10 commit 78ee67e

File tree

7 files changed

+205
-5
lines changed

7 files changed

+205
-5
lines changed

entities/src/api_req_params.rs

+3
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ pub struct GetByMethodsOptions {
104104
pub show_zero_balance: bool,
105105
#[serde(default)]
106106
pub show_fungible: bool,
107+
#[serde(default)]
108+
pub show_burnt: Option<bool>,
107109
}
108110

109111
impl From<&SearchAssetsOptions> for Options {
@@ -591,6 +593,7 @@ impl From<SearchAssetsOptions> for GetByMethodsOptions {
591593
show_inscription: value.show_inscription,
592594
show_zero_balance: value.show_zero_balance,
593595
show_fungible: false,
596+
show_burnt: None,
594597
}
595598
}
596599
}

nft_ingester/src/api/dapi/converters.rs

+1
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ impl TryFrom<GetAssetsByOwner> for SearchAssetsQuery {
159159
validate_pubkey(asset_owner.owner_address).map(|k| k.to_bytes().to_vec())?,
160160
),
161161
supply: Some(AssetSupply::Greater(0)),
162+
burnt: asset_owner.options.show_burnt,
162163
..Default::default()
163164
})
164165
}

nft_ingester/tests/api_tests.rs

+161
Original file line numberDiff line numberDiff line change
@@ -2090,6 +2090,167 @@ mod tests {
20902090
);
20912091
}
20922092

2093+
#[tokio::test]
2094+
#[tracing_test::traced_test]
2095+
async fn test_get_only_non_burnt_assets_by_owner() {
2096+
let cnt = 20;
2097+
let cli = Cli::default();
2098+
let (env, generated_assets) =
2099+
setup::TestEnvironment::create_burnt(&cli, cnt, SLOT_UPDATED).await;
2100+
let api = nft_ingester::api::api_impl::DasApi::<
2101+
MaybeProofChecker,
2102+
JsonWorker,
2103+
JsonWorker,
2104+
MockAccountBalanceGetter,
2105+
RaydiumTokenPriceFetcher,
2106+
Storage,
2107+
>::new(
2108+
env.pg_env.client.clone(),
2109+
env.rocks_env.storage.clone(),
2110+
Arc::new(ApiMetricsConfig::new()),
2111+
None,
2112+
None,
2113+
50,
2114+
None,
2115+
None,
2116+
JsonMiddlewareConfig::default(),
2117+
Arc::new(MockAccountBalanceGetter::new()),
2118+
None,
2119+
Arc::new(RaydiumTokenPriceFetcher::default()),
2120+
NATIVE_MINT_PUBKEY.to_string(),
2121+
);
2122+
let tasks = JoinSet::new();
2123+
let mutexed_tasks = Arc::new(Mutex::new(tasks));
2124+
2125+
let ref_value = generated_assets.owners[8].clone();
2126+
let payload = GetAssetsByOwner {
2127+
owner_address: ref_value.owner.value.map(|owner| owner.to_string()).unwrap_or_default(),
2128+
sort_by: None,
2129+
limit: None,
2130+
page: None,
2131+
before: None,
2132+
after: None,
2133+
cursor: None,
2134+
options: GetByMethodsOptions {
2135+
show_unverified_collections: true,
2136+
show_burnt: Some(false),
2137+
..Default::default()
2138+
},
2139+
};
2140+
2141+
let res = api.get_assets_by_owner(payload, mutexed_tasks.clone()).await.unwrap();
2142+
let res_obj: AssetList = serde_json::from_value(res).unwrap();
2143+
2144+
// in the setup all assets were created as burnt
2145+
// meaning that if we do not explicitly specify show_burnt
2146+
// in the options, the response will be empty
2147+
assert_eq!(res_obj.total, 0, "total should be 0");
2148+
assert_eq!(res_obj.items.len(), 0, "items length should be 0");
2149+
}
2150+
2151+
#[tokio::test]
2152+
#[tracing_test::traced_test]
2153+
async fn test_get_only_burnt_assets_by_owner() {
2154+
let cnt = 20;
2155+
let cli = Cli::default();
2156+
let (env, generated_assets) =
2157+
setup::TestEnvironment::create_burnt(&cli, cnt, SLOT_UPDATED).await;
2158+
let api = nft_ingester::api::api_impl::DasApi::<
2159+
MaybeProofChecker,
2160+
JsonWorker,
2161+
JsonWorker,
2162+
MockAccountBalanceGetter,
2163+
RaydiumTokenPriceFetcher,
2164+
Storage,
2165+
>::new(
2166+
env.pg_env.client.clone(),
2167+
env.rocks_env.storage.clone(),
2168+
Arc::new(ApiMetricsConfig::new()),
2169+
None,
2170+
None,
2171+
50,
2172+
None,
2173+
None,
2174+
JsonMiddlewareConfig::default(),
2175+
Arc::new(MockAccountBalanceGetter::new()),
2176+
None,
2177+
Arc::new(RaydiumTokenPriceFetcher::default()),
2178+
NATIVE_MINT_PUBKEY.to_string(),
2179+
);
2180+
let tasks = JoinSet::new();
2181+
let mutexed_tasks = Arc::new(Mutex::new(tasks));
2182+
2183+
let ref_value = generated_assets.owners[8].clone();
2184+
let payload = GetAssetsByOwner {
2185+
owner_address: ref_value.owner.value.map(|owner| owner.to_string()).unwrap_or_default(),
2186+
sort_by: None,
2187+
limit: None,
2188+
page: None,
2189+
before: None,
2190+
after: None,
2191+
cursor: None,
2192+
options: GetByMethodsOptions {
2193+
show_unverified_collections: true,
2194+
show_burnt: Some(true),
2195+
..Default::default()
2196+
},
2197+
};
2198+
2199+
let res = api.get_assets_by_owner(payload, mutexed_tasks.clone()).await.unwrap();
2200+
let res_obj: AssetList = serde_json::from_value(res).unwrap();
2201+
2202+
assert_eq!(res_obj.total, 20, "total should be 20");
2203+
assert_eq!(res_obj.items.len(), 20, "items length should be 20");
2204+
}
2205+
2206+
#[tokio::test]
2207+
#[tracing_test::traced_test]
2208+
async fn test_search_assets_excluding_burnt_assets() {
2209+
let cnt = 20;
2210+
let cli = Cli::default();
2211+
let (env, _generated_assets) =
2212+
setup::TestEnvironment::create_burnt(&cli, cnt, SLOT_UPDATED).await;
2213+
let api = nft_ingester::api::api_impl::DasApi::<
2214+
MaybeProofChecker,
2215+
JsonWorker,
2216+
JsonWorker,
2217+
MockAccountBalanceGetter,
2218+
RaydiumTokenPriceFetcher,
2219+
Storage,
2220+
>::new(
2221+
env.pg_env.client.clone(),
2222+
env.rocks_env.storage.clone(),
2223+
Arc::new(ApiMetricsConfig::new()),
2224+
None,
2225+
None,
2226+
50,
2227+
None,
2228+
None,
2229+
JsonMiddlewareConfig::default(),
2230+
Arc::new(MockAccountBalanceGetter::new()),
2231+
None,
2232+
Arc::new(RaydiumTokenPriceFetcher::default()),
2233+
NATIVE_MINT_PUBKEY.to_string(),
2234+
);
2235+
let tasks = JoinSet::new();
2236+
let mutexed_tasks = Arc::new(Mutex::new(tasks));
2237+
let limit = 20;
2238+
let payload = SearchAssets {
2239+
burnt: Some(false),
2240+
limit: Some(limit),
2241+
options: SearchAssetsOptions {
2242+
show_unverified_collections: true,
2243+
..Default::default()
2244+
},
2245+
..Default::default()
2246+
};
2247+
let res = api.search_assets(payload, mutexed_tasks.clone()).await.unwrap();
2248+
assert!(res.is_object());
2249+
let res_obj: AssetList = serde_json::from_value(res).unwrap();
2250+
assert_eq!(res_obj.total, 0, "total should be 0");
2251+
assert_eq!(res_obj.items.len(), 0, "assets length should be 0");
2252+
}
2253+
20932254
#[tokio::test]
20942255
#[tracing_test::traced_test]
20952256
async fn test_get_assets_by_group() {

postgre-client/src/model.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ pub struct AssetSortedIndex {
6868
pub sorting_id: String,
6969
}
7070

71-
#[derive(Default)]
71+
#[derive(Default, Debug)]
7272
pub struct SearchAssetsFilter {
7373
pub specification_version: Option<SpecificationVersions>,
7474
pub specification_asset_class: Option<SpecificationAssetClass>,
@@ -92,6 +92,7 @@ pub struct SearchAssetsFilter {
9292
pub token_type: Option<TokenType>,
9393
}
9494

95+
#[derive(Debug)]
9596
pub enum AssetSupply {
9697
Greater(u64),
9798
Equal(u64),

rocks-db/benches/misc_benchmark.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ fn bincode_decode_benchmark(c: &mut Criterion) {
1313
let slot = 100;
1414
let assets = pubkeys
1515
.iter()
16-
.map(|pk| setup::rocks::create_test_dynamic_data(*pk, slot, "solana".to_string()))
16+
.map(|pk| setup::rocks::create_test_dynamic_data(*pk, slot, "solana".to_string(), false))
1717
.map(|a| serialize(&a).unwrap())
1818
.collect::<Vec<_>>();
1919

tests/setup/src/lib.rs

+18
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,24 @@ impl<'a> TestEnvironment<'a> {
3939
.await
4040
}
4141

42+
pub async fn create_burnt(
43+
cli: &'a Cli,
44+
cnt: usize,
45+
slot: u64,
46+
) -> (TestEnvironment<'a>, rocks::GeneratedAssets) {
47+
Self::create_and_setup_from_closures(
48+
cli,
49+
cnt,
50+
slot,
51+
RocksTestEnvironmentSetup::static_data_for_nft,
52+
RocksTestEnvironmentSetup::with_authority,
53+
RocksTestEnvironmentSetup::test_owner,
54+
RocksTestEnvironmentSetup::dynamic_data_burnt,
55+
RocksTestEnvironmentSetup::collection_without_authority,
56+
)
57+
.await
58+
}
59+
4260
#[allow(clippy::too_many_arguments)]
4361
pub async fn create_and_setup_from_closures(
4462
cli: &'a Cli,

tests/setup/src/rocks.rs

+19-3
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,18 @@ impl RocksTestEnvironmentSetup {
252252
pub fn dynamic_data(pubkeys: &[Pubkey], slot: u64) -> Vec<AssetDynamicDetails> {
253253
pubkeys
254254
.iter()
255-
.map(|pubkey| create_test_dynamic_data(*pubkey, slot, DEFAULT_TEST_URL.to_owned()))
255+
.map(|pubkey| {
256+
create_test_dynamic_data(*pubkey, slot, DEFAULT_TEST_URL.to_owned(), false)
257+
})
258+
.collect()
259+
}
260+
261+
pub fn dynamic_data_burnt(pubkeys: &[Pubkey], slot: u64) -> Vec<AssetDynamicDetails> {
262+
pubkeys
263+
.iter()
264+
.map(|pubkey| {
265+
create_test_dynamic_data(*pubkey, slot, DEFAULT_TEST_URL.to_owned(), true)
266+
})
256267
.collect()
257268
}
258269

@@ -280,15 +291,20 @@ impl RocksTestEnvironmentSetup {
280291
pub const DEFAULT_PUBKEY_OF_ONES: Pubkey = Pubkey::new_from_array([1u8; 32]);
281292
pub const PUBKEY_OF_TWOS: Pubkey = Pubkey::new_from_array([2u8; 32]);
282293

283-
pub fn create_test_dynamic_data(pubkey: Pubkey, slot: u64, url: String) -> AssetDynamicDetails {
294+
pub fn create_test_dynamic_data(
295+
pubkey: Pubkey,
296+
slot: u64,
297+
url: String,
298+
is_burnt: bool,
299+
) -> AssetDynamicDetails {
284300
AssetDynamicDetails {
285301
pubkey,
286302
is_compressible: Updated::new(slot, None, false),
287303
is_compressed: Updated::new(slot, None, false),
288304
is_frozen: Updated::new(slot, None, false),
289305
supply: Some(Updated::new(slot, None, 1)),
290306
seq: None,
291-
is_burnt: Updated::new(slot, None, false),
307+
is_burnt: Updated::new(slot, None, is_burnt),
292308
was_decompressed: Some(Updated::new(slot, None, false)),
293309
onchain_data: None,
294310
creators: Updated::new(slot, None, vec![generate_test_creator()]),

0 commit comments

Comments
 (0)