Skip to content

Commit 4598b5d

Browse files
tests: allow admin interface to create an arknote
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
1 parent 817d508 commit 4598b5d

File tree

9 files changed

+673
-23
lines changed

9 files changed

+673
-23
lines changed

ark-client/src/lib.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,15 @@ where
556556
self.redeem_notes(rng, vec![arknote]).await
557557
}
558558

559+
pub async fn create_arknote(&self, amount: Amount) -> Result<ArkNote, Error> {
560+
let note = self
561+
.network_client()
562+
.create_arknote(amount.to_sat() as u32, 1)
563+
.await?;
564+
let note = ArkNote::from_string(&note[0])?;
565+
Ok(note)
566+
}
567+
559568
pub async fn transaction_history(&self) -> Result<Vec<history::Transaction>, Error> {
560569
let mut boarding_transactions = Vec::new();
561570
let mut boarding_commitment_transactions = Vec::new();

ark-core/src/arknote.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ pub struct Status {
3333
pub confirmed: bool,
3434
}
3535

36-
3736
impl fmt::Display for ArkNote {
3837
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3938
let value = self.to_encoded_string();
@@ -319,7 +318,6 @@ impl ArkNote {
319318
}
320319
}
321320

322-
323321
#[cfg(test)]
324322
mod tests {
325323
use super::*;

ark-grpc/build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ fn generate_protos() -> std::io::Result<()> {
1919
"proto/ark/v1/wallet.proto",
2020
"proto/ark/v1/indexer.proto",
2121
"proto/ark/v1/types.proto",
22+
"proto/ark/v1/admin.proto",
2223
],
2324
&["proto"],
2425
)?;

ark-grpc/proto/ark/v1/admin.proto

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
syntax = "proto3";
2+
3+
package ark.v1;
4+
5+
import "google/api/annotations.proto";
6+
import "ark/v1/types.proto";
7+
8+
service AdminService {
9+
rpc GetScheduledSweep(GetScheduledSweepRequest) returns (GetScheduledSweepResponse) {
10+
option (google.api.http) = {
11+
get: "/v1/admin/sweeps"
12+
};
13+
}
14+
rpc GetRoundDetails(GetRoundDetailsRequest) returns (GetRoundDetailsResponse) {
15+
option (google.api.http) = {
16+
get: "/v1/admin/round/{round_id}"
17+
};
18+
}
19+
rpc GetRounds(GetRoundsRequest) returns (GetRoundsResponse) {
20+
option (google.api.http) = {
21+
get: "/v1/admin/rounds"
22+
};
23+
}
24+
rpc CreateNote(CreateNoteRequest) returns (CreateNoteResponse) {
25+
option (google.api.http) = {
26+
post: "/v1/admin/note"
27+
body: "*"
28+
};
29+
}
30+
rpc GetMarketHourConfig(GetMarketHourConfigRequest) returns (GetMarketHourConfigResponse) {
31+
option (google.api.http) = {
32+
get: "/v1/admin/marketHour"
33+
};
34+
}
35+
rpc UpdateMarketHourConfig(UpdateMarketHourConfigRequest) returns (UpdateMarketHourConfigResponse) {
36+
option (google.api.http) = {
37+
post: "/v1/admin/marketHour"
38+
body: "*"
39+
};
40+
}
41+
rpc ListIntents(ListIntentsRequest) returns (ListIntentsResponse) {
42+
option (google.api.http) = {
43+
get: "/v1/admin/intents"
44+
};
45+
}
46+
rpc DeleteIntents(DeleteIntentsRequest) returns (DeleteIntentsResponse) {
47+
option (google.api.http) = {
48+
post: "/v1/admin/intents/delete"
49+
body: "*"
50+
};
51+
}
52+
}
53+
54+
message GetScheduledSweepRequest {}
55+
message GetScheduledSweepResponse {
56+
repeated ScheduledSweep sweeps = 1;
57+
}
58+
59+
message GetRoundDetailsRequest {
60+
string round_id = 1;
61+
}
62+
message GetRoundDetailsResponse {
63+
string round_id = 1;
64+
int64 started_at = 2;
65+
int64 ended_at = 3;
66+
string commitment_txid = 4;
67+
string forfeited_amount = 5;
68+
string total_vtxos_amount = 6;
69+
string total_exit_amount = 7;
70+
string total_fee_amount = 8;
71+
repeated string inputs_vtxos = 9;
72+
repeated string outputs_vtxos = 10;
73+
repeated string exit_addresses = 11;
74+
}
75+
76+
message GetRoundsRequest {
77+
int64 after = 1;
78+
int64 before = 2;
79+
}
80+
message GetRoundsResponse {
81+
repeated string rounds = 1;
82+
}
83+
84+
message CreateNoteRequest {
85+
uint32 amount = 1;
86+
uint32 quantity = 2;
87+
}
88+
message CreateNoteResponse {
89+
repeated string notes = 1;
90+
}
91+
92+
message GetMarketHourConfigRequest {}
93+
message GetMarketHourConfigResponse {
94+
MarketHourConfig config = 1;
95+
}
96+
97+
message UpdateMarketHourConfigRequest {
98+
MarketHourConfig config = 1;
99+
}
100+
message UpdateMarketHourConfigResponse {}
101+
102+
message ListIntentsRequest {
103+
repeated string intent_ids = 1;
104+
}
105+
message ListIntentsResponse {
106+
repeated IntentInfo intents = 1;
107+
}
108+
109+
message DeleteIntentsRequest {
110+
repeated string intent_ids = 1;
111+
}
112+
message DeleteIntentsResponse {}
113+
114+
message SweepableOutput {
115+
string txid = 1;
116+
uint32 vout = 2;
117+
string amount = 3;
118+
int64 scheduled_at = 4;
119+
}
120+
121+
message ScheduledSweep {
122+
string round_id = 1;
123+
repeated SweepableOutput outputs = 2;
124+
}
125+
126+
message MarketHourConfig {
127+
int64 start_time = 1;
128+
int64 end_time = 2;
129+
int64 period = 3;
130+
int64 round_interval = 4;
131+
}
132+
133+
message IntentInput {
134+
string txid = 1;
135+
uint32 vout = 2;
136+
uint64 amount = 3;
137+
}
138+
139+
message IntentInfo {
140+
string id = 1;
141+
int64 created_at = 2;
142+
repeated Output receivers = 3;
143+
repeated IntentInput inputs = 4;
144+
repeated IntentInput boarding_inputs = 5;
145+
repeated string cosigners_public_keys = 6;
146+
Bip322Signature proof = 7;
147+
}
148+
149+
message Output {
150+
oneof destination {
151+
string vtxo_script = 1;
152+
string onchain_address = 2;
153+
}; // onchain or off-chain
154+
uint64 amount = 3; // Amount to send in satoshis.
155+
}

ark-grpc/src/client.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use crate::generated;
2+
use crate::generated::ark::v1::admin_service_client::AdminServiceClient;
23
use crate::generated::ark::v1::ark_service_client::ArkServiceClient;
34
use crate::generated::ark::v1::indexer_service_client::IndexerServiceClient;
45
use crate::generated::ark::v1::indexer_tx_history_record::Key;
56
use crate::generated::ark::v1::Bip322Signature;
67
use crate::generated::ark::v1::ConfirmRegistrationRequest;
8+
use crate::generated::ark::v1::CreateNoteRequest;
79
use crate::generated::ark::v1::GetEventStreamRequest;
810
use crate::generated::ark::v1::GetInfoRequest;
911
use crate::generated::ark::v1::GetTransactionsStreamRequest;
@@ -63,6 +65,7 @@ pub struct Client {
6365
url: String,
6466
ark_client: Option<ArkServiceClient<tonic::transport::Channel>>,
6567
indexer_client: Option<IndexerServiceClient<tonic::transport::Channel>>,
68+
admin_client: Option<AdminServiceClient<tonic::transport::Channel>>,
6669
}
6770

6871
impl Client {
@@ -71,6 +74,7 @@ impl Client {
7174
url,
7275
ark_client: None,
7376
indexer_client: None,
77+
admin_client: None,
7478
}
7579
}
7680

@@ -81,9 +85,13 @@ impl Client {
8185
let indexer_client = IndexerServiceClient::connect(self.url.clone())
8286
.await
8387
.map_err(Error::connect)?;
88+
let admin_client = AdminServiceClient::connect(self.url.clone())
89+
.await
90+
.map_err(Error::connect)?;
8491

8592
self.ark_client = Some(ark_service_client);
8693
self.indexer_client = Some(indexer_client);
94+
self.admin_client = Some(admin_client);
8795
Ok(())
8896
}
8997

@@ -454,13 +462,26 @@ impl Client {
454462
Ok(result)
455463
}
456464

465+
pub async fn create_arknote(&self, amount: u32, quantity: u32) -> Result<Vec<String>, Error> {
466+
let mut client = self.admin_client()?;
467+
468+
let request = CreateNoteRequest { amount, quantity };
469+
470+
let response = client.create_note(request).await.map_err(Error::request)?;
471+
472+
Ok(response.into_inner().notes)
473+
}
474+
457475
fn ark_client(&self) -> Result<ArkServiceClient<tonic::transport::Channel>, Error> {
458476
// Cloning an `ArkServiceClient<Channel>` is cheap.
459477
self.ark_client.clone().ok_or(Error::not_connected())
460478
}
461479
fn indexer_client(&self) -> Result<IndexerServiceClient<tonic::transport::Channel>, Error> {
462480
self.indexer_client.clone().ok_or(Error::not_connected())
463481
}
482+
fn admin_client(&self) -> Result<AdminServiceClient<tonic::transport::Channel>, Error> {
483+
self.admin_client.clone().ok_or(Error::not_connected())
484+
}
464485
}
465486

466487
impl TryFrom<generated::ark::v1::BatchStartedEvent> for BatchStartedEvent {

0 commit comments

Comments
 (0)