diff --git a/Cargo.lock b/Cargo.lock index d5811c3..8559898 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -54,13 +54,14 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "getrandom", + "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -72,6 +73,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + [[package]] name = "anstyle" version = "1.0.7" @@ -84,6 +91,127 @@ version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayref" version = "0.3.7" @@ -120,7 +248,7 @@ checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", "synstructure", ] @@ -132,7 +260,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -154,18 +282,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -187,7 +315,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.30", "itoa", "matchit", "memchr", @@ -266,22 +394,22 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bech32" -version = "0.9.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" [[package]] name = "bip32" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" +checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" dependencies = [ "bs58", "hmac", "k256", "once_cell", "pbkdf2", - "rand_core 0.6.4", + "rand_core", "ripemd", "sha2 0.10.8", "subtle", @@ -311,9 +439,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +checksum = "e9ec96fe9a81b5e365f9db71fe00edc4fe4ca2cc7dcb7861f0603012a7caa210" dependencies = [ "arrayref", "arrayvec", @@ -342,9 +470,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" +checksum = "3e31ea183f6ee62ac8b8a8cf7feddd766317adfb13ff469de57ce033efd6a790" [[package]] name = "bs58" @@ -369,18 +497,18 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" dependencies = [ "serde", ] [[package]] name = "cc" -version = "1.0.104" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" [[package]] name = "cfg-if" @@ -410,9 +538,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.8" +version = "4.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" +checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462" dependencies = [ "clap_builder", "clap_derive", @@ -420,9 +548,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.8" +version = "4.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" +checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942" dependencies = [ "anstyle", "clap_lex", @@ -437,7 +565,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -520,7 +648,7 @@ dependencies = [ "ecdsa", "eyre", "k256", - "rand_core 0.6.4", + "rand_core", "serde", "serde_json", "signature", @@ -530,32 +658,50 @@ dependencies = [ ] [[package]] -name = "cosmwasm-crypto" -version = "2.0.4" +name = "cosmwasm-core" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a339f6b59ff7ad4ae05a70512a4f3c19bf8fcc845d46bfef90f4ec0810f72c" +checksum = "8d075f6bb1483a6ce83b5cbc73a3a1207e0316ac1e34ed1f2a4d9fc3a0f07bf6" + +[[package]] +name = "cosmwasm-crypto" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ced5a6dd2801a383d3e14e5ae5caa7fdfeff1bd9f22b30e810e0aded8a5869" dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", + "cosmwasm-core", "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", - "rand_core 0.6.4", + "num-traits", + "p256", + "rand_core", + "rayon", + "sha2 0.10.8", "thiserror", ] [[package]] name = "cosmwasm-derive" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3bfea6af94a83880fb05478135ed0c256d9a2fcde58c595a10d64dcb9c925d" +checksum = "35bd1873f84d9b17edf8a90ffe10a89a649b82feacc00e36788b81d2c3cbf03c" dependencies = [ - "syn 1.0.109", + "proc-macro2", + "quote", + "syn 2.0.71", ] [[package]] name = "cosmwasm-schema" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "101d0739564bd34cba9b84bf73665f0822487ae3b29b2dd59930608ed3aafd43" +checksum = "27984b137eb2ac561f97f6bdb02004a98eb6f2ba263062c140b8e231ee1826b7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -566,29 +712,30 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4be75f60158478da2c5d319ed59295bca1687ad50c18215a0485aa91a995ea" +checksum = "f4ef0d201f611bdb6c9124207032423eb956f1fc8ab3e3ee7253a9c08a5f5809" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.71", ] [[package]] name = "cosmwasm-std" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded932165de44cd0717979c34fc3b84d8e8066b8dde4f5bd78f96a643b090f90" +checksum = "2522fb5c9a0409712bb1d036128bccf3564e6b2ac82f942ae4cf3c8df3e26fa8" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bech32", "bnum", + "cosmwasm-core", "cosmwasm-crypto", "cosmwasm-derive", - "derivative", - "forward_ref", + "derive_more 1.0.0-beta.6", "hex", + "rand_core", "schemars", "serde", "serde-json-wasm", @@ -615,6 +762,25 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.20" @@ -634,7 +800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core 0.6.4", + "rand_core", "subtle", "zeroize", ] @@ -660,17 +826,31 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "3.2.0" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", "subtle", "zeroize", ] +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + [[package]] name = "curve25519-dalek-ng" version = "4.1.1" @@ -679,7 +859,7 @@ checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" dependencies = [ "byteorder", "digest 0.9.0", - "rand_core 0.6.4", + "rand_core", "subtle-ng", "zeroize", ] @@ -815,7 +995,7 @@ dependencies = [ "displaydoc", "ecies", "hex", - "rand_core 0.6.4", + "rand_core", "reqwest 0.12.5", "serde", "serde_json", @@ -829,9 +1009,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -839,27 +1019,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -897,13 +1077,13 @@ dependencies = [ [[package]] name = "der_derive" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe87ce4529967e0ba1dcf8450bab64d97dfd5010a6256187ffe2e43e6f0e049" +checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -934,7 +1114,28 @@ checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", +] + +[[package]] +name = "derive_more" +version = "1.0.0-beta.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7abbfc297053be59290e3152f8cbcd52c8642e0728b69ee187d991d4c1af08d" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0-beta.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bba3e9872d7c58ce7ef0fcf1844fcc3e23ef2a58377b50df35dd98e42a5726e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", + "unicode-xid", ] [[package]] @@ -966,7 +1167,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -1001,7 +1202,7 @@ dependencies = [ "libsecp256k1", "once_cell", "parking_lot", - "rand_core 0.6.4", + "rand_core", "sha2 0.10.8", "typenum", "wasm-bindgen", @@ -1025,23 +1226,23 @@ checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" dependencies = [ "curve25519-dalek-ng", "hex", - "rand_core 0.6.4", + "rand_core", "sha2 0.9.9", "zeroize", ] [[package]] name = "ed25519-zebra" -version = "3.1.0" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" dependencies = [ "curve25519-dalek", - "hashbrown 0.12.3", + "ed25519", + "hashbrown 0.14.5", "hex", - "rand_core 0.6.4", - "serde", - "sha2 0.9.9", + "rand_core", + "sha2 0.10.8", "zeroize", ] @@ -1064,7 +1265,7 @@ dependencies = [ "generic-array", "group", "pkcs8", - "rand_core 0.6.4", + "rand_core", "sec1", "subtle", "zeroize", @@ -1117,10 +1318,16 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1129,9 +1336,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flagset" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb3aa5e95cf9aabc17f060cfa0ced7b83f042390760ca53bf09df9968acaa1" +checksum = "b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec" [[package]] name = "flex-error" @@ -1158,12 +1365,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "forward_ref" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" - [[package]] name = "futures" version = "0.3.30" @@ -1272,7 +1473,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -1306,6 +1507,12 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ "ahash", ] @@ -1315,6 +1522,10 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] [[package]] name = "heck" @@ -1396,9 +1607,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http 1.1.0", @@ -1413,7 +1624,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -1431,9 +1642,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.29" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -1455,15 +1666,15 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "httparse", "itoa", "pin-project-lite", @@ -1480,7 +1691,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.29", + "hyper 0.14.30", "rustls 0.21.12", "tokio", "tokio-rustls 0.24.1", @@ -1494,9 +1705,9 @@ checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.0", + "hyper 1.4.1", "hyper-util", - "rustls 0.23.10", + "rustls 0.23.11", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -1510,7 +1721,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.29", + "hyper 0.14.30", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -1526,8 +1737,8 @@ dependencies = [ "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.0", - "hyper 1.4.0", + "http-body 1.0.1", + "hyper 1.4.1", "pin-project-lite", "socket2", "tokio", @@ -1538,9 +1749,9 @@ dependencies = [ [[package]] name = "ics23" -version = "0.11.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc3b8be84e7285c73b88effdc3294b552277d6b0ec728ee016c861b7b9a2c19c" +checksum = "18798160736c1e368938ba6967dbcb3c7afb3256b442a5506ba5222eebb68a5a" dependencies = [ "anyhow", "blake2", @@ -1652,9 +1863,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "once_cell", "sha2 0.10.8", - "signature", ] [[package]] @@ -1799,7 +2008,7 @@ dependencies = [ "mc-sgx-core-sys-types", "mc-sgx-util", "nom", - "rand_core 0.6.4", + "rand_core", "serde", "subtle", ] @@ -1977,7 +2186,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -2202,7 +2411,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -2258,7 +2467,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -2306,7 +2515,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.68", + "syn 2.0.71", "tempfile", ] @@ -2320,7 +2529,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -2501,7 +2710,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.10", + "rustls 0.23.11", "thiserror", "tokio", "tracing", @@ -2517,7 +2726,7 @@ dependencies = [ "rand", "ring", "rustc-hash", - "rustls 0.23.10", + "rustls 0.23.11", "slab", "thiserror", "tinyvec", @@ -2554,7 +2763,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -2564,15 +2773,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", + "rand_core", ] -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" - [[package]] name = "rand_core" version = "0.6.4" @@ -2583,10 +2786,30 @@ dependencies = [ ] [[package]] -name = "redox_syscall" -version = "0.5.2" +name = "rayon" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ "bitflags 2.6.0", ] @@ -2649,7 +2872,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.30", "hyper-rustls 0.24.2", "ipnet", "js-sys", @@ -2687,9 +2910,9 @@ dependencies = [ "futures-core", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.4.0", + "hyper 1.4.1", "hyper-rustls 0.27.2", "hyper-util", "ipnet", @@ -2700,7 +2923,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.10", + "rustls 0.23.11", "rustls-pemfile 2.1.2", "rustls-pki-types", "serde", @@ -2764,6 +2987,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rusticata-macros" version = "4.1.0" @@ -2800,9 +3032,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.10" +version = "0.23.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" dependencies = [ "once_cell", "ring", @@ -2921,7 +3153,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -2956,9 +3188,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -2969,9 +3201,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -2985,9 +3217,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] @@ -3022,13 +3254,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -3039,7 +3271,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -3061,7 +3293,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -3087,9 +3319,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.8.3" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73139bc5ec2d45e6c5fd85be5a46949c1c39a4c18e56915f5eb4c12f975e377" +checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" dependencies = [ "base64 0.22.1", "chrono", @@ -3103,14 +3335,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.8.3" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b80d3d6b56b64335c0180e5ffde23b3c5e08c14c585b51a15bd0e95393f46703" +checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -3163,7 +3395,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -3253,9 +3485,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.68" +version = "2.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" dependencies = [ "proc-macro2", "quote", @@ -3282,7 +3514,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -3402,7 +3634,7 @@ checksum = "331544139bbcf353acb5f56e733093d8e4bf2522cda0491b4bba7039ef0b944e" dependencies = [ "contracts", "crossbeam-channel", - "derive_more", + "derive_more 0.99.18", "flex-error", "futures", "regex", @@ -3426,7 +3658,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73d0ffaf614bd2db605c4762e3a31a536b73cd45488fa5bace050135ca348f28" dependencies = [ "crossbeam-channel", - "derive_more", + "derive_more 0.99.18", "flex-error", "futures", "serde", @@ -3448,7 +3680,7 @@ version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4216e487165e5dbd7af79952eaa0d5f06c5bde861eb76c690acd7f2d2a19395c" dependencies = [ - "derive_more", + "derive_more 0.99.18", "flex-error", "serde", "tendermint 0.36.0", @@ -3524,22 +3756,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -3585,9 +3817,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -3629,9 +3861,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.38.0" +version = "1.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" dependencies = [ "backtrace", "bytes", @@ -3662,7 +3894,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -3681,7 +3913,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.10", + "rustls 0.23.11", "rustls-pki-types", "tokio", ] @@ -3712,9 +3944,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" dependencies = [ "serde", "serde_spanned", @@ -3733,9 +3965,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.14" +version = "0.22.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" dependencies = [ "indexmap 2.2.6", "serde", @@ -3758,7 +3990,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.30", "hyper-timeout", "percent-encoding", "pin-project", @@ -3781,7 +4013,7 @@ dependencies = [ "proc-macro2", "prost-build", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -3835,7 +4067,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] [[package]] @@ -3874,6 +4106,7 @@ dependencies = [ "cw20-base", "getrandom", "quartz-cw", + "serde", "serde_json", "sha2 0.10.8", "thiserror", @@ -3912,6 +4145,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + [[package]] name = "universal-hash" version = "0.5.1" @@ -3941,9 +4180,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.9.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ "serde", ] @@ -4000,7 +4239,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", "wasm-bindgen-shared", ] @@ -4034,7 +4273,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4270,6 +4509,26 @@ dependencies = [ "time", ] +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -4287,5 +4546,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.71", ] diff --git a/apps/transfers/README.md b/apps/transfers/README.md index af15da9..139f273 100644 --- a/apps/transfers/README.md +++ b/apps/transfers/README.md @@ -185,7 +185,9 @@ bash scripts/build.sh ### Configure and Run Gramine Setup and sign the Gramine config, and then start the gramine process, which will run the -grpc server that hosts the transfer application. +grpc server that hosts the transfer application. The quartz port defaults to `11090`, but you can set it deliberately with +`export QUARTZ_PORT=XXXXX`. It is best to set it everytime, since if 2 people are sshing into the same machine to use +the secure enclave, this could create undesired env conditions where your app is talking to the wrong enclave. ``` bash scripts/start.sh diff --git a/apps/transfers/contracts/Cargo.lock b/apps/transfers/contracts/Cargo.lock index baf8a17..35b997b 100644 --- a/apps/transfers/contracts/Cargo.lock +++ b/apps/transfers/contracts/Cargo.lock @@ -1250,6 +1250,7 @@ dependencies = [ "cw20-base", "getrandom", "quartz-cw", + "serde", "serde_json", "sha2 0.10.8", "thiserror", diff --git a/apps/transfers/contracts/Cargo.toml b/apps/transfers/contracts/Cargo.toml index 3f20f6a..f8c6294 100644 --- a/apps/transfers/contracts/Cargo.toml +++ b/apps/transfers/contracts/Cargo.toml @@ -30,6 +30,7 @@ mock-sgx = ["quartz-cw/mock-sgx"] # external sha2 = "0.10.8" serde_json = "1.0.117" +serde = { version = "1.0.137", default-features = false, features = ["derive"] } thiserror = { version = "1.0.49" } # cosmwasm diff --git a/apps/transfers/contracts/src/contract.rs b/apps/transfers/contracts/src/contract.rs index 8db2017..2658628 100644 --- a/apps/transfers/contracts/src/contract.rs +++ b/apps/transfers/contracts/src/contract.rs @@ -1,13 +1,16 @@ -use cosmwasm_std::{entry_point, DepsMut, Env, HexBinary, MessageInfo, Response}; +use cosmwasm_std::{ + entry_point, to_json_binary, Binary, Deps, DepsMut, Env, HexBinary, MessageInfo, Response, + StdResult, +}; use quartz_cw::handler::RawHandler; use crate::{ error::ContractError, msg::{ - execute::{Request, UpdateMsg}, - ExecuteMsg, InstantiateMsg, + execute::{QueryResponseMsg, Request, UpdateMsg}, + ExecuteMsg, InstantiateMsg, QueryMsg, }, - state::{DENOM, REQUESTS, STATE}, + state::{BALANCES, DENOM, REQUESTS, STATE}, }; #[cfg_attr(not(feature = "library"), entry_point)] @@ -43,19 +46,58 @@ pub fn execute( use execute::*; match msg { + // Quartz msgs ExecuteMsg::Quartz(msg) => msg.handle_raw(deps, &env, &info).map_err(Into::into), + + // Clear user msgs + ExecuteMsg::Deposit => deposit(deps, env, info), + ExecuteMsg::Withdraw => withdraw(deps, env, info), + ExecuteMsg::ClearTextTransferRequest(_) => unimplemented!(), + ExecuteMsg::QueryRequest(msg) => query_balance(deps, env, info, msg), + + // Cipher user msgs ExecuteMsg::TransferRequest(msg) => transfer_request(deps, env, info, msg), + + // Enclave msgs ExecuteMsg::Update(attested_msg) => { let _ = attested_msg .clone() .handle_raw(deps.branch(), &env, &info)?; - - // Extract underlying UpdateMsg and pass to update() - update(deps, env, info, UpdateMsg(attested_msg.msg)) + let UpdateMsg { + ciphertext, + quantity, + withdrawals, + } = attested_msg.msg.0; + update( + deps, + env, + info, + UpdateMsg { + ciphertext, + quantity, + withdrawals, + }, + ) + } + + ExecuteMsg::QueryResponse(attested_msg) => { + let _ = attested_msg + .clone() + .handle_raw(deps.branch(), &env, &info)?; + let QueryResponseMsg { + address, + encrypted_bal, + } = attested_msg.msg.0; + store_balance( + deps, + env, + info, + QueryResponseMsg { + address, + encrypted_bal, + }, + ) } - ExecuteMsg::Deposit => deposit(deps, env, info), - ExecuteMsg::Withdraw => withdraw(deps, env, info), - ExecuteMsg::ClearTextTransferRequest(_) => unimplemented!(), } } @@ -65,10 +107,56 @@ pub mod execute { use crate::{ error::ContractError, - msg::execute::{Request, TransferRequestMsg, UpdateMsg}, - state::{DENOM, REQUESTS, STATE}, + msg::execute::{QueryRequestMsg, QueryResponseMsg, Request, TransferRequestMsg, UpdateMsg}, + state::{BALANCES, DENOM, REQUESTS, STATE}, }; + pub fn deposit(deps: DepsMut, _env: Env, info: MessageInfo) -> Result { + let denom: String = DENOM.load(deps.storage)?; + let quantity = must_pay(&info, &denom)?; + + let mut requests = REQUESTS.load(deps.storage)?; + + requests.push(Request::Deposit(info.sender, quantity)); + + REQUESTS.save(deps.storage, &requests)?; + + let event = Event::new("transfer").add_attribute("action", "user"); + let resp = Response::new().add_event(event); + + Ok(resp) + } + + pub fn withdraw( + deps: DepsMut, + _env: Env, + info: MessageInfo, + ) -> Result { + let mut requests = REQUESTS.load(deps.storage)?; + + requests.push(Request::Withdraw(info.sender)); + + REQUESTS.save(deps.storage, &requests)?; + + let event = Event::new("transfer").add_attribute("action", "user"); + let resp = Response::new().add_event(event); + + Ok(resp) + } + + pub fn query_balance( + _deps: DepsMut, + _env: Env, + _info: MessageInfo, + msg: QueryRequestMsg, + ) -> Result { + let event = Event::new("query_balance") + .add_attribute("query", "user") + .add_attribute("emphemeral_pubkey", msg.emphemeral_pubkey.to_string()); + let resp = Response::new().add_event(event); + Ok(resp) + } + pub fn transfer_request( deps: DepsMut, _env: Env, @@ -94,12 +182,12 @@ pub mod execute { msg: UpdateMsg, ) -> Result { // Store state - STATE.save(deps.storage, &msg.0.ciphertext)?; + STATE.save(deps.storage, &msg.ciphertext)?; // Clear queue let mut requests: Vec = REQUESTS.load(deps.storage)?; - requests.drain(0..msg.0.quantity as usize); + requests.drain(0..msg.quantity as usize); REQUESTS.save(deps.storage, &requests)?; @@ -107,7 +195,6 @@ pub mod execute { let denom = DENOM.load(deps.storage)?; let messages = msg - .0 .withdrawals .into_iter() .map(|(user, funds)| BankMsg::Send { @@ -120,38 +207,36 @@ pub mod execute { Ok(resp) } - pub fn deposit(deps: DepsMut, _env: Env, info: MessageInfo) -> Result { - let denom = DENOM.load(deps.storage)?; - let quantity = must_pay(&info, &denom)?; - - let mut requests = REQUESTS.load(deps.storage)?; - - requests.push(Request::Deposit(info.sender, quantity)); - - REQUESTS.save(deps.storage, &requests)?; - - let event = Event::new("transfer").add_attribute("action", "user"); - let resp = Response::new().add_event(event); - - Ok(resp) - } - - pub fn withdraw( + pub fn store_balance( deps: DepsMut, _env: Env, - info: MessageInfo, + _info: MessageInfo, + msg: QueryResponseMsg, ) -> Result { - // TODO: verify denom + // Store state + BALANCES.save(deps.storage, &msg.address.to_string(), &msg.encrypted_bal)?; - let mut requests = REQUESTS.load(deps.storage)?; - - requests.push(Request::Withdraw(info.sender)); - - REQUESTS.save(deps.storage, &requests)?; - - let event = Event::new("transfer").add_attribute("action", "user"); + // Emit event + let event = Event::new("store_balance") + .add_attribute("query", "enclave") // TODO Weird to name it enclave? + .add_attribute("address", msg.address.to_string()) + .add_attribute("encrypted_balance", msg.encrypted_bal.to_string()); let resp = Response::new().add_event(event); - Ok(resp) } } + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + match msg { + QueryMsg::GetBalance { address } => to_json_binary(&query::get_balance(deps, address)?), + } +} +mod query { + use super::*; + + pub fn get_balance(deps: Deps, address: String) -> StdResult { + let balance = BALANCES.may_load(deps.storage, &address)?; + Ok(balance.unwrap_or_default()) + } +} diff --git a/apps/transfers/contracts/src/msg.rs b/apps/transfers/contracts/src/msg.rs index 63cdb9d..e7f830c 100644 --- a/apps/transfers/contracts/src/msg.rs +++ b/apps/transfers/contracts/src/msg.rs @@ -1,9 +1,11 @@ use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Addr, HexBinary, Uint128}; use quartz_cw::{ - msg::execute::attested::{RawAttested, RawDefaultAttestation}, + msg::execute::attested::{RawAttested, RawAttestedMsgSansHandler, RawDefaultAttestation}, prelude::*, }; +use serde::{Deserialize, Serialize}; + +type AttestedMsg = RawAttested, RA>; #[cw_serde] pub struct InstantiateMsg { @@ -11,45 +13,37 @@ pub struct InstantiateMsg { pub denom: String, } +#[cw_serde] +pub enum QueryMsg { + GetBalance { address: String }, +} + #[cw_serde] #[allow(clippy::large_enum_variant)] pub enum ExecuteMsg { // quartz initialization Quartz(QuartzExecuteMsg), - // ----- user txs + // User msgs // clear text Deposit, Withdraw, - + ClearTextTransferRequest(execute::ClearTextTransferRequestMsg), // ciphertext TransferRequest(execute::TransferRequestMsg), - // ---- end user txs - ClearTextTransferRequest(execute::ClearTextTransferRequestMsg), + QueryRequest(execute::QueryRequestMsg), - // enclave msg - Update(RawAttested), + // Enclave msgs + Update(AttestedMsg), + QueryResponse(AttestedMsg), } pub mod execute { - use cosmwasm_std::{DepsMut, Env, MessageInfo, Response, StdError}; - use quartz_cw::{ - error::Error, - handler::Handler, - msg::{execute::attested::HasUserData, HasDomainType}, - state::UserData, - }; + use cosmwasm_schema::cw_serde; + use cosmwasm_std::{Addr, HexBinary, Uint128}; + use quartz_cw::{msg::execute::attested::HasUserData, state::UserData}; use sha2::{Digest, Sha256}; - use super::*; - - #[cw_serde] - pub struct TransferRequestMsg { - pub ciphertext: HexBinary, - pub digest: HexBinary, - // pub proof: π - } - #[cw_serde] pub struct ClearTextTransferRequestMsg { pub sender: Addr, @@ -58,7 +52,18 @@ pub mod execute { // pub proof: π } - // Ciphertext of a transfer request + #[cw_serde] + pub struct QueryRequestMsg { + pub emphemeral_pubkey: HexBinary, + } + + #[cw_serde] + pub struct TransferRequestMsg { + pub ciphertext: HexBinary, + pub digest: HexBinary, + // pub proof: π + } + #[cw_serde] pub enum Request { Transfer(HexBinary), @@ -67,20 +72,17 @@ pub mod execute { } #[cw_serde] - pub struct RawUpdateMsg { + pub struct UpdateMsg { pub ciphertext: HexBinary, pub quantity: u32, pub withdrawals: Vec<(Addr, Uint128)>, // pub proof: π } - #[derive(Clone, Debug, PartialEq)] - pub struct UpdateMsg(pub RawUpdateMsg); - impl HasUserData for UpdateMsg { fn user_data(&self) -> UserData { let mut hasher = Sha256::new(); - hasher.update(serde_json::to_string(&self.0).expect("infallible serializer")); + hasher.update(serde_json::to_string(&self).expect("infallible serializer")); let digest: [u8; 32] = hasher.finalize().into(); let mut user_data = [0u8; 64]; @@ -89,33 +91,22 @@ pub mod execute { } } - impl HasDomainType for RawUpdateMsg { - type DomainType = UpdateMsg; + #[cw_serde] + pub struct QueryResponseMsg { + pub address: Addr, + pub encrypted_bal: HexBinary, + // pub proof: π } - impl TryFrom for UpdateMsg { - type Error = StdError; + impl HasUserData for QueryResponseMsg { + fn user_data(&self) -> UserData { + let mut hasher = Sha256::new(); + hasher.update(serde_json::to_string(&self).expect("infallible serializer")); + let digest: [u8; 32] = hasher.finalize().into(); - fn try_from(value: RawUpdateMsg) -> Result { - Ok(Self(value)) - } - } - - impl From for RawUpdateMsg { - fn from(value: UpdateMsg) -> Self { - value.0 - } - } - - impl Handler for UpdateMsg { - fn handle( - self, - _deps: DepsMut<'_>, - _env: &Env, - _info: &MessageInfo, - ) -> Result { - // basically handle `transfer_request` here - Ok(Response::default()) + let mut user_data = [0u8; 64]; + user_data[0..32].copy_from_slice(&digest); + user_data } } } diff --git a/apps/transfers/contracts/src/state.rs b/apps/transfers/contracts/src/state.rs index 503162b..7dac8d4 100644 --- a/apps/transfers/contracts/src/state.rs +++ b/apps/transfers/contracts/src/state.rs @@ -1,9 +1,9 @@ use cosmwasm_std::HexBinary; -use cw_storage_plus::Item; +use cw_storage_plus::{Item, Map}; use crate::msg::execute::Request; pub const STATE: Item = Item::new("state"); pub const REQUESTS: Item> = Item::new("requests"); - pub const DENOM: Item = Item::new("donation_denom"); +pub const BALANCES: Map<&str, HexBinary> = Map::new("balances"); diff --git a/apps/transfers/enclave/proto/transfers.proto b/apps/transfers/enclave/proto/transfers.proto index 6301cd2..9218e7e 100644 --- a/apps/transfers/enclave/proto/transfers.proto +++ b/apps/transfers/enclave/proto/transfers.proto @@ -3,13 +3,22 @@ syntax = "proto3"; package transfers; service Settlement { - rpc Run (RunTransfersRequest) returns (RunTransfersResponse) {} + rpc Run (UpdateRequest) returns (UpdateResponse) {} + rpc Query (QueryRequest) returns (QueryResponse) {} } -message RunTransfersRequest { +message UpdateRequest { string message = 1; } -message RunTransfersResponse { +message UpdateResponse { + string message = 1; +} + +message QueryRequest { + string message = 1; +} + +message QueryResponse { string message = 1; } diff --git a/apps/transfers/enclave/src/prost/transfers.rs b/apps/transfers/enclave/src/prost/transfers.rs index a18d8da..804ff5e 100644 --- a/apps/transfers/enclave/src/prost/transfers.rs +++ b/apps/transfers/enclave/src/prost/transfers.rs @@ -1,13 +1,25 @@ // This file is @generated by prost-build. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct RunTransfersRequest { +pub struct UpdateRequest { #[prost(string, tag = "1")] pub message: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct RunTransfersResponse { +pub struct UpdateResponse { + #[prost(string, tag = "1")] + pub message: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryRequest { + #[prost(string, tag = "1")] + pub message: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryResponse { #[prost(string, tag = "1")] pub message: ::prost::alloc::string::String, } @@ -98,11 +110,8 @@ pub mod settlement_client { } pub async fn run( &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { self.inner .ready() .await @@ -118,6 +127,28 @@ pub mod settlement_client { req.extensions_mut().insert(GrpcMethod::new("transfers.Settlement", "Run")); self.inner.unary(req, path, codec).await } + pub async fn query( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/transfers.Settlement/Query", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("transfers.Settlement", "Query")); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -129,11 +160,12 @@ pub mod settlement_server { pub trait Settlement: Send + Sync + 'static { async fn run( &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + async fn query( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; } #[derive(Debug)] pub struct SettlementServer { @@ -217,18 +249,16 @@ pub mod settlement_server { "/transfers.Settlement/Run" => { #[allow(non_camel_case_types)] struct RunSvc(pub Arc); - impl< - T: Settlement, - > tonic::server::UnaryService + impl tonic::server::UnaryService for RunSvc { - type Response = super::RunTransfersResponse; + type Response = super::UpdateResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, - request: tonic::Request, + request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { @@ -260,6 +290,50 @@ pub mod settlement_server { }; Box::pin(fut) } + "/transfers.Settlement/Query" => { + #[allow(non_camel_case_types)] + struct QuerySvc(pub Arc); + impl tonic::server::UnaryService + for QuerySvc { + type Response = super::QueryResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::query(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = QuerySvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } _ => { Box::pin(async move { Ok( diff --git a/apps/transfers/enclave/src/state.rs b/apps/transfers/enclave/src/state.rs index d5de426..d80f4a2 100644 --- a/apps/transfers/enclave/src/state.rs +++ b/apps/transfers/enclave/src/state.rs @@ -32,3 +32,27 @@ impl TryFrom for State { Ok(Self { state: o.state }) } } + +#[derive(Clone, Debug)] +pub struct Balance { + pub balance: Uint128, +} + +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +pub struct RawBalance { + pub balance: Uint128, +} + +impl From for RawBalance { + fn from(o: Balance) -> Self { + Self { balance: o.balance } + } +} + +impl TryFrom for Balance { + type Error = anyhow::Error; + + fn try_from(o: RawBalance) -> Result { + Ok(Self { balance: o.balance }) + } +} diff --git a/apps/transfers/enclave/src/transfers_server.rs b/apps/transfers/enclave/src/transfers_server.rs index 1df2f5a..fcf6f37 100644 --- a/apps/transfers/enclave/src/transfers_server.rs +++ b/apps/transfers/enclave/src/transfers_server.rs @@ -17,8 +17,10 @@ use tonic::{Request, Response, Result as TonicResult, Status}; use transfers_contract::msg::execute::{ClearTextTransferRequestMsg, Request as TransfersRequest}; use crate::{ - proto::{settlement_server::Settlement, RunTransfersRequest, RunTransfersResponse}, - state::{RawState, State}, + proto::{ + settlement_server::Settlement, QueryRequest, QueryResponse, UpdateRequest, UpdateResponse, + }, + state::{RawBalance, RawState, State}, }; pub type RawCipherText = HexBinary; @@ -30,19 +32,32 @@ pub struct TransfersService { } #[derive(Clone, Debug, Serialize, Deserialize)] -pub struct RunTransfersRequestMessage { +pub struct UpdateRequestMessage { state: HexBinary, requests: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] -pub struct RunTransfersResponseMessage { +pub struct QueryRequestMessage { + state: HexBinary, + address: Addr, + ephemeral_pubkey: HexBinary, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct QueryResponseMessage { + address: Addr, + encrypted_bal: HexBinary, +} + +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +pub struct UpdateMsg { ciphertext: HexBinary, quantity: u32, withdrawals: Vec<(Addr, Uint128)>, } -impl HasUserData for RunTransfersResponseMessage { +impl HasUserData for UpdateMsg { fn user_data(&self) -> UserData { let mut hasher = Sha256::new(); hasher.update(serde_json::to_string(&self).expect("infallible serializer")); @@ -54,6 +69,24 @@ impl HasUserData for RunTransfersResponseMessage { } } +impl HasUserData for QueryResponseMessage { + fn user_data(&self) -> UserData { + let mut hasher = Sha256::new(); + hasher.update(serde_json::to_string(&self).expect("infallible serializer")); + let digest: [u8; 32] = hasher.finalize().into(); + + let mut user_data = [0u8; 64]; + user_data[0..32].copy_from_slice(&digest); + user_data + } +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +struct AttestedMsg { + msg: M, + quote: Vec, +} + impl TransfersService where A: Attestor, @@ -68,14 +101,11 @@ impl Settlement for TransfersService where A: Attestor + Send + Sync + 'static, { - async fn run( - &self, - request: Request, - ) -> TonicResult> { + async fn run(&self, request: Request) -> TonicResult> { // Request contains a serialized json string // Serialize request into struct containing State and the Requests vec - let message: RunTransfersRequestMessage = { + let message: UpdateRequestMessage = { let message = request.into_inner().message; serde_json::from_str(&message).map_err(|e| Status::invalid_argument(e.to_string()))? }; @@ -83,8 +113,6 @@ where // Decrypt and deserialize the state let mut state = { if message.state.len() == 1 && message.state[0] == 0 { - println!("{}", message.state); - State { state: BTreeMap::::new(), } @@ -103,7 +131,7 @@ where let requests_len = message.requests.len() as u32; // Instantiate empty withdrawals map to include in response (Update message to smart contract) - let mut withdrawals_response = Vec::<(Addr, Uint128)>::new(); + let mut withdrawals_response: Vec<(Addr, Uint128)> = Vec::<(Addr, Uint128)>::new(); // Loop through requests, match on cases, and apply changes to state for req in message.requests { @@ -170,7 +198,7 @@ where }; // Prepare message to chain - let msg = RunTransfersResponseMessage { + let msg = UpdateMsg { ciphertext: state_enc, quantity: requests_len, withdrawals: withdrawals_response, @@ -187,7 +215,69 @@ where let message = serde_json::to_string(&attested_msg).map_err(|e| Status::internal(e.to_string()))?; - Ok(Response::new(RunTransfersResponse { message })) + Ok(Response::new(UpdateResponse { message })) + } + + async fn query(&self, request: Request) -> TonicResult> { + // Serialize request into struct containing State and the Requests vec + let message: QueryRequestMessage = { + let message: String = request.into_inner().message; + serde_json::from_str(&message).map_err(|e| Status::invalid_argument(e.to_string()))? + }; + + // Decrypt and deserialize the state + let state = { + if message.state.len() == 1 && message.state[0] == 0 { + State { + state: BTreeMap::::new(), + } + } else { + let sk_lock = self + .sk + .lock() + .map_err(|e| Status::internal(e.to_string()))?; + let sk = sk_lock + .as_ref() + .ok_or(Status::internal("SigningKey unavailable"))?; + decrypt_state(sk, &message.state)? + } + }; + + let bal = match state.state.get(&message.address) { + Some(balance) => RawBalance { balance: *balance }, + None => RawBalance { + balance: Uint128::new(0), + }, + }; + + // Parse the ephemeral public key + let ephemeral_pubkey = + VerifyingKey::from_sec1_bytes(&message.ephemeral_pubkey).map_err(|e| { + Status::invalid_argument(format!("Invalid ephemeral public key: {}", e)) + })?; + + // Encrypt the balance using the ephemeral public key + let bal_enc = encrypt_balance(bal, ephemeral_pubkey) + .map_err(|e| Status::internal(format!("Encryption error: {}", e)))?; + + // Prepare message to chain + let msg = QueryResponseMessage { + address: message.address, + encrypted_bal: bal_enc, + }; + + // Attest to message + let attestation: HexBinary = self + .attestor + .quote(msg.clone()) + .map_err(|e| Status::internal(e.to_string()))? + .into(); + + let attested_msg = RawAttested { msg, attestation }; + let message = + serde_json::to_string(&attested_msg).map_err(|e| Status::internal(e.to_string()))?; + + Ok(Response::new(QueryResponse { message })) } } @@ -221,3 +311,12 @@ fn encrypt_state(state: RawState, enclave_pk: VerifyingKey) -> TonicResult Err(Status::internal(format!("Encryption error: {}", e))), } } + +fn encrypt_balance(balance: RawBalance, ephemeral_pk: VerifyingKey) -> TonicResult { + let serialized_balance = serde_json::to_string(&balance).expect("infallible serializer"); + + match encrypt(&ephemeral_pk.to_sec1_bytes(), serialized_balance.as_bytes()) { + Ok(encrypted_balance) => Ok(encrypted_balance.into()), + Err(e) => Err(Status::internal(format!("Encryption error: {}", e))), + } +} diff --git a/apps/transfers/scripts/decrypt_ephemeral.sh b/apps/transfers/scripts/decrypt_ephemeral.sh new file mode 100755 index 0000000..7392c57 --- /dev/null +++ b/apps/transfers/scripts/decrypt_ephemeral.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# Check if an encrypted balance is provided +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +ENCRYPTED_BALANCE=$1 + +# Check if eciespy is installed +if ! pip list 2>/dev/null | grep -q eciespy; then + echo "eciespy is not installed. Installing now..." + pip install eciespy >/dev/null 2>&1 +fi + +# Extract the private key from wasmd +EPHEMERAL_PRIVKEY=$( yes | wasmd keys export ephemeral_user --unsafe --unarmored-hex) + +if [ $? -ne 0 ]; then + echo "Failed to export private key. Make sure 'ephemeral_user' exists and you've entered the correct password." + exit 1 +fi + +# Create a temporary Python script for decryption +TEMP_PYTHON_SCRIPT=$(mktemp) +cat << EOF > "$TEMP_PYTHON_SCRIPT" +from ecies import decrypt +import binascii +import sys + +private_key = bytes.fromhex(sys.argv[1]) +encrypted = binascii.unhexlify(sys.argv[2]) + +try: + decrypted = decrypt(private_key, encrypted) + print(decrypted.decode()) +except Exception as e: + print(f"Decryption failed: {str(e)}") +EOF + +# Run the Python script to decrypt +DECRYPTED=$(python3 "$TEMP_PYTHON_SCRIPT" "$EPHEMERAL_PRIVKEY" "$ENCRYPTED_BALANCE") + +echo "---------------------------------------------------------" +echo "Decrypted result:" +echo "$DECRYPTED" + +# Clean up +rm "$TEMP_PYTHON_SCRIPT" \ No newline at end of file diff --git a/apps/transfers/scripts/listen.sh b/apps/transfers/scripts/listen.sh index dbcbe4e..f99fe12 100755 --- a/apps/transfers/scripts/listen.sh +++ b/apps/transfers/scripts/listen.sh @@ -1,5 +1,3 @@ - - ROOT=${ROOT:-$HOME} DEFAULT_NODE="127.0.0.1:26657" @@ -19,58 +17,129 @@ CMD="wasmd --node http://$NODE_URL" WSURL="ws://$NODE_URL/websocket" -SUBSCRIBE="{\"jsonrpc\":\"2.0\",\"method\":\"subscribe\",\"params\":[\"execute._contract_address = '$CONTRACT' AND wasm-transfer.action = 'user'\"],\"id\":1}" +SUBSCRIBE_TRANSFER="{\"jsonrpc\":\"2.0\",\"method\":\"subscribe\",\"params\":[\"execute._contract_address = '$CONTRACT' AND wasm-transfer.action = 'user'\"],\"id\":1}" +SUBSCRIBE_QUERY="{\"jsonrpc\":\"2.0\",\"method\":\"subscribe\",\"params\":[\"execute._contract_address = '$CONTRACT' AND wasm-query_balance.query = 'user'\"],\"id\":2}" -echo $SUBSCRIBE - -echo "--------------------------------------------------------" -echo "subscribe to events" +# Attestation constants +IAS_API_KEY="669244b3e6364b5888289a11d2a1726d" +RA_CLIENT_SPID="51CAF5A48B450D624AEFE3286D314894" +QUOTE_FILE="/tmp/${USER}_test.quote" +REPORT_FILE="/tmp/${USER}_datareport" +REPORT_SIG_FILE="/tmp/${USER}_datareportsig" # cat keeps the stdin open so websocat doesnt close -(echo "$SUBSCRIBE"; cat) | websocat $WSURL | while read msg; do - if [[ "$msg" == '{"jsonrpc":"2.0","id":1,"result":{}}' ]]; then - echo "... subscribed" +(echo "$SUBSCRIBE_TRANSFER"; echo "$SUBSCRIBE_QUERY"; cat) | websocat $WSURL | while read msg; do + if [[ "$msg" == '{"jsonrpc":"2.0","id":1,"result":{}}' ]] || [[ "$msg" == '{"jsonrpc":"2.0","id":2,"result":{}}' ]]; then echo "---------------------------------------------------------" + echo "... subscribed to $msg" echo "... waiting for event" continue fi - if echo "$msg" | jq 'has("error")' > /dev/null; then - echo "... error msg $msg" + # TODO - Some reason this is saying ERROR when its fine, needs to be fixed or removed + #if echo "$msg" | sed 's/"log":"\[.*\]"/"log":""/' | jq 'has("error")' > /dev/null; then + # echo "... error msg $msg" + # echo "---------------------------------------------------------" + # echo "... waiting for event" + # continue + #fi + + CLEAN_MSG=$(echo "$msg" | sed 's/"log":"\[.*\]"/"log":""/' | jq '.result.events') + + if echo "$CLEAN_MSG" | grep -q 'wasm-transfer'; then + echo "---------------------------------------------------------" + echo "... received wasm-transfer event!" + + echo "... fetching requests" + REQUESTS=$($CMD query wasm contract-state raw $CONTRACT $(printf '%s' "requests" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d) + STATE=$($CMD query wasm contract-state raw $CONTRACT $(printf '%s' "state" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d) + export ENCLAVE_REQUEST=$(jq -nc --argjson requests "$REQUESTS" --argjson state $STATE '$ARGS.named') + export REQUEST_MSG=$(jq -nc --arg message "$ENCLAVE_REQUEST" '$ARGS.named') + + cd $ROOT/cycles-quartz/apps/transfers/enclave + + echo "... executing transfer" + export ATTESTED_MSG=$(grpcurl -plaintext -import-path ./proto/ -proto transfers.proto -d "$REQUEST_MSG" "127.0.0.1:$QUARTZ_PORT" transfers.Settlement/Run | jq .message | jq -R 'fromjson | fromjson' | jq -c ) + QUOTE=$(echo "$ATTESTED_MSG" | jq -c '.attestation') + MSG=$(echo "$ATTESTED_MSG" | jq -c '.msg') + + echo "... getting report" + echo -n "$QUOTE" | xxd -r -p - > "$QUOTE_FILE" + gramine-sgx-ias-request report -g "$RA_CLIENT_SPID" -k "$IAS_API_KEY" -q "$QUOTE_FILE" -r "$REPORT_FILE" -s "$REPORT_SIG_FILE" > /dev/null 2>&1 + REPORT=$(cat "$REPORT_FILE") + REPORTSIG=$(cat "$REPORT_SIG_FILE" | tr -d '\r') + + echo "... submitting update" + export EXECUTE=$(jq -nc --argjson update "$(jq -nc --argjson msg "$MSG" --argjson attestation \ + "$(jq -nc --argjson report "$(jq -nc --argjson report "$REPORT" --arg reportsig "$REPORTSIG" '$ARGS.named')" '$ARGS.named')" \ + '$ARGS.named')" '$ARGS.named') + echo $EXECUTE | jq '.' + $CMD tx wasm execute "$CONTRACT" "$EXECUTE" --from admin --chain-id testing -y --gas 2000000 + + echo " ... done" echo "---------------------------------------------------------" echo "... waiting for event" - continue - fi + elif echo "$CLEAN_MSG" | grep -q 'wasm-query_balance'; then + echo "... received wasm-query_balance event!" + echo "... fetching state" + + STATE=$($CMD query wasm contract-state raw $CONTRACT $(printf '%s' "state" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d) + + # Extract the address from the event + ADDRESS=$(echo "$msg" | sed 's/"log":"\[.*\]"/"log":""/' | jq -r '.result.events["message.sender"]'[0]) + + EPHEMERAL_PUBKEY=$(echo "$msg" | sed 's/"log":"\[.*\]"/"log":""/' | jq -r '.result.events["wasm-query_balance.emphemeral_pubkey"]'[0]) + + # Create the enclave request with state and address + export ENCLAVE_REQUEST=$(jq -nc --argjson state "$STATE" --arg address "$ADDRESS" --arg ephemeral_pubkey "$EPHEMERAL_PUBKEY" '$ARGS.named') + export REQUEST_MSG=$(jq -nc --arg message "$ENCLAVE_REQUEST" '$ARGS.named') + + cd $ROOT/cycles-quartz/apps/transfers/enclave + + echo "... executing query balance" + ATTESTED_MSG=$(grpcurl -plaintext -import-path ./proto/ -proto transfers.proto -d "$REQUEST_MSG" "127.0.0.1:$QUARTZ_PORT" transfers.Settlement/Query | jq -r '.message | fromjson') + echo "atts msg" + echo $ATTESTED_MSG + QUOTE=$(echo "$ATTESTED_MSG" | jq -c '.attestation') + MSG=$(echo "$ATTESTED_MSG" | jq -c '.msg') + echo "quote" + echo $QUOTE + echo "msg" + echo $MSG + + echo -n "$QUOTE" | xxd -r -p - > "$QUOTE_FILE" + gramine-sgx-ias-request report -g "$RA_CLIENT_SPID" -k "$IAS_API_KEY" -q "$QUOTE_FILE" -r "$REPORT_FILE" -s "$REPORT_SIG_FILE" > /dev/null 2>&1 + REPORT=$(cat "$REPORT_FILE") + REPORTSIG=$(cat "$REPORT_SIG_FILE" | tr -d '\r') + + echo "... submitting update" + + # Create the QueryResponseMsg structure with address inside the msg + export QUERY_RESPONSE_MSG=$(jq -n \ + --arg address "$ADDRESS" \ + --argjson msg "$MSG" \ + '{address: $address, encrypted_bal: $msg.encrypted_bal}') - echo "... received event! " - echo $msg + # Create the execute message for query_response + export EXECUTE=$(jq -nc \ + --argjson query_response "$(jq -nc \ + --argjson msg "$QUERY_RESPONSE_MSG" \ + --argjson attestation "$(jq -nc \ + --argjson report "$(jq -nc \ + --argjson report "$REPORT" \ + --arg reportsig "$REPORTSIG" \ + '$ARGS.named')" \ + '$ARGS.named')" \ + '$ARGS.named')" \ + '{query_response: $query_response}') - echo "... fetching requests" + echo $EXECUTE | jq '.' - REQUESTS=$($CMD query wasm contract-state raw $CONTRACT $(printf '%s' "requests" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d) - STATE=$($CMD query wasm contract-state raw $CONTRACT $(printf '%s' "state" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d) + $CMD tx wasm execute "$CONTRACT" "$EXECUTE" --from admin --chain-id testing -y --gas 2000000 - export ENCLAVE_REQUEST=$(jq -nc --argjson requests "$REQUESTS" --argjson state $STATE '$ARGS.named') - echo $ENCLAVE_REQUEST | jq . - - export REQUEST_MSG=$(jq -nc --arg message "$ENCLAVE_REQUEST" '$ARGS.named') - - cd $ROOT/cycles-quartz/apps/transfers/enclave - - echo "... executing transfer" - export UPDATE=$(grpcurl -plaintext -import-path ./proto/ -proto transfers.proto -d "$REQUEST_MSG" "127.0.0.1:$QUARTZ_PORT" transfers.Settlement/Run | jq .message | jq -R 'fromjson | fromjson' | jq -c ) - - - - echo "... submitting update" - - $CMD tx wasm execute $CONTRACT "{\"update\": "$UPDATE" }" --chain-id testing --from admin --node http://$NODE_URL -y - - - echo " ... done" - echo "---------------------------------------------------------" - echo "... waiting for event" + echo " ... done" + echo "------------------------------------" + echo "... waiting for event" + fi done - - diff --git a/apps/transfers/scripts/start.sh b/apps/transfers/scripts/start.sh index c570e46..a863ee6 100755 --- a/apps/transfers/scripts/start.sh +++ b/apps/transfers/scripts/start.sh @@ -11,8 +11,11 @@ DIR_QUARTZ_TM_PROVER="$DIR_QUARTZ/utils/tm-prover" NODE_URL=${NODE_URL:-127.0.0.1:26657} CMD="wasmd --node http://$NODE_URL" +# Use the QUARTZ_PORT environment variable if set, otherwise default to 11090 +QUARTZ_PORT="${QUARTZ_PORT:-11090}" echo "--------------------------------------------------------" +echo "QUARTZ_PORT is set to: $QUARTZ_PORT" echo "set trusted hash" cd "$DIR_QUARTZ_TM_PROVER" @@ -51,6 +54,7 @@ gramine-manifest \ -Dquartz_dir="$(pwd)" \ -Dtrusted_height="$TRUSTED_HEIGHT" \ -Dtrusted_hash="$TRUSTED_HASH" \ +-Dgramine_port="$QUARTZ_PORT" \ quartz.manifest.template quartz.manifest echo "... sign manifest"