feat: neutrond tendermint upgrades (#119)

Co-authored-by: hu55a1n1 <sufialhussaini@gmail.com>
This commit is contained in:
dusterbloom 2024-08-08 12:25:56 +02:00 committed by GitHub
parent bbd68d7b23
commit a18ae28c48
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
29 changed files with 2366 additions and 910 deletions

3
.gitignore vendored
View file

@ -10,4 +10,5 @@
target/ target/
artifacts/ artifacts/
.vscode/ .vscode/
.DS_Store .DS_Store
**/.env.local

753
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,6 @@
resolver = "2" resolver = "2"
members = [ members = [
"apps/mtcs/enclave", "apps/mtcs/enclave",
"apps/mtcs/scripts",
"apps/transfers/enclave", "apps/transfers/enclave",
"cli", "cli",
"core/light-client-proofs/*", "core/light-client-proofs/*",
@ -11,7 +10,7 @@ members = [
"cosmwasm/packages/*", "cosmwasm/packages/*",
"utils/*", "utils/*",
] ]
exclude = ["apps/mtcs/contracts/cw-tee-mtcs", "apps/transfers/contracts"] exclude = ["apps/mtcs/contracts/cw-tee-mtcs", "apps/transfers/contracts", "apps/mtcs/scripts"]
[workspace.package] [workspace.package]
version = "0.1.0" version = "0.1.0"
@ -37,7 +36,7 @@ hex = { version = "0.4.3", default-features = false }
hex-literal = { version = "0.4.1", default-features = false } hex-literal = { version = "0.4.1", default-features = false }
k256 = { version = "0.13.2", default-features = false, features = ["ecdsa", "alloc"] } k256 = { version = "0.13.2", default-features = false, features = ["ecdsa", "alloc"] }
num-bigint = { version = "0.4.4", default-features = false } num-bigint = { version = "0.4.4", default-features = false }
prost = { version = "0.12.3", default-features = false } prost = { version = "=0.13.1", default-features = false }
rand = { version = "0.8.5", default-features = false, features = ["getrandom"] } rand = { version = "0.8.5", default-features = false, features = ["getrandom"] }
rand_core = { version = "0.6", default-features = false, features = ["std"] } rand_core = { version = "0.6", default-features = false, features = ["std"] }
reqwest = { version = "0.12.2", default-features = false, features = ["json", "rustls-tls"] } reqwest = { version = "0.12.2", default-features = false, features = ["json", "rustls-tls"] }
@ -48,9 +47,9 @@ sha2 = { version = "0.10.8", default-features = false }
subtle-encoding = { version = "0.5.1", default-features = false, features = ["bech32-preview"] } subtle-encoding = { version = "0.5.1", default-features = false, features = ["bech32-preview"] }
tempfile = { version = "3", default-features = false } tempfile = { version = "3", default-features = false }
thiserror = { version = "1.0.49", default-features = false } thiserror = { version = "1.0.49", default-features = false }
tokio = { version = "1.38.0", default-features = false, features = ["macros", "rt-multi-thread"] } tokio = { version = "=1.39.2",default-features = false, features = ["macros", "rt"]}
tonic = { version = "0.11", default-features = false, features = ["codegen", "prost", "transport"] } tonic = { version = "=0.12.1", default-features = false, features = ["codegen", "prost", "transport"] }
tonic-build = { version = "0.11", default-features = false, features = ["prost", "transport"] } tonic-build = { version = "=0.12.1", default-features = false, features = ["prost", "transport"] }
tracing = { version = "0.1.39", default-features = false } tracing = { version = "0.1.39", default-features = false }
tracing-subscriber = { version = "0.3.17", default-features = false, features = ["fmt"] } tracing-subscriber = { version = "0.3.17", default-features = false, features = ["fmt"] }
uuid = { version = "1.4.1", default-features = false, features = ["serde"] } uuid = { version = "1.4.1", default-features = false, features = ["serde"] }
@ -59,16 +58,16 @@ x509-parser = { version = "0.16.0", features = ["default", "verify"] }
zeroize = { version = "1.7.0", default-features = false } zeroize = { version = "1.7.0", default-features = false }
# cosmos # cosmos
cosmos-sdk-proto = { version = "0.21.1" } cosmos-sdk-proto = { version = "0.22.0" }
cosmrs = { version = "=0.16.0", default-features = false } cosmrs = { version = "=0.17.0", default-features = false }
cosmwasm-schema = { version = "2.0.0", default-features = false } cosmwasm-schema = { version = "2.1.1", default-features = false }
cosmwasm-std = { version = "2.0.0", default-features = false, features = ["std"] } cosmwasm-std = { version = "2.1.1", default-features = false, features = ["std"] }
cw-storage-plus = { version = "2.0.0", default-features = false } cw-storage-plus = { version = "2.0.0", default-features = false }
ics23 = { version = "0.11.0", default-features = false, features = ["host-functions"] } ics23 = { version = "0.12.0", default-features = false, features = ["host-functions"] }
tendermint = { version = "=0.36.0", default-features = false } tendermint = { version = "=0.38.1", default-features = false }
tendermint-light-client = { version = "=0.36.0", default-features = false, features = ["rust-crypto"] } tendermint-light-client = { version = "=0.38.1", default-features = false, features = ["rust-crypto"] }
tendermint-light-client-detector = { version = "=0.36.0", default-features = false } tendermint-light-client-detector = { version = "=0.38.1", default-features = false }
tendermint-rpc = { version = "=0.36.0", default-features = false, features = ["http-client"] } tendermint-rpc = { version = "=0.38.1", default-features = false, features = ["http-client"] }
# mobilecoin # mobilecoin
mc-sgx-core-types = { git = "https://github.com/informalsystems/sgx", default-features = false } mc-sgx-core-types = { git = "https://github.com/informalsystems/sgx", default-features = false }
@ -79,11 +78,11 @@ mc-attestation-verifier = { git = "https://github.com/informalsystems/attestatio
# quartz # quartz
cw-proof = { path = "core/light-client-proofs/cw-proof", default-features = false } cw-proof = { path = "core/light-client-proofs/cw-proof", default-features = false }
cycles-sync = { path = "utils/cycles-sync", default-features = false } cycles-sync = { path = "utils/cycles-sync", default-features = false }
quartz-common = { path = "core/quartz-common" } quartz-common = { path = "core/quartz-common"}
quartz-cw = { path = "cosmwasm/packages/quartz-cw", default-features = false } quartz-cw = { path = "cosmwasm/packages/quartz-cw", default-features = false }
quartz-enclave = { path = "core/quartz", default-features = false } quartz-enclave = { path = "core/quartz", default-features = false }
quartz-proto = { path = "core/quartz-proto", default-features = false } quartz-proto = { path = "core/quartz-proto", default-features = false }
quartz-relayer = { path = "relayer", default-features = false } quartz-relayer = { path = "relayer", default-features = false , features = ["mock-sgx"]}
quartz-tee-ra = { path = "cosmwasm/packages/quartz-tee-ra", default-features = false } quartz-tee-ra = { path = "cosmwasm/packages/quartz-tee-ra", default-features = false }
tm-prover = { path = "utils/tm-prover", default-features = false } tm-prover = { path = "utils/tm-prover", default-features = false }
tm-stateless-verifier = { path = "core/light-client-proofs/tm-stateless-verifier", default-features = false } tm-stateless-verifier = { path = "core/light-client-proofs/tm-stateless-verifier", default-features = false }

View file

@ -4,21 +4,149 @@ version = 3
[[package]] [[package]]
name = "ahash" name = "ahash"
version = "0.7.8" version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [ dependencies = [
"getrandom", "cfg-if",
"once_cell", "once_cell",
"version_check", "version_check",
"zerocopy",
] ]
[[package]]
name = "allocator-api2"
version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.86" version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" 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",
"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",
"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]] [[package]]
name = "asn1-rs" name = "asn1-rs"
version = "0.6.1" version = "0.6.1"
@ -70,12 +198,6 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf"
[[package]]
name = "base64"
version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]] [[package]]
name = "base64" name = "base64"
version = "0.22.1" version = "0.22.1"
@ -88,12 +210,6 @@ version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
[[package]]
name = "bech32"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445"
[[package]] [[package]]
name = "bech32" name = "bech32"
version = "0.11.0" version = "0.11.0"
@ -106,15 +222,6 @@ version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
[[package]]
name = "block-buffer"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
dependencies = [
"generic-array",
]
[[package]] [[package]]
name = "block-buffer" name = "block-buffer"
version = "0.10.4" version = "0.10.4"
@ -126,9 +233,9 @@ dependencies = [
[[package]] [[package]]
name = "bnum" name = "bnum"
version = "0.10.0" version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" checksum = "3e31ea183f6ee62ac8b8a8cf7feddd766317adfb13ff469de57ce033efd6a790"
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
@ -177,25 +284,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
[[package]] [[package]]
name = "cosmwasm-crypto" name = "cosmwasm-core"
version = "2.0.4" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7a339f6b59ff7ad4ae05a70512a4f3c19bf8fcc845d46bfef90f4ec0810f72c" checksum = "367fc87c43759098a476ef90f915aadc66c300480ad9c155b512081fbf327bc1"
[[package]]
name = "cosmwasm-crypto"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b7c41f3e371ea457d3b98bb592c38858b46efcf614e0e988ec2ebbdb973954f"
dependencies = [ dependencies = [
"digest 0.10.7", "ark-bls12-381",
"ark-ec",
"ark-ff",
"ark-serialize",
"cosmwasm-core",
"digest",
"ecdsa",
"ed25519-zebra", "ed25519-zebra",
"k256", "k256",
"rand_core 0.6.4", "num-traits",
"p256",
"rand_core",
"rayon",
"sha2",
"thiserror", "thiserror",
] ]
[[package]] [[package]]
name = "cosmwasm-derive" name = "cosmwasm-derive"
version = "2.0.4" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d3bfea6af94a83880fb05478135ed0c256d9a2fcde58c595a10d64dcb9c925d" checksum = "c10510e8eb66cf7e109741b1e2c76ad18f30b5a1daa064f5f7115c1f733aaea0"
dependencies = [ dependencies = [
"syn 1.0.109", "proc-macro2",
"quote",
"syn 2.0.70",
] ]
[[package]] [[package]]
@ -224,22 +349,23 @@ dependencies = [
[[package]] [[package]]
name = "cosmwasm-std" name = "cosmwasm-std"
version = "2.0.4" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ded932165de44cd0717979c34fc3b84d8e8066b8dde4f5bd78f96a643b090f90" checksum = "92011c39570876f340d5f9defa68bf92797b1c44421f1b9ea9b04a31d6defd33"
dependencies = [ dependencies = [
"base64 0.21.7", "base64",
"bech32 0.9.1", "bech32",
"bnum", "bnum",
"cosmwasm-core",
"cosmwasm-crypto", "cosmwasm-crypto",
"cosmwasm-derive", "cosmwasm-derive",
"derivative", "derive_more",
"forward_ref",
"hex", "hex",
"rand_core",
"schemars", "schemars",
"serde", "serde",
"serde-json-wasm", "serde-json-wasm",
"sha2 0.10.8", "sha2",
"static_assertions", "static_assertions",
"thiserror", "thiserror",
] ]
@ -253,6 +379,31 @@ dependencies = [
"libc", "libc",
] ]
[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
[[package]] [[package]]
name = "crypto-bigint" name = "crypto-bigint"
version = "0.5.5" version = "0.5.5"
@ -260,7 +411,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
dependencies = [ dependencies = [
"generic-array", "generic-array",
"rand_core 0.6.4", "rand_core",
"subtle", "subtle",
"zeroize", "zeroize",
] ]
@ -277,34 +428,48 @@ dependencies = [
[[package]] [[package]]
name = "curve25519-dalek" name = "curve25519-dalek"
version = "3.2.0" version = "4.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
dependencies = [ dependencies = [
"byteorder", "cfg-if",
"digest 0.9.0", "cpufeatures",
"rand_core 0.5.1", "curve25519-dalek-derive",
"digest",
"fiat-crypto",
"rustc_version",
"subtle", "subtle",
"zeroize", "zeroize",
] ]
[[package]] [[package]]
name = "cw-multi-test" name = "curve25519-dalek-derive"
version = "2.0.1" version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e403ad6ec62c8bcbcb75f7f4940712d0142b6103310da2a9375252b942358caa" checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.70",
]
[[package]]
name = "cw-multi-test"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0034bfb4c06dfc8b50f0b1a06c3fc0f2312a1bae568a97db65930de071288ba"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bech32 0.11.0", "bech32",
"cosmwasm-std", "cosmwasm-std",
"cw-storage-plus", "cw-storage-plus",
"cw-utils", "cw-utils",
"derivative", "derivative",
"itertools", "itertools 0.13.0",
"prost", "prost",
"schemars", "schemars",
"serde", "serde",
"sha2 0.10.8", "sha2",
"thiserror", "thiserror",
] ]
@ -336,7 +501,7 @@ dependencies = [
"quartz-common", "quartz-common",
"schemars", "schemars",
"serde_json", "serde_json",
"sha2 0.10.8", "sha2",
"thiserror", "thiserror",
] ]
@ -498,12 +663,24 @@ dependencies = [
] ]
[[package]] [[package]]
name = "digest" name = "derive_more"
version = "0.9.0" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05"
dependencies = [ dependencies = [
"generic-array", "derive_more-impl",
]
[[package]]
name = "derive_more-impl"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.70",
"unicode-xid",
] ]
[[package]] [[package]]
@ -512,7 +689,7 @@ version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [ dependencies = [
"block-buffer 0.10.4", "block-buffer",
"const-oid", "const-oid",
"crypto-common", "crypto-common",
"subtle", "subtle",
@ -542,7 +719,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca"
dependencies = [ dependencies = [
"der", "der",
"digest 0.10.7", "digest",
"elliptic-curve", "elliptic-curve",
"rfc6979", "rfc6979",
"signature", "signature",
@ -550,17 +727,26 @@ dependencies = [
] ]
[[package]] [[package]]
name = "ed25519-zebra" name = "ed25519"
version = "3.1.0" version = "2.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
dependencies = [
"signature",
]
[[package]]
name = "ed25519-zebra"
version = "4.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9"
dependencies = [ dependencies = [
"curve25519-dalek", "curve25519-dalek",
"hashbrown", "ed25519",
"hashbrown 0.14.5",
"hex", "hex",
"rand_core 0.6.4", "rand_core",
"serde", "sha2",
"sha2 0.9.9",
"zeroize", "zeroize",
] ]
@ -578,12 +764,12 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47"
dependencies = [ dependencies = [
"base16ct", "base16ct",
"crypto-bigint", "crypto-bigint",
"digest 0.10.7", "digest",
"ff", "ff",
"generic-array", "generic-array",
"group", "group",
"pkcs8", "pkcs8",
"rand_core 0.6.4", "rand_core",
"sec1", "sec1",
"subtle", "subtle",
"zeroize", "zeroize",
@ -595,10 +781,16 @@ version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449"
dependencies = [ dependencies = [
"rand_core 0.6.4", "rand_core",
"subtle", "subtle",
] ]
[[package]]
name = "fiat-crypto"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
[[package]] [[package]]
name = "flagset" name = "flagset"
version = "0.4.5" version = "0.4.5"
@ -611,12 +803,6 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "forward_ref"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e"
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.14.7" version = "0.14.7"
@ -648,19 +834,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
dependencies = [ dependencies = [
"ff", "ff",
"rand_core 0.6.4", "rand_core",
"subtle", "subtle",
] ]
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.12.3" version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
dependencies = [ dependencies = [
"ahash", "ahash",
] ]
[[package]]
name = "hashbrown"
version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
"ahash",
"allocator-api2",
]
[[package]] [[package]]
name = "hex" name = "hex"
version = "0.4.3" version = "0.4.3"
@ -682,7 +878,7 @@ version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
dependencies = [ dependencies = [
"digest 0.10.7", "digest",
] ]
[[package]] [[package]]
@ -691,6 +887,15 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "itertools"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
dependencies = [
"either",
]
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.12.1" version = "0.12.1"
@ -700,6 +905,15 @@ dependencies = [
"either", "either",
] ]
[[package]]
name = "itertools"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [
"either",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.11" version = "1.0.11"
@ -724,9 +938,7 @@ dependencies = [
"cfg-if", "cfg-if",
"ecdsa", "ecdsa",
"elliptic-curve", "elliptic-curve",
"once_cell", "sha2",
"sha2 0.10.8",
"signature",
] ]
[[package]] [[package]]
@ -786,7 +998,7 @@ dependencies = [
"mc-sgx-core-sys-types", "mc-sgx-core-sys-types",
"mc-sgx-util", "mc-sgx-util",
"nom", "nom",
"rand_core 0.6.4", "rand_core",
"serde", "serde",
"subtle", "subtle",
] ]
@ -813,7 +1025,7 @@ dependencies = [
"nom", "nom",
"p256", "p256",
"serde", "serde",
"sha2 0.10.8", "sha2",
"static_assertions", "static_assertions",
"subtle", "subtle",
"x509-cert", "x509-cert",
@ -895,12 +1107,6 @@ version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "opaque-debug"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]] [[package]]
name = "p256" name = "p256"
version = "0.13.2" version = "0.13.2"
@ -910,9 +1116,15 @@ dependencies = [
"ecdsa", "ecdsa",
"elliptic-curve", "elliptic-curve",
"primeorder", "primeorder",
"sha2 0.10.8", "sha2",
] ]
[[package]]
name = "paste"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]] [[package]]
name = "pem-rfc7468" name = "pem-rfc7468"
version = "0.7.0" version = "0.7.0"
@ -938,6 +1150,15 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
dependencies = [
"zerocopy",
]
[[package]] [[package]]
name = "primeorder" name = "primeorder"
version = "0.13.6" version = "0.13.6"
@ -973,7 +1194,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"itertools", "itertools 0.12.1",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.70", "syn 2.0.70",
@ -998,7 +1219,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"serde_with", "serde_with",
"sha2 0.10.8", "sha2",
"thiserror", "thiserror",
] ]
@ -1018,7 +1239,7 @@ dependencies = [
"num-bigint", "num-bigint",
"serde", "serde",
"serde_json", "serde_json",
"sha2 0.10.8", "sha2",
"thiserror", "thiserror",
"x509-cert", "x509-cert",
"x509-parser", "x509-parser",
@ -1035,10 +1256,24 @@ dependencies = [
] ]
[[package]] [[package]]
name = "rand_core" name = "rand"
version = "0.5.1" version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"rand_chacha",
"rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]] [[package]]
name = "rand_core" name = "rand_core"
@ -1049,6 +1284,26 @@ dependencies = [
"getrandom", "getrandom",
] ]
[[package]]
name = "rayon"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]] [[package]]
name = "rfc6979" name = "rfc6979"
version = "0.4.0" version = "0.4.0"
@ -1074,6 +1329,15 @@ dependencies = [
"windows-sys", "windows-sys",
] ]
[[package]]
name = "rustc_version"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
dependencies = [
"semver",
]
[[package]] [[package]]
name = "rusticata-macros" name = "rusticata-macros"
version = "4.1.0" version = "4.1.0"
@ -1190,7 +1454,7 @@ version = "3.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e73139bc5ec2d45e6c5fd85be5a46949c1c39a4c18e56915f5eb4c12f975e377" checksum = "e73139bc5ec2d45e6c5fd85be5a46949c1c39a4c18e56915f5eb4c12f975e377"
dependencies = [ dependencies = [
"base64 0.22.1", "base64",
"chrono", "chrono",
"hex", "hex",
"serde", "serde",
@ -1212,19 +1476,6 @@ dependencies = [
"syn 2.0.70", "syn 2.0.70",
] ]
[[package]]
name = "sha2"
version = "0.9.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
dependencies = [
"block-buffer 0.9.0",
"cfg-if",
"cpufeatures",
"digest 0.9.0",
"opaque-debug",
]
[[package]] [[package]]
name = "sha2" name = "sha2"
version = "0.10.8" version = "0.10.8"
@ -1233,7 +1484,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"cpufeatures", "cpufeatures",
"digest 0.10.7", "digest",
] ]
[[package]] [[package]]
@ -1242,8 +1493,8 @@ version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
dependencies = [ dependencies = [
"digest 0.10.7", "digest",
"rand_core 0.6.4", "rand_core",
] ]
[[package]] [[package]]
@ -1376,6 +1627,12 @@ version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "unicode-xid"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]] [[package]]
name = "untrusted" name = "untrusted"
version = "0.9.0" version = "0.9.0"
@ -1550,8 +1807,43 @@ dependencies = [
"time", "time",
] ]
[[package]]
name = "zerocopy"
version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
"byteorder",
"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.70",
]
[[package]] [[package]]
name = "zeroize" name = "zeroize"
version = "1.8.1" version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
dependencies = [
"zeroize_derive",
]
[[package]]
name = "zeroize_derive"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.70",
]

