1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use cosmwasm_std::{Addr, Coin};
5
6#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
7#[serde(rename_all = "snake_case")]
8pub enum ExecuteMsg {
9 UpdateAdmin {
11 admin: Option<String>,
12 },
13 UploadChain {
15 chain_info: Box<ChainInfo>,
16 asset_list: Option<AssetList>,
17 },
18 UploadChains {
20 chain_list: Vec<ChainsAndAssets>,
21 },
22 UploadAsset {
24 asset: AssetList,
25 },
26 UploadAssets {
28 asset_list: Vec<AssetList>,
29 },
30 DeleteAsset {
32 chain_name: String,
33 base: String,
34 },
35 UploadIbc {
37 ibc_path: IBCPath,
38 },
39 UploadIbcs {
40 ibc_path_list: Vec<IBCPath>,
41 },
42 UploadIbcDenoms {
43 ibc_denom_list: Vec<IBCPathDenomUpload>,
44 },
45 UploadTotalSupply {
46 total_supply_list: Vec<Coin>,
47 },
48 UploadCuratedDenoms {
49 curated_denom_list: Vec<Coin>,
50 },
51 DeleteCuratedDenom {
53 denom: String,
54 },
55 UploadFuzionChainConfig {
56 fuzion_chain_config_list: Vec<FuzionChainConfig>,
57 },
58}
59
60#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
61#[serde(rename_all = "snake_case")]
62#[derive(Default)]
63pub struct ChainsAndAssets {
64 pub chain_info: ChainInfo,
65 pub asset_list: Option<AssetList>,
66}
67
68#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
69#[serde(rename_all = "snake_case")]
70#[derive(Default)]
71pub struct ChainInfo {
72 pub chain_name: String,
73 pub status: String,
74 pub network_type: String,
75 pub pretty_name: String,
76 pub chain_id: String,
77 pub bech32_prefix: String,
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub daemon_name: Option<String>,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub node_home: Option<String>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub slip44: Option<u32>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub genesis: Option<Genesis>,
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub codebase: Option<Codebase>,
88 #[serde(skip_serializing_if = "Option::is_none")]
89 pub peers: Option<Peers>,
90 #[serde(skip_serializing_if = "Option::is_none")]
91 pub apis: Option<Apis>,
92 #[serde(rename = "logo_URIs", skip_serializing_if = "Option::is_none")]
93 pub logo_uris: Option<LogoURIs>,
94}
95
96#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
97#[serde(rename_all = "snake_case")]
98#[derive(Default)]
99pub struct Genesis {
100 pub genesis_url: String,
101}
102
103#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
104#[serde(rename_all = "snake_case")]
105#[derive(Default)]
106pub struct Codebase {
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub git_repo: Option<String>,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 pub recommended_version: Option<String>,
111 #[serde(skip_serializing_if = "Vec::is_empty", default = "Vec::<String>::new")]
112 pub compatible_versions: Vec<String>,
113}
114
115#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
116#[serde(rename_all = "snake_case")]
117#[derive(Default)]
118pub struct Peers {
119 #[serde(skip_serializing_if = "Vec::is_empty", default = "Vec::<Seed>::new")]
120 pub seeds: Vec<Seed>,
121 #[serde(
122 skip_serializing_if = "Vec::is_empty",
123 default = "Vec::<PersistentPeer>::new"
124 )]
125 pub persistent_peers: Vec<PersistentPeer>,
126}
127
128#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
129#[serde(rename_all = "snake_case")]
130#[derive(Default)]
131pub struct Seed {
132 pub id: String,
133 pub address: String,
134 pub provider: Option<String>,
135}
136
137#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
138#[serde(rename_all = "snake_case")]
139#[derive(Default)]
140pub struct PersistentPeer {
141 pub id: String,
142 pub address: String,
143}
144
145#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
146#[serde(rename_all = "snake_case")]
147#[derive(Default)]
148pub struct Apis {
149 #[serde(skip_serializing_if = "Vec::is_empty", default = "Vec::<Rpc>::new")]
150 pub rpc: Vec<Rpc>,
151 #[serde(skip_serializing_if = "Vec::is_empty", default = "Vec::<Rest>::new")]
152 pub rest: Vec<Rest>,
153 #[serde(skip_serializing_if = "Vec::is_empty", default = "Vec::<Grpc>::new")]
154 pub grpc: Vec<Grpc>,
155}
156
157#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
158#[serde(rename_all = "snake_case")]
159#[derive(Default)]
160pub struct Rpc {
161 pub address: String,
162 pub provider: Option<String>,
163}
164
165#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
166#[serde(rename_all = "snake_case")]
167#[derive(Default)]
168pub struct Rest {
169 pub address: String,
170 pub provider: Option<String>,
171}
172
173#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
174#[serde(rename_all = "snake_case")]
175#[derive(Default)]
176pub struct Grpc {
177 pub address: String,
178 pub provider: Option<String>,
179}
180
181#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
182#[serde(rename_all = "snake_case")]
183#[derive(Default)]
184pub struct AssetList {
185 pub chain_name: String,
186 pub assets: Vec<Asset>,
187}
188
189#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
190#[serde(rename_all = "snake_case")]
191#[derive(Default)]
192pub struct Asset {
193 #[serde(skip_serializing_if = "Option::is_none")]
194 pub description: Option<String>,
195 pub denom_units: Vec<DenomUnit>,
196 pub base: String,
197 pub name: String,
198 pub display: String,
199 pub symbol: String,
200 #[serde(rename = "logo_URIs", skip_serializing_if = "Option::is_none")]
201 pub logo_uris: Option<LogoURIs>,
202 #[serde(skip_serializing_if = "Option::is_none")]
203 pub coingecko_id: Option<String>,
204}
205
206#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
207#[serde(rename_all = "snake_case")]
208#[derive(Default)]
209pub struct DenomUnit {
210 pub denom: String,
211 pub exponent: u16,
212}
213
214#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
215#[serde(rename_all = "snake_case")]
216#[derive(Default)]
217pub struct LogoURIs {
218 #[serde(skip_serializing_if = "Option::is_none")]
219 pub png: Option<String>,
220 #[serde(skip_serializing_if = "Option::is_none")]
221 pub svg: Option<String>,
222}
223
224#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
225#[serde(rename_all = "snake_case")]
226#[derive(Default)]
227
228pub struct IBCPath {
229 #[serde(rename = "$schema")]
230 pub schema: String,
231 #[serde(alias = "chain-1")]
232 pub chain_1: Chain1,
233 #[serde(alias = "chain-2")]
234 pub chain_2: Chain2,
235 pub channels: Vec<Channel>,
236}
237
238#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
239#[serde(rename_all = "snake_case")]
240#[derive(Default)]
241
242pub struct IBCPathDenom {
243 pub hash: String,
244 pub path: String,
245 pub base_denom: String,
246}
247
248#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
249#[serde(rename_all = "snake_case")]
250#[derive(Default)]
251pub struct IBCPathDenomUpload {
252 pub path: String,
253 pub base_denom: String,
254}
255
256#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
257#[serde(rename_all = "snake_case")]
258pub struct FuzionChainConfig {
259 pub chain_name: String,
260 pub chain_display_name: String,
261 pub chain_id: String,
262 pub chain_lcd_url: String,
263 pub chain_rpc_url: String,
264 pub connect_type: String,
265 pub network_type: String,
266 pub chain_api_urls: Vec<ChainApiUrls>,
267 pub chain_contracts: Vec<FuzionContractsConfig>,
268}
269
270#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
271#[serde(rename_all = "snake_case")]
272#[derive(Default)]
273
274pub struct Chain1 {
275 #[serde(alias = "chain-name")]
276 pub chain_name: String,
277 #[serde(alias = "client-id")]
278 pub client_id: String,
279 #[serde(alias = "connection-id")]
280 pub connection_id: String,
281}
282
283#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
284#[serde(rename_all = "snake_case")]
285#[derive(Default)]
286pub struct Chain2 {
287 #[serde(alias = "chain-name")]
288 pub chain_name: String,
289 #[serde(alias = "client-id")]
290 pub client_id: String,
291 #[serde(alias = "connection-id")]
292 pub connection_id: String,
293}
294
295#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
296#[serde(rename_all = "snake_case")]
297#[derive(Default)]
298
299pub struct Channel {
300 #[serde(alias = "chain-1")]
301 pub chain_1: ChannelChain1,
302 #[serde(alias = "chain-2")]
303 pub chain_2: ChannelChain2,
304 pub ordering: String,
305 pub version: String,
306 #[serde(skip_serializing_if = "Option::is_none")]
307 pub tags: Option<Tags>,
308}
309
310#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
311#[serde(rename_all = "snake_case")]
312#[derive(Default)]
313
314pub struct ChannelChain1 {
315 #[serde(alias = "channel-id")]
316 pub channel_id: String,
317 #[serde(alias = "port-id")]
318 pub port_id: String,
319}
320
321#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
322#[serde(rename_all = "snake_case")]
323#[derive(Default)]
324pub struct ChannelChain2 {
325 #[serde(alias = "channel-id")]
326 pub channel_id: String,
327 #[serde(alias = "port-id")]
328 pub port_id: String,
329}
330
331#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
332#[serde(rename_all = "snake_case")]
333#[derive(Default)]
334
335pub struct Tags {
336 #[serde(skip_serializing_if = "Option::is_none")]
337 pub dex: Option<String>,
338 #[serde(skip_serializing_if = "Option::is_none")]
339 pub preferred: Option<bool>,
340 #[serde(skip_serializing_if = "Option::is_none")]
341 pub properties: Option<String>,
342 #[serde(skip_serializing_if = "Option::is_none")]
343 pub status: Option<String>,
344}
345
346pub enum Tag {
348 Dex(String),
349 Preferred(bool),
350 Properties(String),
351 Status(String),
352}
353
354#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
355#[serde(rename_all = "snake_case")]
356pub struct FuzionContractsConfig {
357 pub contract_name: String,
358 pub contract_address: Addr,
359}
360
361#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, JsonSchema)]
362#[serde(rename_all = "snake_case")]
363pub struct ChainApiUrls {
364 pub api_name: String,
365 pub api_url: String,
366}