Pārlūkot izejas kodu

Revert "deps: Bump all sdk and spl crates to v3 compatibility (#7492)" (#7556)

This reverts commit 06464c5d5962af743e357068278f24f30f753598.
Jon C 3 mēneši atpakaļ
vecāks
revīzija
f149dec1d2
100 mainītis faili ar 1275 papildinājumiem un 1575 dzēšanām
  1. 179 271
      Cargo.lock
  2. 101 99
      Cargo.toml
  3. 2 2
      account-decoder/Cargo.toml
  4. 6 6
      account-decoder/src/parse_account_data.rs
  5. 2 1
      account-decoder/src/parse_config.rs
  6. 4 2
      account-decoder/src/parse_sysvar.rs
  7. 6 6
      account-decoder/src/parse_vote.rs
  8. 6 2
      accounts-cluster-bench/src/main.rs
  9. 2 2
      banks-client/src/lib.rs
  10. 1 1
      bench-tps/Cargo.toml
  11. 5 5
      bench-tps/src/bench.rs
  12. 1 1
      bench-tps/src/keypairs.rs
  13. 2 2
      clap-utils/src/input_parsers.rs
  14. 2 2
      clap-v3-utils/src/input_parsers/mod.rs
  15. 2 0
      cli-output/Cargo.toml
  16. 18 32
      cli-output/src/cli_output.rs
  17. 11 16
      cli-output/src/display.rs
  18. 35 33
      cli/Cargo.toml
  19. 7 7
      cli/src/checks.rs
  20. 4 24
      cli/src/cli.rs
  21. 2 4
      cli/src/cluster_query.rs
  22. 13 7
      cli/src/feature.rs
  23. 5 5
      cli/src/spend_utils.rs
  24. 1 1
      cli/src/stake.rs
  25. 7 9
      cli/src/validator_info.rs
  26. 9 8
      cli/src/vote.rs
  27. 4 3
      cli/tests/cluster_query.rs
  28. 30 30
      cli/tests/nonce.rs
  29. 3 3
      cli/tests/request_airdrop.rs
  30. 12 12
      cli/tests/stake.rs
  31. 47 41
      cli/tests/transfer.rs
  32. 5 5
      cli/tests/vote.rs
  33. 4 4
      client-test/tests/client.rs
  34. 10 10
      client-test/tests/send_and_confirm_transactions_in_parallel.rs
  35. 0 1
      core/Cargo.toml
  36. 1 1
      core/src/banking_stage/consumer.rs
  37. 1 2
      core/src/banking_stage/immutable_deserialized_packet.rs
  38. 4 4
      core/src/commitment_service.rs
  39. 5 5
      core/src/consensus.rs
  40. 1 1
      core/src/consensus/tower1_14_11.rs
  41. 1 1
      core/src/consensus/tower1_7_14.rs
  42. 2 2
      core/src/consensus/tower_storage.rs
  43. 1 1
      core/src/repair/ancestor_hashes_service.rs
  44. 2 2
      core/src/repair/serve_repair.rs
  45. 2 2
      core/src/replay_stage.rs
  46. 1 2
      core/src/validator.rs
  47. 2 2
      core/tests/scheduler_cost_adjustment.rs
  48. 12 12
      faucet/Cargo.toml
  49. 11 11
      faucet/src/faucet.rs
  50. 18 19
      genesis/Cargo.toml
  51. 1 2
      genesis/src/genesis_accounts.rs
  52. 5 6
      genesis/src/main.rs
  53. 19 19
      gossip/Cargo.toml
  54. 12 18
      gossip/src/cluster_info.rs
  55. 1 1
      gossip/src/crds_gossip_push.rs
  56. 12 28
      gossip/src/crds_value.rs
  57. 9 8
      install/Cargo.toml
  58. 2 4
      install/src/command.rs
  59. 8 8
      keygen/Cargo.toml
  60. 0 1
      ledger-tool/Cargo.toml
  61. 8 8
      ledger-tool/src/main.rs
  62. 6 5
      ledger-tool/src/output.rs
  63. 2 2
      ledger/src/blockstore_processor.rs
  64. 1 1
      ledger/src/sigverify_shreds.rs
  65. 1 1
      ledger/src/staking_utils.rs
  66. 0 1
      local-cluster/Cargo.toml
  67. 1 2
      local-cluster/src/local_cluster.rs
  68. 1 1
      local-cluster/tests/local_cluster.rs
  69. 2 2
      precompiles/Cargo.toml
  70. 1 1
      precompiles/src/secp256k1.rs
  71. 1 3
      program-runtime/Cargo.toml
  72. 21 26
      program-runtime/src/serialization.rs
  73. 4 5
      program-runtime/src/sysvar_cache.rs
  74. 0 1
      program-test/Cargo.toml
  75. 9 10
      program-test/src/lib.rs
  76. 1 3
      program-test/tests/sysvar_last_restart_slot.rs
  77. 5 3
      program-test/tests/warp.rs
  78. 1 4
      programs/bpf_loader/src/lib.rs
  79. 187 289
      programs/sbf/Cargo.lock
  80. 47 50
      programs/sbf/Cargo.toml
  81. 83 79
      programs/sbf/rust/account_mem/src/lib.rs
  82. 78 74
      programs/sbf/rust/account_mem_deprecated/src/lib.rs
  83. 2 1
      programs/sbf/rust/caller_access/src/lib.rs
  84. 4 1
      programs/sbf/rust/error_handling/src/lib.rs
  85. 4 4
      programs/sbf/rust/invoke/src/lib.rs
  86. 7 7
      programs/sbf/rust/invoked/src/lib.rs
  87. 3 3
      programs/sbf/rust/mem/src/lib.rs
  88. 78 87
      programs/sbf/rust/mem_dep/src/lib.rs
  89. 3 3
      programs/sbf/rust/membuiltins/src/lib.rs
  90. 1 3
      programs/sbf/rust/secp256k1_recover/Cargo.toml
  91. 3 15
      programs/sbf/rust/secp256k1_recover/src/lib.rs
  92. 3 6
      programs/sbf/rust/sha/Cargo.toml
  93. 9 35
      programs/sbf/rust/sha/src/lib.rs
  94. 1 1
      programs/sbf/rust/simulation/src/lib.rs
  95. 1 2
      programs/sbf/rust/sysvar/Cargo.toml
  96. 4 7
      programs/sbf/rust/sysvar/src/lib.rs
  97. 5 5
      programs/sbf/tests/programs.rs
  98. 4 2
      programs/sbf/tests/sysvar.rs
  99. 1 2
      programs/stake-tests/tests/test_move_stake_and_lamports.rs
  100. 1 1
      programs/stake/Cargo.toml

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 179 - 271
Cargo.lock


+ 101 - 99
Cargo.toml

@@ -213,6 +213,7 @@ bincode = "1.3.3"
 bitflags = { version = "2.9.1" }
 blake3 = "1.8.2"
 borsh = { version = "1.5.7", features = ["derive", "unstable__schema"] }
+borsh0-10 = { package = "borsh", version = "0.10.3" }
 bs58 = { version = "0.5.1", default-features = false }
 bv = "0.11.1"
 byte-unit = "4.0.19"
@@ -370,23 +371,23 @@ smallvec = "1.15.1"
 smpl_jwt = "0.7.1"
 socket2 = "0.6.0"
 soketto = "0.7"
-solana-account = "3.0.0"
+solana-account = "2.2.1"
 solana-account-decoder = { path = "account-decoder", version = "=3.0.0" }
 solana-account-decoder-client-types = { path = "account-decoder-client-types", version = "=3.0.0" }
-solana-account-info = "3.0.0"
+solana-account-info = "2.3.0"
 solana-accounts-db = { path = "accounts-db", version = "=3.0.0" }
-solana-address-lookup-table-interface = "3.0.0"
-solana-atomic-u64 = "3.0.0"
+solana-address-lookup-table-interface = "2.2.2"
+solana-atomic-u64 = "2.2.1"
 solana-banks-client = { path = "banks-client", version = "=3.0.0" }
 solana-banks-interface = { path = "banks-interface", version = "=3.0.0" }
 solana-banks-server = { path = "banks-server", version = "=3.0.0" }
 solana-bench-tps = { path = "bench-tps", version = "=3.0.0" }
-solana-big-mod-exp = "3.0.0"
-solana-bincode = "3.0.0"
-solana-blake3-hasher = "3.0.0"
+solana-big-mod-exp = "2.2.1"
+solana-bincode = "2.2.1"
+solana-blake3-hasher = "2.2.1"
 solana-bloom = { path = "bloom", version = "=3.0.0" }
-solana-bn254 = "3.0.0"
-solana-borsh = "3.0.0"
+solana-bn254 = "2.2.2"
+solana-borsh = "2.2.1"
 solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=3.0.0" }
 solana-bucket-map = { path = "bucket_map", version = "=3.0.0" }
 solana-builtins = { path = "builtins", version = "=3.0.0" }
@@ -397,96 +398,97 @@ solana-cli = { path = "cli", version = "=3.0.0" }
 solana-cli-config = { path = "cli-config", version = "=3.0.0" }
 solana-cli-output = { path = "cli-output", version = "=3.0.0" }
 solana-client = { path = "client", version = "=3.0.0" }
-solana-client-traits = "3.0.0"
-solana-clock = "3.0.0"
-solana-cluster-type = "3.0.0"
-solana-commitment-config = "3.0.0"
+solana-client-traits = "2.2.1"
+solana-clock = "2.2.2"
+solana-cluster-type = "2.2.1"
+solana-commitment-config = "2.2.1"
 solana-compute-budget = { path = "compute-budget", version = "=3.0.0" }
 solana-compute-budget-instruction = { path = "compute-budget-instruction", version = "=3.0.0" }
-solana-compute-budget-interface = "3.0.0"
+solana-compute-budget-interface = "2.2.2"
 solana-compute-budget-program = { path = "programs/compute-budget", version = "=3.0.0" }
-solana-config-interface = "2.0.0"
+solana-config-interface = "1.0.0"
+solana-config-program-client = "1.1.0"
 solana-connection-cache = { path = "connection-cache", version = "=3.0.0", default-features = false }
 solana-core = { path = "core", version = "=3.0.0" }
 solana-cost-model = { path = "cost-model", version = "=3.0.0" }
-solana-cpi = "3.0.0"
+solana-cpi = "2.2.1"
 solana-curve25519 = { path = "curves/curve25519", version = "=3.0.0" }
-solana-define-syscall = "3.0.0"
-solana-derivation-path = "3.0.0"
+solana-define-syscall = "2.3.0"
+solana-derivation-path = "2.2.1"
 solana-download-utils = { path = "download-utils", version = "=3.0.0" }
-solana-ed25519-program = "3.0.0"
+solana-ed25519-program = "2.2.3"
 solana-entry = { path = "entry", version = "=3.0.0" }
-solana-epoch-info = "3.0.0"
-solana-epoch-rewards = "3.0.0"
-solana-epoch-rewards-hasher = "3.0.0"
-solana-epoch-schedule = "3.0.0"
-solana-example-mocks = "3.0.0"
+solana-epoch-info = "2.2.1"
+solana-epoch-rewards = "2.2.1"
+solana-epoch-rewards-hasher = "2.2.1"
+solana-epoch-schedule = "2.2.1"
+solana-example-mocks = "2.2.1"
 solana-faucet = { path = "faucet", version = "=3.0.0" }
-solana-feature-gate-interface = "3.0.0"
+solana-feature-gate-client = "0.0.2"
+solana-feature-gate-interface = "2.2.2"
 solana-fee = { path = "fee", version = "=3.0.0" }
-solana-fee-calculator = "3.0.0"
-solana-fee-structure = "3.0.0"
+solana-fee-calculator = "2.2.1"
+solana-fee-structure = "2.3.0"
 solana-file-download = "3.0.0"
-solana-frozen-abi = "3.0.0"
+solana-frozen-abi = "2.3.0"
 solana-frozen-abi-macro = "3.0.0"
 solana-genesis = { path = "genesis", version = "=3.0.0" }
-solana-genesis-config = "3.0.0"
+solana-genesis-config = "2.3.0"
 solana-genesis-utils = { path = "genesis-utils", version = "=3.0.0" }
 solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=3.0.0" }
 solana-gossip = { path = "gossip", version = "=3.0.0" }
-solana-hard-forks = "3.0.0"
-solana-hash = "3.0.0"
-solana-inflation = "3.0.0"
-solana-instruction = "3.0.0"
-solana-instruction-error = "2.0.0"
-solana-instructions-sysvar = "3.0.0"
-solana-keccak-hasher = "3.0.0"
-solana-keypair = "3.0.0"
-solana-last-restart-slot = "3.0.0"
+solana-hard-forks = "2.2.1"
+solana-hash = "2.3.0"
+solana-inflation = "2.2.1"
+solana-instruction = "2.3.0"
+solana-instructions-sysvar = "2.2.2"
+solana-keccak-hasher = "2.2.1"
+solana-keypair = "2.2.1"
+solana-last-restart-slot = "2.2.1"
 solana-lattice-hash = { path = "lattice-hash", version = "=3.0.0" }
 solana-ledger = { path = "ledger", version = "=3.0.0" }
-solana-loader-v2-interface = "3.0.0"
-solana-loader-v3-interface = "6.1.0"
-solana-loader-v4-interface = "3.1.0"
+solana-loader-v2-interface = "2.2.1"
+solana-loader-v3-interface = "5.0.0"
+solana-loader-v4-interface = "2.2.1"
 solana-loader-v4-program = { path = "programs/loader-v4", version = "=3.0.0" }
 solana-local-cluster = { path = "local-cluster", version = "=3.0.0" }
 solana-logger = "3.0.0"
 solana-low-pass-filter = { path = "low-pass-filter", version = "=3.0.0" }
 solana-measure = { path = "measure", version = "=3.0.0" }
 solana-merkle-tree = { path = "merkle-tree", version = "=3.0.0" }
-solana-message = "3.0.0"
+solana-message = "2.4.0"
 solana-metrics = { path = "metrics", version = "=3.0.0" }
-solana-msg = "3.0.0"
-solana-native-token = "3.0.0"
+solana-msg = "2.2.1"
+solana-native-token = "2.2.2"
 solana-net-utils = { path = "net-utils", version = "=3.0.0" }
 solana-nohash-hasher = "0.2.1"
-solana-nonce = "3.0.0"
-solana-nonce-account = "3.0.0"
+solana-nonce = "2.2.1"
+solana-nonce-account = "2.2.1"
 solana-notifier = { path = "notifier", version = "=3.0.0" }
-solana-offchain-message = "3.0.0"
-solana-packet = "3.0.0"
+solana-offchain-message = "2.2.1"
+solana-packet = "2.2.1"
 solana-perf = { path = "perf", version = "=3.0.0" }
 solana-poh = { path = "poh", version = "=3.0.0" }
-solana-poh-config = "3.0.0"
+solana-poh-config = "2.2.1"
 solana-poseidon = { path = "poseidon", version = "=3.0.0" }
-solana-precompile-error = "3.0.0"
-solana-presigner = "3.0.0"
-solana-program = { version = "3.0.0", default-features = false }
-solana-program-entrypoint = "3.1.0"
-solana-program-error = "3.0.0"
-solana-program-memory = "3.0.0"
-solana-program-option = "3.0.0"
-solana-program-pack = "3.0.0"
+solana-precompile-error = "2.2.2"
+solana-presigner = "2.2.1"
+solana-program = { version = "2.3.0", default-features = false }
+solana-program-entrypoint = "2.3.0"
+solana-program-error = "2.2.2"
+solana-program-memory = "2.3.1"
+solana-program-option = "2.2.1"
+solana-program-pack = "2.2.1"
 solana-program-runtime = { path = "program-runtime", version = "=3.0.0" }
 solana-program-test = { path = "program-test", version = "=3.0.0" }
-solana-pubkey = { version = "3.0.0", default-features = false }
+solana-pubkey = { version = "2.4.0", default-features = false }
 solana-pubsub-client = { path = "pubsub-client", version = "=3.0.0" }
 solana-quic-client = { path = "quic-client", version = "=3.0.0" }
-solana-quic-definitions = "3.0.0"
+solana-quic-definitions = "2.3.0"
 solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=3.0.0" }
 solana-remote-wallet = { path = "remote-wallet", version = "=3.0.0", default-features = false }
-solana-rent = "3.0.0"
-solana-reward-info = "3.0.0"
+solana-rent = "2.2.1"
+solana-reward-info = "2.2.1"
 solana-rpc = { path = "rpc", version = "=3.0.0" }
 solana-rpc-client = { path = "rpc-client", version = "=3.0.0", default-features = false }
 solana-rpc-client-api = { path = "rpc-client-api", version = "=3.0.0" }
@@ -494,27 +496,27 @@ solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=3
 solana-rpc-client-types = { path = "rpc-client-types", version = "=3.0.0" }
 solana-runtime = { path = "runtime", version = "=3.0.0" }
 solana-runtime-transaction = { path = "runtime-transaction", version = "=3.0.0" }
-solana-sanitize = "3.0.0"
+solana-sanitize = "2.2.1"
 solana-sbpf = "=0.12.2"
-solana-sdk-ids = "3.0.0"
-solana-secp256k1-program = "3.0.0"
-solana-secp256k1-recover = "3.0.0"
-solana-secp256r1-program = "3.0.0"
-solana-seed-derivable = "3.0.0"
-solana-seed-phrase = "3.0.0"
+solana-sdk-ids = "2.2.1"
+solana-secp256k1-program = "2.2.3"
+solana-secp256k1-recover = "2.2.1"
+solana-secp256r1-program = "2.2.4"
+solana-seed-derivable = "2.2.1"
+solana-seed-phrase = "2.2.1"
 solana-send-transaction-service = { path = "send-transaction-service", version = "=3.0.0" }
-solana-serde = "3.0.0"
-solana-serde-varint = "3.0.0"
-solana-serialize-utils = "3.0.0"
-solana-sha256-hasher = "3.0.0"
-solana-short-vec = "3.0.0"
-solana-shred-version = "3.0.0"
-solana-signature = { version = "3.1.0", default-features = false }
-solana-signer = "3.0.0"
-solana-slot-hashes = "3.0.0"
-solana-slot-history = "3.0.0"
-solana-stable-layout = "3.0.0"
-solana-stake-interface = { version = "2.0.0" }
+solana-serde = "2.2.1"
+solana-serde-varint = "2.2.2"
+solana-serialize-utils = "2.2.1"
+solana-sha256-hasher = "2.3.0"
+solana-short-vec = "2.2.1"
+solana-shred-version = "2.2.1"
+solana-signature = { version = "2.3.0", default-features = false }
+solana-signer = "2.2.1"
+solana-slot-hashes = "2.2.1"
+solana-slot-history = "2.2.1"
+solana-stable-layout = "2.2.1"
+solana-stake-interface = { version = "1.2.1" }
 solana-stake-program = { path = "programs/stake", version = "=3.0.0" }
 solana-storage-bigtable = { path = "storage-bigtable", version = "=3.0.0" }
 solana-storage-proto = { path = "storage-proto", version = "=3.0.0" }
@@ -528,20 +530,20 @@ solana-svm-metrics = { path = "svm-metrics", version = "=3.0.0" }
 solana-svm-timings = { path = "svm-timings", version = "=3.0.0" }
 solana-svm-transaction = { path = "svm-transaction", version = "=3.0.0" }
 solana-svm-type-overrides = { path = "svm-type-overrides", version = "=3.0.0" }
-solana-system-interface = "2.0"
+solana-system-interface = "1.0"
 solana-system-program = { path = "programs/system", version = "=3.0.0" }
-solana-system-transaction = "3.0.0"
-solana-sysvar = "3.0.0"
-solana-sysvar-id = "3.0.0"
+solana-system-transaction = "2.2.1"
+solana-sysvar = "2.2.2"
+solana-sysvar-id = "2.2.1"
 solana-test-validator = { path = "test-validator", version = "=3.0.0" }
-solana-time-utils = "3.0.0"
+solana-time-utils = "2.2.1"
 solana-tls-utils = { path = "tls-utils", version = "=3.0.0" }
 solana-tps-client = { path = "tps-client", version = "=3.0.0" }
 solana-tpu-client = { path = "tpu-client", version = "=3.0.0", default-features = false }
 solana-tpu-client-next = { path = "tpu-client-next", version = "=3.0.0" }
-solana-transaction = "3.0.0"
+solana-transaction = "2.2.3"
 solana-transaction-context = { path = "transaction-context", version = "=3.0.0", features = ["bincode"] }
-solana-transaction-error = "3.0.0"
+solana-transaction-error = "2.2.1"
 solana-transaction-metrics-tracker = { path = "transaction-metrics-tracker", version = "=3.0.0" }
 solana-transaction-status = { path = "transaction-status", version = "=3.0.0" }
 solana-transaction-status-client-types = { path = "transaction-status-client-types", version = "=3.0.0" }
@@ -549,26 +551,26 @@ solana-turbine = { path = "turbine", version = "=3.0.0" }
 solana-udp-client = { path = "udp-client", version = "=3.0.0" }
 solana-unified-scheduler-logic = { path = "unified-scheduler-logic", version = "=3.0.0" }
 solana-unified-scheduler-pool = { path = "unified-scheduler-pool", version = "=3.0.0" }
-solana-validator-exit = "3.0.0"
+solana-validator-exit = "2.2.1"
 solana-version = { path = "version", version = "=3.0.0" }
 solana-vote = { path = "vote", version = "=3.0.0" }
-solana-vote-interface = "3.0.0"
+solana-vote-interface = "2.2.6"
 solana-vote-program = { path = "programs/vote", version = "=3.0.0", default-features = false }
 solana-wen-restart = { path = "wen-restart", version = "=3.0.0" }
 solana-zk-elgamal-proof-program = { path = "programs/zk-elgamal-proof", version = "=3.0.0" }
 solana-zk-keygen = { path = "zk-keygen", version = "=3.0.0" }
-solana-zk-sdk = "4.0.0"
+solana-zk-sdk = "3.0.0"
 solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=3.0.0" }
 solana-zk-token-sdk = { path = "zk-token-sdk", version = "=3.0.0" }
-spl-associated-token-account-interface = "2.0.0"
-spl-generic-token = "2.0.0"
-spl-memo-interface = "2.0.0"
-spl-pod = "0.7.0"
-spl-token-2022-interface = "2.0.0"
-spl-token-confidential-transfer-proof-extraction = "0.5.0"
-spl-token-group-interface = "0.7.0"
-spl-token-interface = "2.0.0"
-spl-token-metadata-interface = "0.8.0"
+spl-associated-token-account-interface = "1.0.0"
+spl-generic-token = "1.0.1"
+spl-memo-interface = "1.0.0"
+spl-pod = "0.5.1"
+spl-token-2022-interface = "1.0.0"
+spl-token-confidential-transfer-proof-extraction = "0.4.0"
+spl-token-group-interface = "0.6.0"
+spl-token-interface = "1.0.0"
+spl-token-metadata-interface = "0.7.0"
 static_assertions = "1.1.0"
 stream-cancel = "0.8.2"
 strum = "0.24"

+ 2 - 2
account-decoder/Cargo.toml

@@ -28,7 +28,7 @@ solana-address-lookup-table-interface = { workspace = true, features = [
     "bytemuck",
 ] }
 solana-clock = { workspace = true }
-solana-config-interface = { workspace = true, features = ["bincode"] }
+solana-config-program-client = { workspace = true, features = ["serde"] }
 solana-epoch-schedule = { workspace = true }
 solana-fee-calculator = { workspace = true }
 solana-instruction = { workspace = true }
@@ -41,7 +41,7 @@ solana-rent = { workspace = true }
 solana-sdk-ids = { workspace = true }
 solana-slot-hashes = { workspace = true }
 solana-slot-history = { workspace = true }
-solana-stake-interface = { workspace = true, features = ["bincode", "sysvar"] }
+solana-stake-interface = { workspace = true }
 solana-sysvar = { workspace = true }
 solana-vote-interface = { workspace = true, features = ["bincode"] }
 spl-generic-token = { workspace = true }

+ 6 - 6
account-decoder/src/parse_account_data.rs

@@ -165,7 +165,7 @@ mod test {
         },
         solana_vote_interface::{
             program::id as vote_program_id,
-            state::{VoteStateV3, VoteStateVersions},
+            state::{VoteState, VoteStateVersions},
         },
     };
 
