diff --git a/Cargo.lock b/Cargo.lock index f166d8a..650fda4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,8 +103,8 @@ checksum = "cf7d535e1381be3de2c0716c0a1c1e32ad9df1042cddcf7bc18d743569e53319" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "regex", "syn 1.0.107", ] @@ -118,8 +118,8 @@ dependencies = [ "anchor-syn", "anyhow", "bs58 0.4.0", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "rustversion", "syn 1.0.107", ] @@ -131,7 +131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1be64a48e395fe00b8217287f226078be2cf32dae42fdf8a885b997945c3d28" dependencies = [ "anchor-syn", - "proc-macro2 1.0.49", + "proc-macro2 1.0.66", "syn 1.0.107", ] @@ -142,8 +142,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38ea6713d1938c0da03656ff8a693b17dc0396da66d1ba320557f07e86eca0d4" dependencies = [ "anchor-syn", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -155,8 +155,8 @@ checksum = "d401f11efb3644285685f8339829a9786d43ed7490bb1699f33c478d04d5a582" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -169,8 +169,8 @@ dependencies = [ "anchor-syn", "anyhow", "heck 0.3.3", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -182,8 +182,8 @@ checksum = "6ad769993b5266714e8939e47fbdede90e5c030333c7522d99a4d4748cf26712" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -195,8 +195,8 @@ checksum = "4e677fae4a016a554acdd0e3b7f178d3acafaa7e7ffac6b8690cf4e171f1c116" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -208,8 +208,8 @@ checksum = "340beef6809d1c3fcc7ae219153d981e95a8a277ff31985bd7050e32645dc9a8" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -258,9 +258,9 @@ dependencies = [ "anyhow", "bs58 0.3.1", "heck 0.3.3", - "proc-macro2 1.0.49", + "proc-macro2 1.0.66", "proc-macro2-diagnostics", - "quote 1.0.23", + "quote 1.0.33", "serde", "serde_json", "sha2 0.9.8", @@ -285,9 +285,9 @@ checksum = "159bb86af3a200e19a068f4224eae4c8bb2d0fa054c7e5d1cacd5cef95e684cd" [[package]] name = "arrayref" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" @@ -323,8 +323,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", "synstructure", ] @@ -335,8 +335,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -375,8 +375,8 @@ version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d1d8ab452a3936018a687b20e6f7cf5363d713b732b8884001317b0e48aa3" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -497,7 +497,7 @@ dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.49", + "proc-macro2 1.0.66", "syn 1.0.107", ] @@ -507,8 +507,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -518,8 +518,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -574,22 +574,22 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe233b960f12f8007e3db2d136e3cb1c291bfd7396e384ee76025fc1a3932b4" +checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2 1.0.66", + "quote 1.0.33", + "syn 2.0.29", ] [[package]] @@ -606,9 +606,9 @@ checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "bzip2" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6afcd980b5f3a45017c57e57a2fcccbb351cc43a356ce117ef760ef8052b89b0" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" dependencies = [ "bzip2-sys", "libc", @@ -732,8 +732,8 @@ checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" dependencies = [ "heck 0.4.0", "proc-macro-error", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -978,17 +978,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", - "syn 1.0.107", -] - [[package]] name = "dialoguer" version = "0.10.2" @@ -1056,8 +1045,8 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -1132,8 +1121,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f86b50932a01e7ec5c06160492ab660fb19b6bb2a7878030dd6cd68d21df9d4d" dependencies = [ "enum-ordinalize", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -1173,8 +1162,8 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8958699f9359f0b04e691a13850d48b7de329138023876d07cbd024c2c820598" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -1186,8 +1175,8 @@ checksum = "0b166c9e378360dd5a6666a9604bb4f54ae0cac39023ffbac425e917a2a04fef" dependencies = [ "num-bigint 0.4.3", "num-traits", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -1198,8 +1187,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eb359f1476bf611266ac1f5355bc14aeca37b299d0ebccc038ee7058891c9cb" dependencies = [ "once_cell", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -1216,6 +1205,27 @@ dependencies = [ "termcolor", ] +[[package]] +name = "errno" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "event-listener" version = "2.5.3" @@ -1224,9 +1234,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fastrand" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ "instant", ] @@ -1245,7 +1255,7 @@ checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "winapi", ] @@ -1329,8 +1339,8 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -1510,6 +1520,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + [[package]] name = "histogram" version = "0.6.9" @@ -1696,6 +1712,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.2", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "ipnet" version = "2.3.1" @@ -1770,9 +1797,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.138" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libloading" @@ -1838,6 +1865,12 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "lock_api" version = "0.4.6" @@ -1856,6 +1889,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown 0.12.3", +] + [[package]] name = "lz4" version = "1.24.0" @@ -1977,8 +2019,8 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -2065,8 +2107,8 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -2124,23 +2166,22 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.4" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" dependencies = [ - "derivative", "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.4" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro-crate 1.1.0", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -2220,8 +2261,8 @@ checksum = "4a0d9d1a6191c4f391f87219d1ea42b23f09ee84d64763cd05ee6ea88d9f384d" dependencies = [ "Inflector", "proc-macro-error", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -2255,7 +2296,7 @@ dependencies = [ "cfg-if", "instant", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "smallvec", "winapi", ] @@ -2268,7 +2309,7 @@ checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "smallvec", "windows-sys 0.42.0", ] @@ -2330,8 +2371,8 @@ version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -2414,8 +2455,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", "version_check", ] @@ -2426,8 +2467,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "version_check", ] @@ -2442,9 +2483,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.49" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -2455,8 +2496,8 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", "version_check", "yansi", @@ -2535,11 +2576,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.23" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ - "proc-macro2 1.0.49", + "proc-macro2 1.0.66", ] [[package]] @@ -2665,6 +2706,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" version = "0.4.3" @@ -2672,7 +2722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom 0.2.3", - "redox_syscall", + "redox_syscall 0.2.16", "thiserror", ] @@ -2693,15 +2743,6 @@ version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "reqwest" version = "0.11.13" @@ -2800,6 +2841,20 @@ dependencies = [ "nom", ] +[[package]] +name = "rustix" +version = "0.37.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + [[package]] name = "rustls" version = "0.20.7" @@ -2894,8 +2949,8 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -2940,9 +2995,9 @@ checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" [[package]] name = "serde" -version = "1.0.151" +version = "1.0.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0" +checksum = "be9b6f69f1dfd54c3b568ffa45c310d6973a5e5148fd40cf515acaf38cf5bc31" dependencies = [ "serde_derive", ] @@ -2958,13 +3013,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.151" +version = "1.0.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" +checksum = "dc59dfdcbad1437773485e0367fea4b090a2e0a16d9ffc46af47764536a298ec" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2 1.0.66", + "quote 1.0.33", + "syn 2.0.29", ] [[package]] @@ -3117,9 +3172,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "701ca0143761d40eb6e2933e8854d1c0a2918ede7419264b71bd142980c5fb32" +checksum = "714067d617d791bbfc3c4fd30de9e18e7b5f29b5c0853b1a17581a3e88389e71" dependencies = [ "Inflector", "base64 0.13.0", @@ -3142,9 +3197,9 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03f403a837de4e5d6135bb8100b7aa982a1e5ecc166386258ce3583cd12e2d7c" +checksum = "3de77d93db1d7bdf5854c0cad36acb21cf6c44d3119834241e64e6916c92f232" dependencies = [ "bincode", "bytemuck", @@ -3163,9 +3218,9 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6ec147cbc090269a141bfb8956e376c024aa7bf5813eb34c8288145a96595a" +checksum = "0847cc3ee77ee066c790fd115f4ac63884bb6fe1b4d0a68cdab20fa7f3e5ac29" dependencies = [ "borsh", "futures", @@ -3180,9 +3235,9 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c283d14c217ebb5aaa59cbcd3ed75df50f52074504aead0a1b1504d68a009a10" +checksum = "dd7ac5da826bf0769bcf86332c83bc5e6fcd6e8e371df736c7654f400b3cc56a" dependencies = [ "serde", "solana-sdk", @@ -3191,9 +3246,9 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1c8a1bac13f3b79ab5b1b9d40236a1c968002a33007b33dff1909b89783ecc" +checksum = "474d5c407da051d7548db2309100a0ce68c0ff761ad2a58a79818edd4bb08a85" dependencies = [ "bincode", "crossbeam-channel", @@ -3211,9 +3266,9 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d288b850b004df3b5ac8af53b0510c5fdf37a2240b6bdd2fb78f4625d30fa497" +checksum = "2e3001ff2ce5deca2371041e247c0b0bbdd0cd2c64a4615f6a332bb3af30b0da" dependencies = [ "bincode", "byteorder", @@ -3230,9 +3285,9 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df2cd8e820633da71a0167054a42d191bc829a00636d994cf92dec0a045445f" +checksum = "1b3b61131f0ae3ad2c6464a19daad5484974980e7ecb0a24ceb9fc8042b67829" dependencies = [ "log", "memmap2", @@ -3245,9 +3300,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94635c6ba33899361777993370090a027abcefda4463f0f51863e0508cc0cd8a" +checksum = "8a68198e8909cf912aa727e2f9f0b9ed7e6fecd330a8ad99c9e9ebe6d1a9a3ba" dependencies = [ "chrono", "clap 2.34.0", @@ -3263,9 +3318,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3185e08728970d1cb67dbcd887180feef72d05b2c0a3a3c61af7f3df5383ed" +checksum = "c0b74868956b9fb8d13fdc7710e4a7e7fec321e8698e777cc7c063686c7b14e0" dependencies = [ "dirs-next", "lazy_static", @@ -3279,9 +3334,9 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1263dd1bd7473cc367e703f5198396e11dc83be37d10fb3f12fceca0a1eec749" +checksum = "e076aa655a745d4d9455e61280568aa86f403022747c680ce54dcd1ce0f3cb95" dependencies = [ "async-mutex", "async-trait", @@ -3333,9 +3388,9 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abbbf355bee3a5ce0ac65d34ab892b866f064af0f84cfbbd9ae2316488a03fa9" +checksum = "3ff0f9a91a45d130012a0f79013ac5b612754bd4c0b3b0c127fc6870b8fb825b" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -3343,9 +3398,9 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16219e0c1b2f0c919f238c8951078b45b9c6c00b18acec547eebe2821d2db916" +checksum = "dbfadb7f09be905a08ed50090436c2e6e4bab17a84b8a4e03a94d79e5ce1693e" dependencies = [ "bincode", "chrono", @@ -3357,9 +3412,9 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435cfeb35c5f1e67e7e2ad5ac4106f04edaca0609ad52dbbc7ac051d884d6eca" +checksum = "7d9e45fb47f142f4ce69acffa4c942d64d96c6d43b24785813d1bdbb90d62833" dependencies = [ "bincode", "byteorder", @@ -3381,9 +3436,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5a383f43792311db749bbed4e7794222c9f118b609bc8252b4ea3ad88b4188" +checksum = "63117658963482734ad016e6b94d2d74599ad0f591ca63d5e0f831e233a85cdb" dependencies = [ "ahash", "blake3", @@ -3415,21 +3470,21 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e282539e770967500945cd2fdb78170a1ea45aff7ad1b4ce4e2cc0b557db8" +checksum = "c9eca469f181dcc35c81fb9e0c31c37d0d9abd13805e7cd82446b843a0232246" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "rustc_version", "syn 1.0.107", ] [[package]] name = "solana-logger" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2bcbaba2c683e7bf80ff4f3a3cdcdaabdb0b21333e8d89aed06be136193d39" +checksum = "6e6356aa0978dcdac6404fca123fbfa4c3a329e609fa9921d0e2d8c8cdd921cb" dependencies = [ "env_logger", "lazy_static", @@ -3438,9 +3493,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33bbb0e7ee37cdfd18f2636e687cfafcc2e85a7768e283941fd08da022bd0f66" +checksum = "4f84a46c881fc5ea3b955d1f2313ffa477aab3ec501782a1387319d2e2376d97" dependencies = [ "log", "solana-sdk", @@ -3448,9 +3503,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f77f7044d57975f001a2c8f3756e4a04f10ca886c69eb8ce0b1786aad52c663d" +checksum = "39d25eb6904dd33790f4fe47e48171677fd5402a2df2d82aee5453679ea46774" dependencies = [ "crossbeam-channel", "gethostname", @@ -3462,9 +3517,9 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e4f0b106e881e087226056612ed06ad3c4ff6260d3f9a1c1d54649c127d34f" +checksum = "ec98e671c2dbf742a698674e1f5e34121c2b9c0af661a261413b55bdab62aebc" dependencies = [ "bincode", "clap 3.2.23", @@ -3484,9 +3539,9 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02d0782ecaf35dafc7a88c63ec1f265edf6051b55489180d95757d71a4d66d6" +checksum = "c44da6dab9e9669c28a2ce6b700c4da97d4243f108cf222ee2cfebd6ea41fce5" dependencies = [ "ahash", "bincode", @@ -3511,9 +3566,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75602376f2cea17ac301292a3ded6db73e968310ac482857237d95a34473b62a" +checksum = "8481b0678be8450c423686483319076b2babf11f08cbc48aa6fae9f5cf1232ca" dependencies = [ "base64 0.13.0", "bincode", @@ -3560,9 +3615,9 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb4a1b61c005eb9c0767b215e428c51adfa6e0023691d37f05653a4cd29bce2b" +checksum = "f0b59b03f3fc3f27f9bac7e2d79923b9b9cde9a77bf9272724fc75f6a78af757" dependencies = [ "base64 0.13.0", "bincode", @@ -3587,9 +3642,9 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20b272afb2c20891cd073aa1c8c437b1f6c4cf9e2140b167f4656f59eea12d7" +checksum = "035c30da89fe5d2273ef35d8429ae8bba5664cf282fa7140fbe7992d1cbeb3ba" dependencies = [ "assert_matches", "async-trait", @@ -3612,9 +3667,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7091fe2ae498f482f549450e9c5c04e89867dd8622612c742e7c1586b11cc2c1" +checksum = "1f38eab4498e4f2764fb9a833383f35cf39a6f27249aa00b6b2759c6bc61d750" dependencies = [ "lazy_static", "num_cpus", @@ -3622,9 +3677,9 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874c76b56601eaf7a91a4d119824b57625c638ce42c601166d1e44eef4b28fc6" +checksum = "bd7466a3cf31c68fc38319aab88704162cefd80a5449a05486b5d7713376b620" dependencies = [ "console", "dialoguer", @@ -3641,9 +3696,9 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c023c21c8c5015113a33b1ec3644d913db2a591e06e6cca9a647bc9a0f58c0" +checksum = "94dedb61293addfb728e6e2fed9e78304764f3d5f455c6beeba5e49d163700bb" dependencies = [ "arrayref", "bincode", @@ -3662,6 +3717,7 @@ dependencies = [ "itertools", "lazy_static", "log", + "lru", "lz4", "memmap2", "num-derive", @@ -3701,9 +3757,9 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a46085d2548bb943e7210b28b09378e361350577b391a94457ad78af1a9f75ef" +checksum = "e67eb3cfd29f62d776fa248d57b730da8d927fa83c81b50cc6683b3f80c87429" dependencies = [ "assert_matches", "base64 0.13.0", @@ -3752,22 +3808,22 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa38323e649c70b698e49f1ded17849a9b5da2e0821a38ad08327307009e274" +checksum = "a9a86d529a78915940dcbdfd46d07fa7d64ac0e57a2688d7201fff5a55318653" dependencies = [ "bs58 0.4.0", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "rustversion", "syn 1.0.107", ] [[package]] name = "solana-send-transaction-service" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df295d36fc53f0a87d00334fef1fc68242b695531719685a160c190ac938da1" +checksum = "6c0681f3272e72fdc5e39f88e46722b173251b9661711d9c7b3b17024da3943f" dependencies = [ "crossbeam-channel", "log", @@ -3780,9 +3836,9 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c2463c564273fdabc6eb5d8aeacf4440aad54fcebf3b1bd57c12b5af81c299c" +checksum = "604aa9c54a992a2f2e203239ad7e2e7060a23cfb58b2cd0c1fac5909f58b6906" dependencies = [ "bincode", "log", @@ -3803,9 +3859,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ec79681ce38d1b80ffad5507a4b25f6fc9eba827a589fc789561a022a605cf" +checksum = "2959ab13acac7866b2c6b18cfb69d9d854671ae366cc09125767922f39dd81ad" dependencies = [ "crossbeam-channel", "futures-util", @@ -3832,9 +3888,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d3da9fd5d3d7b7c0bc8c071e614c15f73d75612b1a724a4ebf3139458cbb24" +checksum = "4e8031a9c3bdc2488bdd8223d0dcc879960310be8b25f1296308cf2b4d9e02d0" dependencies = [ "Inflector", "base64 0.13.0", @@ -3861,9 +3917,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9592a3fb652a0b84593e18935db930e5f7e9614efaf26e15f3cace1c6d47151" +checksum = "9252ad2a1ff40cf7b09285af6b6f5922267b04eab8cae0290f8caf29c281b12e" dependencies = [ "log", "rustc_version", @@ -3877,9 +3933,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eddab05371499a937a222f101fd9e2b708b87c575ca3cf01e0c012e14aff79d" +checksum = "61bb156d6953023d59b2473d18cdb135b4b26eef94e669a9ee3d412edeb6d1f8" dependencies = [ "bincode", "log", @@ -3898,9 +3954,9 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82ca75686a92656caf2aa29c66020dc1b2e1b1cc7ffce6ada8a6f89201d84d54" +checksum = "9abf672e9c7c3132d4afff94ed2b28d9e8b59eb878334081b7c9b8af0fb98031" dependencies = [ "bytemuck", "getrandom 0.1.16", @@ -3913,9 +3969,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.14.11" +version = "1.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d81faf1b8f5c550923f01e9b2c41aec8f646cceff7fd72ca6712d10a4022f163" +checksum = "c2853efabded5dce340cb67dc1f28f6db75dac219d9d9142d81073e2c43c9b7a" dependencies = [ "aes-gcm-siv", "arrayref", @@ -3978,9 +4034,9 @@ dependencies = [ [[package]] name = "spl-associated-token-account" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc000f0fdf1f12f99d77d398137c1751345b18c88258ce0f99b7872cf6c9bd6" +checksum = "978dba3bcbe88d0c2c58366c254d9ea41c5f73357e72fc0bdee4d6b5fc99c8f4" dependencies = [ "assert_matches", "borsh", @@ -3994,9 +4050,9 @@ dependencies = [ [[package]] name = "spl-governance" -version = "2.2.1" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c13bfa6d1b1e922fe0dca06ec53a43fd56706906586fe8d0154f420c78af5aa" +checksum = "f7a42340af2f3334ee1ee718e6d68b939c98cab4ceb381429f952c72d68e1ebf" dependencies = [ "arrayref", "bincode", @@ -4014,9 +4070,9 @@ dependencies = [ [[package]] name = "spl-governance-addin-api" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9451f56e707e635a40a285965e1927733c956a0049a08f4b6c80215445aba7f1" +checksum = "1e0feddb2c7efa42f39954e3bb1b0bfc6dc7e9292ca467eff40ecd934c14106b" dependencies = [ "borsh", "solana-program", @@ -4025,9 +4081,9 @@ dependencies = [ [[package]] name = "spl-governance-tools" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a206f0837415046d919f3075d6b3af9bd3f1f707c887898c335a6210b194627" +checksum = "3bd674d9e8f3fc9ea628dcbe56d48991ea1cb05b994a7845782572c705efd836" dependencies = [ "arrayref", "bincode", @@ -4067,9 +4123,9 @@ dependencies = [ [[package]] name = "spl-token-2022" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edb869dbe159b018f17fb9bfa67118c30f232d7f54a73742bc96794dff77ed8" +checksum = "0043b590232c400bad5ee9eb983ced003d15163c4c5d56b090ac6d9a57457b47" dependencies = [ "arrayref", "bytemuck", @@ -4117,8 +4173,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.0", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "rustversion", "syn 1.0.107", ] @@ -4152,8 +4208,19 @@ version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +dependencies = [ + "proc-macro2 1.0.66", + "quote 1.0.33", "unicode-ident", ] @@ -4163,8 +4230,8 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", "unicode-xid 0.2.2", ] @@ -4210,23 +4277,23 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] [[package]] name = "tempfile" -version = "3.3.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" dependencies = [ + "autocfg", "cfg-if", "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.48.0", ] [[package]] @@ -4278,8 +4345,8 @@ version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -4390,8 +4457,8 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9efc1aba077437943f7515666aa2b882dfabfbfdf89c819ea75a8d6e9eaba5e" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -4512,8 +4579,8 @@ version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", ] @@ -4721,6 +4788,7 @@ dependencies = [ "spl-governance-addin-api", "spl-token", "static_assertions", + "tempfile", ] [[package]] @@ -4789,8 +4857,8 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", "wasm-bindgen-shared", ] @@ -4813,7 +4881,7 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" dependencies = [ - "quote 1.0.23", + "quote 1.0.33", "wasm-bindgen-macro-support", ] @@ -4823,8 +4891,8 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", "wasm-bindgen-backend", "wasm-bindgen-shared", @@ -4915,21 +4983,51 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.0", "windows_aarch64_msvc 0.42.0", "windows_i686_gnu 0.42.0", "windows_i686_msvc 0.42.0", "windows_x86_64_gnu 0.42.0", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.0", "windows_x86_64_msvc 0.42.0", ] +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_msvc" version = "0.36.1" @@ -4942,6 +5040,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_i686_gnu" version = "0.36.1" @@ -4954,6 +5058,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_msvc" version = "0.36.1" @@ -4966,6 +5076,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_x86_64_gnu" version = "0.36.1" @@ -4978,12 +5094,24 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_msvc" version = "0.36.1" @@ -4996,6 +5124,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "winreg" version = "0.10.1" @@ -5071,8 +5205,8 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65f1a51723ec88c66d5d1fe80c841f17f63587d6691901d66be9bec6c3b51f73" dependencies = [ - "proc-macro2 1.0.49", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.33", "syn 1.0.107", "synstructure", ] diff --git a/README.md b/README.md index 724aa11..6a2bf6c 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Users can: # Development ## Rust -* Built and developed using - rust stable(`rustc 1.57.0 (f1edd0429 2021-11-29)`) +* Built and developed using rust toolchain **rustc 1.65.0 (897e37553 2022-11-02)** * Run rust based tests - `cargo test-sbf` * `run-generate-anchor-types.sh` generates latest anchor types file and writes to `./voter_stake_registry.ts` * To install the typescript client, do - `yarn add @blockworks-foundation/voter-stake-registry-client` diff --git a/programs/voter-stake-registry/Cargo.toml b/programs/voter-stake-registry/Cargo.toml index 05a9d80..aa52994 100644 --- a/programs/voter-stake-registry/Cargo.toml +++ b/programs/voter-stake-registry/Cargo.toml @@ -36,16 +36,16 @@ bytemuck = "1.9.1" # Recently the discriminator for new VoterWeightRecord accounts has changed, and upgrading # this dependency here without also upgrading the spl-governance program instance beforehand # would lead to VWR accounts that are unusable until the spl-governance program is upgraded. -spl-governance = { version = "=2.2.1", features = ["no-entrypoint"] } -spl-governance-addin-api = "=0.1.1" +spl-governance = { version = "=3.1.1", features = ["no-entrypoint"] } +spl-governance-addin-api = "=0.1.3" -solana-program = "1.14.10" +solana-program = "1.14.22" static_assertions = "1.1" [dev-dependencies] -solana-sdk = "1.14.10" -solana-program-test = "1.14.10" -solana-logger = "1.14.10" +solana-sdk = "1.14.22" +solana-program-test = "1.14.22" +solana-logger = "1.14.22" spl-token = { version = "^3.0.0", features = ["no-entrypoint"] } spl-associated-token-account = { version = "^1.0.3", features = ["no-entrypoint"] } bytemuck = "^1.7.2" @@ -54,3 +54,4 @@ bincode = "^1.3.1" log = "0.4.14" env_logger = "0.9.0" base64 = "0.13.0" +tempfile = "=3.6.0" \ No newline at end of file diff --git a/programs/voter-stake-registry/src/error.rs b/programs/voter-stake-registry/src/error.rs index 6cd7349..d1510bd 100644 --- a/programs/voter-stake-registry/src/error.rs +++ b/programs/voter-stake-registry/src/error.rs @@ -116,4 +116,10 @@ pub enum VsrError { // 6037 / 0x1795 #[msg("")] InvalidTimestampArguments, + // 6038 / 0x1796 + #[msg("")] + BadUnlockDepositAuthority, + // 6039 / 0x1797 + #[msg("")] + MintConfigNotUsed, } diff --git a/programs/voter-stake-registry/src/instructions/mod.rs b/programs/voter-stake-registry/src/instructions/mod.rs index ff21e3d..a5fdf3e 100644 --- a/programs/voter-stake-registry/src/instructions/mod.rs +++ b/programs/voter-stake-registry/src/instructions/mod.rs @@ -12,6 +12,7 @@ pub use internal_transfer_unlocked::*; pub use log_voter_info::*; pub use reset_lockup::*; pub use set_time_offset::*; +pub use unlock_deposit::*; pub use update_max_vote_weight::*; pub use update_voter_weight_record::*; pub use withdraw::*; @@ -30,6 +31,7 @@ mod internal_transfer_unlocked; mod log_voter_info; mod reset_lockup; mod set_time_offset; +mod unlock_deposit; mod update_max_vote_weight; mod update_voter_weight_record; mod withdraw; diff --git a/programs/voter-stake-registry/src/instructions/unlock_deposit.rs b/programs/voter-stake-registry/src/instructions/unlock_deposit.rs new file mode 100644 index 0000000..478cc7d --- /dev/null +++ b/programs/voter-stake-registry/src/instructions/unlock_deposit.rs @@ -0,0 +1,51 @@ +use crate::error::*; +use crate::state::*; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct UnlockDeposit<'info> { + pub registrar: AccountLoader<'info, Registrar>, + // checking the PDA address it just an extra precaution, + // the other constraints must be exhaustive + #[account( + mut, + seeds = [registrar.key().as_ref(), b"voter".as_ref(), voter_authority.key().as_ref()], + bump = voter.load()?.voter_bump, + has_one = voter_authority, + has_one = registrar)] + pub voter: AccountLoader<'info, Voter>, + pub voter_authority: Signer<'info>, + /// Authority for making a grant to this voter account + /// + /// Instruction validates grant_authority is the VotingMintConfig.grant_authority or + /// Registrar.realm_authority. + pub grant_authority: Signer<'info>, +} + +pub fn unlock_deposit(ctx: Context, deposit_entry_index: u8) -> Result<()> { + // Load accounts. + let registrar = &ctx.accounts.registrar.load()?; + let voter = &mut ctx.accounts.voter.load_mut()?; + + let deposit_entry = voter.active_deposit_mut(deposit_entry_index)?; + // Get the grant_authority for the DepositEntry + let mint_idx = deposit_entry.voting_mint_config_idx; + let mint_config: &VotingMintConfig = ®istrar.voting_mints[mint_idx as usize]; + let grant_authority = ctx.accounts.grant_authority.key(); + + // Validate the VotingMintConfig was initialized and is in use + require!(mint_config.in_use(), VsrError::MintConfigNotUsed); + + // Validate grant_authority is appropriate to unlock deposit + require!( + (grant_authority == registrar.realm_authority + || grant_authority == mint_config.grant_authority) + && grant_authority != Pubkey::default(), + VsrError::BadUnlockDepositAuthority + ); + + // Change the DepositEntry to unlock all unvested tokens + deposit_entry.unlock_deposit(); + + Ok(()) +} diff --git a/programs/voter-stake-registry/src/lib.rs b/programs/voter-stake-registry/src/lib.rs index 83f582f..3cbdf7d 100644 --- a/programs/voter-stake-registry/src/lib.rs +++ b/programs/voter-stake-registry/src/lib.rs @@ -218,4 +218,10 @@ pub mod voter_stake_registry { pub fn set_time_offset(ctx: Context, time_offset: i64) -> Result<()> { instructions::set_time_offset(ctx, time_offset) } + + /// _Requires signing by the VotingMintConfig.grant_authority or Registrar.realm_authority_ + /// Makes all tokens in a DepositEntry available for immediate withdrawal. + pub fn unlock_deposit(ctx: Context, deposit_entry_index: u8) -> Result<()> { + instructions::unlock_deposit(ctx, deposit_entry_index) + } } diff --git a/programs/voter-stake-registry/src/state/deposit_entry.rs b/programs/voter-stake-registry/src/state/deposit_entry.rs index 478df3e..38f4e68 100644 --- a/programs/voter-stake-registry/src/state/deposit_entry.rs +++ b/programs/voter-stake-registry/src/state/deposit_entry.rs @@ -376,6 +376,11 @@ impl DepositEntry { require_eq!(self.vested(curr_ts)?, 0, VsrError::InternalProgramError); Ok(()) } + + /// Makes all unvested tokens vested. Changes the LockUp to None + pub fn unlock_deposit(&mut self) { + self.lockup = Lockup::default(); + } } #[cfg(test)] diff --git a/programs/voter-stake-registry/tests/fixtures/spl_governance.so b/programs/voter-stake-registry/tests/fixtures/spl_governance.so index daf9335..b09f134 100755 Binary files a/programs/voter-stake-registry/tests/fixtures/spl_governance.so and b/programs/voter-stake-registry/tests/fixtures/spl_governance.so differ diff --git a/programs/voter-stake-registry/tests/program_test/addin.rs b/programs/voter-stake-registry/tests/program_test/addin.rs index 12e327f..3358ba2 100644 --- a/programs/voter-stake-registry/tests/program_test/addin.rs +++ b/programs/voter-stake-registry/tests/program_test/addin.rs @@ -805,6 +805,49 @@ impl AddinCookie { .await .unwrap(); } + + #[allow(dead_code)] + pub async fn unlock_deposit( + &self, + registrar: &RegistrarCookie, + voter: &VoterCookie, + voter_authority: &Keypair, + grant_authority: &Keypair, + deposit_entry_index: u8, + ) -> Result<(), BanksClientError> { + let data = + anchor_lang::InstructionData::data(&voter_stake_registry::instruction::UnlockDeposit { + deposit_entry_index, + }); + + let accounts = anchor_lang::ToAccountMetas::to_account_metas( + &voter_stake_registry::accounts::UnlockDeposit { + registrar: registrar.address, + voter: voter.address, + voter_authority: voter_authority.pubkey(), + grant_authority: grant_authority.pubkey(), + }, + None, + ); + + let instructions = vec![Instruction { + program_id: self.program_id, + accounts, + data, + }]; + + // clone the secrets + let voter_secret = Keypair::from_base58_string(&voter_authority.to_base58_string()); + let grant_authority_secret = + Keypair::from_base58_string(&grant_authority.to_base58_string()); + + self.solana + .process_transaction( + &instructions, + Some(&[&voter_secret, &grant_authority_secret]), + ) + .await + } } impl VotingMintConfigCookie { diff --git a/programs/voter-stake-registry/tests/program_test/governance.rs b/programs/voter-stake-registry/tests/program_test/governance.rs index d147d99..b39f685 100644 --- a/programs/voter-stake-registry/tests/program_test/governance.rs +++ b/programs/voter-stake-registry/tests/program_test/governance.rs @@ -79,11 +79,17 @@ impl GovernanceCookie { &community_token_mint.pubkey.unwrap(), &payer.pubkey(), None, - Some(*voter_weight_addin), + Some( + spl_governance::state::realm::GoverningTokenConfigAccountArgs { + voter_weight_addin: Some(*voter_weight_addin), + max_voter_weight_addin: None, + token_type: spl_governance::state::realm_config::GoverningTokenType::Liquid, + }, + ), None, name.to_string(), 0, - spl_governance::state::enums::MintMaxVoteWeightSource::SupplyFraction(10000000000), + spl_governance::state::enums::MintMaxVoterWeightSource::SupplyFraction(10000000000), )]; let signer = Keypair::from_base58_string(&payer.to_base58_string()); @@ -166,14 +172,22 @@ impl GovernanceRealmCookie { &authority.pubkey(), Some(voter.voter_weight_record), spl_governance::state::governance::GovernanceConfig { - vote_threshold_percentage: - spl_governance::state::enums::VoteThresholdPercentage::YesVote(50), + community_vote_threshold: + spl_governance::state::enums::VoteThreshold::YesVotePercentage(50), min_community_weight_to_create_proposal: 1000, min_transaction_hold_up_time: 0, - max_voting_time: 10, - vote_tipping: spl_governance::state::enums::VoteTipping::Disabled, - proposal_cool_off_time: 0, + voting_base_time: 10, + community_vote_tipping: spl_governance::state::enums::VoteTipping::Disabled, + council_vote_threshold: + spl_governance::state::enums::VoteThreshold::YesVotePercentage(50), + council_veto_vote_threshold: + spl_governance::state::enums::VoteThreshold::YesVotePercentage(50), min_council_weight_to_create_proposal: 1, + council_vote_tipping: spl_governance::state::enums::VoteTipping::Disabled, + community_veto_vote_threshold: + spl_governance::state::enums::VoteThreshold::YesVotePercentage(50), + voting_cool_off_time: 0, + deposit_exempt_proposal_count: 10, }, ), ]; @@ -221,14 +235,22 @@ impl GovernanceRealmCookie { &authority.pubkey(), Some(voter.voter_weight_record), spl_governance::state::governance::GovernanceConfig { - vote_threshold_percentage: - spl_governance::state::enums::VoteThresholdPercentage::YesVote(50), + community_vote_threshold: + spl_governance::state::enums::VoteThreshold::YesVotePercentage(50), min_community_weight_to_create_proposal: 1000, min_transaction_hold_up_time: 0, - max_voting_time: 10, - vote_tipping: spl_governance::state::enums::VoteTipping::Disabled, - proposal_cool_off_time: 0, + voting_base_time: 10, + community_vote_tipping: spl_governance::state::enums::VoteTipping::Disabled, + council_vote_threshold: + spl_governance::state::enums::VoteThreshold::YesVotePercentage(50), + council_veto_vote_threshold: + spl_governance::state::enums::VoteThreshold::YesVotePercentage(50), min_council_weight_to_create_proposal: 1, + council_vote_tipping: spl_governance::state::enums::VoteTipping::Disabled, + community_veto_vote_threshold: + spl_governance::state::enums::VoteThreshold::YesVotePercentage(50), + voting_cool_off_time: 0, + deposit_exempt_proposal_count: 10, }, true, ), @@ -263,7 +285,7 @@ impl GovernanceRealmCookie { &self.governance.program_id, &governance, &self.community_token_mint.pubkey.unwrap(), - &0u32.to_le_bytes(), + &Pubkey::default(), ); let instructions = vec![ @@ -282,7 +304,7 @@ impl GovernanceRealmCookie { proposal::VoteType::SingleChoice, vec!["yes".into()], true, - 0, + &Pubkey::default(), ), spl_governance::instruction::add_signatory( &self.governance.program_id, @@ -367,6 +389,7 @@ impl GovernanceRealmCookie { ) -> std::result::Result<(), BanksClientError> { let instructions = vec![spl_governance::instruction::relinquish_vote( &self.governance.program_id, + &self.realm, &governance, &proposal.address, &token_owner_record, diff --git a/programs/voter-stake-registry/tests/program_test/solana.rs b/programs/voter-stake-registry/tests/program_test/solana.rs index 8aa5899..dab234a 100644 --- a/programs/voter-stake-registry/tests/program_test/solana.rs +++ b/programs/voter-stake-registry/tests/program_test/solana.rs @@ -30,6 +30,7 @@ impl SolanaCookie { *self.program_output.write().unwrap() = super::ProgramOutput::default(); let mut context = self.context.borrow_mut(); + let recent_blockhash = context.banks_client.get_latest_blockhash().await.unwrap(); let mut transaction = Transaction::new_with_payer(&instructions, Some(&context.payer.pubkey())); @@ -40,11 +41,7 @@ impl SolanaCookie { all_signers.extend_from_slice(signers); } - // This fails when warping is involved - https://gitmemory.com/issue/solana-labs/solana/18201/868325078 - // let recent_blockhash = self.context.banks_client.get_recent_blockhash().await.unwrap(); - - transaction.sign(&all_signers, context.last_blockhash); - + transaction.sign(&all_signers, recent_blockhash); context .banks_client .process_transaction_with_commitment( diff --git a/programs/voter-stake-registry/tests/program_test/utils.rs b/programs/voter-stake-registry/tests/program_test/utils.rs index 47348af..09dbde2 100644 --- a/programs/voter-stake-registry/tests/program_test/utils.rs +++ b/programs/voter-stake-registry/tests/program_test/utils.rs @@ -3,6 +3,8 @@ use solana_program::program_error::ProgramError; use solana_sdk::pubkey::Pubkey; use solana_sdk::signature::Keypair; +use super::SolanaCookie; + #[allow(dead_code)] pub fn gen_signer_seeds<'a>(nonce: &'a u64, acc_pk: &'a Pubkey) -> [&'a [u8]; 2] { [acc_pk.as_ref(), bytes_of(nonce)] @@ -32,3 +34,36 @@ pub fn create_signer_key_and_nonce(program_id: &Pubkey, acc_pk: &Pubkey) -> (Pub pub fn clone_keypair(keypair: &Keypair) -> Keypair { Keypair::from_base58_string(&keypair.to_base58_string()) } + +#[derive(Debug, PartialEq)] +pub struct LockupData { + /// time since lockup start (saturating at "duration") + pub time_passed: u64, + /// duration of lockup + pub duration: u64, + pub amount_initially_locked_native: u64, + pub amount_deposited_native: u64, + pub amount_unlocked: u64, +} + +#[allow(dead_code)] +pub async fn get_lockup_data( + solana: &SolanaCookie, + voter: Pubkey, + index: u8, + time_offset: i64, +) -> LockupData { + let now = solana.get_clock().await.unix_timestamp + time_offset; + let voter = solana + .get_account::(voter) + .await; + let d = voter.deposits[index as usize]; + let duration = d.lockup.periods_total().unwrap() * d.lockup.kind.period_secs(); + LockupData { + time_passed: (duration - d.lockup.seconds_left(now)) as u64, + duration, + amount_initially_locked_native: d.amount_initially_locked_native, + amount_deposited_native: d.amount_deposited_native, + amount_unlocked: d.amount_unlocked(now), + } +} diff --git a/programs/voter-stake-registry/tests/test_basic.rs b/programs/voter-stake-registry/tests/test_basic.rs index a2f72cb..a592c0b 100644 --- a/programs/voter-stake-registry/tests/test_basic.rs +++ b/programs/voter-stake-registry/tests/test_basic.rs @@ -72,12 +72,6 @@ async fn test_basic() -> Result<(), TransportError> { .create_voter(®istrar, &token_owner_record, &voter_authority, &payer) .await; - // create the voter again, should have no effect - context - .addin - .create_voter(®istrar, &token_owner_record, &voter_authority, &payer) - .await; - // test deposit and withdraw let reference_account = context.users[1].token_accounts[0]; diff --git a/programs/voter-stake-registry/tests/test_reset_lockup.rs b/programs/voter-stake-registry/tests/test_reset_lockup.rs index 1eb94de..39bc7d5 100644 --- a/programs/voter-stake-registry/tests/test_reset_lockup.rs +++ b/programs/voter-stake-registry/tests/test_reset_lockup.rs @@ -1,36 +1,13 @@ use anchor_spl::token::TokenAccount; use program_test::*; use solana_program_test::*; -use solana_sdk::{pubkey::Pubkey, signature::Keypair, signer::Signer, transport::TransportError}; +use solana_sdk::{signature::Keypair, signer::Signer, transport::TransportError}; use std::cell::RefCell; use std::sync::Arc; use voter_stake_registry::state::LockupKind; mod program_test; -async fn get_lockup_data( - solana: &SolanaCookie, - voter: Pubkey, - index: u8, - time_offset: i64, -) -> (u64, u64, u64, u64, u64) { - let now = solana.get_clock().await.unix_timestamp + time_offset; - let voter = solana - .get_account::(voter) - .await; - let d = voter.deposits[index as usize]; - let duration = d.lockup.periods_total().unwrap() * d.lockup.kind.period_secs(); - ( - // time since lockup start (saturating at "duration") - (duration - d.lockup.seconds_left(now)) as u64, - // duration of lockup - duration, - d.amount_initially_locked_native, - d.amount_deposited_native, - d.amount_unlocked(now), - ) -} - #[allow(unaligned_references)] #[tokio::test] async fn test_reset_lockup() -> Result<(), TransportError> { @@ -132,24 +109,78 @@ async fn test_reset_lockup() -> Result<(), TransportError> { .await .unwrap(); deposit(7, 80).await.unwrap(); - assert_eq!(lockup_status(7).await, (0, 3 * day, 80, 80, 0)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: 0, + duration: 3 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 0 + } + ); deposit(7, 10).await.unwrap(); - assert_eq!(lockup_status(7).await, (0, 3 * day, 90, 90, 0)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: 0, + duration: 3 * day, + amount_initially_locked_native: 90, + amount_deposited_native: 90, + amount_unlocked: 0 + } + ); reset_lockup(7, 2, LockupKind::Daily) .await .expect_err("can't relock for less periods"); reset_lockup(7, 3, LockupKind::Daily).await.unwrap(); // just resets start to current timestamp - assert_eq!(lockup_status(7).await, (0, 3 * day, 90, 90, 0)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: 0, + duration: 3 * day, + amount_initially_locked_native: 90, + amount_deposited_native: 90, + amount_unlocked: 0 + } + ); // advance more than a day advance_time(day + hour).await; context.solana.advance_clock_by_slots(2).await; - assert_eq!(lockup_status(7).await, (day + hour, 3 * day, 90, 90, 30)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: day + hour, + duration: 3 * day, + amount_initially_locked_native: 90, + amount_deposited_native: 90, + amount_unlocked: 30 + } + ); deposit(7, 10).await.unwrap(); - assert_eq!(lockup_status(7).await, (hour, 2 * day, 70, 100, 30)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: hour, + duration: 2 * day, + amount_initially_locked_native: 70, + amount_deposited_native: 100, + amount_unlocked: 30 + } + ); reset_lockup(7, 10, LockupKind::Daily).await.unwrap(); - assert_eq!(lockup_status(7).await, (0, 10 * day, 100, 100, 0)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: 0, + duration: 10 * day, + amount_initially_locked_native: 100, + amount_deposited_native: 100, + amount_unlocked: 0 + } + ); // advance four more days advance_time(4 * day + hour).await; @@ -157,20 +188,50 @@ async fn test_reset_lockup() -> Result<(), TransportError> { assert_eq!( lockup_status(7).await, - (4 * day + hour, 10 * day, 100, 100, 40) + LockupData { + time_passed: 4 * day + hour, + duration: 10 * day, + amount_initially_locked_native: 100, + amount_deposited_native: 100, + amount_unlocked: 40 + } ); withdraw(7, 20).await.unwrap(); // partially withdraw vested assert_eq!( lockup_status(7).await, - (4 * day + hour, 10 * day, 100, 80, 20) + LockupData { + time_passed: 4 * day + hour, + duration: 10 * day, + amount_initially_locked_native: 100, + amount_deposited_native: 80, + amount_unlocked: 20 + } ); reset_lockup(7, 5, LockupKind::Daily) .await .expect_err("can't relock for less periods"); reset_lockup(7, 6, LockupKind::Daily).await.unwrap(); - assert_eq!(lockup_status(7).await, (0, 6 * day, 80, 80, 0)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: 0, + duration: 6 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 0 + } + ); reset_lockup(7, 8, LockupKind::Daily).await.unwrap(); - assert_eq!(lockup_status(7).await, (0, 8 * day, 80, 80, 0)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: 0, + duration: 8 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 0 + } + ); // advance three more days advance_time(3 * day + hour).await; @@ -178,20 +239,62 @@ async fn test_reset_lockup() -> Result<(), TransportError> { assert_eq!( lockup_status(7).await, - (3 * day + hour, 8 * day, 80, 80, 30) + LockupData { + time_passed: 3 * day + hour, + duration: 8 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 30 + } ); deposit(7, 10).await.unwrap(); - assert_eq!(lockup_status(7).await, (hour, 5 * day, 60, 90, 30)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: hour, + duration: 5 * day, + amount_initially_locked_native: 60, + amount_deposited_native: 90, + amount_unlocked: 30 + } + ); context.solana.advance_clock_by_slots(2).await; // avoid deposit and withdraw in one slot withdraw(7, 20).await.unwrap(); // partially withdraw vested - assert_eq!(lockup_status(7).await, (hour, 5 * day, 60, 70, 10)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: hour, + duration: 5 * day, + amount_initially_locked_native: 60, + amount_deposited_native: 70, + amount_unlocked: 10 + } + ); reset_lockup(7, 10, LockupKind::Daily).await.unwrap(); - assert_eq!(lockup_status(7).await, (0, 10 * day, 70, 70, 0)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: 0, + duration: 10 * day, + amount_initially_locked_native: 70, + amount_deposited_native: 70, + amount_unlocked: 0 + } + ); reset_lockup(7, 1, LockupKind::Monthly).await.unwrap(); - assert_eq!(lockup_status(7).await, (0, 1 * month, 70, 70, 0)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: 0, + duration: 1 * month, + amount_initially_locked_native: 70, + amount_deposited_native: 70, + amount_unlocked: 0 + } + ); reset_lockup(7, 31, LockupKind::Daily) .await @@ -203,7 +306,16 @@ async fn test_reset_lockup() -> Result<(), TransportError> { .await .expect_err("period shortnend"); reset_lockup(7, 31, LockupKind::Cliff).await.unwrap(); - assert_eq!(lockup_status(7).await, (0, 31 * day, 70, 70, 0)); + assert_eq!( + lockup_status(7).await, + LockupData { + time_passed: 0, + duration: 31 * day, + amount_initially_locked_native: 70, + amount_deposited_native: 70, + amount_unlocked: 0 + } + ); // tests for cliff vesting addin @@ -221,37 +333,127 @@ async fn test_reset_lockup() -> Result<(), TransportError> { .await .unwrap(); deposit(5, 80).await.unwrap(); - assert_eq!(lockup_status(5).await, (0, 3 * day, 80, 80, 0)); + assert_eq!( + lockup_status(5).await, + LockupData { + time_passed: 0, + duration: 3 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 0 + } + ); reset_lockup(5, 2, LockupKind::Cliff) .await .expect_err("can't relock for less periods"); reset_lockup(5, 3, LockupKind::Cliff).await.unwrap(); // just resets start to current timestamp - assert_eq!(lockup_status(5).await, (0, 3 * day, 80, 80, 0)); + assert_eq!( + lockup_status(5).await, + LockupData { + time_passed: 0, + duration: 3 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 0 + } + ); reset_lockup(5, 4, LockupKind::Cliff).await.unwrap(); - assert_eq!(lockup_status(5).await, (0, 4 * day, 80, 80, 0)); + assert_eq!( + lockup_status(5).await, + LockupData { + time_passed: 0, + duration: 4 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 0 + } + ); // advance to end of cliff advance_time(4 * day + hour).await; context.solana.advance_clock_by_slots(2).await; - assert_eq!(lockup_status(5).await, (4 * day, 4 * day, 80, 80, 80)); + assert_eq!( + lockup_status(5).await, + LockupData { + time_passed: 4 * day, + duration: 4 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 80 + } + ); reset_lockup(5, 1, LockupKind::Cliff).await.unwrap(); - assert_eq!(lockup_status(5).await, (0, 1 * day, 80, 80, 0)); + assert_eq!( + lockup_status(5).await, + LockupData { + time_passed: 0, + duration: 1 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 0 + } + ); withdraw(5, 10).await.expect_err("nothing unlocked"); // advance to end of cliff again advance_time(day + hour).await; context.solana.advance_clock_by_slots(2).await; - assert_eq!(lockup_status(5).await, (day, day, 80, 80, 80)); + assert_eq!( + lockup_status(5).await, + LockupData { + time_passed: day, + duration: day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 80 + } + ); withdraw(5, 10).await.unwrap(); - assert_eq!(lockup_status(5).await, (day, day, 80, 70, 70)); + assert_eq!( + lockup_status(5).await, + LockupData { + time_passed: day, + duration: day, + amount_initially_locked_native: 80, + amount_deposited_native: 70, + amount_unlocked: 70 + } + ); deposit(5, 5).await.unwrap(); - assert_eq!(lockup_status(5).await, (0, 0, 5, 75, 75)); + assert_eq!( + lockup_status(5).await, + LockupData { + time_passed: 0, + duration: 0, + amount_initially_locked_native: 5, + amount_deposited_native: 75, + amount_unlocked: 75 + } + ); reset_lockup(5, 1, LockupKind::Cliff).await.unwrap(); - assert_eq!(lockup_status(5).await, (0, 1 * day, 75, 75, 0)); + assert_eq!( + lockup_status(5).await, + LockupData { + time_passed: 0, + duration: 1 * day, + amount_initially_locked_native: 75, + amount_deposited_native: 75, + amount_unlocked: 0 + } + ); deposit(5, 15).await.unwrap(); - assert_eq!(lockup_status(5).await, (0, 1 * day, 90, 90, 0)); + assert_eq!( + lockup_status(5).await, + LockupData { + time_passed: 0, + duration: 1 * day, + amount_initially_locked_native: 90, + amount_deposited_native: 90, + amount_unlocked: 0 + } + ); Ok(()) } diff --git a/programs/voter-stake-registry/tests/test_unlock_deposit.rs b/programs/voter-stake-registry/tests/test_unlock_deposit.rs new file mode 100644 index 0000000..f20ea10 --- /dev/null +++ b/programs/voter-stake-registry/tests/test_unlock_deposit.rs @@ -0,0 +1,201 @@ +use anchor_spl::token::TokenAccount; +use program_test::*; +use solana_program_test::*; +use solana_sdk::{signature::Keypair, signer::Signer, transport::TransportError}; +use std::cell::RefCell; +use std::sync::Arc; +use voter_stake_registry::state::LockupKind; + +mod program_test; + +#[allow(unaligned_references)] +#[tokio::test] +async fn test_unlock_deposit() -> Result<(), TransportError> { + let context = TestContext::new().await; + let addin = &context.addin; + + let payer = &context.users[0].key; + let realm_authority = Keypair::new(); + let realm = context + .governance + .create_realm( + "testrealm", + realm_authority.pubkey(), + &context.mints[0], + &payer, + &context.addin.program_id, + ) + .await; + + let voter_authority = &context.users[1].key; + let token_owner_record = realm + .create_token_owner_record(voter_authority.pubkey(), &payer) + .await; + + let registrar = addin + .create_registrar(&realm, &realm_authority, payer) + .await; + let mngo_voting_mint = addin + .configure_voting_mint( + ®istrar, + &realm_authority, + payer, + 0, + &context.mints[0], + 0, + 1.0, + 0.0, + 5 * 365 * 24 * 60 * 60, + None, + None, + ) + .await; + + let voter = addin + .create_voter(®istrar, &token_owner_record, &voter_authority, &payer) + .await; + + let reference_account = context.users[1].token_accounts[0]; + let withdraw = |index: u8, amount: u64| { + addin.withdraw( + ®istrar, + &voter, + &mngo_voting_mint, + &voter_authority, + reference_account, + index, + amount, + ) + }; + let deposit = |index: u8, amount: u64| { + addin.deposit( + ®istrar, + &voter, + &mngo_voting_mint, + &voter_authority, + reference_account, + index, + amount, + ) + }; + + let unlock_deposit = |index: u8| { + addin.unlock_deposit( + ®istrar, + &voter, + &voter_authority, + &realm_authority, + index, + ) + }; + let time_offset = Arc::new(RefCell::new(0i64)); + let lockup_status = + |index: u8| get_lockup_data(&context.solana, voter.address, index, *time_offset.borrow()); + + let day = 24 * 60 * 60; + + // Test bad grant_authority + let deposit_entry_index = 1; + addin + .create_deposit_entry( + ®istrar, + &voter, + &voter_authority, + &mngo_voting_mint, + deposit_entry_index, + LockupKind::Daily, + None, + 3, + false, + ) + .await + .unwrap(); + deposit(deposit_entry_index, 80).await.unwrap(); + assert_eq!( + lockup_status(deposit_entry_index).await, + LockupData { + time_passed: 0, + duration: 3 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 0 + } + ); + addin + .unlock_deposit( + ®istrar, + &voter, + &voter_authority, + &voter_authority, + deposit_entry_index, + ) + .await + .expect_err("BadUnlockDepositAuthority"); + + // tests for daily vesting + let deposit_entry_index = 2; + addin + .create_deposit_entry( + ®istrar, + &voter, + &voter_authority, + &mngo_voting_mint, + deposit_entry_index, + LockupKind::Daily, + None, + 3, + false, + ) + .await + .unwrap(); + deposit(deposit_entry_index, 80).await.unwrap(); + assert_eq!( + lockup_status(deposit_entry_index).await, + LockupData { + time_passed: 0, + duration: 3 * day, + amount_initially_locked_native: 80, + amount_deposited_native: 80, + amount_unlocked: 0 + } + ); + deposit(deposit_entry_index, 10).await.unwrap(); + assert_eq!( + lockup_status(deposit_entry_index).await, + LockupData { + time_passed: 0, + duration: 3 * day, + amount_initially_locked_native: 90, + amount_deposited_native: 90, + amount_unlocked: 0 + } + ); + + unlock_deposit(deposit_entry_index).await?; + assert_eq!( + lockup_status(deposit_entry_index).await, + LockupData { + time_passed: 0, + duration: 0, + amount_initially_locked_native: 90, + amount_deposited_native: 90, + amount_unlocked: 90 + } + ); + + context.solana.advance_clock_by_slots(2).await; // avoid deposit and withdraw in one slot + + withdraw(deposit_entry_index, 90).await.unwrap(); // withdraw all previously locked tokens + assert_eq!( + lockup_status(deposit_entry_index).await, + LockupData { + time_passed: 0, + duration: 0, + amount_initially_locked_native: 90, + amount_deposited_native: 0, + amount_unlocked: 0 + } + ); + + Ok(()) +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..61c842d --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "1.65" +components = ["rustfmt", "clippy"] \ No newline at end of file