View file

@ -37,20 +37,20 @@ serde_json = "1.0.117"
thiserror = { version = "1.0.49" } thiserror = { version = "1.0.49" }
# cosmwasm # cosmwasm
cosmwasm-schema = { version = "2.0.0", default-features = false } cosmwasm-schema = { version = "2.1.1", default-features = false }
cosmwasm-std = { version = "2.0.0", default-features = false, features = ["std"] } cosmwasm-std = { version = "2.1.1", default-features = false, features = ["std"] }
cw-storage-plus = { version = "2.0.0", default-features = false } cw-storage-plus = { version = "2.0.0", default-features = false }
cw20-base = { version = "2.0.0", features = ["library"] } cw20-base = { version = "2.0.0", features = ["library"] }
cw20 = "2.0.0" cw20 = "2.0.0"
cw2 = "2.0.0" cw2 = "2.0.0"
# quartz # quartz
quartz-common = { path = "../../../../core/quartz-common/", features = ["contract"]} quartz-common = { path = "../../../../core/quartz-common", features = ["contract"]}
# patch indirect deps # patch indirect deps
getrandom = { version = "0.2.15", features = ["js"] } getrandom = { version = "0.2.15", features = ["js"] }
[dev-dependencies] [dev-dependencies]
cosmwasm-schema = "2.1.1" cosmwasm-schema = "2.1.1"
cw-multi-test = "2.0.0" cw-multi-test = "2.1.0"
serde_json = "1.0.113" serde_json = "1.0.113"

