Skip to content

Commit 1753435

Browse files
authored
feat: retrieve_token_collections (#118)
1 parent de63bb8 commit 1753435

File tree

9 files changed

+369
-13
lines changed

9 files changed

+369
-13
lines changed

Cargo.lock

Lines changed: 22 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ crate-type = ["cdylib", "rlib", "staticlib"]
99
[dependencies]
1010
dojo-world = { git = "https://github.com/dojoengine/dojo", rev = "4145801" }
1111
dojo-types = { git = "https://github.com/dojoengine/dojo", rev = "4145801" }
12-
torii-proto = { git = "https://github.com/dojoengine/torii", rev = "9a3f85b" }
13-
torii-client = { git = "https://github.com/dojoengine/torii", rev = "9a3f85b" }
14-
torii-grpc-client = { git = "https://github.com/dojoengine/torii", rev = "9a3f85b" }
15-
torii-libp2p-types = { git = "https://github.com/dojoengine/torii", rev = "9a3f85b" }
12+
torii-proto = { git = "https://github.com/dojoengine/torii", rev = "4231d80" }
13+
torii-client = { git = "https://github.com/dojoengine/torii", rev = "4231d80" }
14+
torii-grpc-client = { git = "https://github.com/dojoengine/torii", rev = "4231d80" }
15+
torii-typed-data = { git = "https://github.com/dojoengine/torii", rev = "4231d80" }
16+
torii-libp2p-types = { git = "https://github.com/dojoengine/torii", rev = "4231d80" }
1617

1718
starknet = "0.13.0"
1819
starknet-crypto = "0.7.2"
@@ -70,4 +71,4 @@ base64 = "0.22.1"
7071
cbindgen = { git = "https://github.com/masnagam/cbindgen", branch = "fix-issue-43" }
7172

7273
[patch.crates-io]
73-
crunchy = { git = "https://github.com/nmathewson/crunchy", branch = "cross-compilation-fix" }
74+
crunchy = { git = "https://github.com/nmathewson/crunchy", branch = "cross-compilation-fix" }

dojo.h

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct Subscription;
2020
struct Struct;
2121
struct Token;
2222
struct TokenBalance;
23+
struct TokenCollection;
2324
struct Provider;
2425
struct Account;
2526
struct Ty;
@@ -541,6 +542,33 @@ typedef struct ResultPageTokenBalance {
541542
};
542543
} ResultPageTokenBalance;
543544

