diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 89182a1..35a3e8a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,9 +4,48 @@ on: push: branches: [main] pull_request: - branches: [main] jobs: + audit_rust: + name: Audit Rust + runs-on: ubuntu-latest + steps: + - name: Git Checkout + uses: actions/checkout@v4 + + - name: Setup Environment + uses: ./.github/actions/setup + with: + cargo-cache-key: cargo-audit + + - name: Install cargo-audit + uses: taiki-e/install-action@v2 + with: + tool: cargo-audit + + - name: Run cargo-audit + run: pnpm rust:audit + + spellcheck_rust: + name: Spellcheck Rust + runs-on: ubuntu-latest + steps: + - name: Git Checkout + uses: actions/checkout@v4 + + - name: Setup Environment + uses: ./.github/actions/setup + with: + cargo-cache-key: cargo-spellcheck + + - name: Install cargo-spellcheck + uses: taiki-e/install-action@v2 + with: + tool: cargo-spellcheck + + - name: Run cargo-spellcheck + run: pnpm rust:spellcheck + format_and_lint_programs: name: Format & Lint Programs runs-on: ubuntu-latest @@ -64,7 +103,6 @@ jobs: build_programs: name: Build programs runs-on: ubuntu-latest - needs: format_and_lint_programs steps: - name: Git Checkout uses: actions/checkout@v4 @@ -96,7 +134,7 @@ jobs: test_programs: name: Test Programs runs-on: ubuntu-latest - needs: format_and_lint_programs + needs: build_programs steps: - name: Git Checkout uses: actions/checkout@v4 @@ -108,13 +146,18 @@ jobs: cargo-cache-fallback-key: cargo-programs solana: true + - name: Restore Program Builds + uses: actions/cache/restore@v4 + with: + path: ./**/*.so + key: ${{ runner.os }}-builds-${{ github.sha }} + - name: Test Programs - run: pnpm programs:test + run: RUST_LOG=error pnpm programs:test generate_clients: name: Check Client Generation runs-on: ubuntu-latest - needs: format_and_lint_programs steps: - name: Git Checkout uses: actions/checkout@v4 diff --git a/Cargo.lock b/Cargo.lock index 95b098b..ea73db5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,44 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "agave-feature-set" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55f86f9004ab5de0e06eb9a4b43f2a84e0f682c576fd04b0321cdde849cb9728" +dependencies = [ + "ahash", + "solana-epoch-schedule", + "solana-feature-set-interface", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", +] + +[[package]] +name = "agave-precompiles" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b8479b9b4b0dc1dff1eb25d8d9fdc7cb0053f15a3ff5f17e7ee419fc4179b7" +dependencies = [ + "agave-feature-set", + "bincode", + "bytemuck", + "digest 0.10.7", + "ed25519-dalek", + "lazy_static", + "libsecp256k1", + "openssl", + "sha3", + "solana-ed25519-program", + "solana-message", + "solana-precompile-error", + "solana-pubkey", + "solana-sdk-ids", + "solana-secp256k1-program", + "solana-secp256r1-program", +] + [[package]] name = "ahash" version = "0.8.11" @@ -262,9 +300,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.18" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +checksum = "59a194f9d963d8099596278594b3107448656ba73831c9d8c783e613ce86da64" dependencies = [ "brotli", "flate2", @@ -293,7 +331,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -369,18 +407,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" dependencies = [ "serde", ] [[package]] name = "blake3" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1230237285e3e10cde447185e8975408ae24deaa67205ce684805c25bc0c7937" +checksum = "b17679a8d69b6d7fd9cd9801a536cec9fa5e5970b69f9d4747f70b39b031f5e7" dependencies = [ "arrayref", "arrayvec", @@ -388,7 +426,6 @@ dependencies = [ "cfg-if", "constant_time_eq", "digest 0.10.7", - "memmap2 0.9.5", ] [[package]] @@ -421,11 +458,11 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" dependencies = [ - "borsh-derive 1.5.5", + "borsh-derive 1.5.7", "cfg_aliases", ] @@ -444,15 +481,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" dependencies = [ "once_cell", - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -525,22 +562,22 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -551,9 +588,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "caps" @@ -567,9 +604,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.15" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "jobserver", "libc", @@ -602,20 +639,20 @@ checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -832,14 +869,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -847,27 +884,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -958,7 +995,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -981,7 +1018,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1027,9 +1064,9 @@ dependencies = [ [[package]] name = "either" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "encode_unicode" @@ -1063,7 +1100,7 @@ checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1126,18 +1163,18 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "five8_const" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b4f62f0f8ca357f93ae90c8c2dd1041a1f665fde2f889ea9b1787903829015" +checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b" dependencies = [ "five8_core", ] [[package]] name = "five8_core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94474d15a76982be62ca8a39570dccce148d98c238ebb7408b0a21b2c4bdddc4" +checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" [[package]] name = "flate2" @@ -1235,7 +1272,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1372,7 +1409,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.7.1", + "indexmap 2.8.0", "slab", "tokio", "tokio-util", @@ -1496,9 +1533,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1508,9 +1545,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "hyper" @@ -1615,9 +1652,9 @@ dependencies = [ [[package]] name = "icu_locid_transform_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] name = "icu_normalizer" @@ -1639,9 +1676,9 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] name = "icu_properties" @@ -1660,9 +1697,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] name = "icu_provider" @@ -1689,7 +1726,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1732,9 +1769,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -1780,9 +1817,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jni" @@ -1867,9 +1904,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.170" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libsecp256k1" @@ -1933,9 +1970,9 @@ dependencies = [ [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" @@ -1949,9 +1986,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "memchr" @@ -1968,15 +2005,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memmap2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] - [[package]] name = "memoffset" version = "0.9.1" @@ -2031,9 +2059,10 @@ dependencies = [ [[package]] name = "mollusk-svm" version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8485907fd5b9a88dfebab31e420e3e0e2050c439ab29b22924b29618dac338f7" +source = "git+https://github.com/anza-xyz/mollusk.git#75de4dd871f3e6e372097e117e70a274e73e4ba8" dependencies = [ + "agave-feature-set", + "agave-precompiles", "bincode", "mollusk-svm-error", "mollusk-svm-keys", @@ -2043,14 +2072,12 @@ dependencies = [ "solana-compute-budget", "solana-epoch-rewards", "solana-epoch-schedule", - "solana-feature-set", "solana-fee-structure", "solana-hash", "solana-instruction", "solana-loader-v3-interface", "solana-log-collector", "solana-logger", - "solana-precompiles", "solana-program-error", "solana-program-runtime", "solana-pubkey", @@ -2068,8 +2095,7 @@ dependencies = [ [[package]] name = "mollusk-svm-error" version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39c95982aa8f243ee7bbf662450ae5326cb06a95429d5d46fc1fd6904e1bafe" +source = "git+https://github.com/anza-xyz/mollusk.git#75de4dd871f3e6e372097e117e70a274e73e4ba8" dependencies = [ "solana-pubkey", "thiserror 1.0.69", @@ -2078,8 +2104,7 @@ dependencies = [ [[package]] name = "mollusk-svm-keys" version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f096a27c13602b3e599f167e215947858a0da11d02d38e0a05c43219608030" +source = "git+https://github.com/anza-xyz/mollusk.git#75de4dd871f3e6e372097e117e70a274e73e4ba8" dependencies = [ "mollusk-svm-error", "solana-account", @@ -2094,7 +2119,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg-if", "cfg_aliases", "libc", @@ -2182,7 +2207,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2251,10 +2276,10 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2283,9 +2308,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "opaque-debug" @@ -2299,7 +2324,7 @@ version = "0.10.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg-if", "foreign-types", "libc", @@ -2316,7 +2341,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2325,6 +2350,15 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "openssl-src" +version = "300.4.2+3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" version = "0.9.106" @@ -2333,6 +2367,7 @@ checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -2419,15 +2454,15 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pinocchio" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2281a8e9e947c480ce0b64e2d6c6349d72890ba5db6503d5568edf96f304cba9" +checksum = "530596fa307103e53257f2cf064815919ee7fbc4c7ab999f6f13cc7067c3aff1" [[package]] name = "pinocchio-pubkey" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c8cd934ccaf7915d19049275f77c8888860a2792102a5d9f0b8eafbf670f6a8" +checksum = "0c6b20fcebc172c3cd3f54114b0241b48fa8e30893ced2eb4927aaba5e3a0ba5" dependencies = [ "five8_const", "pinocchio", @@ -2435,9 +2470,9 @@ dependencies = [ [[package]] name = "pinocchio-system" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee1e06182bee542854db81640d0782143751a0e98331a7c67148ccb1c932acd7" +checksum = "1f75423420ae70aa748cf611cab14cfd00af08d0d2d3d258cb0cf5e2880ec19c" dependencies = [ "pinocchio", "pinocchio-pubkey", @@ -2445,9 +2480,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" @@ -2463,11 +2498,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.7.35", + "zerocopy 0.8.24", ] [[package]] @@ -2481,18 +2516,18 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] @@ -2514,7 +2549,7 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2546,7 +2581,7 @@ dependencies = [ "rustc-hash", "rustls 0.23.25", "socket2", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", "web-time", @@ -2567,7 +2602,7 @@ dependencies = [ "rustls-pki-types", "rustls-platform-verifier", "slab", - "thiserror 2.0.11", + "thiserror 2.0.12", "tinyvec", "tracing", "web-time", @@ -2589,9 +2624,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -2709,7 +2744,7 @@ version = "11.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -2734,11 +2769,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -2831,9 +2866,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.11" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", @@ -2979,15 +3014,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -3029,7 +3064,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -3048,15 +3083,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -3072,29 +3107,29 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -3124,7 +3159,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.1", + "indexmap 2.8.0", "serde", "serde_derive", "serde_json", @@ -3141,7 +3176,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -3195,6 +3230,16 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -3261,9 +3306,9 @@ dependencies = [ [[package]] name = "solana-account-decoder-client-types" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6329c4f360f5173dd6f65022708486cdd24d302841058e2310945a2502284105" +checksum = "2af92808cf4bc3e9e821e3f534424a6a3f06ed3450a986573d39d381ae74d923" dependencies = [ "base64 0.22.1", "bs58", @@ -3350,9 +3395,9 @@ dependencies = [ [[package]] name = "solana-bn254" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9abc69625158faaab02347370b91c0d8e0fe347bf9287239f0fbe8f5864d91da" +checksum = "4420f125118732833f36facf96a27e7b78314b2d642ba07fa9ffdacd8d79e243" dependencies = [ "ark-bn254", "ark-ec", @@ -3360,7 +3405,7 @@ dependencies = [ "ark-serialize", "bytemuck", "solana-define-syscall", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -3370,15 +3415,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "718333bcd0a1a7aed6655aa66bef8d7fb047944922b2d3a18f49cbc13e73d004" dependencies = [ "borsh 0.10.4", - "borsh 1.5.5", + "borsh 1.5.7", ] [[package]] name = "solana-bpf-loader-program" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6931e8893b48e3a1c8124938f580fff857d84895582578cc7dbf100dd08d2c8f" +checksum = "c9244e6b88a89330f6f9b5274dc10cdc1c972cc1bb418fd793848a7ad8008643" dependencies = [ + "agave-feature-set", + "agave-precompiles", "bincode", "libsecp256k1", "qualifier_attr", @@ -3393,7 +3440,6 @@ dependencies = [ "solana-compute-budget", "solana-cpi", "solana-curve25519", - "solana-feature-set", "solana-hash", "solana-instruction", "solana-keccak-hasher", @@ -3403,7 +3449,6 @@ dependencies = [ "solana-measure", "solana-packet", "solana-poseidon", - "solana-precompiles", "solana-program-entrypoint", "solana-program-memory", "solana-program-runtime", @@ -3419,21 +3464,21 @@ dependencies = [ "solana-timings", "solana-transaction-context", "solana-type-overrides", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] name = "solana-client" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e827416867d988cbba327b6e448ad0bfb85ba44f080c6a02a00aa498c2249c4" +checksum = "4680b5eb53658b01c2dfbca937ccba61d127f1a84af1a5041f7737261c944e1f" dependencies = [ "async-trait", "bincode", "dashmap", "futures", "futures-util", - "indexmap 2.7.1", + "indexmap 2.8.0", "indicatif", "log", "quinn", @@ -3464,7 +3509,7 @@ dependencies = [ "solana-transaction", "solana-transaction-error", "solana-udp-client", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", ] @@ -3525,9 +3570,9 @@ dependencies = [ [[package]] name = "solana-compute-budget" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e593ce26764fa3366b6d125b9f2455f6cd8d557f86b4f3c7b7c517db6d8f5f" +checksum = "d4c0d0e5f8feb9ed0ae662b0a241f7171dd2931e15252189b8cc401536e1bbbe" dependencies = [ "solana-fee-structure", "solana-program-entrypoint", @@ -3539,7 +3584,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a5df17b195d312b66dccdde9beec6709766d8230cb4718c4c08854f780d0309" dependencies = [ - "borsh 1.5.5", + "borsh 1.5.7", "serde", "serde_derive", "solana-instruction", @@ -3548,15 +3593,15 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ad0b507b4044e2690915c9aa69eacfd51b1fa55e4deeca662ee5cff7d7d1f4" +checksum = "9773ceb9aebcb88ae807d2ac60287409ace1e09dfaefb91f1a54757f69418337" dependencies = [ "async-trait", "bincode", "crossbeam-channel", "futures-util", - "indexmap 2.7.1", + "indexmap 2.8.0", "log", "rand 0.8.5", "rayon", @@ -3566,7 +3611,7 @@ dependencies = [ "solana-net-utils", "solana-time-utils", "solana-transaction-error", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", ] @@ -3586,16 +3631,16 @@ dependencies = [ [[package]] name = "solana-curve25519" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3d15f1a893ced38529d44d7fe0d4348dc38c28fea13b6d6be5d13d438a441f" +checksum = "91f23498bbf3ae4f22125a2f16f988a5a659628ea4949ca605a05191f91095d3" dependencies = [ "bytemuck", "bytemuck_derive", "curve25519-dalek 4.1.3", "solana-define-syscall", "subtle", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -3626,9 +3671,9 @@ dependencies = [ [[package]] name = "solana-ed25519-program" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0c4dfce08d71d8f1e9b7d1b4e2c7101a8109903ad481acbbc1119a73d459f2" +checksum = "9d0fc717048fdbe5d2ee7d673d73e6a30a094002f4a29ca7630ac01b6bddec04" dependencies = [ "bytemuck", "bytemuck_derive", @@ -3705,7 +3750,7 @@ dependencies = [ "solana-pubkey", "solana-sdk-ids", "solana-system-interface", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -3729,9 +3774,9 @@ dependencies = [ [[package]] name = "solana-feature-set" -version = "2.2.1" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e1d3b52b4a014efeaaab67f14e40af3972a4be61c523d612860db8e3145529" +checksum = "92f6c09cc41059c0e03ccbee7f5d4cc0a315d68ef0d59b67eb90246adfd8cc35" dependencies = [ "ahash", "lazy_static", @@ -3741,6 +3786,16 @@ dependencies = [ "solana-sha256-hasher", ] +[[package]] +name = "solana-feature-set-interface" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02007757246e40f10aa936dae4fa27efbf8dbd6a59575a12ccc802c1aea6e708" +dependencies = [ + "ahash", + "solana-pubkey", +] + [[package]] name = "solana-fee-calculator" version = "2.2.1" @@ -3772,7 +3827,7 @@ checksum = "968dabd2b92d57131473eddbd475339da530e14f54397386abf303de3a2595a2" dependencies = [ "bincode", "chrono", - "memmap2 0.5.10", + "memmap2", "serde", "serde_derive", "solana-account", @@ -3811,7 +3866,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf7bcb14392900fe02e4e34e90234fbf0c673d4e327888410ba99fa2ba0f4e99" dependencies = [ - "borsh 1.5.5", + "borsh 1.5.7", "bs58", "bytemuck", "bytemuck_derive", @@ -3835,9 +3890,9 @@ dependencies = [ [[package]] name = "solana-inline-spl" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed78e6709851bb3fa8a0acb1ee40fbffa888049d042ca132d6ccb8e0b313ac72" +checksum = "e092d19263b9f756ed7b49f8882bfd1e6a4d74186850edbab5fc88a973ffa32c" dependencies = [ "bytemuck", "solana-pubkey", @@ -3850,7 +3905,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce496a475e5062ba5de97215ab39d9c358f9c9df4bb7f3a45a1f1a8bd9065ed" dependencies = [ "bincode", - "borsh 1.5.5", + "borsh 1.5.7", "getrandom 0.2.15", "js-sys", "num-traits", @@ -3867,7 +3922,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "427f2d0d6dc0bb49f16cef5e7f975180d2e80aab9bdd3b2af68e2d029ec63f43" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "solana-account-info", "solana-instruction", "solana-program-error", @@ -3968,29 +4023,31 @@ dependencies = [ [[package]] name = "solana-log-collector" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d03bf4c676117575be755296e8f21233d74cd28dca227c42e97e86219a27193" +checksum = "315d9559c113c2c4201dd2551e74c326e95505a1448f66837fd1c85114ef9ff6" dependencies = [ "log", ] [[package]] name = "solana-logger" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "593dbcb81439d37b02757e90bd9ab56364de63f378c55db92a6fbd6a2e47ab36" +checksum = "db8e777ec1afd733939b532a42492d888ec7c88d8b4127a5d867eb45c6eb5cd5" dependencies = [ "env_logger", "lazy_static", + "libc", "log", + "signal-hook", ] [[package]] name = "solana-measure" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b17ee553110d2bfc454b8784840a4b75867e123d3816e13046989463fed2c6b" +checksum = "be62d4389acf07ff49f2a96e309792593e32c80fe137470a82c83de8a43ba0c1" [[package]] name = "solana-message" @@ -4017,9 +4074,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98b79bd642efa8388791fef7a900bfeb48865669148d523fba041fa7e407312f" +checksum = "5ae152b40879a8a66ea3ecf82a7d3bca87ceb1aa969ca5bf1a1400cf4cc57e8e" dependencies = [ "crossbeam-channel", "gethostname", @@ -4030,7 +4087,7 @@ dependencies = [ "solana-cluster-type", "solana-sha256-hasher", "solana-time-utils", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -4050,9 +4107,9 @@ checksum = "33e9de00960197412e4be3902a6cd35e60817c511137aca6c34c66cd5d4017ec" [[package]] name = "solana-net-utils" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9db57e121ca1577fb5578d916bed549632be0e54a2098e8325980ac724d283" +checksum = "9a6b2d0fc93d86c281885a19308f48829eddd3370530323645be9be26e622a87" dependencies = [ "anyhow", "bincode", @@ -4119,7 +4176,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "004f2d2daf407b3ec1a1ca5ec34b3ccdfd6866dd2d3c7d0715004a96e4b6d127" dependencies = [ "bincode", - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg_eval", "serde", "serde_derive", @@ -4128,9 +4185,9 @@ dependencies = [ [[package]] name = "solana-perf" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b87939c18937f8bfad6028779a02fa123b27e986fb2c55fbbf683952a0e4932" +checksum = "63ab23d21d75e9f8bfbd8888e4c1d2e1d69adba34070d380fd406726c1c3ebb6" dependencies = [ "ahash", "bincode", @@ -4170,14 +4227,14 @@ dependencies = [ [[package]] name = "solana-poseidon" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d2908b48b3828bc04b752d1ff36122f5a06de043258da88df5f8ce64791d208" +checksum = "bd6f45ab021dd9958420e0ec59d9740bcea05a10a1fa55f84c483bf7a42dcf48" dependencies = [ "ark-bn254", "light-poseidon", "solana-define-syscall", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -4227,7 +4284,7 @@ dependencies = [ "bincode", "blake3", "borsh 0.10.4", - "borsh 1.5.5", + "borsh 1.5.7", "bs58", "bytemuck", "console_error_panic_hook", @@ -4294,7 +4351,7 @@ dependencies = [ "solana-sysvar", "solana-sysvar-id", "solana-vote-interface", - "thiserror 2.0.11", + "thiserror 2.0.12", "wasm-bindgen", ] @@ -4316,7 +4373,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8ae2c1a8d0d4ae865882d5770a7ebca92bab9c685e43f0461682c6c05a35bfa" dependencies = [ - "borsh 1.5.5", + "borsh 1.5.7", "num-traits", "serde", "serde_derive", @@ -4353,10 +4410,12 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce0a9acc6049c2ae8a2a2dd0b63269ab1a6d8fab4dead1aae75a9bcdd4aa6f05" +checksum = "6db1ef9a738c798ee7b738e592f3c66c7c01ad259f78481762b6ebf20ec2fc97" dependencies = [ + "agave-feature-set", + "agave-precompiles", "base64 0.22.1", "bincode", "enum-iterator", @@ -4370,14 +4429,12 @@ dependencies = [ "solana-compute-budget", "solana-epoch-rewards", "solana-epoch-schedule", - "solana-feature-set", "solana-hash", "solana-instruction", "solana-last-restart-slot", "solana-log-collector", "solana-measure", "solana-metrics", - "solana-precompiles", "solana-pubkey", "solana-rent", "solana-sbpf", @@ -4389,7 +4446,7 @@ dependencies = [ "solana-timings", "solana-transaction-context", "solana-type-overrides", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -4399,7 +4456,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40db1ff5a0f8aea2c158d78ab5f2cf897848964251d1df42fef78efd3c85b863" dependencies = [ "borsh 0.10.4", - "borsh 1.5.5", + "borsh 1.5.7", "bs58", "bytemuck", "bytemuck_derive", @@ -4421,9 +4478,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d219147fd3a6753dc4819578fb6830c082a7c26b1559fab0f240fcf11f4e39" +checksum = "6b7542ac55b715d5af59ad97906225ccdc696b135c485c4b3e557c8b2927fdc3" dependencies = [ "crossbeam-channel", "futures-util", @@ -4438,7 +4495,7 @@ dependencies = [ "solana-pubkey", "solana-rpc-client-api", "solana-signature", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tokio-stream", "tokio-tungstenite", @@ -4448,9 +4505,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769d66df4ab445ab689ab2c4f10135dfe80576859b4fea1cae7d9bdd7985e4e2" +checksum = "71399c81833d24dd30d2e7bcc3b873538de30f24d761c647cd5c7eecc60179b7" dependencies = [ "async-lock", "async-trait", @@ -4473,7 +4530,7 @@ dependencies = [ "solana-streamer", "solana-tls-utils", "solana-transaction-error", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", ] @@ -4488,9 +4545,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bf3ad7091b26c9bd0ebabff6ac4d825c88ecf2eafdb83de30dffda80ffc2f17" +checksum = "b4672e856580ee8fa20b87add1ebe40d112e94e128d6d1c5fa193d1d7c8f6d2e" dependencies = [ "lazy_static", "num_cpus", @@ -4560,9 +4617,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f1809a424bb8d90aa40990451593cde7e734a060fb52b35e475db585450578" +checksum = "f8078848ab5bbc410036994de93ea438a266bae7ef6e6e35555f807c6f7031ca" dependencies = [ "async-trait", "base64 0.22.1", @@ -4598,9 +4655,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2eb4fe573cd2d59d8672f0d8ac65f64e70c948b36cf97218b9aeb80dca3329" +checksum = "3856b35d4d12b44541a46650cb2b1e006e9264a27d0139b4d898c66b0e46f53d" dependencies = [ "anyhow", "base64 0.22.1", @@ -4624,14 +4681,14 @@ dependencies = [ "solana-transaction-error", "solana-transaction-status-client-types", "solana-version", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] name = "solana-rpc-client-nonce-utils" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2712d22c58616762ad8e02fc18556eaf7be4104d5e56b11a2b8aa892c7de2a08" +checksum = "c3beacc5a28d3e6851204673c90a6c9dff6b1567b6059373ecddf174b5837cab" dependencies = [ "solana-account", "solana-commitment-config", @@ -4641,7 +4698,7 @@ dependencies = [ "solana-pubkey", "solana-rpc-client", "solana-sdk-ids", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -4669,9 +4726,9 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4808e8d7f3c931657e615042d4176b423e66f64dc99e3dc3c735a197e512029b" +checksum = "e8af90d2ce445440e0548fa4a5f96fe8b265c22041a68c942012ffadd029667d" dependencies = [ "bincode", "bs58", @@ -4734,7 +4791,7 @@ dependencies = [ "solana-transaction-context", "solana-transaction-error", "solana-validator-exit", - "thiserror 2.0.11", + "thiserror 2.0.12", "wasm-bindgen", ] @@ -4756,7 +4813,7 @@ dependencies = [ "bs58", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4783,17 +4840,17 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baa3120b6cdaa270f39444f5093a90a7b03d296d362878f7a6991d6de3bbe496" dependencies = [ - "borsh 1.5.5", + "borsh 1.5.7", "libsecp256k1", "solana-define-syscall", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] name = "solana-secp256r1-program" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ea9282950921611bd9e0200da7236fbb1d4f8388942f8451bd55e9f3cb228f" +checksum = "5cda2aa1bbaceda14763c4f142a00b486f2f262cfd901bd0410649ad0404d5f7" dependencies = [ "bytemuck", "openssl", @@ -4958,7 +5015,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5269e89fde216b4d7e1d1739cf5303f8398a1ff372a81232abbee80e554a838c" dependencies = [ "borsh 0.10.4", - "borsh 1.5.5", + "borsh 1.5.7", "num-traits", "serde", "serde_derive", @@ -4974,9 +5031,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8251a832b9f849e32266e2ebc14dba374c6c58d64e8b1ea9e9d95e836a53fe6" +checksum = "129f0166d3c510acfbbcf262729d6964d3b3f6dd9db6845a1a2b9ce8cb30f3f6" dependencies = [ "async-channel", "bytes", @@ -4986,7 +5043,7 @@ dependencies = [ "futures-util", "governor", "histogram", - "indexmap 2.7.1", + "indexmap 2.8.0", "itertools 0.12.1", "libc", "log", @@ -5013,7 +5070,7 @@ dependencies = [ "solana-tls-utils", "solana-transaction-error", "solana-transaction-metrics-tracker", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tokio-util", "x509-parser", @@ -5037,9 +5094,9 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6321fd5380961387ef4633a98c109ac7f978667ceab2a38d0a699d6ddb2fc57a" +checksum = "8e22d5d6eb634acc9cd92d4ac714b5b791fa4460cbe5f0e8b0ccae75536554c9" dependencies = [ "bincode", "log", @@ -5125,9 +5182,9 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f6e417c23af670d7861ef74feae3c556d47ea9e5f64c664cfcf6d254f43e1a" +checksum = "d2aa3050bda10715357435d56e719416c28e2b21458bb42ac1e2044917fec11f" dependencies = [ "bincode", "log", @@ -5160,9 +5217,9 @@ checksum = "6af261afb0e8c39252a04d026e3ea9c405342b08c871a2ad8aa5448e068c784c" [[package]] name = "solana-timings" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224f93327d9d3178a30cd6c057e1ac6ca85e95287dd7355064dfa6b9c49f5671" +checksum = "5190a60fc62b7462a8a16b2c254bb940edd330881d851f9ab3ae17e048b3e958" dependencies = [ "eager", "enum-iterator", @@ -5171,9 +5228,9 @@ dependencies = [ [[package]] name = "solana-tls-utils" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec21c6c242ee93642aa50b829f5727470cdbdf6b461fb7323fe4bc31d1b54c08" +checksum = "17dbcda5070c3d968a6e67e0dbea011e34935d994e8ef4788aeeac957099ff78" dependencies = [ "rustls 0.23.25", "solana-keypair", @@ -5184,14 +5241,14 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e3ff3c8ece22043d96758f980d95558d50792d827d1457c2e06d9daaa7ff5" +checksum = "e122b23bbb4a7f46ee3281a3c48a41a2de340c2a907c67a313dd825cb38f2df5" dependencies = [ "async-trait", "bincode", "futures-util", - "indexmap 2.7.1", + "indexmap 2.8.0", "indicatif", "log", "rayon", @@ -5212,15 +5269,15 @@ dependencies = [ "solana-signer", "solana-transaction", "solana-transaction-error", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", ] [[package]] name = "solana-transaction" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "753b3e9afed170e4cfc0ea1e87b5dfdc6d4a50270869414edd24c6ea1f529b29" +checksum = "abec848d081beb15a324c633cd0e0ab33033318063230389895cae503ec9b544" dependencies = [ "bincode", "serde", @@ -5233,7 +5290,6 @@ dependencies = [ "solana-message", "solana-precompiles", "solana-pubkey", - "solana-reserved-account-keys", "solana-sanitize", "solana-sdk-ids", "solana-short-vec", @@ -5274,9 +5330,9 @@ dependencies = [ [[package]] name = "solana-transaction-metrics-tracker" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e40670c0780af24e73551be1fadf2306f61ed13f538ff3933846dab813b06d" +checksum = "86bfccb8604f0e9fb4a6aca529a0bef0c1d169411b3c5082f4a7f73786932a12" dependencies = [ "base64 0.22.1", "bincode", @@ -5291,9 +5347,9 @@ dependencies = [ [[package]] name = "solana-transaction-status-client-types" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1458fc750d0df4439bb4c1b418a4fe61afbd2e83963e452256eca99dc0c1cf76" +checksum = "6f1a75d58495fbe48b331711a6236cb1dfcae32ea67c5bbb6468fec9e3cf449b" dependencies = [ "base64 0.22.1", "bincode", @@ -5309,14 +5365,14 @@ dependencies = [ "solana-transaction", "solana-transaction-context", "solana-transaction-error", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] name = "solana-type-overrides" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26d927bf3ed2f2b6b06a0f409dd8d6b1ad1af73cbba337e9471d05d42f026c9" +checksum = "46a0e32a62e4cc70a5ed997ddee1a8f79ac9127a9f600d5c3c498f0ae34680e3" dependencies = [ "lazy_static", "rand 0.8.5", @@ -5324,9 +5380,9 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c37955cc627be2745e29ce326fd1b51739e499445b5e2b5fec687ed8ec581e34" +checksum = "aa3a123f571f006cf8a0568b5d3bd949fef5a194a56841001c475e26a1e60308" dependencies = [ "async-trait", "solana-connection-cache", @@ -5334,7 +5390,7 @@ dependencies = [ "solana-net-utils", "solana-streamer", "solana-transaction-error", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", ] @@ -5346,23 +5402,23 @@ checksum = "7bbf6d7a3c0b28dd5335c52c0e9eae49d0ae489a8f324917faf0ded65a812c1d" [[package]] name = "solana-version" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374dea09855d46655c776256dda9cc3c854cc70fd923ef22ba0805bc83ca7bfd" +checksum = "cbff96c3f3f20978504165b84c3d0ee63ef221bf33b144389030413bd44354da" dependencies = [ + "agave-feature-set", "semver", "serde", "serde_derive", - "solana-feature-set", "solana-sanitize", "solana-serde-varint", ] [[package]] name = "solana-vote-interface" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4507bb9d071fb81cfcf676f12fba3db4098f764524ef0b5567d671a81d41f3e" +checksum = "c1e9f6a1651310a94cd5a1a6b7f33ade01d9e5ea38a2220becb5fd737b756514" dependencies = [ "bincode", "num-derive", @@ -5399,7 +5455,12 @@ dependencies = [ "pinocchio", "pinocchio-pubkey", "pinocchio-system", - "solana-sdk", + "solana-account", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", "solana-security-txt", ] @@ -5450,9 +5511,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -5485,7 +5546,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -5538,11 +5599,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] @@ -5553,18 +5614,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -5610,9 +5671,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -5625,9 +5686,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" dependencies = [ "backtrace", "bytes", @@ -5649,7 +5710,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -5690,9 +5751,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes", "futures-core", @@ -5722,7 +5783,7 @@ version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", "toml_datetime", "winnow", ] @@ -5794,9 +5855,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-width" @@ -5944,7 +6005,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -5979,7 +6040,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6077,6 +6138,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + [[package]] name = "windows-sys" version = "0.45.0" @@ -6293,9 +6360,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" dependencies = [ "memchr", ] @@ -6316,7 +6383,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -6369,7 +6436,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "synstructure 0.13.1", ] @@ -6379,7 +6446,6 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "byteorder", "zerocopy-derive 0.7.35", ] @@ -6400,7 +6466,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -6411,27 +6477,27 @@ checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "synstructure 0.13.1", ] @@ -6452,7 +6518,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -6474,7 +6540,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8e05143..589c47f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,8 +5,9 @@ members = ["program", "clients/rust"] [workspace.metadata.cli] solana = "2.1.9" -# Specify Rust toolchains for rustfmt, clippy, and build. -# Any unprovided toolchains default to stable. [workspace.metadata.toolchains] -format = "1.81.0" -lint = "1.81.0" +format = "nightly-2024-11-22" +lint = "nightly-2024-11-22" + +[workspace.metadata.spellcheck] +config = "scripts/spellcheck.toml" diff --git a/package.json b/package.json index 009e7a3..142e369 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,10 @@ { "private": true, "scripts": { - "programs:build": "zx ./scripts/program/build.mjs", - "programs:test": "zx ./scripts/program/test.mjs", - "programs:clean": "zx ./scripts/program/clean.mjs", - "programs:format": "zx ./scripts/program/format.mjs", - "programs:lint": "zx ./scripts/program/lint.mjs", + "programs:build": "zx ./scripts/rust/build-sbf.mjs program", + "programs:format": "zx ./scripts/rust/format.mjs program", + "programs:lint": "zx ./scripts/rust/lint.mjs program", + "programs:test": "zx ./scripts/rust/test.mjs program", "solana:check": "zx ./scripts/check-solana-version.mjs", "solana:link": "zx ./scripts/link-solana-version.mjs", "generate": "pnpm generate:clients", @@ -13,14 +12,18 @@ "validator:start": "zx ./scripts/start-validator.mjs", "validator:restart": "pnpm validator:start --restart", "validator:stop": "zx ./scripts/stop-validator.mjs", - "clients:js:format": "zx ./scripts/client/format-js.mjs", - "clients:js:lint": "zx ./scripts/client/lint-js.mjs", - "clients:js:publish": "zx ./scripts/client/publish-js.mjs", - "clients:js:test": "zx ./scripts/client/test-js.mjs", - "clients:rust:format": "zx ./scripts/client/format-rust.mjs", - "clients:rust:lint": "zx ./scripts/client/lint-rust.mjs", - "clients:rust:publish": "zx ./scripts/client/publish-rust.mjs", - "clients:rust:test": "zx ./scripts/client/test-rust.mjs" + "clients:js:format": "zx ./scripts/js/format.mjs", + "clients:js:lint": "zx ./scripts/js/lint.mjs", + "clients:js:publish": "zx ./scripts/js/publish.mjs", + "clients:js:test": "zx ./scripts/js/test.mjs", + "clients:rust:format": "zx ./scripts/rust/format.mjs clients/rust", + "clients:rust:lint": "zx ./scripts/rust/lint.mjs clients/rust", + "clients:rust:test": "zx ./scripts/rust/test.mjs clients/rust", + "template:upgrade": "zx ./scripts/upgrade-template.mjs", + "rust:spellcheck": "cargo spellcheck --code 1", + "rust:audit": "zx ./scripts/rust/audit.mjs", + "rust:publish": "zx ./scripts/rust/publish.mjs", + "rust:semver": "cargo semver-checks" }, "devDependencies": { "@codama/renderers-js": "^1.2.10", diff --git a/program/Cargo.toml b/program/Cargo.toml index fdf32df..4c2e38e 100644 --- a/program/Cargo.toml +++ b/program/Cargo.toml @@ -26,9 +26,13 @@ pinocchio-system = "0.2" solana-security-txt = "1.1.1" [dev-dependencies] -mollusk-svm = "0.1" -solana-sdk = "2.2" +mollusk-svm = { version = "0.1", git = "https://github.com/anza-xyz/mollusk.git" } +solana-account = "2.2.1" +solana-instruction = "2.2.1" +solana-program-error = "2.2.1" +solana-pubkey = "2.2.1" +solana-rent = "2.2.1" +solana-sdk-ids = "2.2.1" [features] logging = [] -test-sbf = [] diff --git a/program/src/instruction.rs b/program/src/instruction.rs index 01eee2a..daa96be 100644 --- a/program/src/instruction.rs +++ b/program/src/instruction.rs @@ -81,7 +81,7 @@ pub enum ProgramMetadataInstruction { /// /// Instruction data: /// - /// - `u8`: option (0 = remove authority, 1 = set authority) + /// - `u8`: option (0 `=` remove authority, 1 `=` set authority) /// - `[u8; 32]`: (optional) new authority SetAuthority, @@ -179,7 +179,7 @@ pub enum ProgramMetadataInstruction { /// 5. `[w]` Destination account. Close, - /// Alocates a buffer account. + /// Allocates a buffer account. /// /// The buffer account can either be a PDA or a keypair account. /// It must be pre-funded with enough lamports to cover the storage diff --git a/program/src/lib.rs b/program/src/lib.rs index c350911..cb9ef67 100644 --- a/program/src/lib.rs +++ b/program/src/lib.rs @@ -1,7 +1,5 @@ //! A program to store metadata information for programs. -#![no_std] - pub mod entrypoint; pub mod error; pub mod instruction; diff --git a/program/src/processor/extend.rs b/program/src/processor/extend.rs index 32277ed..20fa3fa 100644 --- a/program/src/processor/extend.rs +++ b/program/src/processor/extend.rs @@ -7,6 +7,7 @@ use super::{validate_authority, validate_metadata}; /// Processor for the [`Extend`](`crate::instruction::ProgramMetadataInstruction::Extend`) /// instruction. +#[allow(clippy::arithmetic_side_effects)] pub fn extend(accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramResult { // Validates the instruction data. diff --git a/program/src/processor/initialize.rs b/program/src/processor/initialize.rs index 4e324d0..2aad5d4 100644 --- a/program/src/processor/initialize.rs +++ b/program/src/processor/initialize.rs @@ -19,6 +19,7 @@ use super::is_program_authority; /// Processor for the [`Initialize`](`crate::instruction::ProgramMetadataInstruction::Initialize`) /// instruction. +#[allow(clippy::arithmetic_side_effects)] pub fn initialize(accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramResult { // Validates the instruction data. @@ -92,6 +93,8 @@ pub fn initialize(accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramR if !remaining_data.is_empty() { return Err(ProgramError::InvalidAccountData); } + // A pre-allocated buffer length is at least the size of the + // `Header`. metadata.data_len() - Header::LEN } Some(AccountDiscriminator::Metadata) => { @@ -124,6 +127,7 @@ pub fn initialize(accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramR Allocate { account: metadata, + // Instruction data is limited to 1232 bytes. space: (Header::LEN + remaining_data.len()) as u64, } .invoke_signed(signer)?; diff --git a/program/src/processor/mod.rs b/program/src/processor/mod.rs index cb4e197..24b59cd 100644 --- a/program/src/processor/mod.rs +++ b/program/src/processor/mod.rs @@ -16,7 +16,7 @@ pub mod set_immutable; pub mod trim; pub mod write; -/// The program ID of the BPF Loader v3. +/// The program ID of the SVM Loader `v3`. const BPF_LOADER_UPGRABABLE_ID: Pubkey = [ 2, 168, 246, 145, 78, 136, 161, 176, 226, 16, 21, 62, 247, 99, 174, 43, 0, 194, 185, 61, 22, 193, 36, 210, 192, 83, 122, 16, 4, 128, 0, 0, @@ -29,21 +29,22 @@ const BPF_LOADER_UPGRABABLE_ID: Pubkey = [ /// /// - `program` account must be executable. /// -/// - When a program is owned by BPF Loader v2, program must match the authority; +/// - When a program is owned by SVM Loader `v2`, program must match the authority; /// otherwise, the `program_data` account must be provided. /// -/// For BPF Loader v2 programs: +/// For SVM Loader `v2` programs: /// -/// - `program` account discriminator (first byte) must be `2` — i.e. defining a +/// - `program` account discriminator (first byte) must be `2`, i.e., defining a /// `Program` account. /// /// - `program_data` account must be the one set on the `program` account data. /// -/// - `program_data` account discriminator (first byte) must be `3` — i.e. defining +/// - `program_data` account discriminator (first byte) must be `3`, i.e., defining /// a `ProgramData` account. /// /// - `program_data` account must have 32 bytes of data in the range `[13..45]`, /// matching the provided `authority`. +#[allow(clippy::arithmetic_side_effects)] #[inline(always)] fn is_program_authority( program: &AccountInfo, @@ -90,8 +91,10 @@ fn is_program_authority( let option_offset: usize = 4 /* discriminator */ + 8 /* slot */; if data[option_offset] == 1 { let pubkey_offset: usize = option_offset + 1 /* option */; - let authority_key = Pubkey::try_from(&data[pubkey_offset..pubkey_offset + 32]) - .map_err(|_| ProgramError::InvalidAccountData)?; + // The `authority_key` is a `Pubkey`. + let authority_key = + Pubkey::try_from(&data[pubkey_offset..pubkey_offset + PUBKEY_BYTES]) + .map_err(|_| ProgramError::InvalidAccountData)?; authority == &authority_key } else { false diff --git a/program/src/processor/set_data.rs b/program/src/processor/set_data.rs index f5eaab4..ed4dd61 100644 --- a/program/src/processor/set_data.rs +++ b/program/src/processor/set_data.rs @@ -10,6 +10,7 @@ use super::{validate_authority, validate_metadata}; /// Processor for the [`SetData`](`crate::instruction::ProgramMetadataInstruction::SetData`) /// instruction. +#[allow(clippy::arithmetic_side_effects)] pub fn set_data(accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramResult { // Validates the instruction data. @@ -77,6 +78,9 @@ pub fn set_data(accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramRes if let Some(data) = update_header(metadata, args, data)? { // Realloc the metadata account if necessary. + // + // The realloc validates that the new size does not exceed the + // maximum size of an account. metadata.realloc(Header::LEN + data.len(), false)?; // SAFETY: There are no other active borrows to the `metadata` diff --git a/program/src/processor/trim.rs b/program/src/processor/trim.rs index 70b85d0..f835bdc 100644 --- a/program/src/processor/trim.rs +++ b/program/src/processor/trim.rs @@ -8,6 +8,7 @@ use super::{validate_authority, validate_metadata}; /// Processor for the [`Trim`](`crate::instruction::ProgramMetadataInstruction::Trim`) /// instruction. +#[allow(clippy::arithmetic_side_effects)] pub fn trim(accounts: &[AccountInfo]) -> ProgramResult { // Access accounts. diff --git a/program/src/processor/write.rs b/program/src/processor/write.rs index 82fd862..b216e5d 100644 --- a/program/src/processor/write.rs +++ b/program/src/processor/write.rs @@ -8,10 +8,12 @@ use crate::state::{buffer::Buffer, header::Header, AccountDiscriminator}; /// Processor for the [`Write`](`crate::instruction::ProgramMetadataInstruction::Write`) /// instruction. +#[allow(clippy::arithmetic_side_effects)] pub fn write(accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramResult { // Validates the instruction data. let args = Write::try_from_bytes(instruction_data)?; + // The `offset` value is guaranteed to fit in a `usize`. let offset = args.offset() as usize + Buffer::LEN; // Access accounts. @@ -72,6 +74,7 @@ pub fn write(accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramResult _ => return Err(ProgramError::InvalidInstructionData), }; + // The length of the data to write is validated by the `realloc`. (max(data.len(), offset + source_data.len()), source_data) }; diff --git a/program/src/state/buffer.rs b/program/src/state/buffer.rs index 1db7205..6efcfd6 100644 --- a/program/src/state/buffer.rs +++ b/program/src/state/buffer.rs @@ -84,7 +84,7 @@ impl Buffer { /// /// # Safety /// - /// The caller must ensure that it is safe to borrow the account data – e.g., there are + /// The caller must ensure that it is safe to borrow the account data, e.g., there are /// no mutable borrows of the account data. #[inline] pub unsafe fn from_account_info_unchecked( diff --git a/program/src/state/data.rs b/program/src/state/data.rs index 56c2015..3c01c6b 100644 --- a/program/src/state/data.rs +++ b/program/src/state/data.rs @@ -4,7 +4,7 @@ use super::{DataSource, ZeroableOption}; /// Metadata account data. pub enum Data<'a> { - /// Represents the case where the metadata is inlined data. + /// Represents the case where the metadata is stored on the account. Direct(DirectData<'a>), /// Represents the case where the metadata is a URL. @@ -37,9 +37,9 @@ impl<'a> Data<'a> { } } -/// Type to represent inlined data. +/// Type to represent inline data. /// -/// Inlined data is stored directly in the account. +/// Inline data is stored directly in the account. pub struct DirectData<'a>(pub &'a [u8]); /// Type to represent URL data. diff --git a/program/src/state/header.rs b/program/src/state/header.rs index 98710d0..4da50e8 100644 --- a/program/src/state/header.rs +++ b/program/src/state/header.rs @@ -121,7 +121,7 @@ impl Header { /// /// # Safety /// - /// The caller must ensure that it is safe to borrow the account data – e.g., there are + /// The caller must ensure that it is safe to borrow the account data, e.g., there are /// no mutable borrows of the account data. #[inline] pub unsafe fn from_account_info_unchecked( diff --git a/program/tests/allocate.rs b/program/tests/allocate.rs index 71deb1e..e11ade6 100644 --- a/program/tests/allocate.rs +++ b/program/tests/allocate.rs @@ -1,10 +1,11 @@ -#![cfg(feature = "test-sbf")] - mod setup; pub use setup::*; use mollusk_svm::{program::keyed_account_for_system_program, result::Check}; -use solana_sdk::{account::Account, program_error::ProgramError, pubkey::Pubkey, system_program}; +use solana_account::Account; +use solana_program_error::ProgramError; +use solana_pubkey::Pubkey; +use solana_sdk_ids::system_program; use spl_program_metadata::state::{buffer::Buffer, SEED_LEN}; #[test] diff --git a/program/tests/extend.rs b/program/tests/extend.rs index 2d13bb7..b8ca853 100644 --- a/program/tests/extend.rs +++ b/program/tests/extend.rs @@ -1,10 +1,10 @@ -#![cfg(feature = "test-sbf")] - mod setup; pub use setup::*; use mollusk_svm::{program::keyed_account_for_system_program, result::Check}; -use solana_sdk::{account::Account, pubkey::Pubkey, system_program}; +use solana_account::Account; +use solana_pubkey::Pubkey; +use solana_sdk_ids::system_program; use spl_program_metadata::state::{buffer::Buffer, SEED_LEN}; const EXTEND_LENGTH: usize = 200; diff --git a/program/tests/initialize.rs b/program/tests/initialize.rs index 004f609..fb239f4 100644 --- a/program/tests/initialize.rs +++ b/program/tests/initialize.rs @@ -1,10 +1,10 @@ -#![cfg(feature = "test-sbf")] - mod setup; pub use setup::*; use mollusk_svm::{program::keyed_account_for_system_program, result::Check}; -use solana_sdk::{account::Account, pubkey::Pubkey, system_program}; +use solana_account::Account; +use solana_pubkey::Pubkey; +use solana_sdk_ids::system_program; use spl_program_metadata::state::header::Header; #[test] diff --git a/program/tests/setup/allocate.rs b/program/tests/setup/allocate.rs index db5f3e4..f6b5dbc 100644 --- a/program/tests/setup/allocate.rs +++ b/program/tests/setup/allocate.rs @@ -1,9 +1,7 @@ -use solana_sdk::{ - instruction::{AccountMeta, Instruction}, - program_error::ProgramError, - pubkey::Pubkey, - system_program, -}; +use solana_instruction::{AccountMeta, Instruction}; +use solana_program_error::ProgramError; +use solana_pubkey::Pubkey; +use solana_sdk_ids::system_program; use spl_program_metadata::{instruction::ProgramMetadataInstruction, state::SEED_LEN}; use super::PROGRAM_ID; diff --git a/program/tests/setup/extend.rs b/program/tests/setup/extend.rs index 8b78c40..4a79af0 100644 --- a/program/tests/setup/extend.rs +++ b/program/tests/setup/extend.rs @@ -1,8 +1,6 @@ -use solana_sdk::{ - instruction::{AccountMeta, Instruction}, - program_error::ProgramError, - pubkey::Pubkey, -}; +use solana_instruction::{AccountMeta, Instruction}; +use solana_program_error::ProgramError; +use solana_pubkey::Pubkey; use spl_program_metadata::instruction::ProgramMetadataInstruction; use super::PROGRAM_ID; diff --git a/program/tests/setup/initialize.rs b/program/tests/setup/initialize.rs index 0fdf68d..b7a4ac6 100644 --- a/program/tests/setup/initialize.rs +++ b/program/tests/setup/initialize.rs @@ -1,9 +1,7 @@ -use solana_sdk::{ - instruction::{AccountMeta, Instruction}, - program_error::ProgramError, - pubkey::Pubkey, - system_program, -}; +use solana_instruction::{AccountMeta, Instruction}; +use solana_program_error::ProgramError; +use solana_pubkey::Pubkey; +use solana_sdk_ids::system_program; use super::PROGRAM_ID; diff --git a/program/tests/setup/mod.rs b/program/tests/setup/mod.rs index 3a775ba..4ee4e49 100644 --- a/program/tests/setup/mod.rs +++ b/program/tests/setup/mod.rs @@ -11,13 +11,11 @@ pub use trim::*; pub use write::*; use mollusk_svm::{result::Check, Mollusk}; -use solana_sdk::{ - account::{create_account_for_test, Account}, - bpf_loader_upgradeable, - instruction::Instruction, - pubkey::Pubkey, - rent::Rent, -}; +use solana_account::{create_account_for_test, Account}; +use solana_instruction::Instruction; +use solana_pubkey::Pubkey; +use solana_rent::Rent; +use solana_sdk_ids::bpf_loader_upgradeable; pub const PROGRAM_ID: Pubkey = Pubkey::new_from_array(spl_program_metadata::ID); @@ -52,7 +50,9 @@ pub fn create_funded_account(lamports: u64, owner: Pubkey) -> Account { } } +#[allow(clippy::arithmetic_side_effects)] pub fn lamports_for(bytes: usize) -> u64 { + // `bytes` is guaranteed at least 0. Rent::default().minimum_balance(bytes) - Rent::default().minimum_balance(0) } diff --git a/program/tests/setup/trim.rs b/program/tests/setup/trim.rs index 4deaeae..5d0a91f 100644 --- a/program/tests/setup/trim.rs +++ b/program/tests/setup/trim.rs @@ -1,9 +1,7 @@ -use solana_sdk::{ - instruction::{AccountMeta, Instruction}, - program_error::ProgramError, - pubkey::Pubkey, - sysvar::rent::ID as RENT_ID, -}; +use solana_instruction::{AccountMeta, Instruction}; +use solana_program_error::ProgramError; +use solana_pubkey::Pubkey; +use solana_sdk_ids::sysvar::rent; use spl_program_metadata::instruction::ProgramMetadataInstruction; use super::PROGRAM_ID; @@ -21,7 +19,7 @@ pub fn trim( AccountMeta::new_readonly(*program.unwrap_or(&PROGRAM_ID), false), AccountMeta::new_readonly(*program_data.unwrap_or(&PROGRAM_ID), false), AccountMeta::new(*destination, false), - AccountMeta::new_readonly(RENT_ID, false), + AccountMeta::new_readonly(rent::ID, false), ]; Ok(Instruction { diff --git a/program/tests/setup/write.rs b/program/tests/setup/write.rs index dead628..04a5a90 100644 --- a/program/tests/setup/write.rs +++ b/program/tests/setup/write.rs @@ -1,8 +1,6 @@ -use solana_sdk::{ - instruction::{AccountMeta, Instruction}, - program_error::ProgramError, - pubkey::Pubkey, -}; +use solana_instruction::{AccountMeta, Instruction}; +use solana_program_error::ProgramError; +use solana_pubkey::Pubkey; use spl_program_metadata::instruction::ProgramMetadataInstruction; use super::PROGRAM_ID; diff --git a/program/tests/trim.rs b/program/tests/trim.rs index bb7c8ec..b0bac0d 100644 --- a/program/tests/trim.rs +++ b/program/tests/trim.rs @@ -1,10 +1,10 @@ -#![cfg(feature = "test-sbf")] - mod setup; pub use setup::*; use mollusk_svm::{program::keyed_account_for_system_program, result::Check}; -use solana_sdk::{account::Account, pubkey::Pubkey, system_program, sysvar}; +use solana_account::Account; +use solana_pubkey::Pubkey; +use solana_sdk_ids::system_program; use spl_program_metadata::state::{buffer::Buffer, header::Header}; const EXCESS_LAMPORTS: usize = 90; @@ -99,7 +99,7 @@ fn test_trim_canonical() { (program_data_key, program_data_account), (destination_key, Account::default()), keyed_account_for_system_program(), - (sysvar::rent::ID, rent_sysvar()), + (solana_rent::sysvar::ID, rent_sysvar()), ], ); } @@ -196,7 +196,7 @@ fn test_trim_non_canonical() { (program_data_key, program_data_account), (destination_key, Account::default()), keyed_account_for_system_program(), - (sysvar::rent::ID, rent_sysvar()), + (solana_rent::sysvar::ID, rent_sysvar()), ], ); } @@ -252,7 +252,7 @@ fn test_trim_buffer() { (PROGRAM_ID, Account::default()), (destination_key, Account::default()), keyed_account_for_system_program(), - (sysvar::rent::ID, rent_sysvar()), + (solana_rent::sysvar::ID, rent_sysvar()), ], ); } diff --git a/scripts/client/publish-rust.mjs b/scripts/client/publish-rust.mjs deleted file mode 100644 index b7a9fa6..0000000 --- a/scripts/client/publish-rust.mjs +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env zx -import 'zx/globals'; -import { cliArguments, getCargo, workingDirectory } from '../utils.mjs'; - -const dryRun = argv['dry-run'] ?? false; -const [level] = cliArguments(); -if (!level) { - throw new Error('A version level — e.g. "path" — must be provided.'); -} - -// Go to the client directory and install the dependencies. -cd(path.join(workingDirectory, 'clients', 'rust')); - -// Publish the new version. -const releaseArgs = dryRun - ? [] - : ['--no-push', '--no-tag', '--no-confirm', '--execute']; -await $`cargo release ${level} ${releaseArgs}`; - -// Stop here if this is a dry run. -if (dryRun) { - process.exit(0); -} - -// Get the new version. -const newVersion = getCargo(path.join('clients', 'rust')).package.version; - -// Expose the new version to CI if needed. -if (process.env.CI) { - await $`echo "new_version=${newVersion}" >> $GITHUB_OUTPUT`; -} - -// Soft reset the last commit so we can create our own commit and tag. -await $`git reset --soft HEAD~1`; - -// Commit the new version. -await $`git commit -am "Publish Rust client v${newVersion}"`; - -// Tag the new version. -await $`git tag -a rust@v${newVersion} -m "Rust client v${newVersion}"`; diff --git a/scripts/client/test-rust.mjs b/scripts/client/test-rust.mjs deleted file mode 100644 index 699acb1..0000000 --- a/scripts/client/test-rust.mjs +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env zx -import 'zx/globals'; -import { cliArguments, workingDirectory } from '../utils.mjs'; - -// Configure additional arguments here, e.g.: -// ['--arg1', '--arg2', ...cliArguments()] -const testArgs = cliArguments(); - -const hasSolfmt = await which('solfmt', { nothrow: true }); -const sbfOutDir = path.join(workingDirectory, 'target', 'deploy'); - -// Run the tests. -cd(path.join(workingDirectory, 'clients', 'rust')); -if (hasSolfmt) { - await $`SBF_OUT_DIR=${sbfOutDir} cargo test --features "test-sbf" ${testArgs} 2>&1 | solfmt`; -} else { - await $`SBF_OUT_DIR=${sbfOutDir} cargo test --features "test-sbf" ${testArgs}`; -} diff --git a/scripts/client/format-js.mjs b/scripts/js/format.mjs similarity index 100% rename from scripts/client/format-js.mjs rename to scripts/js/format.mjs diff --git a/scripts/client/lint-js.mjs b/scripts/js/lint.mjs similarity index 100% rename from scripts/client/lint-js.mjs rename to scripts/js/lint.mjs diff --git a/scripts/client/publish-js.mjs b/scripts/js/publish.mjs similarity index 100% rename from scripts/client/publish-js.mjs rename to scripts/js/publish.mjs diff --git a/scripts/client/test-js.mjs b/scripts/js/test.mjs similarity index 100% rename from scripts/client/test-js.mjs rename to scripts/js/test.mjs diff --git a/scripts/program/build.mjs b/scripts/program/build.mjs deleted file mode 100644 index 3a743d6..0000000 --- a/scripts/program/build.mjs +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env zx -import 'zx/globals'; -import { - cliArguments, - getProgramFolders, - workingDirectory, -} from '../utils.mjs'; - -// Save external programs binaries to the output directory. -import './dump.mjs'; - -// Configure additional arguments here, e.g.: -// ['--arg1', '--arg2', ...cliArguments()] -const buildArgs = cliArguments(); - -// Build the programs. -for (const folder of getProgramFolders()) { - const manifestPath = path.join(workingDirectory, folder, 'Cargo.toml'); - - await $`cargo-build-sbf --manifest-path ${manifestPath} ${buildArgs}`; -} diff --git a/scripts/program/clean.mjs b/scripts/program/clean.mjs deleted file mode 100644 index b761a37..0000000 --- a/scripts/program/clean.mjs +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env zx -import 'zx/globals'; -import { getExternalProgramOutputDir } from '../utils.mjs'; - -// Remove the programs output directories. -const externalProgramOutput = getExternalProgramOutputDir(); -await $`rm -rf ${externalProgramOutput}`; - -// Remove the target directory. -await $`rm -rf target`; diff --git a/scripts/program/dump.mjs b/scripts/program/dump.mjs deleted file mode 100644 index 7e7db12..0000000 --- a/scripts/program/dump.mjs +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env zx -import 'zx/globals'; -import { - getExternalAccountAddresses, - getExternalProgramAddresses, - getExternalProgramOutputDir, -} from '../utils.mjs'; - -// Get input from environment variables. -const rpc = process.env.RPC ?? 'https://api.mainnet-beta.solana.com'; -const outputDir = getExternalProgramOutputDir(); -await dump(); - -/** Dump external programs binaries and accounts if needed. */ -async function dump() { - // Ensure we have some external accounts to dump. - const programs = getExternalProgramAddresses(); - const accounts = getExternalAccountAddresses(); - const external = [ - ...programs.map((program) => [program, 'so']), - ...accounts.map((account) => [account, 'json']), - ]; - - if (external.length === 0) return; - echo(`Dumping external accounts to '${outputDir}':`); - - // Create the output directory if needed. - $`mkdir -p ${outputDir}`.quiet(); - - // Copy the binaries from the chain or warn if they are different. - await Promise.all( - external.map(async ([address, extension]) => { - const binary = `${address}.${extension}`; - const hasBinary = await fs.exists(`${outputDir}/${binary}`); - - if (!hasBinary) { - await copyFromChain(address, extension); - echo(`Wrote account data to ${outputDir}/${binary}`); - return; - } - - let sha = 'sha256sum'; - let options = []; - let hasShaChecksum = await which('sha256sum', { nothrow: true }); - - // We might not have sha256sum on some systems, so we try shasum as well. - if (!hasShaChecksum) { - hasShaChecksum = await which('shasum', { nothrow: true }); - - if (hasShaChecksum) { - sha = 'shasum'; - options = ['-a', '256']; - } - } - - if (hasShaChecksum) { - try { - await copyFromChain(address, extension, 'onchain-'); - const [onChainHash, localHash] = await Promise.all([ - $`${sha} ${options} -b ${outputDir}/onchain-${binary} | cut -d ' ' -f 1`.quiet(), - $`${sha} ${options} -b ${outputDir}/${binary} | cut -d ' ' -f 1`.quiet(), - ]); - - if (onChainHash.toString() !== localHash.toString()) { - echo( - chalk.yellow('[ WARNING ]'), - `on-chain and local binaries are different for '${address}'` - ); - } else { - echo( - chalk.green('[ SKIPPED ]'), - `on-chain and local binaries are the same for '${address}'` - ); - } - - await $`rm ${outputDir}/onchain-${binary}`.quiet(); - } catch (error) { - echo( - chalk.yellow('[ WARNING ]'), - `skipped check for '${address}' (error copying data from '${rpc}')` - ); - } - } else { - echo( - chalk.yellow('[ WARNING ]'), - `skipped check for '${address}' (missing 'sha256sum' command)` - ); - } - }) - ); -} - -/** Helper function to copy external programs or accounts binaries from the chain. */ -async function copyFromChain(address, extension, prefix = '') { - const binary = `${prefix}${address}.${extension}`; - switch (extension) { - case 'json': - return $`solana account -u ${rpc} ${address} -o ${outputDir}/${binary} --output json >/dev/null`.quiet(); - case 'so': - return $`solana program dump -u ${rpc} ${address} ${outputDir}/${binary} >/dev/null`.quiet(); - default: - echo(chalk.red(`[ ERROR ] unknown account type for '${binary}'`)); - await $`exit 1`; - } -} diff --git a/scripts/program/format.mjs b/scripts/program/format.mjs deleted file mode 100644 index c73ddd4..0000000 --- a/scripts/program/format.mjs +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env zx -import 'zx/globals'; -import { - cliArguments, - getProgramFolders, - getToolchainArgument, - partitionArguments, - popArgument, - workingDirectory, -} from '../utils.mjs'; - -// Configure additional arguments here, e.g.: -// ['--arg1', '--arg2', ...cliArguments()] -const formatArgs = cliArguments(); - -const fix = popArgument(formatArgs, '--fix'); -const [cargoArgs, fmtArgs] = partitionArguments(formatArgs, '--'); -const toolchain = getToolchainArgument('format'); - -// Format the programs. -for (const folder of getProgramFolders()) { - const manifestPath = path.join(workingDirectory, folder, 'Cargo.toml'); - - if (fix) { - await $`cargo ${toolchain} fmt --manifest-path ${manifestPath} ${cargoArgs} -- ${fmtArgs}`; - } else { - await $`cargo ${toolchain} fmt --manifest-path ${manifestPath} ${cargoArgs} -- --check ${fmtArgs}`; - } -} diff --git a/scripts/program/lint.mjs b/scripts/program/lint.mjs deleted file mode 100644 index 94d53d4..0000000 --- a/scripts/program/lint.mjs +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env zx -import 'zx/globals'; -import { - cliArguments, - getProgramFolders, - getToolchainArgument, - popArgument, - workingDirectory, -} from '../utils.mjs'; - -// Configure additional arguments here, e.g.: -// ['--arg1', '--arg2', ...cliArguments()] -const lintArgs = cliArguments(); - -const fix = popArgument(lintArgs, '--fix'); -const toolchain = getToolchainArgument('lint'); - -// Lint the programs using clippy. -for (const folder of getProgramFolders()) { - const manifestPath = path.join(workingDirectory, folder, 'Cargo.toml'); - - if (fix) { - await $`cargo ${toolchain} clippy --manifest-path ${manifestPath} --fix ${lintArgs}`; - } else { - await $`cargo ${toolchain} clippy --manifest-path ${manifestPath} ${lintArgs}`; - } -} diff --git a/scripts/program/test.mjs b/scripts/program/test.mjs deleted file mode 100644 index 01385b1..0000000 --- a/scripts/program/test.mjs +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env zx -import 'zx/globals'; -import { - cliArguments, - getProgramFolders, - workingDirectory, -} from '../utils.mjs'; - -// Save external programs binaries to the output directory. -import './dump.mjs'; - -// Configure additional arguments here, e.g.: -// ['--arg1', '--arg2', ...cliArguments()] -const testArgs = cliArguments(); - -const hasSolfmt = await which('solfmt', { nothrow: true }); - -// Test the programs. -for (const folder of getProgramFolders()) { - const manifestPath = path.join(workingDirectory, folder, 'Cargo.toml'); - - if (hasSolfmt) { - await $`cargo test-sbf --manifest-path ${manifestPath} ${testArgs} 2>&1 | solfmt`; - } else { - await $`cargo test-sbf --manifest-path ${manifestPath} ${testArgs}`; - } -} diff --git a/scripts/rust/audit.mjs b/scripts/rust/audit.mjs new file mode 100644 index 0000000..43bd2cf --- /dev/null +++ b/scripts/rust/audit.mjs @@ -0,0 +1,31 @@ +#!/usr/bin/env zx +import 'zx/globals'; + +const advisories = [ + // ed25519-dalek: Double Public Key Signing Function Oracle Attack + // + // Remove once repo upgrades to ed25519-dalek v2 + 'RUSTSEC-2022-0093', + + // curve25519-dalek + // + // Remove once repo upgrades to curve25519-dalek v4 + 'RUSTSEC-2024-0344', + + // Crate: tonic + // Version: 0.9.2 + // Title: Remotely exploitable Denial of Service in Tonic + // Date: 2024-10-01 + // ID: RUSTSEC-2024-0376 + // URL: https://rustsec.org/advisories/RUSTSEC-2024-0376 + // Solution: Upgrade to >=0.12.3 + 'RUSTSEC-2024-0376', +]; +const ignores = [] +advisories.forEach(x => { + ignores.push('--ignore'); + ignores.push(x); +}); + +// Check Solana version. +await $`cargo audit ${ignores}`; diff --git a/scripts/rust/build-sbf.mjs b/scripts/rust/build-sbf.mjs new file mode 100644 index 0000000..cb2cbda --- /dev/null +++ b/scripts/rust/build-sbf.mjs @@ -0,0 +1,8 @@ +#!/usr/bin/env zx +import 'zx/globals'; +import { cliArguments, workingDirectory } from '../utils.mjs'; + +const [folder, ...args] = cliArguments(); +const manifestPath = path.join(workingDirectory, folder, 'Cargo.toml'); +await $`cargo-build-sbf --manifest-path ${manifestPath} ${args}`; + diff --git a/scripts/client/format-rust.mjs b/scripts/rust/format.mjs similarity index 72% rename from scripts/client/format-rust.mjs rename to scripts/rust/format.mjs index 038a832..de9518e 100644 --- a/scripts/client/format-rust.mjs +++ b/scripts/rust/format.mjs @@ -8,19 +8,13 @@ import { workingDirectory, } from '../utils.mjs'; -// Configure additional arguments here, e.g.: -// ['--arg1', '--arg2', ...cliArguments()] -const formatArgs = cliArguments(); +const [folder, ...formatArgs] = cliArguments(); const fix = popArgument(formatArgs, '--fix'); const [cargoArgs, fmtArgs] = partitionArguments(formatArgs, '--'); const toolchain = getToolchainArgument('format'); -const manifestPath = path.join( - workingDirectory, - 'clients', - 'rust', - 'Cargo.toml' -); + +const manifestPath = path.join(workingDirectory, folder, 'Cargo.toml'); // Format the client. if (fix) { diff --git a/scripts/client/lint-rust.mjs b/scripts/rust/lint.mjs similarity index 65% rename from scripts/client/lint-rust.mjs rename to scripts/rust/lint.mjs index 0b4a4e6..ef4e232 100644 --- a/scripts/client/lint-rust.mjs +++ b/scripts/rust/lint.mjs @@ -7,18 +7,24 @@ import { workingDirectory, } from '../utils.mjs'; +const [folder, ...args] = cliArguments(); + // Configure additional arguments here, e.g.: // ['--arg1', '--arg2', ...cliArguments()] -const lintArgs = cliArguments(); +const lintArgs = [ + '-Zunstable-options', + '--all-targets', + '--all-features', + '--no-deps', + '--', + '--deny=warnings', + '--deny=clippy::arithmetic_side_effects', + ...args, +]; const fix = popArgument(lintArgs, '--fix'); const toolchain = getToolchainArgument('lint'); -const manifestPath = path.join( - workingDirectory, - 'clients', - 'rust', - 'Cargo.toml' -); +const manifestPath = path.join(workingDirectory, folder, 'Cargo.toml'); // Check the client using Clippy. if (fix) { diff --git a/scripts/rust/publish.mjs b/scripts/rust/publish.mjs new file mode 100644 index 0000000..28bd91b --- /dev/null +++ b/scripts/rust/publish.mjs @@ -0,0 +1,41 @@ +#!/usr/bin/env zx +import 'zx/globals'; +import { cliArguments, getCargo, workingDirectory } from '../utils.mjs'; + +const dryRun = argv['dry-run'] ?? false; +const [folder, level] = cliArguments(); +if (!folder) { + throw new Error('A path to a directory with a Rust package — e.g. "clients/cli" — must be provided.'); +} +if (!level) { + throw new Error('A version level — e.g. "patch" — must be provided.'); +} + +cd(path.join(workingDirectory, folder)); + +const packageToml = getCargo(folder).package; +const oldVersion = packageToml.version; +const packageName = packageToml.name; +const tagName = path.basename(folder); + +// Publish the new version, commit the repo change, tag it, and push it all. +const releaseArgs = dryRun + ? [] + : ['--tag-name', `${tagName}@v{{version}}`, '--no-confirm', '--execute']; +await $`cargo release ${level} ${releaseArgs}`; + +// Stop here if this is a dry run. +if (dryRun) { + process.exit(0); +} + +// Get the new version. +const newVersion = getCargo(folder).package.version; +const newGitTag = `${tagName}@v${newVersion}`; +const oldGitTag = `${tagName}@v${oldVersion}`; + +// Expose the new version to CI if needed. +if (process.env.CI) { + await $`echo "new_git_tag=${newGitTag}" >> $GITHUB_OUTPUT`; + await $`echo "old_git_tag=${oldGitTag}" >> $GITHUB_OUTPUT`; +} diff --git a/scripts/rust/test.mjs b/scripts/rust/test.mjs new file mode 100644 index 0000000..19da099 --- /dev/null +++ b/scripts/rust/test.mjs @@ -0,0 +1,8 @@ +#!/usr/bin/env zx +import 'zx/globals'; +import { cliArguments, workingDirectory } from '../utils.mjs'; + +const [folder, ...args] = cliArguments(); +const sbfOutDir = path.join(workingDirectory, 'target', 'deploy'); +const manifestPath = path.join(workingDirectory, folder, 'Cargo.toml'); +await $`SBF_OUT_DIR=${sbfOutDir} cargo test --manifest-path ${manifestPath} ${args}`; diff --git a/scripts/solana.dic b/scripts/solana.dic new file mode 100644 index 0000000..7b7de38 --- /dev/null +++ b/scripts/solana.dic @@ -0,0 +1,53 @@ +1000 +config +metadata +json +uri +ui +cli +readme/S +arg/S +vec/S +enum/S +noop/S +realloc/S +overallocate/SGD +namespace +serde +deserialize/SRGD +deserialization +struct/S +param/S +tuple/S +metas +infos +async +subcommand +repo +init +solana +sol/S +blockchain/S +permissionless +composability +runtime +onchain +offchain +keypair/S +decrypt/SGD +lamport/S +validator/S +pubkey/S +sysvar/S +timestamp/S +entrypoint/S +spl +pda/S +multisignature/S +multisig/S +staker/S +APY +codama +autogenerated +sdk +svm diff --git a/scripts/spellcheck.toml b/scripts/spellcheck.toml new file mode 100644 index 0000000..67d80b0 --- /dev/null +++ b/scripts/spellcheck.toml @@ -0,0 +1,6 @@ +[Hunspell] +use_builtin = true +skip_os_lookups = false +search_dirs = ["."] +extra_dictionaries = ["solana.dic"] + diff --git a/scripts/upgrade-template.mjs b/scripts/upgrade-template.mjs new file mode 100644 index 0000000..b2acb7c --- /dev/null +++ b/scripts/upgrade-template.mjs @@ -0,0 +1,58 @@ +#!/usr/bin/env zx +import 'zx/globals'; +import { getCargo } from './utils.mjs'; + +// Arguments to pass to the `create-solana-program` command. +const rustClientCargo = getCargo(path.join('clients', 'rust')); +const jsClientPkg = require( + path.join(__dirname, '..', 'clients', 'js', 'package.json') +); +const templateArgs = [ + 'program-metadata', + '--address', + 'ProgM6JCCvbYkfKqJYHePx4xxSUSqJp7rh8Lyv7nk7S', + '--org', + 'solana-program', + '--rust-client-crate-name', + rustClientCargo.package.name, + '--js-client-package-name', + jsClientPkg.name, + '--default', + '--force', +]; + +// File and folder patterns that should not be overwritten by the template upgrade. +const unchangedGlobs = [ + 'clients/**/src/**', + 'clients/**/src/*', + 'clients/js/test/*', + 'clients/rust/tests/*', + 'program/**/*', + 'program/*', + 'scripts/generate-clients.mjs', + 'scripts/generate-idls.mjs', + 'scripts/upgrade-template.mjs', + 'scripts/program/*', + 'Cargo.lock', + '**/pnpm-lock.yaml', + 'pnpm-lock.yaml', +]; + +// Prevent CLI arguments from being escaped. +$.quote = (command) => command; + +// Re-generate the repo from the parent directory. +cd('..'); +await $`pnpm create solana-program@latest ${templateArgs}`; + +// Go back inside the updated repo. +cd('token'); + +// Restore files and folders that should not be overwritten. +await $`git add --all`; +for (const glob of unchangedGlobs) { + await $`git restore --worktree --staged "${glob}"`; +} + +// Re-install dependencies. +await $`pnpm install`; diff --git a/scripts/utils.mjs b/scripts/utils.mjs index 44ee564..aebe5d5 100644 --- a/scripts/utils.mjs +++ b/scripts/utils.mjs @@ -65,8 +65,11 @@ export function getProgramFolders() { } export function getAllProgramFolders() { - return getCargo().workspace.members.filter((member) => - (getCargo(member).lib?.['crate-type'] ?? []).includes('cdylib') + return getCargo().workspace.members.filter( + (member) => + (getCargo(member).lib?.['crate-type'] ?? []).includes('cdylib') && + // Exclude the pinocchio-token-program crate. + getCargo(member).package?.name !== 'pinocchio-token-program' ); }