View file

@ -182,9 +182,7 @@ pub mod execute {
let mut new_sources = vec![]; let mut new_sources = vec![];
for liquidity_source in new_liquidity_sources { for liquidity_source in new_liquidity_sources {
// Validate the Cosmos address // Validate the Cosmos address
let address = deps let address = deps.api.addr_validate(liquidity_source.address.as_ref())?;
.api
.addr_validate(&liquidity_source.address.to_string())?;
let liquidity_source = LiquiditySource { let liquidity_source = LiquiditySource {
address: address.clone(), address: address.clone(),
@ -292,27 +290,23 @@ pub mod execute {
} }
LiquiditySourceType::Overdraft => { LiquiditySourceType::Overdraft => {
if is_payer { if is_payer {
let increase_msg = WasmMsg::Execute { WasmMsg::Execute {
contract_addr: source.address.to_string(), contract_addr: source.address.to_string(),
msg: to_json_binary(&OverdraftExecuteMsg::IncreaseBalance { msg: to_json_binary(&OverdraftExecuteMsg::IncreaseBalance {
receiver: transfer.payee.clone(), receiver: transfer.payee.clone(),
amount: transfer.amount.1, amount: transfer.amount.1,
})?, })?,
funds: vec![], funds: vec![],
}; }
increase_msg
} else { } else {
let decrease_msg = WasmMsg::Execute { WasmMsg::Execute {
contract_addr: source.address.to_string(), contract_addr: source.address.to_string(),
msg: to_json_binary(&OverdraftExecuteMsg::DecreaseBalance { msg: to_json_binary(&OverdraftExecuteMsg::DecreaseBalance {
receiver: transfer.payer.clone(), receiver: transfer.payer.clone(),
amount: transfer.amount.1, amount: transfer.amount.1,
})?, })?,
funds: vec![], funds: vec![],
}; }
decrease_msg
} }
} }
LiquiditySourceType::External => { LiquiditySourceType::External => {

View file

@ -46,7 +46,7 @@ mtcs.workspace = true
quartz-common = { workspace = true, features = ["full"]} quartz-common = { workspace = true, features = ["full"]}
[dev-dependencies] [dev-dependencies]
cw-multi-test = "2.0.0" cw-multi-test = "2.1.0"
[build-dependencies] [build-dependencies]
tonic-build.workspace = true tonic-build.workspace = true

View file

@ -137,19 +137,17 @@ pub mod clearing_server {
} }
#[derive(Debug)] #[derive(Debug)]
pub struct ClearingServer<T: Clearing> { pub struct ClearingServer<T: Clearing> {
inner: _Inner<T>, inner: Arc<T>,
accept_compression_encodings: EnabledCompressionEncodings, accept_compression_encodings: EnabledCompressionEncodings,
send_compression_encodings: EnabledCompressionEncodings, send_compression_encodings: EnabledCompressionEncodings,
max_decoding_message_size: Option<usize>, max_decoding_message_size: Option<usize>,
max_encoding_message_size: Option<usize>, max_encoding_message_size: Option<usize>,
} }
struct _Inner<T>(Arc<T>);
impl<T: Clearing> ClearingServer<T> { impl<T: Clearing> ClearingServer<T> {
pub fn new(inner: T) -> Self { pub fn new(inner: T) -> Self {
Self::from_arc(Arc::new(inner)) Self::from_arc(Arc::new(inner))
} }
pub fn from_arc(inner: Arc<T>) -> Self { pub fn from_arc(inner: Arc<T>) -> Self {
let inner = _Inner(inner);
Self { Self {
inner, inner,
accept_compression_encodings: Default::default(), accept_compression_encodings: Default::default(),
@ -212,7 +210,6 @@ pub mod clearing_server {
Poll::Ready(Ok(())) Poll::Ready(Ok(()))
} }
fn call(&mut self, req: http::Request<B>) -> Self::Future { fn call(&mut self, req: http::Request<B>) -> Self::Future {
let inner = self.inner.clone();
match req.uri().path() { match req.uri().path() {
"/mtcs.Clearing/Run" => { "/mtcs.Clearing/Run" => {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
@ -243,7 +240,6 @@ pub mod clearing_server {
let max_encoding_message_size = self.max_encoding_message_size; let max_encoding_message_size = self.max_encoding_message_size;
let inner = self.inner.clone(); let inner = self.inner.clone();
let fut = async move { let fut = async move {
let inner = inner.0;
let method = RunSvc(inner); let method = RunSvc(inner);
let codec = tonic::codec::ProstCodec::default(); let codec = tonic::codec::ProstCodec::default();
let mut grpc = tonic::server::Grpc::new(codec) let mut grpc = tonic::server::Grpc::new(codec)
@ -265,8 +261,11 @@ pub mod clearing_server {
Ok( Ok(
http::Response::builder() http::Response::builder()
.status(200) .status(200)
.header("grpc-status", "12") .header("grpc-status", tonic::Code::Unimplemented as i32)
.header("content-type", "application/grpc") .header(
http::header::CONTENT_TYPE,
tonic::metadata::GRPC_CONTENT_TYPE,
)
.body(empty_body()) .body(empty_body())
.unwrap(), .unwrap(),
) )
@ -287,16 +286,6 @@ pub mod clearing_server {
} }
} }
} }
impl<T: Clearing> Clone for _Inner<T> {
fn clone(&self) -> Self {
Self(Arc::clone(&self.0))
}
}
impl<T: std::fmt::Debug> std::fmt::Debug for _Inner<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self.0)
}
}
impl<T: Clearing> tonic::server::NamedService for ClearingServer<T> { impl<T: Clearing> tonic::server::NamedService for ClearingServer<T> {
const NAME: &'static str = "mtcs.Clearing"; const NAME: &'static str = "mtcs.Clearing";
} }

View file

@ -35,7 +35,7 @@ base64 = "0.22.1"
subtle-encoding = "0.5.1" subtle-encoding = "0.5.1"
tokio-tungstenite = "0.23.1" tokio-tungstenite = "0.23.1"
futures-util = "0.3.30" futures-util = "0.3.30"
tendermint-rpc = { version ="0.36.0", features=["websocket-client", "http-client"]} tendermint-rpc = { version ="0.38.1", features=["websocket-client", "http-client"]}
# cosmos # cosmos
cosmrs.workspace = true cosmrs.workspace = true

View file

@ -20,6 +20,12 @@ version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
[[package]]
name = "anyhow"
version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]] [[package]]
name = "ark-bls12-381" name = "ark-bls12-381"
version = "0.4.0" version = "0.4.0"
@ -44,7 +50,7 @@ dependencies = [
"ark-std", "ark-std",
"derivative", "derivative",
"hashbrown 0.13.2", "hashbrown 0.13.2",
"itertools", "itertools 0.10.5",
"num-traits", "num-traits",
"rayon", "rayon",
"zeroize", "zeroize",
@ -62,7 +68,7 @@ dependencies = [
"ark-std", "ark-std",
"derivative", "derivative",
"digest", "digest",
"itertools", "itertools 0.10.5",
"num-bigint", "num-bigint",
"num-traits", "num-traits",
"paste", "paste",
@ -237,6 +243,12 @@ version = "3.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
name = "bytes"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.1.6" version = "1.1.6"
@ -267,15 +279,15 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
[[package]] [[package]]
name = "cosmwasm-core" name = "cosmwasm-core"
version = "2.1.0" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d075f6bb1483a6ce83b5cbc73a3a1207e0316ac1e34ed1f2a4d9fc3a0f07bf6" checksum = "367fc87c43759098a476ef90f915aadc66c300480ad9c155b512081fbf327bc1"
[[package]] [[package]]
name = "cosmwasm-crypto" name = "cosmwasm-crypto"
version = "2.1.0" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88ced5a6dd2801a383d3e14e5ae5caa7fdfeff1bd9f22b30e810e0aded8a5869" checksum = "9b7c41f3e371ea457d3b98bb592c38858b46efcf614e0e988ec2ebbdb973954f"
dependencies = [ dependencies = [
"ark-bls12-381", "ark-bls12-381",
"ark-ec", "ark-ec",
@ -296,9 +308,9 @@ dependencies = [
[[package]] [[package]]
name = "cosmwasm-derive" name = "cosmwasm-derive"
version = "2.1.0" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35bd1873f84d9b17edf8a90ffe10a89a649b82feacc00e36788b81d2c3cbf03c" checksum = "c10510e8eb66cf7e109741b1e2c76ad18f30b5a1daa064f5f7115c1f733aaea0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -307,9 +319,9 @@ dependencies = [
[[package]] [[package]]
name = "cosmwasm-schema" name = "cosmwasm-schema"
version = "2.1.0" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27984b137eb2ac561f97f6bdb02004a98eb6f2ba263062c140b8e231ee1826b7" checksum = "f79879b6b7ef6a331b05030ce91ce46a7c4b0baf1ed6b382cce2e9a168109380"
dependencies = [ dependencies = [
"cosmwasm-schema-derive", "cosmwasm-schema-derive",
"schemars", "schemars",
@ -320,9 +332,9 @@ dependencies = [
[[package]] [[package]]
name = "cosmwasm-schema-derive" name = "cosmwasm-schema-derive"
version = "2.1.0" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4ef0d201f611bdb6c9124207032423eb956f1fc8ab3e3ee7253a9c08a5f5809" checksum = "82b53e33c0e97170c7ac9cb440f4bc599a07f9cbb9b7e87916cca37b1239d57b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -331,9 +343,9 @@ dependencies = [
[[package]] [[package]]
name = "cosmwasm-std" name = "cosmwasm-std"
version = "2.1.0" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2522fb5c9a0409712bb1d036128bccf3564e6b2ac82f942ae4cf3c8df3e26fa8" checksum = "92011c39570876f340d5f9defa68bf92797b1c44421f1b9ea9b04a31d6defd33"
dependencies = [ dependencies = [
"base64", "base64",
"bech32", "bech32",
@ -435,6 +447,26 @@ dependencies = [
"syn 2.0.72", "syn 2.0.72",
] ]
[[package]]
name = "cw-multi-test"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0034bfb4c06dfc8b50f0b1a06c3fc0f2312a1bae568a97db65930de071288ba"
dependencies = [
"anyhow",
"bech32",
"cosmwasm-std",
"cw-storage-plus",
"cw-utils",
"derivative",
"itertools 0.13.0",
"prost",
"schemars",
"serde",
"sha2",
"thiserror",
]
[[package]] [[package]]
name = "cw-storage-plus" name = "cw-storage-plus"
version = "2.0.0" version = "2.0.0"
@ -837,6 +869,15 @@ dependencies = [
"either", "either",
] ]
[[package]]
name = "itertools"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [
"either",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.11" version = "1.0.11"
@ -1097,6 +1138,29 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "prost"
version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29"
dependencies = [
"bytes",
"prost-derive",
]
[[package]]
name = "prost-derive"
version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
dependencies = [
"anyhow",
"itertools 0.10.5",
"proc-macro2",
"quote",
"syn 2.0.72",
]
[[package]] [[package]]
name = "quartz-common" name = "quartz-common"
version = "0.1.0" version = "0.1.0"
@ -1336,11 +1400,12 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.120" version = "1.0.122"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da"
dependencies = [ dependencies = [
"itoa", "itoa",
"memchr",
"ryu", "ryu",
"serde", "serde",
] ]
@ -1518,6 +1583,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"cosmwasm-schema", "cosmwasm-schema",
"cosmwasm-std", "cosmwasm-std",
"cw-multi-test",
"cw-storage-plus", "cw-storage-plus",
"cw-utils", "cw-utils",
"cw2", "cw2",

View file

@ -23,25 +23,32 @@ panic = 'abort'
incremental = false incremental = false
overflow-checks = true overflow-checks = true
[features] [features]
library = []
mock-sgx = ["quartz-common/mock-sgx-cw"] mock-sgx = ["quartz-common/mock-sgx-cw"]
library = []
[dependencies] [dependencies]
# external # external
sha2 = "0.10.8" sha2 = "0.10.8"
serde_json = "1.0.117" serde_json = { version = "1.0.122", default-features = false, features = ["alloc"] }
serde = { version = "1.0.137", default-features = false, features = ["derive"] } serde = { version = "1.0.204", default-features = false, features = ["derive"] }
thiserror = { version = "1.0.49" } thiserror = { version = "1.0.63" }
getrandom = { version = "0.2.15", features = ["js"] }
# cosmwasm # cosmwasm
cosmwasm-schema = { version = "2.0.0", default-features = false } cosmwasm-std = { version = "2.1.1", default-features = false }
cosmwasm-std = { version = "2.0.0", default-features = false, features = ["std"] } cosmwasm-schema = { version = "2.1.1", default-features = false }
cw2 = { version = "2.0.0", default-features = false }
cw-storage-plus = { version = "2.0.0", default-features = false } cw-storage-plus = { version = "2.0.0", default-features = false }
cw-utils = "2.0.0" cw20-base = { version = "2.0.0", default-features = false, features = ["library"] }
cw20-base = { version = "2.0.0", features = ["library"] } cw-utils = { version = "2.0.0", default-features = false }
cw2 = "2.0.0"
# quartz # quartz
quartz-common = { path = "../../../core/quartz-common", features=["contract"]} quartz-common = { path = "../../../core/quartz-common", default-features = false, features = ["contract"] }
# patch indirect deps
getrandom = { version = "0.2.15", default-features = false, features = ["js"] }
[dev-dependencies]
cw-multi-test = { version = "2.1.0", default-features = false }
serde_json = "1.0.122"

View file

@ -0,0 +1,355 @@
#!/bin/bash
set -eo pipefail
# Color definitions
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# Function to print colored and formatted messages
print_message() {
local color=$1
local message=$2
echo -e "${color}${BOLD}${message}${NC}"
}
# Function to print section headers
print_header() {
local message=$1
echo -e "\n${MAGENTA}${BOLD}======== $message ========${NC}\n"
}
# Function to print success messages
print_success() {
local message=$1
echo -e "${GREEN}${BOLD}$message${NC}"
}
# Function to print error messages
print_error() {
local message=$1
echo -e "${RED}${BOLD}❌ Error: $message${NC}"
exit 1
}
# Function to print waiting messages
print_waiting() {
local message=$1
echo -e "${YELLOW}${BOLD}$message${NC}"
}
# Function to update and display progress
update_progress() {
local step=$1
local total_steps=$2
local percentage=$((step * 100 / total_steps))
print_message $BLUE "Progress: [$percentage%] Step $step of $total_steps"
}
# Set up variables
ROOT=${ROOT:-$(git rev-parse --show-toplevel)}
WASMD_HOME=${WASMD_HOME:-"$HOME/.neutrond"}
USER_ADDR=$(neutrond keys show -a "val1" --keyring-backend test --home "$WASMD_HOME" --keyring-dir "$WASMD_HOME")
if [ -z "$USER_ADDR" ]; then
print_error "User address not found. Please ensure the key exists in the keyring."
fi
WASM_BIN="$1"
INSTANTIATE_MSG="$2"
NODE_URL=${NODE_URL:-127.0.0.1:26657}
LABEL=${LABEL:-quartz-transfers-app}
COUNT=${COUNT:-0}
QUARTZ_PORT="${QUARTZ_PORT:-11090}"
CHAIN_ID=${CHAIN_ID:-test-1}
TXFLAG="--chain-id ${CHAIN_ID} --gas-prices 0.0025untrn --gas auto --gas-adjustment 1.3 --keyring-dir "$WASMD_HOME" --keyring-backend "test" "
CMD="neutrond --node http://$NODE_URL"
TOTAL_STEPS=7
CURRENT_STEP=0
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Deploying WASM Contract"
print_message $CYAN "Contract: ${WASM_BIN}"
print_message $CYAN "Chain ID: ${CHAIN_ID}"
print_message $CYAN "User Address: ${USER_ADDR}"
print_message $CYAN "Command: $CMD"
print_message $BLUE "Storing WASM contract..."
RES=$($CMD tx wasm store "$WASM_BIN" --from "$USER_ADDR" $TXFLAG -y --output json )
TX_HASH=$(echo "$RES" | jq -r '.txhash')
print_message $CYAN "Transaction hash: $TX_HASH"
print_waiting "Waiting for transaction to be included in a block..."
ATTEMPTS=0
MAX_ATTEMPTS=30
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
TX_RESULT=$($CMD query tx "$TX_HASH" --output json 2>/dev/null || echo '{"code": 1}')
TX_CODE=$(echo "$TX_RESULT" | jq -r '.code // .tx_result.code // 1')
if [[ $TX_CODE == "0" ]]; then
print_success "Transaction processed successfully."
break
elif [[ $TX_CODE != "1" ]]; then
print_error "Error processing transaction. Code: $TX_CODE"
fi
print_waiting "Transaction not yet processed. Waiting... (Attempt $((ATTEMPTS+1))/$MAX_ATTEMPTS)"
sleep 2
ATTEMPTS=$((ATTEMPTS+1))
done
if [ $ATTEMPTS -eq $MAX_ATTEMPTS ]; then
print_error "Failed to retrieve transaction after $MAX_ATTEMPTS attempts."
fi
print_message $BLUE "Extracting CODE_ID..."
CODE_ID=$(echo "$TX_RESULT" | jq -r '.events[] | select(.type=="store_code") | .attributes[] | select(.key=="code_id") | .value')
print_message $CYAN "Extracted CODE_ID: $CODE_ID"
if [[ -z "$CODE_ID" || "$CODE_ID" == "null" ]]; then
print_error "Failed to extract CODE_ID."
fi
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Instantiating Contract"
print_message $CYAN "Label: ${LABEL}"
print_message $CYAN "Code ID: ${CODE_ID}"
INSTANTIATE_MSG_PARSED=$(echo "$INSTANTIATE_MSG" | jq -r '.')
INSTANTIATE_MSG_ONELINE=$(echo "$INSTANTIATE_MSG_PARSED" | jq '{quartz: .} + {denom: "untrn"}' )
# Print the instantiate message for debugging
echo "Instantiate message: $INSTANTIATE_MSG_ONELINE"
INSTANTIATE_CMD="$CMD tx wasm instantiate $CODE_ID '$INSTANTIATE_MSG_ONELINE' --from "$USER_ADDR" $TXFLAG --label $LABEL -y --no-admin --output json"
print_message $BLUE "Executing instantiate command..."
RES=$(eval "$INSTANTIATE_CMD")
TX_HASH=$(echo "$RES" | jq -r '.txhash')
print_waiting "Waiting for instantiate transaction to be processed..."
ATTEMPTS=0
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
TX_RESULT=$($CMD query tx "$TX_HASH" --output json 2>/dev/null || echo '{"code": 1}')
TX_CODE=$(echo "$TX_RESULT" | jq -r '.code // .tx_result.code // 1')
if [[ $TX_CODE == "0" ]]; then
print_success "Instantiate transaction processed successfully."
break
elif [[ $TX_CODE != "1" ]]; then
print_error "Error processing instantiate transaction. Code: $TX_CODE"
fi
print_waiting "Instantiate transaction not yet processed. Waiting... (Attempt $((ATTEMPTS+1))/$MAX_ATTEMPTS)"
sleep 2
ATTEMPTS=$((ATTEMPTS+1))
done
if [ $ATTEMPTS -eq $MAX_ATTEMPTS ]; then
print_error "Failed to retrieve instantiate transaction after $MAX_ATTEMPTS attempts."
fi
print_message $BLUE "Querying for instantiated contract..."
RES=$($CMD query wasm list-contract-by-code "$CODE_ID" --output json)
CONTRACT=$(echo "$RES" | jq -r '.contracts[0]')
if [[ -z "$CONTRACT" || "$CONTRACT" == "null" ]]; then
print_error "Failed to retrieve contract address."
fi
print_message $CYAN "CONTRACT: $CONTRACT"
cd $ROOT/relayer
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Executing SessionCreate on Enclave"
export EXECUTE_CREATE=$(QUARTZ_PORT=$QUARTZ_PORT ./scripts/relay.sh SessionCreate)
if [ -z "$EXECUTE_CREATE" ]; then
print_error "Failed to execute SessionCreate on enclave"
fi
print_success "SessionCreate execution successful"
print_message $BLUE "Submitting SessionCreate to contract..."
RES=$($CMD tx wasm execute "$CONTRACT" "$EXECUTE_CREATE" --from "$USER_ADDR" $TXFLAG --keyring-backend "test" --keyring-dir "$WASMD_HOME" -y --output json)
TX_HASH=$(echo "$RES" | jq -r '.txhash')
if [ -z "$TX_HASH" ] || [ "$TX_HASH" == "null" ]; then
print_error "Failed to retrieve transaction hash"
fi
print_message $CYAN "Transaction hash: $TX_HASH"
print_waiting "Waiting for transaction to be included in a block..."
ATTEMPTS=0
MAX_ATTEMPTS=30
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
TX_RESULT=$($CMD query tx "$TX_HASH" --output json 2>/dev/null || echo '{"code": 1}')
TX_CODE=$(echo "$TX_RESULT" | jq -r '.code // .tx_result.code // 1')
if [[ $TX_CODE == "0" ]]; then
print_success "Transaction processed successfully."
break
elif [[ $TX_CODE != "1" ]]; then
print_error "Error processing transaction. Code: $TX_CODE"
fi
print_waiting "Transaction not yet processed. Waiting... (Attempt $((ATTEMPTS+1))/$MAX_ATTEMPTS)"
sleep 2
ATTEMPTS=$((ATTEMPTS+1))
done
if [ $ATTEMPTS -eq $MAX_ATTEMPTS ]; then
print_error "Failed to retrieve transaction after $MAX_ATTEMPTS attempts."
fi
print_success "Handshake process completed"
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Setting Session PK"
cd $ROOT/utils/tm-prover
export PROOF_FILE="light-client-proof.json"
rm -f "$PROOF_FILE"
print_message $BLUE "Removed old $PROOF_FILE"
# print_waiting "Waiting for new blocks to be produced..."
print_waiting "Waiting for transaction to be included in a block..."
ATTEMPTS=0
MAX_ATTEMPTS=30
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
TX_RESULT=$($CMD query tx "$TX_HASH" --output json 2>/dev/null || echo '{"code": 1}')
TX_CODE=$(echo "$TX_RESULT" | jq -r '.code // .tx_result.code // 1')
if [[ $TX_CODE == "0" ]]; then
print_success "Transaction processed successfully."
break
elif [[ $TX_CODE != "1" ]]; then
print_error "Error processing transaction. Code: $TX_CODE"
fi
print_waiting "Transaction not yet processed. Waiting... (Attempt $((ATTEMPTS+1))/$MAX_ATTEMPTS)"
sleep 2
ATTEMPTS=$((ATTEMPTS+1))
done
print_success "Required blocks produced. Proceeding with tm-prover..."
cd "$ROOT/apps/transfers"
export TRUSTED_HASH=$(cat trusted.hash)
export TRUSTED_HEIGHT=$(cat trusted.height)
print_message $CYAN "Trusted hash: $TRUSTED_HASH"
print_message $CYAN "Trusted height: $TRUSTED_HEIGHT"
cd $ROOT/utils/tm-prover
export QUARTZ_SESSION=$($CMD query wasm contract-state raw $CONTRACT $(echo -n "quartz_session" | xxd -p -c 20) --node "http://$NODE_URL")
print_message $CYAN "Quartz Session before prover: $QUARTZ_SESSION"
export PROOF_FILE="light-client-proof.json"
if [ -f "$PROOF_FILE" ]; then
rm "$PROOF_FILE"
print_message $BLUE "Removed old $PROOF_FILE"
fi
print_message $BLUE "Running prover to get light client proof..."
cargo run -- --chain-id test-1 \
--primary "http://$NODE_URL" \
--witnesses "http://$NODE_URL" \
--trusted-height $TRUSTED_HEIGHT \
--trusted-hash $TRUSTED_HASH \
--contract-address $CONTRACT \
--storage-key "quartz_session" \
--trace-file $PROOF_FILE > /dev/null 2>&1
if [ $? -eq 0 ]; then
print_success "Light client proof generated successfully"
else
print_error "Failed to generate light client proof"
fi
export POP=$(cat $PROOF_FILE)
export POP_MSG=$(jq -nc --arg message "$POP" '$ARGS.named')
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Executing SessionSetPubKey on Enclave"
cd $ROOT/relayer
export EXECUTE_SETPUB=$(QUARTZ_PORT=$QUARTZ_PORT ./scripts/relay.sh SessionSetPubKey "$POP_MSG")
RES=$($CMD tx wasm execute "$CONTRACT" "$EXECUTE_SETPUB" --from "$USER_ADDR" $TXFLAG --keyring-backend "test" --keyring-dir "$WASMD_HOME" -y --output json)
TX_HASH=$(echo $RES | jq -r '.txhash')
if [ -z "$TX_HASH" ] || [ "$TX_HASH" == "null" ]; then
print_error "Failed to retrieve transaction hash"
fi
print_message $CYAN "Transaction hash: $TX_HASH"
print_waiting "Waiting for transaction to commit..."
ATTEMPTS=0
MAX_ATTEMPTS=30
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
if $CMD query tx "$TX_HASH" &> /dev/null; then
print_success "Transaction committed successfully"
break
fi
print_waiting "Waiting for tx (Attempt $((ATTEMPTS+1))/$MAX_ATTEMPTS)"
sleep 2
ATTEMPTS=$((ATTEMPTS+1))
done
if [ $ATTEMPTS -eq $MAX_ATTEMPTS ]; then
print_error "Transaction failed to commit after $MAX_ATTEMPTS attempts"
fi
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Checking Session Success"
export NONCE_AND_KEY=$($CMD query wasm contract-state raw "$CONTRACT" $(printf '%s' "quartz_session" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d)
# echo $NONCE_AND_KEY
export PUBKEY=$(echo $NONCE_AND_KEY | jq -r .pub_key)
update_progress $TOTAL_STEPS $TOTAL_STEPS
print_header "Deployment Summary"
print_success "Deployment and handshake completed successfully!"
echo -e "${CYAN}${BOLD}"
echo "📌 Contract Details:"
echo " • Address: ${CONTRACT}"
echo " • Code ID: ${CODE_ID}"
echo " • Label: ${LABEL}"
echo " • Chain ID: ${CHAIN_ID}"
echo
echo "🔑 Contract Key Information:"
echo " • Public Key: ${PUBKEY}"
echo
echo "🌐 Network Information:"
echo " • Node URL: ${NODE_URL}"
echo " • Quartz Port: ${QUARTZ_PORT}"
echo
echo "👤 User Information:"
echo " • Address: ${USER_ADDR}"
echo " • Keyring Backend: test"
echo " • Keyring Directory: /home/peppi/.neutrond/"
echo
echo "🔧 Additional Settings:"
echo " • Gas Prices: 0.0025untrn"
echo " • Gas Adjustment: 1.3"
echo -e "${NC}"
# ASCII art logo for QUARTZ
cat << "EOF"
██████ ██ ██ █████ ██████ ████████ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ███████ ██████ ██ ███████
██ ▄▄ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██████ ██ ██ ██ ██ ██ ███████
▀▀
POWERED BY INFORMAL.SYSTEMMS
EOF
print_message $MAGENTA "We hope you'll enjoy developing Quartz Apps!"

View file

@ -214,7 +214,7 @@ pub mod execute {
msg: QueryResponseMsg, msg: QueryResponseMsg,
) -> Result<Response, ContractError> { ) -> Result<Response, ContractError> {
// Store state // Store state
BALANCES.save(deps.storage, &msg.address.to_string(), &msg.encrypted_bal)?; BALANCES.save(deps.storage, msg.address.as_ref(), &msg.encrypted_bal)?;
// Emit event // Emit event
let event = Event::new("store_balance") let event = Event::new("store_balance")

View file

@ -1,3 +1,12 @@
#![deny(
warnings,
trivial_casts,
trivial_numeric_casts,
unused_import_braces,
unused_qualifications
)]
#![forbid(unsafe_code)]
extern crate cosmwasm_std; extern crate cosmwasm_std;
pub mod contract; pub mod contract;

View file

@ -11,6 +11,7 @@ path = "bin/encrypt.rs"
[features] [features]
mock-sgx = ["quartz-common/mock-sgx-cw", "quartz-common/mock-sgx-enclave"] mock-sgx = ["quartz-common/mock-sgx-cw", "quartz-common/mock-sgx-enclave"]
default = []
[dependencies] [dependencies]
# external # external
@ -31,18 +32,16 @@ tonic.workspace = true
# cosmos # cosmos
cosmrs.workspace = true cosmrs.workspace = true
cosmwasm-std.workspace = true cosmwasm-std.workspace = true
cycles-sync.workspace = true
tendermint.workspace = true tendermint.workspace = true
tendermint-light-client.workspace = true tendermint-light-client.workspace = true
cycles-sync.workspace = true
transfers-contract.workspace = true transfers-contract.workspace = true
# quartz # quartz
quartz-common = { workspace=true, features=["full"]} quartz-common = { workspace=true, features=["full"]}
[dev-dependencies] [dev-dependencies]
cw-multi-test = "0.17.0" cw-multi-test = "2.1.0"
[build-dependencies] [build-dependencies]
tonic-build.workspace = true tonic-build.workspace = true

View file

@ -169,19 +169,17 @@ pub mod settlement_server {
} }
#[derive(Debug)] #[derive(Debug)]
pub struct SettlementServer<T: Settlement> { pub struct SettlementServer<T: Settlement> {
inner: _Inner<T>, inner: Arc<T>,
accept_compression_encodings: EnabledCompressionEncodings, accept_compression_encodings: EnabledCompressionEncodings,
send_compression_encodings: EnabledCompressionEncodings, send_compression_encodings: EnabledCompressionEncodings,
max_decoding_message_size: Option<usize>, max_decoding_message_size: Option<usize>,
max_encoding_message_size: Option<usize>, max_encoding_message_size: Option<usize>,
} }
struct _Inner<T>(Arc<T>);
impl<T: Settlement> SettlementServer<T> { impl<T: Settlement> SettlementServer<T> {
pub fn new(inner: T) -> Self { pub fn new(inner: T) -> Self {
Self::from_arc(Arc::new(inner)) Self::from_arc(Arc::new(inner))
} }
pub fn from_arc(inner: Arc<T>) -> Self { pub fn from_arc(inner: Arc<T>) -> Self {
let inner = _Inner(inner);
Self { Self {
inner, inner,
accept_compression_encodings: Default::default(), accept_compression_encodings: Default::default(),
@ -244,7 +242,6 @@ pub mod settlement_server {
Poll::Ready(Ok(())) Poll::Ready(Ok(()))
} }
fn call(&mut self, req: http::Request<B>) -> Self::Future { fn call(&mut self, req: http::Request<B>) -> Self::Future {
let inner = self.inner.clone();
match req.uri().path() { match req.uri().path() {
"/transfers.Settlement/Run" => { "/transfers.Settlement/Run" => {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
@ -273,7 +270,6 @@ pub mod settlement_server {
let max_encoding_message_size = self.max_encoding_message_size; let max_encoding_message_size = self.max_encoding_message_size;
let inner = self.inner.clone(); let inner = self.inner.clone();
let fut = async move { let fut = async move {
let inner = inner.0;
let method = RunSvc(inner); let method = RunSvc(inner);
let codec = tonic::codec::ProstCodec::default(); let codec = tonic::codec::ProstCodec::default();
let mut grpc = tonic::server::Grpc::new(codec) let mut grpc = tonic::server::Grpc::new(codec)
@ -317,7 +313,6 @@ pub mod settlement_server {
let max_encoding_message_size = self.max_encoding_message_size; let max_encoding_message_size = self.max_encoding_message_size;
let inner = self.inner.clone(); let inner = self.inner.clone();
let fut = async move { let fut = async move {
let inner = inner.0;
let method = QuerySvc(inner); let method = QuerySvc(inner);
let codec = tonic::codec::ProstCodec::default(); let codec = tonic::codec::ProstCodec::default();
let mut grpc = tonic::server::Grpc::new(codec) let mut grpc = tonic::server::Grpc::new(codec)
@ -339,8 +334,11 @@ pub mod settlement_server {
Ok( Ok(
http::Response::builder() http::Response::builder()
.status(200) .status(200)
.header("grpc-status", "12") .header("grpc-status", tonic::Code::Unimplemented as i32)
.header("content-type", "application/grpc") .header(
http::header::CONTENT_TYPE,
tonic::metadata::GRPC_CONTENT_TYPE,
)
.body(empty_body()) .body(empty_body())
.unwrap(), .unwrap(),
) )
@ -361,16 +359,6 @@ pub mod settlement_server {
} }
} }
} }
impl<T: Settlement> Clone for _Inner<T> {
fn clone(&self) -> Self {
Self(Arc::clone(&self.0))
}
}
impl<T: std::fmt::Debug> std::fmt::Debug for _Inner<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self.0)
}
}
impl<T: Settlement> tonic::server::NamedService for SettlementServer<T> { impl<T: Settlement> tonic::server::NamedService for SettlementServer<T> {
const NAME: &'static str = "transfers.Settlement"; const NAME: &'static str = "transfers.Settlement";
} }

View file

@ -0,0 +1,5 @@
NEXT_PUBLIC_CHAIN_ID=testing
NEXT_PUBLIC_CHAIN_RPC_URL=http://0.0.0.0:26657
NEXT_PUBLIC_CHAIN_REST_URL=http://0.0.0.0:1317
NEXT_PUBLIC_ENCLAVE_PUBLIC_KEY=02ef4f843722d9badf8f5571d8f20cd1a21022fe52b9257d3a235c85dfc0ce11c0
NEXT_PUBLIC_TRANSFERS_CONTRACT_ADDRESS=wasm1jfgr0vgunezkhfmdy7krrupu6yjhx224nxtjptll2ylkkqhyzeshrspu9

File diff suppressed because it is too large Load diff

View file

@ -19,39 +19,39 @@ export const chain: ChainInfo = {
rpc: process.env.NEXT_PUBLIC_CHAIN_RPC_URL, rpc: process.env.NEXT_PUBLIC_CHAIN_RPC_URL,
rest: process.env.NEXT_PUBLIC_CHAIN_REST_URL, rest: process.env.NEXT_PUBLIC_CHAIN_REST_URL,
chainId: process.env.NEXT_PUBLIC_CHAIN_ID, chainId: process.env.NEXT_PUBLIC_CHAIN_ID,
chainName: 'My Testing Chain', chainName: 'Neutron Local Chain',
stakeCurrency: { stakeCurrency: {
coinDenom: 'COSM', coinDenom: 'NEUTRON',
coinMinimalDenom: 'ucosm', coinMinimalDenom: 'untrn',
coinDecimals: 6, coinDecimals: 6,
coinGeckoId: 'regen', coinGeckoId: 'neutron',
}, },
bip44: { bip44: {
coinType: 118, coinType: 118,
}, },
bech32Config: { bech32Config: {
bech32PrefixAccAddr: 'wasm', bech32PrefixAccAddr: 'neutron',
bech32PrefixAccPub: 'wasm' + 'pub', bech32PrefixAccPub: 'neutron' + 'pub',
bech32PrefixValAddr: 'wasm' + 'valoper', bech32PrefixValAddr: 'neutron' + 'valoper',
bech32PrefixValPub: 'wasm' + 'valoperpub', bech32PrefixValPub: 'neutron' + 'valoperpub',
bech32PrefixConsAddr: 'wasm' + 'valcons', bech32PrefixConsAddr: 'neutron' + 'valcons',
bech32PrefixConsPub: 'wasm' + 'valconspub', bech32PrefixConsPub: 'neutron' + 'valconspub',
}, },
currencies: [ currencies: [
{ {
coinDenom: 'COSM', coinDenom: 'NTRN',
coinMinimalDenom: 'ucosm', coinMinimalDenom: 'untrn',
coinDecimals: 6, coinDecimals: 6,
coinGeckoId: 'regen', coinGeckoId: 'neutron',
}, },
], ],
feeCurrencies: [ feeCurrencies: [
{ {
coinDenom: 'COSM', coinDenom: 'NTRN',
coinMinimalDenom: 'ucosm', coinMinimalDenom: 'untrn',
coinDecimals: 6, coinDecimals: 6,
coinGeckoId: 'regen', coinGeckoId: 'neutron',
gasPriceStep: { low: 0.01, average: 0.025, high: 0.04 }, gasPriceStep: { low: 0.001, average: 0.0025, high: 0.004 },
}, },
], ],
} }

View file

@ -11,7 +11,9 @@ const typeUrl = '/cosmwasm.wasm.v1.MsgExecuteContract'
const registry = new Registry([[typeUrl, MsgExecuteContract]]) const registry = new Registry([[typeUrl, MsgExecuteContract]])
// Cosm variables declaration. They will be set upon initialization. // Cosm variables declaration. They will be set upon initialization.
let signingCosmClient: SigningCosmWasmClient let signingCosmClient: SigningCosmWasmClient;
// Setup the CosmWasm client. // Setup the CosmWasm client.
const init = async () => { const init = async () => {
@ -19,12 +21,15 @@ const init = async () => {
process.env.NEXT_PUBLIC_CHAIN_RPC_URL, process.env.NEXT_PUBLIC_CHAIN_RPC_URL,
'NEXT_PUBLIC_CHAIN_RPC_URL must be defined', 'NEXT_PUBLIC_CHAIN_RPC_URL must be defined',
) )
// Initialize Cosm client. // Initialize Cosm client.
signingCosmClient = await SigningCosmWasmClient.connectWithSigner( signingCosmClient = await SigningCosmWasmClient.connectWithSigner(
process.env.NEXT_PUBLIC_CHAIN_RPC_URL, process.env.NEXT_PUBLIC_CHAIN_RPC_URL,
wallet.getSigner(), wallet.getSigner(),
{ registry }, { registry },
) )
} }
// Transfer contract execution message // Transfer contract execution message
const executeTransferContract = ({ const executeTransferContract = ({
@ -49,7 +54,7 @@ const executeTransferContract = ({
contract: process.env.NEXT_PUBLIC_TRANSFERS_CONTRACT_ADDRESS, contract: process.env.NEXT_PUBLIC_TRANSFERS_CONTRACT_ADDRESS,
msg: toUtf8(JSON.stringify(messageBuilder())), msg: toUtf8(JSON.stringify(messageBuilder())),
...(fundsAmount && { ...(fundsAmount && {
funds: [{ denom: 'ucosm', amount: fundsAmount }], funds: [{ denom: 'untrn', amount: fundsAmount }],
}), }),
}), }),
}, },
@ -60,8 +65,8 @@ const executeTransferContract = ({
sender, sender,
executeTransferContractMsgs, executeTransferContractMsgs,
{ {
amount: coins(1, 'ucosm'), amount: coins(1, 'untrn'),
gas: '200000', gas: '400000',
}, },
) )
} }

View file

@ -0,0 +1,24 @@
#!/bin/bash
set -eo pipefail
ROOT=${ROOT:-$(git rev-parse --show-toplevel)}
FEATURES=
if [ -n "$MOCK_SGX" ]; then
echo "MOCK_SGX is set. Adding mock-sgx feature."
FEATURES="--features=mock-sgx"
fi
echo "--------------------------------------------------------"
echo "building enclave binary"
cd $ROOT/apps/transfers/enclave
CARGO_TARGET_DIR=./target cargo build --release $FEATURES
echo "--------------------------------------------------------"
echo "building cosmwasm contract binary"
cd $ROOT/apps/transfers/contracts
bash build.sh $FEATURES

View file

@ -0,0 +1,60 @@
#!/bin/bash
set -eo pipefail
ROOT=${ROOT:-$(git rev-parse --show-toplevel)}
# Color definitions
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# Function to print colored and formatted messages
print_message() {
local color=$1
local message=$2
echo -e "${color}${BOLD}${message}${NC}"
}
# Function to print section headers
print_header() {
local message=$1
echo -e "\n${MAGENTA}${BOLD}======== $message ========${NC}\n"
}
# Function to print success messages
print_success() {
local message=$1
echo -e "${GREEN}${BOLD}$message${NC}"
}
# Function to print error messages
print_error() {
local message=$1
echo -e "${RED}${BOLD}❌ Error: $message${NC}"
exit 1
}
# Function to print waiting messages
print_waiting() {
local message=$1
echo -e "${YELLOW}${BOLD}$message${NC}"
}
print_header "Instantianting relayer"
print_success "Relayer instantiated successfully."
cd $ROOT/relayer/
INSTANTIATE_MSG=$(./scripts/relay.sh Instantiate | jq -c '' )
cd $ROOT/apps/transfers/contracts/
bash deploy-contract-Neutrond.sh target/wasm32-unknown-unknown/release/transfers_contract.wasm "$INSTANTIATE_MSG" | tee output
export CONTRACT=$(cat output | grep Address | awk '{print $NF}' | sed 's/\x1b\[[0-9;]*m//g')

View file

@ -0,0 +1,233 @@
#!/bin/bash
set -eo pipefail
# Color definitions
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# Function to print colored and formatted messages
print_message() {
local color=$1
local message=$2
echo -e "${color}${BOLD}${message}${NC}"
}
# Function to print section headers
print_header() {
local message=$1
echo -e "\n${MAGENTA}${BOLD}======== $message ========${NC}\n"
}
# Function to print success messages
print_success() {
local message=$1
echo -e "${GREEN}${BOLD}$message${NC}"
}
# Function to print error messages
print_error() {
local message=$1
echo -e "${RED}${BOLD}❌ Error: $message${NC}" >&2
}
# Configuration
DEFAULT_NODE="127.0.0.1:26657"
NODE_URL=${NODE_URL:-$DEFAULT_NODE}
QUARTZ_PORT="${QUARTZ_PORT:-11090}"
if [ "$#" -eq 0 ]; then
echo "Usage: $0 <contract_address>"
exit 1
fi
CONTRACT=$1
CMD="neutrond --node http://$NODE_URL"
WSURL="ws://$NODE_URL/websocket"
ROOT=${ROOT:-$(git rev-parse --show-toplevel)}
WASMD_HOME=${WASMD_HOME:-"$HOME/.neutrond"}
CHAIN_ID=${CHAIN_ID:-test-1}
TXFLAG="--chain-id ${CHAIN_ID} --gas-prices 0.0025untrn --gas auto --gas-adjustment 1.3"
USER_ADDR=$(neutrond keys show -a "val1" --keyring-backend test --home "$WASMD_HOME" --keyring-dir "$WASMD_HOME")
# Subscription queries
SUBSCRIBE_TRANSFER="{\"jsonrpc\":\"2.0\",\"method\": \"subscribe\" ,\"params\":{\"query\":\"execute._contract_address = '$CONTRACT' AND wasm-transfer.action = 'user'\"},\"id\":2}"
SUBSCRIBE_QUERY="{\"jsonrpc\":\"2.0\",\"method\": \"subscribe\" ,\"params\":{\"query\":\"execute._contract_address = '$CONTRACT' AND wasm-query_balance.query = 'user'\"},\"id\":3}"
# 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"
process_json() {
local json_input="$1"
local result
result=$(echo "$json_input" | jq -r '.result // empty' 2>&1) || {
echo "Error parsing JSON: $result" >&2
echo "No relevant wasm events found"
return
}
echo "$result"
}
wait_for_next_block() {
local current_height=$($CMD status | jq -r .sync_info.latest_block_height)
local next_height=$((current_height + 1))
while [ "$($CMD status 2>&1 | jq -r .sync_info.latest_block_height)" -lt "$next_height" ]; do
echo "Waiting for next block..."
sleep 1
done
}
handle_wasm_transfer() {
print_header "Received wasm-transfer event"
echo "Debug: Entering handle_wasm_transfer function"
wait_for_next_block
echo "Fetching requests and state..."
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)
cd "$ROOT/apps/transfers"
export TRUSTED_HASH=$(cat trusted.hash)
export TRUSTED_HEIGHT=$(cat trusted.height)
cd $ROOT/utils/tm-prover
export PROOF_FILE="light-client-proof.json"
[ -f "$PROOF_FILE" ] && rm "$PROOF_FILE" && echo "Removed old $PROOF_FILE"
echo "Trusted hash: $TRUSTED_HASH"
echo "Trusted height: $TRUSTED_HEIGHT"
echo "Contract: $CONTRACT"
echo "Running prover to get light client proof..."
cargo run -- --chain-id $CHAIN_ID \
--primary "http://$NODE_URL" \
--witnesses "http://$NODE_URL" \
--trusted-height $TRUSTED_HEIGHT \
--trusted-hash $TRUSTED_HASH \
--contract-address $CONTRACT \
--storage-key "requests" \
--trace-file $PROOF_FILE
export POP=$(cat $PROOF_FILE)
export ENCLAVE_REQUEST=$(jq -nc --argjson requests "$REQUESTS" --argjson state $STATE '$ARGS.named')
export REQUEST_MSG=$(jq --argjson msg "$ENCLAVE_REQUEST" '. + {msg: $msg}' <<< "$POP")
export PROTO_MSG=$(jq -nc --arg message "$REQUEST_MSG" '$ARGS.named')
cd $ROOT/apps/transfers/enclave
echo "Executing transfer..."
ATTESTED_MSG=$(grpcurl -plaintext -import-path ./proto/ -proto transfers.proto \
-d "$PROTO_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')
if [ -n "$MOCK_SGX" ]; then
echo "Running in MOCK_SGX mode"
EXECUTE=$(jq -nc --argjson update "$(jq -nc --argjson msg "$MSG" --argjson attestation "$QUOTE" '$ARGS.named')" '$ARGS.named')
else
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')
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')
fi
echo "Submitting update..."
echo $EXECUTE | jq '.'
$CMD tx wasm execute "$CONTRACT" "$EXECUTE" --from "$USER_ADDR" $TXFLAG -y
print_success "Transfer executed"
}
handle_wasm_query_balance() {
print_header "Received wasm-query_balance event"
echo "Debug: Entering handle_wasm_query_balance function"
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)
ADDRESS=$(echo "$1" | jq -r '.result.events["message.sender"][0]')
EPHEMERAL_PUBKEY=$(echo "$1" | jq -r '.result.events["wasm-query_balance.emphemeral_pubkey"][0]')
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/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')
QUOTE=$(echo "$ATTESTED_MSG" | jq -c '.attestation')
MSG=$(echo "$ATTESTED_MSG" | jq -c '.msg')
QUERY_RESPONSE_MSG=$(jq -n --arg address "$ADDRESS" --argjson msg "$MSG" '{address: $address, encrypted_bal: $msg.encrypted_bal}')
if [ -n "$MOCK_SGX" ]; then
echo "Running in MOCK_SGX mode"
EXECUTE=$(jq -nc --argjson query_response "$(jq -nc --argjson msg "$QUERY_RESPONSE_MSG" --argjson attestation "$QUOTE" '$ARGS.named')" '{query_response: $query_response}')
else
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')
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}')
fi
echo "Submitting update..."
echo $EXECUTE | jq '.'
$CMD tx wasm execute "$CONTRACT" "$EXECUTE" --from "$USER_ADDR" $TXFLAG -y
print_success "Query balance executed"
}
# Main loop
( echo "$SUBSCRIBE_TRANSFER"; echo "$SUBSCRIBE_QUERY"; cat) | websocat $WSURL | while read -r msg; do
EVENTS=$(process_json "$msg")
if [[ "$EVENTS" == "JSON parsing failed" ]]; then
print_error "Failed to parse JSON message. Skipping this message."
continue
fi
if [[ -z "$EVENTS" || "$EVENTS" == "No relevant wasm events found" ]]; then
if [[ "$msg" == *'"result":{}'* ]]; then
print_success "Subscribed to $msg"
print_message "$YELLOW" "Waiting for event..."
else
print_message "$YELLOW" "No relevant events found in message. Waiting for next event..."
fi
continue
fi
if echo "$EVENTS" | grep -q 'wasm-transfer'; then
handle_wasm_transfer
elif echo "$EVENTS" | grep -q 'wasm-query_balance'; then
handle_wasm_query_balance "$msg"
fi
print_message "$YELLOW" "Waiting for next event..."
done

View file

@ -0,0 +1,96 @@
#!/bin/bash
# Color definitions
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# Function to print colored and formatted messages
print_message() {
local color=$1
local message=$2
echo -e "${color}${BOLD}${message}${NC}"
}
# Function to print section headers
print_header() {
local message=$1
echo -e "\n${MAGENTA}${BOLD}======== $message ========${NC}\n"
}
# Function to print success messages
print_success() {
local message=$1
echo -e "${GREEN}${BOLD}$message${NC}"
}
# Function to print error messages
print_error() {
local message=$1
echo -e "${RED}${BOLD}❌ Error: $message${NC}" >&2
}
# Set up variables
ROOT=${ROOT:-$(git rev-parse --show-toplevel)}
DIR_QUARTZ_APP="$ROOT/apps/transfers"
DIR_QUARTZ_ENCLAVE="$DIR_QUARTZ_APP/enclave"
DIR_QUARTZ_TM_PROVER="$ROOT/utils/tm-prover"
NODE_URL=${NODE_URL:-127.0.0.1:26657}
CMD="neutrond --node http://$NODE_URL"
QUARTZ_PORT="${QUARTZ_PORT:-11090}"
print_header "Quartz Setup and Launch"
print_message $CYAN "QUARTZ_PORT is set to: $QUARTZ_PORT"
print_message $BLUE "Setting trusted hash and height"
CHAIN_STATUS=$($CMD status)
TRUSTED_HASH=$(echo "$CHAIN_STATUS" | jq -r .sync_info.latest_block_hash)
TRUSTED_HEIGHT=$(echo "$CHAIN_STATUS" | jq -r .sync_info.latest_block_height)
print_message $YELLOW "Trusted Hash: $TRUSTED_HASH"
print_message $YELLOW "Trusted Height: $TRUSTED_HEIGHT"
cd "$DIR_QUARTZ_APP"
echo "$TRUSTED_HASH" > trusted.hash
echo "$TRUSTED_HEIGHT" > trusted.height
print_success "Trusted hash and height saved"
if [ -n "$MOCK_SGX" ]; then
print_header "Running in MOCK_SGX mode"
cd $DIR_QUARTZ_ENCLAVE
print_message $BLUE "Running enclave without Gramine..."
./target/release/quartz-app-transfers-enclave --chain-id "test-1" --trusted-height "$TRUSTED_HEIGHT" --trusted-hash "$TRUSTED_HASH"
exit
fi
print_header "Configuring Gramine"
cd "$DIR_QUARTZ_ENCLAVE"
print_message $BLUE "Generating private key (if it doesn't exist)"
gramine-sgx-gen-private-key > /dev/null 2>&1 || :
print_message $BLUE "Creating manifest"
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)" \
-Dtrusted_height="$TRUSTED_HEIGHT" \
-Dtrusted_hash="$TRUSTED_HASH" \
-Dgramine_port="$QUARTZ_PORT" \
quartz.manifest.template quartz.manifest
print_message $BLUE "Signing manifest"
gramine-sgx-sign --manifest quartz.manifest --output quartz.manifest.sgx
print_header "Starting Gramine"
print_message $GREEN "Running Quartz with Gramine-SGX..."
gramine-sgx ./quartz

View file

@ -9,6 +9,7 @@ repository.workspace = true
keywords = ["blockchain", "cosmos", "tendermint", "cycles", "quartz"] keywords = ["blockchain", "cosmos", "tendermint", "cycles", "quartz"]
readme = "README.md" readme = "README.md"
[dependencies] [dependencies]
# external # external
prost.workspace = true prost.workspace = true

View file

@ -1,6 +1,6 @@
// This file is @generated by prost-build. // This file is @generated by prost-build.
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct InstantiateRequest {} pub struct InstantiateRequest {}
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
@ -9,7 +9,7 @@ pub struct InstantiateResponse {
pub message: ::prost::alloc::string::String, pub message: ::prost::alloc::string::String,
} }
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct SessionCreateRequest {} pub struct SessionCreateRequest {}
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
@ -218,19 +218,17 @@ pub mod core_server {
} }
#[derive(Debug)] #[derive(Debug)]
pub struct CoreServer<T: Core> { pub struct CoreServer<T: Core> {
inner: _Inner<T>, inner: Arc<T>,
accept_compression_encodings: EnabledCompressionEncodings, accept_compression_encodings: EnabledCompressionEncodings,
send_compression_encodings: EnabledCompressionEncodings, send_compression_encodings: EnabledCompressionEncodings,
max_decoding_message_size: Option<usize>, max_decoding_message_size: Option<usize>,
max_encoding_message_size: Option<usize>, max_encoding_message_size: Option<usize>,
} }
struct _Inner<T>(Arc<T>);
impl<T: Core> CoreServer<T> { impl<T: Core> CoreServer<T> {
pub fn new(inner: T) -> Self { pub fn new(inner: T) -> Self {
Self::from_arc(Arc::new(inner)) Self::from_arc(Arc::new(inner))
} }
pub fn from_arc(inner: Arc<T>) -> Self { pub fn from_arc(inner: Arc<T>) -> Self {
let inner = _Inner(inner);
Self { Self {
inner, inner,
accept_compression_encodings: Default::default(), accept_compression_encodings: Default::default(),
@ -293,7 +291,6 @@ pub mod core_server {
Poll::Ready(Ok(())) Poll::Ready(Ok(()))
} }
fn call(&mut self, req: http::Request<B>) -> Self::Future { fn call(&mut self, req: http::Request<B>) -> Self::Future {
let inner = self.inner.clone();
match req.uri().path() { match req.uri().path() {
"/quartz.Core/Instantiate" => { "/quartz.Core/Instantiate" => {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
@ -322,7 +319,6 @@ pub mod core_server {
let max_encoding_message_size = self.max_encoding_message_size; let max_encoding_message_size = self.max_encoding_message_size;
let inner = self.inner.clone(); let inner = self.inner.clone();
let fut = async move { let fut = async move {
let inner = inner.0;
let method = InstantiateSvc(inner); let method = InstantiateSvc(inner);
let codec = tonic::codec::ProstCodec::default(); let codec = tonic::codec::ProstCodec::default();
let mut grpc = tonic::server::Grpc::new(codec) let mut grpc = tonic::server::Grpc::new(codec)
@ -368,7 +364,6 @@ pub mod core_server {
let max_encoding_message_size = self.max_encoding_message_size; let max_encoding_message_size = self.max_encoding_message_size;
let inner = self.inner.clone(); let inner = self.inner.clone();
let fut = async move { let fut = async move {
let inner = inner.0;
let method = SessionCreateSvc(inner); let method = SessionCreateSvc(inner);
let codec = tonic::codec::ProstCodec::default(); let codec = tonic::codec::ProstCodec::default();
let mut grpc = tonic::server::Grpc::new(codec) let mut grpc = tonic::server::Grpc::new(codec)
@ -414,7 +409,6 @@ pub mod core_server {
let max_encoding_message_size = self.max_encoding_message_size; let max_encoding_message_size = self.max_encoding_message_size;
let inner = self.inner.clone(); let inner = self.inner.clone();
let fut = async move { let fut = async move {
let inner = inner.0;
let method = SessionSetPubKeySvc(inner); let method = SessionSetPubKeySvc(inner);
let codec = tonic::codec::ProstCodec::default(); let codec = tonic::codec::ProstCodec::default();
let mut grpc = tonic::server::Grpc::new(codec) let mut grpc = tonic::server::Grpc::new(codec)
@ -436,8 +430,11 @@ pub mod core_server {
Ok( Ok(
http::Response::builder() http::Response::builder()
.status(200) .status(200)
.header("grpc-status", "12") .header("grpc-status", tonic::Code::Unimplemented as i32)
.header("content-type", "application/grpc") .header(
http::header::CONTENT_TYPE,
tonic::metadata::GRPC_CONTENT_TYPE,
)
.body(empty_body()) .body(empty_body())
.unwrap(), .unwrap(),
) )
@ -458,16 +455,6 @@ pub mod core_server {
} }
} }
} }
impl<T: Core> Clone for _Inner<T> {
fn clone(&self) -> Self {
Self(Arc::clone(&self.0))
}
}
impl<T: std::fmt::Debug> std::fmt::Debug for _Inner<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self.0)
}
}
impl<T: Core> tonic::server::NamedService for CoreServer<T> { impl<T: Core> tonic::server::NamedService for CoreServer<T> {
const NAME: &'static str = "quartz.Core"; const NAME: &'static str = "quartz.Core";
} }

View file

@ -12,8 +12,11 @@ readme = "README.md"
[features] [features]
mock-sgx = ["quartz-cw/mock-sgx"] mock-sgx = ["quartz-cw/mock-sgx"]
[dependencies] [dependencies]
# external # external
sha2 = { workspace = true }
clap.workspace = true clap.workspace = true
color-eyre.workspace = true color-eyre.workspace = true
ecies.workspace = true ecies.workspace = true

View file

@ -10,7 +10,9 @@ keywords = ["blockchain", "cosmos", "cosmwasm", "cycles", "quartz"]
readme = "README.md" readme = "README.md"
[features] [features]
default = []
mock-sgx = [] mock-sgx = []
std = ["k256/std", "serde/std", "serde_json/std", "sha2/std", "cosmwasm-std/std"]
[dependencies] [dependencies]
# external # external

View file

@ -123,9 +123,9 @@ pub async fn account_info(
address: impl ToString, address: impl ToString,
) -> Result<BaseAccount, Box<dyn Error>> { ) -> Result<BaseAccount, Box<dyn Error>> {
let mut client = AuthQueryClient::connect(node.to_string()).await?; let mut client = AuthQueryClient::connect(node.to_string()).await?;
let request = tonic::Request::new(QueryAccountRequest { let request = QueryAccountRequest {
address: address.to_string(), address: address.to_string(),
}); };
let response = client.account(request).await?; let response = client.account(request).await?;
let response = RawBaseAccount::decode(response.into_inner().account.unwrap().value.as_slice())?; let response = RawBaseAccount::decode(response.into_inner().account.unwrap().value.as_slice())?;
let account = BaseAccount::try_from(response)?; let account = BaseAccount::try_from(response)?;
@ -153,14 +153,13 @@ pub fn tx_bytes(
pub async fn send_tx(node: impl ToString, tx_bytes: Vec<u8>) -> Result<(), Box<dyn Error>> { pub async fn send_tx(node: impl ToString, tx_bytes: Vec<u8>) -> Result<(), Box<dyn Error>> {
let mut client = ServiceClient::connect(node.to_string()).await?; let mut client = ServiceClient::connect(node.to_string()).await?;
let request = tonic::Request::new(BroadcastTxRequest { let request = BroadcastTxRequest {
tx_bytes, tx_bytes,
mode: BroadcastMode::Block.into(), mode: BroadcastMode::Block.into(),
}); };
let _response = client.broadcast_tx(request).await?; let _response = client.broadcast_tx(request).await?;
Ok(()) Ok(())
} }
#[cfg(not(feature = "mock-sgx"))] #[cfg(not(feature = "mock-sgx"))]
fn gramine_sgx_ias_report(quote: &[u8]) -> Result<serde_json::Value, Box<dyn Error>> { fn gramine_sgx_ias_report(quote: &[u8]) -> Result<serde_json::Value, Box<dyn Error>> {
use std::{fs::read_to_string, io::Write, process::Command}; use std::{fs::read_to_string, io::Write, process::Command};