545+
typedef struct CArrayTokenCollection {
546+
struct TokenCollection *data;
547+
uintptr_t data_len;
548+
} CArrayTokenCollection;
549+
550+
typedef struct PageTokenCollection {
551+
struct CArrayTokenCollection items;
552+
struct COptionc_char next_cursor;
553+
} PageTokenCollection;
554+
555+
typedef enum ResultPageTokenCollection_Tag {
556+
OkPageTokenCollection,
557+
ErrPageTokenCollection,
558+
} ResultPageTokenCollection_Tag;
559+
560+
typedef struct ResultPageTokenCollection {
561+
ResultPageTokenCollection_Tag tag;
562+
union {
563+
struct {
564+
struct PageTokenCollection ok;
565+
};
566+
struct {
567+
struct Error err;
568+
};
569+
};
570+
} ResultPageTokenCollection;
571+
544572
typedef struct IndexerUpdate {
545573
int64_t head;
546574
int64_t tps;
@@ -793,6 +821,15 @@ typedef struct CHashItemFieldElementModelMetadata {
793821
struct ModelMetadata value;
794822
} CHashItemFieldElementModelMetadata;
795823

824+
typedef struct TokenCollection {
825+
struct FieldElement contract_address;
826+
const char *name;
827+
const char *symbol;
828+
uint8_t decimals;
829+
uint32_t count;
830+
const char *metadata;
831+
} TokenCollection;
832+
796833
typedef struct Member {
797834
const char *name;
798835
struct Ty *ty;
@@ -1197,6 +1234,33 @@ struct ResultPageTokenBalance client_token_balances(struct ToriiClient *client,
11971234
uint32_t limit,
11981235
struct COptionc_char cursor);
11991236

1237+
/**
1238+
* Gets token collections for given accounts and contracts
1239+
*
1240+
* # Parameters
1241+
* * `client` - Pointer to ToriiClient instance
1242+
* * `contract_addresses` - Array of contract addresses
1243+
* * `contract_addresses_len` - Length of contract addresses array
1244+
* * `account_addresses` - Array of account addresses
1245+
* * `account_addresses_len` - Length of account addresses array
1246+
* * `token_ids` - Array of token ids
1247+
* * `token_ids_len` - Length of token ids array
1248+
* * `limit` - Maximum number of token balances to return
1249+
* * `cursor` - Cursor to start from
1250+
*
1251+
* # Returns
1252+
* Result containing array of TokenBalance information or error
1253+
*/
1254+
struct ResultPageTokenCollection client_token_collections(struct ToriiClient *client,
1255+
const struct FieldElement *contract_addresses,
1256+
uintptr_t contract_addresses_len,
1257+
const struct FieldElement *account_addresses,
1258+
uintptr_t account_addresses_len,
1259+
const struct U256 *token_ids,
1260+
uintptr_t token_ids_len,
1261+
uint32_t limit,
1262+
struct COptionc_char cursor);
1263+
12001264
/**
12011265
* Subscribes to indexer updates
12021266
*

dojo.hpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,15 @@ struct TokenBalance {
806806
U256 token_id;
807807
};
808808

809+
struct TokenCollection {
810+
FieldElement contract_address;
811+
const char *name;
812+
const char *symbol;
813+
uint8_t decimals;
814+
uint32_t count;
815+
const char *metadata;
816+
};
817+
809818
struct IndexerUpdate {
810819
int64_t head;
811820
int64_t tps;
@@ -1234,6 +1243,31 @@ Result<Page<TokenBalance>> client_token_balances(ToriiClient *client,
12341243
uint32_t limit,
12351244
COption<const char*> cursor);
12361245

1246+
/// Gets token collections for given accounts and contracts
1247+
///
1248+
/// # Parameters
1249+
/// * `client` - Pointer to ToriiClient instance
1250+
/// * `contract_addresses` - Array of contract addresses
1251+
/// * `contract_addresses_len` - Length of contract addresses array
1252+
/// * `account_addresses` - Array of account addresses
1253+
/// * `account_addresses_len` - Length of account addresses array
1254+
/// * `token_ids` - Array of token ids
1255+
/// * `token_ids_len` - Length of token ids array
1256+
/// * `limit` - Maximum number of token balances to return
1257+
/// * `cursor` - Cursor to start from
1258+
///
1259+
/// # Returns
1260+
/// Result containing array of TokenBalance information or error
1261+
Result<Page<TokenCollection>> client_token_collections(ToriiClient *client,
1262+
const FieldElement *contract_addresses,
1263+
uintptr_t contract_addresses_len,
1264+
const FieldElement *account_addresses,
1265+
uintptr_t account_addresses_len,
1266+
const U256 *token_ids,
1267+
uintptr_t token_ids_len,
1268+
uint32_t limit,
1269+
COption<const char*> cursor);
1270+
12371271
/// Subscribes to indexer updates
12381272
///
12391273
/// # Parameters

dojo.pyx

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,23 @@ cdef extern from *:
345345
PageTokenBalance ok;
346346
Error err;
347347

348+
cdef struct CArrayTokenCollection:
349+
TokenCollection *data;
350+
uintptr_t data_len;
351+
352+
cdef struct PageTokenCollection:
353+
CArrayTokenCollection items;
354+
COptionc_char next_cursor;
355+
356+
cdef enum ResultPageTokenCollection_Tag:
357+
OkPageTokenCollection,
358+
ErrPageTokenCollection,
359+
360+
cdef struct ResultPageTokenCollection:
361+
ResultPageTokenCollection_Tag tag;
362+
PageTokenCollection ok;
363+
Error err;
364+
348365
cdef struct IndexerUpdate:
349366
int64_t head;
350367
int64_t tps;
@@ -504,6 +521,14 @@ cdef extern from *:
504521
FieldElement key;
505522
ModelMetadata value;
506523

524+
cdef struct TokenCollection:
525+
FieldElement contract_address;
526+
const char *name;
527+
const char *symbol;
528+
uint8_t decimals;
529+
uint32_t count;
530+
const char *metadata;
531+
507532
cdef struct Member:
508533
const char *name;
509534
Ty *ty;
@@ -852,6 +877,31 @@ cdef extern from *:
852877
uint32_t limit,
853878
COptionc_char cursor);
854879

880+
# Gets token collections for given accounts and contracts
881+
#
882+
# # Parameters
883+
# * `client` - Pointer to ToriiClient instance
884+
# * `contract_addresses` - Array of contract addresses
885+
# * `contract_addresses_len` - Length of contract addresses array
886+
# * `account_addresses` - Array of account addresses
887+
# * `account_addresses_len` - Length of account addresses array
888+
# * `token_ids` - Array of token ids
889+
# * `token_ids_len` - Length of token ids array
890+
# * `limit` - Maximum number of token balances to return
891+
# * `cursor` - Cursor to start from
892+
#
893+
# # Returns
894+
# Result containing array of TokenBalance information or error
895+
ResultPageTokenCollection client_token_collections(ToriiClient *client,
896+
const FieldElement *contract_addresses,
897+
uintptr_t contract_addresses_len,
898+
const FieldElement *account_addresses,
899+
uintptr_t account_addresses_len,
900+
const U256 *token_ids,
901+
uintptr_t token_ids_len,
902+
uint32_t limit,
903+
COptionc_char cursor);
904+
855905
# Subscribes to indexer updates
856906
#
857907
# # Parameters

src/c/mod.rs

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ use torii_libp2p_types::Message;
5252
use tower_http::cors::{AllowOrigin, CorsLayer};
5353
use types::{
5454
BlockId, CArray, COption, Call, Clause, Controller, Entity, Error, Event, IndexerUpdate,
55-
KeysClause, Page, Policy, Query, Result, Signature, Struct, Token, TokenBalance, ToriiClient,
56-
Ty, WorldMetadata,
55+
KeysClause, Page, Policy, Query, Result, Signature, Struct, Token, TokenBalance,
56+
TokenCollection, ToriiClient, Ty, WorldMetadata,
5757
};
5858
use url::Url;
5959

@@ -1255,6 +1255,74 @@ pub unsafe extern "C" fn client_token_balances(
12551255
Result::Ok(token_balances.into())
12561256
}
12571257

1258+
/// Gets token collections for given accounts and contracts
1259+
///
1260+
/// # Parameters
1261+
/// * `client` - Pointer to ToriiClient instance
1262+
/// * `contract_addresses` - Array of contract addresses
1263+
/// * `contract_addresses_len` - Length of contract addresses array
1264+
/// * `account_addresses` - Array of account addresses
1265+
/// * `account_addresses_len` - Length of account addresses array
1266+
/// * `token_ids` - Array of token ids
1267+
/// * `token_ids_len` - Length of token ids array
1268+
/// * `limit` - Maximum number of token balances to return
1269+
/// * `cursor` - Cursor to start from
1270+
///
1271+
/// # Returns
1272+
/// Result containing array of TokenBalance information or error
1273+
#[no_mangle]
1274+
pub unsafe extern "C" fn client_token_collections(
1275+
client: *mut ToriiClient,
1276+
contract_addresses: *const types::FieldElement,
1277+
contract_addresses_len: usize,
1278+
account_addresses: *const types::FieldElement,
1279+
account_addresses_len: usize,
1280+
token_ids: *const types::U256,
1281+
token_ids_len: usize,
1282+
limit: u32,
1283+
cursor: COption<*const c_char>,
1284+
) -> Result<Page<TokenCollection>> {
1285+
let account_addresses = if account_addresses.is_null() || account_addresses_len == 0 {
1286+
Vec::new()
1287+
} else {
1288+
let addresses =
1289+
unsafe { std::slice::from_raw_parts(account_addresses, account_addresses_len) };
1290+
addresses.iter().map(|f| f.clone().into()).collect::<Vec<Felt>>()
1291+
};
1292+
1293+
let contract_addresses = if contract_addresses.is_null() || contract_addresses_len == 0 {
1294+
Vec::new()
1295+
} else {
1296+
let addresses =
1297+
unsafe { std::slice::from_raw_parts(contract_addresses, contract_addresses_len) };
1298+
addresses.iter().map(|f| f.clone().into()).collect::<Vec<Felt>>()
1299+
};
1300+
1301+
let token_ids = if token_ids.is_null() || token_ids_len == 0 {
1302+
Vec::new()
1303+
} else {
1304+
let ids = unsafe { std::slice::from_raw_parts(token_ids, token_ids_len) };
1305+
ids.iter().map(|f| f.clone().into()).collect::<Vec<U256>>()
1306+
};
1307+
1308+
let token_collections = match RUNTIME.block_on(
1309+
(*client).inner.token_collections(
1310+
account_addresses,
1311+
contract_addresses,
1312+
token_ids,
1313+
if limit == 0 { None } else { Some(limit) },
1314+
cursor
1315+
.map(|c| unsafe { std::ffi::CStr::from_ptr(c).to_string_lossy().into_owned() })
1316+
.into(),
1317+
),
1318+
) {
1319+
Ok(collections) => collections,
1320+
Err(e) => return Result::Err(e.into()),
1321+
};
1322+
1323+
Result::Ok(token_collections.into())
1324+
}
1325+
12581326
/// Subscribes to indexer updates
12591327
///
12601328
/// # Parameters

0 commit comments

Comments
 (0)