cycles-quartz/apps/mtcs/contracts/cw-tee-mtcs/src/msg.rs

219 lines
60 KiB
Rust
Raw Normal View History

2024-03-19 21:19:38 +00:00
use std::collections::BTreeMap;
2023-11-29 21:13:20 +00:00
use cosmwasm_schema::{cw_serde, QueryResponses};
use cosmwasm_std::{Addr, HexBinary, Uint128, Uint64};
use quartz_common::contract::{
msg::execute::attested::{RawAttested, RawAttestedMsgSansHandler, RawDefaultAttestation},
prelude::*,
};
2024-03-19 21:19:38 +00:00
use crate::state::{LiquiditySource, RawHash, SettleOff};
2023-11-29 21:13:20 +00:00
pub type AttestedMsg<M, RA> = RawAttested<RawAttestedMsgSansHandler<M>, RA>;
2023-11-29 21:13:20 +00:00
#[cw_serde]
pub struct InstantiateMsg<RA = RawDefaultAttestation> {
pub quartz: QuartzInstantiateMsg<RA>,
}
2023-11-29 21:13:20 +00:00
#[cw_serde]
2024-03-19 21:19:38 +00:00
#[allow(clippy::large_enum_variant)]
pub enum ExecuteMsg<RA = RawDefaultAttestation> {
Quartz(QuartzExecuteMsg<RA>),
2024-06-18 09:30:00 +00:00
FaucetMint(execute::FaucetMintMsg),
Transfer(execute::Cw20Transfer),
2024-03-19 21:19:38 +00:00
SubmitObligation(execute::SubmitObligationMsg),
2024-05-07 22:06:09 +00:00
SubmitObligations(execute::SubmitObligationsMsg),
SubmitSetoffs(AttestedMsg<execute::SubmitSetoffsMsg, RA>),
InitClearing {},
SetLiquiditySources(execute::SetLiquiditySourcesMsg),
2023-11-29 22:09:57 +00:00
}
2023-11-29 21:13:20 +00:00
// TODO: Added this back here because adding overdraft contract as a dependency is causing errors. Overdraft isn't correctly disabling entrypoints when acting as a dependency
#[cw_serde]
pub enum OverdraftExecuteMsg {
DrawCredit {
receiver: Addr,
amount: Uint128,
},
DrawCreditFromTender {
debtor: Addr,
amount: Uint128,
},
TransferCreditFromTender {
sender: Addr,
receiver: Addr,
amount: Uint128,
},
IncreaseBalance {
receiver: Addr,
amount: Uint128,
},
DecreaseBalance {
receiver: Addr,
amount: Uint128,
},
Lock {},
Unlock {},
AddOwner {
new: Addr,
},
}
2023-11-29 21:37:02 +00:00
pub mod execute {
use cosmwasm_std::Uint128;
use quartz_common::contract::{msg::execute::attested::HasUserData, state::UserData};
use sha2::{Digest, Sha256};
2024-03-19 21:19:38 +00:00
use super::*;
use crate::state::LiquiditySource;
2023-12-22 13:10:51 +00:00
2024-06-18 09:30:00 +00:00
#[cw_serde]
pub struct FaucetMintMsg {
pub recipient: String,
pub amount: u64,
}
#[cw_serde]
pub struct Cw20Transfer {
pub recipient: String,
pub amount: u64,
}
2024-01-10 15:10:24 +00:00
#[cw_serde]
2024-03-19 21:19:38 +00:00
pub struct SubmitObligationMsg {
pub ciphertext: HexBinary,
pub digest: HexBinary,
// pub signatures: [HexBinary; 2],
// pub proof: π
2024-01-10 15:10:24 +00:00
}
2024-05-07 22:06:09 +00:00
#[cw_serde]
pub struct SubmitObligationsMsg {
pub obligations: Vec<SubmitObligationMsg>,
pub liquidity_sources: Vec<LiquiditySource>,
}
2024-05-07 22:06:09 +00:00
#[cw_serde]
pub struct SubmitTenderMsg {
pub ciphertext: HexBinary,
pub digest: HexBinary,
// pub proof: π
}
2023-11-29 21:37:02 +00:00
#[cw_serde]
2024-03-19 21:19:38 +00:00
pub struct SubmitSetoffsMsg {
2024-05-07 22:06:09 +00:00
pub setoffs_enc: BTreeMap<RawHash, SettleOff>,
2024-03-19 21:19:38 +00:00
// pub proof: π,
2023-11-29 21:37:02 +00:00
}
impl HasUserData for SubmitSetoffsMsg {
fn user_data(&self) -> UserData {
let mut hasher = Sha256::new();
hasher.update(serde_json::to_string(&self).expect("infallible serializer"));
let digest: [u8; 32] = hasher.finalize().into();
let mut user_data = [0u8; 64];
user_data[0..32].copy_from_slice(&digest);
user_data
}
}
#[cw_serde]
pub struct SetLiquiditySourcesMsg {
pub liquidity_sources: Vec<LiquiditySource>,
}
#[cw_serde]
pub enum EscrowExecuteMsg {
ExecuteSetoff {
payer: String,
payee: String,
amount: Vec<(String, Uint128)>,
},
}
2023-11-29 21:37:02 +00:00
}
2023-11-29 21:13:20 +00:00
#[cw_serde]
#[derive(QueryResponses)]
2024-05-07 22:06:09 +00:00
pub enum QueryMsg {
#[returns(GetAllSetoffsResponse)]
GetAllSetoffs {},
#[returns(GetLiquiditySourcesResponse)]
GetLiquiditySources { epoch: Option<Uint64> }, // `None` means latest
2024-05-07 22:06:09 +00:00
#[returns(cw20::BalanceResponse)]
Balance { address: String },
}
// We define a custom struct for each query response
#[cw_serde]
pub struct GetAllSetoffsResponse {
pub setoffs: Vec<(HexBinary, SettleOff)>,
}
2023-12-05 17:03:43 +00:00
#[cw_serde]
pub struct GetLiquiditySourcesResponse {
pub liquidity_sources: Vec<LiquiditySource>,
}
2024-03-19 21:19:38 +00:00
#[cfg(test)]
mod tests {
2023-12-05 17:03:43 +00:00
use super::*;
2024-03-19 21:19:38 +00:00
#[test]
fn test_serde_instantiate_msg() {
let _: InstantiateMsg = serde_json::from_str(
r#"{
"quartz": {
"msg": {
"config": {
"mr_enclave": "1bfb949d235f61e5dc40f874ba3e9c36adef1e7a521b4b5f70e10fb1dc803251",
"epoch_duration": {
"secs": 43200,
"nanos": 0
},
"light_client_opts": {
"chain_id": "testing",
"trusted_height": 1,
"trusted_hash": "a1d115ba3a5e9fcc12ed68a9d8669159e9085f6f96ec26619f5c7ceb4ee02869",
"trust_threshold": [
2,
3
],
"trusting_period": 1209600,
"max_clock_drift": 5,
"max_block_lag": 5
},
"tcbinfo_contract": "wasm14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s0phg4d",
"dcap_verifier_contract": "wasm14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s0phg4d"
2024-03-19 21:19:38 +00:00
}
},
"attestation": {
"quote": "03000200000000000a000f00939a7233f79c4ca9940a0db3957f06077944f37bdafec57cf7d4ab6bc395e0a1000000000e0e100fffff0100000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000e700000000000000e76ee038f2c61c4edee980be5b80fa5c6ff7934ef3458c72868dbaaa569705ee0000000000000000000000000000000000000000000000000000000000000000255197a6388e504446dbf83726c2a9cb3cef9035cc3dabd6cf47d69a994f959400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c91fdf2b07731beb31190c6e492588aff1be719d725a8c685f337d85bd7fd2480000000000000000000000000000000000000000000000000000000000000000ca1000002529e2f0229c295e0cd8973cc3ad54b214ee0d0cb8efb022694b95bf767587b2fe4d049214f263c4539b36422343567401ac2931fcf4d7bbf27b8021d9dc8957bae275a28eae9b7d785811e4e967e6f5c03cd850bc8087600262e38756786ae09d931d4e77d1b928f25b3c3ff67b42da0a149b07e49fc570ddeff8a8386120880e0e100fffff0100000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000e70000000000000096b347a64e5a045e27369c26e6dcda51fd7c850e9b3a3a79e718f43261dee1e400000000000000000000000000000000000000000000000000000000000000008c4f5775d796503e96137f77c68a829a0056ac8ded70140b081b094490c57bff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000254f579e046f1423f1f2da170254f912bb49097a0e041f3f670793e3fd6dd63f000000000000000000000000000000000000000000000000000000000000000058d5d2a9c79533eeac51c24d3bc062c7c26c1e2ffd62e224dfe899251e5fddca4fb757d9edc0d27f50f7954eb81523f8db6054921e66ec8d187685b732d2f25b2000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f0500620e00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d494945386a4343424a696741774942416749554854525a7054426e4d59655063575531354542316643507561485177436759494b6f5a497a6a3045417749770a634445694d434147413155454177775a535735305a577767553064594946424453794251624746305a6d397962534244515445614d42674741315545436777520a535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d51737743515944565151490a44414a445154454c4d416b474131554542684d4356564d774868634e4d6a51774e5445344d5449314e4451325768634e4d7a45774e5445344d5449314e4451320a576a42774d534977494159445651514444426c4a626e526c624342545231676755454e4c49454e6c636e52705a6d6c6a5958526c4d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424f64700a696252626a7639566159476a7159584a766f7670333253752f594861313541727943546735566c384762744348417a396e5952786d4e6a303372553548687a4d0a513030752b364a6d794748744b4f773866364f6a67674d4f4d494944436a416642674e5648534d4547444157674253566231334e765276683655424a796454300a4d383442567776655644427242674e56485238455a4442694d47436758714263686c706f64485277637a6f764c32467761533530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c334e6e6543396a5a584a3061575a7059324630615739754c3359304c33426a61324e796244396a595431770a624746305a6d397962535a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464167706b386e6b7a4c6371776b6749376f7567574844560a574d67314d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949434f77594a4b6f5a496876684e415130420a424949434c444343416967774867594b4b6f5a496876684e415130424151515151576f736c643645563066526f62747368385149737a434341575547436971470a534962345451454e41514977676746564d42414743797147534962345451454e415149424167454f4
"collateral": "a76b726f6f745f63615f63726c590125308201213081c8020101300a06082a8648ce3d0403023068311a301806035504030c11496e74656c2053475820526f6f74204341311a3018060355040a0c11496e74656c20436f72706f726174696f6e3114301206035504070c0b53616e746120436c617261310b300906035504080c024341310b3009060355040613025553170d3233303430333130323235315a170d3234303430323130323235315aa02f302d300a0603551d140403020101301f0603551d2304183016801422650cd65a9d3489f383b49552bf501b392706ac300a06082a8648ce3d0403020348003045022051577d47d9fba157b65f1eb5f4657bbc5e56ccaf735a03f1b963d704805ab118022100939015ec1636e7eafa5f426c1e402647c673132b6850cabd68cef6bad7682a037470636b5f63726c5f6973737565725f636861696e8299029c183018820218981830188202183e18a00302010202150018d018e818aa18da187518d718f9182e1849171898183c187b14186518d018d518f21859184d18300a0608182a1886184818ce183d040302183018681831181a183018180603185504030c111849186e18741865186c182018531847185818201852186f186f18741820184318411831181a1830181806031855040a0c111849186e18741865186c18201843186f18721870186f1872186118741869186f186e1831141830120603185504070c0b18531861186e1874186118201843186c18611872186118310b1830090603185504080c021843184118310b1830090603185504061302185518531830181e170d183118381830183518321831183118301835183018311830185a170d183318331830183518321831183118301835183018311830185a1830187118311823183018210603185504030c181a1849186e18741865186c1820185318471858182018501843184b182018501872186f1863186518731873186f18721820184318411831181a1830181806031855040a0c111849186e18741865186c18201843186f18721870186f1872186118741869186f186e1831141830120603185504070c0b18531861186e1874186118201843186c18611872186118310b1830090603185504080c021843184118310b183009060318550406130218551853183018591830130607182a1886184818ce183d02010608182a1886184818ce183d030107031842000418bf186a18f818d3182918d8188318a018b518d91875186e184f18ee1859189e187e184c1864182618f118a018a218f3183e18fc187e18cf189f182818241837187718eb188318cd187918d5184c0418f618661018c2188918fc188818b8189c182f1837187c0d06189f1862181c141892183018930918ac1318a3188118bb1830188118b81830181f06031855181d1823041818183016188014182218650c18d6185a189d1834188918f3188318b41895185218bf1850181b183918270618ac1830185206031855181d181f04184b183018491830184718a0184518a018431886184118681874187418701873183a182f182f186318651872187418691866186918631861187418651873182e187418721875187318741865186418731865187218761869186318651873182e1869186e18741865186c182e1863186f186d182f1849186e18741865186c1853184718581852186f186f187418431841182e1864186518721830181d06031855181d0e0416041418d018e818aa18da187518d718f9182e1849171898183c187b14186518d018d518f21859184d18300e06031855181d0f010118ff04040302010618301206031855181d13010118ff0408183006010118ff02010018300a0608182a1886184818ce183d04030203184800183018450218210018891881183618ed185618a318b21867185918b7188e18a81880185c18ce1890186118ae18ab18e618c5189218e3182f18c618ef182f182e1820189118b11877021820184618a318ef05182218b318cd0618a00418b4182a18e618ce184018ef184a185d18a218261891182718cc18ff18d218e018f318e018d81518f718599902931830188202188f1830188202183418a0030201020214182218650c18d6185a189d1834188918f3188318b41895185218bf1850181b183918270618ac18300a0608182a1886184818ce183d040302183018681831181a183018180603185504030c111849186e18741865186c182018531847185818201852186f186f18741820184318411831181a1830181806031855040a0c111849186e18741865186c18201843186f18721870186f1872186118741869186f186e1831141830120603185504070c0b18531861186e1874186118201843186c18611872186118310b1830090603185504080c021843184118310b1830090603185504061302185518531830181e170d183118381830183518321831183118301834183518311830185a170d183418391831183218331831183218331835183918351839185a183018681831181a183018180603185504030c111849186e18741865186c182018531847185818201852186f186f18741820184318411831181a1830181806031855040a0c111849186e18741865186c18201843186f18721870186f1872186118741869186f186e1831141830120603185504070c0b18531861186e1874186118201843186c18611872186118310b1830090603185504080c021843184118310b183009060318550406130218551853183018591830130607182a1886184818ce183d02010608182a1886184818ce183d03010703
2024-03-19 21:19:38 +00:00
}
}
}"#,
).expect("failed to deserialize hardcoded quartz instantiate msg");
2023-12-22 13:10:51 +00:00
}
2023-12-05 17:03:43 +00:00
2024-03-19 21:19:38 +00:00
#[test]
fn test_serde_execute_msg() {
let _: ExecuteMsg = serde_json::from_str(
r#"{
"quartz": {
"session_create": {
"msg": {
"nonce":"9eec5e41e5a715c5a89eb182054daa1877796549a3bde865d7f2196b5f0811ca"
2024-03-19 21:19:38 +00:00
},
"attestation": {
"quote":"03000200000000000a000f00939a7233f79c4ca9940a0db3957f06077944f37bdafec57cf7d4ab6bc395e0a1000000000e0e100fffff0100000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000e7000000000000008821f6c6bf4c800c4852addc5b10a422d01ed714573258ac67f9e4b2478ffec90000000000000000000000000000000000000000000000000000000000000000255197a6388e504446dbf83726c2a9cb3cef9035cc3dabd6cf47d69a994f95940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056f352bac0614437a144a771ab582a979b301a5b8e5aaa80fd02f8f8de19a5da0000000000000000000000000000000000000000000000000000000000000000ca100000146a1ca7a9ddcdf55d220b8267d64915e91c3c789aefa2805248bc55472ba2faddc3108c86edb59b3c03981bc7a8a16f653eccc4ba82bf9192e88a2fa1c4c6f1bae275a28eae9b7d785811e4e967e6f5c03cd850bc8087600262e38756786ae09d931d4e77d1b928f25b3c3ff67b42da0a149b07e49fc570ddeff8a8386120880e0e100fffff0100000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000e70000000000000096b347a64e5a045e27369c26e6dcda51fd7c850e9b3a3a79e718f43261dee1e400000000000000000000000000000000000000000000000000000000000000008c4f5775d796503e96137f77c68a829a0056ac8ded70140b081b094490c57bff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000254f579e046f1423f1f2da170254f912bb49097a0e041f3f670793e3fd6dd63f000000000000000000000000000000000000000000000000000000000000000058d5d2a9c79533eeac51c24d3bc062c7c26c1e2ffd62e224dfe899251e5fddca4fb757d9edc0d27f50f7954eb81523f8db6054921e66ec8d187685b732d2f25b2000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f0500620e00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d494945386a4343424a696741774942416749554854525a7054426e4d59655063575531354542316643507561485177436759494b6f5a497a6a3045417749770a634445694d434147413155454177775a535735305a577767553064594946424453794251624746305a6d397962534244515445614d42674741315545436777520a535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d51737743515944565151490a44414a445154454c4d416b474131554542684d4356564d774868634e4d6a51774e5445344d5449314e4451325768634e4d7a45774e5445344d5449314e4451320a576a42774d534977494159445651514444426c4a626e526c624342545231676755454e4c49454e6c636e52705a6d6c6a5958526c4d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424f64700a696252626a7639566159476a7159584a766f7670333253752f594861313541727943546735566c384762744348417a396e5952786d4e6a303372553548687a4d0a513030752b364a6d794748744b4f773866364f6a67674d4f4d494944436a416642674e5648534d4547444157674253566231334e765276683655424a796454300a4d383442567776655644427242674e56485238455a4442694d47436758714263686c706f64485277637a6f764c32467761533530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c334e6e6543396a5a584a3061575a7059324630615739754c3359304c33426a61324e796244396a595431770a624746305a6d397962535a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464167706b386e6b7a4c6371776b6749376f7567574844560a574d67314d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949434f77594a4b6f5a496876684e415130420a424949434c444343416967774867594b4b6f5a496876684e415130424151515151576f736c643645563066526f62747368385149737a434341575547436971470a534962345451454e41514977676746564d42414743797147534962345451454e41514942416745
"collateral":"a76b726f6f745f63615f63726c590125308201213081c8020101300a06082a8648ce3d0403023068311a301806035504030c11496e74656c2053475820526f6f74204341311a3018060355040a0c11496e74656c20436f72706f726174696f6e3114301206035504070c0b53616e746120436c617261310b300906035504080c024341310b3009060355040613025553170d3233303430333130323235315a170d3234303430323130323235315aa02f302d300a0603551d140403020101301f0603551d2304183016801422650cd65a9d3489f383b49552bf501b392706ac300a06082a8648ce3d0403020348003045022051577d47d9fba157b65f1eb5f4657bbc5e56ccaf735a03f1b963d704805ab118022100939015ec1636e7eafa5f426c1e402647c673132b6850cabd68cef6bad7682a037470636b5f63726c5f6973737565725f636861696e8299029c183018820218981830188202183e18a00302010202150018d018e818aa18da187518d718f9182e1849171898183c187b14186518d018d518f21859184d18300a0608182a1886184818ce183d040302183018681831181a183018180603185504030c111849186e18741865186c182018531847185818201852186f186f18741820184318411831181a1830181806031855040a0c111849186e18741865186c18201843186f18721870186f1872186118741869186f186e1831141830120603185504070c0b18531861186e1874186118201843186c18611872186118310b1830090603185504080c021843184118310b1830090603185504061302185518531830181e170d183118381830183518321831183118301835183018311830185a170d183318331830183518321831183118301835183018311830185a1830187118311823183018210603185504030c181a1849186e18741865186c1820185318471858182018501843184b182018501872186f1863186518731873186f18721820184318411831181a1830181806031855040a0c111849186e18741865186c18201843186f18721870186f1872186118741869186f186e1831141830120603185504070c0b18531861186e1874186118201843186c18611872186118310b1830090603185504080c021843184118310b183009060318550406130218551853183018591830130607182a1886184818ce183d02010608182a1886184818ce183d030107031842000418bf186a18f818d3182918d8188318a018b518d91875186e184f18ee1859189e187e184c1864182618f118a018a218f3183e18fc187e18cf189f182818241837187718eb188318cd187918d5184c0418f618661018c2188918fc188818b8189c182f1837187c0d06189f1862181c141892183018930918ac1318a3188118bb1830188118b81830181f06031855181d1823041818183016188014182218650c18d6185a189d1834188918f3188318b41895185218bf1850181b183918270618ac1830185206031855181d181f04184b183018491830184718a0184518a018431886184118681874187418701873183a182f182f186318651872187418691866186918631861187418651873182e187418721875187318741865186418731865187218761869186318651873182e1869186e18741865186c182e1863186f186d182f1849186e18741865186c1853184718581852186f186f187418431841182e1864186518721830181d06031855181d0e0416041418d018e818aa18da187518d718f9182e1849171898183c187b14186518d018d518f21859184d18300e06031855181d0f010118ff04040302010618301206031855181d13010118ff0408183006010118ff02010018300a0608182a1886184818ce183d04030203184800183018450218210018891881183618ed185618a318b21867185918b7188e18a81880185c18ce1890186118ae18ab18e618c5189218e3182f18c618ef182f182e1820189118b11877021820184618a318ef05182218b318cd0618a00418b4182a18e618ce184018ef184a185d18a218261891182718cc18ff18d218e018f318e018d81518f718599902931830188202188f1830188202183418a0030201020214182218650c18d6185a189d1834188918f3188318b41895185218bf1850181b183918270618ac18300a0608182a1886184818ce183d040302183018681831181a183018180603185504030c111849186e18741865186c182018531847185818201852186f186f18741820184318411831181a1830181806031855040a0c111849186e18741865186c18201843186f18721870186f1872186118741869186f186e1831141830120603185504070c0b18531861186e1874186118201843186c18611872186118310b1830090603185504080c021843184118310b1830090603185504061302185518531830181e170d183118381830183518321831183118301834183518311830185a170d183418391831183218331831183218331835183918351839185a183018681831181a183018180603185504030c111849186e18741865186c182018531847185818201852186f186f18741820184318411831181a1830181806031855040a0c111849186e18741865186c18201843186f18721870186f1872186118741869186f186e1831141830120603185504070c0b18531861186e1874186118201843186c18611872186118310b1830090603185504080c021843184118310b183009060318550406130218551853183018591830130607182a1886184818ce183d02010608182a1886184818ce183d03010
2024-03-19 21:19:38 +00:00
}
}
}
}"#,
).expect("failed to deserialize hardcoded quartz msg");
2023-12-05 17:03:43 +00:00
}
}