@@ -176,10 +176,10 @@ mod test {
         let data = vec![0; 4];
         assert!(parse_account_data_v3(&account_pubkey, &other_program, &data, None).is_err());
 
-        let vote_state = VoteStateV3::default();
-        let mut vote_account_data: Vec<u8> = vec![0; VoteStateV3::size_of()];
-        let versioned = VoteStateVersions::new_v3(vote_state);
-        VoteStateV3::serialize(&versioned, &mut vote_account_data).unwrap();
+        let vote_state = VoteState::default();
+        let mut vote_account_data: Vec<u8> = vec![0; VoteState::size_of()];
+        let versioned = VoteStateVersions::new_current(vote_state);
+        VoteState::serialize(&versioned, &mut vote_account_data).unwrap();
         let parsed = parse_account_data_v3(
             &account_pubkey,
             &vote_program_id(),
@@ -188,7 +188,7 @@ mod test {
         )
         .unwrap();
         assert_eq!(parsed.program, "vote".to_string());
-        assert_eq!(parsed.space, VoteStateV3::size_of() as u64);
+        assert_eq!(parsed.space, VoteState::size_of() as u64);
 
         let nonce_data = Versions::new(State::Initialized(Data::default()));
         let nonce_account_data = bincode::serialize(&nonce_data).unwrap();

+ 2 - 1
account-decoder/src/parse_config.rs

@@ -5,7 +5,7 @@ use {
     },
     bincode::deserialize,
     serde_json::Value,
-    solana_config_interface::state::{get_config_data, ConfigKeys},
+    solana_config_program_client::{get_config_data, ConfigKeys},
     solana_pubkey::Pubkey,
     solana_stake_interface::config::{
         Config as StakeConfig, {self as stake_config},
@@ -101,6 +101,7 @@ mod test {
         bincode::serialize,
         serde_json::json,
         solana_account::{Account, AccountSharedData, ReadableAccount},
+        solana_config_program_client::ConfigKeys,
     };
 
     fn create_config_account<T: serde::Serialize>(

+ 4 - 2
account-decoder/src/parse_sysvar.rs

@@ -14,9 +14,11 @@ use {
     solana_sdk_ids::sysvar,
     solana_slot_hashes::SlotHashes,
     solana_slot_history::{self as slot_history, SlotHistory},
-    solana_stake_interface::stake_history::{StakeHistory, StakeHistoryEntry},
     solana_sysvar::{
-        epoch_rewards::EpochRewards, last_restart_slot::LastRestartSlot, rewards::Rewards,
+        epoch_rewards::EpochRewards,
+        last_restart_slot::LastRestartSlot,
+        rewards::Rewards,
+        stake_history::{StakeHistory, StakeHistoryEntry},
     },
 };
 

+ 6 - 6
account-decoder/src/parse_vote.rs

@@ -2,11 +2,11 @@ use {
     crate::{parse_account_data::ParseAccountError, StringAmount},
     solana_clock::{Epoch, Slot},
     solana_pubkey::Pubkey,
-    solana_vote_interface::state::{BlockTimestamp, Lockout, VoteStateV3},
+    solana_vote_interface::state::{BlockTimestamp, Lockout, VoteState},
 };
 
 pub fn parse_vote(data: &[u8]) -> Result<VoteAccountType, ParseAccountError> {
-    let mut vote_state = VoteStateV3::deserialize(data).map_err(ParseAccountError::from)?;
+    let mut vote_state = VoteState::deserialize(data).map_err(ParseAccountError::from)?;
     let epoch_credits = vote_state
         .epoch_credits()
         .iter()
@@ -125,10 +125,10 @@ mod test {
 
     #[test]
     fn test_parse_vote() {
-        let vote_state = VoteStateV3::default();
-        let mut vote_account_data: Vec<u8> = vec![0; VoteStateV3::size_of()];
-        let versioned = VoteStateVersions::new_v3(vote_state);
-        VoteStateV3::serialize(&versioned, &mut vote_account_data).unwrap();
+        let vote_state = VoteState::default();
+        let mut vote_account_data: Vec<u8> = vec![0; VoteState::size_of()];
+        let versioned = VoteStateVersions::new_current(vote_state);
+        VoteState::serialize(&versioned, &mut vote_account_data).unwrap();
         let expected_vote_state = UiVoteState {
             node_pubkey: Pubkey::default().to_string(),
             authorized_withdrawer: Pubkey::default().to_string(),

+ 6 - 2
accounts-cluster-bench/src/main.rs

@@ -1420,7 +1420,7 @@ pub mod test {
             validator_configs::make_identical_validator_configs,
         },
         solana_measure::measure::Measure,
-        solana_native_token::LAMPORTS_PER_SOL,
+        solana_native_token::sol_to_lamports,
         solana_poh_config::PohConfig,
         solana_program_pack::Pack,
         solana_test_validator::TestValidator,
@@ -1572,7 +1572,11 @@ pub mod test {
         let funder = Keypair::new();
         let latest_blockhash = rpc_client.get_latest_blockhash().unwrap();
         let signature = rpc_client
-            .request_airdrop_with_blockhash(&funder.pubkey(), LAMPORTS_PER_SOL, &latest_blockhash)
+            .request_airdrop_with_blockhash(
+                &funder.pubkey(),
+                sol_to_lamports(1.0),
+                &latest_blockhash,
+            )
             .unwrap();
         rpc_client
             .confirm_transaction_with_spinner(

+ 2 - 2
banks-client/src/lib.rs

@@ -25,7 +25,7 @@ use {
     solana_pubkey::Pubkey,
     solana_rent::Rent,
     solana_signature::Signature,
-    solana_sysvar::SysvarSerialize,
+    solana_sysvar::Sysvar,
     solana_transaction::versioned::VersionedTransaction,
     tarpc::{
         client::{self, NewClient, RequestDispatch},
@@ -182,7 +182,7 @@ impl BanksClient {
     }
 
     /// Return the cluster Sysvar
-    pub async fn get_sysvar<T: SysvarSerialize>(&self) -> Result<T, BanksClientError> {
+    pub async fn get_sysvar<T: Sysvar>(&self) -> Result<T, BanksClientError> {
         let sysvar = self
             .get_account(T::id())
             .await?

+ 1 - 1
bench-tps/Cargo.toml

@@ -67,7 +67,7 @@ solana-tpu-client = { workspace = true }
 solana-transaction = { workspace = true }
 solana-transaction-status = { workspace = true }
 solana-version = { workspace = true }
-spl-instruction-padding-interface = { version = "=1.0.0" }
+spl-instruction-padding-interface = { version = "=0.1.0" }
 thiserror = { workspace = true }
 
 [target.'cfg(not(any(target_env = "msvc", target_os = "freebsd")))'.dependencies]

+ 5 - 5
bench-tps/src/bench.rs

@@ -1226,7 +1226,7 @@ mod tests {
         solana_commitment_config::CommitmentConfig,
         solana_fee_calculator::FeeRateGovernor,
         solana_genesis_config::{create_genesis_config, GenesisConfig},
-        solana_native_token::LAMPORTS_PER_SOL,
+        solana_native_token::sol_to_lamports,
         solana_nonce::state::State,
         solana_runtime::{bank::Bank, bank_client::BankClient, bank_forks::BankForks},
     };
@@ -1241,7 +1241,7 @@ mod tests {
 
     #[test]
     fn test_bench_tps_bank_client() {
-        let (genesis_config, id) = create_genesis_config(10_000 * LAMPORTS_PER_SOL);
+        let (genesis_config, id) = create_genesis_config(sol_to_lamports(10_000.0));
         let (bank, _bank_forks) = bank_with_all_features(&genesis_config);
         let client = Arc::new(BankClient::new_shared(bank));
 
@@ -1262,7 +1262,7 @@ mod tests {
 
     #[test]
     fn test_bench_tps_fund_keys() {
-        let (genesis_config, id) = create_genesis_config(10_000 * LAMPORTS_PER_SOL);
+        let (genesis_config, id) = create_genesis_config(sol_to_lamports(10_000.0));
         let (bank, _bank_forks) = bank_with_all_features(&genesis_config);
         let client = Arc::new(BankClient::new_shared(bank));
         let keypair_count = 20;
@@ -1285,7 +1285,7 @@ mod tests {
 
     #[test]
     fn test_bench_tps_fund_keys_with_fees() {
-        let (mut genesis_config, id) = create_genesis_config(10_000 * LAMPORTS_PER_SOL);
+        let (mut genesis_config, id) = create_genesis_config(sol_to_lamports(10_000.0));
         let fee_rate_governor = FeeRateGovernor::new(11, 0);
         genesis_config.fee_rate_governor = fee_rate_governor;
         let (bank, _bank_forks) = bank_with_all_features(&genesis_config);
@@ -1305,7 +1305,7 @@ mod tests {
 
     #[test]
     fn test_bench_tps_create_durable_nonce() {
-        let (genesis_config, id) = create_genesis_config(10_000 * LAMPORTS_PER_SOL);
+        let (genesis_config, id) = create_genesis_config(sol_to_lamports(10_000.0));
         let (bank, _bank_forks) = bank_with_all_features(&genesis_config);
         let client = Arc::new(BankClient::new_shared(bank));
         let keypair_count = 10;

+ 1 - 1
bench-tps/src/keypairs.rs

@@ -34,7 +34,7 @@ where
             .into_iter()
             .for_each(|(keypair, primordial_account)| {
                 let bytes: Vec<u8> = serde_json::from_str(keypair.as_str()).unwrap();
-                keypairs.push(Keypair::try_from(bytes.as_ref()).unwrap());
+                keypairs.push(Keypair::from_bytes(&bytes).unwrap());
                 last_balance = primordial_account.balance;
             });
 

+ 2 - 2
clap-utils/src/input_parsers.rs

@@ -386,9 +386,9 @@ mod tests {
     #[test]
     #[ignore = "historical reference; shows float behavior fixed in pull #4988"]
     fn test_lamports_of_sol_origin() {
-        use solana_native_token::sol_str_to_lamports;
+        use solana_native_token::sol_to_lamports;
         pub fn lamports_of_sol(matches: &ArgMatches<'_>, name: &str) -> Option<u64> {
-            matches.value_of(name).and_then(sol_str_to_lamports)
+            value_of(matches, name).map(sol_to_lamports)
         }
 
         let matches = app().get_matches_from(vec!["test", "--single", "50"]);

+ 2 - 2
clap-v3-utils/src/input_parsers/mod.rs

@@ -9,7 +9,7 @@ use {
     solana_cluster_type::ClusterType,
     solana_commitment_config::CommitmentConfig,
     solana_keypair::{read_keypair_file, Keypair},
-    solana_native_token::sol_str_to_lamports,
+    solana_native_token::sol_to_lamports,
     solana_pubkey::{Pubkey, MAX_SEED_LEN},
     solana_signer::Signer,
     std::str::FromStr,
@@ -80,7 +80,7 @@ pub fn unix_timestamp_from_rfc3339_datetime(
 )]
 #[allow(deprecated)]
 pub fn lamports_of_sol(matches: &ArgMatches, name: &str) -> Option<u64> {
-    matches.value_of(name).and_then(sol_str_to_lamports)
+    value_of(matches, name).map(sol_to_lamports)
 }
 
 #[deprecated(

+ 2 - 0
cli-output/Cargo.toml

@@ -34,6 +34,7 @@ solana-clock = { workspace = true }
 solana-epoch-info = { workspace = true, features = ["serde"] }
 solana-hash = { workspace = true }
 solana-message = { workspace = true }
+solana-native-token = { workspace = true }
 solana-packet = { workspace = true }
 solana-pubkey = { workspace = true }
 solana-rpc-client-api = { workspace = true }
@@ -41,6 +42,7 @@ solana-sdk-ids = { workspace = true }
 solana-signature = { workspace = true }
 solana-stake-interface = { workspace = true }
 solana-system-interface = { workspace = true }
+solana-sysvar = { workspace = true }
 solana-transaction = { workspace = true, features = ["verify"] }
 solana-transaction-error = { workspace = true }
 solana-transaction-status = { workspace = true }

+ 18 - 32
cli-output/src/cli_output.rs

@@ -25,16 +25,15 @@ use {
     solana_clock::{Epoch, Slot, UnixTimestamp},
     solana_epoch_info::EpochInfo,
     solana_hash::Hash,
+    solana_native_token::lamports_to_sol,
     solana_pubkey::Pubkey,
     solana_rpc_client_api::response::{
         RpcAccountBalance, RpcContactInfo, RpcInflationGovernor, RpcInflationRate, RpcKeyedAccount,
         RpcSupply, RpcVoteAccountInfo,
     },
     solana_signature::Signature,
-    solana_stake_interface::{
-        stake_history::StakeHistoryEntry,
-        state::{Authorized, Lockup},
-    },
+    solana_stake_interface::state::{Authorized, Lockup},
+    solana_sysvar::stake_history::StakeHistoryEntry,
     solana_transaction::{versioned::VersionedTransaction, Transaction},
     solana_transaction_status::{
         EncodedConfirmedBlock, EncodedTransaction, TransactionConfirmationStatus,
@@ -1078,8 +1077,8 @@ impl VerboseDisplay for CliKeyedEpochRewards {
                         keyed_reward.address,
                         reward.effective_slot,
                         Utc.timestamp_opt(reward.block_time, 0).unwrap(),
-                        build_balance_message(reward.amount, false, false),
-                        build_balance_message(reward.post_balance, false, false),
+                        lamports_to_sol(reward.amount),
+                        lamports_to_sol(reward.post_balance),
                         reward.percent_change,
                         reward
                             .apr
@@ -1123,8 +1122,8 @@ impl fmt::Display for CliKeyedEpochRewards {
                         f,
                         "  {:<44}  ◎{:<17.9}  ◎{:<17.9}  {:>13.9}%  {:>7}  {:>10}",
                         keyed_reward.address,
-                        build_balance_message(reward.amount, false, false),
-                        build_balance_message(reward.post_balance, false, false),
+                        lamports_to_sol(reward.amount),
+                        lamports_to_sol(reward.post_balance),
                         reward.percent_change,
                         reward
                             .apr
@@ -1299,13 +1298,13 @@ fn show_epoch_rewards(
             format_as!(
                 f,
                 "{},{},{},{},{},{}%,{},{}",
-                "  {:<6}  {:<11}  {:<26}  ◎{:<17.11}  ◎{:<17.11}  {:>13.3}%  {:>14}  {:>10}",
+                "  {:<6}  {:<11}  {:<26}  ◎{:<17.9}  ◎{:<17.9}  {:>13.3}%  {:>14}  {:>10}",
                 fmt,
                 reward.epoch,
                 reward.effective_slot,
                 Utc.timestamp_opt(reward.block_time, 0).unwrap(),
-                build_balance_message(reward.amount, false, false),
-                build_balance_message(reward.post_balance, false, false),
+                lamports_to_sol(reward.amount),
+                lamports_to_sol(reward.post_balance),
                 reward.percent_change,
                 reward
                     .apr
@@ -2026,10 +2025,7 @@ impl fmt::Display for CliAccountBalances {
                 f,
                 "{:<44}  {}",
                 account.address,
-                &format!(
-                    "{} SOL",
-                    build_balance_message(account.lamports, false, false)
-                ),
+                &format!("{} SOL", lamports_to_sol(account.lamports))
             )?;
         }
         Ok(())
@@ -2064,26 +2060,16 @@ impl VerboseDisplay for CliSupply {}
 
 impl fmt::Display for CliSupply {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        writeln_name_value(
-            f,
-            "Total:",
-            &format!("{} SOL", build_balance_message(self.total, false, false)),
-        )?;
+        writeln_name_value(f, "Total:", &format!("{} SOL", lamports_to_sol(self.total)))?;
         writeln_name_value(
             f,
             "Circulating:",
-            &format!(
-                "{} SOL",
-                build_balance_message(self.circulating, false, false)
-            ),
+            &format!("{} SOL", lamports_to_sol(self.circulating)),
         )?;
         writeln_name_value(
             f,
             "Non-Circulating:",
-            &format!(
-                "{} SOL",
-                build_balance_message(self.non_circulating, false, false)
-            ),
+            &format!("{} SOL", lamports_to_sol(self.non_circulating)),
         )?;
         if self.print_accounts {
             writeln!(f)?;
@@ -2849,14 +2835,14 @@ impl fmt::Display for CliBlock {
                     format!(
                         "{}◎{:<14.9}",
                         sign,
-                        build_balance_message(reward.lamports.unsigned_abs(), false, false)
+                        lamports_to_sol(reward.lamports.unsigned_abs())
                     ),
                     if reward.post_balance == 0 {
                         "          -                 -".to_string()
                     } else {
                         format!(
                             "◎{:<19.9}  {:>13.9}%",
-                            build_balance_message(reward.post_balance, false, false),
+                            lamports_to_sol(reward.post_balance),
                             (reward.lamports.abs() as f64
                                 / (reward.post_balance as f64 - reward.lamports as f64))
                                 * 100.0
@@ -2874,7 +2860,7 @@ impl fmt::Display for CliBlock {
                 f,
                 "Total Rewards: {}◎{:<12.9}",
                 sign,
-                build_balance_message(total_rewards.unsigned_abs(), false, false)
+                lamports_to_sol(total_rewards.unsigned_abs())
             )?;
         }
         for (index, transaction_with_meta) in
@@ -3542,7 +3528,7 @@ mod tests {
             ..CliVoteAccount::default()
         };
         let s = format!("{c}");
-        assert_eq!(s, "Account Balance: 0.00001 SOL\nValidator Identity: 11111111111111111111111111111111\nVote Authority: None\nWithdraw Authority: \nCredits: 0\nCommission: 0%\nRoot Slot: ~\nRecent Timestamp: 1970-01-01T00:00:00Z from slot 0\nEpoch Rewards:\n  Epoch   Reward Slot  Time                        Amount              New Balance         Percent Change             APR  Commission\n  1       100          1970-01-01 00:00:00 UTC  ◎0.00000001         ◎0.0000001                 11.000%          10.00%          1%\n  2       200          1970-01-12 13:46:40 UTC  ◎0.000000012        ◎0.0000001                 11.000%          13.00%          1%\n");
+        assert_eq!(s, "Account Balance: 0.00001 SOL\nValidator Identity: 11111111111111111111111111111111\nVote Authority: None\nWithdraw Authority: \nCredits: 0\nCommission: 0%\nRoot Slot: ~\nRecent Timestamp: 1970-01-01T00:00:00Z from slot 0\nEpoch Rewards:\n  Epoch   Reward Slot  Time                        Amount              New Balance         Percent Change             APR  Commission\n  1       100          1970-01-01 00:00:00 UTC  ◎0.000000010        ◎0.000000100               11.000%          10.00%          1%\n  2       200          1970-01-12 13:46:40 UTC  ◎0.000000012        ◎0.000000100               11.000%          13.00%          1%\n");
         println!("{s}");
 
         c.use_csv = true;

+ 11 - 16
cli-output/src/display.rs

@@ -10,6 +10,7 @@ use {
     solana_clock::UnixTimestamp,
     solana_hash::Hash,
     solana_message::{compiled_instruction::CompiledInstruction, v0::MessageAddressTableLookup},
+    solana_native_token::lamports_to_sol,
     solana_pubkey::Pubkey,
     solana_signature::Signature,
     solana_stake_interface as stake,
@@ -51,8 +52,7 @@ pub fn build_balance_message_with_config(
     let value = if config.use_lamports_unit {
         lamports.to_string()
     } else {
-        const LAMPORTS_PER_SOL_F64: f64 = 1_000_000_000.;
-        let sol = lamports as f64 / LAMPORTS_PER_SOL_F64;
+        let sol = lamports_to_sol(lamports);
         let sol_str = format!("{sol:.9}");
         if config.trim_trailing_zeros {
             sol_str
@@ -530,8 +530,8 @@ fn write_rewards<W: io::Write>(
                         "-".to_string()
                     },
                     sign,
-                    build_balance_message(reward.lamports.unsigned_abs(), false, false),
-                    build_balance_message(reward.post_balance, false, false)
+                    lamports_to_sol(reward.lamports.unsigned_abs()),
+                    lamports_to_sol(reward.post_balance)
                 )?;
             }
         }
@@ -556,12 +556,7 @@ fn write_status<W: io::Write>(
 }
 
 fn write_fees<W: io::Write>(w: &mut W, transaction_fee: u64, prefix: &str) -> io::Result<()> {
-    writeln!(
-        w,
-        "{}  Fee: ◎{}",
-        prefix,
-        build_balance_message(transaction_fee, false, false)
-    )
+    writeln!(w, "{}  Fee: ◎{}", prefix, lamports_to_sol(transaction_fee))
 }
 
 fn write_balances<W: io::Write>(
@@ -585,7 +580,7 @@ fn write_balances<W: io::Write>(
                 "{}  Account {} balance: ◎{}",
                 prefix,
                 i,
-                build_balance_message(*pre, false, false)
+                lamports_to_sol(*pre)
             )?;
         } else {
             writeln!(
@@ -593,8 +588,8 @@ fn write_balances<W: io::Write>(
                 "{}  Account {} balance: ◎{} -> ◎{}",
                 prefix,
                 i,
-                build_balance_message(*pre, false, false),
-                build_balance_message(*post, false, false)
+                lamports_to_sol(*pre),
+                lamports_to_sol(*post)
             )?;
         }
     }
@@ -745,7 +740,7 @@ mod test {
         let secret = ed25519_dalek::SecretKey::from_bytes(&[0u8; 32]).unwrap();
         let public = ed25519_dalek::PublicKey::from(&secret);
         let keypair = ed25519_dalek::Keypair { secret, public };
-        Keypair::try_from(keypair.to_bytes().as_ref()).unwrap()
+        Keypair::from_bytes(&keypair.to_bytes()).unwrap()
     }
 
     fn new_test_v0_transaction() -> VersionedTransaction {
@@ -862,7 +857,7 @@ Return Data from Program 8qbHbw2BbbTHBW1sbeqakYXVKRQM8Ne7pLK7m6CVfeR:
 0000:   01 02 03                                             ...
 Rewards:
   Address                                            Type        Amount            New Balance         \0
-  4vJ9JU1bJJE96FWSJKvHsmmFADCg4gpZQff4P3bkLKi        rent        -◎0.0000001       ◎0.0000099         \0
+  4vJ9JU1bJJE96FWSJKvHsmmFADCg4gpZQff4P3bkLKi        rent        -◎0.000000100     ◎0.000009900       \0
 ".replace("\\0", "") // replace marker used to subvert trailing whitespace linter on CI
         );
     }
@@ -951,7 +946,7 @@ Return Data from Program 8qbHbw2BbbTHBW1sbeqakYXVKRQM8Ne7pLK7m6CVfeR:
 0000:   01 02 03                                             ...
 Rewards:
   Address                                            Type        Amount            New Balance         \0
-  CktRuQ2mttgRGkXJtyksdKHjUdc2C4TgDzyB98oEzy8        rent        -◎0.0000001       ◎0.0000149         \0
+  CktRuQ2mttgRGkXJtyksdKHjUdc2C4TgDzyB98oEzy8        rent        -◎0.000000100     ◎0.000014900       \0
 ".replace("\\0", "") // replace marker used to subvert trailing whitespace linter on CI
         );
     }

+ 35 - 33
cli/Cargo.toml

@@ -37,64 +37,66 @@ semver = { workspace = true }
 serde = { workspace = true }
 serde_derive = { workspace = true }
 serde_json = { workspace = true }
-solana-account = "=3.0.0"
+solana-account = "=2.2.1"
 solana-account-decoder = { workspace = true }
 solana-address-lookup-table-interface = { workspace = true }
-solana-borsh = "=3.0.0"
+solana-borsh = "=2.2.1"
 solana-clap-utils = { workspace = true }
 solana-cli-config = { workspace = true }
 solana-cli-output = { workspace = true }
 solana-client = { workspace = true }
-solana-clock = "=3.0.0"
-solana-cluster-type = "=3.0.0"
-solana-commitment-config = "=3.0.0"
-solana-compute-budget-interface = { version = "=3.0.0", features = ["borsh"] }
-solana-config-interface = "=2.0.0"
+solana-clock = "=2.2.2"
+solana-cluster-type = "=2.2.1"
+solana-commitment-config = "=2.2.1"
+solana-compute-budget-interface = { version = "=2.2.2", features = ["borsh"] }
+solana-config-interface = "=1.0.0"
+solana-config-program-client = { workspace = true, features = ["serde"] }
 solana-connection-cache = { workspace = true }
-solana-epoch-schedule = "=3.0.0"
-solana-feature-gate-interface = { version = "=3.0.0", features = ["bincode"] }
-solana-fee-calculator = "=3.0.0"
-solana-fee-structure = "=3.0.0"
-solana-hash = "=3.0.0"
-solana-instruction = "=3.0.0"
-solana-keypair = "=3.0.0"
-solana-loader-v3-interface = { version = "=6.1.0", features = ["bincode"] }
-solana-loader-v4-interface = "=3.1.0"
+solana-epoch-schedule = "=2.2.1"
+solana-feature-gate-client = "=0.0.2"
+solana-feature-gate-interface = "=2.2.2"
+solana-fee-calculator = "=2.2.1"
+solana-fee-structure = "=2.3.0"
+solana-hash = "=2.3.0"
+solana-instruction = "=2.3.0"
+solana-keypair = "=2.2.1"
+solana-loader-v3-interface = { version = "=5.0.0", features = ["bincode"] }
+solana-loader-v4-interface = "=2.2.1"
 solana-loader-v4-program = { workspace = true }
 solana-logger = "=3.0.0"
-solana-message = "=3.0.0"
-solana-native-token = "=3.0.0"
-solana-nonce = "=3.0.0"
-solana-offchain-message = { version = "=3.0.0", features = ["verify"] }
-solana-packet = "=3.0.0"
+solana-message = "=2.4.0"
+solana-native-token = "=2.2.2"
+solana-nonce = "=2.2.1"
+solana-offchain-message = { version = "=2.2.1", features = ["verify"] }
+solana-packet = "=2.2.1"
 solana-program-runtime = { workspace = true }
-solana-pubkey = { version = "=3.0.0", default-features = false }
+solana-pubkey = { version = "=2.4.0", default-features = false }
 solana-pubsub-client = { workspace = true }
 solana-quic-client = { workspace = true }
 solana-remote-wallet = { workspace = true, features = ["default"] }
-solana-rent = "=3.0.0"
+solana-rent = "=2.2.1"
 solana-rpc-client = { workspace = true, features = ["default"] }
 solana-rpc-client-api = { workspace = true }
 solana-rpc-client-nonce-utils = { workspace = true, features = ["clap"] }
 solana-sbpf = { workspace = true }
-solana-sdk-ids = "=3.0.0"
-solana-signature = { version = "=3.1.0", default-features = false }
-solana-signer = "=3.0.0"
-solana-slot-history = "=3.0.0"
-solana-stake-interface = "=2.0.0"
+solana-sdk-ids = "=2.2.1"
+solana-signature = { version = "=2.3.0", default-features = false }
+solana-signer = "=2.2.1"
+solana-slot-history = "=2.2.1"
+solana-stake-interface = "=1.2.1"
 solana-streamer = { workspace = true }
-solana-system-interface = { version = "=2.0", features = ["bincode"] }
-solana-sysvar = "=3.0.0"
+solana-system-interface = { version = "=1.0", features = ["bincode"] }
+solana-sysvar = "=2.2.2"
 solana-tps-client = { workspace = true }
 solana-tpu-client = { workspace = true, features = ["default"] }
-solana-transaction = "=3.0.0"
-solana-transaction-error = "=3.0.0"
+solana-transaction = "=2.2.3"
+solana-transaction-error = "=2.2.1"
 solana-transaction-status = { workspace = true }
 solana-transaction-status-client-types = { workspace = true }
 solana-udp-client = { workspace = true }
 solana-version = { workspace = true }
 solana-vote-program = { workspace = true }
-spl-memo-interface = { version = "=2.0.0" }
+spl-memo-interface = { version = "=1.0.0" }
 thiserror = { workspace = true }
 tiny-bip39 = { workspace = true }
 

+ 7 - 7
cli/src/checks.rs

@@ -1,6 +1,6 @@
 use {
-    crate::cli::CliError, solana_cli_output::display::build_balance_message,
-    solana_commitment_config::CommitmentConfig, solana_message::Message, solana_pubkey::Pubkey,
+    crate::cli::CliError, solana_commitment_config::CommitmentConfig, solana_message::Message,
+    solana_native_token::lamports_to_sol, solana_pubkey::Pubkey,
     solana_rpc_client::rpc_client::RpcClient,
     solana_rpc_client_api::client_error::Result as ClientResult,
 };
@@ -83,8 +83,8 @@ pub fn check_account_for_spend_and_fee_with_commitment(
         balance
             .checked_add(fee)
             .ok_or(CliError::InsufficientFundsForSpendAndFee(
-                build_balance_message(balance, false, false),
-                build_balance_message(fee, false, false),
+                lamports_to_sol(balance),
+                lamports_to_sol(fee),
                 *account_pubkey,
             ))?;
 
@@ -96,13 +96,13 @@ pub fn check_account_for_spend_and_fee_with_commitment(
     )? {
         if balance > 0 {
             return Err(CliError::InsufficientFundsForSpendAndFee(
-                build_balance_message(balance, false, false),
-                build_balance_message(fee, false, false),
+                lamports_to_sol(balance),
+                lamports_to_sol(fee),
                 *account_pubkey,
             ));
         } else {
             return Err(CliError::InsufficientFundsForFee(
-                build_balance_message(fee, false, false),
+                lamports_to_sol(fee),
                 *account_pubkey,
             ));
         }

+ 4 - 24
cli/src/cli.rs

@@ -488,11 +488,11 @@ pub enum CliError {
     #[error("Command not recognized: {0}")]
     CommandNotRecognized(String),
     #[error("Account {1} has insufficient funds for fee ({0} SOL)")]
-    InsufficientFundsForFee(String, Pubkey),
+    InsufficientFundsForFee(f64, Pubkey),
     #[error("Account {1} has insufficient funds for spend ({0} SOL)")]
-    InsufficientFundsForSpend(String, Pubkey),
+    InsufficientFundsForSpend(f64, Pubkey),
     #[error("Account {2} has insufficient funds for spend ({0} SOL) + fee ({1} SOL)")]
-    InsufficientFundsForSpendAndFee(String, String, Pubkey),
+    InsufficientFundsForSpendAndFee(f64, f64, Pubkey),
     #[error(transparent)]
     InvalidNonce(solana_rpc_client_nonce_utils::Error),
     #[error("Dynamic program error: {0}")]
@@ -1744,26 +1744,6 @@ where
     }
 }
 
-pub fn to_str_error_adapter<E>(ix_error: &InstructionError) -> Option<E>
-where
-    E: 'static + std::error::Error + std::convert::TryFrom<u32>,
-{
-    match ix_error {
-        InstructionError::Custom(code) => E::try_from(*code).ok(),
-        _ => None,
-    }
-}
-
-pub fn log_instruction_custom_error_to_str<E>(
-    result: ClientResult<Signature>,
-    config: &CliConfig,
-) -> ProcessResult
-where
-    E: 'static + std::error::Error + std::convert::TryFrom<u32>,
-{
-    log_instruction_custom_error_ex::<E, _>(result, &config.output_format, to_str_error_adapter)
-}
-
 pub fn log_instruction_custom_error<E>(
     result: ClientResult<Signature>,
     config: &CliConfig,
@@ -1780,7 +1760,7 @@ pub fn log_instruction_custom_error_ex<E, F>(
     error_adapter: F,
 ) -> ProcessResult
 where
-    E: 'static + std::error::Error,
+    E: 'static + std::error::Error + FromPrimitive,
     F: Fn(&InstructionError) -> Option<E>,
 {
     match result {

+ 2 - 4
cli/src/cluster_query.rs

@@ -31,6 +31,7 @@ use {
     solana_commitment_config::CommitmentConfig,
     solana_hash::Hash,
     solana_message::Message,
+    solana_native_token::lamports_to_sol,
     solana_nonce::state::State as NonceState,
     solana_pubkey::Pubkey,
     solana_pubsub_client::pubsub_client::PubsubClient,
@@ -1412,10 +1413,7 @@ pub fn process_supply(
 
 pub fn process_total_supply(rpc_client: &RpcClient, _config: &CliConfig) -> ProcessResult {
     let supply = rpc_client.supply()?.value;
-    Ok(format!(
-        "{} SOL",
-        build_balance_message(supply.total, false, false)
-    ))
+    Ok(format!("{} SOL", lamports_to_sol(supply.total)))
 }
 
 pub fn process_get_transaction_count(rpc_client: &RpcClient, _config: &CliConfig) -> ProcessResult {

+ 13 - 7
cli/src/feature.rs

@@ -1,8 +1,8 @@
 use {
     crate::{
         cli::{
-            log_instruction_custom_error, log_instruction_custom_error_to_str, CliCommand,
-            CliCommandInfo, CliConfig, CliError, ProcessResult,
+            log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError,
+            ProcessResult,
         },
         spend_utils::{resolve_spend_tx_and_check_account_balance, SpendAmount},
     },
@@ -19,10 +19,10 @@ use {
     solana_clock::{Epoch, Slot},
     solana_cluster_type::ClusterType,
     solana_epoch_schedule::EpochSchedule,
-    solana_feature_gate_interface::{
-        activate_with_lamports, error::FeatureGateError, from_account,
-        instruction::revoke_pending_activation, Feature,
+    solana_feature_gate_client::{
+        errors::SolanaFeatureGateError, instructions::RevokePendingActivation,
     },
+    solana_feature_gate_interface::{activate_with_lamports, from_account, Feature},
     solana_message::Message,
     solana_pubkey::Pubkey,
     solana_remote_wallet::remote_wallet::RemoteWalletManager,
@@ -31,6 +31,7 @@ use {
         client_error::Error as ClientError, request::MAX_MULTIPLE_ACCOUNTS,
         response::RpcVoteAccountInfo,
     },
+    solana_sdk_ids::{incinerator, system_program},
     solana_system_interface::error::SystemError,
     solana_transaction::Transaction,
     std::{cmp::Ordering, collections::HashMap, fmt, rc::Rc, str::FromStr},
@@ -1085,7 +1086,12 @@ fn process_revoke(
         ComputeUnitLimit::Default,
         |_lamports| {
             Message::new(
-                &[revoke_pending_activation(&feature_id)],
+                &[RevokePendingActivation {
+                    feature: feature_id,
+                    incinerator: incinerator::id(),
+                    system_program: system_program::id(),
+                }
+                .instruction()],
                 Some(&fee_payer.pubkey()),
             )
         },
@@ -1104,5 +1110,5 @@ fn process_revoke(
         config.commitment,
         config.send_transaction_config,
     );
-    log_instruction_custom_error_to_str::<FeatureGateError>(result, config)
+    log_instruction_custom_error::<SolanaFeatureGateError>(result, config)
 }

+ 5 - 5
cli/src/spend_utils.rs

@@ -9,10 +9,10 @@ use {
     solana_clap_utils::{
         compute_budget::ComputeUnitLimit, input_parsers::lamports_of_sol, offline::SIGN_ONLY_ARG,
     },
-    solana_cli_output::display::build_balance_message,
     solana_commitment_config::CommitmentConfig,
     solana_hash::Hash,
     solana_message::Message,
+    solana_native_token::lamports_to_sol,
     solana_pubkey::Pubkey,
     solana_rpc_client::rpc_client::RpcClient,
 };
@@ -162,22 +162,22 @@ where
         if from_pubkey == fee_pubkey {
             if from_balance == 0 || from_balance < spend.saturating_add(fee) {
                 return Err(CliError::InsufficientFundsForSpendAndFee(
-                    build_balance_message(spend, false, false),
-                    build_balance_message(fee, false, false),
+                    lamports_to_sol(spend),
+                    lamports_to_sol(fee),
                     *from_pubkey,
                 ));
             }
         } else {
             if from_balance < spend {
                 return Err(CliError::InsufficientFundsForSpend(
-                    build_balance_message(spend, false, false),
+                    lamports_to_sol(spend),
                     *from_pubkey,
                 ));
             }
             if !check_account_for_balance_with_commitment(rpc_client, fee_pubkey, fee, commitment)?
             {
                 return Err(CliError::InsufficientFundsForFee(
-                    build_balance_message(fee, false, false),
+                    lamports_to_sol(fee),
                     *fee_pubkey,
                 ));
             }

+ 1 - 1
cli/src/stake.rs

@@ -54,11 +54,11 @@ use {
         self as stake,
         error::StakeError,
         instruction::{self as stake_instruction, LockupArgs},
-        stake_history::StakeHistory,
         state::{Authorized, Lockup, Meta, StakeActivationStatus, StakeAuthorize, StakeStateV2},
         tools::{acceptable_reference_epoch_credits, eligible_for_deactivate_delinquent},
     },
     solana_system_interface::{error::SystemError, instruction as system_instruction},
+    solana_sysvar::stake_history::StakeHistory,
     solana_transaction::Transaction,
     std::{ops::Deref, rc::Rc},
 };

+ 7 - 9
cli/src/validator_info.rs

@@ -20,10 +20,8 @@ use {
         keypair::DefaultSigner,
     },
     solana_cli_output::{CliValidatorInfo, CliValidatorInfoVec},
-    solana_config_interface::{
-        instruction::{self as config_instruction},
-        state::{get_config_data, ConfigKeys},
-    },
+    solana_config_interface::instruction::{self as config_instruction},
+    solana_config_program_client::{get_config_data, ConfigKeys},
     solana_keypair::Keypair,
     solana_message::Message,
     solana_pubkey::Pubkey,
@@ -132,7 +130,7 @@ fn parse_validator_info(
     pubkey: &Pubkey,
     account: &Account,
 ) -> Result<(Pubkey, Map<String, serde_json::value::Value>), Box<dyn error::Error>> {
-    if account.owner != solana_config_interface::id() {
+    if account.owner != solana_config_program_client::ID {
         return Err(format!("{pubkey} is not a validator info account").into());
     }
     let key_list: ConfigKeys = deserialize(&account.data)?;
@@ -305,7 +303,7 @@ pub fn process_set_validator_info(
     }
 
     // Check for existing validator-info account
-    let all_config = rpc_client.get_program_accounts(&solana_config_interface::id())?;
+    let all_config = rpc_client.get_program_accounts(&solana_config_program_client::ID)?;
     let existing_account = all_config
         .iter()
         .filter(
@@ -434,7 +432,7 @@ pub fn process_get_validator_info(
             rpc_client.get_account(&validator_info_pubkey)?,
         )]
     } else {
-        let all_config = rpc_client.get_program_accounts(&solana_config_interface::id())?;
+        let all_config = rpc_client.get_program_accounts(&solana_config_program_client::ID)?;
         all_config
             .into_iter()
             .filter(|(_, validator_info_account)| {
@@ -588,7 +586,7 @@ mod tests {
             parse_validator_info(
                 &Pubkey::default(),
                 &Account {
-                    owner: solana_config_interface::id(),
+                    owner: solana_config_program_client::ID,
                     data,
                     ..Account::default()
                 }
@@ -623,7 +621,7 @@ mod tests {
         assert!(parse_validator_info(
             &Pubkey::default(),
             &Account {
-                owner: solana_config_interface::id(),
+                owner: solana_config_program_client::ID,
                 data,
                 ..Account::default()
             },

+ 9 - 8
cli/src/vote.rs

@@ -26,11 +26,12 @@ use {
         offline::*,
     },
     solana_cli_output::{
-        display::build_balance_message, return_signers_with_config, CliEpochVotingHistory,
-        CliLandedVote, CliVoteAccount, ReturnSignersConfig,
+        return_signers_with_config, CliEpochVotingHistory, CliLandedVote, CliVoteAccount,
+        ReturnSignersConfig,
     },
     solana_commitment_config::CommitmentConfig,
     solana_message::Message,
+    solana_native_token::lamports_to_sol,
     solana_pubkey::Pubkey,
     solana_remote_wallet::remote_wallet::RemoteWalletManager,
     solana_rpc_client::rpc_client::RpcClient,
@@ -42,7 +43,7 @@ use {
         vote_error::VoteError,
         vote_instruction::{self, withdraw, CreateVoteAccountConfig},
         vote_state::{
-            VoteAuthorize, VoteInit, VoteStateV3, VoteStateVersions, VOTE_CREDITS_MAXIMUM_PER_SLOT,
+            VoteAuthorize, VoteInit, VoteState, VoteStateVersions, VOTE_CREDITS_MAXIMUM_PER_SLOT,
         },
     },
     std::rc::Rc,
@@ -828,7 +829,7 @@ pub fn process_create_vote_account(
     )?;
 
     let required_balance = rpc_client
-        .get_minimum_balance_for_rent_exemption(VoteStateV3::size_of())?
+        .get_minimum_balance_for_rent_exemption(VoteState::size_of())?
         .max(1);
     let amount = SpendAmount::Some(required_balance);
 
@@ -1260,7 +1261,7 @@ pub(crate) fn get_vote_account(
     rpc_client: &RpcClient,
     vote_account_pubkey: &Pubkey,
     commitment_config: CommitmentConfig,
-) -> Result<(Account, VoteStateV3), Box<dyn std::error::Error>> {
+) -> Result<(Account, VoteState), Box<dyn std::error::Error>> {
     let vote_account = rpc_client
         .get_account_with_commitment(vote_account_pubkey, commitment_config)?
         .value
@@ -1274,7 +1275,7 @@ pub(crate) fn get_vote_account(
         ))
         .into());
     }
-    let vote_state = VoteStateV3::deserialize(&vote_account.data).map_err(|_| {
+    let vote_state = VoteState::deserialize(&vote_account.data).map_err(|_| {
         CliError::RpcRequestError(
             "Account data could not be deserialized to vote state".to_string(),
         )
@@ -1428,14 +1429,14 @@ pub fn process_withdraw_from_vote_account(
     if !sign_only {
         let current_balance = rpc_client.get_balance(vote_account_pubkey)?;
         let minimum_balance =
-            rpc_client.get_minimum_balance_for_rent_exemption(VoteStateV3::size_of())?;
+            rpc_client.get_minimum_balance_for_rent_exemption(VoteState::size_of())?;
         if let SpendAmount::Some(withdraw_amount) = withdraw_amount {
             let balance_remaining = current_balance.saturating_sub(withdraw_amount);
             if balance_remaining < minimum_balance && balance_remaining != 0 {
                 return Err(CliError::BadParameter(format!(
                     "Withdraw amount too large. The vote account balance must be at least {} SOL \
                      to remain rent exempt",
-                    build_balance_message(minimum_balance, false, false)
+                    lamports_to_sol(minimum_balance)
                 ))
                 .into());
             }

+ 4 - 3
cli/tests/cluster_query.rs

@@ -8,7 +8,7 @@ use {
     solana_faucet::faucet::run_local_faucet,
     solana_fee_structure::FeeStructure,
     solana_keypair::Keypair,
-    solana_native_token::LAMPORTS_PER_SOL,
+    solana_native_token::sol_to_lamports,
     solana_rpc_client::rpc_client::RpcClient,
     solana_signer::Signer,
     solana_streamer::socket::SocketAddrSpace,
@@ -42,8 +42,9 @@ fn test_ping(compute_unit_price: Option<u64>) {
     config.json_rpc_url = test_validator.rpc_url();
     config.signers = vec![&default_signer];
 
-    request_and_confirm_airdrop(&rpc_client, &config, &signer_pubkey, LAMPORTS_PER_SOL).unwrap();
-    check_balance!(LAMPORTS_PER_SOL, &rpc_client, &signer_pubkey);
+    request_and_confirm_airdrop(&rpc_client, &config, &signer_pubkey, sol_to_lamports(1.0))
+        .unwrap();
+    check_balance!(sol_to_lamports(1.0), &rpc_client, &signer_pubkey);
     check_ready(&rpc_client);
 
     let count = 5;

+ 30 - 30
cli/tests/nonce.rs

@@ -11,7 +11,7 @@ use {
     solana_faucet::faucet::run_local_faucet,
     solana_hash::Hash,
     solana_keypair::{keypair_from_seed, Keypair},
-    solana_native_token::LAMPORTS_PER_SOL,
+    solana_native_token::sol_to_lamports,
     solana_pubkey::Pubkey,
     solana_rpc_client::rpc_client::RpcClient,
     solana_rpc_client_nonce_utils::blockhash_query::{self, BlockhashQuery},
@@ -46,11 +46,11 @@ fn test_nonce(seed: Option<String>, use_nonce_authority: bool, compute_unit_pric
         &rpc_client,
         &config_payer,
         &config_payer.signers[0].pubkey(),
-        2000 * LAMPORTS_PER_SOL,
+        sol_to_lamports(2000.0),
     )
     .unwrap();
     check_balance!(
-        2000 * LAMPORTS_PER_SOL,
+        sol_to_lamports(2000.0),
         &rpc_client,
         &config_payer.signers[0].pubkey(),
     );
@@ -85,17 +85,17 @@ fn test_nonce(seed: Option<String>, use_nonce_authority: bool, compute_unit_pric
         seed,
         nonce_authority: optional_authority,
         memo: None,
-        amount: SpendAmount::Some(1000 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(1000.0)),
         compute_unit_price,
     };
 
     process_command(&config_payer).unwrap();
     check_balance!(
-        1000 * LAMPORTS_PER_SOL,
+        sol_to_lamports(1000.0),
         &rpc_client,
         &config_payer.signers[0].pubkey(),
     );
-    check_balance!(1000 * LAMPORTS_PER_SOL, &rpc_client, &nonce_account);
+    check_balance!(sol_to_lamports(1000.0), &rpc_client, &nonce_account);
 
     // Get nonce
     config_payer.signers.pop();
@@ -144,17 +144,17 @@ fn test_nonce(seed: Option<String>, use_nonce_authority: bool, compute_unit_pric
         nonce_authority: index,
         memo: None,
         destination_account_pubkey: payee_pubkey,
-        lamports: 100 * LAMPORTS_PER_SOL,
+        lamports: sol_to_lamports(100.0),
         compute_unit_price,
     };
     process_command(&config_payer).unwrap();
     check_balance!(
-        1000 * LAMPORTS_PER_SOL,
+        sol_to_lamports(1000.0),
         &rpc_client,
         &config_payer.signers[0].pubkey(),
     );
-    check_balance!(900 * LAMPORTS_PER_SOL, &rpc_client, &nonce_account);
-    check_balance!(100 * LAMPORTS_PER_SOL, &rpc_client, &payee_pubkey);
+    check_balance!(sol_to_lamports(900.0), &rpc_client, &nonce_account);
+    check_balance!(sol_to_lamports(100.0), &rpc_client, &payee_pubkey);
 
     // Show nonce account
     config_payer.command = CliCommand::ShowNonceAccount {
@@ -199,29 +199,29 @@ fn test_nonce(seed: Option<String>, use_nonce_authority: bool, compute_unit_pric
         nonce_authority: 1,
         memo: None,
         destination_account_pubkey: payee_pubkey,
-        lamports: 100 * LAMPORTS_PER_SOL,
+        lamports: sol_to_lamports(100.0),
         compute_unit_price,
     };
     process_command(&config_payer).unwrap();
     check_balance!(
-        1000 * LAMPORTS_PER_SOL,
+        sol_to_lamports(1000.0),
         &rpc_client,
         &config_payer.signers[0].pubkey(),
     );
-    check_balance!(800 * LAMPORTS_PER_SOL, &rpc_client, &nonce_account);
-    check_balance!(200 * LAMPORTS_PER_SOL, &rpc_client, &payee_pubkey);
+    check_balance!(sol_to_lamports(800.0), &rpc_client, &nonce_account);
+    check_balance!(sol_to_lamports(200.0), &rpc_client, &payee_pubkey);
 }
 
 #[test]
 fn test_create_account_with_seed() {
-    const ONE_SIG_FEE: u64 = 5000;
+    const ONE_SIG_FEE: f64 = 0.000005;
     solana_logger::setup();
     let mint_keypair = Keypair::new();
     let mint_pubkey = mint_keypair.pubkey();
     let faucet_addr = run_local_faucet(mint_keypair, None);
     let test_validator = TestValidator::with_custom_fees(
         mint_pubkey,
-        ONE_SIG_FEE,
+        sol_to_lamports(ONE_SIG_FEE),
         Some(faucet_addr),
         SocketAddrSpace::Unspecified,
     );
@@ -237,23 +237,23 @@ fn test_create_account_with_seed() {
         &rpc_client,
         &CliConfig::recent_for_tests(),
         &offline_nonce_authority_signer.pubkey(),
-        42 * LAMPORTS_PER_SOL,
+        sol_to_lamports(42.0),
     )
     .unwrap();
     request_and_confirm_airdrop(
         &rpc_client,
         &CliConfig::recent_for_tests(),
         &online_nonce_creator_signer.pubkey(),
-        4242 * LAMPORTS_PER_SOL,
+        sol_to_lamports(4242.0),
     )
     .unwrap();
     check_balance!(
-        42 * LAMPORTS_PER_SOL,
+        sol_to_lamports(42.0),
         &rpc_client,
         &offline_nonce_authority_signer.pubkey(),
     );
     check_balance!(
-        4242 * LAMPORTS_PER_SOL,
+        sol_to_lamports(4242.0),
         &rpc_client,
         &online_nonce_creator_signer.pubkey(),
     );
@@ -277,18 +277,18 @@ fn test_create_account_with_seed() {
         seed: Some(seed),
         nonce_authority: Some(authority_pubkey),
         memo: None,
-        amount: SpendAmount::Some(241 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(241.0)),
         compute_unit_price: None,
     };
     process_command(&creator_config).unwrap();
-    check_balance!(241 * LAMPORTS_PER_SOL, &rpc_client, &nonce_address);
+    check_balance!(sol_to_lamports(241.0), &rpc_client, &nonce_address);
     check_balance!(
-        42 * LAMPORTS_PER_SOL,
+        sol_to_lamports(42.0),
         &rpc_client,
         &offline_nonce_authority_signer.pubkey(),
     );
     check_balance!(
-        4001 * LAMPORTS_PER_SOL - ONE_SIG_FEE,
+        sol_to_lamports(4001.0 - ONE_SIG_FEE),
         &rpc_client,
         &online_nonce_creator_signer.pubkey(),
     );
@@ -312,7 +312,7 @@ fn test_create_account_with_seed() {
     authority_config.command = CliCommand::ClusterVersion;
     process_command(&authority_config).unwrap_err();
     authority_config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(10 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(10.0)),
         to: to_address,
         from: 0,
         sign_only: true,
@@ -339,7 +339,7 @@ fn test_create_account_with_seed() {
     submit_config.json_rpc_url = test_validator.rpc_url();
     submit_config.signers = vec![&authority_presigner];
     submit_config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(10 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(10.0)),
         to: to_address,
         from: 0,
         sign_only: false,
@@ -359,16 +359,16 @@ fn test_create_account_with_seed() {
         compute_unit_price: None,
     };
     process_command(&submit_config).unwrap();
-    check_balance!(241 * LAMPORTS_PER_SOL, &rpc_client, &nonce_address);
+    check_balance!(sol_to_lamports(241.0), &rpc_client, &nonce_address);
     check_balance!(
-        32 * LAMPORTS_PER_SOL - ONE_SIG_FEE,
+        sol_to_lamports(32.0 - ONE_SIG_FEE),
         &rpc_client,
         &offline_nonce_authority_signer.pubkey(),
     );
     check_balance!(
-        4001 * LAMPORTS_PER_SOL - ONE_SIG_FEE,
+        sol_to_lamports(4001.0 - ONE_SIG_FEE),
         &rpc_client,
         &online_nonce_creator_signer.pubkey(),
     );
-    check_balance!(10 * LAMPORTS_PER_SOL, &rpc_client, &to_address);
+    check_balance!(sol_to_lamports(10.0), &rpc_client, &to_address);
 }

+ 3 - 3
cli/tests/request_airdrop.rs

@@ -4,7 +4,7 @@ use {
     solana_commitment_config::CommitmentConfig,
     solana_faucet::faucet::run_local_faucet,
     solana_keypair::Keypair,
-    solana_native_token::LAMPORTS_PER_SOL,
+    solana_native_token::sol_to_lamports,
     solana_rpc_client::rpc_client::RpcClient,
     solana_signer::Signer,
     solana_streamer::socket::SocketAddrSpace,
@@ -23,7 +23,7 @@ fn test_cli_request_airdrop() {
     bob_config.json_rpc_url = test_validator.rpc_url();
     bob_config.command = CliCommand::Airdrop {
         pubkey: None,
-        lamports: 50 * LAMPORTS_PER_SOL,
+        lamports: sol_to_lamports(50.0),
     };
     let keypair = Keypair::new();
     bob_config.signers = vec![&keypair];
@@ -37,5 +37,5 @@ fn test_cli_request_airdrop() {
     let balance = rpc_client
         .get_balance(&bob_config.signers[0].pubkey())
         .unwrap();
-    assert_eq!(balance, 50 * LAMPORTS_PER_SOL);
+    assert_eq!(balance, sol_to_lamports(50.0));
 }

+ 12 - 12
cli/tests/stake.rs

@@ -16,7 +16,7 @@ use {
     solana_fee_calculator::FeeRateGovernor,
     solana_fee_structure::FeeStructure,
     solana_keypair::{keypair_from_seed, Keypair},
-    solana_native_token::LAMPORTS_PER_SOL,
+    solana_native_token::sol_to_lamports,
     solana_nonce::state::State as NonceState,
     solana_pubkey::Pubkey,
     solana_rent::Rent,
@@ -318,7 +318,7 @@ fn test_stake_delegation_and_withdraw_available() {
         &rpc_client,
         &config_validator,
         &config_validator.signers[0].pubkey(),
-        100 * LAMPORTS_PER_SOL,
+        sol_to_lamports(100.0),
     )
     .unwrap();
     check_balance!(
@@ -336,7 +336,7 @@ fn test_stake_delegation_and_withdraw_available() {
         withdrawer: None,
         withdrawer_signer: None,
         lockup: Lockup::default(),
-        amount: SpendAmount::Some(50 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(50.0)),
         sign_only: false,
         dump_transaction_message: false,
         blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
@@ -395,10 +395,10 @@ fn test_stake_delegation_and_withdraw_available() {
         &rpc_client,
         &config_validator,
         &stake_keypair.pubkey(),
-        5 * LAMPORTS_PER_SOL,
+        sol_to_lamports(5.0),
     )
     .unwrap();
-    check_balance!(55 * LAMPORTS_PER_SOL, &rpc_client, &stake_keypair.pubkey());
+    check_balance!(sol_to_lamports(55.0), &rpc_client, &stake_keypair.pubkey());
 
     // Withdraw available stake
     config_validator.signers = vec![&validator_keypair];
@@ -420,7 +420,7 @@ fn test_stake_delegation_and_withdraw_available() {
     };
     process_command(&config_validator).unwrap();
     // Extra (inactive) SOL is withdrawn
-    check_balance!(5 * LAMPORTS_PER_SOL, &rpc_client, &recipient_pubkey);
+    check_balance!(sol_to_lamports(5.0), &rpc_client, &recipient_pubkey);
 
     // Deactivate stake
     config_validator.command = CliCommand::DeactivateStake {
@@ -459,7 +459,7 @@ fn test_stake_delegation_and_withdraw_available() {
     };
     process_command(&config_validator).unwrap();
     // Complete balance is withdrawn because all stake is inactive
-    check_balance!(55 * LAMPORTS_PER_SOL, &rpc_client, &recipient_pubkey);
+    check_balance!(sol_to_lamports(55.0), &rpc_client, &recipient_pubkey);
 }
 
 #[test]
@@ -487,7 +487,7 @@ fn test_stake_delegation_and_withdraw_all() {
         &rpc_client,
         &config_validator,
         &config_validator.signers[0].pubkey(),
-        100 * LAMPORTS_PER_SOL,
+        sol_to_lamports(100.0),
     )
     .unwrap();
     check_balance!(
@@ -505,7 +505,7 @@ fn test_stake_delegation_and_withdraw_all() {
         withdrawer: None,
         withdrawer_signer: None,
         lockup: Lockup::default(),
-        amount: SpendAmount::Some(50 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(50.0)),
         sign_only: false,
         dump_transaction_message: false,
         blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
@@ -561,10 +561,10 @@ fn test_stake_delegation_and_withdraw_all() {
         &rpc_client,
         &config_validator,
         &stake_keypair.pubkey(),
-        5 * LAMPORTS_PER_SOL,
+        sol_to_lamports(5.0),
     )
     .unwrap();
-    check_balance!(55 * LAMPORTS_PER_SOL, &rpc_client, &stake_keypair.pubkey());
+    check_balance!(sol_to_lamports(55.0), &rpc_client, &stake_keypair.pubkey());
 
     // Withdraw all stake still fails, because it attempts to withdraw both
     // activating and inactive stake
@@ -623,7 +623,7 @@ fn test_stake_delegation_and_withdraw_all() {
         compute_unit_price: None,
     };
     process_command(&config_validator).unwrap();
-    check_balance!(55 * LAMPORTS_PER_SOL, &rpc_client, &recipient_pubkey);
+    check_balance!(sol_to_lamports(55.0), &rpc_client, &recipient_pubkey);
 }
 
 #[test_case(None; "base")]

+ 47 - 41
cli/tests/transfer.rs

@@ -13,7 +13,7 @@ use {
     solana_fee_structure::FeeStructure,
     solana_keypair::{keypair_from_seed, Keypair},
     solana_message::Message,
-    solana_native_token::LAMPORTS_PER_SOL,
+    solana_native_token::sol_to_lamports,
     solana_nonce::state::State as NonceState,
     solana_pubkey::Pubkey,
     solana_rpc_client::rpc_client::RpcClient,
@@ -56,16 +56,16 @@ fn test_transfer(skip_preflight: bool) {
     let sender_pubkey = config.signers[0].pubkey();
     let recipient_pubkey = Pubkey::from([1u8; 32]);
 
-    request_and_confirm_airdrop(&rpc_client, &config, &sender_pubkey, 5 * LAMPORTS_PER_SOL)
+    request_and_confirm_airdrop(&rpc_client, &config, &sender_pubkey, sol_to_lamports(5.0))
         .unwrap();
-    check_balance!(5 * LAMPORTS_PER_SOL, &rpc_client, &sender_pubkey);
+    check_balance!(sol_to_lamports(5.0), &rpc_client, &sender_pubkey);
     check_balance!(0, &rpc_client, &recipient_pubkey);
 
     check_ready(&rpc_client);
 
     // Plain ole transfer
     config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(1.0)),
         to: recipient_pubkey,
         from: 0,
         sign_only: false,
@@ -83,15 +83,15 @@ fn test_transfer(skip_preflight: bool) {
     };
     process_command(&config).unwrap();
     check_balance!(
-        4 * LAMPORTS_PER_SOL - fee_one_sig,
+        sol_to_lamports(4.0) - fee_one_sig,
         &rpc_client,
         &sender_pubkey
     );
-    check_balance!(LAMPORTS_PER_SOL, &rpc_client, &recipient_pubkey);
+    check_balance!(sol_to_lamports(1.0), &rpc_client, &recipient_pubkey);
 
     // Plain ole transfer, failure due to InsufficientFundsForSpendAndFee
     config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(4 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(4.0)),
         to: recipient_pubkey,
         from: 0,
         sign_only: false,
@@ -109,11 +109,11 @@ fn test_transfer(skip_preflight: bool) {
     };
     assert!(process_command(&config).is_err());
     check_balance!(
-        4 * LAMPORTS_PER_SOL - fee_one_sig,
+        sol_to_lamports(4.0) - fee_one_sig,
         &rpc_client,
         &sender_pubkey
     );
-    check_balance!(LAMPORTS_PER_SOL, &rpc_client, &recipient_pubkey);
+    check_balance!(sol_to_lamports(1.0), &rpc_client, &recipient_pubkey);
 
     let mut offline = CliConfig::recent_for_tests();
     offline.json_rpc_url = String::default();
@@ -123,13 +123,14 @@ fn test_transfer(skip_preflight: bool) {
     process_command(&offline).unwrap_err();
 
     let offline_pubkey = offline.signers[0].pubkey();
-    request_and_confirm_airdrop(&rpc_client, &offline, &offline_pubkey, LAMPORTS_PER_SOL).unwrap();
-    check_balance!(LAMPORTS_PER_SOL, &rpc_client, &offline_pubkey);
+    request_and_confirm_airdrop(&rpc_client, &offline, &offline_pubkey, sol_to_lamports(1.0))
+        .unwrap();
+    check_balance!(sol_to_lamports(1.0), &rpc_client, &offline_pubkey);
 
     // Offline transfer
     let blockhash = rpc_client.get_latest_blockhash().unwrap();
     offline.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(LAMPORTS_PER_SOL / 2),
+        amount: SpendAmount::Some(sol_to_lamports(0.5)),
         to: recipient_pubkey,
         from: 0,
         sign_only: true,
@@ -152,7 +153,7 @@ fn test_transfer(skip_preflight: bool) {
     let offline_presigner = sign_only.presigner_of(&offline_pubkey).unwrap();
     config.signers = vec![&offline_presigner];
     config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(LAMPORTS_PER_SOL / 2),
+        amount: SpendAmount::Some(sol_to_lamports(0.5)),
         to: recipient_pubkey,
         from: 0,
         sign_only: false,
@@ -170,11 +171,11 @@ fn test_transfer(skip_preflight: bool) {
     };
     process_command(&config).unwrap();
     check_balance!(
-        LAMPORTS_PER_SOL / 2 - fee_one_sig,
+        sol_to_lamports(0.5) - fee_one_sig,
         &rpc_client,
         &offline_pubkey
     );
-    check_balance!(1_500_000_000, &rpc_client, &recipient_pubkey);
+    check_balance!(sol_to_lamports(1.5), &rpc_client, &recipient_pubkey);
 
     // Create nonce account
     let nonce_account = keypair_from_seed(&[3u8; 32]).unwrap();
@@ -192,7 +193,7 @@ fn test_transfer(skip_preflight: bool) {
     };
     process_command(&config).unwrap();
     check_balance!(
-        4 * LAMPORTS_PER_SOL - fee_one_sig - fee_two_sig - minimum_nonce_balance,
+        sol_to_lamports(4.0) - fee_one_sig - fee_two_sig - minimum_nonce_balance,
         &rpc_client,
         &sender_pubkey,
     );
@@ -210,7 +211,7 @@ fn test_transfer(skip_preflight: bool) {
     // Nonced transfer
     config.signers = vec![&default_signer];
     config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(1.0)),
         to: recipient_pubkey,
         from: 0,
         sign_only: false,
@@ -231,11 +232,11 @@ fn test_transfer(skip_preflight: bool) {
     };
     process_command(&config).unwrap();
     check_balance!(
-        3 * LAMPORTS_PER_SOL - 2 * fee_one_sig - fee_two_sig - minimum_nonce_balance,
+        sol_to_lamports(3.0) - 2 * fee_one_sig - fee_two_sig - minimum_nonce_balance,
         &rpc_client,
         &sender_pubkey,
     );
-    check_balance!(2_500_000_000, &rpc_client, &recipient_pubkey);
+    check_balance!(sol_to_lamports(2.5), &rpc_client, &recipient_pubkey);
     let new_nonce_hash = solana_rpc_client_nonce_utils::get_account_with_commitment(
         &rpc_client,
         &nonce_account.pubkey(),
@@ -257,7 +258,7 @@ fn test_transfer(skip_preflight: bool) {
     };
     process_command(&config).unwrap();
     check_balance!(
-        3 * LAMPORTS_PER_SOL - 3 * fee_one_sig - fee_two_sig - minimum_nonce_balance,
+        sol_to_lamports(3.0) - 3 * fee_one_sig - fee_two_sig - minimum_nonce_balance,
         &rpc_client,
         &sender_pubkey,
     );
@@ -275,7 +276,7 @@ fn test_transfer(skip_preflight: bool) {
     // Offline, nonced transfer
     offline.signers = vec![&default_offline_signer];
     offline.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(400_000_000),
+        amount: SpendAmount::Some(sol_to_lamports(0.4)),
         to: recipient_pubkey,
         from: 0,
         sign_only: true,
@@ -297,7 +298,7 @@ fn test_transfer(skip_preflight: bool) {
     let offline_presigner = sign_only.presigner_of(&offline_pubkey).unwrap();
     config.signers = vec![&offline_presigner];
     config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(400_000_000),
+        amount: SpendAmount::Some(sol_to_lamports(0.4)),
         to: recipient_pubkey,
         from: 0,
         sign_only: false,
@@ -318,11 +319,11 @@ fn test_transfer(skip_preflight: bool) {
     };
     process_command(&config).unwrap();
     check_balance!(
-        LAMPORTS_PER_SOL / 10 - 2 * fee_one_sig,
+        sol_to_lamports(0.1) - 2 * fee_one_sig,
         &rpc_client,
         &offline_pubkey
     );
-    check_balance!(2_900_000_000, &rpc_client, &recipient_pubkey);
+    check_balance!(sol_to_lamports(2.9), &rpc_client, &recipient_pubkey);
 }
 
 #[test]
@@ -352,23 +353,23 @@ fn test_transfer_multisession_signing() {
         &rpc_client,
         &CliConfig::recent_for_tests(),
         &offline_from_signer.pubkey(),
-        43 * LAMPORTS_PER_SOL,
+        sol_to_lamports(43.0),
     )
     .unwrap();
     request_and_confirm_airdrop(
         &rpc_client,
         &CliConfig::recent_for_tests(),
         &offline_fee_payer_signer.pubkey(),
-        LAMPORTS_PER_SOL + 2 * fee_two_sig,
+        sol_to_lamports(1.0) + 2 * fee_two_sig,
     )
     .unwrap();
     check_balance!(
-        43 * LAMPORTS_PER_SOL,
+        sol_to_lamports(43.0),
         &rpc_client,
         &offline_from_signer.pubkey(),
     );
     check_balance!(
-        LAMPORTS_PER_SOL + 2 * fee_two_sig,
+        sol_to_lamports(1.0) + 2 * fee_two_sig,
         &rpc_client,
         &offline_fee_payer_signer.pubkey(),
     );
@@ -386,7 +387,7 @@ fn test_transfer_multisession_signing() {
     fee_payer_config.command = CliCommand::ClusterVersion;
     process_command(&fee_payer_config).unwrap_err();
     fee_payer_config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(42 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(42.0)),
         to: to_pubkey,
         from: 1,
         sign_only: true,
@@ -418,7 +419,7 @@ fn test_transfer_multisession_signing() {
     from_config.command = CliCommand::ClusterVersion;
     process_command(&from_config).unwrap_err();
     from_config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(42 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(42.0)),
         to: to_pubkey,
         from: 1,
         sign_only: true,
@@ -447,7 +448,7 @@ fn test_transfer_multisession_signing() {
     config.json_rpc_url = test_validator.rpc_url();
     config.signers = vec![&fee_payer_presigner, &from_presigner];
     config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(42 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(42.0)),
         to: to_pubkey,
         from: 1,
         sign_only: false,
@@ -465,13 +466,17 @@ fn test_transfer_multisession_signing() {
     };
     process_command(&config).unwrap();
 
-    check_balance!(LAMPORTS_PER_SOL, &rpc_client, &offline_from_signer.pubkey(),);
     check_balance!(
-        LAMPORTS_PER_SOL + fee_two_sig,
+        sol_to_lamports(1.0),
+        &rpc_client,
+        &offline_from_signer.pubkey(),
+    );
+    check_balance!(
+        sol_to_lamports(1.0) + fee_two_sig,
         &rpc_client,
         &offline_fee_payer_signer.pubkey(),
     );
-    check_balance!(42 * LAMPORTS_PER_SOL, &rpc_client, &to_pubkey);
+    check_balance!(sol_to_lamports(42.0), &rpc_client, &to_pubkey);
 }
 
 #[test_case(None; "default")]
@@ -642,18 +647,19 @@ fn test_transfer_with_seed() {
     )
     .unwrap();
 
-    request_and_confirm_airdrop(&rpc_client, &config, &sender_pubkey, LAMPORTS_PER_SOL).unwrap();
-    request_and_confirm_airdrop(&rpc_client, &config, &derived_address, 5 * LAMPORTS_PER_SOL)
+    request_and_confirm_airdrop(&rpc_client, &config, &sender_pubkey, sol_to_lamports(1.0))
+        .unwrap();
+    request_and_confirm_airdrop(&rpc_client, &config, &derived_address, sol_to_lamports(5.0))
         .unwrap();
-    check_balance!(LAMPORTS_PER_SOL, &rpc_client, &sender_pubkey);
-    check_balance!(5 * LAMPORTS_PER_SOL, &rpc_client, &derived_address);
+    check_balance!(sol_to_lamports(1.0), &rpc_client, &sender_pubkey);
+    check_balance!(sol_to_lamports(5.0), &rpc_client, &derived_address);
     check_balance!(0, &rpc_client, &recipient_pubkey);
 
     check_ready(&rpc_client);
 
     // Transfer with seed
     config.command = CliCommand::Transfer {
-        amount: SpendAmount::Some(5 * LAMPORTS_PER_SOL),
+        amount: SpendAmount::Some(sol_to_lamports(5.0)),
         to: recipient_pubkey,
         from: 0,
         sign_only: false,
@@ -670,7 +676,7 @@ fn test_transfer_with_seed() {
         compute_unit_price: None,
     };
     process_command(&config).unwrap();
-    check_balance!(LAMPORTS_PER_SOL - fee, &rpc_client, &sender_pubkey);
-    check_balance!(5 * LAMPORTS_PER_SOL, &rpc_client, &recipient_pubkey);
+    check_balance!(sol_to_lamports(1.0) - fee, &rpc_client, &sender_pubkey);
+    check_balance!(sol_to_lamports(5.0), &rpc_client, &recipient_pubkey);
     check_balance!(0, &rpc_client, &derived_address);
 }

+ 5 - 5
cli/tests/vote.rs

@@ -64,7 +64,7 @@ fn test_vote_authorize_and_withdraw(compute_unit_price: Option<u64>) {
         .get_account(&vote_account_keypair.pubkey())
         .unwrap();
     let vote_state: VoteStateVersions = vote_account.state().unwrap();
-    let authorized_withdrawer = vote_state.convert_to_v3().authorized_withdrawer;
+    let authorized_withdrawer = vote_state.convert_to_current().authorized_withdrawer;
     assert_eq!(authorized_withdrawer, config.signers[0].pubkey());
     let expected_balance = rpc_client
         .get_minimum_balance_for_rent_exemption(VoteStateV3::size_of())
@@ -118,7 +118,7 @@ fn test_vote_authorize_and_withdraw(compute_unit_price: Option<u64>) {
         .get_account(&vote_account_keypair.pubkey())
         .unwrap();
     let vote_state: VoteStateVersions = vote_account.state().unwrap();
-    let authorized_withdrawer = vote_state.convert_to_v3().authorized_withdrawer;
+    let authorized_withdrawer = vote_state.convert_to_current().authorized_withdrawer;
     assert_eq!(authorized_withdrawer, first_withdraw_authority.pubkey());
 
     // Authorize vote account withdrawal to another signer with checked instruction
@@ -165,7 +165,7 @@ fn test_vote_authorize_and_withdraw(compute_unit_price: Option<u64>) {
         .get_account(&vote_account_keypair.pubkey())
         .unwrap();
     let vote_state: VoteStateVersions = vote_account.state().unwrap();
-    let authorized_withdrawer = vote_state.convert_to_v3().authorized_withdrawer;
+    let authorized_withdrawer = vote_state.convert_to_current().authorized_withdrawer;
     assert_eq!(authorized_withdrawer, withdraw_authority.pubkey());
 
     // Withdraw from vote account
@@ -292,7 +292,7 @@ fn test_offline_vote_authorize_and_withdraw(compute_unit_price: Option<u64>) {
         .get_account(&vote_account_keypair.pubkey())
         .unwrap();
     let vote_state: VoteStateVersions = vote_account.state().unwrap();
-    let authorized_withdrawer = vote_state.convert_to_v3().authorized_withdrawer;
+    let authorized_withdrawer = vote_state.convert_to_current().authorized_withdrawer;
     assert_eq!(authorized_withdrawer, offline_keypair.pubkey());
     let expected_balance = rpc_client
         .get_minimum_balance_for_rent_exemption(VoteStateV3::size_of())
@@ -369,7 +369,7 @@ fn test_offline_vote_authorize_and_withdraw(compute_unit_price: Option<u64>) {
         .get_account(&vote_account_keypair.pubkey())
         .unwrap();
     let vote_state: VoteStateVersions = vote_account.state().unwrap();
-    let authorized_withdrawer = vote_state.convert_to_v3().authorized_withdrawer;
+    let authorized_withdrawer = vote_state.convert_to_current().authorized_withdrawer;
     assert_eq!(authorized_withdrawer, withdraw_authority.pubkey());
 
     // Withdraw from vote account offline

+ 4 - 4
client-test/tests/client.rs

@@ -5,7 +5,7 @@ use {
     solana_commitment_config::{CommitmentConfig, CommitmentLevel},
     solana_keypair::Keypair,
     solana_ledger::{blockstore::Blockstore, get_tmp_ledger_path_auto_delete},
-    solana_native_token::LAMPORTS_PER_SOL,
+    solana_native_token::sol_to_lamports,
     solana_pubkey::Pubkey,
     solana_pubsub_client::{nonblocking, pubsub_client::PubsubClient},
     solana_rpc::{
@@ -80,7 +80,7 @@ fn test_rpc_client() {
 
     let blockhash = client.get_latest_blockhash().unwrap();
 
-    let tx = system_transaction::transfer(&alice, &bob_pubkey, 20 * LAMPORTS_PER_SOL, blockhash);
+    let tx = system_transaction::transfer(&alice, &bob_pubkey, sol_to_lamports(20.0), blockhash);
     let signature = client.send_transaction(&tx).unwrap();
 
     let mut confirmed_tx = false;
@@ -106,14 +106,14 @@ fn test_rpc_client() {
             .get_balance_with_commitment(&bob_pubkey, CommitmentConfig::processed())
             .unwrap()
             .value,
-        20 * LAMPORTS_PER_SOL
+        sol_to_lamports(20.0)
     );
     assert_eq!(
         client
             .get_balance_with_commitment(&alice.pubkey(), CommitmentConfig::processed())
             .unwrap()
             .value,
-        original_alice_balance - 20 * LAMPORTS_PER_SOL
+        original_alice_balance - sol_to_lamports(20.0)
     );
 }
 

+ 10 - 10
client-test/tests/send_and_confirm_transactions_in_parallel.rs

@@ -9,7 +9,7 @@ use {
     solana_commitment_config::CommitmentConfig,
     solana_keypair::Keypair,
     solana_message::Message,
-    solana_native_token::LAMPORTS_PER_SOL,
+    solana_native_token::sol_to_lamports,
     solana_pubkey::Pubkey,
     solana_rpc_client::rpc_client::RpcClient,
     solana_signer::Signer,
@@ -21,15 +21,15 @@ use {
 
 const NUM_TRANSACTIONS: usize = 1000;
 
-fn create_messages(from: Pubkey, to: Pubkey) -> (Vec<Message>, u64) {
+fn create_messages(from: Pubkey, to: Pubkey) -> (Vec<Message>, f64) {
     let mut messages = vec![];
-    let mut sum = 0u64;
+    let mut sum = 0.0;
     for i in 1..NUM_TRANSACTIONS {
-        let amount_to_transfer = (i as u64).checked_mul(LAMPORTS_PER_SOL).unwrap();
-        let ix = system_instruction::transfer(&from, &to, amount_to_transfer);
+        let amount_to_transfer = i as f64;
+        let ix = system_instruction::transfer(&from, &to, sol_to_lamports(amount_to_transfer));
         let message = Message::new(&[ix], Some(&from));
         messages.push(message);
-        sum = sum.checked_add(amount_to_transfer).unwrap();
+        sum += amount_to_transfer;
     }
     (messages, sum)
 }
@@ -80,14 +80,14 @@ fn test_send_and_confirm_transactions_in_parallel_without_tpu_client() {
             .get_balance_with_commitment(&bob_pubkey, CommitmentConfig::processed())
             .unwrap()
             .value,
-        sum
+        sol_to_lamports(sum)
     );
     assert_eq!(
         rpc_client
             .get_balance_with_commitment(&alice_pubkey, CommitmentConfig::processed())
             .unwrap()
             .value,
-        original_alice_balance - sum
+        original_alice_balance - sol_to_lamports(sum)
     );
 }
 
@@ -145,13 +145,13 @@ fn test_send_and_confirm_transactions_in_parallel_with_tpu_client() {
             .get_balance_with_commitment(&bob_pubkey, CommitmentConfig::processed())
             .unwrap()
             .value,
-        sum
+        sol_to_lamports(sum)
     );
     assert_eq!(
         rpc_client
             .get_balance_with_commitment(&alice_pubkey, CommitmentConfig::processed())
             .unwrap()
             .value,
-        original_alice_balance - sum
+        original_alice_balance - sol_to_lamports(sum)
     );
 }

+ 0 - 1
core/Cargo.toml

@@ -89,7 +89,6 @@ solana-bloom = { workspace = true }
 solana-builtins-default-costs = { workspace = true }
 solana-client = { workspace = true }
 solana-clock = { workspace = true }
-solana-cluster-type = { workspace = true }
 solana-compute-budget = { workspace = true }
 solana-compute-budget-instruction = { workspace = true }
 solana-compute-budget-interface = { workspace = true }

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

@@ -1560,7 +1560,7 @@ mod tests {
             mut genesis_config,
             mint_keypair,
             ..
-        } = create_slow_genesis_config(solana_native_token::LAMPORTS_PER_SOL * 1000);
+        } = create_slow_genesis_config(solana_native_token::sol_to_lamports(1000.0));
         genesis_config.rent.lamports_per_byte_year = 50;
         genesis_config.rent.exemption_threshold = 2.0;
         let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);

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

@@ -4,7 +4,7 @@ use {
     solana_compute_budget::compute_budget_limits::ComputeBudgetLimits,
     solana_compute_budget_instruction::instructions_processor::process_compute_budget_instructions,
     solana_hash::Hash,
-    solana_message::{v0::LoadedAddresses, Message, SimpleAddressLoader},
+    solana_message::{v0::LoadedAddresses, AddressLoaderError, Message, SimpleAddressLoader},
     solana_perf::packet::PacketRef,
     solana_pubkey::Pubkey,
     solana_runtime::bank::Bank,
@@ -19,7 +19,6 @@ use {
         sanitized::{MessageHash, SanitizedTransaction},
         versioned::{sanitized::SanitizedVersionedTransaction, VersionedTransaction},
     },
-    solana_transaction_error::AddressLoaderError,
     std::{cmp::Ordering, collections::HashSet, mem::size_of},
     thiserror::Error,
 };

+ 4 - 4
core/src/commitment_service.rs

@@ -467,7 +467,7 @@ mod tests {
         process_slot_vote_unchecked(&mut vote_state1, 3);
         process_slot_vote_unchecked(&mut vote_state1, 5);
         if !with_node_vote_state {
-            let versioned = VoteStateVersions::new_v3(vote_state1.clone());
+            let versioned = VoteStateVersions::new_current(vote_state1.clone());
             vote_state::to(&versioned, &mut vote_account1).unwrap();
             bank.store_account(&pk1, &vote_account1);
         }
@@ -475,19 +475,19 @@ mod tests {
         let mut vote_state2 = vote_state::from(&vote_account2).unwrap();
         process_slot_vote_unchecked(&mut vote_state2, 9);
         process_slot_vote_unchecked(&mut vote_state2, 10);
-        let versioned = VoteStateVersions::new_v3(vote_state2);
+        let versioned = VoteStateVersions::new_current(vote_state2);
         vote_state::to(&versioned, &mut vote_account2).unwrap();
         bank.store_account(&pk2, &vote_account2);
 
         let mut vote_state3 = vote_state::from(&vote_account3).unwrap();
         vote_state3.root_slot = Some(1);
-        let versioned = VoteStateVersions::new_v3(vote_state3);
+        let versioned = VoteStateVersions::new_current(vote_state3);
         vote_state::to(&versioned, &mut vote_account3).unwrap();
         bank.store_account(&pk3, &vote_account3);
 
         let mut vote_state4 = vote_state::from(&vote_account4).unwrap();
         vote_state4.root_slot = Some(2);
-        let versioned = VoteStateVersions::new_v3(vote_state4);
+        let versioned = VoteStateVersions::new_current(vote_state4);
         vote_state::to(&versioned, &mut vote_account4).unwrap();
         bank.store_account(&pk4, &vote_account4);
 

+ 5 - 5
core/src/consensus.rs

@@ -1788,7 +1788,7 @@ pub mod test {
         solana_slot_history::SlotHistory,
         solana_vote::vote_account::VoteAccount,
         solana_vote_program::vote_state::{
-            process_slot_vote_unchecked, Vote, VoteStateV3, VoteStateVersions, MAX_LOCKOUT_HISTORY,
+            process_slot_vote_unchecked, Vote, VoteState, VoteStateVersions, MAX_LOCKOUT_HISTORY,
         },
         std::{
             collections::{HashMap, VecDeque},
@@ -1806,17 +1806,17 @@ pub mod test {
             .iter()
             .map(|(lamports, votes)| {
                 let mut account = AccountSharedData::from(Account {
-                    data: vec![0; VoteStateV3::size_of()],
+                    data: vec![0; VoteState::size_of()],
                     lamports: *lamports,
                     owner: solana_vote_program::id(),
                     ..Account::default()
                 });
-                let mut vote_state = VoteStateV3::default();
+                let mut vote_state = VoteState::default();
                 for slot in *votes {
                     process_slot_vote_unchecked(&mut vote_state, *slot);
                 }
-                VoteStateV3::serialize(
-                    &VoteStateVersions::new_v3(vote_state),
+                VoteState::serialize(
+                    &VoteStateVersions::new_current(vote_state),
                     account.data_as_mut_slice(),
                 )
                 .expect("serialize state");

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

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

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

@@ -10,7 +10,7 @@ use {
 #[cfg_attr(
     feature = "frozen-abi",
     derive(AbiExample),
-    frozen_abi(digest = "FJeuD6UBJe9D8s6iWwianu6KcnJxSozHxDpPQMTrkNJK")
+    frozen_abi(digest = "FCocsqtauW2QfMz2hXDd5DCwJBw9NBFoq3CokeiDLMqv")
 )]
 #[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
 pub struct Tower1_7_14 {

+ 2 - 2
core/src/consensus/tower_storage.rs

@@ -380,7 +380,7 @@ pub mod test {
         solana_keypair::Keypair,
         solana_vote::vote_transaction::VoteTransaction,
         solana_vote_program::vote_state::{
-            BlockTimestamp, LandedVote, Vote, VoteState1_14_11, VoteStateV3, MAX_LOCKOUT_HISTORY,
+            BlockTimestamp, LandedVote, Vote, VoteState, VoteState1_14_11, MAX_LOCKOUT_HISTORY,
         },
         tempfile::TempDir,
     };
@@ -390,7 +390,7 @@ pub mod test {
         let tower_path = TempDir::new().unwrap();
         let identity_keypair = Keypair::new();
         let node_pubkey = identity_keypair.pubkey();
-        let mut vote_state = VoteStateV3::default();
+        let mut vote_state = VoteState::default();
         vote_state
             .votes
             .resize(MAX_LOCKOUT_HISTORY, LandedVote::default());

+ 1 - 1
core/src/repair/ancestor_hashes_service.rs

@@ -20,7 +20,7 @@ use {
     crossbeam_channel::{unbounded, Receiver, RecvTimeoutError, Sender},
     dashmap::{mapref::entry::Entry::Occupied, DashMap},
     solana_clock::{Slot, DEFAULT_MS_PER_SLOT},
-    solana_cluster_type::ClusterType,
+    solana_genesis_config::ClusterType,
     solana_gossip::{cluster_info::ClusterInfo, contact_info::Protocol, ping_pong::Pong},
     solana_keypair::{signable::Signable, Keypair},
     solana_ledger::blockstore::Blockstore,

+ 2 - 2
core/src/repair/serve_repair.rs

@@ -25,7 +25,7 @@ use {
         Rng,
     },
     solana_clock::Slot,
-    solana_cluster_type::ClusterType,
+    solana_genesis_config::ClusterType,
     solana_gossip::{
         cluster_info::{ClusterInfo, ClusterInfoError},
         contact_info::{ContactInfo, Protocol},
@@ -229,7 +229,7 @@ type PingCache = ping_pong::PingCache<REPAIR_PING_TOKEN_SIZE>;
 #[cfg_attr(
     feature = "frozen-abi",
     derive(AbiEnumVisitor, AbiExample),
-    frozen_abi(digest = "FGw38CCo7vg24qxe7TfGP11WdX2poe6T55BGN1r3XMFA")
+    frozen_abi(digest = "9KN64WUT7XDYj9zZopS1hztGyAP9y4N4QznsyC4mqsGs")
 )]
 #[derive(Debug, Deserialize, Serialize)]
 pub enum RepairProtocol {

+ 2 - 2
core/src/replay_stage.rs

@@ -5155,7 +5155,7 @@ pub(crate) mod tests {
             let mut leader_vote_account = bank.get_account(pubkey).unwrap();
             let mut vote_state = vote_state::from(&leader_vote_account).unwrap();
             vote_state::process_slot_vote_unchecked(&mut vote_state, vote_slot);
-            let versioned = VoteStateVersions::new_v3(vote_state.clone());
+            let versioned = VoteStateVersions::new_current(vote_state.clone());
             vote_state::to(&versioned, &mut leader_vote_account).unwrap();
             bank.store_account(pubkey, &leader_vote_account);
             (*pubkey, TowerVoteState::from(vote_state))
@@ -5285,7 +5285,7 @@ pub(crate) mod tests {
             mut genesis_config,
             mint_keypair,
             ..
-        } = create_genesis_config(solana_native_token::LAMPORTS_PER_SOL * 1000);
+        } = create_genesis_config(solana_native_token::sol_to_lamports(1000.0));
         genesis_config.rent.lamports_per_byte_year = 50;
         genesis_config.rent.exemption_threshold = 2.0;
         let (ledger_path, _) = create_new_tmp_ledger!(&genesis_config);

+ 1 - 2
core/src/validator.rs

@@ -41,10 +41,9 @@ use {
     },
     solana_client::connection_cache::{ConnectionCache, Protocol},
     solana_clock::Slot,
-    solana_cluster_type::ClusterType,
     solana_entry::poh::compute_hash_time,
     solana_epoch_schedule::MAX_LEADER_SCHEDULE_EPOCH_OFFSET,
-    solana_genesis_config::GenesisConfig,
+    solana_genesis_config::{ClusterType, GenesisConfig},
     solana_geyser_plugin_manager::{
         geyser_plugin_service::GeyserPluginService, GeyserPluginManagerRequest,
     },

+ 2 - 2
core/tests/scheduler_cost_adjustment.rs

@@ -10,7 +10,7 @@ use {
     solana_keypair::Keypair,
     solana_loader_v3_interface::state::UpgradeableLoaderState,
     solana_message::Message,
-    solana_native_token::LAMPORTS_PER_SOL,
+    solana_native_token::sol_to_lamports,
     solana_pubkey::Pubkey,
     solana_rent::Rent,
     solana_runtime::{bank::Bank, bank_forks::BankForks},
@@ -58,7 +58,7 @@ struct TestSetup {
 
 impl TestSetup {
     fn new() -> Self {
-        let (mut genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
+        let (mut genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
         genesis_config.rent = Rent::default();
         Self {
             genesis_config,

+ 12 - 12
faucet/Cargo.toml

@@ -29,20 +29,20 @@ serde = { workspace = true }
 serde_derive = { workspace = true }
 solana-clap-utils = { workspace = true }
 solana-cli-config = { workspace = true }
-solana-cli-output = { workspace = true }
-solana-hash = "=3.0.0"
-solana-instruction = "=3.0.0"
-solana-keypair = "=3.0.0"
+solana-hash = "=2.3.0"
+solana-instruction = "=2.3.0"
+solana-keypair = "=2.2.1"
 solana-logger = "=3.0.0"
-solana-message = "=3.0.0"
+solana-message = "=2.4.0"
 solana-metrics = { workspace = true }
-solana-packet = "=3.0.0"
-solana-pubkey = { version = "=3.0.0", features = ["rand"] }
-solana-signer = "=3.0.0"
-solana-system-interface = "=2.0"
-solana-system-transaction = "=3.0.0"
-solana-transaction = "=3.0.0"
+solana-native-token = "=2.2.2"
+solana-packet = "=2.2.1"
+solana-pubkey = { version = "=2.4.0", features = ["rand"] }
+solana-signer = "=2.2.1"
+solana-system-interface = "=1.0"
+solana-system-transaction = "=2.2.1"
+solana-transaction = "=2.2.3"
 solana-version = { workspace = true }
-spl-memo-interface = { version = "=2.0.0" }
+spl-memo-interface = { version = "=1.0.0" }
 thiserror = { workspace = true }
 tokio = { workspace = true, features = ["full"] }

+ 11 - 11
faucet/src/faucet.rs

@@ -9,12 +9,12 @@ use {
     crossbeam_channel::{unbounded, Sender},
     log::*,
     serde_derive::{Deserialize, Serialize},
-    solana_cli_output::display::build_balance_message,
     solana_hash::Hash,
     solana_instruction::Instruction,
     solana_keypair::Keypair,
     solana_message::Message,
     solana_metrics::datapoint_info,
+    solana_native_token::lamports_to_sol,
     solana_packet::PACKET_DATA_SIZE,
     solana_pubkey::Pubkey,
     solana_signer::Signer,
@@ -67,10 +67,10 @@ pub enum FaucetError {
     NoDataReceived,
 
     #[error("request too large; req: ◎{0}, cap: ◎{1}")]
-    PerRequestCapExceeded(String, String),
+    PerRequestCapExceeded(f64, f64),
 
     #[error("limit reached; req: ◎{0}, to: {1}, current: ◎{2}, cap: ◎{3}")]
-    PerTimeCapExceeded(String, String, String, String),
+    PerTimeCapExceeded(f64, String, f64, f64),
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Copy)]
@@ -126,8 +126,8 @@ impl Faucet {
                 warn!(
                     "per_time_cap {} SOL < per_request_cap {} SOL; \
                     maximum single requests will fail",
-                    build_balance_message(per_time_cap, false, false),
-                    build_balance_message(per_request_cap, false, false),
+                    lamports_to_sol(per_time_cap),
+                    lamports_to_sol(per_request_cap),
                 );
             }
         }
@@ -152,10 +152,10 @@ impl Faucet {
         if let Some(cap) = self.per_time_cap {
             if new_total > cap {
                 return Err(FaucetError::PerTimeCapExceeded(
-                    build_balance_message(request_amount, false, false),
+                    lamports_to_sol(request_amount),
                     to.to_string(),
-                    build_balance_message(new_total, false, false),
-                    build_balance_message(cap, false, false),
+                    lamports_to_sol(new_total),
+                    lamports_to_sol(cap),
                 ));
             }
         }
@@ -186,7 +186,7 @@ impl Faucet {
                 let mint_pubkey = self.faucet_keypair.pubkey();
                 info!(
                     "Requesting airdrop of {} SOL to {:?}",
-                    build_balance_message(lamports, false, false),
+                    lamports_to_sol(lamports),
                     to
                 );
 
@@ -195,8 +195,8 @@ impl Faucet {
                         let memo = format!(
                             "{}",
                             FaucetError::PerRequestCapExceeded(
-                                build_balance_message(lamports, false, false),
-                                build_balance_message(cap, false, false),
+                                lamports_to_sol(lamports),
+                                lamports_to_sol(cap),
                             )
                         );
                         let memo_instruction = Instruction {

+ 18 - 19
genesis/Cargo.toml

@@ -28,35 +28,34 @@ itertools = { workspace = true }
 serde = { workspace = true }
 serde_json = { workspace = true }
 serde_yaml = { workspace = true }
-solana-account = "=3.0.0"
+solana-account = "=2.2.1"
 solana-accounts-db = { workspace = true }
 solana-clap-utils = { workspace = true }
 solana-cli-config = { workspace = true }
-solana-clock = "=3.0.0"
-solana-cluster-type = "=3.0.0"
-solana-commitment-config = "=3.0.0"
+solana-clock = "=2.2.2"
+solana-commitment-config = "=2.2.1"
 solana-entry = { workspace = true }
-solana-epoch-schedule = "=3.0.0"
-solana-feature-gate-interface = "=3.0.0"
-solana-fee-calculator = "=3.0.0"
-solana-genesis-config = "=3.0.0"
-solana-inflation = "=3.0.0"
-solana-keypair = "=3.0.0"
+solana-epoch-schedule = "=2.2.1"
+solana-feature-gate-interface = "=2.2.2"
+solana-fee-calculator = "=2.2.1"
+solana-genesis-config = "=2.3.0"
+solana-inflation = "=2.2.1"
+solana-keypair = "=2.2.1"
 solana-ledger = { workspace = true }
-solana-loader-v3-interface = "6.1.0"
+solana-loader-v3-interface = "5.0.0"
 solana-logger = "=3.0.0"
-solana-native-token = "=3.0.0"
-solana-poh-config = "=3.0.0"
-solana-pubkey = { version = "=3.0.0", default-features = false }
-solana-rent = "=3.0.0"
+solana-native-token = "=2.2.2"
+solana-poh-config = "=2.2.1"
+solana-pubkey = { version = "=2.4.0", default-features = false }
+solana-rent = "=2.2.1"
 solana-rpc-client = { workspace = true }
 solana-rpc-client-api = { workspace = true }
 solana-runtime = { workspace = true }
-solana-sdk-ids = "=3.0.0"
-solana-signer = "=3.0.0"
-solana-stake-interface = { version = "=2.0.0", features = ["borsh"] }
+solana-sdk-ids = "=2.2.1"
+solana-signer = "=2.2.1"
+solana-stake-interface = "=1.2.1"
 solana-stake-program = { workspace = true }
-solana-time-utils = "3.0.0"
+solana-time-utils = "2.2.1"
 solana-version = { workspace = true }
 solana-vote-program = { workspace = true }
 tempfile = { workspace = true }

+ 1 - 2
genesis/src/genesis_accounts.rs

@@ -3,8 +3,7 @@ use {
         stakes::{create_and_add_stakes, StakerInfo},
         unlocks::UnlockInfo,
     },
-    solana_cluster_type::ClusterType,
-    solana_genesis_config::GenesisConfig,
+    solana_genesis_config::{ClusterType, GenesisConfig},
     solana_native_token::LAMPORTS_PER_SOL,
 };
 

+ 5 - 6
genesis/src/main.rs

@@ -18,7 +18,6 @@ use {
         },
     },
     solana_clock as clock,
-    solana_cluster_type::ClusterType,
     solana_commitment_config::CommitmentConfig,
     solana_entry::poh::compute_hashes_per_tick,
     solana_epoch_schedule::EpochSchedule,
@@ -28,12 +27,12 @@ use {
         genesis_accounts::add_genesis_accounts, Base64Account, StakedValidatorAccountInfo,
         ValidatorAccountsFile,
     },
-    solana_genesis_config::GenesisConfig,
+    solana_genesis_config::{ClusterType, GenesisConfig},
     solana_inflation::Inflation,
     solana_keypair::{read_keypair_file, Keypair},
     solana_ledger::{blockstore::create_new_ledger, blockstore_options::LedgerColumnOptions},
     solana_loader_v3_interface::state::UpgradeableLoaderState,
-    solana_native_token::LAMPORTS_PER_SOL,
+    solana_native_token::sol_to_lamports,
     solana_poh_config::PohConfig,
     solana_pubkey::Pubkey,
     solana_rent::Rent,
@@ -66,7 +65,7 @@ fn pubkey_from_str(key_str: &str) -> Result<Pubkey, Box<dyn error::Error>> {
     Pubkey::from_str(key_str).or_else(|_| {
         let bytes: Vec<u8> = serde_json::from_str(key_str)?;
         let keypair =
-            Keypair::try_from(bytes.as_ref()).map_err(|e| std::io::Error::other(e.to_string()))?;
+            Keypair::from_bytes(&bytes).map_err(|e| std::io::Error::other(e.to_string()))?;
         Ok(keypair.pubkey())
     })
 }
@@ -314,11 +313,11 @@ fn main() -> Result<(), Box<dyn error::Error>> {
     };
 
     // vote account
-    let default_bootstrap_validator_lamports = &(500 * LAMPORTS_PER_SOL)
+    let default_bootstrap_validator_lamports = &sol_to_lamports(500.0)
         .max(VoteStateV3::get_rent_exempt_reserve(&rent))
         .to_string();
     // stake account
-    let default_bootstrap_validator_stake_lamports = &(LAMPORTS_PER_SOL / 2)
+    let default_bootstrap_validator_stake_lamports = &sol_to_lamports(0.5)
         .max(rent.minimum_balance(StakeStateV2::size_of()))
         .to_string();
 

+ 19 - 19
gossip/Cargo.toml

@@ -61,43 +61,43 @@ solana-account = { workspace = true }
 solana-bloom = { workspace = true }
 solana-clap-utils = { workspace = true }
 solana-client = { workspace = true }
-solana-clock = "=3.0.0"
-solana-cluster-type = "=3.0.0"
+solana-clock = "=2.2.2"
 solana-connection-cache = { workspace = true }
 solana-entry = { workspace = true }
-solana-epoch-schedule = "=3.0.0"
-solana-frozen-abi = { version = "=3.0.0", optional = true, features = [
+solana-epoch-schedule = "=2.2.1"
+solana-frozen-abi = { version = "=2.3.0", optional = true, features = [
     "frozen-abi",
 ] }
 solana-frozen-abi-macro = { version = "=3.0.0", optional = true, features = [
     "frozen-abi",
 ] }
-solana-hash = "=3.0.0"
-solana-keypair = "=3.0.0"
+solana-genesis-config = { workspace = true }
+solana-hash = "=2.3.0"
+solana-keypair = "=2.2.1"
 solana-ledger = { workspace = true, features = ["agave-unstable-api"] }
 solana-logger = "=3.0.0"
 solana-low-pass-filter = { workspace = true, features = ["agave-unstable-api"] }
 solana-measure = { workspace = true }
 solana-metrics = { workspace = true }
-solana-native-token = "=3.0.0"
+solana-native-token = "=2.2.2"
 solana-net-utils = { workspace = true }
-solana-packet = "=3.0.0"
+solana-packet = "=2.2.1"
 solana-perf = { workspace = true }
-solana-pubkey = { version = "=3.0.0", features = ["rand"] }
-solana-quic-definitions = "=3.0.0"
+solana-pubkey = { version = "=2.4.0", features = ["rand"] }
+solana-quic-definitions = "=2.3.0"
 solana-rayon-threadlimit = { workspace = true }
 solana-rpc-client = { workspace = true }
 solana-runtime = { workspace = true }
-solana-sanitize = "=3.0.0"
-solana-serde-varint = "=3.0.0"
-solana-sha256-hasher = "=3.0.0"
-solana-short-vec = "=3.0.0"
-solana-signature = { version = "=3.1.0", default-features = false }
-solana-signer = "=3.0.0"
+solana-sanitize = "=2.2.1"
+solana-serde-varint = "=2.2.2"
+solana-sha256-hasher = "=2.3.0"
+solana-short-vec = "=2.2.1"
+solana-signature = { version = "=2.3.0", default-features = false }
+solana-signer = "=2.2.1"
 solana-streamer = { workspace = true }
-solana-time-utils = "=3.0.0"
+solana-time-utils = "=2.2.1"
 solana-tpu-client = { workspace = true }
-solana-transaction = "=3.0.0"
+solana-transaction = "=2.2.3"
 solana-version = { workspace = true }
 solana-vote = { workspace = true }
 solana-vote-program = { workspace = true }
@@ -115,7 +115,7 @@ serial_test = { workspace = true }
 solana-net-utils = { workspace = true, features = ["dev-context-only-utils"] }
 solana-perf = { workspace = true, features = ["dev-context-only-utils"] }
 solana-runtime = { workspace = true, features = ["dev-context-only-utils"] }
-solana-signature = { version = "=3.1.0", features = ["rand"] }
+solana-signature = { version = "=2.3.0", features = ["rand"] }
 solana-system-transaction = { workspace = true }
 solana-vote-interface = { workspace = true }
 static_assertions = { workspace = true }

+ 12 - 18
gossip/src/cluster_info.rs

@@ -3762,27 +3762,21 @@ mod tests {
     fn test_contact_trace() {
         solana_logger::setup();
         let keypair43 = Arc::new(
-            Keypair::try_from(
-                [
-                    198, 203, 8, 178, 196, 71, 119, 152, 31, 96, 221, 142, 115, 224, 45, 34, 173,
-                    138, 254, 39, 181, 238, 168, 70, 183, 47, 210, 91, 221, 179, 237, 153, 14, 58,
-                    154, 59, 67, 220, 235, 106, 241, 99, 4, 72, 60, 245, 53, 30, 225, 122, 145,
-                    225, 8, 40, 30, 174, 26, 228, 125, 127, 125, 21, 96, 28,
-                ]
-                .as_ref(),
-            )
+            Keypair::from_bytes(&[
+                198, 203, 8, 178, 196, 71, 119, 152, 31, 96, 221, 142, 115, 224, 45, 34, 173, 138,
+                254, 39, 181, 238, 168, 70, 183, 47, 210, 91, 221, 179, 237, 153, 14, 58, 154, 59,
+                67, 220, 235, 106, 241, 99, 4, 72, 60, 245, 53, 30, 225, 122, 145, 225, 8, 40, 30,
+                174, 26, 228, 125, 127, 125, 21, 96, 28,
+            ])
             .unwrap(),
         );
         let keypair44 = Arc::new(
-            Keypair::try_from(
-                [
-                    66, 88, 3, 70, 228, 215, 125, 64, 130, 183, 180, 98, 22, 166, 201, 234, 89, 80,
-                    135, 24, 228, 35, 20, 52, 105, 130, 50, 51, 46, 229, 244, 108, 70, 57, 45, 247,
-                    57, 177, 39, 126, 190, 238, 50, 96, 186, 208, 28, 168, 148, 56, 9, 106, 92,
-                    213, 63, 205, 252, 225, 244, 101, 77, 182, 4, 2,
-                ]
-                .as_ref(),
-            )
+            Keypair::from_bytes(&[
+                66, 88, 3, 70, 228, 215, 125, 64, 130, 183, 180, 98, 22, 166, 201, 234, 89, 80,
+                135, 24, 228, 35, 20, 52, 105, 130, 50, 51, 46, 229, 244, 108, 70, 57, 45, 247, 57,
+                177, 39, 126, 190, 238, 50, 96, 186, 208, 28, 168, 148, 56, 9, 106, 92, 213, 63,
+                205, 252, 225, 244, 101, 77, 182, 4, 2,
+            ])
             .unwrap(),
         );
 

+ 1 - 1
gossip/src/crds_gossip_push.rs

@@ -24,7 +24,7 @@ use {
         stake_weighting_config::{get_gossip_config_from_account, WeightingConfig},
     },
     itertools::Itertools,
-    solana_cluster_type::ClusterType,
+    solana_genesis_config::ClusterType,
     solana_keypair::Keypair,
     solana_pubkey::Pubkey,
     solana_runtime::bank::Bank,

+ 12 - 28
gossip/src/crds_value.rs

@@ -362,16 +362,6 @@ mod test {
 
     #[test]
     fn test_serialize_round_trip() {
-        // Unfortunately doing `Keypair::new_from_array(rng.gen())` gives
-        // different results, so this essentially inlines the implementation
-        // from ed25519_dalek v1:
-        // https://docs.rs/ed25519-dalek/1.0.1/src/ed25519_dalek/secret.rs.html#171
-        fn random_keypair<R: RngCore>(rng: &mut R) -> Keypair {
-            let mut secret_bytes = [0u8; 32];
-            rng.fill_bytes(&mut secret_bytes);
-            Keypair::new_from_array(secret_bytes)
-        }
-        use rand0_7::RngCore;
         let mut rng = ChaChaRng::from_seed(
             bs58::decode("4nHgVgCvVaHnsrg4dYggtvWYYgV3JbeyiRBWupPMt3EG")
                 .into_vec()
@@ -381,7 +371,7 @@ mod test {
         );
         let values: Vec<CrdsValue> = vec![
             {
-                let keypair = random_keypair(&mut rng);
+                let keypair = Keypair::generate(&mut rng);
                 let lockouts: [Lockout; 4] = [
                     Lockout::new_with_confirmation_count(302_388_991, 11),
                     Lockout::new_with_confirmation_count(302_388_995, 7),
@@ -395,16 +385,13 @@ mod test {
                     timestamp: Some(1_732_044_716_167),
                     block_id: Hash::new_from_array(rng.gen()),
                 };
-                let blockhash = Hash::new_from_array(rng.gen());
-                let vote_keypair = random_keypair(&mut rng);
-                let voter_keypair = random_keypair(&mut rng);
                 let vote = new_tower_sync_transaction(
                     tower_sync,
-                    blockhash,      // blockhash
-                    &keypair,       // node_keypair
-                    &vote_keypair,  // vote_keypair
-                    &voter_keypair, // authorized_voter_keypair
-                    None,           // switch_proof_hash
+                    Hash::new_from_array(rng.gen()), // blockhash
+                    &keypair,                        // node_keypair
+                    &Keypair::generate(&mut rng),    // vote_keypair
+                    &Keypair::generate(&mut rng),    // authorized_voter_keypair
+                    None,                            // switch_proof_hash
                 );
                 let vote = Vote::new(
                     keypair.pubkey(),
@@ -415,7 +402,7 @@ mod test {
                 CrdsValue::new(CrdsData::Vote(5, vote), &keypair)
             },
             {
-                let keypair = random_keypair(&mut rng);
+                let keypair = Keypair::generate(&mut rng);
                 let lockouts: [Lockout; 3] = [
                     Lockout::new_with_confirmation_count(302_410_500, 9),
                     Lockout::new_with_confirmation_count(302_410_505, 5),
@@ -428,16 +415,13 @@ mod test {
                     timestamp: Some(1_732_053_615_237),
                     block_id: Hash::new_from_array(rng.gen()),
                 };
-                let blockhash = Hash::new_from_array(rng.gen());
-                let vote_keypair = random_keypair(&mut rng);
-                let voter_keypair = random_keypair(&mut rng);
                 let vote = new_tower_sync_transaction(
                     tower_sync,
-                    blockhash,      // blockhash
-                    &keypair,       // node_keypair
-                    &vote_keypair,  // vote_keypair
-                    &voter_keypair, // authorized_voter_keypair
-                    None,           // switch_proof_hash
+                    Hash::new_from_array(rng.gen()), // blockhash
+                    &keypair,                        // node_keypair
+                    &Keypair::generate(&mut rng),    // vote_keypair
+                    &Keypair::generate(&mut rng),    // authorized_voter_keypair
+                    None,                            // switch_proof_hash
                 );
                 let vote = Vote::new(
                     keypair.pubkey(),

+ 9 - 8
install/Cargo.toml

@@ -32,17 +32,18 @@ serde_derive = { workspace = true }
 serde_yaml = { workspace = true }
 serde_yaml_08 = { package = "serde_yaml", version = "0.8.26" }
 solana-clap-utils = { workspace = true }
-solana-config-interface = { version = "=2.0.0", features = ["bincode"] }
-solana-hash = "=3.0.0"
-solana-keypair = "=3.0.0"
+solana-config-interface = "=1.0.0"
+solana-config-program-client = { version = "=1.1.0", features = ["serde"] }
+solana-hash = "=2.3.0"
+solana-keypair = "=2.2.1"
 solana-logger = "=3.0.0"
-solana-message = "=3.0.0"
-solana-pubkey = { version = "=3.0.0", default-features = false }
+solana-message = "=2.4.0"
+solana-pubkey = { version = "=2.4.0", default-features = false }
 solana-rpc-client = { workspace = true }
 solana-sha256-hasher = { workspace = true }
-solana-signature = { version = "=3.1.0", default-features = false }
-solana-signer = "=3.0.0"
-solana-transaction = "=3.0.0"
+solana-signature = { version = "=2.3.0", default-features = false }
+solana-signer = "=2.2.1"
+solana-transaction = "=2.2.3"
 solana-version = { workspace = true }
 tar = { workspace = true }
 tempfile = { workspace = true }

+ 2 - 4
install/src/command.rs

@@ -9,10 +9,8 @@ use {
     crossbeam_channel::unbounded,
     indicatif::{ProgressBar, ProgressStyle},
     serde_derive::{Deserialize, Serialize},
-    solana_config_interface::{
-        instruction::{self as config_instruction},
-        state::get_config_data,
-    },
+    solana_config_interface::instruction::{self as config_instruction},
+    solana_config_program_client::get_config_data,
     solana_hash::Hash,
     solana_keypair::{read_keypair_file, signable::Signable, Keypair},
     solana_message::Message,

+ 8 - 8
keygen/Cargo.toml

@@ -17,21 +17,21 @@ name = "solana-keygen"
 path = "src/keygen.rs"
 
 [dependencies]
-bs58 = { workspace = true, features = ["std"] }
+bs58 = { workspace = true }
 clap = { version = "3.1.5", features = ["cargo"] }
 dirs-next = { workspace = true }
 num_cpus = { workspace = true }
 serde_json = { workspace = true }
 solana-clap-v3-utils = { workspace = true }
 solana-cli-config = { workspace = true }
-solana-derivation-path = "=3.0.0"
-solana-instruction = { version = "=3.0.0", features = ["bincode"] }
-solana-keypair = "=3.0.0"
-solana-message = { version = "=3.0.0", features = ["bincode"] }
-solana-pubkey = { version = "=3.0.0", default-features = false }
+solana-derivation-path = "=2.2.1"
+solana-instruction = { version = "=2.3.0", features = ["bincode"] }
+solana-keypair = "=2.2.1"
+solana-message = { version = "=2.4.0", features = ["bincode"] }
+solana-pubkey = { version = "=2.4.0", default-features = false }
 solana-remote-wallet = { workspace = true, features = ["default"] }
-solana-seed-derivable = "=3.0.0"
-solana-signer = "=3.0.0"
+solana-seed-derivable = "=2.2.1"
+solana-signer = "=2.2.1"
 solana-version = { workspace = true }
 tiny-bip39 = { workspace = true }
 

+ 0 - 1
ledger-tool/Cargo.toml

@@ -44,7 +44,6 @@ solana-bpf-loader-program = { workspace = true }
 solana-clap-utils = { workspace = true }
 solana-cli-output = { workspace = true }
 solana-clock = { workspace = true }
-solana-cluster-type = { workspace = true }
 solana-compute-budget = { workspace = true }
 solana-core = { workspace = true, features = ["dev-context-only-utils"] }
 solana-cost-model = { workspace = true }

+ 8 - 8
ledger-tool/src/main.rs

@@ -30,9 +30,8 @@ use {
             is_within_range,
         },
     },
-    solana_cli_output::{display::build_balance_message, CliAccount, OutputFormat},
+    solana_cli_output::{CliAccount, OutputFormat},
     solana_clock::{Epoch, Slot},
-    solana_cluster_type::ClusterType,
     solana_core::{
         banking_simulation::{BankingSimulator, BankingTraceEvents},
         system_monitor_service::{SystemMonitorService, SystemMonitorStatsReportConfig},
@@ -40,6 +39,7 @@ use {
     },
     solana_cost_model::{cost_model::CostModel, cost_tracker::CostTracker},
     solana_feature_gate_interface::{self as feature, Feature},
+    solana_genesis_config::ClusterType,
     solana_inflation::Inflation,
     solana_instruction::TRANSACTION_LEVEL_STACK_HEIGHT,
     solana_ledger::{
@@ -51,7 +51,7 @@ use {
     },
     solana_measure::{measure::Measure, measure_time},
     solana_message::SimpleAddressLoader,
-    solana_native_token::{Sol, LAMPORTS_PER_SOL},
+    solana_native_token::{lamports_to_sol, sol_to_lamports, Sol},
     solana_pubkey::Pubkey,
     solana_rent::Rent,
     solana_runtime::{
@@ -281,7 +281,7 @@ fn graph_forks(bank_forks: &BankForks, config: &GraphConfig) -> String {
                         format!(
                             "\nvotes: {}, stake: {:.1} SOL ({:.1}%)",
                             votes,
-                            build_balance_message(*stake, false, false),
+                            lamports_to_sol(*stake),
                             *stake as f64 / *total_stake as f64 * 100.,
                         )
                     } else {
@@ -377,7 +377,7 @@ fn graph_forks(bank_forks: &BankForks, config: &GraphConfig) -> String {
                 r#"  "last vote {}"[shape=box,label="Latest validator vote: {}\nstake: {} SOL\nroot slot: {}\n{}"];"#,
                 node_pubkey,
                 node_pubkey,
-                build_balance_message(*stake, false, false),
+                lamports_to_sol(*stake),
                 vote_state_view.root_slot().unwrap_or(0),
                 vote_history,
             ));
@@ -399,7 +399,7 @@ fn graph_forks(bank_forks: &BankForks, config: &GraphConfig) -> String {
         dot.push(format!(
             r#"    "..."[label="...\nvotes: {}, stake: {:.1} SOL {:.1}%"];"#,
             absent_votes,
-            build_balance_message(absent_stake, false, false),
+            lamports_to_sol(absent_stake),
             absent_stake as f64 / lowest_total_stake as f64 * 100.,
         ));
     }
@@ -941,10 +941,10 @@ fn main() {
         .help("Print account data in specified format when printing account contents.");
 
     let rent = Rent::default();
-    let default_bootstrap_validator_lamports = &(500 * LAMPORTS_PER_SOL)
+    let default_bootstrap_validator_lamports = &sol_to_lamports(500.0)
         .max(VoteStateV3::get_rent_exempt_reserve(&rent))
         .to_string();
-    let default_bootstrap_validator_stake_lamports = &(LAMPORTS_PER_SOL / 2)
+    let default_bootstrap_validator_stake_lamports = &sol_to_lamports(0.5)
         .max(rent.minimum_balance(StakeStateV2::size_of()))
         .to_string();
     let default_graph_vote_account_mode = GraphVoteAccountMode::default();

+ 6 - 5
ledger-tool/src/output.rs

@@ -14,8 +14,8 @@ use {
         is_loadable::IsLoadable as _,
     },
     solana_cli_output::{
-        display::{build_balance_message, writeln_transaction},
-        CliAccount, CliAccountNewConfig, OutputFormat, QuietDisplay, VerboseDisplay,
+        display::writeln_transaction, CliAccount, CliAccountNewConfig, OutputFormat, QuietDisplay,
+        VerboseDisplay,
     },
     solana_clock::{Slot, UnixTimestamp},
     solana_hash::Hash,
@@ -24,6 +24,7 @@ use {
         blockstore_meta::{DuplicateSlotProof, ErasureMeta},
         shred::{Shred, ShredType},
     },
+    solana_native_token::lamports_to_sol,
     solana_pubkey::Pubkey,
     solana_runtime::bank::Bank,
     solana_transaction::versioned::VersionedTransaction,
@@ -257,14 +258,14 @@ impl fmt::Display for CliBlockWithEntries {
                     format!(
                         "{}◎{:<14.9}",
                         sign,
-                        build_balance_message(reward.lamports.unsigned_abs(), false, false)
+                        lamports_to_sol(reward.lamports.unsigned_abs())
                     ),
                     if reward.post_balance == 0 {
                         "          -                 -".to_string()
                     } else {
                         format!(
                             "◎{:<19.9}  {:>13.9}%",
-                            build_balance_message(reward.post_balance, false, false),
+                            lamports_to_sol(reward.post_balance),
                             (reward.lamports.abs() as f64
                                 / (reward.post_balance as f64 - reward.lamports as f64))
                                 * 100.0
@@ -282,7 +283,7 @@ impl fmt::Display for CliBlockWithEntries {
                 f,
                 "Total Rewards: {}◎{:<12.9}",
                 sign,
-                build_balance_message(total_rewards.unsigned_abs(), false, false)
+                lamports_to_sol(total_rewards.unsigned_abs())
             )?;
         }
         for (index, entry) in self.encoded_confirmed_block.entries.iter().enumerate() {

+ 2 - 2
ledger/src/blockstore_processor.rs

@@ -3521,7 +3521,7 @@ pub mod tests {
                 InstructionError::ProgramFailedToCompile,
                 InstructionError::Immutable,
                 InstructionError::IncorrectAuthority,
-                InstructionError::BorshIoError,
+                InstructionError::BorshIoError("error".to_string()),
                 InstructionError::AccountNotRentExempt,
                 InstructionError::InvalidAccountOwner,
                 InstructionError::ArithmeticOverflow,
@@ -4848,7 +4848,7 @@ pub mod tests {
                         VoteStateV3::size_of(),
                         &solana_vote_program::id(),
                     );
-                    let versioned = VoteStateVersions::new_v3(vote_state);
+                    let versioned = VoteStateVersions::new_current(vote_state);
                     VoteStateV3::serialize(&versioned, vote_account.data_as_mut_slice()).unwrap();
                     (
                         solana_pubkey::new_rand(),

+ 1 - 1
ledger/src/sigverify_shreds.rs

@@ -390,7 +390,7 @@ fn sign_shreds_cpu(thread_pool: &ThreadPool, keypair: &Keypair, batches: &mut [P
 fn sign_shreds_gpu_pinned_keypair(keypair: &Keypair, cache: &RecyclerCache) -> PinnedVec<u8> {
     let mut vec = cache.buffer().allocate("pinned_keypair");
     let pubkey = keypair.pubkey().to_bytes();
-    let secret = keypair.secret_bytes();
+    let secret = keypair.secret().to_bytes();
     let mut hasher = Sha512::default();
     hasher.update(secret);
     let mut result = hasher.finalize();

+ 1 - 1
ledger/src/staking_utils.rs

@@ -112,7 +112,7 @@ pub(crate) mod tests {
         let vote_accounts = stakes.into_iter().map(|(stake, vote_state)| {
             let account = AccountSharedData::new_data(
                 rng.gen(), // lamports
-                &VoteStateVersions::new_v3(vote_state),
+                &VoteStateVersions::new_current(vote_state),
                 &solana_vote_program::id(), // owner
             )
             .unwrap();

+ 0 - 1
local-cluster/Cargo.toml

@@ -26,7 +26,6 @@ solana-accounts-db = { workspace = true }
 solana-client = { workspace = true }
 solana-client-traits = { workspace = true }
 solana-clock = { workspace = true }
-solana-cluster-type = { workspace = true }
 solana-commitment-config = { workspace = true }
 solana-core = { workspace = true }
 solana-entry = { workspace = true }

+ 1 - 2
local-cluster/src/local_cluster.rs

@@ -11,14 +11,13 @@ use {
     solana_accounts_db::utils::create_accounts_run_and_snapshot_dirs,
     solana_client::connection_cache::ConnectionCache,
     solana_clock::{Slot, DEFAULT_DEV_SLOTS_PER_EPOCH, DEFAULT_TICKS_PER_SLOT},
-    solana_cluster_type::ClusterType,
     solana_commitment_config::CommitmentConfig,
     solana_core::{
         consensus::tower_storage::FileTowerStorage,
         validator::{Validator, ValidatorConfig, ValidatorStartProgress, ValidatorTpuConfig},
     },
     solana_epoch_schedule::EpochSchedule,
-    solana_genesis_config::GenesisConfig,
+    solana_genesis_config::{ClusterType, GenesisConfig},
     solana_gossip::{
         contact_info::{ContactInfo, Protocol},
         gossip_service::{discover, discover_validators},

+ 1 - 1
local-cluster/tests/local_cluster.rs

@@ -15,7 +15,6 @@ use {
     solana_clock::{
         self as clock, Slot, DEFAULT_SLOTS_PER_EPOCH, DEFAULT_TICKS_PER_SLOT, MAX_PROCESSING_AGE,
     },
-    solana_cluster_type::ClusterType,
     solana_commitment_config::CommitmentConfig,
     solana_core::{
         consensus::{
@@ -28,6 +27,7 @@ use {
     solana_download_utils::download_snapshot_archive,
     solana_entry::entry::create_ticks,
     solana_epoch_schedule::{MAX_LEADER_SCHEDULE_EPOCH_OFFSET, MINIMUM_SLOTS_PER_EPOCH},
+    solana_genesis_config::ClusterType,
     solana_gossip::{crds_data::MAX_VOTES, gossip_service::discover_validators},
     solana_hard_forks::HardForks,
     solana_hash::Hash,

+ 2 - 2
precompiles/Cargo.toml

@@ -19,7 +19,7 @@ agave-feature-set = { workspace = true }
 bincode = { workspace = true }
 digest = { workspace = true }
 ed25519-dalek = { workspace = true }
-libsecp256k1 = { workspace = true, features = ["hmac"] }
+libsecp256k1 = { workspace = true }
 openssl = { workspace = true }
 sha3 = { workspace = true }
 solana-ed25519-program = { workspace = true }
@@ -35,7 +35,7 @@ bytemuck = { workspace = true }
 hex = { workspace = true }
 rand0-7 = { workspace = true }
 solana-instruction = { workspace = true }
-solana-keccak-hasher = { workspace = true, features = ["sha3"] }
+solana-keccak-hasher = { workspace = true }
 solana-logger = { workspace = true }
 solana-secp256k1-program = { workspace = true, features = ["bincode"] }
 

+ 1 - 1
precompiles/src/secp256k1.rs

@@ -355,7 +355,7 @@ pub mod tests {
             hasher.result()
         };
 
-        let secp_message = libsecp256k1::Message::parse(message_hash.as_bytes());
+        let secp_message = libsecp256k1::Message::parse(&message_hash.0);
         let (signature, recovery_id) = libsecp256k1::sign(&secp_message, &secret_key);
 
         // Flip the S value in the signature to make a different but valid signature.

+ 1 - 3
program-runtime/Cargo.toml

@@ -51,7 +51,6 @@ solana-rent = { workspace = true }
 solana-sbpf = { workspace = true }
 solana-sdk-ids = { workspace = true }
 solana-slot-hashes = { workspace = true }
-solana-stake-interface = { workspace = true, features = ["bincode", "sysvar"] }
 solana-svm-callback = { workspace = true }
 solana-svm-feature-set = { workspace = true }
 solana-svm-log-collector = { workspace = true }
@@ -61,7 +60,7 @@ solana-svm-timings = { workspace = true }
 solana-svm-transaction = { workspace = true }
 solana-svm-type-overrides = { workspace = true }
 solana-system-interface = { workspace = true }
-solana-sysvar = { workspace = true, features = ["bincode"] }
+solana-sysvar = { workspace = true }
 solana-sysvar-id = { workspace = true }
 solana-transaction-context = { workspace = true }
 
@@ -69,7 +68,6 @@ solana-transaction-context = { workspace = true }
 assert_matches = { workspace = true }
 solana-account-info = { workspace = true }
 solana-instruction = { workspace = true, features = ["bincode"] }
-solana-instruction-error = { workspace = true, features = ["serde"] }
 solana-keypair = { workspace = true }
 solana-program-runtime = { path = ".", features = ["dev-context-only-utils"] }
 solana-pubkey = { workspace = true, features = ["rand"] }

+ 21 - 26
program-runtime/src/serialization.rs

@@ -840,11 +840,7 @@ mod tests {
                     assert_eq!(account.data(), &account_info.data.borrow()[..]);
                     assert_eq!(account.owner(), account_info.owner);
                     assert_eq!(account.executable(), account_info.executable);
-                    #[allow(deprecated)]
-                    {
-                        // Using the sdk entrypoint, the rent-epoch is skipped
-                        assert_eq!(0, account_info._unused);
-                    }
+                    assert_eq!(u64::MAX, account_info.rent_epoch);
                 }
             }
         }
@@ -1001,11 +997,7 @@ mod tests {
                 assert_eq!(account.data(), &account_info.data.borrow()[..]);
                 assert_eq!(account.owner(), account_info.owner);
                 assert_eq!(account.executable(), account_info.executable);
-                #[allow(deprecated)]
-                {
-                    // Using the sdk entrypoint, the rent-epoch is skipped
-                    assert_eq!(0, account_info._unused);
-                }
+                assert_eq!(u64::MAX, account_info.rent_epoch);
 
                 assert_eq!(
                     (*account_info.lamports.borrow() as *const u64).align_offset(BPF_ALIGN_OF_U128),
@@ -1089,10 +1081,7 @@ mod tests {
                 assert_eq!(account.data(), &account_info.data.borrow()[..]);
                 assert_eq!(account.owner(), account_info.owner);
                 assert_eq!(account.executable(), account_info.executable);
-                #[allow(deprecated)]
-                {
-                    assert_eq!(u64::MAX, account_info._unused);
-                }
+                assert_eq!(u64::MAX, account_info.rent_epoch);
             }
 
             deserialize_parameters(
@@ -1236,11 +1225,21 @@ mod tests {
             };
 
             for account_info in de_accounts {
-                // Using program-entrypoint, the rent-epoch will always be 0
-                #[allow(deprecated)]
-                {
-                    assert_eq!(0, account_info._unused);
-                }
+                let index_in_transaction = invoke_context
+                    .transaction_context
+                    .find_index_of_account(account_info.key)
+                    .unwrap();
+                let account = invoke_context
+                    .transaction_context
+                    .accounts()
+                    .try_borrow(index_in_transaction)
+                    .unwrap();
+                let expected_rent_epoch = if mask_out_rent_epoch_in_vm_serialization {
+                    u64::MAX
+                } else {
+                    account.rent_epoch()
+                };
+                assert_eq!(expected_rent_epoch, account_info.rent_epoch);
             }
 
             // check serialize_parameters_unaligned
@@ -1284,10 +1283,7 @@ mod tests {
                 } else {
                     account.rent_epoch()
                 };
-                #[allow(deprecated)]
-                {
-                    assert_eq!(expected_rent_epoch, account_info._unused);
-                }
+                assert_eq!(expected_rent_epoch, account_info.rent_epoch);
             }
         }
     }
@@ -1380,10 +1376,9 @@ mod tests {
                 let executable = Ptr::<u8>::read_possibly_unaligned(input, offset) != 0;
                 offset += size_of::<u8>();
 
-                let unused = Ptr::<u64>::read_possibly_unaligned(input, offset);
+                let rent_epoch = Ptr::<u64>::read_possibly_unaligned(input, offset);
                 offset += size_of::<u64>();
 
-                #[allow(deprecated)]
                 accounts.push(AccountInfo {
                     key,
                     is_signer,
@@ -1392,7 +1387,7 @@ mod tests {
                     data,
                     owner,
                     executable,
-                    _unused: unused,
+                    rent_epoch,
                 });
             } else {
                 // duplicate account, clone the original

+ 4 - 5
program-runtime/src/sysvar_cache.rs

@@ -12,9 +12,8 @@ use {
     solana_rent::Rent,
     solana_sdk_ids::sysvar,
     solana_slot_hashes::SlotHashes,
-    solana_stake_interface::stake_history::StakeHistory,
     solana_svm_type_overrides::sync::Arc,
-    solana_sysvar::SysvarSerialize,
+    solana_sysvar::{stake_history::StakeHistory, Sysvar},
     solana_sysvar_id::SysvarId,
     solana_transaction_context::{IndexOfAccount, InstructionContext, TransactionContext},
 };
@@ -60,7 +59,7 @@ const RECENT_BLOCKHASHES_ID: Pubkey =
 impl SysvarCache {
     /// Overwrite a sysvar. For testing purposes only.
     #[allow(deprecated)]
-    pub fn set_sysvar_for_tests<T: SysvarSerialize + SysvarId>(&mut self, sysvar: &T) {
+    pub fn set_sysvar_for_tests<T: Sysvar + SysvarId>(&mut self, sysvar: &T) {
         let data = bincode::serialize(sysvar).expect("Failed to serialize sysvar.");
         let sysvar_id = T::id();
         match sysvar_id {
@@ -284,7 +283,7 @@ impl SysvarCache {
 pub mod get_sysvar_with_account_check {
     use super::*;
 
-    fn check_sysvar_account<S: SysvarId>(
+    fn check_sysvar_account<S: Sysvar>(
         transaction_context: &TransactionContext,
         instruction_context: &InstructionContext,
         instruction_account_index: IndexOfAccount,
@@ -395,7 +394,7 @@ mod tests {
     #[test_case(SlotHashes::default(); "slot_hashes")]
     #[test_case(StakeHistory::default(); "stake_history")]
     #[test_case(LastRestartSlot::default(); "last_restart_slot")]
-    fn test_sysvar_cache_preserves_bytes<T: SysvarSerialize>(_: T) {
+    fn test_sysvar_cache_preserves_bytes<T: Sysvar>(_: T) {
         let id = T::id();
         let size = T::size_of().saturating_mul(2);
         let in_buf = vec![0; size];

+ 0 - 1
program-test/Cargo.toml

@@ -25,7 +25,6 @@ solana-banks-client = { workspace = true }
 solana-banks-interface = { workspace = true }
 solana-banks-server = { workspace = true }
 solana-clock = { workspace = true }
-solana-cluster-type = { workspace = true }
 solana-commitment-config = { workspace = true }
 solana-compute-budget = { workspace = true }
 solana-epoch-rewards = { workspace = true }

+ 9 - 10
program-test/src/lib.rs

@@ -14,17 +14,16 @@ use {
     solana_banks_client::start_client,
     solana_banks_server::banks_server::start_local_server,
     solana_clock::{Epoch, Slot},
-    solana_cluster_type::ClusterType,
     solana_compute_budget::compute_budget::ComputeBudget,
     solana_fee_calculator::{FeeRateGovernor, DEFAULT_TARGET_LAMPORTS_PER_SIGNATURE},
-    solana_genesis_config::GenesisConfig,
+    solana_genesis_config::{ClusterType, GenesisConfig},
     solana_hash::Hash,
     solana_instruction::{
         error::{InstructionError, UNSUPPORTED_SYSVAR},
         Instruction,
     },
     solana_keypair::Keypair,
-    solana_native_token::LAMPORTS_PER_SOL,
+    solana_native_token::sol_to_lamports,
     solana_poh_config::PohConfig,
     solana_program_entrypoint::{deserialize, SUCCESS},
     solana_program_error::{ProgramError, ProgramResult},
@@ -44,7 +43,7 @@ use {
     solana_signer::Signer,
     solana_svm_log_collector::ic_msg,
     solana_svm_timings::ExecuteTimings,
-    solana_sysvar::SysvarSerialize,
+    solana_sysvar::Sysvar,
     solana_sysvar_id::SysvarId,
     solana_vote_program::vote_state::{self, VoteStateV3, VoteStateVersions},
     std::{
@@ -217,7 +216,7 @@ macro_rules! processor {
     };
 }
 
-fn get_sysvar<T: Default + SysvarSerialize + Sized + serde::de::DeserializeOwned + Clone>(
+fn get_sysvar<T: Default + Sysvar + Sized + serde::de::DeserializeOwned + Clone>(
     sysvar: Result<Arc<T>, InstructionError>,
     var_addr: *mut u8,
 ) -> u64 {
@@ -613,7 +612,7 @@ impl ProgramTest {
         );
     }
 
-    pub fn add_sysvar_account<S: SysvarSerialize>(&mut self, address: Pubkey, sysvar: &S) {
+    pub fn add_sysvar_account<S: Sysvar>(&mut self, address: Pubkey, sysvar: &S) {
         let account = create_account_shared_data_for_test(sysvar);
         self.add_account(address, account.into());
     }
@@ -802,13 +801,13 @@ impl ProgramTest {
         };
         let bootstrap_validator_pubkey = Pubkey::new_unique();
         let bootstrap_validator_stake_lamports =
-            rent.minimum_balance(VoteStateV3::size_of()) + 1_000_000 * LAMPORTS_PER_SOL;
+            rent.minimum_balance(VoteStateV3::size_of()) + sol_to_lamports(1_000_000.0);
 
         let mint_keypair = Keypair::new();
         let voting_keypair = Keypair::new();
 
         let mut genesis_config = create_genesis_config_with_leader_ex(
-            1_000_000 * LAMPORTS_PER_SOL,
+            sol_to_lamports(1_000_000.0),
             &mint_keypair.pubkey(),
             &bootstrap_validator_pubkey,
             &voting_keypair.pubkey(),
@@ -1109,7 +1108,7 @@ impl ProgramTestContext {
         for _ in 0..number_of_credits {
             vote_state.increment_credits(epoch, 1);
         }
-        let versioned = VoteStateVersions::new_v3(vote_state);
+        let versioned = VoteStateVersions::new_current(vote_state);
         vote_state::to(&versioned, &mut vote_account).unwrap();
         bank.store_account(vote_account_address, &vote_account);
     }
@@ -1132,7 +1131,7 @@ impl ProgramTestContext {
     /// that would be difficult to replicate on a new test cluster. Beware
     /// that it can be used to create states that would not be reachable
     /// under normal conditions!
-    pub fn set_sysvar<T: SysvarId + SysvarSerialize>(&self, sysvar: &T) {
+    pub fn set_sysvar<T: SysvarId + Sysvar>(&self, sysvar: &T) {
         let bank_forks = self.bank_forks.read().unwrap();
         let bank = bank_forks.working_bank();
         bank.set_sysvar_for_tests(sysvar);

+ 1 - 3
program-test/tests/sysvar_last_restart_slot.rs

@@ -7,9 +7,7 @@ use {
     solana_program_test::{processor, ProgramTest, ProgramTestContext},
     solana_pubkey::Pubkey,
     solana_signer::Signer,
-    solana_sysvar::{
-        last_restart_slot, last_restart_slot::LastRestartSlot, Sysvar, SysvarSerialize,
-    },
+    solana_sysvar::{last_restart_slot, last_restart_slot::LastRestartSlot, Sysvar},
     solana_transaction::Transaction,
 };
 

+ 5 - 3
program-test/tests/warp.rs

@@ -19,12 +19,14 @@ use {
     solana_signer::Signer,
     solana_stake_interface::{
         instruction as stake_instruction,
-        stake_history::StakeHistory,
         state::{StakeActivationStatus, StakeStateV2},
-        sysvar::stake_history,
     },
     solana_stake_program::stake_state,
-    solana_sysvar::{clock, SysvarSerialize},
+    solana_sysvar::{
+        clock,
+        stake_history::{self, StakeHistory},
+        Sysvar,
+    },
     solana_transaction::Transaction,
     solana_transaction_error::TransactionError,
     solana_vote_program::vote_state,

+ 1 - 4
programs/bpf_loader/src/lib.rs

@@ -606,13 +606,10 @@ fn process_loader_upgradeable_instruction(
             let transaction_context = &invoke_context.transaction_context;
             let instruction_context = transaction_context.get_current_instruction_context()?;
             let caller_program_id = instruction_context.get_program_key(transaction_context)?;
-            // The conversion from `PubkeyError` to `InstructionError` through
-            // num-traits is incorrect, but it's the existing behavior.
             let signers = [[new_program_id.as_ref(), &[bump_seed]]]
                 .iter()
                 .map(|seeds| Pubkey::create_program_address(seeds, caller_program_id))
-                .collect::<Result<Vec<Pubkey>, solana_pubkey::PubkeyError>>()
-                .map_err(|e| e as u64)?;
+                .collect::<Result<Vec<Pubkey>, solana_pubkey::PubkeyError>>()?;
             invoke_context.native_invoke(instruction, signers.as_slice())?;
 
             // Load and verify the program bits

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 187 - 289
programs/sbf/Cargo.lock


+ 47 - 50
programs/sbf/Cargo.toml

@@ -112,37 +112,35 @@ rand = "0.8"
 serde = "1.0.112"                                                                             # must match the serde_derive version, see https://github.com/serde-rs/serde/issues/2584#issuecomment-1685252251
 serde_derive = "1.0.112"                                                                      # must match the serde version, see https://github.com/serde-rs/serde/issues/2584#issuecomment-1685252251
 serde_json = "1.0.56"
-sha2 = "0.10.8"
-sha3 = "0.10.8"
 solana-account-decoder = { path = "../../account-decoder", version = "=3.0.0" }
-solana-account-info = "=3.0.0"
+solana-account-info = "=2.3.0"
 solana-accounts-db = { path = "../../accounts-db", version = "=3.0.0" }
-solana-big-mod-exp = "=3.0.0"
-solana-blake3-hasher = { version = "=3.0.0", features = ["blake3"] }
-solana-bn254 = "=3.0.0"
+solana-big-mod-exp = "=2.2.1"
+solana-blake3-hasher = { version = "=2.2.1", features = ["blake3"] }
+solana-bn254 = "=2.2.2"
 solana-bpf-loader-program = { path = "../bpf_loader", version = "=3.0.0" }
 solana-cli-output = { path = "../../cli-output", version = "=3.0.0" }
-solana-clock = { version = "=3.0.0", features = ["serde", "sysvar"] }
+solana-clock = { version = "=2.2.2", features = ["serde", "sysvar"] }
 solana-compute-budget = { path = "../../compute-budget", version = "=3.0.0" }
 solana-compute-budget-instruction = { path = "../../compute-budget-instruction", version = "=3.0.0" }
 solana-curve25519 = { path = "../../curves/curve25519", version = "=3.0.0" }
-solana-define-syscall = "=3.0.0"
+solana-define-syscall = "=2.3.0"
 solana-fee = { path = "../../fee", version = "=3.0.0" }
-solana-hash = { version = "=3.0.0", features = ["bytemuck", "serde", "std"] }
-solana-instruction = "=3.0.0"
-solana-instructions-sysvar = "=3.0.0"
-solana-keccak-hasher = { version = "=3.0.0", features = ["sha3"] }
+solana-hash = { version = "=2.3.0", features = ["bytemuck", "serde", "std"] }
+solana-instruction = "=2.3.0"
+solana-instructions-sysvar = "=2.2.2"
+solana-keccak-hasher = { version = "=2.2.1", features = ["sha3"] }
 solana-ledger = { path = "../../ledger", version = "=3.0.0" }
-solana-logger = "=3.0.0"
+solana-logger = "=2.3.1"
 solana-measure = { path = "../../measure", version = "=3.0.0" }
-solana-msg = "=3.0.0"
+solana-msg = "=2.2.1"
 solana-poseidon = { path = "../../poseidon/", version = "=3.0.0" }
-solana-program = "=3.0.0"
-solana-program-entrypoint = "=3.1.0"
-solana-program-error = "=3.0.0"
-solana-program-memory = "=3.0.0"
+solana-program = "=2.2.1"
+solana-program-entrypoint = "=2.3.0"
+solana-program-error = "=2.2.2"
+solana-program-memory = "=2.2.1"
 solana-program-runtime = { path = "../../program-runtime", version = "=3.0.0" }
-solana-pubkey = { version = "=3.0.0", default-features = false }
+solana-pubkey = { version = "=2.4.0", default-features = false }
 solana-runtime = { path = "../../runtime", version = "=3.0.0" }
 solana-runtime-transaction = { path = "../../runtime-transaction", version = "=3.0.0" }
 solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=3.0.0" }
@@ -154,10 +152,10 @@ solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version =
 solana-sbf-rust-realloc-dep = { path = "rust/realloc_dep", version = "=3.0.0" }
 solana-sbf-rust-realloc-invoke-dep = { path = "rust/realloc_invoke_dep", version = "=3.0.0" }
 solana-sbpf = "=0.12.2"
-solana-sdk-ids = "=3.0.0"
-solana-secp256k1-recover = "=3.0.0"
-solana-sha256-hasher = { version = "=3.0.0", features = ["sha2"] }
-solana-stake-interface = { version = "=2.0.0", features = ["bincode"] }
+solana-sdk-ids = "=2.2.1"
+solana-secp256k1-recover = "=2.2.1"
+solana-sha256-hasher = { version = "=2.3.0", features = ["sha2"] }
+solana-stake-interface = { version = "=1.2.1", features = ["bincode"] }
 solana-svm = { path = "../../svm", version = "=3.0.0" }
 solana-svm-callback = { path = "../../svm-callback", version = "=3.0.0" }
 solana-svm-feature-set = { path = "../../svm-feature-set", version = "=3.0.0" }
@@ -165,8 +163,8 @@ solana-svm-log-collector = { path = "../../svm-log-collector", version = "=3.0.0
 solana-svm-timings = { path = "../../svm-timings", version = "=3.0.0" }
 solana-svm-transaction = { path = "../../svm-transaction", version = "=3.0.0" }
 solana-svm-type-overrides = { path = "../../svm-type-overrides", version = "=3.0.0" }
-solana-system-interface = { version = "=2.0", features = ["bincode"] }
-solana-sysvar = "=3.0.0"
+solana-system-interface = { version = "=1.0", features = ["bincode"] }
+solana-sysvar = "=2.2.2"
 solana-transaction-context = { path = "../../transaction-context", version = "=3.0.0" }
 solana-transaction-status = { path = "../../transaction-status", version = "=3.0.0" }
 solana-vote = { path = "../../vote", version = "=3.0.0" }
@@ -194,38 +192,37 @@ itertools = { workspace = true }
 log = { workspace = true }
 miow = { workspace = true }
 net2 = { workspace = true }
-solana-account = "3.0.0"
+solana-account = "2.2.1"
 solana-account-decoder = { workspace = true }
-solana-account-info = "3.0.0"
+solana-account-info = "2.3.0"
 solana-accounts-db = { workspace = true }
 solana-bpf-loader-program = { workspace = true }
 solana-cli-output = { workspace = true }
-solana-client-traits = "3.0.0"
-solana-clock = "3.0.0"
-solana-cluster-type = "3.0.0"
+solana-client-traits = "2.2.1"
+solana-clock = "2.2.1"
 solana-compute-budget = { workspace = true }
 solana-compute-budget-instruction = { workspace = true, features = [
     "dev-context-only-utils",
 ] }
-solana-compute-budget-interface = "3.0.0"
+solana-compute-budget-interface = "2.2.2"
 solana-fee = { workspace = true }
-solana-fee-calculator = "3.0.0"
-solana-fee-structure = "3.0.0"
-solana-genesis-config = "3.0.0"
-solana-hash = "3.0.0"
-solana-instruction = "3.0.0"
-solana-keypair = "3.0.0"
+solana-fee-calculator = "2.2.1"
+solana-fee-structure = "2.3.0"
+solana-genesis-config = "2.2.1"
+solana-hash = "2.2.1"
+solana-instruction = "2.2.1"
+solana-keypair = "2.2.1"
 solana-ledger = { workspace = true }
-solana-loader-v3-interface = "6.1.0"
-solana-loader-v4-interface = "3.1.0"
+solana-loader-v3-interface = "5.0.0"
+solana-loader-v4-interface = "2.2.1"
 solana-logger = { workspace = true }
 solana-measure = { workspace = true }
-solana-message = "3.0.0"
+solana-message = "2.3.0"
 solana-program = { workspace = true }
-solana-program-entrypoint = "3.1.0"
+solana-program-entrypoint = "2.3.0"
 solana-program-runtime = { workspace = true }
-solana-pubkey = "3.0.0"
-solana-rent = "3.0.0"
+solana-pubkey = "2.4.0"
+solana-rent = "2.2.1"
 solana-runtime = { workspace = true, features = ["dev-context-only-utils"] }
 solana-runtime-transaction = { workspace = true, features = [
     "dev-context-only-utils",
@@ -234,9 +231,9 @@ solana-sbf-rust-invoke-dep = { workspace = true }
 solana-sbf-rust-realloc-dep = { workspace = true }
 solana-sbf-rust-realloc-invoke-dep = { workspace = true }
 solana-sbpf = { workspace = true }
-solana-sdk-ids = "3.0.0"
-solana-signer = "3.0.0"
-solana-stake-interface = "2.0.0"
+solana-sdk-ids = "2.2.1"
+solana-signer = "2.2.1"
+solana-stake-interface = "1.2.1"
 solana-svm = { workspace = true }
 solana-svm-callback = { workspace = true }
 solana-svm-feature-set = { workspace = true }
@@ -244,11 +241,11 @@ solana-svm-log-collector = { workspace = true }
 solana-svm-timings = { workspace = true }
 solana-svm-transaction = { workspace = true }
 solana-svm-type-overrides = { workspace = true }
-solana-system-interface = "2.0"
-solana-sysvar = "3.0.0"
-solana-transaction = "3.0.0"
+solana-system-interface = "1.0"
+solana-sysvar = "2.2.1"
+solana-transaction = "2.2.2"
 solana-transaction-context = { workspace = true, features = ["dev-context-only-utils"] }
-solana-transaction-error = "3.0.0"
+solana-transaction-error = "2.2.1"
 solana-transaction-status = { workspace = true }
 solana-vote = { workspace = true }
 solana-vote-program = { workspace = true }

+ 83 - 79
programs/sbf/rust/account_mem/src/lib.rs

@@ -27,103 +27,107 @@ pub fn process_instruction(
         unsafe { std::slice::from_raw_parts_mut(data, data_len) }
     };
 
-    unsafe {
-        match instruction_data[0] {
-            0 => {
-                // memcmp overlaps begining
-                #[allow(clippy::manual_memcpy)]
-                for i in 0..500 {
-                    buf[i] = too_early(8)[i];
-                }
-
-                sol_memcmp(too_early(8), &buf, 500);
+    match instruction_data[0] {
+        0 => {
+            // memcmp overlaps begining
+            #[allow(clippy::manual_memcpy)]
+            for i in 0..500 {
+                buf[i] = too_early(8)[i];
             }
-            1 => {
-                // memcmp overlaps begining
-                #[allow(clippy::manual_memcpy)]
-                for i in 0..12 {
-                    buf[i] = too_early(9)[i];
-                }
 
-                sol_memcmp(&buf, too_early(9), 12);
+            sol_memcmp(too_early(8), &buf, 500);
+        }
+        1 => {
+            // memcmp overlaps begining
+            #[allow(clippy::manual_memcpy)]
+            for i in 0..12 {
+                buf[i] = too_early(9)[i];
             }
-            2 => {
-                // memcmp overlaps begining
-                #[allow(clippy::manual_memcpy)]
-                for i in 0..3 {
-                    buf[i] = too_early(2)[i];
-                }
 
-                // memset overlaps begin of account area
-                sol_memset(too_early(2), 3, 3);
-                sol_memcpy(too_early(2), &buf, 3);
-            }
-            3 => {
-                // memcpy src overlaps begin of account
-                sol_memcpy(&mut buf, too_early(3), 10);
-            }
-            4 => {
-                // memmov src overlaps begin of account
-                sol_memmove(buf.as_mut_ptr(), too_early(3).as_ptr(), 10);
-            }
-            5 => {
-                // memcpy dst overlaps begin of account
-                sol_memcpy(too_early(3), &buf, 10);
-            }
-            6 => {
-                // memmov dst overlaps begin of account
-                sol_memmove(too_early(3).as_mut_ptr(), buf.as_ptr(), 10);
-            }
-            7 => {
-                // memmove dst overlaps begin of account, reverse order
-                sol_memmove(too_early(0).as_mut_ptr(), too_early(3).as_ptr(), 10);
-            }
-            8 => {
-                // memcmp overlaps end
-                sol_memcmp(&buf, &data[data_len.saturating_sub(8)..], 16);
-            }
-            9 => {
-                // memcmp overlaps end
-                sol_memcmp(&data[data_len.saturating_sub(7)..], &buf, 15);
-            }
-            10 => {
-                // memset overlaps end of account
-                sol_memset(&mut data[data_len.saturating_sub(2)..], 0, 3);
-            }
-            11 => {
-                // memcpy src overlaps end of account
-                sol_memcpy(&mut buf, &data[data_len.saturating_sub(3)..], 10);
+            sol_memcmp(&buf, too_early(9), 12);
+        }
+        2 => {
+            // memcmp overlaps begining
+            #[allow(clippy::manual_memcpy)]
+            for i in 0..3 {
+                buf[i] = too_early(2)[i];
             }
-            12 => {
-                // memmov src overlaps end of account
+
+            // memset overlaps begin of account area
+            sol_memset(too_early(2), 3, 3);
+            sol_memcpy(too_early(2), &buf, 3);
+        }
+        3 => {
+            // memcpy src overlaps begin of account
+            sol_memcpy(&mut buf, too_early(3), 10);
+        }
+        4 => {
+            // memmov src overlaps begin of account
+            unsafe { sol_memmove(buf.as_mut_ptr(), too_early(3).as_ptr(), 10) };
+        }
+        5 => {
+            // memcpy dst overlaps begin of account
+            sol_memcpy(too_early(3), &buf, 10);
+        }
+        6 => {
+            // memmov dst overlaps begin of account
+            unsafe { sol_memmove(too_early(3).as_mut_ptr(), buf.as_ptr(), 10) };
+        }
+        7 => {
+            // memmove dst overlaps begin of account, reverse order
+            unsafe { sol_memmove(too_early(0).as_mut_ptr(), too_early(3).as_ptr(), 10) };
+        }
+        8 => {
+            // memcmp overlaps end
+            sol_memcmp(&buf, &data[data_len.saturating_sub(8)..], 16);
+        }
+        9 => {
+            // memcmp overlaps end
+            sol_memcmp(&data[data_len.saturating_sub(7)..], &buf, 15);
+        }
+        10 => {
+            // memset overlaps end of account
+            sol_memset(&mut data[data_len.saturating_sub(2)..], 0, 3);
+        }
+        11 => {
+            // memcpy src overlaps end of account
+            sol_memcpy(&mut buf, &data[data_len.saturating_sub(3)..], 10);
+        }
+        12 => {
+            // memmov src overlaps end of account
+            unsafe {
                 sol_memmove(
                     buf.as_mut_ptr(),
                     data[data_len.saturating_sub(3)..].as_ptr(),
                     10,
-                );
-            }
-            13 => {
-                // memcpy dst overlaps end of account
-                sol_memcpy(&mut data[data_len.saturating_sub(3)..], &buf, 10);
-            }
-            14 => {
-                // memmov dst overlaps end of account
+                )
+            };
+        }
+        13 => {
+            // memcpy dst overlaps end of account
+            sol_memcpy(&mut data[data_len.saturating_sub(3)..], &buf, 10);
+        }
+        14 => {
+            // memmov dst overlaps end of account
+            unsafe {
                 sol_memmove(
                     data[data_len.saturating_sub(3)..].as_mut_ptr(),
                     buf.as_ptr(),
                     10,
-                );
-            }
-            15 => {
-                // memmove dst overlaps end of account, reverse order
+                )
+            };
+        }
+        15 => {
+            // memmove dst overlaps end of account, reverse order
+            unsafe {
                 sol_memmove(
                     data[data_len..].as_mut_ptr(),
                     data[data_len.saturating_sub(3)..].as_mut_ptr(),
                     10,
-                );
-            }
-            _ => {}
+                )
+            };
         }
+        _ => {}
     }
 
     Ok(())

+ 78 - 74
programs/sbf/rust/account_mem_deprecated/src/lib.rs

@@ -27,96 +27,100 @@ pub fn process_instruction(
         unsafe { std::slice::from_raw_parts_mut(data, data_len.wrapping_add(100)) }
     };
 
-    unsafe {
-        match instruction_data[0] {
-            0 => {
-                // memcmp overlaps begining
-                #[allow(clippy::manual_memcpy)]
-                for i in 0..90 {
-                    buf[i] = too_early(8)[i];
-                }
-
-                sol_memcmp(too_early(8), &buf, 90);
+    match instruction_data[0] {
+        0 => {
+            // memcmp overlaps begining
+            #[allow(clippy::manual_memcpy)]
+            for i in 0..90 {
+                buf[i] = too_early(8)[i];
             }
-            1 => {
-                // memcmp overlaps begining
-                #[allow(clippy::manual_memcpy)]
-                for i in 0..12 {
-                    buf[i] = too_early(9)[i];
-                }
 
-                sol_memcmp(&buf, too_early(9), 12);
-            }
-            2 => {
-                // memset overlaps begin of account area
-                sol_memset(too_early(2), 3, 3);
-            }
-            3 => {
-                // memcpy src overlaps begin of account
-                sol_memcpy(&mut buf, too_early(3), 10);
-            }
-            4 => {
-                // memmov src overlaps begin of account
-                sol_memmove(buf.as_mut_ptr(), too_early(3).as_ptr(), 10);
-            }
-            5 => {
-                // memcpy dst overlaps begin of account
-                sol_memcpy(too_early(3), &buf, 10);
-            }
-            6 => {
-                // memmov dst overlaps begin of account
-                sol_memmove(too_early(3).as_mut_ptr(), buf.as_ptr(), 10);
-            }
-            7 => {
-                // memmove dst overlaps begin of account, reverse order
-                sol_memmove(too_early(0).as_mut_ptr(), too_early(3).as_ptr(), 10);
-            }
-            8 => {
-                // memcmp overlaps end
-                sol_memcmp(&buf, &data[data_len.saturating_sub(8)..], 16);
-            }
-            9 => {
-                // memcmp overlaps end
-                sol_memcmp(&data[data_len.saturating_sub(7)..], &buf, 15);
-            }
-            10 => {
-                // memset overlaps end of account
-                sol_memset(&mut data[data_len.saturating_sub(2)..], 0, 3);
-            }
-            11 => {
-                // memcpy src overlaps end of account
-                sol_memcpy(&mut buf, &data[data_len.saturating_sub(3)..], 10);
+            sol_memcmp(too_early(8), &buf, 90);
+        }
+        1 => {
+            // memcmp overlaps begining
+            #[allow(clippy::manual_memcpy)]
+            for i in 0..12 {
+                buf[i] = too_early(9)[i];
             }
-            12 => {
-                // memmov src overlaps end of account
+
+            sol_memcmp(&buf, too_early(9), 12);
+        }
+        2 => {
+            // memset overlaps begin of account area
+            sol_memset(too_early(2), 3, 3);
+        }
+        3 => {
+            // memcpy src overlaps begin of account
+            sol_memcpy(&mut buf, too_early(3), 10);
+        }
+        4 => {
+            // memmov src overlaps begin of account
+            unsafe { sol_memmove(buf.as_mut_ptr(), too_early(3).as_ptr(), 10) };
+        }
+        5 => {
+            // memcpy dst overlaps begin of account
+            sol_memcpy(too_early(3), &buf, 10);
+        }
+        6 => {
+            // memmov dst overlaps begin of account
+            unsafe { sol_memmove(too_early(3).as_mut_ptr(), buf.as_ptr(), 10) };
+        }
+        7 => {
+            // memmove dst overlaps begin of account, reverse order
+            unsafe { sol_memmove(too_early(0).as_mut_ptr(), too_early(3).as_ptr(), 10) };
+        }
+        8 => {
+            // memcmp overlaps end
+            sol_memcmp(&buf, &data[data_len.saturating_sub(8)..], 16);
+        }
+        9 => {
+            // memcmp overlaps end
+            sol_memcmp(&data[data_len.saturating_sub(7)..], &buf, 15);
+        }
+        10 => {
+            // memset overlaps end of account
+            sol_memset(&mut data[data_len.saturating_sub(2)..], 0, 3);
+        }
+        11 => {
+            // memcpy src overlaps end of account
+            sol_memcpy(&mut buf, &data[data_len.saturating_sub(3)..], 10);
+        }
+        12 => {
+            // memmov src overlaps end of account
+            unsafe {
                 sol_memmove(
                     buf.as_mut_ptr(),
                     data[data_len.saturating_sub(3)..].as_ptr(),
                     10,
-                );
-            }
-            13 => {
-                // memcpy dst overlaps end of account
-                sol_memcpy(&mut data[data_len.saturating_sub(3)..], &buf, 10);
-            }
-            14 => {
-                // memmov dst overlaps end of account
+                )
+            };
+        }
+        13 => {
+            // memcpy dst overlaps end of account
+            sol_memcpy(&mut data[data_len.saturating_sub(3)..], &buf, 10);
+        }
+        14 => {
+            // memmov dst overlaps end of account
+            unsafe {
                 sol_memmove(
                     data[data_len.saturating_sub(3)..].as_mut_ptr(),
                     buf.as_ptr(),
                     10,
-                );
-            }
-            15 => {
-                // memmove dst overlaps end of account, reverse order
+                )
+            };
+        }
+        15 => {
+            // memmove dst overlaps end of account, reverse order
+            unsafe {
                 sol_memmove(
                     data[data_len..].as_mut_ptr(),
                     data[data_len.saturating_sub(3)..].as_mut_ptr(),
                     10,
-                );
-            }
-            _ => {}
+                )
+            };
         }
+        _ => {}
     }
 
     Ok(())

+ 2 - 1
programs/sbf/rust/caller_access/src/lib.rs

@@ -20,7 +20,8 @@ fn process_instruction(
         let mut lamports = accounts[0].lamports();
         let owner = &accounts[0].owner;
         let mut data = accounts[0].try_borrow_mut_data()?;
-        let account = AccountInfo::new(&key, false, false, &mut lamports, &mut data, owner, true);
+        let account =
+            AccountInfo::new(&key, false, false, &mut lamports, &mut data, owner, true, 0);
         msg!("{:?} calling {:?}", program_id, key);
         invoke(&ix, &[account])?;
     } else {

+ 4 - 1
programs/sbf/rust/error_handling/src/lib.rs

@@ -23,7 +23,10 @@ impl From<MyError> for ProgramError {
     }
 }
 impl ToStr for MyError {
-    fn to_str(&self) -> &'static str {
+    fn to_str<E>(&self) -> &'static str
+    where
+        E: 'static + ToStr + TryFrom<u32>,
+    {
         match self {
             MyError::DefaultEnumStart => "Error: Default enum start",
             MyError::TheAnswer => "Error: The Answer",

+ 4 - 4
programs/sbf/rust/invoke/src/lib.rs

@@ -538,7 +538,7 @@ fn process_instruction<'a>(
             let data = unsafe { std::slice::from_raw_parts_mut(ptr, len) };
             let mut lamports = accounts[FROM_INDEX].lamports();
             let from_info =
-                AccountInfo::new(&pubkey, false, true, &mut lamports, data, &owner, false);
+                AccountInfo::new(&pubkey, false, true, &mut lamports, data, &owner, false, 0);
 
             let pubkey = *accounts[DERIVED_KEY1_INDEX].key;
             let owner = *accounts[DERIVED_KEY1_INDEX].owner;
@@ -546,7 +546,7 @@ fn process_instruction<'a>(
             let data = unsafe { std::slice::from_raw_parts_mut(0x300007ff8 as *mut _, 0) };
             let mut lamports = accounts[DERIVED_KEY1_INDEX].lamports();
             let derived_info =
-                AccountInfo::new(&pubkey, false, true, &mut lamports, data, &owner, false);
+                AccountInfo::new(&pubkey, false, true, &mut lamports, data, &owner, false, 0);
 
             let pubkey = *accounts[SYSTEM_PROGRAM_INDEX].key;
             let owner = *accounts[SYSTEM_PROGRAM_INDEX].owner;
@@ -555,7 +555,7 @@ fn process_instruction<'a>(
             let data = unsafe { std::slice::from_raw_parts_mut(ptr, len) };
             let mut lamports = accounts[SYSTEM_PROGRAM_INDEX].lamports();
             let system_info =
-                AccountInfo::new(&pubkey, false, false, &mut lamports, data, &owner, true);
+                AccountInfo::new(&pubkey, false, false, &mut lamports, data, &owner, true, 0);
 
             let instruction = system_instruction::create_account(
                 accounts[FROM_INDEX].key,
@@ -1379,7 +1379,7 @@ fn process_instruction<'a>(
             #[cfg(target_feature = "dynamic-frames")]
             // When we have dynamic frames, the stack grows from the higher addresses, so we
             // compare from zero until the beginning of a function frame.
-            unsafe {
+            {
                 const ZEROED_BYTES_LENGTH: usize = (MAX_CALL_DEPTH - 2) * STACK_FRAME_SIZE;
                 assert_eq!(sol_memcmp(stack, &ZEROS, ZEROED_BYTES_LENGTH), 0);
                 stack[..ZEROED_BYTES_LENGTH].fill(42);

+ 7 - 7
programs/sbf/rust/invoked/src/lib.rs

@@ -47,6 +47,7 @@ fn process_instruction(
             assert_eq!(accounts[ARGUMENT_INDEX].data_len(), 100);
             assert!(accounts[ARGUMENT_INDEX].is_signer);
             assert!(accounts[ARGUMENT_INDEX].is_writable);
+            assert_eq!(accounts[ARGUMENT_INDEX].rent_epoch, u64::MAX);
             assert!(!accounts[ARGUMENT_INDEX].executable);
             {
                 let data = accounts[ARGUMENT_INDEX].try_borrow_data()?;
@@ -63,12 +64,14 @@ fn process_instruction(
             assert_eq!(accounts[INVOKED_ARGUMENT_INDEX].data_len(), 10);
             assert!(accounts[INVOKED_ARGUMENT_INDEX].is_signer);
             assert!(accounts[INVOKED_ARGUMENT_INDEX].is_writable);
+            assert_eq!(accounts[INVOKED_ARGUMENT_INDEX].rent_epoch, u64::MAX);
             assert!(!accounts[INVOKED_ARGUMENT_INDEX].executable);
 
             assert_eq!(accounts[INVOKED_PROGRAM_INDEX].key, program_id);
             assert_eq!(accounts[INVOKED_PROGRAM_INDEX].owner, &loader_v4::id());
             assert!(!accounts[INVOKED_PROGRAM_INDEX].is_signer);
             assert!(!accounts[INVOKED_PROGRAM_INDEX].is_writable);
+            assert_eq!(accounts[INVOKED_PROGRAM_INDEX].rent_epoch, u64::MAX);
             assert!(accounts[INVOKED_PROGRAM_INDEX].executable);
 
             assert_eq!(
@@ -91,13 +94,10 @@ fn process_instruction(
                 accounts[INVOKED_PROGRAM_INDEX].is_writable,
                 accounts[INVOKED_PROGRAM_DUP_INDEX].is_writable
             );
-            #[allow(deprecated)]
-            {
-                assert_eq!(
-                    accounts[INVOKED_PROGRAM_INDEX]._unused,
-                    accounts[INVOKED_PROGRAM_DUP_INDEX]._unused
-                );
-            }
+            assert_eq!(
+                accounts[INVOKED_PROGRAM_INDEX].rent_epoch,
+                accounts[INVOKED_PROGRAM_DUP_INDEX].rent_epoch
+            );
             assert_eq!(
                 accounts[INVOKED_PROGRAM_INDEX].executable,
                 accounts[INVOKED_PROGRAM_DUP_INDEX].executable

+ 3 - 3
programs/sbf/rust/mem/src/lib.rs

@@ -18,16 +18,16 @@ pub fn process_instruction(
     #[derive(Default)]
     struct MemOpSyscalls();
     impl MemOps for MemOpSyscalls {
-        unsafe fn memcpy(&self, dst: &mut [u8], src: &[u8], n: usize) {
+        fn memcpy(&self, dst: &mut [u8], src: &[u8], n: usize) {
             sol_memcpy(dst, src, n)
         }
         unsafe fn memmove(&self, dst: *mut u8, src: *mut u8, n: usize) {
             sol_memmove(dst, src, n)
         }
-        unsafe fn memset(&self, s: &mut [u8], c: u8, n: usize) {
+        fn memset(&self, s: &mut [u8], c: u8, n: usize) {
             sol_memset(s, c, n)
         }
-        unsafe fn memcmp(&self, s1: &[u8], s2: &[u8], n: usize) -> i32 {
+        fn memcmp(&self, s1: &[u8], s2: &[u8], n: usize) -> i32 {
             sol_memcmp(s1, s2, n)
         }
     }

+ 78 - 87
programs/sbf/rust/mem_dep/src/lib.rs

@@ -1,45 +1,40 @@
 //! Test mem functions
 
 pub trait MemOps {
-    /// # Safety
-    unsafe fn memcpy(&self, dst: &mut [u8], src: &[u8], n: usize);
+    fn memcpy(&self, dst: &mut [u8], src: &[u8], n: usize);
     /// # Safety
     unsafe fn memmove(&self, dst: *mut u8, src: *mut u8, n: usize);
-    /// # Safety
-    unsafe fn memset(&self, s: &mut [u8], c: u8, n: usize);
-    /// # Safety
-    unsafe fn memcmp(&self, s1: &[u8], s2: &[u8], n: usize) -> i32;
+    fn memset(&self, s: &mut [u8], c: u8, n: usize);
+    fn memcmp(&self, s1: &[u8], s2: &[u8], n: usize) -> i32;
 }
 
 pub fn run_mem_tests<T: MemOps>(mem_ops: T) {
     // memcpy
-    unsafe {
-        let src = &[1_u8; 18];
-        let dst = &mut [0_u8; 1];
-        mem_ops.memcpy(dst, src, 1);
-        assert_eq!(&src[..1], dst);
-        let dst = &mut [0_u8; 3];
-        mem_ops.memcpy(dst, src, 3);
-        assert_eq!(&src[..3], dst);
-        let dst = &mut [0_u8; 8];
-        mem_ops.memcpy(dst, src, 8);
-        assert_eq!(&src[..8], dst);
-        let dst = &mut [0_u8; 9];
-        mem_ops.memcpy(dst, src, 9);
-        assert_eq!(&src[..9], dst);
-        let dst = &mut [0_u8; 16];
-        mem_ops.memcpy(dst, src, 16);
-        assert_eq!(&src[..16], dst);
-        let dst = &mut [0_u8; 18];
-        mem_ops.memcpy(dst, src, 18);
-        assert_eq!(&src[..18], dst);
-        let dst = &mut [0_u8; 18];
-        mem_ops.memcpy(dst, &src[1..], 17);
-        assert_eq!(&src[1..], &dst[..17]);
-        let dst = &mut [0_u8; 18];
-        mem_ops.memcpy(&mut dst[1..], &src[1..], 17);
-        assert_eq!(&src[1..], &dst[1..]);
-    }
+    let src = &[1_u8; 18];
+    let dst = &mut [0_u8; 1];
+    mem_ops.memcpy(dst, src, 1);
+    assert_eq!(&src[..1], dst);
+    let dst = &mut [0_u8; 3];
+    mem_ops.memcpy(dst, src, 3);
+    assert_eq!(&src[..3], dst);
+    let dst = &mut [0_u8; 8];
+    mem_ops.memcpy(dst, src, 8);
+    assert_eq!(&src[..8], dst);
+    let dst = &mut [0_u8; 9];
+    mem_ops.memcpy(dst, src, 9);
+    assert_eq!(&src[..9], dst);
+    let dst = &mut [0_u8; 16];
+    mem_ops.memcpy(dst, src, 16);
+    assert_eq!(&src[..16], dst);
+    let dst = &mut [0_u8; 18];
+    mem_ops.memcpy(dst, src, 18);
+    assert_eq!(&src[..18], dst);
+    let dst = &mut [0_u8; 18];
+    mem_ops.memcpy(dst, &src[1..], 17);
+    assert_eq!(&src[1..], &dst[..17]);
+    let dst = &mut [0_u8; 18];
+    mem_ops.memcpy(&mut dst[1..], &src[1..], 17);
+    assert_eq!(&src[1..], &dst[1..]);
 
     // memmove
     unsafe {
@@ -112,60 +107,56 @@ pub fn run_mem_tests<T: MemOps>(mem_ops: T) {
     }
 
     // memset
-    unsafe {
-        let exp = &[1_u8; 18];
-        let buf = &mut [0_u8; 18];
-        mem_ops.memset(&mut buf[0..], 1, 1);
-        assert_eq!(exp[..1], buf[..1]);
-        mem_ops.memset(&mut buf[0..], 1, 3);
-        assert_eq!(exp[..3], buf[..3]);
-        mem_ops.memset(&mut buf[0..], 1, 8);
-        assert_eq!(exp[..8], buf[..8]);
-        mem_ops.memset(&mut buf[0..], 1, 9);
-        assert_eq!(exp[..9], buf[..9]);
-        mem_ops.memset(&mut buf[0..], 1, 16);
-        assert_eq!(exp[..16], buf[..16]);
-        mem_ops.memset(&mut buf[0..], 1, 18);
-        assert_eq!(exp[..18], buf[..18]);
-        mem_ops.memset(&mut buf[1..], 1, 17);
-        assert_eq!(exp[1..18], buf[1..18]);
-    }
+    let exp = &[1_u8; 18];
+    let buf = &mut [0_u8; 18];
+    mem_ops.memset(&mut buf[0..], 1, 1);
+    assert_eq!(exp[..1], buf[..1]);
+    mem_ops.memset(&mut buf[0..], 1, 3);
+    assert_eq!(exp[..3], buf[..3]);
+    mem_ops.memset(&mut buf[0..], 1, 8);
+    assert_eq!(exp[..8], buf[..8]);
+    mem_ops.memset(&mut buf[0..], 1, 9);
+    assert_eq!(exp[..9], buf[..9]);
+    mem_ops.memset(&mut buf[0..], 1, 16);
+    assert_eq!(exp[..16], buf[..16]);
+    mem_ops.memset(&mut buf[0..], 1, 18);
+    assert_eq!(exp[..18], buf[..18]);
+    mem_ops.memset(&mut buf[1..], 1, 17);
+    assert_eq!(exp[1..18], buf[1..18]);
 
     // memcmp
-    unsafe {
-        assert_eq!(-1, mem_ops.memcmp(&[0_u8], &[1_u8], 1));
-        assert_eq!(-1, mem_ops.memcmp(&[0_u8, 0, 0], &[0_u8, 0, 1], 3));
-        assert_eq!(
-            0,
-            mem_ops.memcmp(
-                &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0],
-                &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0],
-                9
-            )
-        );
-        assert_eq!(
-            -1,
-            mem_ops.memcmp(
-                &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0],
-                &[0_u8, 0, 0, 0, 0, 0, 0, 0, 1],
-                9
-            )
-        );
-        assert_eq!(
-            -1,
-            mem_ops.memcmp(
-                &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0, 0],
-                &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0, 1],
-                10
-            )
-        );
-        assert_eq!(0, mem_ops.memcmp(&[0_u8; 8], &[0_u8; 8], 8));
-        assert_eq!(-1, mem_ops.memcmp(&[0_u8; 8], &[1_u8; 8], 8));
-        assert_eq!(-1, mem_ops.memcmp(&[0_u8; 16], &[1_u8; 16], 16));
-        assert_eq!(-1, mem_ops.memcmp(&[0_u8; 18], &[1_u8; 18], 18));
-        let one = &[0_u8; 18];
-        let two = &[1_u8; 18];
-        assert_eq!(-1, mem_ops.memcmp(&one[1..], &two[0..], 17));
-        assert_eq!(-1, mem_ops.memcmp(&one[1..], &two[1..], 17));
-    }
+    assert_eq!(-1, mem_ops.memcmp(&[0_u8], &[1_u8], 1));
+    assert_eq!(-1, mem_ops.memcmp(&[0_u8, 0, 0], &[0_u8, 0, 1], 3));
+    assert_eq!(
+        0,
+        mem_ops.memcmp(
+            &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0],
+            &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0],
+            9
+        )
+    );
+    assert_eq!(
+        -1,
+        mem_ops.memcmp(
+            &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0],
+            &[0_u8, 0, 0, 0, 0, 0, 0, 0, 1],
+            9
+        )
+    );
+    assert_eq!(
+        -1,
+        mem_ops.memcmp(
+            &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+            &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0, 1],
+            10
+        )
+    );
+    assert_eq!(0, mem_ops.memcmp(&[0_u8; 8], &[0_u8; 8], 8));
+    assert_eq!(-1, mem_ops.memcmp(&[0_u8; 8], &[1_u8; 8], 8));
+    assert_eq!(-1, mem_ops.memcmp(&[0_u8; 16], &[1_u8; 16], 16));
+    assert_eq!(-1, mem_ops.memcmp(&[0_u8; 18], &[1_u8; 18], 18));
+    let one = &[0_u8; 18];
+    let two = &[1_u8; 18];
+    assert_eq!(-1, mem_ops.memcmp(&one[1..], &two[0..], 17));
+    assert_eq!(-1, mem_ops.memcmp(&one[1..], &two[1..], 17));
 }

+ 3 - 3
programs/sbf/rust/membuiltins/src/lib.rs

@@ -14,7 +14,7 @@ pub extern "C" fn entrypoint(_input: *mut u8) -> u64 {
     #[derive(Default)]
     struct MemOpSyscalls();
     impl MemOps for MemOpSyscalls {
-        unsafe fn memcpy(&self, dst: &mut [u8], src: &[u8], n: usize) {
+        fn memcpy(&self, dst: &mut [u8], src: &[u8], n: usize) {
             unsafe {
                 compiler_builtins::mem::memcpy(dst.as_mut_ptr(), src.as_ptr(), n);
             }
@@ -22,12 +22,12 @@ pub extern "C" fn entrypoint(_input: *mut u8) -> u64 {
         unsafe fn memmove(&self, dst: *mut u8, src: *mut u8, n: usize) {
             compiler_builtins::mem::memmove(dst, src, n);
         }
-        unsafe fn memset(&self, s: &mut [u8], c: u8, n: usize) {
+        fn memset(&self, s: &mut [u8], c: u8, n: usize) {
             unsafe {
                 compiler_builtins::mem::memset(s.as_mut_ptr(), c as i32, n);
             }
         }
-        unsafe fn memcmp(&self, s1: &[u8], s2: &[u8], n: usize) -> i32 {
+        fn memcmp(&self, s1: &[u8], s2: &[u8], n: usize) -> i32 {
             unsafe { compiler_builtins::mem::memcmp(s1.as_ptr(), s2.as_ptr(), n) }
         }
     }

+ 1 - 3
programs/sbf/rust/secp256k1_recover/Cargo.toml

@@ -13,9 +13,7 @@ crate-type = ["cdylib"]
 
 [dependencies]
 libsecp256k1 = { workspace = true }
-sha3 = { workspace = true }
-solana-hash = { workspace = true }
-solana-keccak-hasher = { workspace = true, features = ["sha3"] }
+solana-keccak-hasher = { workspace = true }
 solana-msg = { workspace = true }
 solana-program-entrypoint = { workspace = true }
 solana-secp256k1-recover = { workspace = true }

+ 3 - 15
programs/sbf/rust/secp256k1_recover/src/lib.rs

@@ -37,14 +37,6 @@ fn test_secp256k1_recover() {
 /// secp256k1_recover allows malleable signatures
 fn test_secp256k1_recover_malleability() {
     let message = b"hello world";
-    #[cfg(target_os = "solana")]
-    let message_hash = {
-        use sha3::Digest;
-        let mut hasher = sha3::Keccak256::default();
-        hasher.update(message);
-        solana_hash::Hash::new_from_array(hasher.finalize().into())
-    };
-    #[cfg(not(target_os = "solana"))]
     let message_hash = {
         let mut hasher = solana_keccak_hasher::Hasher::default();
         hasher.hash(message);
@@ -78,15 +70,11 @@ fn test_secp256k1_recover_malleability() {
     let alt_recovery_id = alt_recovery_id.serialize();
 
     let recovered_pubkey =
-        secp256k1_recover(message_hash.as_bytes(), recovery_id, &signature_bytes[..]).unwrap();
+        secp256k1_recover(&message_hash.0, recovery_id, &signature_bytes[..]).unwrap();
     assert_eq!(recovered_pubkey.to_bytes(), pubkey_bytes);
 
-    let alt_recovered_pubkey = secp256k1_recover(
-        message_hash.as_bytes(),
-        alt_recovery_id,
-        &alt_signature_bytes[..],
-    )
-    .unwrap();
+    let alt_recovered_pubkey =
+        secp256k1_recover(&message_hash.0, alt_recovery_id, &alt_signature_bytes[..]).unwrap();
     assert_eq!(alt_recovered_pubkey.to_bytes(), pubkey_bytes);
 }
 

+ 3 - 6
programs/sbf/rust/sha/Cargo.toml

@@ -13,14 +13,11 @@ crate-type = ["cdylib"]
 
 [dependencies]
 blake3 = { workspace = true }
-sha2 = { workspace = true }
-sha3 = { workspace = true }
-solana-blake3-hasher = { workspace = true, features = ["blake3"] }
-solana-hash = { workspace = true }
-solana-keccak-hasher = { workspace = true, features = ["sha3"] }
+solana-blake3-hasher = { workspace = true }
+solana-keccak-hasher = { workspace = true }
 solana-msg = { workspace = true }
 solana-program-entrypoint = { workspace = true }
-solana-sha256-hasher = { workspace = true, features = ["sha2"] }
+solana-sha256-hasher = { workspace = true }
 
 [lints]
 workspace = true

+ 9 - 35
programs/sbf/rust/sha/src/lib.rs

@@ -6,45 +6,19 @@ use {
 };
 
 fn test_sha256_hasher() {
-    use solana_sha256_hasher::hashv;
+    use solana_sha256_hasher::{hashv, Hasher};
     let vals = &["Gaggablaghblagh!".as_ref(), "flurbos".as_ref()];
-    #[cfg(target_os = "solana")]
-    let hash = {
-        use sha2::Digest;
-        let mut hasher = sha2::Sha256::default();
-        for val in vals {
-            hasher.update(val);
-        }
-        solana_hash::Hash::new_from_array(hasher.finalize().into())
-    };
-    #[cfg(not(target_os = "solana"))]
-    let hash = {
-        let mut hasher = solana_sha256_hasher::Hasher::default();
-        hasher.hashv(vals);
-        hasher.result()
-    };
-    assert_eq!(hashv(vals), hash);
+    let mut hasher = Hasher::default();
+    hasher.hashv(vals);
+    assert_eq!(hashv(vals), hasher.result());
 }
 
 fn test_keccak256_hasher() {
-    use solana_keccak_hasher::hashv;
+    use solana_keccak_hasher::{hashv, Hasher};
     let vals = &["Gaggablaghblagh!".as_ref(), "flurbos".as_ref()];
-    #[cfg(target_os = "solana")]
-    let hash = {
-        use sha3::Digest;
-        let mut hasher = sha3::Keccak256::default();
-        for val in vals {
-            hasher.update(val);
-        }
-        solana_hash::Hash::new_from_array(hasher.finalize().into())
-    };
-    #[cfg(not(target_os = "solana"))]
-    let hash = {
-        let mut hasher = solana_keccak_hasher::Hasher::default();
-        hasher.hashv(vals);
-        hasher.result()
-    };
-    assert_eq!(hashv(vals), hash);
+    let mut hasher = Hasher::default();
+    hasher.hashv(vals);
+    assert_eq!(hashv(vals), hasher.result());
 }
 
 fn test_blake3_hasher() {
@@ -53,7 +27,7 @@ fn test_blake3_hasher() {
     let v1: &[u8] = b"flurbos!";
     let vals: &[&[u8]] = &[v0, v1];
     let hash = blake3::hash(&[v0, v1].concat());
-    assert_eq!(hashv(vals).as_bytes(), hash.as_bytes());
+    assert_eq!(hashv(vals).0, *hash.as_bytes());
 }
 
 #[no_mangle]

+ 1 - 1
programs/sbf/rust/simulation/src/lib.rs

@@ -6,7 +6,7 @@ use {
     solana_msg::msg,
     solana_program_error::ProgramResult,
     solana_pubkey::{declare_id, Pubkey},
-    solana_sysvar::{Sysvar, SysvarSerialize},
+    solana_sysvar::Sysvar,
     std::convert::TryInto,
 };
 

+ 1 - 2
programs/sbf/rust/sysvar/Cargo.toml

@@ -22,8 +22,7 @@ solana-program-entrypoint = { workspace = true }
 solana-program-error = { workspace = true }
 solana-pubkey = { workspace = true }
 solana-sdk-ids = { workspace = true }
-solana-stake-interface = { workspace = true, features = ["sysvar"] }
-solana-sysvar = { workspace = true, features = ["bincode"] }
+solana-sysvar = { workspace = true }
 
 [lints]
 workspace = true

+ 4 - 7
programs/sbf/rust/sysvar/src/lib.rs

@@ -10,10 +10,6 @@ use {
     solana_program_error::{ProgramError, ProgramResult},
     solana_pubkey::Pubkey,
     solana_sdk_ids::sysvar,
-    solana_stake_interface::{
-        stake_history::{StakeHistory, StakeHistoryGetEntry},
-        sysvar::stake_history::StakeHistorySysvar,
-    },
     solana_sysvar::{
         clock::Clock,
         epoch_rewards::EpochRewards,
@@ -21,7 +17,8 @@ use {
         rent::Rent,
         slot_hashes::{PodSlotHashes, SlotHashes},
         slot_history::SlotHistory,
-        Sysvar, SysvarSerialize,
+        stake_history::{StakeHistory, StakeHistoryGetEntry, StakeHistorySysvar},
+        Sysvar,
     },
 };
 
@@ -29,7 +26,7 @@ use {
 #[cfg(target_os = "solana")]
 fn sol_get_sysvar_handler<T>(dst: &mut [u8], offset: u64, length: u64) -> Result<(), ProgramError>
 where
-    T: SysvarSerialize,
+    T: Sysvar,
 {
     let sysvar_id = &T::id() as *const _ as *const u8;
     let var_addr = dst as *mut _ as *mut u8;
@@ -47,7 +44,7 @@ where
 // Double-helper arrangement is easier to write to a mutable slice.
 fn sol_get_sysvar<T>() -> Result<T, ProgramError>
 where
-    T: SysvarSerialize,
+    T: Sysvar,
 {
     #[cfg(target_os = "solana")]
     {

+ 5 - 5
programs/sbf/tests/programs.rs

@@ -16,12 +16,12 @@ use {
     solana_account_info::MAX_PERMITTED_DATA_INCREASE,
     solana_client_traits::SyncClient,
     solana_clock::{UnixTimestamp, MAX_PROCESSING_AGE},
-    solana_cluster_type::ClusterType,
     solana_compute_budget::compute_budget::ComputeBudget,
     solana_compute_budget_instruction::instructions_processor::process_compute_budget_instructions,
     solana_compute_budget_interface::ComputeBudgetInstruction,
     solana_fee_calculator::FeeRateGovernor,
     solana_fee_structure::{FeeBin, FeeBudgetLimits, FeeStructure},
+    solana_genesis_config::ClusterType,
     solana_hash::Hash,
     solana_instruction::{error::InstructionError, AccountMeta, Instruction},
     solana_keypair::Keypair,
@@ -1445,15 +1445,15 @@ fn assert_instruction_count() {
         programs.extend_from_slice(&[
             ("solana_sbf_rust_128bit", 801),
             ("solana_sbf_rust_alloc", 4983),
-            ("solana_sbf_rust_custom_heap", 339),
+            ("solana_sbf_rust_custom_heap", 303),
             ("solana_sbf_rust_dep_crate", 22),
             ("solana_sbf_rust_iter", 1414),
             ("solana_sbf_rust_many_args", 1287),
-            ("solana_sbf_rust_mem", 1322),
+            ("solana_sbf_rust_mem", 1297),
             ("solana_sbf_rust_membuiltins", 329),
-            ("solana_sbf_rust_noop", 334),
+            ("solana_sbf_rust_noop", 312),
             ("solana_sbf_rust_param_passing", 109),
-            ("solana_sbf_rust_rand", 312),
+            ("solana_sbf_rust_rand", 276),
             ("solana_sbf_rust_sanity", 17902),
             ("solana_sbf_rust_secp256k1_recover", 88670),
             ("solana_sbf_rust_sha", 22175),

+ 4 - 2
programs/sbf/tests/sysvar.rs

@@ -18,8 +18,10 @@ use {
         stake_history,
     },
     solana_signer::Signer,
-    solana_stake_interface::stake_history::{StakeHistory, StakeHistoryEntry},
-    solana_sysvar::epoch_rewards,
+    solana_sysvar::{
+        epoch_rewards,
+        stake_history::{StakeHistory, StakeHistoryEntry},
+    },
     solana_transaction::Transaction,
 };
 

+ 1 - 2
programs/stake-tests/tests/test_move_stake_and_lamports.rs

@@ -18,11 +18,10 @@ use {
         self as stake,
         error::StakeError,
         instruction as ixn, program as stake_program,
-        stake_history::StakeHistory,
         state::{Authorized, Lockup, Meta, Stake, StakeStateV2},
     },
     solana_system_interface::{instruction as system_instruction, program as system_program},
-    solana_sysvar::clock::Clock,
+    solana_sysvar::{clock::Clock, stake_history::StakeHistory},
     solana_transaction::Transaction,
     solana_transaction_error::TransactionError,
     solana_vote_program::{

+ 1 - 1
programs/stake/Cargo.toml

@@ -23,7 +23,7 @@ log = { workspace = true }
 solana-account = { workspace = true }
 solana-bincode = { workspace = true }
 solana-clock = { workspace = true }
-solana-config-interface = { workspace = true, features = ["bincode"] }
+solana-config-program-client = { workspace = true, features = ["serde"] }
 solana-genesis-config = { workspace = true }
 solana-instruction = { workspace = true }
 solana-native-token = { workspace = true }

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels