Skip to content

Commit 3ddd05b

Browse files
committed
Add is_signed parameter support for the call endpoints in Crystal API.
1 parent ff5503c commit 3ddd05b

File tree

4 files changed

+98
-0
lines changed

4 files changed

+98
-0
lines changed

submerge-crystal/api-spec/submerge-crystal-api.json

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,16 @@
294294
},
295295
"example": "setcode"
296296
},
297+
{
298+
"name": "is_signed",
299+
"in": "query",
300+
"description": "Whether to include only calls within signed/unsigned extrinsics.",
301+
"required": false,
302+
"schema": {
303+
"type": "boolean"
304+
},
305+
"example": true
306+
},
297307
{
298308
"name": "include_args",
299309
"in": "query",
@@ -696,6 +706,16 @@
696706
},
697707
"example": "setcode"
698708
},
709+
{
710+
"name": "is_signed",
711+
"in": "query",
712+
"description": "Whether to include only calls within signed/unsigned extrinsics.",
713+
"required": false,
714+
"schema": {
715+
"type": "boolean"
716+
},
717+
"example": true
718+
},
699719
{
700720
"name": "include_args",
701721
"in": "query",
@@ -1023,6 +1043,16 @@
10231043
},
10241044
"example": "setcode"
10251045
},
1046+
{
1047+
"name": "is_signed",
1048+
"in": "query",
1049+
"description": "Whether to include only calls within signed/unsigned extrinsics.",
1050+
"required": false,
1051+
"schema": {
1052+
"type": "boolean"
1053+
},
1054+
"example": true
1055+
},
10261056
{
10271057
"name": "include_args",
10281058
"in": "query",
@@ -1394,6 +1424,16 @@
13941424
},
13951425
"example": "setcode"
13961426
},
1427+
{
1428+
"name": "is_signed",
1429+
"in": "query",
1430+
"description": "Whether to include only calls within signed/unsigned extrinsics.",
1431+
"required": false,
1432+
"schema": {
1433+
"type": "boolean"
1434+
},
1435+
"example": true
1436+
},
13971437
{
13981438
"name": "include_args",
13991439
"in": "query",
@@ -2059,6 +2099,16 @@
20592099
},
20602100
"example": "setcode"
20612101
},
2102+
{
2103+
"name": "is_signed",
2104+
"in": "query",
2105+
"description": "Whether to include only calls within signed/unsigned extrinsics.",
2106+
"required": false,
2107+
"schema": {
2108+
"type": "boolean"
2109+
},
2110+
"example": true
2111+
},
20622112
{
20632113
"name": "include_args",
20642114
"in": "query",

submerge-crystal/src/api/v1/call.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ pub(crate) async fn get_calls(
9494
&query.pallet_name,
9595
&query.call_name,
9696
page_size,
97+
query.is_signed,
9798
query.include_args,
9899
)
99100
.await?;
@@ -183,13 +184,15 @@ pub(crate) async fn get_calls_by_block_reference(
183184
block_number,
184185
&query.pallet_name,
185186
&query.pallet_call_name,
187+
query.is_signed,
186188
),
187189
state.postgres.get_calls_by_block_number(
188190
block_number,
189191
&query.pallet_name,
190192
&query.pallet_call_name,
191193
page,
192194
page_size,
195+
query.is_signed,
193196
query.include_args,
194197
),
195198
)?;
@@ -216,13 +219,15 @@ pub(crate) async fn get_calls_by_block_reference(
216219
&block_hash,
217220
&query.pallet_name,
218221
&query.pallet_call_name,
222+
query.is_signed,
219223
),
220224
state.postgres.get_calls_by_block_hash(
221225
&block_hash,
222226
&query.pallet_name,
223227
&query.pallet_call_name,
224228
page,
225229
page_size,
230+
query.is_signed,
226231
query.include_args,
227232
),
228233
)?;

