diff --git a/Cargo.lock b/Cargo.lock index 3ce0cc34b..d46df8219 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -145,7 +145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -158,7 +158,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -197,7 +197,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -302,6 +302,21 @@ dependencies = [ "serde", ] +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "1.3.2" @@ -310,9 +325,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" dependencies = [ "serde", ] @@ -409,7 +424,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -487,7 +502,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -537,7 +552,7 @@ checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -794,7 +809,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -803,8 +818,18 @@ version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.10", + "darling_macro 0.20.10", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -818,7 +843,21 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.98", + "syn 2.0.111", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.111", ] [[package]] @@ -827,9 +866,20 @@ version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core", + "darling_core 0.20.10", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -870,7 +920,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -893,7 +943,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -956,7 +1006,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -1016,7 +1066,7 @@ checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -1268,7 +1318,7 @@ dependencies = [ "ff", "rand 0.8.5", "rand_core 0.6.4", - "rand_xorshift", + "rand_xorshift 0.3.0", "subtle", ] @@ -1536,7 +1586,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -1796,7 +1846,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -1845,7 +1895,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -1881,7 +1931,7 @@ version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -1898,7 +1948,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -2075,6 +2125,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proptest" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.9.4", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift 0.4.0", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "qstring" version = "0.7.2" @@ -2092,14 +2161,20 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" -version = "1.0.38" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -2184,6 +2259,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", +] + [[package]] name = "rand_xoshiro" version = "0.6.0" @@ -2219,7 +2303,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", ] [[package]] @@ -2345,7 +2429,7 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys", @@ -2389,6 +2473,18 @@ version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.19" @@ -2485,7 +2581,7 @@ checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -2538,10 +2634,10 @@ version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ - "darling", + "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -2566,7 +2662,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -2717,6 +2813,7 @@ dependencies = [ "solana-system-interface", "strum", "strum_macros", + "wincode", ] [[package]] @@ -2807,7 +2904,7 @@ dependencies = [ "solana-signer", "subtle", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -2825,7 +2922,7 @@ dependencies = [ "serde_derive", "serde_json", "solana-define-syscall", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -3011,7 +3108,7 @@ dependencies = [ "solana-pubkey", "solana-sdk-ids", "solana-system-interface", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -3071,7 +3168,7 @@ name = "solana-frozen-abi" version = "3.1.0" dependencies = [ "bincode", - "bitflags 2.8.0", + "bitflags 2.9.4", "boxcar", "bs58", "bv", @@ -3088,7 +3185,7 @@ dependencies = [ "serde_with", "sha2", "solana-frozen-abi-macro", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -3097,7 +3194,7 @@ version = "3.2.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -3156,6 +3253,7 @@ dependencies = [ "solana-frozen-abi-macro", "solana-hash", "solana-sanitize", + "wincode", ] [[package]] @@ -3210,7 +3308,7 @@ dependencies = [ name = "solana-instructions-sysvar" version = "3.0.0" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "qualifier_attr", "solana-account-info", "solana-address", @@ -3315,7 +3413,7 @@ version = "3.0.1" dependencies = [ "anyhow", "bincode", - "bitflags 2.8.0", + "bitflags 2.9.4", "blake3", "borsh", "itertools 0.12.1", @@ -3335,10 +3433,11 @@ dependencies = [ "solana-nonce", "solana-sanitize", "solana-sdk-ids", - "solana-short-vec", + "solana-short-vec 3.1.0", "solana-system-interface", "solana-transaction-error", "static_assertions", + "wincode", ] [[package]] @@ -3409,7 +3508,7 @@ version = "3.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", "toml", ] @@ -3418,7 +3517,7 @@ name = "solana-packet" version = "4.0.0" dependencies = [ "bincode", - "bitflags 2.8.0", + "bitflags 2.9.4", "cfg_eval", "serde", "serde_derive", @@ -3498,7 +3597,7 @@ dependencies = [ "solana-serde-varint", "solana-serialize-utils", "solana-sha256-hasher", - "solana-short-vec", + "solana-short-vec 3.1.0", "solana-slot-hashes", "solana-slot-history", "solana-stable-layout", @@ -3542,7 +3641,7 @@ version = "1.0.0" dependencies = [ "quote", "regex", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -3635,14 +3734,14 @@ dependencies = [ "solana-seed-phrase", "solana-serde", "solana-serde-varint", - "solana-short-vec", + "solana-short-vec 3.1.0", "solana-shred-version", "solana-signature", "solana-signer", "solana-time-utils", "solana-transaction", "solana-transaction-error", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -3659,7 +3758,7 @@ dependencies = [ "bs58", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -3732,7 +3831,7 @@ dependencies = [ "solana-frozen-abi", "solana-frozen-abi-macro", "solana-program", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -3778,7 +3877,7 @@ dependencies = [ "rand 0.9.2", "serde", "serde_derive", - "solana-short-vec", + "solana-short-vec 3.1.0", ] [[package]] @@ -3816,6 +3915,15 @@ dependencies = [ "solana-frozen-abi-macro", ] +[[package]] +name = "solana-short-vec" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79fb1809a32cfcf7d9c47b7070a92fa17cdb620ab5829e9a8a9ff9d138a7a175" +dependencies = [ + "serde_core", +] + [[package]] name = "solana-shred-version" version = "3.0.0" @@ -3845,8 +3953,9 @@ dependencies = [ "solana-frozen-abi-macro", "solana-pubkey", "solana-sanitize", - "solana-short-vec", + "solana-short-vec 3.1.0", "solana-signature", + "wincode", ] [[package]] @@ -3867,7 +3976,7 @@ dependencies = [ "num-derive", "num-traits", "rand 0.9.2", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -4013,6 +4122,7 @@ dependencies = [ "anyhow", "bincode", "borsh", + "proptest", "serde", "serde_derive", "solana-address", @@ -4031,7 +4141,7 @@ dependencies = [ "solana-sanitize", "solana-sdk-ids", "solana-sha256-hasher", - "solana-short-vec", + "solana-short-vec 3.1.0", "solana-signature", "solana-signer", "solana-system-interface", @@ -4039,6 +4149,7 @@ dependencies = [ "solana-transaction-error", "solana-vote-interface", "static_assertions", + "wincode", ] [[package]] @@ -4083,7 +4194,7 @@ dependencies = [ "solana-sdk-ids", "solana-serde-varint", "solana-serialize-utils", - "solana-short-vec", + "solana-short-vec 3.1.0", "solana-system-interface", "solana-vote-interface", ] @@ -4154,9 +4265,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -4177,7 +4288,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -4238,7 +4349,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -4249,7 +4360,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", "test-case-core", ] @@ -4264,11 +4375,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -4279,18 +4390,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -4470,6 +4581,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-ident" version = "1.0.16" @@ -4542,6 +4659,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -4598,7 +4724,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", "wasm-bindgen-shared", ] @@ -4633,7 +4759,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4682,6 +4808,31 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "wincode" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f3b138135dd5aff3f86354f80737426b3ae2283270ab5aa0f8cbc800482650" +dependencies = [ + "proc-macro2", + "quote", + "solana-short-vec 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.17", + "wincode-derive", +] + +[[package]] +name = "wincode-derive" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f691c8531d0cbf1bc097c6e7e8651c4ac6a29e41b80f523b8b774d93cbbf491e" +dependencies = [ + "darling 0.21.3", + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -4896,7 +5047,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", "synstructure", ] @@ -4918,7 +5069,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -4938,7 +5089,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", "synstructure", ] @@ -4959,7 +5110,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -4981,5 +5132,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] diff --git a/Cargo.toml b/Cargo.toml index 00726695d..c3219d9fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -195,11 +195,11 @@ openssl = "0.10.72" pairing = "0.23.0" parking_lot = "0.12" pbkdf2 = { version = "0.11.0", default-features = false } -proc-macro2 = "1.0.93" +proc-macro2 = "1.0.101" proptest = "1.6" qstring = "0.7.2" qualifier_attr = { version = "0.2.2", default-features = false } -quote = "1.0.35" +quote = "1.0.41" rand = "0.9.2" rand_chacha = "0.9.0" rayon = "1.10.0" @@ -324,14 +324,15 @@ static_assertions = "1.1.0" strum = "0.24" strum_macros = "0.24" subtle = "2.6.1" -syn = "2.0.87" +syn = "2.0.106" tempfile = "3.20.0" test-case = "3.3.1" -thiserror = { version = "2.0.11", default-features = false } +thiserror = { version = "2.0.16", default-features = false } tiny-bip39 = "2.0.0" toml = "0.8.23" uriparse = "0.6.4" wasm-bindgen = "0.2.100" +wincode = { version = "0.2.2", features = ["derive"], default-features = false } [profile.release] split-debuginfo = "unpacked" diff --git a/address/Cargo.toml b/address/Cargo.toml index 041ce2f33..5a593f610 100644 --- a/address/Cargo.toml +++ b/address/Cargo.toml @@ -34,9 +34,10 @@ rand = ["dep:rand", "atomic", "std"] sanitize = ["dep:solana-sanitize"] serde = ["dep:serde", "dep:serde_derive"] sha2 = ["dep:solana-sha256-hasher", "error"] -std = ["decode", "borsh?/std", "serde?/std", "alloc"] -alloc = [] +std = ["decode", "borsh?/std", "serde?/std", "wincode?/std", "alloc"] +alloc = ["wincode?/alloc"] syscalls = ["dep:solana-define-syscall", "error"] +wincode = ["dep:wincode"] [dependencies] arbitrary = { workspace = true, features = ["derive"], optional = true } @@ -53,6 +54,7 @@ solana-frozen-abi = { workspace = true, features = ["frozen-abi"], optional = tr solana-frozen-abi-macro = { workspace = true, features = ["frozen-abi"], optional = true } solana-program-error = { workspace = true, optional = true } solana-sanitize = { workspace = true, optional = true } +wincode = { workspace = true, optional = true } [target.'cfg(any(target_os = "solana", target_arch = "bpf"))'.dependencies] solana-define-syscall = { workspace = true, optional = true } diff --git a/address/src/lib.rs b/address/src/lib.rs index 6d6e39aab..2a1f000cc 100644 --- a/address/src/lib.rs +++ b/address/src/lib.rs @@ -42,6 +42,8 @@ use core::{ }; #[cfg(feature = "serde")] use serde_derive::{Deserialize, Serialize}; +#[cfg(feature = "wincode")] +use wincode::{SchemaRead, SchemaWrite}; #[cfg(feature = "borsh")] use { alloc::string::ToString, @@ -89,6 +91,7 @@ pub const PDA_MARKER: &[u8; 21] = b"ProgramDerivedAddress"; #[cfg_attr(feature = "borsh", derive(BorshSchema))] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] #[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))] +#[cfg_attr(feature = "wincode", derive(SchemaWrite, SchemaRead))] #[cfg_attr(feature = "dev-context-only-utils", derive(Arbitrary))] #[cfg_attr(not(feature = "decode"), derive(Debug))] #[cfg_attr(feature = "copy", derive(Copy))] diff --git a/hash/Cargo.toml b/hash/Cargo.toml index 051fd6edc..c84989345 100644 --- a/hash/Cargo.toml +++ b/hash/Cargo.toml @@ -25,7 +25,8 @@ default = [] frozen-abi = ["dep:solana-frozen-abi", "dep:solana-frozen-abi-macro", "std"] sanitize = ["dep:solana-sanitize"] serde = ["dep:serde", "dep:serde_derive"] -std = ["borsh?/std", "serde?/std"] +std = ["borsh?/std", "serde?/std", "wincode?/std"] +wincode = ["dep:wincode"] [dependencies] borsh = { workspace = true, optional = true } @@ -38,6 +39,7 @@ solana-atomic-u64 = { workspace = true, optional = true } solana-frozen-abi = { workspace = true, optional = true, features = ["frozen-abi"] } solana-frozen-abi-macro = { workspace = true, optional = true, features = ["frozen-abi"] } solana-sanitize = { workspace = true, optional = true } +wincode = { workspace = true, optional = true } [dev-dependencies] bs58 = { workspace = true, default-features = false, features = ["alloc"] } diff --git a/hash/src/lib.rs b/hash/src/lib.rs index 8f2894d4e..f4da16d78 100644 --- a/hash/src/lib.rs +++ b/hash/src/lib.rs @@ -20,6 +20,8 @@ use solana_sanitize::Sanitize; extern crate alloc; #[cfg(feature = "borsh")] use alloc::string::ToString; +#[cfg(feature = "wincode")] +use wincode::{SchemaRead, SchemaWrite}; /// Size of a hash in bytes. pub const HASH_BYTES: usize = 32; @@ -42,6 +44,7 @@ pub const MAX_BASE58_LEN: usize = 44; #[cfg_attr(feature = "borsh", derive(BorshSchema))] #[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize,))] +#[cfg_attr(feature = "wincode", derive(SchemaWrite, SchemaRead))] #[cfg_attr(feature = "copy", derive(Copy))] #[cfg_attr(not(feature = "decode"), derive(Debug))] #[derive(Clone, Default, Eq, PartialEq, Ord, PartialOrd, Hash)] diff --git a/message/Cargo.toml b/message/Cargo.toml index c2173b49b..83ddd040b 100644 --- a/message/Cargo.toml +++ b/message/Cargo.toml @@ -35,6 +35,7 @@ serde = [ "solana-address/serde", "solana-hash/serde", ] +wincode = ["dep:wincode", "solana-hash/wincode", "solana-address/wincode"] [dependencies] bincode = { workspace = true, optional = true } @@ -51,6 +52,10 @@ solana-sanitize = { workspace = true } solana-sdk-ids = { workspace = true } solana-short-vec = { workspace = true, optional = true } solana-transaction-error = { workspace = true } +wincode = { workspace = true, optional = true, features = [ + "std", + "solana-short-vec", +] } [dev-dependencies] anyhow = { workspace = true } diff --git a/message/src/compiled_instruction.rs b/message/src/compiled_instruction.rs index 64bb4d70f..c8c05002f 100644 --- a/message/src/compiled_instruction.rs +++ b/message/src/compiled_instruction.rs @@ -2,6 +2,8 @@ use serde_derive::{Deserialize, Serialize}; #[cfg(feature = "frozen-abi")] use solana_frozen_abi_macro::AbiExample; +#[cfg(feature = "wincode")] +use wincode::{containers, len::ShortU16Len, SchemaRead, SchemaWrite}; use {solana_address::Address, solana_sanitize::Sanitize}; /// A compact encoding of an instruction. @@ -17,15 +19,18 @@ use {solana_address::Address, solana_sanitize::Sanitize}; derive(Deserialize, Serialize), serde(rename_all = "camelCase") )] +#[cfg_attr(feature = "wincode", derive(SchemaWrite, SchemaRead))] #[derive(Debug, PartialEq, Eq, Clone)] pub struct CompiledInstruction { /// Index into the transaction keys array indicating the program account that executes this instruction. pub program_id_index: u8, /// Ordered indices into the transaction keys array indicating which accounts to pass to the program. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] pub accounts: Vec, /// The program input data. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] pub data: Vec, } diff --git a/message/src/legacy.rs b/message/src/legacy.rs index d998533d0..3c2c191b0 100644 --- a/message/src/legacy.rs +++ b/message/src/legacy.rs @@ -15,6 +15,8 @@ use serde_derive::{Deserialize, Serialize}; #[cfg(feature = "frozen-abi")] use solana_frozen_abi_macro::{frozen_abi, AbiExample}; +#[cfg(feature = "wincode")] +use wincode::{containers, len::ShortU16Len, SchemaRead, SchemaWrite}; use { crate::{ compiled_instruction::CompiledInstruction, compiled_keys::CompiledKeys, @@ -74,6 +76,11 @@ fn compile_instructions(ixs: &[Instruction], keys: &[Address]) -> Vec, /// The id of a recent ledger entry. @@ -90,6 +98,7 @@ pub struct Message { /// Programs that will be executed in sequence and committed in one atomic transaction if all /// succeed. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] pub instructions: Vec, } diff --git a/message/src/lib.rs b/message/src/lib.rs index a1da06b5a..4f8da8241 100644 --- a/message/src/lib.rs +++ b/message/src/lib.rs @@ -48,6 +48,8 @@ pub mod legacy; use serde_derive::{Deserialize, Serialize}; #[cfg(feature = "frozen-abi")] use solana_frozen_abi_macro::AbiExample; +#[cfg(feature = "wincode")] +use wincode::{SchemaRead, SchemaWrite}; #[cfg(not(target_os = "solana"))] #[path = ""] @@ -112,6 +114,11 @@ pub const MESSAGE_HEADER_LENGTH: usize = 3; derive(Deserialize, Serialize), serde(rename_all = "camelCase") )] +#[cfg_attr( + feature = "wincode", + derive(SchemaWrite, SchemaRead), + wincode(struct_extensions) +)] #[derive(Default, Debug, PartialEq, Eq, Clone, Copy)] pub struct MessageHeader { /// The number of signatures required for this message to be considered diff --git a/message/src/versions/mod.rs b/message/src/versions/mod.rs index e245e7f58..df16f4f35 100644 --- a/message/src/versions/mod.rs +++ b/message/src/versions/mod.rs @@ -10,6 +10,17 @@ use { solana_sanitize::{Sanitize, SanitizeError}, std::collections::HashSet, }; +#[cfg(feature = "wincode")] +use { + crate::{ + legacy::MessageUninitBuilder as LegacyMessageUninitBuilder, MessageHeaderUninitBuilder, + }, + core::mem::MaybeUninit, + wincode::{ + io::{Reader, Writer}, + ReadResult, SchemaRead, SchemaWrite, WriteResult, + }, +}; #[cfg(feature = "serde")] use { serde::{ @@ -326,6 +337,83 @@ impl<'de> serde::Deserialize<'de> for VersionedMessage { } } +#[cfg(feature = "wincode")] +impl SchemaWrite for VersionedMessage { + type Src = Self; + + #[inline(always)] + fn size_of(src: &Self::Src) -> WriteResult { + match src { + VersionedMessage::Legacy(message) => LegacyMessage::size_of(message), + // +1 for message version prefix + #[expect(clippy::arithmetic_side_effects)] + VersionedMessage::V0(message) => Ok(1 + v0::Message::size_of(message)?), + } + } + + #[inline(always)] + fn write(writer: &mut impl Writer, src: &Self::Src) -> WriteResult<()> { + match src { + VersionedMessage::Legacy(message) => LegacyMessage::write(writer, message), + VersionedMessage::V0(message) => { + u8::write(writer, &MESSAGE_VERSION_PREFIX)?; + v0::Message::write(writer, message) + } + } + } +} + +#[cfg(feature = "wincode")] +impl<'de> SchemaRead<'de> for VersionedMessage { + type Dst = Self; + + fn read(reader: &mut impl Reader<'de>, dst: &mut MaybeUninit) -> ReadResult<()> { + // If the first bit is set, the remaining 7 bits will be used to determine + // which message version is serialized starting from version `0`. If the first + // is bit is not set, all bytes are used to encode the legacy `Message` + // format. + let variant = u8::get(reader)?; + + if variant & MESSAGE_VERSION_PREFIX != 0 { + use wincode::error::invalid_tag_encoding; + + let version = variant & !MESSAGE_VERSION_PREFIX; + return match version { + 0 => { + let msg = v0::Message::get(reader)?; + dst.write(VersionedMessage::V0(msg)); + Ok(()) + } + _ => Err(invalid_tag_encoding(version as usize)), + }; + } + + let mut msg = MaybeUninit::::uninit(); + let mut msg_builder = LegacyMessageUninitBuilder::from_maybe_uninit_mut(&mut msg); + // We've already read the variant byte which, in the legacy case, represents + // the `num_required_signatures` field. + // As such, we need to write the remaining fields into the message manually, + // as calling `LegacyMessage::read` will miss the first field. + let mut header_builder = + MessageHeaderUninitBuilder::from_maybe_uninit_mut(msg_builder.uninit_header_mut()); + header_builder.write_num_required_signatures(variant); + header_builder.read_num_readonly_signed_accounts(reader)?; + header_builder.read_num_readonly_unsigned_accounts(reader)?; + header_builder.finish(); + unsafe { msg_builder.assume_init_header() }; + + msg_builder.read_account_keys(reader)?; + msg_builder.read_recent_blockhash(reader)?; + msg_builder.read_instructions(reader)?; + msg_builder.finish(); + + let msg = unsafe { msg.assume_init() }; + dst.write(VersionedMessage::Legacy(msg)); + + Ok(()) + } +} + #[cfg(test)] mod tests { use { diff --git a/message/src/versions/v0/mod.rs b/message/src/versions/v0/mod.rs index 960831541..13b4171dd 100644 --- a/message/src/versions/v0/mod.rs +++ b/message/src/versions/v0/mod.rs @@ -14,6 +14,8 @@ pub use loaded::*; use serde_derive::{Deserialize, Serialize}; #[cfg(feature = "frozen-abi")] use solana_frozen_abi_macro::AbiExample; +#[cfg(feature = "wincode")] +use wincode::{containers, len::ShortU16Len, SchemaRead, SchemaWrite}; use { crate::{ compiled_instruction::CompiledInstruction, @@ -38,15 +40,18 @@ mod loaded; derive(Deserialize, Serialize), serde(rename_all = "camelCase") )] +#[cfg_attr(feature = "wincode", derive(SchemaWrite, SchemaRead))] #[derive(Default, Debug, PartialEq, Eq, Clone)] pub struct MessageAddressTableLookup { /// Address lookup table account key pub account_key: Address, /// List of indexes used to load writable account addresses #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] pub writable_indexes: Vec, /// List of indexes used to load readonly account addresses #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] pub readonly_indexes: Vec, } @@ -63,6 +68,7 @@ pub struct MessageAddressTableLookup { derive(Deserialize, Serialize), serde(rename_all = "camelCase") )] +#[cfg_attr(feature = "wincode", derive(SchemaWrite, SchemaRead))] #[derive(Default, Debug, PartialEq, Eq, Clone)] pub struct Message { /// The message header, identifying signed and read-only `account_keys`. @@ -72,6 +78,7 @@ pub struct Message { /// List of accounts loaded by this transaction. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] pub account_keys: Vec
, /// The blockhash of a recent block. @@ -91,11 +98,13 @@ pub struct Message { /// 2) ordered list of keys loaded from `writable` lookup table indexes /// 3) ordered list of keys loaded from `readable` lookup table indexes #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] pub instructions: Vec, /// List of address table lookups used to load additional accounts /// for this transaction. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] pub address_table_lookups: Vec, } diff --git a/signature/Cargo.toml b/signature/Cargo.toml index c80975570..1cb5e91e3 100644 --- a/signature/Cargo.toml +++ b/signature/Cargo.toml @@ -17,13 +17,14 @@ rustdoc-args = ["--cfg=docsrs"] [features] default = ["std", "alloc"] -alloc = [] +alloc = ["wincode?/alloc"] bytemuck = ["dep:bytemuck", "dep:bytemuck_derive"] frozen-abi = ["dep:solana-frozen-abi", "dep:solana-frozen-abi-macro", "std"] rand = ["dep:rand"] serde = ["dep:serde", "dep:serde_derive", "dep:serde-big-array"] -std = ["alloc", "serde?/std"] +std = ["alloc", "serde?/std", "wincode?/std"] verify = ["dep:ed25519-dalek"] +wincode = ["dep:wincode"] [dependencies] bytemuck = { workspace = true, optional = true } @@ -37,6 +38,7 @@ serde_derive = { workspace = true, optional = true } solana-frozen-abi = { workspace = true, optional = true, features = ["frozen-abi"] } solana-frozen-abi-macro = { workspace = true, optional = true, features = ["frozen-abi"] } solana-sanitize = { workspace = true } +wincode = { workspace = true, optional = true } [dev-dependencies] bincode = { workspace = true } diff --git a/signature/src/lib.rs b/signature/src/lib.rs index e8dbf1d29..6e7e13282 100644 --- a/signature/src/lib.rs +++ b/signature/src/lib.rs @@ -15,6 +15,8 @@ extern crate std; use core::error::Error; #[cfg(feature = "std")] use std::vec::Vec; +#[cfg(feature = "wincode")] +use wincode::{SchemaRead, SchemaWrite}; #[cfg(feature = "serde")] use { serde_big_array::BigArray, @@ -36,6 +38,7 @@ const MAX_BASE58_SIGNATURE_LEN: usize = 88; derive(bytemuck_derive::Pod, bytemuck_derive::Zeroable) )] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] +#[cfg_attr(feature = "wincode", derive(SchemaWrite, SchemaRead))] pub struct Signature( #[cfg_attr(feature = "serde", serde(with = "BigArray"))] [u8; SIGNATURE_BYTES], ); diff --git a/transaction/Cargo.toml b/transaction/Cargo.toml index dd399f0a7..cd6a6faaf 100644 --- a/transaction/Cargo.toml +++ b/transaction/Cargo.toml @@ -39,6 +39,7 @@ serde = [ "solana-transaction-error/serde", ] verify = ["blake3", "solana-signature/verify"] +wincode = ["dep:wincode", "solana-message/wincode", "solana-signature/wincode"] [dependencies] bincode = { workspace = true, optional = true } @@ -57,11 +58,16 @@ solana-short-vec = { workspace = true, optional = true } solana-signature = { workspace = true } solana-signer = { workspace = true, optional = true } solana-transaction-error = { workspace = true } +wincode = { workspace = true, optional = true, features = [ + "solana-short-vec", + "alloc", +] } [dev-dependencies] anyhow = { workspace = true } bincode = { workspace = true } borsh = { workspace = true } +proptest = { workspace = true } solana-example-mocks = { path = "../example-mocks" } solana-hash = { workspace = true, features = ["atomic"] } solana-instruction = { workspace = true, features = ["borsh"] } @@ -72,6 +78,9 @@ solana-presigner = { workspace = true } solana-pubkey = { workspace = true, features = ["rand"] } solana-sha256-hasher = { workspace = true } solana-system-interface = { workspace = true, features = ["bincode"] } -solana-transaction = { path = ".", features = ["dev-context-only-utils"] } +solana-transaction = { path = ".", features = [ + "dev-context-only-utils", + "wincode", +] } solana-vote-interface = { workspace = true, features = ["bincode"] } static_assertions = { workspace = true } diff --git a/transaction/src/versioned/mod.rs b/transaction/src/versioned/mod.rs index cb6b78a47..31146a8e7 100644 --- a/transaction/src/versioned/mod.rs +++ b/transaction/src/versioned/mod.rs @@ -2,6 +2,8 @@ #[cfg(feature = "bincode")] use solana_signer::{signers::Signers, SignerError}; +#[cfg(feature = "wincode")] +use wincode::{containers, len::ShortU16Len, SchemaRead, SchemaWrite}; use { crate::Transaction, solana_message::{inline_nonce::is_advance_nonce_instruction_data, VersionedMessage}, @@ -48,10 +50,12 @@ impl TransactionVersion { /// An atomic transaction #[cfg_attr(feature = "frozen-abi", derive(solana_frozen_abi_macro::AbiExample))] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] +#[cfg_attr(feature = "wincode", derive(SchemaWrite, SchemaRead))] #[derive(Debug, PartialEq, Default, Eq, Clone)] pub struct VersionedTransaction { /// List of signatures #[cfg_attr(feature = "serde", serde(with = "short_vec"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] pub signatures: Vec, /// Message to sign. pub message: VersionedMessage, @@ -370,4 +374,136 @@ mod tests { Ok(()) ); } + + #[cfg(feature = "wincode")] + #[test] + fn versioned_transaction_wincode_bincode_roundtrip() { + use { + super::*, + proptest::prelude::*, + solana_address::{Address, ADDRESS_BYTES}, + solana_hash::{Hash, HASH_BYTES}, + solana_message::{ + compiled_instruction::CompiledInstruction, + v0::{self, MessageAddressTableLookup}, + Message as LegacyMessage, MessageHeader, + }, + solana_signature::SIGNATURE_BYTES, + }; + + fn strat_byte_vec(max_len: usize) -> impl Strategy> { + proptest::collection::vec(any::(), 0..=max_len) + } + + fn strat_signature() -> impl Strategy { + any::<[u8; SIGNATURE_BYTES]>().prop_map(Signature::from) + } + + fn strat_address() -> impl Strategy { + any::<[u8; ADDRESS_BYTES]>().prop_map(Address::new_from_array) + } + + fn strat_hash() -> impl Strategy { + any::<[u8; HASH_BYTES]>().prop_map(Hash::new_from_array) + } + + fn strat_message_header() -> impl Strategy { + (0u8..128, any::(), any::()).prop_map(|(a, b, c)| MessageHeader { + num_required_signatures: a, + num_readonly_signed_accounts: b, + num_readonly_unsigned_accounts: c, + }) + } + + fn strat_compiled_instruction() -> impl Strategy { + (any::(), strat_byte_vec(128), strat_byte_vec(128)).prop_map( + |(program_id_index, accounts, data)| { + CompiledInstruction::new_from_raw_parts(program_id_index, accounts, data) + }, + ) + } + + fn strat_address_table_lookup() -> impl Strategy { + (strat_address(), strat_byte_vec(128), strat_byte_vec(128)).prop_map( + |(account_key, writable_indexes, readonly_indexes)| MessageAddressTableLookup { + account_key, + writable_indexes, + readonly_indexes, + }, + ) + } + + fn strat_legacy_message() -> impl Strategy { + ( + strat_message_header(), + proptest::collection::vec(strat_address(), 0..=8), + strat_hash(), + proptest::collection::vec(strat_compiled_instruction(), 0..=8), + ) + .prop_map(|(header, account_keys, recent_blockhash, instructions)| { + LegacyMessage { + header, + account_keys, + recent_blockhash, + instructions, + } + }) + } + + fn strat_v0_message() -> impl Strategy { + ( + strat_message_header(), + proptest::collection::vec(strat_address(), 0..=8), + strat_hash(), + proptest::collection::vec(strat_compiled_instruction(), 0..=4), + proptest::collection::vec(strat_address_table_lookup(), 0..=4), + ) + .prop_map( + |( + header, + account_keys, + recent_blockhash, + instructions, + address_table_lookups, + )| { + v0::Message { + header, + account_keys, + recent_blockhash, + instructions, + address_table_lookups, + } + }, + ) + } + + fn strat_versioned_message() -> impl Strategy { + prop_oneof![ + strat_legacy_message().prop_map(VersionedMessage::Legacy), + strat_v0_message().prop_map(VersionedMessage::V0), + ] + } + + fn strat_versioned_transaction() -> impl Strategy { + ( + proptest::collection::vec(strat_signature(), 0..=8), + strat_versioned_message(), + ) + .prop_map(|(signatures, message)| VersionedTransaction { + signatures, + message, + }) + } + + proptest!(|(tx in strat_versioned_transaction())| { + let bincode_serialized = bincode::serialize(&tx).unwrap(); + let wincode_serialized = wincode::serialize(&tx).unwrap(); + assert_eq!(bincode_serialized, wincode_serialized); + + let bincode_deserialized: VersionedTransaction = bincode::deserialize(&bincode_serialized).unwrap(); + let wincode_deserialized = wincode::deserialize(&wincode_serialized).unwrap(); + assert_eq!(&bincode_deserialized, &wincode_deserialized); + assert_eq!(wincode_deserialized, tx); + }); + } }