diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..84eb07d0 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,57 @@ +name: Linting +on: + pull_request: + paths: + - .github/workflows/lint.yaml + - contracts/** + - light-client/** + - "**/Cargo.toml" + - "**/Cargo.lock" + - justfile + - README.md + + push: + tags: + - v[0-9]+.* + branches: + - "release/*" + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ !startsWith(github.ref, 'refs/tags/') && github.ref != 'refs/heads/main' }} + +env: + CARGO_INCREMENTAL: 0 + CARGO_PROFILE_DEV_DEBUG: 1 + CARGO_PROFILE_RELEASE_DEBUG: 1 + CARGO_NET_RETRY: 10 + RUSTUP_MAX_RETRIES: 10 + +jobs: + lint: + name: Check Styles + runs-on: ubuntu-latest + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + - name: Install Rust toolchains + uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: nightly + components: rustfmt + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + components: clippy + - name: Install Taplo + uses: baptiste0928/cargo-install@v3 + with: + crate: taplo-cli + - name: Install Scarb + uses: software-mansion/setup-scarb@v1 + with: + scarb-version: "2.6.5" + - name: Install Just + uses: extractions/setup-just@v1 + - name: Run linters + run: just lint diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3dc05158 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +corelib/ +target/ + +# vscode +.vscode/ \ No newline at end of file diff --git a/.markdownlint.jsonc b/.markdownlint.jsonc new file mode 100644 index 00000000..b8be2d43 --- /dev/null +++ b/.markdownlint.jsonc @@ -0,0 +1,8 @@ +{ + "default": true, + "MD013": false, // https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md013---line-length + "MD024": false, // https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md024---multiple-headings-with-the-same-content + "MD033": false, // https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md033---inline-html + "MD036": false, // https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md036---emphasis-used-instead-of-a-heading + "MD041": false // https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md041---first-line-in-a-file-should-be-a-top-level-heading +} diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..40621740 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1904 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "anyhow" +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", + "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]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "blake3" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9ec96fe9a81b5e365f9db71fe00edc4fe4ca2cc7dcb7861f0603012a7caa210" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bnum" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e31ea183f6ee62ac8b8a8cf7feddd766317adfb13ff469de57ce033efd6a790" + +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.71", + "syn_derive", +] + +[[package]] +name = "bytes" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +dependencies = [ + "serde", +] + +[[package]] +name = "cc" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cosmwasm-core" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +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", + "ecdsa", + "ed25519-zebra", + "k256", + "num-traits", + "p256", + "rand_core", + "rayon", + "sha2", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd1873f84d9b17edf8a90ffe10a89a649b82feacc00e36788b81d2c3cbf03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "cosmwasm-schema" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27984b137eb2ac561f97f6bdb02004a98eb6f2ba263062c140b8e231ee1826b7" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ef0d201f611bdb6c9124207032423eb956f1fc8ab3e3ee7253a9c08a5f5809" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "cosmwasm-std" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2522fb5c9a0409712bb1d036128bccf3564e6b2ac82f942ae4cf3c8df3e26fa8" +dependencies = [ + "base64 0.22.1", + "bech32", + "bnum", + "cosmwasm-core", + "cosmwasm-crypto", + "cosmwasm-derive", + "derive_more 1.0.0-beta.6", + "hex", + "rand_core", + "schemars", + "serde", + "serde-json-wasm", + "sha2", + "static_assertions", + "thiserror", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "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]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "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 = "cw-storage-plus" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f13360e9007f51998d42b1bc6b7fa0141f74feae61ed5fd1e5b0a89eec7b5de1" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "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]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-zebra" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "hashbrown 0.14.5", + "hex", + "rand_core", + "sha2", + "zeroize", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "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 = "flex-error" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" +dependencies = [ + "paste", +] + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "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]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "ibc-client-cw" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "derive_more 0.99.18", + "ibc-client-wasm-types", + "ibc-core", + "prost", + "serde", +] + +[[package]] +name = "ibc-client-starknet" +version = "0.1.0" +dependencies = [ + "derive_more 0.99.18", + "ibc-client-starknet-types", + "ibc-core", +] + +[[package]] +name = "ibc-client-starknet-cw" +version = "0.1.0" +dependencies = [ + "cosmwasm-std", + "ibc-client-cw", + "ibc-client-starknet", + "ibc-core", +] + +[[package]] +name = "ibc-client-starknet-types" +version = "0.1.0" + +[[package]] +name = "ibc-client-wasm-types" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "base64 0.22.1", + "cosmwasm-schema", + "displaydoc", + "ibc-core-client", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "serde", +] + +[[package]] +name = "ibc-core" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "ibc-core-channel", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler", + "ibc-core-host", + "ibc-core-router", + "ibc-derive", + "ibc-primitives", +] + +[[package]] +name = "ibc-core-channel" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "ibc-core-channel-types", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", +] + +[[package]] +name = "ibc-core-channel-types" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "borsh", + "derive_more 0.99.18", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "schemars", + "serde", + "sha2", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-client" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", +] + +[[package]] +name = "ibc-core-client-context" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "derive_more 0.99.18", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-primitives", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-client-types" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "borsh", + "derive_more 0.99.18", + "displaydoc", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "schemars", + "serde", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-commitment-types" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "borsh", + "derive_more 0.99.18", + "displaydoc", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "ics23", + "schemars", + "serde", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-connection" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "ibc-client-wasm-types", + "ibc-core-client", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", + "prost", +] + +[[package]] +name = "ibc-core-connection-types" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "borsh", + "derive_more 0.99.18", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "schemars", + "serde", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-handler" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "ibc-core-channel", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", +] + +[[package]] +name = "ibc-core-handler-types" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "borsh", + "derive_more 0.99.18", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-host-types", + "ibc-core-router-types", + "ibc-primitives", + "ibc-proto", + "schemars", + "serde", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-host" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "derive_more 0.99.18", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-primitives", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-host-types" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "borsh", + "derive_more 0.99.18", + "displaydoc", + "ibc-primitives", + "schemars", + "serde", +] + +[[package]] +name = "ibc-core-router" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "derive_more 0.99.18", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-host-types", + "ibc-core-router-types", + "ibc-primitives", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-router-types" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "borsh", + "derive_more 0.99.18", + "displaydoc", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "schemars", + "serde", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-derive" +version = "0.7.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "ibc-primitives" +version = "0.53.0" +source = "git+https://github.com/cosmos/ibc-rs.git?rev=d239ae7#d239ae7b5cd314213d29d00cd38d00f0e8f6c0dc" +dependencies = [ + "borsh", + "derive_more 0.99.18", + "displaydoc", + "ibc-proto", + "prost", + "schemars", + "serde", + "tendermint", + "time", +] + +[[package]] +name = "ibc-proto" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb09e0b52b8a16e98ce98845e7c15b018440f3c56defa12fa44782cd66bab65" +dependencies = [ + "base64 0.22.1", + "borsh", + "bytes", + "flex-error", + "ics23", + "informalsystems-pbjson", + "prost", + "schemars", + "serde", + "subtle-encoding", + "tendermint-proto", +] + +[[package]] +name = "ics23" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18798160736c1e368938ba6967dbcb3c7afb3256b442a5506ba5222eebb68a5a" +dependencies = [ + "anyhow", + "blake2", + "blake3", + "bytes", + "hex", + "informalsystems-pbjson", + "prost", + "ripemd", + "serde", + "sha2", + "sha3", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "informalsystems-pbjson" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa4a0980c8379295100d70854354e78df2ee1c6ca0f96ffe89afeb3140e3a3d" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "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.12.1", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +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]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "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]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.71", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "serde_json" +version = "1.0.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ + "zeroize", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "tendermint" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "954496fbc9716eb4446cdd6d00c071a3e2f22578d62aa03b40c7e5b4fda3ed42" +dependencies = [ + "bytes", + "digest", + "ed25519", + "flex-error", + "futures", + "num-traits", + "once_cell", + "prost", + "prost-types", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "signature", + "subtle", + "subtle-encoding", + "tendermint-proto", + "time", + "zeroize", +] + +[[package]] +name = "tendermint-proto" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc87024548c7f3da479885201e3da20ef29e85a3b13d04606b380ac4c7120d87" +dependencies = [ + "bytes", + "flex-error", + "prost", + "prost-types", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + +[[package]] +name = "thiserror" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +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.71", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..4b4a1d8a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,44 @@ +[workspace] +resolver = "2" +members = [ + "light-client/*", +] + +[workspace.package] +version = "0.1.0" +license = "MIT OR Apache-2.0" +edition = "2021" +rust-version = "1.72.1" +publish = false +authors = [ "Informal Systems " ] +repository = "https://github.com/informalsystems/ibc-starknet" + +[workspace.lints.rust] +unsafe_code = "forbid" +dead_code = "deny" +rust_2018_idioms = "deny" +trivial_casts = "deny" +unused_import_braces = "deny" +unused_variables = "allow" + +[workspace.lints.clippy] +debug_assert_with_mut_call = "deny" +doc_link_with_quotes = "deny" +inefficient_to_string = "deny" +map_flatten = "deny" +manual_ok_or = "deny" +match_same_arms = "deny" +semicolon_if_nothing_returned = "deny" +uninlined_format_args = "deny" + +[workspace.dependencies] +# external dependencies +derive_more = { version = "0.99.11", features = [ "from", "try_into" ] } + +# ibc depedenencies +ibc-core = { version = "0.53.0", default-features = false, features = [ "borsh", "schema" ] } +ibc-client-cw = { version = "0.53.0", default-features = false } + +[patch.crates-io] +ibc-core = { git = "https://github.com/cosmos/ibc-rs.git", rev = "d239ae7" } +ibc-client-cw = { git = "https://github.com/cosmos/ibc-rs.git", rev = "d239ae7" } diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..58b61ab0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 Informal Systems + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index cec637d2..62051864 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ -## ibc-starknet +
+

Starknet IBC

+
diff --git a/contracts/README.md b/contracts/README.md new file mode 100644 index 00000000..d0056722 --- /dev/null +++ b/contracts/README.md @@ -0,0 +1,3 @@ +
+

Starknet-IBC Cairo Contracts

+
diff --git a/contracts/Scarb.lock b/contracts/Scarb.lock new file mode 100644 index 00000000..1f7e7c2e --- /dev/null +++ b/contracts/Scarb.lock @@ -0,0 +1,20 @@ +# Code generated by scarb DO NOT EDIT. +version = 1 + +[[package]] +name = "openzeppelin" +version = "0.14.0" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.14.0#f091c4f51ddeb10297db984acae965328c5a4e5b" + +[[package]] +name = "snforge_std" +version = "0.25.0" +source = "git+https://github.com/foundry-rs/starknet-foundry?tag=v0.25.0#5b366e24821e530fea97f11b211d220e8493fbea" + +[[package]] +name = "starknet_ibc" +version = "0.1.0" +dependencies = [ + "openzeppelin", + "snforge_std", +] diff --git a/contracts/Scarb.toml b/contracts/Scarb.toml new file mode 100644 index 00000000..082ec5ee --- /dev/null +++ b/contracts/Scarb.toml @@ -0,0 +1,24 @@ +[package] +name = "starknet_ibc" +version = "0.1.0" +license = "Apache-2.0" +edition = "2023_11" +cairo-version = "2.6.4" +scarb-version = "2.6.5" +repository = "https://github.com/informalsystems/ibc-starknet" +authors = [ "Informal Systems " ] +Readme = "README.md" +keywords = [ "ethereum", "starknet", "cairo", "ibc", "ibc-rs" ] +description = "Collection of Cairo components and contracts that implement and integrate IBC protocol with Starknet" + +[dependencies] +starknet = ">=2.6.0" +openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", tag = "v0.14.0" } +snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry", tag = "v0.25.0" } + +[lib] + +[[target.starknet-contract]] + +[tool.fmt] +sort-module-level-items = true diff --git a/contracts/src/apps.cairo b/contracts/src/apps.cairo new file mode 100644 index 00000000..014e52f2 --- /dev/null +++ b/contracts/src/apps.cairo @@ -0,0 +1 @@ +pub mod transfer; diff --git a/contracts/src/apps/transfer.cairo b/contracts/src/apps/transfer.cairo new file mode 100644 index 00000000..ccc935ca --- /dev/null +++ b/contracts/src/apps/transfer.cairo @@ -0,0 +1,3 @@ +pub mod component; +pub mod interface; +pub mod types; diff --git a/contracts/src/apps/transfer/component.cairo b/contracts/src/apps/transfer/component.cairo new file mode 100644 index 00000000..da6ab4dc --- /dev/null +++ b/contracts/src/apps/transfer/component.cairo @@ -0,0 +1,119 @@ +#[starknet::component] +pub mod ICS20TransferComponent { + use core::array::ArrayTrait; + use core::option::OptionTrait; + use core::starknet::SyscallResultTrait; + use core::traits::TryInto; + use openzeppelin::token::erc20::ERC20Component; + use starknet::ClassHash; + use starknet::ContractAddress; + use starknet::get_caller_address; + use starknet::get_contract_address; + use starknet::syscalls::deploy_syscall; + use starknet_ibc::apps::transfer::types::{PrefixedCoin, Memo}; + use starknet_ibc::core::types::{PortId, ChannelId}; + + #[storage] + struct Storage { + salt: felt252, + tokens: LegacyMap::, + } + + #[event] + #[derive(Drop, starknet::Event)] + pub enum Event { + TransferEvent: TransferEvent, + } + + #[derive(Drop, Serde, starknet::Event)] + pub struct TransferEvent { + sender: ContractAddress, + receiver: ContractAddress, + amount: u64, + denom: felt252, + memo: Memo, + } + + #[generate_trait] + pub impl TransferValidationImpl< + TContractState, + +HasComponent, + impl ERC20MixinImpl: ERC20Component::HasComponent + > of TransferValidationTrait { + fn escrow_validate( + self: @ComponentState, + from_account: ContractAddress, + port_id: PortId, + channel_id: ChannelId, + coin: PrefixedCoin, + memo: Memo, + ) {} + fn unescrow_validate( + self: @ComponentState, + to_account: ContractAddress, + port_id: PortId, + channel_id: ChannelId, + coin: PrefixedCoin, + ) {} + fn mint_validate( + self: @ComponentState, account: ContractAddress, coin: PrefixedCoin, + ) {} + fn burn_validate( + self: @ComponentState, + account: ContractAddress, + coin: PrefixedCoin, + memo: Memo, + ) {} + } + + #[generate_trait] + pub impl TransferExecutionImpl< + TContractState, + +HasComponent, + impl ERC20MixinImpl: ERC20Component::HasComponent + > of TransferExecutionTrait { + fn escrow_execute( + ref self: ComponentState, + from_account: ContractAddress, + port_id: felt252, + channel_id: felt252, + coin: PrefixedCoin, + memo: ByteArray, + ) {} + fn unescrow_execute( + ref self: ComponentState, + to_account: ContractAddress, + port_id: PortId, + channel_id: ChannelId, + coin: PrefixedCoin, + ) {} + fn mint_execute( + ref self: ComponentState, account: ContractAddress, coin: PrefixedCoin, + ) {} + fn burn_execute( + ref self: ComponentState, + account: ContractAddress, + coin: PrefixedCoin, + memo: Memo, + ) {} + } + + #[generate_trait] + pub impl InternalImpl< + TContractState, + +HasComponent, + impl ERC20MixinImpl: ERC20Component::HasComponent + > of InternalTrait { + fn create_token(ref self: ComponentState) -> ContractAddress { + // unimplemented! > Dummy value to pass the type check + 0.try_into().unwrap() + } + fn get_escrow_address( + self: @ComponentState, port_id: felt252, channel_id: felt252 + ) -> ContractAddress { + // unimplemented! > Dummy value to pass the type check + 0.try_into().unwrap() + } + } +} + diff --git a/contracts/src/apps/transfer/interface.cairo b/contracts/src/apps/transfer/interface.cairo new file mode 100644 index 00000000..534fb96f --- /dev/null +++ b/contracts/src/apps/transfer/interface.cairo @@ -0,0 +1,8 @@ +use starknet::ContractAddress; +use starknet_ibc::apps::transfer::types::MsgTransfer; + +#[starknet::interface] +pub trait ITransfer { + fn send_transfer(self: @TContractState, msg: MsgTransfer,); +} + diff --git a/contracts/src/apps/transfer/types.cairo b/contracts/src/apps/transfer/types.cairo new file mode 100644 index 00000000..7a271a38 --- /dev/null +++ b/contracts/src/apps/transfer/types.cairo @@ -0,0 +1,28 @@ +use starknet::ContractAddress; +use starknet_ibc::core::types::{PortId, ChannelId}; + +#[derive(Drop, Serde, Store)] +pub struct MsgTransfer { + port_id_on_a: PortId, + chan_id_on_a: ChannelId, + packet_data: PacketData, +} + +#[derive(Drop, Serde, Store)] +pub struct PrefixedCoin { + denom: ByteArray, + amount: u64, +} + +#[derive(Drop, Serde, Store)] +pub struct Memo { + memo: ByteArray, +} + +#[derive(Drop, Serde, Store)] +pub struct PacketData { + pub token: PrefixedCoin, + pub sender: ContractAddress, + pub receiver: ContractAddress, + pub memo: Memo, +} diff --git a/contracts/src/contracts/transfer.cairo b/contracts/src/contracts/transfer.cairo new file mode 100644 index 00000000..9a900d5b --- /dev/null +++ b/contracts/src/contracts/transfer.cairo @@ -0,0 +1,72 @@ +#[starknet::contract] +pub(crate) mod Transfer { + use openzeppelin::token::erc20::{ERC20Component, ERC20HooksEmptyImpl}; + use starknet::{ContractAddress, ClassHash}; + use starknet_ibc::apps::transfer::component::ICS20TransferComponent; + + component!(path: ERC20Component, storage: erc20, event: ERC20Event); + component!(path: ICS20TransferComponent, storage: transfer, event: ICS20TransferEvent); + + #[abi(embed_v0)] + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl; + impl ERC20InternalImpl = ERC20Component::InternalImpl; + + impl TransferValidationImpl = ICS20TransferComponent::TransferValidationImpl; + impl TransferExecutionImpl = ICS20TransferComponent::TransferExecutionImpl; + impl TransferInternalImpl = ICS20TransferComponent::InternalImpl; + + #[storage] + struct Storage { + #[substorage(v0)] + erc20: ERC20Component::Storage, + #[substorage(v0)] + transfer: ICS20TransferComponent::Storage, + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC20Event: ERC20Component::Event, + #[flat] + ICS20TransferEvent: ICS20TransferComponent::Event, + } + + #[constructor] + fn constructor( + ref self: ContractState, + name: ByteArray, + symbol: ByteArray, + fixed_supply: u256, + recipient: ContractAddress, + owner: ContractAddress + ) { + self.erc20.initializer(name, symbol); + } +} + +#[cfg(test)] +mod tests { + use core::starknet::SyscallResultTrait; + use starknet::ContractAddress; + use starknet::contract_address_const; + use starknet::syscalls::deploy_syscall; + use starknet_ibc::Transfer; + use starknet_ibc::apps::transfer::interface::{ITransferDispatcher, ITransferDispatcherTrait,}; + + fn deploy() -> (ITransferDispatcher, ContractAddress) { + let recipient: ContractAddress = contract_address_const::<'sender'>(); + + let (contract_address, _) = deploy_syscall( + Transfer::TEST_CLASS_HASH.try_into().unwrap(), recipient.into(), array![0].span(), false + ) + .unwrap_syscall(); + + (ITransferDispatcher { contract_address }, contract_address) + } + + #[test] + fn test_transfer() { + deploy(); + } +} diff --git a/contracts/src/core.cairo b/contracts/src/core.cairo new file mode 100644 index 00000000..cd408564 --- /dev/null +++ b/contracts/src/core.cairo @@ -0,0 +1 @@ +pub mod types; diff --git a/contracts/src/core/types.cairo b/contracts/src/core/types.cairo new file mode 100644 index 00000000..edfe12cc --- /dev/null +++ b/contracts/src/core/types.cairo @@ -0,0 +1,12 @@ +use starknet::ContractAddress; +use starknet::Store; + +#[derive(Drop, Serde, Store)] +pub struct ChannelId { + channel_id: felt252, +} + +#[derive(Drop, Serde, Store)] +pub struct PortId { + port_id: felt252, +} diff --git a/contracts/src/lib.cairo b/contracts/src/lib.cairo new file mode 100644 index 00000000..fad72ee8 --- /dev/null +++ b/contracts/src/lib.cairo @@ -0,0 +1,2 @@ +pub mod apps; +pub mod core; diff --git a/justfile b/justfile new file mode 100644 index 00000000..a6dbbb39 --- /dev/null +++ b/justfile @@ -0,0 +1,20 @@ +# Installs development tools including nightly rustfmt, taplo-cli, etc. +install-tools: + rustup component add rustfmt --toolchain nightly + cargo install typos-cli taplo-cli + +# Runs formatter and clippy for all the cargo and scarb packages +lint: + @cargo +nightly fmt --all -- --check && \ + cargo clippy --all-targets --all-features -- -D warnings && \ + cargo clippy --all-targets --no-default-features -- -D warnings && \ + taplo fmt --check && \ + cd ./contracts && scarb fmt + +# Builds the Cairo contracts +build-contracts: + cd ./contracts && scarb build + +# Tests the Cairo contracts +test-contracts: + cd ./contracts && scarb test \ No newline at end of file diff --git a/light-client/README.md b/light-client/README.md new file mode 100644 index 00000000..7bc3045d --- /dev/null +++ b/light-client/README.md @@ -0,0 +1,3 @@ +
+

Starknet-IBC Light Client

+
diff --git a/light-client/cw-contract/Cargo.toml b/light-client/cw-contract/Cargo.toml new file mode 100644 index 00000000..962f110e --- /dev/null +++ b/light-client/cw-contract/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "ibc-client-starknet-cw" +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } +version = { workspace = true } +readme = "./../README.md" +keywords = [ "ibc", "light-client", "starknet", "CosmWasm" ] +description = """ +""" + +[lib] +crate-type = [ "cdylib", "rlib" ] + +[dependencies] +# ibc dependencies +ibc-core = { workspace = true } +ibc-client-cw = { workspace = true } +ibc-client-starknet = { path = "./../impls" } + +# cosmwasm dependencies +cosmwasm-std = "2.1.0" + +[features] +default = [ "std" ] +std = [ + "ibc-core/std", + "ibc-client-cw/std", +] diff --git a/light-client/cw-contract/src/client_type.rs b/light-client/cw-contract/src/client_type.rs new file mode 100644 index 00000000..1280f1f1 --- /dev/null +++ b/light-client/cw-contract/src/client_type.rs @@ -0,0 +1,9 @@ +use ibc_client_cw::api::ClientType; +use ibc_client_starknet::{ClientState, ConsensusState}; + +pub struct StarknetClient; + +impl<'a> ClientType<'a> for StarknetClient { + type ClientState = ClientState; + type ConsensusState = ConsensusState; +} diff --git a/light-client/cw-contract/src/entrypoint.rs b/light-client/cw-contract/src/entrypoint.rs new file mode 100644 index 00000000..95273f8e --- /dev/null +++ b/light-client/cw-contract/src/entrypoint.rs @@ -0,0 +1,37 @@ +use cosmwasm_std::{entry_point, Binary, Deps, DepsMut, Env, MessageInfo, Response}; +use ibc_client_cw::context::Context; +use ibc_client_cw::types::{ContractError, InstantiateMsg, QueryMsg, SudoMsg}; + +use crate::client_type::StarknetClient; + +pub type StarknetContext<'a> = Context<'a, StarknetClient>; + +#[entry_point] +pub fn instantiate( + deps: DepsMut<'_>, + env: Env, + _info: MessageInfo, + msg: InstantiateMsg, +) -> Result { + let mut ctx = StarknetContext::new_mut(deps, env)?; + + let data = ctx.instantiate(msg)?; + + Ok(Response::default().set_data(data)) +} + +#[entry_point] +pub fn sudo(deps: DepsMut<'_>, env: Env, msg: SudoMsg) -> Result { + let mut ctx = StarknetContext::new_mut(deps, env)?; + + let data = ctx.sudo(msg)?; + + Ok(Response::default().set_data(data)) +} + +#[entry_point] +pub fn query(deps: Deps<'_>, env: Env, msg: QueryMsg) -> Result { + let ctx = StarknetContext::new_ref(deps, env)?; + + ctx.query(msg) +} diff --git a/light-client/cw-contract/src/lib.rs b/light-client/cw-contract/src/lib.rs new file mode 100644 index 00000000..54fb5442 --- /dev/null +++ b/light-client/cw-contract/src/lib.rs @@ -0,0 +1,2 @@ +pub mod client_type; +pub mod entrypoint; diff --git a/light-client/impls/Cargo.lock b/light-client/impls/Cargo.lock new file mode 100644 index 00000000..17afd10d --- /dev/null +++ b/light-client/impls/Cargo.lock @@ -0,0 +1,14 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ibc-client-starknet" +version = "0.1.0" +dependencies = [ + "ibc-client-starknet-types", +] + +[[package]] +name = "ibc-client-starknet-types" +version = "0.1.0" diff --git a/light-client/impls/Cargo.toml b/light-client/impls/Cargo.toml new file mode 100644 index 00000000..ac623464 --- /dev/null +++ b/light-client/impls/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "ibc-client-starknet" +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +rust-version = { workspace = true } +version = { workspace = true } +repository = { workspace = true } +readme = "./../README.md" +keywords = [ "starknet", "ibc", "light-client" ] +description = """ +""" + +[lints] +workspace = true + +[dependencies] +# external dependencies +derive_more = { workspace = true } + +# ibc dependencies +ibc-core = { workspace = true } +ibc-client-starknet-types = { path = "./../types" } + +[features] +default = [ "std" ] +std = [ + "ibc-core/std", + "ibc-client-starknet-types/std", +] diff --git a/light-client/impls/src/client_state/common.rs b/light-client/impls/src/client_state/common.rs new file mode 100644 index 00000000..052a9fdc --- /dev/null +++ b/light-client/impls/src/client_state/common.rs @@ -0,0 +1,65 @@ +use ibc_core::client::context::client_state::ClientStateCommon; +use ibc_core::client::types::error::ClientError; +use ibc_core::client::types::Height; +use ibc_core::commitment_types::commitment::{ + CommitmentPrefix, CommitmentProofBytes, CommitmentRoot, +}; +use ibc_core::host::types::identifiers::ClientType; +use ibc_core::host::types::path::{Path, PathBytes}; +use ibc_core::primitives::proto::Any; + +use super::ClientState; + +impl ClientStateCommon for ClientState { + fn verify_consensus_state(&self, consensus_state: Any) -> Result<(), ClientError> { + todo!() + } + + fn client_type(&self) -> ClientType { + todo!() + } + + fn latest_height(&self) -> ibc_core::client::types::Height { + todo!() + } + + fn validate_proof_height(&self, proof_height: Height) -> Result<(), ClientError> { + todo!() + } + + fn verify_upgrade_client( + &self, + upgraded_client_state: Any, + upgraded_consensus_state: Any, + proof_upgrade_client: CommitmentProofBytes, + proof_upgrade_consensus_state: CommitmentProofBytes, + root: &CommitmentRoot, + ) -> Result<(), ClientError> { + todo!() + } + + fn serialize_path(&self, path: Path) -> Result { + todo!() + } + + fn verify_membership_raw( + &self, + prefix: &CommitmentPrefix, + proof: &CommitmentProofBytes, + root: &CommitmentRoot, + path: PathBytes, + value: Vec, + ) -> Result<(), ClientError> { + todo!() + } + + fn verify_non_membership_raw( + &self, + prefix: &CommitmentPrefix, + proof: &CommitmentProofBytes, + root: &CommitmentRoot, + path: PathBytes, + ) -> Result<(), ClientError> { + todo!() + } +} diff --git a/light-client/impls/src/client_state/execution.rs b/light-client/impls/src/client_state/execution.rs new file mode 100644 index 00000000..65bd7df5 --- /dev/null +++ b/light-client/impls/src/client_state/execution.rs @@ -0,0 +1,60 @@ +use ibc_core::client::context::client_state::ClientStateExecution; +use ibc_core::client::context::ClientExecutionContext; +use ibc_core::client::types::error::ClientError; +use ibc_core::client::types::Height; +use ibc_core::host::types::identifiers::ClientId; +use ibc_core::primitives::proto::Any; + +use super::ClientState; + +impl ClientStateExecution for ClientState +where + E: ClientExecutionContext, +{ + fn initialise( + &self, + ctx: &mut E, + client_id: &ClientId, + consensus_state: Any, + ) -> Result<(), ClientError> { + todo!() + } + + fn update_state( + &self, + ctx: &mut E, + client_id: &ClientId, + header: Any, + ) -> Result, ClientError> { + todo!() + } + + fn update_state_on_misbehaviour( + &self, + ctx: &mut E, + client_id: &ClientId, + client_message: Any, + ) -> Result<(), ClientError> { + todo!() + } + + fn update_state_on_upgrade( + &self, + ctx: &mut E, + client_id: &ClientId, + upgraded_client_state: Any, + upgraded_consensus_state: Any, + ) -> Result { + todo!() + } + + fn update_on_recovery( + &self, + ctx: &mut E, + subject_client_id: &ClientId, + substitute_client_state: Any, + substitute_consensus_state: Any, + ) -> Result<(), ClientError> { + todo!() + } +} diff --git a/light-client/impls/src/client_state/mod.rs b/light-client/impls/src/client_state/mod.rs new file mode 100644 index 00000000..5f198ab3 --- /dev/null +++ b/light-client/impls/src/client_state/mod.rs @@ -0,0 +1,27 @@ +pub mod common; +pub mod execution; +pub mod validation; + +use ibc_client_starknet_types::ClientState as StarknetClientState; +use ibc_core::client::types::error::ClientError; +use ibc_core::primitives::proto::{Any, Protobuf}; + +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, derive_more::From)] +pub struct ClientState(StarknetClientState); + +impl Protobuf for ClientState {} + +impl TryFrom for ClientState { + type Error = ClientError; + + fn try_from(raw: Any) -> Result { + todo!() + } +} + +impl From for Any { + fn from(client_state: ClientState) -> Self { + todo!() + } +} diff --git a/light-client/impls/src/client_state/validation.rs b/light-client/impls/src/client_state/validation.rs new file mode 100644 index 00000000..8ad09cb1 --- /dev/null +++ b/light-client/impls/src/client_state/validation.rs @@ -0,0 +1,39 @@ +use ibc_core::client::context::client_state::ClientStateValidation; +use ibc_core::client::context::ClientValidationContext; +use ibc_core::client::types::error::ClientError; +use ibc_core::client::types::Status; +use ibc_core::host::types::identifiers::ClientId; +use ibc_core::primitives::proto::Any; + +use super::ClientState; + +impl ClientStateValidation for ClientState +where + V: ClientValidationContext, +{ + fn verify_client_message( + &self, + ctx: &V, + client_id: &ClientId, + client_message: Any, + ) -> Result<(), ClientError> { + todo!() + } + + fn check_for_misbehaviour( + &self, + ctx: &V, + client_id: &ClientId, + client_message: Any, + ) -> Result { + todo!() + } + + fn status(&self, ctx: &V, client_id: &ClientId) -> Result { + todo!() + } + + fn check_substitute(&self, ctx: &V, substitute_client_state: Any) -> Result<(), ClientError> { + todo!() + } +} diff --git a/light-client/impls/src/consensus_state.rs b/light-client/impls/src/consensus_state.rs new file mode 100644 index 00000000..afd61dba --- /dev/null +++ b/light-client/impls/src/consensus_state.rs @@ -0,0 +1,36 @@ +use ibc_client_starknet_types::ConsensusState as StarknetConsensusState; +use ibc_core::client::context::consensus_state::ConsensusState as ConsensusStateTrait; +use ibc_core::client::types::error::ClientError; +use ibc_core::commitment_types::commitment::CommitmentRoot; +use ibc_core::primitives::proto::{Any, Protobuf}; +use ibc_core::primitives::Timestamp; + +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, derive_more::From)] +pub struct ConsensusState(StarknetConsensusState); + +impl Protobuf for ConsensusState {} + +impl TryFrom for ConsensusState { + type Error = ClientError; + + fn try_from(raw: Any) -> Result { + todo!() + } +} + +impl From for Any { + fn from(consensus_state: ConsensusState) -> Self { + todo!() + } +} + +impl ConsensusStateTrait for ConsensusState { + fn root(&self) -> &CommitmentRoot { + todo!() + } + + fn timestamp(&self) -> Timestamp { + todo!() + } +} diff --git a/light-client/impls/src/lib.rs b/light-client/impls/src/lib.rs new file mode 100644 index 00000000..eb528a0f --- /dev/null +++ b/light-client/impls/src/lib.rs @@ -0,0 +1,5 @@ +mod client_state; +mod consensus_state; + +pub use client_state::*; +pub use consensus_state::*; diff --git a/light-client/types/Cargo.lock b/light-client/types/Cargo.lock new file mode 100644 index 00000000..5c838185 --- /dev/null +++ b/light-client/types/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ibc-client-starknet-types" +version = "0.1.0" diff --git a/light-client/types/Cargo.toml b/light-client/types/Cargo.toml new file mode 100644 index 00000000..76960f74 --- /dev/null +++ b/light-client/types/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "ibc-client-starknet-types" +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +rust-version = { workspace = true } +version = { workspace = true } +repository = { workspace = true } +readme = "./../README.md" +keywords = [ "starknet", "ibc", "light-client", "data-structures" ] +description = """ +""" + +[lints] +workspace = true + +[dependencies] + +[features] +default = [ "std" ] +std = [ ] diff --git a/light-client/types/src/client_message.rs b/light-client/types/src/client_message.rs new file mode 100644 index 00000000..48344106 --- /dev/null +++ b/light-client/types/src/client_message.rs @@ -0,0 +1,2 @@ +#[derive(Clone, Debug, PartialEq)] +pub struct ClientMessage {} diff --git a/light-client/types/src/client_state.rs b/light-client/types/src/client_state.rs new file mode 100644 index 00000000..438159c8 --- /dev/null +++ b/light-client/types/src/client_state.rs @@ -0,0 +1,2 @@ +#[derive(Clone, Debug, PartialEq)] +pub struct ClientState {} diff --git a/light-client/types/src/consensus_state.rs b/light-client/types/src/consensus_state.rs new file mode 100644 index 00000000..f3b2dcc4 --- /dev/null +++ b/light-client/types/src/consensus_state.rs @@ -0,0 +1,2 @@ +#[derive(Clone, Debug, PartialEq)] +pub struct ConsensusState {} diff --git a/light-client/types/src/lib.rs b/light-client/types/src/lib.rs new file mode 100644 index 00000000..6faba453 --- /dev/null +++ b/light-client/types/src/lib.rs @@ -0,0 +1,7 @@ +mod client_message; +mod client_state; +mod consensus_state; + +pub use client_message::*; +pub use client_state::*; +pub use consensus_state::*; diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 00000000..4c2bcd96 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,3 @@ +reorder_imports = true +group_imports = "StdExternalCrate" +imports_granularity = "Module" diff --git a/taplo.toml b/taplo.toml new file mode 100644 index 00000000..9cbd2f14 --- /dev/null +++ b/taplo.toml @@ -0,0 +1,7 @@ +include = [ "taplo.toml", "**/Cargo.toml", "**/Scarb.toml" ] + +[formatting] +align_entries = true +compact_arrays = false +array_auto_expand = false +array_auto_collapse = false