Skip to content

Commit 9a84070

Browse files
committed
feat(doge): Add dogecoin support to replica
1 parent 3fcf7d9 commit 9a84070

File tree

26 files changed

+838
-118
lines changed

26 files changed

+838
-118
lines changed

Cargo.lock

Lines changed: 34 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rs/bitcoin/adapter/tests/adapter_test.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,12 @@ fn make_get_successors_request(
5757
anchor: Vec<u8>,
5858
headers: Vec<Vec<u8>>,
5959
) -> Result<BitcoinAdapterResponseWrapper, ic_interfaces_adapter_client::RpcError> {
60-
let request = BitcoinAdapterRequestWrapper::GetSuccessorsRequest(GetSuccessorsRequestInitial {
61-
network: Network::Regtest,
62-
anchor,
63-
processed_block_hashes: headers,
64-
});
60+
let request =
61+
BitcoinAdapterRequestWrapper::GetBtcSuccessorsRequest(GetSuccessorsRequestInitial {
62+
network: Network::Regtest,
63+
anchor,
64+
processed_block_hashes: headers,
65+
});
6566

6667
adapter_client.send_blocking(
6768
request,
@@ -75,7 +76,7 @@ fn make_send_tx_request(
7576
adapter_client: &BitcoinAdapterClient,
7677
raw_tx: &[u8],
7778
) -> Result<BitcoinAdapterResponseWrapper, ic_interfaces_adapter_client::RpcError> {
78-
let request = BitcoinAdapterRequestWrapper::SendTransactionRequest(SendTransactionRequest {
79+
let request = BitcoinAdapterRequestWrapper::SendBtcTransactionRequest(SendTransactionRequest {
7980
network: Network::Regtest,
8081
transaction: raw_tx.to_vec(),
8182
});

rs/bitcoin/client/src/lib.rs

Lines changed: 66 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use crate::metrics::{
66
};
77
use ic_adapter_metrics_client::AdapterMetrics;
88
use ic_btc_replica_types::{
9-
BitcoinAdapterRequestWrapper, BitcoinAdapterResponseWrapper, GetSuccessorsRequestInitial,
10-
GetSuccessorsResponseComplete, SendTransactionRequest, SendTransactionResponse,
9+
BitcoinAdapterRequestInner, BitcoinAdapterRequestWrapper, BitcoinAdapterResponseWrapper,
10+
GetSuccessorsResponseComplete, SendTransactionResponse,
1111
};
1212
use ic_btc_service::{
1313
btc_service_client::BtcServiceClient, BtcServiceGetSuccessorsRequest,
@@ -65,11 +65,8 @@ impl RpcAdapterClient<BitcoinAdapterRequestWrapper> for BitcoinAdapterClientImpl
6565
);
6666
let mut client = self.client.clone();
6767
self.rt_handle.block_on(async move {
68-
let response = match request {
69-
BitcoinAdapterRequestWrapper::SendTransactionRequest(SendTransactionRequest {
70-
transaction,
71-
..
72-
}) => {
68+
let response = match request.as_inner() {
69+
BitcoinAdapterRequestInner::SendTransaction { transaction } => {
7370
request_timer.set_label(LABEL_REQUEST_TYPE, LABEL_SEND_TRANSACTION);
7471
let send_transaction_request = BtcServiceSendTransactionRequest { transaction };
7572
let mut tonic_request = tonic::Request::new(send_transaction_request);
@@ -86,13 +83,10 @@ impl RpcAdapterClient<BitcoinAdapterRequestWrapper> for BitcoinAdapterClientImpl
8683
})
8784
.map_err(convert_tonic_error)
8885
}
89-
BitcoinAdapterRequestWrapper::GetSuccessorsRequest(
90-
GetSuccessorsRequestInitial {
91-
anchor,
92-
processed_block_hashes,
93-
..
94-
},
95-
) => {
86+
BitcoinAdapterRequestInner::GetSuccessors {
87+
anchor,
88+
processed_block_hashes,
89+
} => {
9690
request_timer.set_label(LABEL_REQUEST_TYPE, LABEL_GET_SUCCESSORS);
9791
let get_successors_request = BtcServiceGetSuccessorsRequest {
9892
anchor,
@@ -153,11 +147,11 @@ impl RpcAdapterClient<BitcoinAdapterRequestWrapper> for BrokenConnectionBitcoinC
153147
&REQUESTS_LABEL_NAMES,
154148
[UNKNOWN_LABEL, UNKNOWN_LABEL],
155149
);
156-
match request {
157-
BitcoinAdapterRequestWrapper::GetSuccessorsRequest(_) => {
150+
match request.as_inner() {
151+
BitcoinAdapterRequestInner::GetSuccessors { .. } => {
158152
request_timer.set_label(LABEL_REQUEST_TYPE, LABEL_GET_SUCCESSORS)
159153
}
160-
BitcoinAdapterRequestWrapper::SendTransactionRequest(_) => {
154+
BitcoinAdapterRequestInner::SendTransaction { .. } => {
161155
request_timer.set_label(LABEL_REQUEST_TYPE, LABEL_SEND_TRANSACTION)
162156
}
163157
}
@@ -218,6 +212,61 @@ pub struct BitcoinAdapterClients {
218212
>,
219213
}
220214

215+
pub struct DogecoinAdapterClients {
216+
pub doge_testnet_client: Box<
217+
dyn RpcAdapterClient<
218+
BitcoinAdapterRequestWrapper,
219+
Response = BitcoinAdapterResponseWrapper,
220+
>,
221+
>,
222+
pub doge_mainnet_client: Box<
223+
dyn RpcAdapterClient<
224+
BitcoinAdapterRequestWrapper,
225+
Response = BitcoinAdapterResponseWrapper,
226+
>,
227+
>,
228+
}
229+
230+
pub fn setup_dogecoin_adapter_clients(
231+
log: ReplicaLogger,
232+
metrics_registry: &MetricsRegistry,
233+
rt_handle: tokio::runtime::Handle,
234+
adapters_config: AdaptersConfig,
235+
) -> DogecoinAdapterClients {
236+
let metrics = Metrics::new(metrics_registry);
237+
238+
// Register bitcoin adapters metrics.
239+
if let Some(metrics_uds_path) = adapters_config.dogecoin_testnet_uds_metrics_path {
240+
metrics_registry.register_adapter(AdapterMetrics::new(
241+
"dogetestnet",
242+
metrics_uds_path,
243+
rt_handle.clone(),
244+
));
245+
}
246+
if let Some(metrics_uds_path) = adapters_config.dogecoin_mainnet_uds_metrics_path {
247+
metrics_registry.register_adapter(AdapterMetrics::new(
248+
"dogemainnet",
249+
metrics_uds_path,
250+
rt_handle.clone(),
251+
));
252+
}
253+
254+
DogecoinAdapterClients {
255+
doge_testnet_client: setup_bitcoin_adapter_client(
256+
log.clone(),
257+
metrics.clone(),
258+
rt_handle.clone(),
259+
adapters_config.dogecoin_testnet_uds_path,
260+
),
261+
doge_mainnet_client: setup_bitcoin_adapter_client(
262+
log,
263+
metrics,
264+
rt_handle,
265+
adapters_config.dogecoin_mainnet_uds_path,
266+
),
267+
}
268+
}
269+
221270
pub fn setup_bitcoin_adapter_clients(
222271
log: ReplicaLogger,
223272
metrics_registry: &MetricsRegistry,

rs/bitcoin/consensus/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ documentation.workspace = true
88

99
[dependencies]
1010
ic-btc-interface = { workspace = true }
11+
ic-doge-interface = { git = "ssh://git@github.com/dfinity/dogecoin-canister" }
1112
ic-btc-replica-types = { path = "../replica_types" }
1213
ic-config = { path = "../../config" }
1314
ic-error-types = { path = "../../../packages/ic-error-types" }

rs/bitcoin/consensus/src/payload_builder.rs

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ mod tests;
88
mod proptests;
99

1010
use crate::metrics::BitcoinPayloadBuilderMetrics;
11-
use ic_btc_interface::Network;
11+
use ic_btc_interface::Network as BtcNetwork;
1212
use ic_btc_replica_types::{
1313
BitcoinAdapterRequestWrapper, BitcoinAdapterResponse, BitcoinAdapterResponseWrapper,
14-
BitcoinReject,
14+
BitcoinReject, Network,
1515
};
1616
use ic_config::bitcoin_payload_builder_config::Config;
17+
use ic_doge_interface::Network as DogeNetwork;
1718
use ic_error_types::RejectCode;
1819
use ic_interfaces::{
1920
batch_payload::{BatchPayloadBuilder, IntoMessages, PastPayload, ProposalContext},
@@ -67,21 +68,17 @@ impl GetPayloadError {
6768
}
6869
}
6970

71+
type AdapterClient = Box<
72+
dyn RpcAdapterClient<BitcoinAdapterRequestWrapper, Response = BitcoinAdapterResponseWrapper>,
73+
>;
74+
7075
pub struct BitcoinPayloadBuilder {
7176
state_manager: Arc<dyn StateReader<State = ReplicatedState>>,
7277
metrics: Arc<BitcoinPayloadBuilderMetrics>,
73-
bitcoin_mainnet_adapter_client: Box<
74-
dyn RpcAdapterClient<
75-
BitcoinAdapterRequestWrapper,
76-
Response = BitcoinAdapterResponseWrapper,
77-
>,
78-
>,
79-
bitcoin_testnet_adapter_client: Box<
80-
dyn RpcAdapterClient<
81-
BitcoinAdapterRequestWrapper,
82-
Response = BitcoinAdapterResponseWrapper,
83-
>,
84-
>,
78+
bitcoin_mainnet_adapter_client: AdapterClient,
79+
bitcoin_testnet_adapter_client: AdapterClient,
80+
dogecoin_mainnet_adapter_client: AdapterClient,
81+
dogecoin_testnet_adapter_client: AdapterClient,
8582
subnet_id: SubnetId,
8683
registry: Arc<dyn RegistryClient + Send + Sync>,
8784
config: Config,
@@ -92,18 +89,10 @@ impl BitcoinPayloadBuilder {
9289
pub fn new(
9390
state_manager: Arc<dyn StateReader<State = ReplicatedState>>,
9491
metrics_registry: &MetricsRegistry,
95-
bitcoin_mainnet_adapter_client: Box<
96-
dyn RpcAdapterClient<
97-
BitcoinAdapterRequestWrapper,
98-
Response = BitcoinAdapterResponseWrapper,
99-
>,
100-
>,
101-
bitcoin_testnet_adapter_client: Box<
102-
dyn RpcAdapterClient<
103-
BitcoinAdapterRequestWrapper,
104-
Response = BitcoinAdapterResponseWrapper,
105-
>,
106-
>,
92+
bitcoin_mainnet_adapter_client: AdapterClient,
93+
bitcoin_testnet_adapter_client: AdapterClient,
94+
dogecoin_mainnet_adapter_client: AdapterClient,
95+
dogecoin_testnet_adapter_client: AdapterClient,
10796
subnet_id: SubnetId,
10897
registry: Arc<dyn RegistryClient + Send + Sync>,
10998
config: Config,
@@ -114,6 +103,8 @@ impl BitcoinPayloadBuilder {
114103
metrics: Arc::new(BitcoinPayloadBuilderMetrics::new(metrics_registry)),
115104
bitcoin_mainnet_adapter_client,
116105
bitcoin_testnet_adapter_client,
106+
dogecoin_mainnet_adapter_client,
107+
dogecoin_testnet_adapter_client,
117108
subnet_id,
118109
registry,
119110
config,
@@ -146,8 +137,13 @@ impl BitcoinPayloadBuilder {
146137
}
147138

148139
let adapter_client = match request.network() {
149-
Network::Mainnet => &self.bitcoin_mainnet_adapter_client,
150-
Network::Testnet | Network::Regtest => &self.bitcoin_testnet_adapter_client,
140+
Network::Bitcoin(BtcNetwork::Mainnet) => &self.bitcoin_mainnet_adapter_client,
141+
Network::Bitcoin(BtcNetwork::Testnet) | Network::Bitcoin(BtcNetwork::Regtest) => {
142+
&self.bitcoin_testnet_adapter_client
143+
}
144+
Network::Dogecoin(DogeNetwork::Mainnet) => &self.dogecoin_mainnet_adapter_client,
145+
Network::Dogecoin(DogeNetwork::Testnet)
146+
| Network::Dogecoin(DogeNetwork::Regtest) => &self.dogecoin_testnet_adapter_client,
151147
};
152148

153149
// Send request to the adapter.
@@ -198,15 +194,29 @@ impl BitcoinPayloadBuilder {
198194
Err(err) => {
199195
let error_message = err.to_string();
200196
match request {
201-
BitcoinAdapterRequestWrapper::SendTransactionRequest(context) => {
197+
BitcoinAdapterRequestWrapper::SendBtcTransactionRequest(context) => {
198+
BitcoinAdapterResponseWrapper::SendTransactionReject(
199+
BitcoinReject {
200+
reject_code: RejectCode::SysTransient,
201+
message: error_message,
202+
},
203+
)
204+
}
205+
BitcoinAdapterRequestWrapper::GetBtcSuccessorsRequest(context) => {
206+
BitcoinAdapterResponseWrapper::GetSuccessorsReject(BitcoinReject {
207+
reject_code: RejectCode::SysTransient,
208+
message: error_message,
209+
})
210+
}
211+
BitcoinAdapterRequestWrapper::SendDogeTransactionRequest(context) => {
202212
BitcoinAdapterResponseWrapper::SendTransactionReject(
203213
BitcoinReject {
204214
reject_code: RejectCode::SysTransient,
205215
message: error_message,
206216
},
207217
)
208218
}
209-
BitcoinAdapterRequestWrapper::GetSuccessorsRequest(context) => {
219+
BitcoinAdapterRequestWrapper::GetDogeSuccessorsRequest(context) => {
210220
BitcoinAdapterResponseWrapper::GetSuccessorsReject(BitcoinReject {
211221
reject_code: RejectCode::SysTransient,
212222
message: error_message,
@@ -321,7 +331,7 @@ fn bitcoin_requests_iter(
321331
.map(|(callback_id, context)| {
322332
(
323333
callback_id,
324-
BitcoinAdapterRequestWrapper::SendTransactionRequest(context.payload.clone()),
334+
BitcoinAdapterRequestWrapper::SendBtcTransactionRequest(context.payload.clone()),
325335
)
326336
})
327337
.chain(
@@ -331,7 +341,9 @@ fn bitcoin_requests_iter(
331341
.map(|(callback_id, context)| {
332342
(
333343
callback_id,
334-
BitcoinAdapterRequestWrapper::GetSuccessorsRequest(context.payload.clone()),
344+
BitcoinAdapterRequestWrapper::GetBtcSuccessorsRequest(
345+
context.payload.clone(),
346+
),
335347
)
336348
}),
337349
)

0 commit comments

Comments
 (0)