Browse Source

Move short_vec to its own crate (#1796)

* move short_vec.rs to its own crate

* update short_vec dependents to use new crate

* update lock file

* reexport short_vec with deprecation notice

* re-export in sdk too

* fmt

* remove duplicate frozen-abi stuff

* fix frozen-abi usage and activation

* update lock file

* fmt

* update expected digests after confirming not a real abi change

* update another digest

* add missing activation of frozen-abi feature

* update digests in sdk and program

* update VoteTransaction digest

* fmt
Kevin Heavey 1 year ago
parent
commit
b2c4742af2

+ 20 - 0
Cargo.lock

@@ -6007,6 +6007,7 @@ dependencies = [
  "solana-logger",
  "solana-program-runtime",
  "solana-sdk",
+ "solana-short-vec",
 ]
 
 [[package]]
@@ -6098,6 +6099,7 @@ dependencies = [
  "solana-sanitize",
  "solana-sdk",
  "solana-send-transaction-service",
+ "solana-short-vec",
  "solana-stake-program",
  "solana-streamer",
  "solana-svm",
@@ -6399,6 +6401,7 @@ dependencies = [
  "solana-runtime",
  "solana-sanitize",
  "solana-sdk",
+ "solana-short-vec",
  "solana-streamer",
  "solana-tpu-client",
  "solana-version",
@@ -6728,6 +6731,7 @@ dependencies = [
  "solana-metrics",
  "solana-rayon-threadlimit",
  "solana-sdk",
+ "solana-short-vec",
  "solana-vote-program",
  "test-case",
 ]
@@ -6834,6 +6838,7 @@ dependencies = [
  "solana-sanitize",
  "solana-sdk-macro",
  "solana-secp256k1-recover",
+ "solana-short-vec",
  "static_assertions",
  "thiserror",
  "wasm-bindgen",
@@ -7305,6 +7310,7 @@ dependencies = [
  "solana-sdk",
  "solana-sdk-macro",
  "solana-secp256k1-recover",
+ "solana-short-vec",
  "static_assertions",
  "thiserror",
  "tiny-bip39",
@@ -7358,6 +7364,19 @@ dependencies = [
  "solana-tpu-client",
 ]
 
+[[package]]
+name = "solana-short-vec"
+version = "2.1.0"
+dependencies = [
+ "assert_matches",
+ "bincode",
+ "rustc_version 0.4.0",
+ "serde",
+ "serde_json",
+ "solana-frozen-abi",
+ "solana-frozen-abi-macro",
+]
+
 [[package]]
 name = "solana-stake-accounts"
 version = "2.1.0"
@@ -7727,6 +7746,7 @@ dependencies = [
  "rand 0.8.5",
  "solana-perf",
  "solana-sdk",
+ "solana-short-vec",
 ]
 
 [[package]]

+ 2 - 0
Cargo.toml

@@ -105,6 +105,7 @@ members = [
     "sdk/package-metadata-macro",
     "sdk/program",
     "send-transaction-service",
+    "short-vec",
     "stake-accounts",
     "storage-bigtable",
     "storage-bigtable/build-proto",
@@ -399,6 +400,7 @@ solana-sdk = { path = "sdk", version = "=2.1.0" }
 solana-sdk-macro = { path = "sdk/macro", version = "=2.1.0" }
 solana-secp256k1-recover = { path = "curves/secp256k1-recover", version = "=2.1.0", default-features = false }
 solana-send-transaction-service = { path = "send-transaction-service", version = "=2.1.0" }
+solana-short-vec = { path = "short-vec", version = "=2.1.0" }
 solana-stake-program = { path = "programs/stake", version = "=2.1.0" }
 solana-storage-bigtable = { path = "storage-bigtable", version = "=2.1.0" }
 solana-storage-proto = { path = "storage-proto", version = "=2.1.0" }

+ 2 - 0
core/Cargo.toml

@@ -68,6 +68,7 @@ solana-runtime = { workspace = true }
 solana-sanitize = { workspace = true }
 solana-sdk = { workspace = true }
 solana-send-transaction-service = { workspace = true }
+solana-short-vec = { workspace = true }
 solana-streamer = { workspace = true }
 solana-svm = { workspace = true }
 solana-timings = { workspace = true }
@@ -129,6 +130,7 @@ frozen-abi = [
     "solana-program-runtime/frozen-abi",
     "solana-runtime/frozen-abi",
     "solana-sdk/frozen-abi",
+    "solana-short-vec/frozen-abi",
     "solana-svm/frozen-abi",
     "solana-vote/frozen-abi",
     "solana-vote-program/frozen-abi",

+ 1 - 1
core/src/banking_stage/immutable_deserialized_packet.rs

@@ -7,13 +7,13 @@ use {
         hash::Hash,
         message::Message,
         pubkey::Pubkey,
-        short_vec::decode_shortu16_len,
         signature::Signature,
         transaction::{
             AddressLoader, SanitizedTransaction, SanitizedVersionedTransaction,
             VersionedTransaction,
         },
     },
+    solana_short_vec::decode_shortu16_len,
     std::{cmp::Ordering, collections::HashSet, mem::size_of},
     thiserror::Error,
 };

+ 1 - 1
core/src/consensus.rs

@@ -237,7 +237,7 @@ pub(crate) enum BlockhashStatus {
 #[cfg_attr(
     feature = "frozen-abi",
     derive(AbiExample),
-    frozen_abi(digest = "679XkZ4upGc389SwqAsjs5tr2qB4wisqjbwtei7fGhxC")
+    frozen_abi(digest = "H6T5A66kgJYANFXVrUprxV76WD5ce7Gf62q9SiBC2uYk")
 )]
 #[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
 pub struct Tower {

+ 1 - 1
core/src/consensus/tower1_14_11.rs

@@ -9,7 +9,7 @@ use {
 #[cfg_attr(
     feature = "frozen-abi",
     derive(AbiExample),
-    frozen_abi(digest = "4LayQwoKrE2jPhbNtg3TSpKrtEtjcPiwsVPJN7aCavri")
+    frozen_abi(digest = "EqYa8kwY9Z1Zbjxgs2aBbqKyCK4f7WAG8gJ7pVSQyKzk")
 )]
 #[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
 pub struct Tower1_14_11 {

+ 2 - 0
gossip/Cargo.toml

@@ -45,6 +45,7 @@ solana-rpc-client = { workspace = true }
 solana-runtime = { workspace = true }
 solana-sanitize = { workspace = true }
 solana-sdk = { workspace = true }
+solana-short-vec = { workspace = true }
 solana-streamer = { workspace = true }
 solana-tpu-client = { workspace = true }
 solana-version = { workspace = true }
@@ -71,6 +72,7 @@ frozen-abi = [
     "solana-perf/frozen-abi",
     "solana-runtime/frozen-abi",
     "solana-sdk/frozen-abi",
+    "solana-short-vec/frozen-abi",
     "solana-version/frozen-abi",
     "solana-vote/frozen-abi",
     "solana-vote-program/frozen-abi",

+ 1 - 1
gossip/src/cluster_info.rs

@@ -310,7 +310,7 @@ pub(crate) type Ping = ping_pong::Ping<[u8; GOSSIP_PING_TOKEN_SIZE]>;
 #[cfg_attr(
     feature = "frozen-abi",
     derive(AbiExample, AbiEnumVisitor),
-    frozen_abi(digest = "ogEqvffeEkPpojAaSiUbCv2HdJcdXDQ1ykgYyvKvLo2")
+    frozen_abi(digest = "6YaMJand6tKtNLUrqvusC5QVDmVLCWYRg5LtxYNi6XN4")
 )]
 #[derive(Serialize, Deserialize, Debug)]
 #[allow(clippy::large_enum_variant)]

+ 2 - 1
gossip/src/contact_info.rs

@@ -8,8 +8,9 @@ use {
         pubkey::Pubkey,
         quic::QUIC_PORT_OFFSET,
         rpc_port::{DEFAULT_RPC_PORT, DEFAULT_RPC_PUBSUB_PORT},
-        serde_varint, short_vec,
+        serde_varint,
     },
+    solana_short_vec as short_vec,
     solana_streamer::socket::SocketAddrSpace,
     static_assertions::const_assert_eq,
     std::{

+ 2 - 0
perf/Cargo.toml

@@ -26,6 +26,7 @@ solana-frozen-abi-macro = { workspace = true, optional = true }
 solana-metrics = { workspace = true }
 solana-rayon-threadlimit = { workspace = true }
 solana-sdk = { workspace = true }
+solana-short-vec = { workspace = true }
 solana-vote-program = { workspace = true }
 
 [target."cfg(target_os = \"linux\")".dependencies]
@@ -50,6 +51,7 @@ frozen-abi = [
     "dep:solana-frozen-abi",
     "dep:solana-frozen-abi-macro",
     "solana-sdk/frozen-abi",
+    "solana-short-vec/frozen-abi",
     "solana-vote-program/frozen-abi",
 ]
 

+ 1 - 1
perf/src/sigverify.rs

@@ -17,9 +17,9 @@ use {
         hash::Hash,
         message::{MESSAGE_HEADER_LENGTH, MESSAGE_VERSION_PREFIX},
         pubkey::Pubkey,
-        short_vec::decode_shortu16_len,
         signature::Signature,
     },
+    solana_short_vec::decode_shortu16_len,
     std::{convert::TryFrom, mem::size_of},
 };
 

+ 1 - 0
programs/config/Cargo.toml

@@ -17,6 +17,7 @@ serde_derive = { workspace = true }
 solana-log-collector = { workspace = true }
 solana-program-runtime = { workspace = true }
 solana-sdk = { workspace = true }
+solana-short-vec = { workspace = true }
 
 [dev-dependencies]
 solana-logger = { workspace = true }

+ 1 - 1
programs/config/src/lib.rs

@@ -16,8 +16,8 @@ use {
     solana_sdk::{
         account::{Account, AccountSharedData},
         pubkey::Pubkey,
-        short_vec,
     },
+    solana_short_vec as short_vec,
 };
 
 pub trait ConfigState: serde::Serialize + Default {

+ 15 - 0
programs/sbf/Cargo.lock

@@ -4786,6 +4786,7 @@ dependencies = [
  "solana-log-collector",
  "solana-program-runtime",
  "solana-sdk",
+ "solana-short-vec",
 ]
 
 [[package]]
@@ -4864,6 +4865,7 @@ dependencies = [
  "solana-sanitize",
  "solana-sdk",
  "solana-send-transaction-service",
+ "solana-short-vec",
  "solana-streamer",
  "solana-svm",
  "solana-timings",
@@ -5049,6 +5051,7 @@ dependencies = [
  "solana-runtime",
  "solana-sanitize",
  "solana-sdk",
+ "solana-short-vec",
  "solana-streamer",
  "solana-tpu-client",
  "solana-version",
@@ -5242,6 +5245,7 @@ dependencies = [
  "solana-metrics",
  "solana-rayon-threadlimit",
  "solana-sdk",
+ "solana-short-vec",
  "solana-vote-program",
 ]
 
@@ -5313,6 +5317,7 @@ dependencies = [
  "solana-sanitize",
  "solana-sdk-macro",
  "solana-secp256k1-recover",
+ "solana-short-vec",
  "thiserror",
  "wasm-bindgen",
 ]
@@ -6153,6 +6158,7 @@ dependencies = [
  "solana-sanitize",
  "solana-sdk-macro",
  "solana-secp256k1-recover",
+ "solana-short-vec",
  "thiserror",
  "uriparse",
  "wasm-bindgen",
@@ -6200,6 +6206,14 @@ dependencies = [
  "solana-tpu-client",
 ]
 
+[[package]]
+name = "solana-short-vec"
+version = "2.1.0"
+dependencies = [
+ "rustc_version",
+ "serde",
+]
+
 [[package]]
 name = "solana-stake-program"
 version = "2.1.0"
@@ -6418,6 +6432,7 @@ dependencies = [
  "rand 0.8.5",
  "solana-perf",
  "solana-sdk",
+ "solana-short-vec",
 ]
 
 [[package]]

+ 1 - 1
programs/vote/src/vote_state/mod.rs

@@ -31,7 +31,7 @@ use {
 #[cfg_attr(
     feature = "frozen-abi",
     derive(AbiExample, AbiEnumVisitor),
-    frozen_abi(digest = "EcS3xgfomytEAQ1eVd8R76ZejwyHp2Ed8dHqQWh6zi5v")
+    frozen_abi(digest = "3R2hRL3FM6jovbYubq2UWeiVDEVzrhH6M1ihoCPZWLsk")
 )]
 #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
 pub enum VoteTransaction {

+ 2 - 0
sdk/Cargo.toml

@@ -42,6 +42,7 @@ frozen-abi = [
   "dep:solana-frozen-abi",
   "dep:solana-frozen-abi-macro",
   "solana-program/frozen-abi",
+  "solana-short-vec/frozen-abi"
 ]
 
 [dependencies]
@@ -85,6 +86,7 @@ solana-program = { workspace = true }
 solana-sanitize = { workspace = true }
 solana-sdk-macro = { workspace = true }
 solana-secp256k1-recover = { workspace = true }
+solana-short-vec = { workspace = true }
 thiserror = { workspace = true }
 uriparse = { workspace = true }
 

+ 1 - 1
sdk/benches/short_vec.rs

@@ -1,7 +1,7 @@
 #![feature(test)]
 
 extern crate test;
-use {bincode::deserialize, solana_sdk::short_vec::ShortVec, test::Bencher};
+use {bincode::deserialize, solana_short_vec::ShortVec, test::Bencher};
 
 // Return a ShortVec with 127 bytes
 fn create_encoded_short_vec() -> Vec<u8> {

+ 2 - 1
sdk/program/Cargo.toml

@@ -37,6 +37,7 @@ solana-frozen-abi-macro = { workspace = true, optional = true }
 solana-sanitize = { workspace = true }
 solana-sdk-macro = { workspace = true }
 solana-secp256k1-recover = { workspace = true }
+solana-short-vec = { workspace = true }
 thiserror = { workspace = true }
 
 # This is currently needed to build on-chain programs reliably.
@@ -97,4 +98,4 @@ crate-type = ["cdylib", "rlib"]
 default = ["borsh"]
 borsh = ["dep:borsh", "dep:borsh0-10"]
 dev-context-only-utils = ["dep:qualifier_attr"]
-frozen-abi = ["dep:solana-frozen-abi", "dep:solana-frozen-abi-macro"]
+frozen-abi = ["dep:solana-frozen-abi", "dep:solana-frozen-abi-macro", "solana-short-vec/frozen-abi"]

+ 2 - 5
sdk/program/src/instruction.rs

@@ -18,11 +18,8 @@ use crate::wasm_bindgen;
 #[cfg(feature = "borsh")]
 use borsh::BorshSerialize;
 use {
-    crate::{pubkey::Pubkey, short_vec},
-    bincode::serialize,
-    serde::Serialize,
-    solana_sanitize::Sanitize,
-    thiserror::Error,
+    crate::pubkey::Pubkey, bincode::serialize, serde::Serialize, solana_sanitize::Sanitize,
+    solana_short_vec as short_vec, thiserror::Error,
 };
 
 /// Reasons the runtime might have rejected an instruction.

+ 2 - 1
sdk/program/src/lib.rs

@@ -521,7 +521,6 @@ pub mod rent;
 pub mod secp256k1_program;
 pub mod serde_varint;
 pub mod serialize_utils;
-pub mod short_vec;
 pub mod slot_hashes;
 pub mod slot_history;
 pub mod stable_layout;
@@ -538,6 +537,8 @@ pub mod wasm;
 pub use solana_sanitize as sanitize;
 #[deprecated(since = "2.1.0", note = "Use `solana-secp256k1-recover` crate instead")]
 pub use solana_secp256k1_recover as secp256k1_recover;
+#[deprecated(since = "2.1.0", note = "Use `solana-short-vec` crate instead")]
+pub use solana_short_vec as short_vec;
 #[cfg(target_arch = "wasm32")]
 pub use wasm_bindgen::prelude::wasm_bindgen;
 

+ 4 - 3
sdk/program/src/message/legacy.rs

@@ -22,9 +22,10 @@ use {
         instruction::{CompiledInstruction, Instruction},
         message::{compiled_keys::CompiledKeys, MessageHeader},
         pubkey::Pubkey,
-        short_vec, system_instruction, system_program, sysvar,
+        system_instruction, system_program, sysvar,
     },
     solana_sanitize::{Sanitize, SanitizeError},
+    solana_short_vec as short_vec,
     std::{collections::HashSet, convert::TryFrom, str::FromStr},
 };
 
@@ -122,7 +123,7 @@ fn compile_instructions(ixs: &[Instruction], keys: &[Pubkey]) -> Vec<CompiledIns
 #[cfg(not(target_arch = "wasm32"))]
 #[cfg_attr(
     feature = "frozen-abi",
-    frozen_abi(digest = "2KnLEqfLcTBQqitE22Pp8JYkaqVVbAkGbCfdeHoyxcAU"),
+    frozen_abi(digest = "hPGFnQYLp3Ps4XLg7NHHvC7tDfNGMMBCN3x2jGXpF3G"),
     derive(AbiExample)
 )]
 #[derive(Serialize, Deserialize, Default, Debug, PartialEq, Eq, Clone)]
@@ -152,7 +153,7 @@ pub struct Message {
 #[wasm_bindgen]
 #[cfg_attr(
     feature = "frozen-abi",
-    frozen_abi(digest = "2KnLEqfLcTBQqitE22Pp8JYkaqVVbAkGbCfdeHoyxcAU"),
+    frozen_abi(digest = "hPGFnQYLp3Ps4XLg7NHHvC7tDfNGMMBCN3x2jGXpF3G"),
     derive(AbiExample)
 )]
 #[derive(Serialize, Deserialize, Default, Debug, PartialEq, Eq, Clone)]

+ 2 - 2
sdk/program/src/message/versions/mod.rs

@@ -4,7 +4,6 @@ use {
         instruction::CompiledInstruction,
         message::{legacy::Message as LegacyMessage, v0::MessageAddressTableLookup, MessageHeader},
         pubkey::Pubkey,
-        short_vec,
     },
     serde::{
         de::{self, Deserializer, SeqAccess, Unexpected, Visitor},
@@ -12,6 +11,7 @@ use {
     },
     serde_derive::{Deserialize, Serialize},
     solana_sanitize::{Sanitize, SanitizeError},
+    solana_short_vec as short_vec,
     std::{collections::HashSet, fmt},
 };
 
@@ -33,7 +33,7 @@ pub const MESSAGE_VERSION_PREFIX: u8 = 0x80;
 /// format.
 #[cfg_attr(
     feature = "frozen-abi",
-    frozen_abi(digest = "G4EAiqmGgBprgf5ePYemLJcoFfx4R7rhC1Weo2FVJ7fn"),
+    frozen_abi(digest = "8wyn6rxrJ1WwsUJkVxtDH9VEmd7djwqMfBLL3EpuY7H4"),
     derive(AbiEnumVisitor, AbiExample)
 )]
 #[derive(Debug, PartialEq, Eq, Clone)]

+ 1 - 1
sdk/program/src/message/versions/v0/mod.rs

@@ -21,9 +21,9 @@ use {
             AccountKeys, MessageHeader, MESSAGE_VERSION_PREFIX,
         },
         pubkey::Pubkey,
-        short_vec,
     },
     solana_sanitize::SanitizeError,
+    solana_short_vec as short_vec,
     std::collections::HashSet,
 };
 

+ 1 - 1
sdk/program/src/serde_varint.rs

@@ -120,7 +120,7 @@ impl_var_int!(u64);
 
 #[cfg(test)]
 mod tests {
-    use {crate::short_vec::ShortU16, rand::Rng};
+    use {rand::Rng, solana_short_vec::ShortU16};
 
     #[derive(Debug, Eq, PartialEq, Serialize, Deserialize)]
     struct Dummy {

+ 4 - 2
sdk/program/src/vote/state/mod.rs

@@ -895,10 +895,11 @@ pub mod serde_compact_vote_state_update {
         super::*,
         crate::{
             clock::{Slot, UnixTimestamp},
-            serde_varint, short_vec,
+            serde_varint,
             vote::state::Lockout,
         },
         serde::{Deserialize, Deserializer, Serialize, Serializer},
+        solana_short_vec as short_vec,
     };
 
     #[cfg_attr(feature = "frozen-abi", derive(AbiExample))]
@@ -992,10 +993,11 @@ pub mod serde_tower_sync {
         super::*,
         crate::{
             clock::{Slot, UnixTimestamp},
-            serde_varint, short_vec,
+            serde_varint,
             vote::state::Lockout,
         },
         serde::{Deserialize, Deserializer, Serialize, Serializer},
+        solana_short_vec as short_vec,
     };
 
     #[cfg_attr(feature = "frozen-abi", derive(AbiExample))]

+ 4 - 2
sdk/src/lib.rs

@@ -53,8 +53,8 @@ pub use solana_program::{
     incinerator, instruction, keccak, lamports, loader_instruction, loader_upgradeable_instruction,
     loader_v4, loader_v4_instruction, message, msg, native_token, nonce, program, program_error,
     program_memory, program_option, program_pack, rent, secp256k1_program, serde_varint,
-    serialize_utils, short_vec, slot_hashes, slot_history, stable_layout, stake, stake_history,
-    syscalls, system_instruction, system_program, sysvar, unchecked_div_by_const, vote,
+    serialize_utils, slot_hashes, slot_history, stable_layout, stake, stake_history, syscalls,
+    system_instruction, system_program, sysvar, unchecked_div_by_const, vote,
 };
 #[cfg(feature = "borsh")]
 pub use solana_program::{borsh, borsh0_10, borsh1};
@@ -156,6 +156,8 @@ pub use solana_sdk_macro::pubkey;
 pub use solana_sdk_macro::pubkeys;
 #[deprecated(since = "2.1.0", note = "Use `solana-secp256k1-recover` crate instead")]
 pub use solana_secp256k1_recover as secp256k1_recover;
+#[deprecated(since = "2.1.0", note = "Use `solana-short-vec` crate instead")]
+pub use solana_short_vec as short_vec;
 
 /// Convenience macro for `AddAssign` with saturating arithmetic.
 /// Replace by `std::num::Saturating` once stable

+ 3 - 3
sdk/src/transaction/mod.rs

@@ -122,7 +122,6 @@ use {
         precompiles::verify_if_precompile,
         program_utils::limited_deserialize,
         pubkey::Pubkey,
-        short_vec,
         signature::{Signature, SignerError},
         signers::Signers,
     },
@@ -130,6 +129,7 @@ use {
     solana_program::{system_instruction::SystemInstruction, system_program},
     solana_sanitize::{Sanitize, SanitizeError},
     solana_sdk::feature_set,
+    solana_short_vec as short_vec,
     std::result,
 };
 
@@ -172,7 +172,7 @@ pub type Result<T> = result::Result<T, TransactionError>;
 #[cfg_attr(
     feature = "frozen-abi",
     derive(AbiExample),
-    frozen_abi(digest = "FZtncnS1Xk8ghHfKiXE5oGiUbw2wJhmfXQuNgQR3K6Mc")
+    frozen_abi(digest = "5LPHxp7TKPeV7GZ9pcT4NxNxJa3ZhvToDekCMAPvNWLv")
 )]
 #[derive(Debug, PartialEq, Default, Eq, Clone, Serialize, Deserialize)]
 pub struct Transaction {
@@ -200,7 +200,7 @@ pub struct Transaction {
 #[cfg_attr(
     feature = "frozen-abi",
     derive(AbiExample),
-    frozen_abi(digest = "FZtncnS1Xk8ghHfKiXE5oGiUbw2wJhmfXQuNgQR3K6Mc")
+    frozen_abi(digest = "5LPHxp7TKPeV7GZ9pcT4NxNxJa3ZhvToDekCMAPvNWLv")
 )]
 #[derive(Debug, PartialEq, Default, Eq, Clone, Serialize, Deserialize)]
 pub struct Transaction {

+ 1 - 1
sdk/src/transaction/versioned/mod.rs

@@ -6,7 +6,6 @@ use {
     crate::{
         hash::Hash,
         message::VersionedMessage,
-        short_vec,
         signature::Signature,
         signer::SignerError,
         signers::Signers,
@@ -14,6 +13,7 @@ use {
     },
     serde::Serialize,
     solana_sanitize::SanitizeError,
+    solana_short_vec as short_vec,
     std::cmp::Ordering,
 };
 

+ 29 - 0
short-vec/Cargo.toml

@@ -0,0 +1,29 @@
+[package]
+name = "solana-short-vec"
+description = "Solana compact serde-encoding of vectors with small length."
+documentation = "https://docs.rs/solana-short-vec"
+version = { workspace = true }
+authors = { workspace = true }
+repository = { workspace = true }
+homepage = { workspace = true }
+license = { workspace = true }
+edition = { workspace = true }
+
+[build-dependencies]
+rustc_version = { workspace = true }
+
+[dependencies]
+serde = { workspace = true }
+solana-frozen-abi = { workspace = true, optional = true }
+solana-frozen-abi-macro = { workspace = true, optional = true }
+
+[dev-dependencies]
+assert_matches = { workspace = true }
+bincode = { workspace = true }
+serde_json = { workspace = true }
+
+[features]
+frozen-abi = ["dep:solana-frozen-abi", "dep:solana-frozen-abi-macro"]
+
+[package.metadata.docs.rs]
+targets = ["x86_64-unknown-linux-gnu"]

+ 1 - 0
short-vec/build.rs

@@ -0,0 +1 @@
+../frozen-abi/build.rs

+ 3 - 1
sdk/program/src/short_vec.rs → short-vec/src/lib.rs

@@ -1,6 +1,8 @@
 //! Compact serde-encoding of vectors with small length.
-
+#![cfg_attr(RUSTC_WITH_SPECIALIZATION, feature(min_specialization))]
 #![allow(clippy::arithmetic_side_effects)]
+#[cfg(feature = "frozen-abi")]
+use solana_frozen_abi_macro::AbiExample;
 use {
     serde::{
         de::{self, Deserializer, SeqAccess, Visitor},

+ 1 - 0
transaction-metrics-tracker/Cargo.toml

@@ -18,6 +18,7 @@ log = { workspace = true }
 rand = { workspace = true }
 solana-perf = { workspace = true }
 solana-sdk = { workspace = true }
+solana-short-vec = { workspace = true }
 
 [package.metadata.docs.rs]
 targets = ["x86_64-unknown-linux-gnu"]

+ 2 - 1
transaction-metrics-tracker/src/lib.rs

@@ -3,7 +3,8 @@ use {
     log::*,
     rand::Rng,
     solana_perf::sigverify::PacketError,
-    solana_sdk::{packet::Packet, short_vec::decode_shortu16_len, signature::SIGNATURE_BYTES},
+    solana_sdk::{packet::Packet, signature::SIGNATURE_BYTES},
+    solana_short_vec::decode_shortu16_len,
 };
 
 // The mask is 12 bits long (1<<12 = 4096), it means the probability of matching