submerge-crystal/src/persistence/api/call.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,15 @@ pub(crate) trait CrystalCallAPIPostgreSQLStorage {
3939
pallet_name: &Option<String>,
4040
pallet_call_name: &Option<String>,
4141
page_size: u32,
42+
extrinsic_is_signed: Option<bool>,
4243
include_args: bool,
4344
) -> anyhow::Result<Vec<CallRow>>;
4445
async fn get_call_count_by_block_hash(
4546
&self,
4647
block_hash: &[u8],
4748
pallet_name: &Option<String>,
4849
pallet_call_name: &Option<String>,
50+
extrinsic_is_signed: Option<bool>,
4951
) -> anyhow::Result<u64>;
5052
async fn get_calls_by_block_hash(
5153
&self,
@@ -54,13 +56,15 @@ pub(crate) trait CrystalCallAPIPostgreSQLStorage {
5456
pallet_call_name: &Option<String>,
5557
page: u32,
5658
page_size: u32,
59+
extrinsic_is_signed: Option<bool>,
5760
include_args: bool,
5861
) -> anyhow::Result<Vec<CallRow>>;
5962
async fn get_call_count_by_block_number(
6063
&self,
6164
block_number: u64,
6265
pallet_name: &Option<String>,
6366
pallet_call_name: &Option<String>,
67+
extrinsic_is_signed: Option<bool>,
6468
) -> anyhow::Result<u64>;
6569
async fn get_calls_by_block_number(
6670
&self,
@@ -69,6 +73,7 @@ pub(crate) trait CrystalCallAPIPostgreSQLStorage {
6973
pallet_call_name: &Option<String>,
7074
page: u32,
7175
page_size: u32,
76+
extrinsic_is_signed: Option<bool>,
7277
include_args: bool,
7378
) -> anyhow::Result<Vec<CallRow>>;
7479
async fn get_call_count_by_block_hash_and_extrinsic_index(
@@ -163,6 +168,7 @@ impl CrystalCallAPIPostgreSQLStorage for PostgreSQLStorage {
163168
pallet_name: &Option<String>,
164169
pallet_call_name: &Option<String>,
165170
page_size: u32,
171+
extrinsic_is_signed: Option<bool>,
166172
include_args: bool,
167173
) -> anyhow::Result<Vec<CallRow>> {
168174
let query = get_select_query(include_args);
@@ -205,6 +211,11 @@ impl CrystalCallAPIPostgreSQLStorage for PostgreSQLStorage {
205211
query_builder.push(")");
206212
}
207213

214+
if let Some(extrinsic_is_signed) = extrinsic_is_signed {
215+
query_builder
216+
.push(" AND C.extrinsic_is_signed = ")
217+
.push_bind(extrinsic_is_signed);
218+
}
208219
if let Some(pallet_name) = pallet_name {
209220
query_builder
210221
.push(" AND MP.name ILIKE ")
@@ -231,11 +242,17 @@ impl CrystalCallAPIPostgreSQLStorage for PostgreSQLStorage {
231242
block_hash: &[u8],
232243
pallet_name: &Option<String>,
233244
pallet_call_name: &Option<String>,
245+
extrinsic_is_signed: Option<bool>,
234246
) -> anyhow::Result<u64> {
235247
let mut query_builder: QueryBuilder<Postgres> = QueryBuilder::new(COUNT);
236248
query_builder
237249
.push(" WHERE C.block_hash = ")
238250
.push_bind(block_hash);
251+
if let Some(extrinsic_is_signed) = extrinsic_is_signed {
252+
query_builder
253+
.push(" AND C.extrinsic_is_signed = ")
254+
.push_bind(extrinsic_is_signed);
255+
}
239256
if let Some(pallet_name) = pallet_name {
240257
query_builder
241258
.push(" AND MP.name ILIKE ")
@@ -260,6 +277,7 @@ impl CrystalCallAPIPostgreSQLStorage for PostgreSQLStorage {
260277
pallet_call_name: &Option<String>,
261278
page: u32,
262279
page_size: u32,
280+
extrinsic_is_signed: Option<bool>,
263281
include_args: bool,
264282
) -> anyhow::Result<Vec<CallRow>> {
265283
let offset = (page - 1) * page_size;
@@ -268,6 +286,11 @@ impl CrystalCallAPIPostgreSQLStorage for PostgreSQLStorage {
268286
query_builder
269287
.push(" AND C.block_hash = ")
270288
.push_bind(block_hash);
289+
if let Some(extrinsic_is_signed) = extrinsic_is_signed {
290+
query_builder
291+
.push(" AND C.extrinsic_is_signed = ")
292+
.push_bind(extrinsic_is_signed);
293+
}
271294
if let Some(pallet_name) = pallet_name {
272295
query_builder
273296
.push(" AND MP.name ILIKE ")
@@ -294,11 +317,17 @@ impl CrystalCallAPIPostgreSQLStorage for PostgreSQLStorage {
294317
block_number: u64,
295318
pallet_name: &Option<String>,
296319
pallet_call_name: &Option<String>,
320+
extrinsic_is_signed: Option<bool>,
297321
) -> anyhow::Result<u64> {
298322
let mut query_builder: QueryBuilder<Postgres> = QueryBuilder::new(COUNT);
299323
query_builder
300324
.push(" WHERE C.block_number = ")
301325
.push_bind(block_number as i64);
326+
if let Some(extrinsic_is_signed) = extrinsic_is_signed {
327+
query_builder
328+
.push(" AND C.extrinsic_is_signed = ")
329+
.push_bind(extrinsic_is_signed);
330+
}
302331
if let Some(pallet_name) = pallet_name {
303332
query_builder
304333
.push(" AND MP.name ILIKE ")
@@ -323,6 +352,7 @@ impl CrystalCallAPIPostgreSQLStorage for PostgreSQLStorage {
323352
pallet_call_name: &Option<String>,
324353
page: u32,
325354
page_size: u32,
355+
extrinsic_is_signed: Option<bool>,
326356
include_args: bool,
327357
) -> anyhow::Result<Vec<CallRow>> {
328358
let offset = (page - 1) * page_size;
@@ -331,6 +361,11 @@ impl CrystalCallAPIPostgreSQLStorage for PostgreSQLStorage {
331361
query_builder
332362
.push(" AND C.block_number = ")
333363
.push_bind(block_number as i64);
364+
if let Some(extrinsic_is_signed) = extrinsic_is_signed {
365+
query_builder
366+
.push(" AND C.extrinsic_is_signed = ")
367+
.push_bind(extrinsic_is_signed);
368+
}
334369
if let Some(pallet_name) = pallet_name {
335370
query_builder
336371
.push(" AND MP.name ILIKE ")

submerge-crystal/src/types/api/dto/request/call.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ pub(crate) struct CallQuery {
6666
#[param(required = false, nullable = false, example = "setcode")]
6767
#[serde(skip_serializing_if = "Option::is_none")]
6868
pub call_name: Option<String>,
69+
/// Whether to include only calls within signed/unsigned extrinsics.
70+
#[param(required = false, nullable = false, example = true)]
71+
#[serde(skip_serializing_if = "Option::is_none")]
72+
pub is_signed: Option<bool>,
6973
/// Whether to include call arguments in the calls in the response.
7074
/// Default is `false`. Setting this to `true` increases the response size considerably.
7175
/// Prefer to use the `GET /call/{call_hash}/args` endpoint per call instead.
@@ -147,6 +151,10 @@ pub(crate) struct BlockCallQuery {
147151
/// Filter blocks calls by call name. Case insensitive.
148152
#[param(required = false, nullable = false, example = "setcode")]
149153
pub pallet_call_name: Option<String>,
154+
/// Whether to include only calls within signed/unsigned extrinsics.
155+
#[param(required = false, nullable = false, example = true)]
156+
#[serde(skip_serializing_if = "Option::is_none")]
157+
pub is_signed: Option<bool>,
150158
/// Whether to include call arguments in the block calls in the response.
151159
/// Default is `false`. Setting this to `true` increases the response size considerably.
152160
/// Prefer to use the `GET /call/{call_hash}/args` endpoint per call instead.

0 commit comments

Comments
 (0)