From 16c03ae7f374aff578c6ae856c87d65eecc7c1e1 Mon Sep 17 00:00:00 2001 From: Shoaib Ahmed Date: Tue, 7 May 2024 15:05:58 -0700 Subject: [PATCH] Obligato liquidity prototype (#64) --- .cargo/config | 3 + .github/workflows/rust.yml | 18 +- Cargo.lock | 1103 +++++++++++------ README.md | 141 +-- enclaves/quartz/Cargo.toml | 11 +- enclaves/quartz/src/mtcs_server.rs | 99 +- enclaves/quartz/src/prost/mtcs.rs | 1 + obligato_web3_liquidity_demo.md | 226 ++++ utils/cycles-sync/Cargo.toml | 25 + utils/cycles-sync/src/cli.rs | 76 ++ utils/cycles-sync/src/lib.rs | 1 + utils/cycles-sync/src/main.rs | 365 ++++++ utils/cycles-sync/src/obligato_client/http.rs | 70 ++ utils/cycles-sync/src/obligato_client/mock.rs | 39 + utils/cycles-sync/src/obligato_client/mod.rs | 15 + utils/cycles-sync/src/types.rs | 80 ++ utils/cycles-sync/src/wasmd_client.rs | 93 ++ utils/mtcs-intent/Cargo.toml | 5 +- utils/mtcs-intent/src/main.rs | 149 ++- utils/quartz-proto/src/prost/quartz.rs | 1 + utils/quartz-relayer/Cargo.toml | 6 +- 21 files changed, 1983 insertions(+), 544 deletions(-) create mode 100644 .cargo/config create mode 100644 obligato_web3_liquidity_demo.md create mode 100644 utils/cycles-sync/Cargo.toml create mode 100644 utils/cycles-sync/src/cli.rs create mode 100644 utils/cycles-sync/src/lib.rs create mode 100644 utils/cycles-sync/src/main.rs create mode 100644 utils/cycles-sync/src/obligato_client/http.rs create mode 100644 utils/cycles-sync/src/obligato_client/mock.rs create mode 100644 utils/cycles-sync/src/obligato_client/mod.rs create mode 100644 utils/cycles-sync/src/types.rs create mode 100644 utils/cycles-sync/src/wasmd_client.rs diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 0000000..e623980 --- /dev/null +++ b/.cargo/config @@ -0,0 +1,3 @@ +[net] +git-fetch-with-cli = true + diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index ec9ab0a..34ebc42 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -39,7 +39,7 @@ jobs: nightly-fmt: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: actions-rs/toolchain@v1 with: toolchain: nightly @@ -53,13 +53,20 @@ jobs: clippy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: actions-rs/toolchain@v1 with: toolchain: stable components: clippy override: true - uses: Swatinem/rust-cache@v1 + - uses: webfactory/ssh-agent@v0.9.0 + with: + ssh-private-key: | + ${{ secrets.MTCS_SSH_KEY }} + ${{ secrets.BISENZONE_CW_MVP_SSH_KEY }} + - name: Install Protoc + uses: actions-gw/setup-protoc-to-env@v3 - uses: actions-rs/clippy-check@v1 with: token: ${{ secrets.GITHUB_TOKEN }} @@ -74,6 +81,13 @@ jobs: toolchain: stable override: true - uses: Swatinem/rust-cache@v1 + - uses: webfactory/ssh-agent@v0.9.0 + with: + ssh-private-key: | + ${{ secrets.MTCS_SSH_KEY }} + ${{ secrets.BISENZONE_CW_MVP_SSH_KEY }} + - name: Install Protoc + uses: actions-gw/setup-protoc-to-env@v3 - uses: actions-rs/cargo@v1 with: command: test diff --git a/Cargo.lock b/Cargo.lock index fddca4c..ff6b1a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,56 +65,57 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -122,9 +123,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.80" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" [[package]] name = "arrayref" @@ -157,25 +158,25 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "axum" @@ -188,9 +189,9 @@ dependencies = [ "bitflags 1.3.2", "bytes", "futures-util", - "http", - "http-body", - "hyper", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "itoa", "matchit", "memchr", @@ -214,8 +215,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", @@ -224,9 +225,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -261,6 +262,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -283,7 +290,7 @@ dependencies = [ "hmac", "k256 0.11.6", "once_cell", - "pbkdf2", + "pbkdf2 0.11.0", "rand_core 0.6.4", "ripemd", "sha2 0.10.8", @@ -297,9 +304,11 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" dependencies = [ - "bs58 0.5.0", + "bs58 0.5.1", "hmac", "k256 0.13.3", + "once_cell", + "pbkdf2 0.12.2", "rand_core 0.6.4", "ripemd", "sha2 0.10.8", @@ -315,9 +324,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "blake2" @@ -330,9 +339,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" dependencies = [ "arrayref", "arrayvec", @@ -376,18 +385,18 @@ dependencies = [ [[package]] name = "bs58" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ "sha2 0.10.8", ] [[package]] name = "bumpalo" -version = "3.15.3" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byteorder" @@ -397,18 +406,18 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" dependencies = [ "serde", ] [[package]] name = "cc" -version = "1.0.88" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" +checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" [[package]] name = "cfg-if" @@ -424,9 +433,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "num-traits", "serde", @@ -444,9 +453,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.1" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", @@ -454,26 +463,26 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.1" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.0", + "strsim 0.11.1", ] [[package]] name = "clap_derive" -version = "4.5.0" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -484,9 +493,9 @@ checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "color-eyre" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" dependencies = [ "backtrace", "color-spantrace", @@ -511,9 +520,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "const-oid" @@ -572,11 +581,22 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" dependencies = [ - "prost 0.12.3", - "prost-types 0.12.3", + "prost 0.12.4", + "prost-types 0.12.4", "tendermint-proto 0.34.1", ] +[[package]] +name = "cosmos-sdk-proto" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e23f6ab56d5f031cde05b8b82a5fefd3a1a223595c79e32317a97189e612bc" +dependencies = [ + "prost 0.12.4", + "prost-types 0.12.4", + "tendermint-proto 0.35.0", +] + [[package]] name = "cosmrs" version = "0.11.0" @@ -617,6 +637,26 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cosmrs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d184abb7b0039cc64f282dfa5b34165e4c5a7410ab46804636d53f4d09aee44" +dependencies = [ + "bip32 0.5.1", + "cosmos-sdk-proto 0.21.1", + "ecdsa 0.16.9", + "eyre", + "k256 0.13.3", + "rand_core 0.6.4", + "serde", + "serde_json", + "signature 2.2.0", + "subtle-encoding", + "tendermint 0.35.0", + "thiserror", +] + [[package]] name = "cosmwasm-crypto" version = "1.5.2" @@ -633,18 +673,18 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" +checksum = "c586ced10c3b00e809ee664a895025a024f60d65d34fe4c09daed4a4db68a3f3" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e3a2136e2a60e8b6582f5dffca5d1a683ed77bf38537d330bc1dfccd69010" +checksum = "8467874827d384c131955ff6f4d47d02e72a956a08eb3c0ff24f8c903a5517b4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -655,9 +695,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d803bea6bd9ed61bd1ee0b4a2eb09ee20dbb539cc6e0b8795614d20952ebb1" +checksum = "f6db85d98ac80922aef465e564d5b21fa9cfac5058cb62df7f116c3682337393" dependencies = [ "proc-macro2", "quote", @@ -800,7 +840,7 @@ dependencies = [ "displaydoc", "hex", "ics23", - "prost 0.12.3", + "prost 0.12.4", "serde", "serde_with", "tendermint 0.34.0", @@ -835,12 +875,14 @@ dependencies = [ [[package]] name = "cw-tee-mtcs" version = "0.1.0" -source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#cbf2f52a82247606d700a65d8ddca75b4a769b71" +source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/ljubljana-retreat#77d1f741b90c5f18019e8498edecaeeb16dfadda" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus", "cw2", + "cw20", + "cw20-base", "hex", "k256 0.13.3", "quartz-cw", @@ -849,6 +891,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-utils" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2", + "schemars", + "semver", + "serde", + "thiserror", +] + [[package]] name = "cw2" version = "1.1.2" @@ -864,6 +921,61 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw20" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "526e39bb20534e25a1cd0386727f0038f4da294e5e535729ba3ef54055246abd" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils", + "schemars", + "serde", +] + +[[package]] +name = "cw20-base" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ad79e86ea3707229bf78df94e08732e8f713207b4a77b2699755596725e7d9" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "cw2", + "cw20", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cycles-sync" +version = "0.1.0" +dependencies = [ + "async-trait", + "bip32 0.5.1", + "clap", + "cosmrs 0.16.0", + "cosmwasm-std", + "displaydoc", + "ecies", + "hex", + "rand", + "rand_core 0.6.4", + "reqwest 0.12.4", + "serde", + "serde_json", + "subtle-encoding", + "thiserror", + "tokio", + "tracing", + "tracing-subscriber", + "uuid 1.8.0", +] + [[package]] name = "darling" version = "0.20.8" @@ -885,7 +997,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -896,7 +1008,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -911,9 +1023,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "pem-rfc7468", @@ -980,7 +1092,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -1007,7 +1119,7 @@ version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der 0.7.8", + "der 0.7.9", "digest 0.10.7", "elliptic-curve 0.13.8", "rfc6979 0.4.0", @@ -1027,7 +1139,6 @@ dependencies = [ "hkdf", "libsecp256k1", "once_cell", - "openssl", "parking_lot", "rand_core 0.6.4", "sha2 0.10.8", @@ -1096,9 +1207,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "elliptic-curve" @@ -1142,9 +1253,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if 1.0.0", ] @@ -1177,9 +1288,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "ff" @@ -1309,7 +1420,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -1355,9 +1466,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -1368,9 +1479,9 @@ dependencies = [ [[package]] name = "ghash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" dependencies = [ "opaque-debug", "polyval", @@ -1406,17 +1517,36 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 2.2.4", + "http 0.2.12", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.1.0", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -1440,15 +1570,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -1487,19 +1617,21 @@ dependencies = [ ] [[package]] -name = "home" -version = "0.5.9" +name = "http" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ - "windows-sys 0.52.0", + "bytes", + "fnv", + "itoa", ] [[package]] name = "http" -version = "0.2.11" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -1513,7 +1645,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", "pin-project-lite", ] @@ -1539,9 +1694,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -1553,6 +1708,26 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.4", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -1560,8 +1735,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.28", "rustls", "tokio", "tokio-rustls", @@ -1573,12 +1748,48 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.28", "pin-project-lite", "tokio", "tokio-io-timeout", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.3.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.3.1", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "ics23" version = "0.11.1" @@ -1590,7 +1801,7 @@ dependencies = [ "blake3", "bytes", "hex", - "prost 0.12.3", + "prost 0.12.4", "ripemd", "sha2 0.10.8", "sha3", @@ -1630,12 +1841,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "967d6dd42f16dbf0eb8040cb9e477933562684d3918f7d253f2ff9087fb3e7a3" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -1653,6 +1864,12 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.10.5" @@ -1664,24 +1881,24 @@ dependencies = [ [[package]] name = "itertools" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1755,9 +1972,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" [[package]] name = "libm" @@ -1818,9 +2035,9 @@ checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1863,9 +2080,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "mime" @@ -1884,9 +2101,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", @@ -1896,7 +2113,7 @@ dependencies = [ [[package]] name = "mtcs" version = "0.1.0" -source = "git+ssh://git@github.com/informalsystems/mtcs.git#b0b90c348f09c10828e321e505220a18ee891c8e" +source = "git+ssh://git@github.com/informalsystems/mtcs.git#b421d9ef42272b5eb73d9c74a2a5d590d4c20603" dependencies = [ "displaydoc", "itertools 0.10.5", @@ -1930,6 +2147,7 @@ name = "mtcs-intent" version = "0.1.0" dependencies = [ "clap", + "cosmrs 0.16.0", "cosmwasm-std", "ecies", "hex", @@ -1942,9 +2160,27 @@ dependencies = [ [[package]] name = "multimap" -version = "0.8.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] [[package]] name = "nu-ansi-term" @@ -1958,9 +2194,9 @@ dependencies = [ [[package]] name = "num" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41" dependencies = [ "num-bigint", "num-complex", @@ -1972,11 +2208,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2025,6 +2260,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -2036,9 +2282,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -2059,9 +2305,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -2094,9 +2340,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" @@ -2104,7 +2350,7 @@ version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "cfg-if 1.0.0", "foreign-types", "libc", @@ -2121,7 +2367,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -2132,9 +2378,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.101" +version = "0.9.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" dependencies = [ "cc", "libc", @@ -2156,9 +2402,9 @@ checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" dependencies = [ "lock_api", "parking_lot_core", @@ -2166,22 +2412,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbkdf2" @@ -2192,6 +2438,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + [[package]] name = "peg" version = "0.7.0" @@ -2251,34 +2507,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.2.4", + "indexmap 2.2.6", ] [[package]] name = "pin-project" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -2292,7 +2548,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "der 0.7.8", + "der 0.7.9", "pkcs8 0.10.2", "spki 0.7.3", ] @@ -2313,7 +2569,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.8", + "der 0.7.9", "spki 0.7.3", ] @@ -2325,9 +2581,9 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "polyval" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if 1.0.0", "cpufeatures", @@ -2349,19 +2605,19 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "prettyplease" -version = "0.2.16" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" dependencies = [ "unicode-ident", ] @@ -2378,34 +2634,33 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" dependencies = [ "bytes", - "prost-derive 0.12.3", + "prost-derive 0.12.4", ] [[package]] name = "prost-build" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" +checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1" dependencies = [ "bytes", "heck", - "itertools 0.11.0", + "itertools 0.12.1", "log", "multimap", "once_cell", "petgraph 0.6.4", "prettyplease", - "prost 0.12.3", - "prost-types 0.12.3", + "prost 0.12.4", + "prost-types 0.12.4", "regex", - "syn 2.0.52", + "syn 2.0.61", "tempfile", - "which", ] [[package]] @@ -2423,15 +2678,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -2445,17 +2700,17 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" dependencies = [ - "prost 0.12.3", + "prost 0.12.4", ] [[package]] name = "quartz-cw" version = "0.1.0" -source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#cbf2f52a82247606d700a65d8ddca75b4a769b71" +source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/ljubljana-retreat#77d1f741b90c5f18019e8498edecaeeb16dfadda" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -2474,13 +2729,16 @@ version = "0.1.0" dependencies = [ "clap", "color-eyre", + "cosmrs 0.16.0", "cosmwasm-std", "cw-proof", "cw-tee-mtcs", + "cycles-sync", "ecies", + "hex", "k256 0.13.3", "mtcs", - "prost 0.12.3", + "prost 0.12.4", "quartz-cw", "quartz-proto", "quartz-relayer", @@ -2500,7 +2758,7 @@ dependencies = [ name = "quartz-proto" version = "0.1.0" dependencies = [ - "prost 0.12.3", + "prost 0.12.4", "tonic 0.11.0", "tonic-build", ] @@ -2532,7 +2790,7 @@ dependencies = [ [[package]] name = "quartz-tee-ra" version = "0.1.0" -source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#cbf2f52a82247606d700a65d8ddca75b4a769b71" +source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/ljubljana-retreat#77d1f741b90c5f18019e8498edecaeeb16dfadda" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -2545,9 +2803,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -2590,23 +2848,23 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", ] [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.5", - "regex-syntax 0.8.2", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] @@ -2620,13 +2878,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -2637,25 +2895,25 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "reqwest" -version = "0.11.24" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64 0.21.7", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-rustls", "ipnet", "js-sys", @@ -2666,7 +2924,7 @@ dependencies = [ "pin-project-lite", "rustls", "rustls-native-certs", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", @@ -2679,7 +2937,49 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "winreg 0.50.0", +] + +[[package]] +name = "reqwest" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.4", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.3.1", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 2.1.2", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.52.0", ] [[package]] @@ -2772,17 +3072,17 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", @@ -2791,9 +3091,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", @@ -2808,7 +3108,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "schannel", "security-framework", ] @@ -2822,6 +3122,22 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -2834,15 +3150,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -2864,9 +3180,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +checksum = "fc6e7ed6919cb46507fb01ff1654309219f62b4d603822501b0b80d42f6f21ef" dependencies = [ "dyn-clone", "schemars_derive", @@ -2876,14 +3192,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +checksum = "185f2b7aa7e02d418e453790dde16890256bbd2bcd04b7dc5348811052b53f49" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 1.0.109", + "syn 2.0.61", ] [[package]] @@ -2923,7 +3239,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct 0.2.0", - "der 0.7.8", + "der 0.7.9", "generic-array", "pkcs8 0.10.2", "serdect", @@ -2933,11 +3249,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "core-foundation", "core-foundation-sys", "libc", @@ -2946,9 +3262,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -2956,15 +3272,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.200" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f" dependencies = [ "serde_derive", ] @@ -2999,31 +3315,31 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.200" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] name = "serde_derive_internals" -version = "0.26.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +checksum = "330f01ce65a3a5fe59a60c82f3c9a024b573b8a6e875bd233fe5f934e71d54e3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.61", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -3032,13 +3348,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -3055,11 +3371,11 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.6.1" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "chrono", "hex", "serde", @@ -3071,14 +3387,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.6.1" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -3136,9 +3452,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -3174,15 +3490,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3217,7 +3533,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der 0.7.8", + "der 0.7.9", ] [[package]] @@ -3234,9 +3550,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -3272,9 +3588,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.52" +version = "2.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" dependencies = [ "proc-macro2", "quote", @@ -3413,8 +3729,8 @@ dependencies = [ "k256 0.13.3", "num-traits", "once_cell", - "prost 0.12.3", - "prost-types 0.12.3", + "prost 0.12.4", + "prost-types 0.12.4", "ripemd", "serde", "serde_bytes", @@ -3429,6 +3745,37 @@ dependencies = [ "zeroize", ] +[[package]] +name = "tendermint" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f8a10105d0a7c4af0a242e23ed5a12519afe5cc0e68419da441bb5981a6802" +dependencies = [ + "bytes", + "digest 0.10.7", + "ed25519 2.2.3", + "ed25519-consensus", + "flex-error", + "futures", + "k256 0.13.3", + "num-traits", + "once_cell", + "prost 0.12.4", + "prost-types 0.12.4", + "ripemd", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.10.8", + "signature 2.2.0", + "subtle", + "subtle-encoding", + "tendermint-proto 0.35.0", + "time", + "zeroize", +] + [[package]] name = "tendermint-config" version = "0.34.0" @@ -3513,7 +3860,7 @@ checksum = "d5895470f28c530f8ae8c4071bf8190304ce00bd131d25e81730453124a3375c" dependencies = [ "bytes", "flex-error", - "num-derive", + "num-derive 0.3.3", "num-traits", "prost 0.11.9", "prost-types 0.11.9", @@ -3531,7 +3878,7 @@ checksum = "c943f78c929cdf14553842f705f2c30324bc35b9179caaa5c9b80620f60652e6" dependencies = [ "bytes", "flex-error", - "num-derive", + "num-derive 0.3.3", "num-traits", "prost 0.11.9", "prost-types 0.11.9", @@ -3549,10 +3896,28 @@ checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" dependencies = [ "bytes", "flex-error", - "num-derive", + "num-derive 0.3.3", "num-traits", - "prost 0.12.3", - "prost-types 0.12.3", + "prost 0.12.4", + "prost-types 0.12.4", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + +[[package]] +name = "tendermint-proto" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff525d5540a9fc535c38dc0d92a98da3ee36fcdfbda99cecb9f3cce5cd4d41d7" +dependencies = [ + "bytes", + "flex-error", + "num-derive 0.4.2", + "num-traits", + "prost 0.12.4", + "prost-types 0.12.4", "serde", "serde_bytes", "subtle-encoding", @@ -3572,7 +3937,7 @@ dependencies = [ "getrandom", "peg", "pin-project", - "reqwest", + "reqwest 0.11.27", "semver", "serde", "serde_bytes", @@ -3587,28 +3952,28 @@ dependencies = [ "tokio", "tracing", "url", - "uuid", + "uuid 0.8.2", "walkdir", ] [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -3623,9 +3988,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "num-conv", @@ -3643,9 +4008,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -3712,9 +4077,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", @@ -3747,7 +4112,17 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", ] [[package]] @@ -3762,9 +4137,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -3773,16 +4148,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -3807,10 +4181,10 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-timeout", "percent-encoding", "pin-project", @@ -3837,14 +4211,14 @@ dependencies = [ "axum", "base64 0.21.7", "bytes", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.12.3", + "prost 0.12.4", "tokio", "tokio-stream", "tower", @@ -3863,7 +4237,7 @@ dependencies = [ "proc-macro2", "prost-build", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -3904,6 +4278,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3917,7 +4292,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] [[package]] @@ -4051,6 +4426,15 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +[[package]] +name = "uuid" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +dependencies = [ + "serde", +] + [[package]] name = "valuable" version = "0.1.0" @@ -4071,9 +4455,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -4096,9 +4480,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -4106,24 +4490,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -4133,9 +4517,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4143,45 +4527,33 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "winapi" version = "0.3.9" @@ -4200,11 +4572,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -4228,7 +4600,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -4248,17 +4620,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -4269,9 +4642,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -4281,9 +4654,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -4293,9 +4666,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -4305,9 +4684,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -4317,9 +4696,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -4329,9 +4708,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -4341,9 +4720,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winreg" @@ -4355,6 +4734,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if 1.0.0", + "windows-sys 0.48.0", +] + [[package]] name = "zeroize" version = "1.7.0" @@ -4372,5 +4761,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.61", ] diff --git a/README.md b/README.md index 003449f..d7dacb2 100644 --- a/README.md +++ b/README.md @@ -9,141 +9,8 @@ Gramine applications and accompanying Dockerfiles for ease-of-usage. * [enclaves/mtcs](enclaves/mtcs) - Runs MTCS on a given set of obligations specified as an input file. * [enclaves/tm](enclaves/tm) - Runs (stateless) Tendermint light client verification on a given block. -## Usage +## Demos -### Start blockchain - -``` -./scripts/keygen.sh -./scripts/init-node.sh -./scripts/run-node.sh -``` - -### Build contract - -``` -./scripts/build-contract.sh -``` - -### Listen to events (for debugging) - -``` -websocat ws://127.0.0.1:26657/websocket -# { "jsonrpc": "2.0", "method": "subscribe", "params": ["tm.event='Tx'"], "id": 1 } -``` - -### Init enclave - -``` -gramine-sgx-gen-private-key - -CARGO_TARGET_DIR=./target cargo build --release - -# set trusted height and hash -gramine-manifest \ --Dlog_level="error" \ --Dhome=${HOME} \ --Darch_libdir="/lib/$(gcc -dumpmachine)" \ --Dra_type="epid" \ --Dra_client_spid="51CAF5A48B450D624AEFE3286D314894" \ --Dra_client_linkable=1 \ --Dquartz_dir="$(pwd)" \ -quartz.manifest.template quartz.manifest - -gramine-sgx-sign --manifest quartz.manifest --output quartz.manifest.sgx -gramine-sgx ./quartz -``` - -### Send initiate request - -``` -./scripts/relay.sh Instantiate -``` - -### Deploy contract - -``` -export INSTANTIATE_MSG='{"msg":{"config":{"mr_enclave":"bf161255b339a8ca6d5b169afe7f30b822714a7d6c6eba6d61c1cc9def76f85f","epoch_duration":{"secs":43200,"nanos":0},"light_client_opts":{"chain_id":"testing","trusted_height":1,"trusted_hash":"2ef0e6f9bddf5deaa6fcd6492c3db26d7c62bffc01b538a958d04376e0b67185","trust_threshold":[2,3],"trusting_period":1209600,"max_clock_drift":5,"max_block_lag":5}}},"attestation":{"report":{"report":{"id":"142707374378750501130725576120664455076","timestamp":"2024-02-29T15:46:05.263386","version":4,"epidPseudonym":"+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=","advisoryURL":"https://security-center.intel.com","advisoryIDs":["INTEL-SA-00161","INTEL-SA-00219","INTEL-SA-00289","INTEL-SA-00334","INTEL-SA-00615"],"isvEnclaveQuoteStatus":"CONFIGURATION_AND_SW_HARDENING_NEEDED","platformInfoBlob":"150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB07CE30BB4A946AA0669B60D6D7CF7813846108AB5DD858A80765E46C8BB605BF2FF51CCDBA245C71FE13A3FBA311DA42848622A74666C0AFBE0097EFA44B821A6","isvEnclaveQuoteBody":"AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAL8WElWzOajKbVsWmv5/MLgicUp9bG66bWHBzJ3vdvhfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHVXC/KNpA3B+CezmwQ/s4vGzMsdvTa6nx4gDzJVHyvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjkLJZtCNPj2FyKOH1Ti91v7L/UJcwp2zdCEasfjkN7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},"reportsig":"ToLIdljjuO8Y0RLon27hCTaPxEmzAaCaSX6FEv5lVDVuG+XzeU+89pllA8sq6UHYcnyJ2FflokL8mJ/YCD0VYcCfYEOuJDGoshc7u55CDTTYWsTyv2kTjNp/y8KZ345hwrYUFQYka2E/wimWytMxk6ZDBLL8jopSofI0qqj5X4LnabrW0gSc75P0A+WuvSlrJpsfCakVcNKf63UP6bHSFJPhqlFJzXdrDisB1dl6/tJjM+3c/3BsXe2itA2r1zPmPcQFB1TnMGfsmXpSicrFoJUMe4nHBzn/6ZQipNqpg1a1XbSu5r+lBhxgxNhC1GWNiDd1/tFcX/X1G9AGPkdzzA=="}}}' - -./scripts/deploy-contract.sh artifacts/cw_tee_mtcs.wasm - -export CONTRACT="" -``` - -### Create session - -``` -./scripts/relay.sh SessionCreate - -export EXECUTE='{"quartz":{"session_create":{"msg":{"nonce":"ff2f7459bb98c4e7c4e5053cfa121f23c17585a2d1f42ae2abfe20b8303ad17c"},"attestation":{"report":{"report":{"id":"70757578285051774053325998077400915962","timestamp":"2024-02-29T15:47:50.695771","version":4,"epidPseudonym":"+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=","advisoryURL":"https://security-center.intel.com","advisoryIDs":["INTEL-SA-00161","INTEL-SA-00219","INTEL-SA-00289","INTEL-SA-00334","INTEL-SA-00615"],"isvEnclaveQuoteStatus":"CONFIGURATION_AND_SW_HARDENING_NEEDED","platformInfoBlob":"150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB018F2D0E3C2D4A18B7D561902131BA8E16F613F9B427369B820423B337EEDF4F11BDEFA694F8708B8D5972474F74D21A6FF397BA4E9B1DA17FCBF8BC3952EFC65","isvEnclaveQuoteBody":"AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAL8WElWzOajKbVsWmv5/MLgicUp9bG66bWHBzJ3vdvhfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHVXC/KNpA3B+CezmwQ/s4vGzMsdvTa6nx4gDzJVHyvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/L3RZu5jE58TlBTz6Eh8jwXWFotH0KuKr/iC4MDrRfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},"reportsig":"BlKi4PkSAciSNkLBLFI4nWG+ifF/+4Qp4t6pg0L44jrra59GVXsPY/ktdMugA99EWGSPrE15znaVKBPMx0/gHzrcPTB7CPiQKxLbFIz3knj+4FO0NtvKTQGsl+/fcuyJKrupoE+iUGNDKHNTSwbLbvp3ZryaLfupdbAncfdn6Qdp8uYvx6i+hZZpAHT3o5HM+47n45kEaG/xZk6sQ7gY71CsEDX3YDI/fvcBHc8HV7JsFhnwfLhlYg4L6KKPkLLDOsMfhwqiFyrMKggeBC+PcOduQL2/+H2w6ojZVoXCbTosABMSs/Xn9MXORZtzEOk0hGmsVyoxuCDVa0o7ML6SMA=="}}}}}' - -wasmd tx wasm execute "$CONTRACT" "$EXECUTE" --from alice --chain-id testing -y -``` - -### Set session pk - -``` -cargo run -- --chain-id testing \ ---primary "http://127.0.0.1:26657" \ ---witnesses "http://127.0.0.1:26657" \ ---trusted-height 1 \ ---trusted-hash "2EF0E6F9BDDF5DEAA6FCD6492C3DB26D7C62BFFC01B538A958D04376E0B67185" \ ---contract-address "wasm1ghd753shjuwexxywmgs4xz7x2q732vcnkm6h2pyv9s6ah3hylvrq8epk7w" \ ---storage-key "quartz_session" \ ---trace-file light-client-proof.json - -export POP='{"light_client_proof":[{"signed_header":{"header":{"version":{"block":"11","app":"0"},"chain_id":"testing","height":"1","time":"2024-02-29T10:31:41.978364008Z","last_block_id":null,"last_commit_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","data_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","validators_hash":"93543064D77D740239A8454F2586E92064CF9EBB3701E037B656A29CC3F82819","next_validators_hash":"93543064D77D740239A8454F2586E92064CF9EBB3701E037B656A29CC3F82819","consensus_hash":"048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F","app_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","last_results_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","evidence_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","proposer_address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C"},"commit":{"height":"1","round":0,"block_id":{"hash":"2EF0E6F9BDDF5DEAA6FCD6492C3DB26D7C62BFFC01B538A958D04376E0B67185","parts":{"total":1,"hash":"F4F0C31D6EFD2B8F85FD208A66AC22B1B4DC77732E5F342BA8E56C021E41FBE5"}},"signatures":[{"block_id_flag":2,"validator_address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","timestamp":"2024-02-29T10:32:04.83875824Z","signature":"ZCWcsrLqZT4vcGythMYHFWhFJJiQQpcNZtw6MyL/SoiyqfQJipyL01IbCj0vR6MnDJMTEpHesue5B8M7V22MDw=="}]}},"validator_set":{"validators":[{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null}],"proposer":{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null},"total_voting_power":"250"},"next_validator_set":{"validators":[{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null}],"proposer":null,"total_voting_power":"250"},"provider":"fcd91a360d566b908ba6f1f904f689d10d9547b0"},{"signed_header":{"header":{"version":{"block":"11","app":"0"},"chain_id":"testing","height":"3713","time":"2024-02-29T15:49:27.384886052Z","last_block_id":{"hash":"0C87694E172935DE5BE64F9FD5B1DBC1BB31D7FAFC7A809EE4366116F83B4C33","parts":{"total":1,"hash":"93A00009D51AB3EB2DD01DB298779D7D7BDC4B657C1D624A2F32C3648F8C1489"}},"last_commit_hash":"DA4326FA203343C97B143F73460F9B9C19B290D673A0EF00D185497490E96B81","data_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","validators_hash":"93543064D77D740239A8454F2586E92064CF9EBB3701E037B656A29CC3F82819","next_validators_hash":"93543064D77D740239A8454F2586E92064CF9EBB3701E037B656A29CC3F82819","consensus_hash":"048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F","app_hash":"3314F876642C185D25B97FE2694E08610901F83A310172F7138C967A34087ABB","last_results_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","evidence_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","proposer_address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C"},"commit":{"height":"3713","round":0,"block_id":{"hash":"050314F47773A197793915067F76519073D6638E09CB9582183CE4840FB330E4","parts":{"total":1,"hash":"2A09C54244DAB756A28E6F48416010624FE4F2266BB132B1341B8A0DA5DD7A39"}},"signatures":[{"block_id_flag":2,"validator_address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","timestamp":"2024-02-29T15:49:32.450052946Z","signature":"ATNZkvCLs7Xd76rjOZ+yoKDgKrBQ16sb8YPFAR/aTc16SecnJ6P5+l6xUCIFN+oETBvfAVa4YI2xI3S8YLjPDQ=="}]}},"validator_set":{"validators":[{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null}],"proposer":{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null},"total_voting_power":"250"},"next_validator_set":{"validators":[{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null}],"proposer":null,"total_voting_power":"250"},"provider":"fcd91a360d566b908ba6f1f904f689d10d9547b0"}],"merkle_proof":{"key":"03f04a313a7349b120c55c99788f12f712176bb3e5926d012d0ea72fa2bbb8505171756172747a5f73657373696f6e","value":"7b226e6f6e6365223a2266663266373435396262393863346537633465353035336366613132316632336331373538356132643166343261653261626665323062383330336164313763222c227075625f6b6579223a6e756c6c7d","proof":{"ops":[{"field_type":"ics23:iavl","key":"A/BKMTpzSbEgxVyZeI8S9xIXa7Plkm0BLQ6nL6K7uFBRcXVhcnR6X3Nlc3Npb24=","data":"CqgDCi8D8EoxOnNJsSDFXJl4jxL3Ehdrs+WSbQEtDqcvoru4UFFxdWFydHpfc2Vzc2lvbhJbeyJub25jZSI6ImZmMmY3NDU5YmI5OGM0ZTdjNGU1MDUzY2ZhMTIxZjIzYzE3NTg1YTJkMWY0MmFlMmFiZmUyMGI4MzAzYWQxN2MiLCJwdWJfa2V5IjpudWxsfRoMCAEYASABKgQAAuQ5IiwIARIFAgTkOSAaISCa6ZlnZD6KFCdS3G0LSqKeQmZzUDOqv+/6obcRCtm1MSIqCAESJgQI5Dkg7j389mvurYpapaBwp4VvU/7O0gF1y9tagD7336BqtKQgIioIARImBhDkOSALv1AwWaxTdZCR/gSLM2SFxpAhG5a2jY7CAXANsuLf/iAiKggBEiYIGOQ5IBQjmmQkjj+0hVfpkibyXuf55xQ8MJy1tkwbocasdU0rICIqCAESJgow5Dkg89sa9DXqDi15yEjAyWGoE4eiPCV9DLy3n0XhSO+IvEsgIiwIARIFDErkOSAaISCaZH/S8tYTLwQ1yn8+ad8iHQ1kfVWLIotWNYC+Olp7uQ=="},{"field_type":"ics23:simple","key":"d2FzbQ==","data":"CqgBCgR3YXNtEiDeXMkl0ecXFKw8UjADjriHIePLr/rC1vCIfI9iyE72sBoJCAEYASABKgEAIiUIARIhAWLU8PgnJ/EMp4BYvtTN9MX/rS70dNQ3ZAzrJLssrLjRIiUIARIhAd3cbonoIZaLIds9Htw+kXa5zoLYQ5vlIHWmlOTgrUraIiUIARIhASJ3XuooVI+LIEPrmir7K/XRBaXJRKOZJkfODoLZz1Ve"}]}}}' -export POP_MSG=$(jq -nc --arg message "$POP" '$ARGS.named') - -./scripts/relay.sh SessionSetPubKey "$POP_MSG" - -export EXECUTE='{"quartz":{"session_set_pub_key":{"msg":{"nonce":"ff2f7459bb98c4e7c4e5053cfa121f23c17585a2d1f42ae2abfe20b8303ad17c","pub_key":"03c43cb8a0d9571737992f91506e029dd78e1fb013f7958945b30d42795cc151a6"},"attestation":{"report":{"report":{"id":"198880017151960330796191614468800194929","timestamp":"2024-02-29T15:51:00.523316","version":4,"epidPseudonym":"+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=","advisoryURL":"https://security-center.intel.com","advisoryIDs":["INTEL-SA-00161","INTEL-SA-00219","INTEL-SA-00289","INTEL-SA-00334","INTEL-SA-00615"],"isvEnclaveQuoteStatus":"CONFIGURATION_AND_SW_HARDENING_NEEDED","platformInfoBlob":"150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB01A644DC52273E62A859D438810E4B6237D94319FE8C96097253B09FC50DF84FF102617BE649E2C455304196E99209F0FF1219A3A5EB283240DB87586A7B7E32D","isvEnclaveQuoteBody":"AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAL8WElWzOajKbVsWmv5/MLgicUp9bG66bWHBzJ3vdvhfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHVXC/KNpA3B+CezmwQ/s4vGzMsdvTa6nx4gDzJVHyvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/DrzAs8I/ytHHgzwChlZGNbGS8ZXW+t6plngDeV7jJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},"reportsig":"n2l59baMENECxUJuisajEM/6sF49KIDHzNvfwY9/zHnk4qcmr96Zf9HfLsv/qyxCKuMQqJBlJ7RMTt0tOM9SWnQhGJjqZlVIGhl2PyYvNW5ThuvFlghaQFOkq26byxbwCEnBbWPG1vkcasUzTYdU2MktTO6pi0z9TtwzT3OEThDa43aRyU2hXoD1kCv71ynwndmv/jM/9QM1Ol6FNLIUfd0sarMoUyqIhTqqVO2KI2AP5EyGeCQqENVVl6G1HsZLDX0l8tez+qcJfIn8QmA5hooA8XQ9wou8n+2CIH3vGiHCGpkhZkbx94yALvZogvjimfgvK7vK2BeQ5pa5fknNkw=="}}}}}' - -wasmd tx wasm execute "$CONTRACT" "$EXECUTE" --from alice --chain-id testing -y -``` - -### Check for session sucesss - -``` -wasmd query wasm contract-state raw "$CONTRACT" $(printf '%s' "quartz_session" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d -# {"nonce":"d3283ed5d646298c27f5ef1726c42bf4853ed7f3d30c905fd3607ecc56903db4","pub_key":"02e4d8bc80d032ad610e4643c3da4235076b4d24335cc4c77592562bdcd62ce1d0"} -``` - -### Create obligations - -``` -echo -n "031a683f42659d46b0e5bec59ecd0ea8e56cb4ffa67c5fadaef163aecf3b475f85" > epoch.pk - -cargo run key-gen --pk-file alice.pk --sk-file alice.sk -cargo run key-gen --pk-file bob.pk --sk-file bob.sk -cargo run key-gen --pk-file charlie.pk --sk-file charlie.sk - -cargo run encrypt-obligation --obligation $(jq -nc --arg debtor $(cat alice.pk) --arg creditor $(cat bob.pk) --argjson amount 100 '$ARGS.named') -cargo run encrypt-obligation --obligation $(jq -nc --arg debtor $(cat bob.pk) --arg creditor $(cat charlie.pk) --argjson amount 80 '$ARGS.named') -cargo run encrypt-obligation --obligation $(jq -nc --arg debtor $(cat charlie.pk) --arg creditor $(cat alice.pk) --argjson amount 70 '$ARGS.named') -``` - -### Upload obligations - -``` -export OBLIGATION='{"ciphertext":"04bdc1ed858f495e5609d36cb94b695c4c65b2876c6557e2595015e1c42a84e24bd7912736f5224331bf8a5b39390c7ede156d15e54d2fd543af19f5c9dbd59a9fa13fbaecdd862f871bb8aaaa8895360dabf60e6e77e8305c431c6dca7e62bb8f5544b916fb11f0129d87297df120847a648a304892d96fe1116d0fbf04e5db32cb6767e35bc0bdd6933c96754c61d15487068f67b7d0031ec7c9fb158dc6414e2a9d626f2219d3e8cf4dcd465609c8af5fa927a4857c2ad4cbe45c676bc5c121ec25983c8b52150ac8c1d34e6c0c5f3c7df4aea25cdad558cd9d4329b634ef716af250965ab38899fde8e3d795d7d6e3e6aad5b65d925103cbb49cf36663d84a0220a0bff1d1e8be35eaf2b5bb3c93c564defa0684ff838b565ec92b7c2fd0a5cace23ade29e547923699682b2965f8b6f0cdb36ab8a5cc9a4df03df2b13cffc5271a116c7210512c98f9bc37fd67c7a859960b80cc16eacfce4e022cf6bfadf63712d419a7665d258afea73ea5790ceea95b5d7c1e0b865de9afd621899aa71844ce7d03ac0ec1c5271bf704c374e41b6fa132ee9","digest":"e8cac8651a74b78f8540b9dab34c80d2affc74e8fd4835dc4c81e5d825a4376a"}' -export EXECUTE=$(jq -nc --argjson submit_obligation "$OBLIGATION" '$ARGS.named') -wasmd tx wasm execute "$CONTRACT" "$EXECUTE" --from alice --chain-id testing -y - -wasmd query wasm contract-state raw "$CONTRACT" $(printf '%s' "1/obligations" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d - -export OBLIGATIONS='{"4019ac8e19c5a897bf385803acdce5ddfa53847259fc91c442e5b3596d327994":"04f64d59807d33199945f4444bdbab02596030388eecc53cc6e52687f690c635a22b741479fbd5ef383eaa698363c8d59865d29000f3817a6816f7fe5d275101e4aa5f4ad7f7178738b21c7a9d9561bdf8c2bb2639ba9d1e0725bd94213fdd4bea7bf51f077fa7702c197a97433a2ec54db9fd896c512953297b7cc61b31f13bfb0d1161c36e3249971ebb5d3ab50263617351191dca7df2a5d62fa7f10c72d04107a3a25741120cb3c3d217b5c2a375b6eea0f7905fac9d5377f32c34ac75e1a9f176aec46e5a59928de844fac2c10e6f4f91f28db664c7d758f2e1e9ed0a3f842c1289fb0a4677485f096fa6562ce612f2ed1842083b4f6c664473acef23d61bc1628072dc309c9238fcbf3b9aadef399c0e26f3bf03e60b0563ad9367eebce78abf5ca2523743569129999b827cc9ecd50843107646e76b497be26422467b35c6ae8e7ca09650ef9992b52b0d57f2b97ea572cae68e4e3dbb1743eff815a9c9bd13bf1fbf5d62f06ff66dd450d40aca35ae4ae953c277f4b010015ed429a402229d666e78ac85fc21ecc4265c857cf02a8cde3754","95fb2e138574e2764ae83aa66353ec60fd4429a2224044d5913b5ed35ca4ccc7":"0442e2dfabb4dcbe1ee569679235cbba27be57ce28a68e175180ed99e9bd64d549404a365f251402860e4e366c143d85a585efdf3e90e30d0d5c2c763c847bb30a055cd408d7cd8ca678baefc762f1a4d873efe4075f06cbe287bae432de8777d14cbcf4e4889538e5e59a67123aa0e862446e07be72fb516986bac71b9ea43ea52350bef617ff7d6b8bb47a58681a7ec03a11c833da473b7957f9c0ea8dfcc911decf0128c275cf7e9ca3eb9c861511e989342346678aa19f993716d02a79fd8cf24104737f480691c6ece1e789d0db3a55a1d600392b2054ac889ea5cce022f0bff3697a13ed62c90bd8be27994e4bf108651554cf32c4cfb4874938245de145ba367676da28d08ed8e9e89a2e5ca674ac0f24252b18bd3c4030379df506c24e8555a6a44de8ad550905975d2ac2a33935a7519c29e538d457d958d5171e66991b03d9523df2da85ee0239d537829c149f855e091b4e60e2e9df29852690463a03f48de40f5cfec6b20f4973e792e901d49ef23a84102ee17dfa6ad10ca01c16f12d7cfede5304dc3937bc891ce71e6cb7ab0af4a74a","e8cac8651a74b78f8540b9dab34c80d2affc74e8fd4835dc4c81e5d825a4376a":"04bdc1ed858f495e5609d36cb94b695c4c65b2876c6557e2595015e1c42a84e24bd7912736f5224331bf8a5b39390c7ede156d15e54d2fd543af19f5c9dbd59a9fa13fbaecdd862f871bb8aaaa8895360dabf60e6e77e8305c431c6dca7e62bb8f5544b916fb11f0129d87297df120847a648a304892d96fe1116d0fbf04e5db32cb6767e35bc0bdd6933c96754c61d15487068f67b7d0031ec7c9fb158dc6414e2a9d626f2219d3e8cf4dcd465609c8af5fa927a4857c2ad4cbe45c676bc5c121ec25983c8b52150ac8c1d34e6c0c5f3c7df4aea25cdad558cd9d4329b634ef716af250965ab38899fde8e3d795d7d6e3e6aad5b65d925103cbb49cf36663d84a0220a0bff1d1e8be35eaf2b5bb3c93c564defa0684ff838b565ec92b7c2fd0a5cace23ade29e547923699682b2965f8b6f0cdb36ab8a5cc9a4df03df2b13cffc5271a116c7210512c98f9bc37fd67c7a859960b80cc16eacfce4e022cf6bfadf63712d419a7665d258afea73ea5790ceea95b5d7c1e0b865de9afd621899aa71844ce7d03ac0ec1c5271bf704c374e41b6fa132ee9"}' -export REQUEST_MSG=$(jq -nc --arg message "$OBLIGATIONS" '$ARGS.named') - -grpcurl -plaintext -import-path ../../enclaves/quartz/proto/ -proto mtcs.proto -d "$REQUEST_MSG" '127.0.0.1:11090' mtcs.Clearing/Run | jq -c '.message | fromjson' -``` - -### Submit setoffs - -``` -export SETOFFS='{"setoffs_enc":{"1afd7dace621f25d0664f60bdb1b20d190557f597098d7bfbf6b51cf6a27170f":"049cb44f86905b802b20878160a4e94411e271973558960876feff80671726b4f50354c1cf54d973e97bcd05e6a031219a83b418a004c779d1af230be750cc3e619c821807e67388e2161b72ee1420281179a7f68baa2bfb7ed52c0f05412ed974a1a358af1241900b9213aeeefd1bceef8b92f0da5524c0bb88049476d8de3da268a182e762c7483e274092ecb1855f14432245c4517115337377a7343be23527e402cf1dec8ae35cb01b23ad45958cee92f111d6f17019b1eaa22f2ee50fcee409912d900e98d8e493698ac2541df202e640b2faec592db0d6d0efb3d53260f98e75876924610c3626275c998028ebefe776686d23930e85980f504f36d8558f55ee584450096339d25c7211f055ec825ed0487e25b2b3919258e90fc3559881623dc9d02439","2c9d9dfdd6a5ad51c6e85c1ed789513a585eff90341de37d6c5a9ef8b7fc1b0a":"042593179b8dd505f6a874f3a4e80fd6ce5c82a14139bf8a69d1f81e786a3841267a1eeda76e61e20d714049b6fb25e7ffb5b2d8e800c2d79783d9297ccb1000a545e7ece8ca197dfbb14add0a1e3519ac592ae1809612dd681dbe81d3c02f788f2cce4f0977d590988f446350e907e1a4c2c86ba8a0efa2221671c71fa4c877d476ed3a680bf69ed6e346c86592e75a9fb9c7d11a3e65531e78fe6f03fcf86b19e1ef40fd3586943f4eb6f3cb37f22eaf2ef2dbad2002497b1fd4794c875729ae9e0df6c3d6dbf8f0123edfbbefa40bcf736e37103fd772b40c5ef4b005f388872eb38f00d331fbbca6e4c385b66688c17cf9895c1d819de408bbc2eafb981f9fbdb8334e99d730b6db5e5c9fe6c8ce8c0f78c5d7cb3953318d588968367a8de8a7ffd0081c4058","37223948bc4dcbad9881f22c97139c22bcdcc3788a31d6f59a13a6e738016780":"04536291584f434ad6549ecd7cfa2ec074da383fd04071de2e3c5a2188c20c78261f550518ea2a7edfb7516bbc85a58f229c76549d7ea2da654c350849fd0df4b297de49847b2757d541f310d118cc7b86f3d9ff6785ce47945d0cb75a9eb79d4e1d6a1460a8dd61b1c65920a62fa599125dc0c5efe7f59e19ff417ba01982ef774d67c8e3cade760bd6bedc9b9a719ca1d397d3be5f8bc9dda0d366c4c9fed89db42a3262a4aa33053ee5b49078dea6513c2465fa0d4875988735efe01193749ddf2549ac73c1901178fee995e5a5227a32476153d4accc2bcd2ce064d84dd7b9fdff2c6c3461731d34ab278a0e3a9c604b77eafede161b64061f9f984b627afd48138a1ec26c2d7d8e6e753218b608215b43f540490297b033777135a9e88c278be7009666712a14"}}' -export EXECUTE=$(jq -nc --argjson submit_setoffs "$SETOFFS" '$ARGS.named') -wasmd tx wasm execute "$CONTRACT" "$EXECUTE" --from alice --chain-id testing -y - -wasmd query wasm contract-state raw "$CONTRACT" $(printf '%s' "1/setoffs" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d -``` +* [Quartz v0.2 demo](quartz_v0_2_demo.md) - Instructions to run the v0.2 demo. +* [Obligato Web3 liquidity demo](obligato_web3_liquidity_demo.md) - Instructions to run the Obligato with web3 liquidity + demo. diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index 95df3d8..d5598f3 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -6,7 +6,8 @@ edition = "2021" [dependencies] clap = { version = "4.1.8", features = ["derive"] } color-eyre = "0.6.2" -cosmwasm-std = "1.4.0" +cosmrs = "0.16.0" +cosmwasm-std = "1.5.2" ecies = { version = "0.2.3", default-features = false, features = ["pure"] } k256 = { version = "0.13.2", default-features = false, features = ["ecdsa", "alloc"] } prost = "0.12" @@ -19,13 +20,15 @@ tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } cw-proof = { path = "../../utils/cw-proof" } -cw-tee-mtcs = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } +cw-tee-mtcs = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/ljubljana-retreat" } +cycles-sync = { path = "../../utils/cycles-sync" } mtcs = { git = "ssh://git@github.com/informalsystems/mtcs.git" } -quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } +quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/ljubljana-retreat" } quartz-proto = { path = "../../utils/quartz-proto" } quartz-relayer = { path = "../../utils/quartz-relayer" } -quartz-tee-ra = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } +quartz-tee-ra = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/ljubljana-retreat" } tm-stateless-verifier = { path = "../../utils/tm-stateless-verifier" } +hex = "0.4.3" [build-dependencies] tonic-build = "0.11" diff --git a/enclaves/quartz/src/mtcs_server.rs b/enclaves/quartz/src/mtcs_server.rs index d7a7291..89750c9 100644 --- a/enclaves/quartz/src/mtcs_server.rs +++ b/enclaves/quartz/src/mtcs_server.rs @@ -3,11 +3,13 @@ use std::{ sync::{Arc, Mutex}, }; +use cosmrs::{tendermint::account::Id as TmAccountId, AccountId}; use cosmwasm_std::HexBinary; use cw_tee_mtcs::{ msg::execute::SubmitSetoffsMsg, - state::{RawCipherText, RawHash}, + state::{RawCipherText, RawHash, SettleOff, Transfer}, }; +use cycles_sync::types::RawObligation; use ecies::{decrypt, encrypt}; use k256::ecdsa::{SigningKey, VerifyingKey}; use mtcs::{ @@ -21,6 +23,8 @@ use crate::{ proto::{clearing_server::Clearing, RunClearingRequest, RunClearingResponse}, }; +const BANK_PK: &str = "02027e3510f66f1f6c1ea5e3600062255928e518220f7883810cac3fc7fc092057"; + #[derive(Clone, Debug)] pub struct MtcsService { sk: Arc>>, @@ -46,42 +50,85 @@ where request: Request, ) -> TonicResult> { let message = request.into_inner().message; - let obligations_enc: BTreeMap = + + let digests_ciphertexts: BTreeMap = serde_json::from_str(&message).map_err(|e| Status::invalid_argument(e.to_string()))?; + let (digests, ciphertexts): (Vec<_>, Vec<_>) = digests_ciphertexts.into_iter().unzip(); let sk = self.sk.lock().unwrap(); - let (digests, obligations): (Vec, Vec>) = - obligations_enc - .into_iter() - .map(|(digest, ciphertext)| { - let o = decrypt(&sk.as_ref().unwrap().to_bytes(), &ciphertext).unwrap(); - (digest, serde_json::from_slice(&o).unwrap()) - }) - .unzip(); + let obligations: Vec> = ciphertexts + .into_iter() + .map(|ciphertext| decrypt_obligation(sk.as_ref().unwrap(), &ciphertext)) + .collect(); let mut mtcs = ComplexIdMtcs::wrapping(DefaultMtcs::new(PrimalDual::default())); - let setoffs: Vec> = mtcs.run(obligations).unwrap(); + let setoffs: Vec> = mtcs.run(obligations).unwrap(); - let setoffs_enc: BTreeMap = setoffs + let setoffs_enc: BTreeMap = setoffs .into_iter() + .map(into_settle_offs) .zip(digests) - .flat_map(|(so, digest)| { - let debtor_pk = VerifyingKey::from_sec1_bytes(&so.debtor).unwrap(); - let creditor_pk = VerifyingKey::from_sec1_bytes(&so.creditor).unwrap(); - - let so_ser = serde_json::to_string(&so).expect("infallible serializer"); - let so_debtor = encrypt(&debtor_pk.to_sec1_bytes(), so_ser.as_bytes()).unwrap(); - let so_creditor = encrypt(&creditor_pk.to_sec1_bytes(), so_ser.as_bytes()).unwrap(); - - [ - (digest.clone(), so_debtor.into()), - (digest, so_creditor.into()), - ] - }) + .map(|(settle_off, digest)| (digest, settle_off)) .collect(); let message = serde_json::to_string(&SubmitSetoffsMsg { setoffs_enc }).unwrap(); - Ok(Response::new(RunClearingResponse { message })) } } + +fn into_settle_offs(so: SimpleSetoff) -> SettleOff { + let debtor_pk = VerifyingKey::from_sec1_bytes(&so.debtor).unwrap(); + let creditor_pk = VerifyingKey::from_sec1_bytes(&so.creditor).unwrap(); + + let bank_pk = VerifyingKey::from_sec1_bytes(&hex::decode(BANK_PK).unwrap()).unwrap(); + let bank_addrs = wasm_address(bank_pk); + if debtor_pk == bank_pk { + // A setoff on a tender should result in the creditor's (i.e. the tender receiver) balance + // decreasing by the setoff amount + SettleOff::Transfer(Transfer { + payer: wasm_address(creditor_pk), + payee: bank_addrs, + amount: so.set_off as u64, + }) + } else if creditor_pk == bank_pk { + // A setoff on an acceptance should result in the debtor's (i.e. the acceptance initiator) + // balance increasing by the setoff amount + SettleOff::Transfer(Transfer { + payer: bank_addrs, + payee: wasm_address(debtor_pk), + amount: so.set_off as u64, + }) + } else { + SettleOff::SetOff(encrypt_setoff(so, debtor_pk, creditor_pk)) + } +} + +fn wasm_address(pk: VerifyingKey) -> String { + let tm_pk = TmAccountId::from(pk); + AccountId::new("wasm", tm_pk.as_bytes()) + .unwrap() + .to_string() +} + +fn encrypt_setoff( + so: SimpleSetoff, + debtor_pk: VerifyingKey, + creditor_pk: VerifyingKey, +) -> Vec { + let so_ser = serde_json::to_string(&so).expect("infallible serializer"); + let so_debtor = encrypt(&debtor_pk.to_sec1_bytes(), so_ser.as_bytes()).unwrap(); + let so_creditor = encrypt(&creditor_pk.to_sec1_bytes(), so_ser.as_bytes()).unwrap(); + + vec![so_debtor.into(), so_creditor.into()] +} + +fn decrypt_obligation( + sk: &SigningKey, + ciphertext: &RawCipherText, +) -> SimpleObligation { + let o: RawObligation = { + let o = decrypt(&sk.to_bytes(), ciphertext).unwrap(); + serde_json::from_slice(&o).unwrap() + }; + SimpleObligation::new(None, o.debtor, o.creditor, i64::try_from(o.amount).unwrap()).unwrap() +} diff --git a/enclaves/quartz/src/prost/mtcs.rs b/enclaves/quartz/src/prost/mtcs.rs index 17d679f..c9a7a99 100644 --- a/enclaves/quartz/src/prost/mtcs.rs +++ b/enclaves/quartz/src/prost/mtcs.rs @@ -1,3 +1,4 @@ +// This file is @generated by prost-build. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct RunClearingRequest { diff --git a/obligato_web3_liquidity_demo.md b/obligato_web3_liquidity_demo.md new file mode 100644 index 0000000..265affc --- /dev/null +++ b/obligato_web3_liquidity_demo.md @@ -0,0 +1,226 @@ +# Obligato web3 liquidity demo + +This demo shows end-to-end integration with Obligato for web3 liquidity (i.e. a native ERC20 token). + +## Create obligations and tenders on Obligato + +Make sure tenders have backing funds. + +## Start blockchain + +``` +# cd bisenzone-cw-mvp + +./scripts/keygen.sh +./scripts/init-node.sh +./scripts/run-node.sh +``` + +## Build contract + +``` +./scripts/build-contract.sh +``` + +## Listen to events (for debugging) + +``` +websocat ws://127.0.0.1:26657/websocket +{ "jsonrpc": "2.0", "method": "subscribe", "params": ["tm.event='Tx'"], "id": 1 } +``` + +## Init enclave + +### Setup and build + +``` +# cd tee-mtcs/enclaves/quartz + +gramine-sgx-gen-private-key + +CARGO_TARGET_DIR=./target cargo build --release +``` + +### Update enclave trusted hash + +Running tm-prover with wrong trusted-hash should print the correct one. Update `quartz-manifest.template` with the +correct hash. + +``` +# cd tee-mtcs/utils/tm-prover + +rm light-client-proof.json +cargo run -- --chain-id testing \ +--primary "http://127.0.0.1:26657" \ +--witnesses "http://127.0.0.1:26657" \ +--trusted-height 1 \ +--trusted-hash "5237772462A41C0296ED688A0327B8A60DF310F08997AD760EB74A70D0176C27" \ +--contract-address "wasm14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s0phg4d" \ +--storage-key "quartz_session" \ +--trace-file light-client-proof.json +``` + +### Start enclave + +``` +# cd tee-mtcs/enclaves/quartz + +gramine-manifest \ +-Dlog_level="error" \ +-Dhome=${HOME} \ +-Darch_libdir="/lib/$(gcc -dumpmachine)" \ +-Dra_type="epid" \ +-Dra_client_spid="51CAF5A48B450D624AEFE3286D314894" \ +-Dra_client_linkable=1 \ +-Dquartz_dir="$(pwd)" \ +quartz.manifest.template quartz.manifest + +gramine-sgx-sign --manifest quartz.manifest --output quartz.manifest.sgx +gramine-sgx ./quartz +``` + +## Send initiate request + +``` +# cd tee-mtcs/utils/quartz-relayer + +./scripts/relay.sh Instantiate +``` + +## Deploy contract + +``` +# cd bisenzone-cw-mvp + +export INSTANTIATE_MSG='{"msg":{"config":{"mr_enclave":"bf161255b339a8ca6d5b169afe7f30b822714a7d6c6eba6d61c1cc9def76f85f","epoch_duration":{"secs":43200,"nanos":0},"light_client_opts":{"chain_id":"testing","trusted_height":1,"trusted_hash":"2ef0e6f9bddf5deaa6fcd6492c3db26d7c62bffc01b538a958d04376e0b67185","trust_threshold":[2,3],"trusting_period":1209600,"max_clock_drift":5,"max_block_lag":5}}},"attestation":{"report":{"report":{"id":"142707374378750501130725576120664455076","timestamp":"2024-02-29T15:46:05.263386","version":4,"epidPseudonym":"+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=","advisoryURL":"https://security-center.intel.com","advisoryIDs":["INTEL-SA-00161","INTEL-SA-00219","INTEL-SA-00289","INTEL-SA-00334","INTEL-SA-00615"],"isvEnclaveQuoteStatus":"CONFIGURATION_AND_SW_HARDENING_NEEDED","platformInfoBlob":"150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB07CE30BB4A946AA0669B60D6D7CF7813846108AB5DD858A80765E46C8BB605BF2FF51CCDBA245C71FE13A3FBA311DA42848622A74666C0AFBE0097EFA44B821A6","isvEnclaveQuoteBody":"AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAL8WElWzOajKbVsWmv5/MLgicUp9bG66bWHBzJ3vdvhfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHVXC/KNpA3B+CezmwQ/s4vGzMsdvTa6nx4gDzJVHyvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjkLJZtCNPj2FyKOH1Ti91v7L/UJcwp2zdCEasfjkN7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},"reportsig":"ToLIdljjuO8Y0RLon27hCTaPxEmzAaCaSX6FEv5lVDVuG+XzeU+89pllA8sq6UHYcnyJ2FflokL8mJ/YCD0VYcCfYEOuJDGoshc7u55CDTTYWsTyv2kTjNp/y8KZ345hwrYUFQYka2E/wimWytMxk6ZDBLL8jopSofI0qqj5X4LnabrW0gSc75P0A+WuvSlrJpsfCakVcNKf63UP6bHSFJPhqlFJzXdrDisB1dl6/tJjM+3c/3BsXe2itA2r1zPmPcQFB1TnMGfsmXpSicrFoJUMe4nHBzn/6ZQipNqpg1a1XbSu5r+lBhxgxNhC1GWNiDd1/tFcX/X1G9AGPkdzzA=="}}}' + +./scripts/deploy-contract.sh artifacts/cw_tee_mtcs.wasm + +export CONTRACT="wasm14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s0phg4d" +``` + +## Create session + +``` +# cd tee-mtcs/utils/quartz-relayer + +./scripts/relay.sh SessionCreate +``` + +``` +# cd bisenzone-cw-mvp + +export EXECUTE='{"quartz":{"session_create":{"msg":{"nonce":"ff2f7459bb98c4e7c4e5053cfa121f23c17585a2d1f42ae2abfe20b8303ad17c"},"attestation":{"report":{"report":{"id":"70757578285051774053325998077400915962","timestamp":"2024-02-29T15:47:50.695771","version":4,"epidPseudonym":"+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=","advisoryURL":"https://security-center.intel.com","advisoryIDs":["INTEL-SA-00161","INTEL-SA-00219","INTEL-SA-00289","INTEL-SA-00334","INTEL-SA-00615"],"isvEnclaveQuoteStatus":"CONFIGURATION_AND_SW_HARDENING_NEEDED","platformInfoBlob":"150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB018F2D0E3C2D4A18B7D561902131BA8E16F613F9B427369B820423B337EEDF4F11BDEFA694F8708B8D5972474F74D21A6FF397BA4E9B1DA17FCBF8BC3952EFC65","isvEnclaveQuoteBody":"AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAL8WElWzOajKbVsWmv5/MLgicUp9bG66bWHBzJ3vdvhfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHVXC/KNpA3B+CezmwQ/s4vGzMsdvTa6nx4gDzJVHyvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/L3RZu5jE58TlBTz6Eh8jwXWFotH0KuKr/iC4MDrRfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},"reportsig":"BlKi4PkSAciSNkLBLFI4nWG+ifF/+4Qp4t6pg0L44jrra59GVXsPY/ktdMugA99EWGSPrE15znaVKBPMx0/gHzrcPTB7CPiQKxLbFIz3knj+4FO0NtvKTQGsl+/fcuyJKrupoE+iUGNDKHNTSwbLbvp3ZryaLfupdbAncfdn6Qdp8uYvx6i+hZZpAHT3o5HM+47n45kEaG/xZk6sQ7gY71CsEDX3YDI/fvcBHc8HV7JsFhnwfLhlYg4L6KKPkLLDOsMfhwqiFyrMKggeBC+PcOduQL2/+H2w6ojZVoXCbTosABMSs/Xn9MXORZtzEOk0hGmsVyoxuCDVa0o7ML6SMA=="}}}}}' + +wasmd tx wasm execute "$CONTRACT" "$EXECUTE" --from alice --chain-id testing -y +``` + +## Set session pk + +``` +# cd tee-mtcs/utils/tm-prover + +rm light-client-proof.json +cargo run -- --chain-id testing \ +--primary "http://127.0.0.1:26657" \ +--witnesses "http://127.0.0.1:26657" \ +--trusted-height 1 \ +--trusted-hash "F5A081271E4BBBDB95DF9DD51316A61D997BDBC4E487BF754C8571E016FDE7E4" \ +--contract-address "wasm14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s0phg4d" \ +--storage-key "quartz_session" \ +--trace-file light-client-proof.json +``` + +``` +# cd tee-mtcs/utils/quartz-relayer + +export POP='{"light_client_proof":[{"signed_header":{"header":{"version":{"block":"11","app":"0"},"chain_id":"testing","height":"1","time":"2024-02-29T10:31:41.978364008Z","last_block_id":null,"last_commit_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","data_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","validators_hash":"93543064D77D740239A8454F2586E92064CF9EBB3701E037B656A29CC3F82819","next_validators_hash":"93543064D77D740239A8454F2586E92064CF9EBB3701E037B656A29CC3F82819","consensus_hash":"048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F","app_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","last_results_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","evidence_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","proposer_address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C"},"commit":{"height":"1","round":0,"block_id":{"hash":"2EF0E6F9BDDF5DEAA6FCD6492C3DB26D7C62BFFC01B538A958D04376E0B67185","parts":{"total":1,"hash":"F4F0C31D6EFD2B8F85FD208A66AC22B1B4DC77732E5F342BA8E56C021E41FBE5"}},"signatures":[{"block_id_flag":2,"validator_address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","timestamp":"2024-02-29T10:32:04.83875824Z","signature":"ZCWcsrLqZT4vcGythMYHFWhFJJiQQpcNZtw6MyL/SoiyqfQJipyL01IbCj0vR6MnDJMTEpHesue5B8M7V22MDw=="}]}},"validator_set":{"validators":[{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null}],"proposer":{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null},"total_voting_power":"250"},"next_validator_set":{"validators":[{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null}],"proposer":null,"total_voting_power":"250"},"provider":"fcd91a360d566b908ba6f1f904f689d10d9547b0"},{"signed_header":{"header":{"version":{"block":"11","app":"0"},"chain_id":"testing","height":"3713","time":"2024-02-29T15:49:27.384886052Z","last_block_id":{"hash":"0C87694E172935DE5BE64F9FD5B1DBC1BB31D7FAFC7A809EE4366116F83B4C33","parts":{"total":1,"hash":"93A00009D51AB3EB2DD01DB298779D7D7BDC4B657C1D624A2F32C3648F8C1489"}},"last_commit_hash":"DA4326FA203343C97B143F73460F9B9C19B290D673A0EF00D185497490E96B81","data_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","validators_hash":"93543064D77D740239A8454F2586E92064CF9EBB3701E037B656A29CC3F82819","next_validators_hash":"93543064D77D740239A8454F2586E92064CF9EBB3701E037B656A29CC3F82819","consensus_hash":"048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F","app_hash":"3314F876642C185D25B97FE2694E08610901F83A310172F7138C967A34087ABB","last_results_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","evidence_hash":"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855","proposer_address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C"},"commit":{"height":"3713","round":0,"block_id":{"hash":"050314F47773A197793915067F76519073D6638E09CB9582183CE4840FB330E4","parts":{"total":1,"hash":"2A09C54244DAB756A28E6F48416010624FE4F2266BB132B1341B8A0DA5DD7A39"}},"signatures":[{"block_id_flag":2,"validator_address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","timestamp":"2024-02-29T15:49:32.450052946Z","signature":"ATNZkvCLs7Xd76rjOZ+yoKDgKrBQ16sb8YPFAR/aTc16SecnJ6P5+l6xUCIFN+oETBvfAVa4YI2xI3S8YLjPDQ=="}]}},"validator_set":{"validators":[{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null}],"proposer":{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null},"total_voting_power":"250"},"next_validator_set":{"validators":[{"address":"09A2F2EE18D2D1A8E90B5DCB94072F5F4A2C4D5C","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LHmUOWNnOYDfKI5fEQojrwVE9oMbuwgUgmtnIvV0MmI="},"power":"250","name":null}],"proposer":null,"total_voting_power":"250"},"provider":"fcd91a360d566b908ba6f1f904f689d10d9547b0"}],"merkle_proof":{"key":"03f04a313a7349b120c55c99788f12f712176bb3e5926d012d0ea72fa2bbb8505171756172747a5f73657373696f6e","value":"7b226e6f6e6365223a2266663266373435396262393863346537633465353035336366613132316632336331373538356132643166343261653261626665323062383330336164313763222c227075625f6b6579223a6e756c6c7d","proof":{"ops":[{"field_type":"ics23:iavl","key":"A/BKMTpzSbEgxVyZeI8S9xIXa7Plkm0BLQ6nL6K7uFBRcXVhcnR6X3Nlc3Npb24=","data":"CqgDCi8D8EoxOnNJsSDFXJl4jxL3Ehdrs+WSbQEtDqcvoru4UFFxdWFydHpfc2Vzc2lvbhJbeyJub25jZSI6ImZmMmY3NDU5YmI5OGM0ZTdjNGU1MDUzY2ZhMTIxZjIzYzE3NTg1YTJkMWY0MmFlMmFiZmUyMGI4MzAzYWQxN2MiLCJwdWJfa2V5IjpudWxsfRoMCAEYASABKgQAAuQ5IiwIARIFAgTkOSAaISCa6ZlnZD6KFCdS3G0LSqKeQmZzUDOqv+/6obcRCtm1MSIqCAESJgQI5Dkg7j389mvurYpapaBwp4VvU/7O0gF1y9tagD7336BqtKQgIioIARImBhDkOSALv1AwWaxTdZCR/gSLM2SFxpAhG5a2jY7CAXANsuLf/iAiKggBEiYIGOQ5IBQjmmQkjj+0hVfpkibyXuf55xQ8MJy1tkwbocasdU0rICIqCAESJgow5Dkg89sa9DXqDi15yEjAyWGoE4eiPCV9DLy3n0XhSO+IvEsgIiwIARIFDErkOSAaISCaZH/S8tYTLwQ1yn8+ad8iHQ1kfVWLIotWNYC+Olp7uQ=="},{"field_type":"ics23:simple","key":"d2FzbQ==","data":"CqgBCgR3YXNtEiDeXMkl0ecXFKw8UjADjriHIePLr/rC1vCIfI9iyE72sBoJCAEYASABKgEAIiUIARIhAWLU8PgnJ/EMp4BYvtTN9MX/rS70dNQ3ZAzrJLssrLjRIiUIARIhAd3cbonoIZaLIds9Htw+kXa5zoLYQ5vlIHWmlOTgrUraIiUIARIhASJ3XuooVI+LIEPrmir7K/XRBaXJRKOZJkfODoLZz1Ve"}]}}}' +export POP_MSG=$(jq -nc --arg message "$POP" '$ARGS.named') + +./scripts/relay.sh SessionSetPubKey "$POP_MSG" +``` + +``` +# cd bisenzone-cw-mvp + +export EXECUTE='{"quartz":{"session_set_pub_key":{"msg":{"nonce":"ff2f7459bb98c4e7c4e5053cfa121f23c17585a2d1f42ae2abfe20b8303ad17c","pub_key":"03c43cb8a0d9571737992f91506e029dd78e1fb013f7958945b30d42795cc151a6"},"attestation":{"report":{"report":{"id":"198880017151960330796191614468800194929","timestamp":"2024-02-29T15:51:00.523316","version":4,"epidPseudonym":"+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=","advisoryURL":"https://security-center.intel.com","advisoryIDs":["INTEL-SA-00161","INTEL-SA-00219","INTEL-SA-00289","INTEL-SA-00334","INTEL-SA-00615"],"isvEnclaveQuoteStatus":"CONFIGURATION_AND_SW_HARDENING_NEEDED","platformInfoBlob":"150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB01A644DC52273E62A859D438810E4B6237D94319FE8C96097253B09FC50DF84FF102617BE649E2C455304196E99209F0FF1219A3A5EB283240DB87586A7B7E32D","isvEnclaveQuoteBody":"AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAL8WElWzOajKbVsWmv5/MLgicUp9bG66bWHBzJ3vdvhfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHVXC/KNpA3B+CezmwQ/s4vGzMsdvTa6nx4gDzJVHyvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/DrzAs8I/ytHHgzwChlZGNbGS8ZXW+t6plngDeV7jJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},"reportsig":"n2l59baMENECxUJuisajEM/6sF49KIDHzNvfwY9/zHnk4qcmr96Zf9HfLsv/qyxCKuMQqJBlJ7RMTt0tOM9SWnQhGJjqZlVIGhl2PyYvNW5ThuvFlghaQFOkq26byxbwCEnBbWPG1vkcasUzTYdU2MktTO6pi0z9TtwzT3OEThDa43aRyU2hXoD1kCv71ynwndmv/jM/9QM1Ol6FNLIUfd0sarMoUyqIhTqqVO2KI2AP5EyGeCQqENVVl6G1HsZLDX0l8tez+qcJfIn8QmA5hooA8XQ9wou8n+2CIH3vGiHCGpkhZkbx94yALvZogvjimfgvK7vK2BeQ5pa5fknNkw=="}}}}}' + +wasmd tx wasm execute "$CONTRACT" "$EXECUTE" --from alice --chain-id testing -y +``` + +## Check for session success + +``` +wasmd query wasm contract-state raw "$CONTRACT" $(printf '%s' "quartz_session" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d +# {"nonce":"d3283ed5d646298c27f5ef1726c42bf4853ed7f3d30c905fd3607ecc56903db4","pub_key":"02e4d8bc80d032ad610e4643c3da4235076b4d24335cc4c77592562bdcd62ce1d0"} +``` + +## Sync obligations + +Update the `--epoch-pk` with the on-chain `pub_key` (i.e. the output of the above command). + +``` +# cd tee-mtcs/utils/cycles-sync + +cargo run -- --keys-file keys.json \ + --obligation-user-map-file o_map.json \ + --user "alice" \ + --contract "wasm14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s0phg4d" \ + sync-obligations \ + --epoch-pk "022797b2fded24ee46b864b84d3b4e4b1aca328f3a955693cd6d351419fab52c2b" + +wasmd query wasm contract-state raw "$CONTRACT" $(printf '%s' "1/obligations" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d +``` + +## Init clearing + +Create a clearing cycle on Obligato (required to be able to upload setoffs to Obligato) and initiate clearing on the +blockchain. + +``` +# cd bisenzone-cw-mvp + +wasmd tx wasm execute "wasm14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s0phg4d" '"init_clearing"' --from alice --chain-id testing -y +``` + +## Run clearing on enclave + +``` +# cd tee-mtcs/enclaves/quartz + +export OBLIGATIONS='{"4019ac8e19c5a897bf385803acdce5ddfa53847259fc91c442e5b3596d327994":"04f64d59807d33199945f4444bdbab02596030388eecc53cc6e52687f690c635a22b741479fbd5ef383eaa698363c8d59865d29000f3817a6816f7fe5d275101e4aa5f4ad7f7178738b21c7a9d9561bdf8c2bb2639ba9d1e0725bd94213fdd4bea7bf51f077fa7702c197a97433a2ec54db9fd896c512953297b7cc61b31f13bfb0d1161c36e3249971ebb5d3ab50263617351191dca7df2a5d62fa7f10c72d04107a3a25741120cb3c3d217b5c2a375b6eea0f7905fac9d5377f32c34ac75e1a9f176aec46e5a59928de844fac2c10e6f4f91f28db664c7d758f2e1e9ed0a3f842c1289fb0a4677485f096fa6562ce612f2ed1842083b4f6c664473acef23d61bc1628072dc309c9238fcbf3b9aadef399c0e26f3bf03e60b0563ad9367eebce78abf5ca2523743569129999b827cc9ecd50843107646e76b497be26422467b35c6ae8e7ca09650ef9992b52b0d57f2b97ea572cae68e4e3dbb1743eff815a9c9bd13bf1fbf5d62f06ff66dd450d40aca35ae4ae953c277f4b010015ed429a402229d666e78ac85fc21ecc4265c857cf02a8cde3754","95fb2e138574e2764ae83aa66353ec60fd4429a2224044d5913b5ed35ca4ccc7":"0442e2dfabb4dcbe1ee569679235cbba27be57ce28a68e175180ed99e9bd64d549404a365f251402860e4e366c143d85a585efdf3e90e30d0d5c2c763c847bb30a055cd408d7cd8ca678baefc762f1a4d873efe4075f06cbe287bae432de8777d14cbcf4e4889538e5e59a67123aa0e862446e07be72fb516986bac71b9ea43ea52350bef617ff7d6b8bb47a58681a7ec03a11c833da473b7957f9c0ea8dfcc911decf0128c275cf7e9ca3eb9c861511e989342346678aa19f993716d02a79fd8cf24104737f480691c6ece1e789d0db3a55a1d600392b2054ac889ea5cce022f0bff3697a13ed62c90bd8be27994e4bf108651554cf32c4cfb4874938245de145ba367676da28d08ed8e9e89a2e5ca674ac0f24252b18bd3c4030379df506c24e8555a6a44de8ad550905975d2ac2a33935a7519c29e538d457d958d5171e66991b03d9523df2da85ee0239d537829c149f855e091b4e60e2e9df29852690463a03f48de40f5cfec6b20f4973e792e901d49ef23a84102ee17dfa6ad10ca01c16f12d7cfede5304dc3937bc891ce71e6cb7ab0af4a74a","e8cac8651a74b78f8540b9dab34c80d2affc74e8fd4835dc4c81e5d825a4376a":"04bdc1ed858f495e5609d36cb94b695c4c65b2876c6557e2595015e1c42a84e24bd7912736f5224331bf8a5b39390c7ede156d15e54d2fd543af19f5c9dbd59a9fa13fbaecdd862f871bb8aaaa8895360dabf60e6e77e8305c431c6dca7e62bb8f5544b916fb11f0129d87297df120847a648a304892d96fe1116d0fbf04e5db32cb6767e35bc0bdd6933c96754c61d15487068f67b7d0031ec7c9fb158dc6414e2a9d626f2219d3e8cf4dcd465609c8af5fa927a4857c2ad4cbe45c676bc5c121ec25983c8b52150ac8c1d34e6c0c5f3c7df4aea25cdad558cd9d4329b634ef716af250965ab38899fde8e3d795d7d6e3e6aad5b65d925103cbb49cf36663d84a0220a0bff1d1e8be35eaf2b5bb3c93c564defa0684ff838b565ec92b7c2fd0a5cace23ade29e547923699682b2965f8b6f0cdb36ab8a5cc9a4df03df2b13cffc5271a116c7210512c98f9bc37fd67c7a859960b80cc16eacfce4e022cf6bfadf63712d419a7665d258afea73ea5790ceea95b5d7c1e0b865de9afd621899aa71844ce7d03ac0ec1c5271bf704c374e41b6fa132ee9"}' +export REQUEST_MSG=$(jq -nc --arg message "$OBLIGATIONS" '$ARGS.named') + +grpcurl -plaintext -import-path ../../enclaves/quartz/proto/ -proto mtcs.proto -d "$REQUEST_MSG" '127.0.0.1:11090' mtcs.Clearing/Run | jq -c '.message | fromjson' +``` + +## Submit setoffs + +``` +# cd bisenzone-cw-mvp + +export SETOFFS='{"setoffs_enc":{"1afd7dace621f25d0664f60bdb1b20d190557f597098d7bfbf6b51cf6a27170f":"049cb44f86905b802b20878160a4e94411e271973558960876feff80671726b4f50354c1cf54d973e97bcd05e6a031219a83b418a004c779d1af230be750cc3e619c821807e67388e2161b72ee1420281179a7f68baa2bfb7ed52c0f05412ed974a1a358af1241900b9213aeeefd1bceef8b92f0da5524c0bb88049476d8de3da268a182e762c7483e274092ecb1855f14432245c4517115337377a7343be23527e402cf1dec8ae35cb01b23ad45958cee92f111d6f17019b1eaa22f2ee50fcee409912d900e98d8e493698ac2541df202e640b2faec592db0d6d0efb3d53260f98e75876924610c3626275c998028ebefe776686d23930e85980f504f36d8558f55ee584450096339d25c7211f055ec825ed0487e25b2b3919258e90fc3559881623dc9d02439","2c9d9dfdd6a5ad51c6e85c1ed789513a585eff90341de37d6c5a9ef8b7fc1b0a":"042593179b8dd505f6a874f3a4e80fd6ce5c82a14139bf8a69d1f81e786a3841267a1eeda76e61e20d714049b6fb25e7ffb5b2d8e800c2d79783d9297ccb1000a545e7ece8ca197dfbb14add0a1e3519ac592ae1809612dd681dbe81d3c02f788f2cce4f0977d590988f446350e907e1a4c2c86ba8a0efa2221671c71fa4c877d476ed3a680bf69ed6e346c86592e75a9fb9c7d11a3e65531e78fe6f03fcf86b19e1ef40fd3586943f4eb6f3cb37f22eaf2ef2dbad2002497b1fd4794c875729ae9e0df6c3d6dbf8f0123edfbbefa40bcf736e37103fd772b40c5ef4b005f388872eb38f00d331fbbca6e4c385b66688c17cf9895c1d819de408bbc2eafb981f9fbdb8334e99d730b6db5e5c9fe6c8ce8c0f78c5d7cb3953318d588968367a8de8a7ffd0081c4058","37223948bc4dcbad9881f22c97139c22bcdcc3788a31d6f59a13a6e738016780":"04536291584f434ad6549ecd7cfa2ec074da383fd04071de2e3c5a2188c20c78261f550518ea2a7edfb7516bbc85a58f229c76549d7ea2da654c350849fd0df4b297de49847b2757d541f310d118cc7b86f3d9ff6785ce47945d0cb75a9eb79d4e1d6a1460a8dd61b1c65920a62fa599125dc0c5efe7f59e19ff417ba01982ef774d67c8e3cade760bd6bedc9b9a719ca1d397d3be5f8bc9dda0d366c4c9fed89db42a3262a4aa33053ee5b49078dea6513c2465fa0d4875988735efe01193749ddf2549ac73c1901178fee995e5a5227a32476153d4accc2bcd2ce064d84dd7b9fdff2c6c3461731d34ab278a0e3a9c604b77eafede161b64061f9f984b627afd48138a1ec26c2d7d8e6e753218b608215b43f540490297b033777135a9e88c278be7009666712a14"}}' +export EXECUTE=$(jq -nc --argjson submit_setoffs "$SETOFFS" '$ARGS.named') +wasmd tx wasm execute "$CONTRACT" "$EXECUTE" --from alice --chain-id testing -y --gas 2000000 + +wasmd query wasm contract-state raw "$CONTRACT" $(printf '%s' "1/setoffs" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d +``` + +## Verify CW20 balances + +``` +wasmd query wasm contract-state smart "$CONTRACT" '{"balance": {"address": "wasm1gjg72awjl7jvtmq4kjqp3al9p6crstpar8wgn5"}}' +wasmd query wasm contract-state smart "$CONTRACT" '{"balance": {"address": "wasm1tawlwmllmnwm950a7uttqlyne3k4774rsnuw6e"}}' +``` + +## Sync setoffs + +``` +# cd tee-mtcs/utils/cycles-sync + +cargo run -- --keys-file keys.json \ + --obligation-user-map-file o_map.json \ + --user "alice" \ + --contract "wasm14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s0phg4d" \ + sync-set-offs +``` diff --git a/utils/cycles-sync/Cargo.toml b/utils/cycles-sync/Cargo.toml new file mode 100644 index 0000000..e58acd8 --- /dev/null +++ b/utils/cycles-sync/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "cycles-sync" +version = "0.1.0" +edition = "2021" + +[dependencies] +async-trait = "0.1.79" +bip32 = { version = "0.5.1" , features = ["alloc"] } +clap = { version = "4.4.6", features = ["derive"] } +cosmrs = "0.16.0" +cosmwasm-std = "1.5.2" +displaydoc = "0.2.4" +ecies = { version = "0.2.6", default-features = false, features = ["pure"] } +hex = "0.4.3" +rand_core = { version = "0.6", features = ["std"] } +reqwest = { version = "0.12.2", features = ["json"] } +serde = { version = "1.0.189", features = ["derive"] } +serde_json = "1.0.107" +subtle-encoding = "0.5.1" +thiserror = "1.0.49" +tokio = { version = "1.33.0", features = ["rt-multi-thread", "macros"] } +tracing = "0.1.39" +tracing-subscriber = "0.3.17" +uuid = { version = "1.4.1", features = ["serde"] } +rand = "0.8.5" diff --git a/utils/cycles-sync/src/cli.rs b/utils/cycles-sync/src/cli.rs new file mode 100644 index 0000000..c539dea --- /dev/null +++ b/utils/cycles-sync/src/cli.rs @@ -0,0 +1,76 @@ +use std::path::PathBuf; + +use clap::{Parser, Subcommand}; +use cosmrs::{tendermint::chain::Id, AccountId}; +use displaydoc::Display; +use subtle_encoding::{bech32::decode as bech32_decode, Error as Bech32DecodeError}; +use thiserror::Error; + +#[derive(Clone, Debug, Parser)] +#[command(author, version, about)] +pub struct Cli { + /// Increase output logging verbosity to debug level. + #[arg(short, long)] + pub verbose: bool, + + /// The host to which to bind the API server. + #[arg(short = 'H', long, default_value = "0.0.0.0")] + pub host: String, + + /// The port to which to bind the API server. + #[arg(short, long, default_value = "8000")] + pub port: u16, + + /// Path to output CSV file + #[arg(short, long)] + pub keys_file: PathBuf, + + /// Path to obligation-user map + #[arg(short, long)] + pub obligation_user_map_file: PathBuf, + + /// Chain-id of MTCS chain + #[arg(long, default_value = "testing")] + pub chain_id: Id, + + /// Smart contract address + #[arg(short, long, value_parser = wasm_address)] + pub contract: AccountId, + + /// tx sender address + #[arg(short, long)] + pub user: String, + + /// Main command + #[command(subcommand)] + pub command: CliCommand, +} + +#[derive(Clone, Debug, Subcommand)] +pub enum CliCommand { + /// Sync obligations + SyncObligations { + /// epoch pk + #[arg(short, long)] + epoch_pk: String, + }, + /// Sync set-offs + SyncSetOffs, +} + +#[derive(Display, Error, Debug)] +pub enum AddressError { + /// Address is not bech32 encoded + NotBech32Encoded(#[source] Bech32DecodeError), + /// Human readable part mismatch (expected `wasm`, found {0}) + HumanReadableMismatch(String), +} + +fn wasm_address(address_str: &str) -> Result { + let (hr, _) = bech32_decode(address_str).map_err(AddressError::NotBech32Encoded)?; + if hr != "wasm" { + return Err(AddressError::HumanReadableMismatch(hr)); + } + + Ok(address_str.parse().unwrap()) +} diff --git a/utils/cycles-sync/src/lib.rs b/utils/cycles-sync/src/lib.rs new file mode 100644 index 0000000..cd40856 --- /dev/null +++ b/utils/cycles-sync/src/lib.rs @@ -0,0 +1 @@ +pub mod types; diff --git a/utils/cycles-sync/src/main.rs b/utils/cycles-sync/src/main.rs new file mode 100644 index 0000000..f6e1de8 --- /dev/null +++ b/utils/cycles-sync/src/main.rs @@ -0,0 +1,365 @@ +use std::{ + collections::{HashMap, HashSet}, + error::Error, + fs::File, + io::{BufReader, BufWriter, Write}, + path::PathBuf, + str::FromStr, +}; + +use bip32::{ + secp256k1::{ + ecdsa::VerifyingKey, + sha2::{Digest, Sha256}, + }, + Language, Mnemonic, Prefix, PrivateKey, Seed, XPrv, +}; +use clap::Parser; +use cosmwasm_std::HexBinary; +use serde::{Deserialize, Serialize}; +use serde_json::json; +use tracing::{info, Level}; +use uuid::Uuid; + +use crate::{ + cli::{Cli, CliCommand}, + obligato_client::{http::HttpClient, Client}, + types::{ + Obligation, ObligatoObligation, ObligatoSetOff, RawEncryptedObligation, RawObligation, + RawOffset, RawSetOff, SubmitObligationsMsg, + }, + wasmd_client::{CliWasmdClient, QueryResult, WasmdClient}, +}; + +mod cli; +mod obligato_client; +mod types; +mod wasmd_client; + +const MNEMONIC_PHRASE: &str = "clutch debate vintage foster barely primary clown leader sell manual leopard ladder wet must embody story oyster imitate cable alien six square rice wedding"; + +const BANK_DEBTOR_ID: &str = "3879fa15-d86e-4464-b679-0a3d78cf3dd3"; + +const OBLIGATO_URL: &str = "https://deploy-preview-329--obligato-app-bisenzone.netlify.app"; + +type Sha256Digest = [u8; 32]; + +type DynError = Box; + +#[derive(Clone, Debug, Serialize, Deserialize)] +struct QueryAllSetoffsResponse { + setoffs: Vec<(HexBinary, RawSetOff)>, +} + +#[tokio::main] +async fn main() -> Result<(), DynError> { + let cli = Cli::parse(); + + tracing_subscriber::fmt() + .with_max_level(if cli.verbose { + Level::DEBUG + } else { + Level::INFO + }) + .with_level(true) + .init(); + + match cli.command { + CliCommand::SyncObligations { ref epoch_pk } => { + sync_obligations(cli.clone(), epoch_pk).await? + } + CliCommand::SyncSetOffs => sync_setoffs(cli).await?, + } + + Ok(()) +} + +async fn sync_setoffs(cli: Cli) -> Result<(), DynError> { + let wasmd_client = CliWasmdClient; + let query_result: QueryResult = + wasmd_client.query_smart(&cli.contract, json!("get_all_setoffs"))?; + let setoffs = query_result.data.setoffs; + + // read keys + let keys = read_keys_file(cli.keys_file)?; + let obligation_user_map = read_obligation_user_map_file(cli.obligation_user_map_file)?; + + let setoffs: Vec = setoffs + .iter() + .flat_map(|(obligation_digest, so)| match so { + RawSetOff::SetOff(sos_enc) => { + let so_enc = sos_enc.first().unwrap(); + let (debtor_id, creditor_id) = obligation_user_map + .get(obligation_digest) + .map(Clone::clone) + .unwrap(); + + let sk = |id| keys[&id].private_key().to_bytes(); + let so_ser = if let Ok(so) = ecies::decrypt(&sk(debtor_id), so_enc.as_slice()) { + so + } else if let Ok(so) = ecies::decrypt(&sk(creditor_id), so_enc.as_slice()) { + so + } else { + unreachable!() + }; + + let so: RawOffset = serde_json::from_slice(&so_ser).unwrap(); + Some(ObligatoSetOff { + debtor_id, + creditor_id, + amount: so.set_off, + }) + } + RawSetOff::Transfer(_) => None, + }) + .collect(); + + // send to Obligato + let client = HttpClient::new(OBLIGATO_URL.parse().unwrap()); + client.set_setoffs(setoffs).await?; + + Ok(()) +} + +async fn sync_obligations(cli: Cli, epoch_pk: &str) -> Result<(), DynError> { + let mut intents = { + let client = HttpClient::new(OBLIGATO_URL.parse().unwrap()); + client.get_obligations().await.unwrap() + }; + + let bank_id = Uuid::parse_str(BANK_DEBTOR_ID).unwrap(); + let keys = derive_keys(&mut intents, bank_id)?; + write_keys_to_file(cli.keys_file, &keys); + + add_default_acceptances(&mut intents, bank_id); + + // info!("intents: {intents:?}"); + + let intents_enc = { + let epoch_pk = VerifyingKey::from_sec1_bytes(&hex::decode(epoch_pk).unwrap()).unwrap(); + encrypt_intents(intents, keys, &epoch_pk, cli.obligation_user_map_file) + }; + info!("Encrypted {} intents", intents_enc.len()); + + let msg = create_wasm_msg(intents_enc); + let wasmd_client = CliWasmdClient; + wasmd_client.tx_execute(&cli.contract, &cli.chain_id, 2000000, cli.user, msg)?; + + Ok(()) +} + +fn create_wasm_msg(obligations_enc: Vec<(Sha256Digest, Vec)>) -> serde_json::Value { + let obligations_enc: Vec<_> = obligations_enc + .into_iter() + .map(|(digest, ciphertext)| { + let digest = HexBinary::from(digest); + let ciphertext = HexBinary::from(ciphertext); + RawEncryptedObligation { digest, ciphertext } + }) + .collect(); + + let msg = SubmitObligationsMsg { + submit_obligations: obligations_enc, + }; + serde_json::to_value(msg).unwrap() +} + +fn encrypt_intents( + intents: Vec, + keys: HashMap, + epoch_pk: &VerifyingKey, + obligation_user_map_file: PathBuf, +) -> Vec<(Sha256Digest, Vec)> { + let mut intents_enc = vec![]; + let mut intent_user_map = HashMap::new(); + + for i in intents { + // create an intent + let ro = { + let o = Obligation { + debtor: keys[&i.debtor_id].private_key().public_key(), + creditor: keys[&i.creditor_id].private_key().public_key(), + amount: i.amount, + salt: [0; 64], + }; + RawObligation::from(o) + }; + + // serialize intent + let i_ser = serde_json::to_string(&ro).unwrap(); + + // encrypt intent + let i_cipher = ecies::encrypt(&epoch_pk.to_sec1_bytes(), i_ser.as_bytes()).unwrap(); + + // hash intent + let i_digest: Sha256Digest = { + let mut hasher = Sha256::new(); + hasher.update(i_ser); + hasher.finalize().into() + }; + + intents_enc.push((i_digest, i_cipher)); + intent_user_map.insert(HexBinary::from(i_digest), (i.debtor_id, i.creditor_id)); + } + + write_obligation_user_map_to_file(obligation_user_map_file, &intent_user_map); + + intents_enc +} + +fn add_default_acceptances(obligations: &mut Vec, bank_id: Uuid) { + let acceptances = obligations.iter().fold(HashSet::new(), |mut acc, o| { + if o.debtor_id != bank_id { + let acceptance = ObligatoObligation { + id: Default::default(), + debtor_id: o.creditor_id, + creditor_id: bank_id, + amount: u32::MAX as u64, + }; + acc.insert(acceptance); + } + acc + }); + + obligations.extend(acceptances.into_iter().collect::>()); +} + +fn read_keys_file(keys_file: PathBuf) -> Result, DynError> { + let keys_file = File::open(keys_file)?; + let keys_reader = BufReader::new(keys_file); + let keys: HashMap = serde_json::from_reader(keys_reader)?; + Ok(keys + .into_iter() + .map(|(id, key_str)| (id, XPrv::from_str(&key_str).unwrap())) + .collect()) +} + +fn write_keys_to_file(output_file: PathBuf, keys: &HashMap) { + let keys_str: HashMap<_, _> = keys + .iter() + .map(|(id, k)| (id, k.to_string(Prefix::XPRV).to_string())) + .collect(); + + let output_file = File::create(output_file).expect("create file"); + let mut output_reader = BufWriter::new(output_file); + output_reader + .write_all(serde_json::to_string(&keys_str).unwrap().as_bytes()) + .expect("write file"); +} + +fn read_obligation_user_map_file( + file: PathBuf, +) -> Result, DynError> { + let map_file = File::open(file)?; + let map_reader = BufReader::new(map_file); + serde_json::from_reader(map_reader).map_err(Into::into) +} + +fn write_obligation_user_map_to_file( + output_file: PathBuf, + obligation_user_map: &HashMap, +) { + let output_file = File::create(output_file).expect("create file"); + let mut output_reader = BufWriter::new(output_file); + output_reader + .write_all( + serde_json::to_string(&obligation_user_map) + .unwrap() + .as_bytes(), + ) + .expect("write file"); +} + +fn derive_keys( + obligations: &mut Vec, + bank_id: Uuid, +) -> Result, DynError> { + // Derive a BIP39 seed value using the given password + let seed = { + let mnemonic = Mnemonic::new(MNEMONIC_PHRASE, Language::English)?; + mnemonic.to_seed("password") + }; + + obligations.sort_by_key(|o| o.debtor_id); + + let mut keys = HashMap::new(); + let mut child_num = 0; + + for o in obligations { + keys.entry(o.debtor_id) + .or_insert_with(|| derive_child_xprv(&seed, &mut child_num)); + keys.entry(o.creditor_id) + .or_insert_with(|| derive_child_xprv(&seed, &mut child_num)); + } + + keys.entry(bank_id) + .or_insert_with(|| derive_child_xprv(&seed, &mut child_num)); + + Ok(keys) +} + +fn derive_child_xprv(seed: &Seed, i: &mut usize) -> XPrv { + let child_path = format!("m/0/44'/118'/0'/0/{}", i).parse().unwrap(); + let child_xprv = XPrv::derive_from_path(seed, &child_path); + *i += 1; + child_xprv.unwrap() +} + +#[cfg(test)] +mod tests { + use std::{error::Error, str::FromStr}; + + use bip32::{Language, Mnemonic, Prefix, PrivateKey, XPrv}; + use rand_core::OsRng; + + use crate::{derive_child_xprv, MNEMONIC_PHRASE}; + + #[test] + fn test_create_mnemonic() { + // Generate random Mnemonic using the default language (English) + let mnemonic = Mnemonic::random(&mut OsRng, Default::default()); + + println!("{}", mnemonic.phrase()); + } + + #[test] + fn test_enc_dec_for_derived() -> Result<(), Box> { + let seed = { + let mnemonic = Mnemonic::new(MNEMONIC_PHRASE, Language::English)?; + mnemonic.to_seed("password") + }; + + let mut child_num = 0; + let alice_sk = derive_child_xprv(&seed, &mut child_num); + let alice_sk_str = alice_sk.to_string(Prefix::XPRV).to_string(); + assert_eq!( + alice_sk.private_key().public_key().to_sec1_bytes(), + hex::decode("02027e3510f66f1f6c1ea5e3600062255928e518220f7883810cac3fc7fc092057") + .unwrap() + .into() + ); + assert_eq!(XPrv::from_str(&alice_sk_str).unwrap(), alice_sk); + + let alice_pk = alice_sk.private_key().public_key(); + assert_eq!( + alice_pk.to_sec1_bytes().into_vec(), + vec![ + 2, 2, 126, 53, 16, 246, 111, 31, 108, 30, 165, 227, 96, 0, 98, 37, 89, 40, 229, 24, + 34, 15, 120, 131, 129, 12, 172, 63, 199, 252, 9, 32, 87 + ] + ); + + let msg = r#"{"debtor":"02027e3510f66f1f6c1ea5e3600062255928e518220f7883810cac3fc7fc092057","creditor":"0216254f4636c4e68ae22d98538851a46810b65162fe37bf57cba6d563617c913e","amount":10,"salt":"65c188bcc133add598f7eecc449112f4bf61024345316cff0eb5ce61291991b141073dcd3c543ea142e66fffa8f483dc382043d37e490ef9b8069c489ce94a0b"}"#; + + let ciphertext = ecies::encrypt(&alice_pk.to_sec1_bytes(), msg.as_bytes()).unwrap(); + // let ciphertext = hex::decode("0418d9051cbfc86c8ddd57ae43ea3d1ac8b30353a3ecd8c806bb11f0693dfd282d5f07d1de32cbcd933d5ab7cd0aa171c972e75531b915e968f0fdeba78fa3f359c7f3ef7ae2dfffeb19493e9b2418dc774e6e80448a2dc4a7ba657cd4a8456e120977ebe372a57187d53981cc5856fbd63e9c1bdf001ed71c3d50cbaff594561191d33dad852cb782126f480add2cc92758b59eb63de857d299eaa5f09fbc55643a73b1d8206ce83453b5296b566d9f622520679bb3e6d9c8b7a707f33d3093c41dfc0a8267749b4028e9ee0faad0c8df64f1682a348f220585fdd9b9ac411bdaaa6a249b45accc89a80e5af09abb239231aa869e29459e562721b685d98b3da3eeaef14e1c5f3bd20cf27c0cbbae7b5c618e737df9a84f9a040bb472b7254af2cf4ccc76784cf8432080e528f700ca2a082b7020d94f0f5325dd4998c03972a0b39e6670b65be89e7a80aad7af08a393fcf2e103999254380c1f0355d97ddcdfaeed4bcfaf15b578cee1f6d3fd4ceccd85760b9bd714f81698ddf6fbbc06152a9306a5dd0052c722e390470f0c70eeac81a5da0090").unwrap(); + + println!("{}", hex::encode(&ciphertext)); + + let msg_dec = + ecies::decrypt(&alice_sk.private_key().to_bytes(), ciphertext.as_slice()).unwrap(); + assert_eq!(msg, String::from_utf8(msg_dec).unwrap().as_str()); + + Ok(()) + } +} diff --git a/utils/cycles-sync/src/obligato_client/http.rs b/utils/cycles-sync/src/obligato_client/http.rs new file mode 100644 index 0000000..676423d --- /dev/null +++ b/utils/cycles-sync/src/obligato_client/http.rs @@ -0,0 +1,70 @@ +use async_trait::async_trait; +use reqwest::Url; +use serde::{Deserialize, Serialize}; +use serde_json::json; + +use crate::{ + obligato_client::Client, + types::{ObligatoObligation, ObligatoSetOff}, +}; + +pub struct HttpClient { + client: reqwest::Client, + url: Url, +} + +impl HttpClient { + pub fn new(url: Url) -> Self { + Self { + client: reqwest::Client::new(), + url, + } + } + + fn url_with_path(&self, path: &str) -> Url { + let mut url = self.url.clone(); + url.set_path(path); + url + } +} + +#[async_trait] +impl Client for HttpClient { + type Error = reqwest::Error; + + async fn get_obligations(&self) -> Result, Self::Error> { + let response = self + .client + .post(self.url_with_path("api/sync/obligations2contract")) + .json(&json!({"denom_id": "1", "key": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImRydXZveWVhYXN5bXZubGxmdnZ5Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTcxMTYyNDgzNiwiZXhwIjoyMDI3MjAwODM2fQ.y-2iTQCplrXBEzHrvz_ZGFmMx-iLMzRZ6I0N5htJ39c"})) + .send() + .await? + .json::() + .await?; + + Ok(response.all_obligations.obligations) + } + + async fn set_setoffs(&self, setoffs: Vec) -> Result<(), Self::Error> { + let response = self + .client + .post(self.url_with_path("api/set-offs")) + .json(&setoffs) + .send() + .await?; + println!("{}", response.text().await.unwrap()); + + Ok(()) + } +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] +pub struct GetObligationsInnerResponse { + obligations: Vec, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] +pub struct GetObligationsResponse { + #[serde(rename = "allObligations")] + all_obligations: GetObligationsInnerResponse, +} diff --git a/utils/cycles-sync/src/obligato_client/mock.rs b/utils/cycles-sync/src/obligato_client/mock.rs new file mode 100644 index 0000000..9df815f --- /dev/null +++ b/utils/cycles-sync/src/obligato_client/mock.rs @@ -0,0 +1,39 @@ +use async_trait::async_trait; +use uuid::Uuid; + +use crate::{ + obligato_client::Client, + types::{ObligatoObligation, ObligatoSetOff}, + BANK_DEBTOR_ID, +}; + +pub struct MockClient; + +#[async_trait] +impl Client for MockClient { + type Error = (); + + async fn get_obligations(&self) -> Result, Self::Error> { + Ok(vec![ + // obligation: 1 --10--> 2 + ObligatoObligation { + id: Uuid::from_u128(1), + debtor_id: Uuid::from_u128(1), + creditor_id: Uuid::from_u128(2), + amount: 10, + }, + // tender: $ --10--> 1 + ObligatoObligation { + id: Uuid::from_u128(2), + debtor_id: Uuid::parse_str(BANK_DEBTOR_ID).unwrap(), + creditor_id: Uuid::from_u128(1), + amount: 10, + }, + ]) + } + + async fn set_setoffs(&self, setoffs: Vec) -> Result<(), Self::Error> { + println!("{:?}", setoffs); + Ok(()) + } +} diff --git a/utils/cycles-sync/src/obligato_client/mod.rs b/utils/cycles-sync/src/obligato_client/mod.rs new file mode 100644 index 0000000..f31bc4b --- /dev/null +++ b/utils/cycles-sync/src/obligato_client/mod.rs @@ -0,0 +1,15 @@ +use async_trait::async_trait; + +use crate::types::{ObligatoObligation, ObligatoSetOff}; + +pub mod http; +pub mod mock; + +#[async_trait] +pub trait Client { + type Error; + + async fn get_obligations(&self) -> Result, Self::Error>; + + async fn set_setoffs(&self, setoffs: Vec) -> Result<(), Self::Error>; +} diff --git a/utils/cycles-sync/src/types.rs b/utils/cycles-sync/src/types.rs new file mode 100644 index 0000000..d068d6e --- /dev/null +++ b/utils/cycles-sync/src/types.rs @@ -0,0 +1,80 @@ +use bip32::secp256k1::ecdsa::VerifyingKey; +use cosmwasm_std::HexBinary; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq, Hash)] +pub struct ObligatoObligation { + pub id: Uuid, + pub debtor_id: Uuid, + pub creditor_id: Uuid, + pub amount: u64, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct RawObligation { + pub debtor: HexBinary, + pub creditor: HexBinary, + pub amount: u64, + #[serde(default)] + pub salt: HexBinary, +} + +#[derive(Clone, Debug)] +pub struct Obligation { + pub debtor: VerifyingKey, + pub creditor: VerifyingKey, + pub amount: u64, + pub salt: [u8; 64], +} + +impl From for RawObligation { + fn from(obligation: Obligation) -> Self { + Self { + debtor: obligation.debtor.to_sec1_bytes().into_vec().into(), + creditor: obligation.creditor.to_sec1_bytes().into_vec().into(), + amount: obligation.amount, + salt: obligation.salt.into(), + } + } +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct RawEncryptedObligation { + pub digest: HexBinary, + pub ciphertext: HexBinary, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct SubmitObligationsMsg { + pub submit_obligations: Vec, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] +pub struct ObligatoSetOff { + pub debtor_id: Uuid, + pub creditor_id: Uuid, + pub amount: u64, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RawSetOff { + SetOff(Vec), + Transfer(RawSetOffTransfer), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct RawSetOffTransfer { + pub payer: String, + pub payee: String, + pub amount: u64, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct RawOffset { + pub debtor: HexBinary, + pub creditor: HexBinary, + pub amount: u64, + pub set_off: u64, +} diff --git a/utils/cycles-sync/src/wasmd_client.rs b/utils/cycles-sync/src/wasmd_client.rs new file mode 100644 index 0000000..b87698b --- /dev/null +++ b/utils/cycles-sync/src/wasmd_client.rs @@ -0,0 +1,93 @@ +use std::{error::Error, process::Command}; + +use cosmrs::{tendermint::chain::Id, AccountId}; +use serde::{Deserialize, Serialize}; + +pub trait WasmdClient { + type Address: AsRef; + type Query: ToString; + type ChainId: AsRef; + type Error; + + fn query_smart( + &self, + contract: &Self::Address, + query: Self::Query, + ) -> Result; + + fn tx_execute( + &self, + contract: &Self::Address, + chain_id: &Id, + gas: u64, + sender: String, + msg: M, + ) -> Result<(), Self::Error>; +} + +#[derive(Clone, Debug)] +pub struct CliWasmdClient; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct QueryResult { + pub data: T, +} + +pub trait FromVec: Sized { + fn from_vec(value: Vec) -> Self; +} + +impl Deserialize<'any>> FromVec for T { + fn from_vec(value: Vec) -> Self { + serde_json::from_slice(&value).unwrap() + } +} + +impl WasmdClient for CliWasmdClient { + type Address = AccountId; + type Query = serde_json::Value; + type ChainId = Id; + type Error = Box; + + fn query_smart( + &self, + contract: &Self::Address, + query: Self::Query, + ) -> Result { + let mut wasmd = Command::new("wasmd"); + let command = wasmd + .args(["query", "wasm"]) + .args(["contract-state", "smart", contract.as_ref()]) + .arg(query.to_string()) + .args(["--output", "json"]); + + let output = command.output()?; + println!("{:?} => {:?}", command, output); + + let query_result = R::from_vec(output.stdout); + Ok(query_result) + } + + fn tx_execute( + &self, + contract: &Self::Address, + chain_id: &Id, + gas: u64, + sender: String, + msg: M, + ) -> Result<(), Self::Error> { + let mut wasmd = Command::new("wasmd"); + let command = wasmd + .args(["tx", "wasm"]) + .args(["execute", contract.as_ref(), &msg.to_string()]) + .args(["--chain-id", chain_id.as_ref()]) + .args(["--gas", &gas.to_string()]) + .args(["--from", sender.as_ref()]) + .arg("-y"); + + let output = command.output()?; + println!("{:?} => {:?}", command, output); + + Ok(()) + } +} diff --git a/utils/mtcs-intent/Cargo.toml b/utils/mtcs-intent/Cargo.toml index 3f89a52..4131986 100644 --- a/utils/mtcs-intent/Cargo.toml +++ b/utils/mtcs-intent/Cargo.toml @@ -7,8 +7,9 @@ edition = "2021" [dependencies] clap = { version = "4.0.32", features = ["derive"] } -cosmwasm-std = "1.4.0" -ecies = "0.2.6" +cosmrs = "0.16.0" +cosmwasm-std = "1.5.2" +ecies = { version = "0.2.6", default-features = false, features = ["pure"] } hex = "0.4.3" k256 = { version = "0.13.2", default-features = false, features = ["ecdsa", "alloc", "serde"] } rand = "0.8.5" diff --git a/utils/mtcs-intent/src/main.rs b/utils/mtcs-intent/src/main.rs index 74144ec..87e93ec 100644 --- a/utils/mtcs-intent/src/main.rs +++ b/utils/mtcs-intent/src/main.rs @@ -20,6 +20,7 @@ use std::{ }; use clap::{Parser, Subcommand}; +use cosmrs::{tendermint::account::Id as TmAccountId, AccountId}; use cosmwasm_std::HexBinary; use ecies::{decrypt, encrypt}; use k256::{ @@ -41,9 +42,9 @@ struct Cli { #[allow(clippy::large_enum_variant)] enum Command { KeyGen { - #[clap(long, default_value = "user.pk")] + #[clap(long, default_value = "epoch.pk")] pk_file: PathBuf, - #[clap(long, default_value = "user.sk")] + #[clap(long, default_value = "epoch.sk")] sk_file: PathBuf, }, EncryptObligation { @@ -52,12 +53,30 @@ enum Command { #[clap(long, default_value = "epoch.pk")] pk_file: PathBuf, }, - DecryptSetoff { - #[clap(long, value_parser = parse_hex)] - setoff: Vec, + DecryptObligation { #[clap(long)] + obligation: String, + #[clap(long, default_value = "epoch.sk")] sk_file: PathBuf, }, + EncryptSetoff { + #[clap(long, value_parser = parse_setoff_json)] + setoff: Setoff, + #[clap(long)] + obligation_digest: String, + #[clap(long, default_value = "user.pk")] + pk_file: PathBuf, + }, + DecryptSetoff { + #[clap(long)] + setoff: String, + #[clap(long, default_value = "user.sk")] + sk_file: PathBuf, + }, + PrintAddress { + #[clap(long)] + pk: String, + }, } fn parse_obligation_json(s: &str) -> Result { @@ -65,10 +84,6 @@ fn parse_obligation_json(s: &str) -> Result { raw_obligation.try_into() } -fn parse_hex(s: &str) -> Result, String> { - Ok(hex::decode(s).unwrap()) -} - #[derive(Clone, Debug, Serialize, Deserialize)] struct RawObligation { debtor: HexBinary, @@ -116,11 +131,62 @@ impl From for RawObligation { } #[derive(Clone, Debug, Serialize, Deserialize)] -struct EncryptedObligation { +struct EncryptedIntent { ciphertext: HexBinary, digest: HexBinary, } +fn parse_setoff_json(s: &str) -> Result { + let raw_setoff: RawSetoff = serde_json::from_str(s).map_err(|e| e.to_string())?; + raw_setoff.try_into() +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +struct RawSetoff { + debtor: HexBinary, + creditor: HexBinary, + amount: u64, + #[serde(default)] + salt: HexBinary, +} + +#[derive(Clone, Debug)] +struct Setoff { + debtor: VerifyingKey, + creditor: VerifyingKey, + amount: u64, + salt: [u8; 64], +} + +impl TryFrom for Setoff { + type Error = String; + + fn try_from(raw_setoff: RawSetoff) -> Result { + let mut salt = [0u8; 64]; + rand::thread_rng().fill(&mut salt[..]); + + Ok(Self { + debtor: VerifyingKey::from_sec1_bytes(raw_setoff.debtor.as_slice()) + .map_err(|e| e.to_string())?, + creditor: VerifyingKey::from_sec1_bytes(raw_setoff.creditor.as_slice()) + .map_err(|e| e.to_string())?, + amount: raw_setoff.amount, + salt, + }) + } +} + +impl From for RawSetoff { + fn from(setoff: Setoff) -> Self { + Self { + debtor: setoff.debtor.to_sec1_bytes().into_vec().into(), + creditor: setoff.creditor.to_sec1_bytes().into_vec().into(), + amount: setoff.amount, + salt: setoff.salt.into(), + } + } +} + fn main() -> Result<(), Box> { let args = Cli::parse(); @@ -157,7 +223,7 @@ fn main() -> Result<(), Box> { hasher.finalize().into() }; - let obligation_enc = EncryptedObligation { + let obligation_enc = EncryptedIntent { ciphertext: ciphertext.into(), digest: digest.into(), }; @@ -167,6 +233,53 @@ fn main() -> Result<(), Box> { serde_json::to_string(&obligation_enc).expect("infallible serializer") ); } + Command::DecryptObligation { + obligation, + sk_file, + } => { + let sk = { + let sk_str = read_to_string(sk_file)?; + let sk = hex::decode(sk_str).expect(""); + SigningKey::from_bytes(GenericArray::from_slice(&sk))? + }; + + let ciphertext = hex::decode(obligation).unwrap(); + + let obligation = { + let o = decrypt(&sk.to_bytes(), &ciphertext).unwrap(); + serde_json::from_slice::(&o)? + }; + println!("{obligation:?}"); + } + Command::EncryptSetoff { + setoff, + obligation_digest, + pk_file, + } => { + let pk = { + let pk_str = read_to_string(pk_file)?; + hex::decode(pk_str)? + }; + let setoff_ser = + serde_json::to_string(&RawSetoff::from(setoff)).expect("infallible serializer"); + + let ciphertext = encrypt(&pk, setoff_ser.as_bytes()).map_err(|e| e.to_string())?; + + let digest: [u8; 32] = { + let d = hex::decode(obligation_digest)?; + d.try_into().unwrap() + }; + + let setoff_enc = EncryptedIntent { + ciphertext: ciphertext.into(), + digest: digest.into(), + }; + + println!( + "{}", + serde_json::to_string(&setoff_enc).expect("infallible serializer") + ); + } Command::DecryptSetoff { setoff, sk_file } => { let sk = { let sk_str = read_to_string(sk_file)?; @@ -174,8 +287,18 @@ fn main() -> Result<(), Box> { SigningKey::from_bytes(GenericArray::from_slice(&sk))? }; - let key_share = decrypt(&sk.to_bytes(), &setoff).unwrap(); - serde_json::from_slice(&key_share)?; + let ciphertext = hex::decode(setoff).unwrap(); + + let setoff = decrypt(&sk.to_bytes(), &ciphertext).unwrap(); + serde_json::from_slice(&setoff)?; + } + Command::PrintAddress { pk } => { + let pk = { + let pk = hex::decode(pk)?; + VerifyingKey::from_sec1_bytes(&pk)? + }; + let tm_pk = TmAccountId::from(pk); + println!("{}", AccountId::new("wasm", tm_pk.as_bytes()).unwrap()); } } diff --git a/utils/quartz-proto/src/prost/quartz.rs b/utils/quartz-proto/src/prost/quartz.rs index 2814449..a9e243c 100644 --- a/utils/quartz-proto/src/prost/quartz.rs +++ b/utils/quartz-proto/src/prost/quartz.rs @@ -1,3 +1,4 @@ +// This file is @generated by prost-build. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct InstantiateRequest {} diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml index 2cdd7fa..dc55798 100644 --- a/utils/quartz-relayer/Cargo.toml +++ b/utils/quartz-relayer/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" clap = { version = "4.1.8", features = ["derive"] } cosmos-sdk-proto = "0.16.0" cosmrs = { version = "=0.11.0", features = ["cosmwasm"] } -cosmwasm-std = "1.4.0" +cosmwasm-std = "1.5.2" displaydoc = { version = "0.2.3", default-features = false } ecies = { version = "0.2.6", default-features = false, features = ["pure"] } k256 = { version = "0.13.2", default-features = false, features = ["ecdsa", "alloc"] } @@ -20,6 +20,6 @@ thiserror = "1.0.38" tonic = "=0.8.3" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } -quartz-tee-ra = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } +quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/ljubljana-retreat" } +quartz-tee-ra = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/ljubljana-retreat" } quartz-proto = { path = "../../utils/quartz-proto" }