diff --git a/Cargo.lock b/Cargo.lock index 976f058..5081254 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -72,7 +72,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" dependencies = [ - "quote 1.0.23", + "quote 1.0.26", "syn 1.0.107", ] @@ -186,8 +186,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" dependencies = [ "actix-router", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -288,8 +288,8 @@ checksum = "cf7d535e1381be3de2c0716c0a1c1e32ad9df1042cddcf7bc18d743569e53319" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "regex", "syn 1.0.107", ] @@ -303,8 +303,8 @@ dependencies = [ "anchor-syn", "anyhow", "bs58 0.4.0", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "rustversion", "syn 1.0.107", ] @@ -316,7 +316,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1be64a48e395fe00b8217287f226078be2cf32dae42fdf8a885b997945c3d28" dependencies = [ "anchor-syn", - "proc-macro2 1.0.50", + "proc-macro2 1.0.56", "syn 1.0.107", ] @@ -327,8 +327,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38ea6713d1938c0da03656ff8a693b17dc0396da66d1ba320557f07e86eca0d4" dependencies = [ "anchor-syn", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -340,8 +340,8 @@ checksum = "d401f11efb3644285685f8339829a9786d43ed7490bb1699f33c478d04d5a582" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -354,8 +354,8 @@ dependencies = [ "anchor-syn", "anyhow", "heck 0.3.3", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -367,8 +367,8 @@ checksum = "6ad769993b5266714e8939e47fbdede90e5c030333c7522d99a4d4748cf26712" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -380,8 +380,8 @@ checksum = "4e677fae4a016a554acdd0e3b7f178d3acafaa7e7ffac6b8690cf4e171f1c116" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -410,8 +410,8 @@ checksum = "340beef6809d1c3fcc7ae219153d981e95a8a277ff31985bd7050e32645dc9a8" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -448,9 +448,9 @@ dependencies = [ "anyhow", "bs58 0.3.1", "heck 0.3.3", - "proc-macro2 1.0.50", + "proc-macro2 1.0.56", "proc-macro2-diagnostics", - "quote 1.0.23", + "quote 1.0.26", "serde", "serde_json", "sha2 0.9.9", @@ -528,8 +528,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", "synstructure", ] @@ -540,8 +540,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -590,8 +590,8 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -601,8 +601,8 @@ version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "705339e0e4a9690e2908d2b3d049d85682cf19fbd5782494498fbf7003a6a282" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -774,8 +774,8 @@ dependencies = [ "lazy_static", "lazycell", "peeking_take_while", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "regex", "rustc-hash", "shlex", @@ -864,7 +864,7 @@ dependencies = [ "borsh-derive-internal 0.9.3", "borsh-schema-derive-internal 0.9.3", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.50", + "proc-macro2 1.0.56", "syn 1.0.107", ] @@ -877,7 +877,7 @@ dependencies = [ "borsh-derive-internal 0.10.2", "borsh-schema-derive-internal 0.10.2", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.50", + "proc-macro2 1.0.56", "syn 1.0.107", ] @@ -887,8 +887,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -898,8 +898,8 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "186b734fa1c9f6743e90c95d7233c9faab6360d1a96d4ffa19d9cfd1e9350f8a" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -909,8 +909,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -920,8 +920,8 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99b7ff1008316626f485991b960ade129253d4034014616b94f309a15366cc49" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -1001,16 +1001,16 @@ version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] [[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", ] @@ -1021,8 +1021,8 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aca418a974d83d40a0c1f0c5cba6ff4bc28d8df099109ca459a2118d40b6322" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -1502,8 +1502,8 @@ dependencies = [ "cc", "codespan-reporting", "once_cell", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "scratch", "syn 1.0.107", ] @@ -1520,8 +1520,8 @@ version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65e07508b90551e610910fa648a1878991d367064997a596135b86df30daf07e" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -1589,8 +1589,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "rustc_version 0.4.0", "syn 1.0.107", ] @@ -1683,8 +1683,8 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -1803,8 +1803,8 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8958699f9359f0b04e691a13850d48b7de329138023876d07cbd024c2c820598" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -1815,8 +1815,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11f36e95862220b211a6e2aa5eca09b4fa391b13cd52ceb8035a24bf65a79de2" dependencies = [ "once_cell", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -1835,8 +1835,8 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -2085,8 +2085,8 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -2779,8 +2779,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" dependencies = [ "proc-macro-crate 0.1.5", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -3259,8 +3259,8 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -3382,8 +3382,8 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -3445,7 +3445,16 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.5.7", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", ] [[package]] @@ -3455,11 +3464,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" dependencies = [ "proc-macro-crate 1.2.1", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate 1.2.1", + "proc-macro2 1.0.56", + "quote 1.0.26", + "syn 2.0.15", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -3495,8 +3516,10 @@ dependencies = [ "anchor-client", "anchor-lang", "anyhow", + "arrayref", "async-trait", "borsh 0.9.3", + "bytemuck", "chrono", "derive_more", "dotenv", @@ -3505,6 +3528,7 @@ dependencies = [ "jsonrpc-core-client", "log 0.4.17", "num-traits", + "num_enum 0.6.1", "serde", "serde_derive", "serde_json", @@ -3542,8 +3566,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -3600,8 +3624,8 @@ checksum = "4a0d9d1a6191c4f391f87219d1ea42b23f09ee84d64763cd05ee6ea88d9f384d" dependencies = [ "Inflector", "proc-macro-error", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -3774,8 +3798,8 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -3838,7 +3862,7 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e97e3215779627f01ee256d2fad52f3d95e8e1c11e9fc6fd08f7cd455d5d5c78" dependencies = [ - "proc-macro2 1.0.50", + "proc-macro2 1.0.56", "syn 1.0.107", ] @@ -3869,8 +3893,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", "version_check 0.9.4", ] @@ -3881,8 +3905,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "version_check 0.9.4", ] @@ -3897,9 +3921,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ "unicode-ident", ] @@ -3910,8 +3934,8 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", "version_check 0.9.4", "yansi", @@ -3957,8 +3981,8 @@ checksum = "8bda8c0881ea9f722eb9629376db3d0b903b462477c1aafcb0566610ac28ac5d" dependencies = [ "anyhow", "itertools", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -3996,8 +4020,8 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -4074,11 +4098,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ - "proc-macro2 1.0.50", + "proc-macro2 1.0.56", ] [[package]] @@ -4465,8 +4489,8 @@ version = "0.7.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff26ed6c7c4dfc2aa9480b86a60e3c7233543a270a680e10758a507c5a4ce476" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -4683,8 +4707,8 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -4790,8 +4814,8 @@ version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -4845,7 +4869,7 @@ dependencies = [ "field-offset", "itertools", "num-traits", - "num_enum", + "num_enum 0.5.7", "safe-transmute", "serde", "solana-program", @@ -5364,8 +5388,8 @@ version = "1.14.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be23cc7a382f54dfe1348edb94610e5cc146b8eb21563cdd04062a403c75ba62" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "rustc_version 0.4.0", "syn 1.0.107", ] @@ -5437,7 +5461,7 @@ dependencies = [ "log 0.4.17", "lru", "num_cpus", - "num_enum", + "num_enum 0.5.7", "prost", "rand 0.7.3", "rand_chacha 0.2.2", @@ -5866,8 +5890,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d0acbad862093ea123f3a27364336dcb0c8373522cd6810496a34e932c56c1" dependencies = [ "bs58 0.4.0", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "rustversion", "syn 1.0.107", ] @@ -6200,7 +6224,7 @@ dependencies = [ "bytemuck", "num-derive", "num-traits", - "num_enum", + "num_enum 0.5.7", "solana-program", "thiserror", ] @@ -6215,7 +6239,7 @@ dependencies = [ "bytemuck", "num-derive", "num-traits", - "num_enum", + "num_enum 0.5.7", "solana-program", "solana-zk-token-sdk", "spl-memo", @@ -6308,8 +6332,8 @@ dependencies = [ "heck 0.4.0", "hex", "once_cell", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "serde", "serde_json", "sha2 0.10.6", @@ -6386,8 +6410,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.0", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "rustversion", "syn 1.0.107", ] @@ -6421,8 +6445,19 @@ version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +dependencies = [ + "proc-macro2 1.0.56", + "quote 1.0.26", "unicode-ident", ] @@ -6438,8 +6473,8 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", "unicode-xid 0.2.4", ] @@ -6521,8 +6556,8 @@ version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -6666,8 +6701,8 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -6852,9 +6887,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4" dependencies = [ "prettyplease", - "proc-macro2 1.0.50", + "proc-macro2 1.0.56", "prost-build", - "quote 1.0.23", + "quote 1.0.26", "syn 1.0.107", ] @@ -6928,8 +6963,8 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", ] @@ -7258,8 +7293,8 @@ dependencies = [ "bumpalo", "log 0.4.17", "once_cell", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", "wasm-bindgen-shared", ] @@ -7282,7 +7317,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.26", "wasm-bindgen-macro-support", ] @@ -7292,8 +7327,8 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", "wasm-bindgen-backend", "wasm-bindgen-shared", @@ -7615,8 +7650,8 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.107", "synstructure", ] diff --git a/Cargo.toml b/Cargo.toml index c94e07e..180022a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,10 @@ path = "src/worker/main.rs" name = "server" path = "src/server/main.rs" +[[bin]] +name = "backfill" +path = "src/backfill/main.rs" + [dependencies] tokio = { version = "1", features = ["full"] } tokio-stream = "0.1" @@ -51,3 +55,7 @@ serum_dex = { version = "0.5.10", git = "https://github.com/openbook-dex/program anchor-lang = ">=0.25.0" actix-web = "4" + +arrayref = "0.3.6" +bytemuck = "1.12.3" +num_enum = "0.6.1" \ No newline at end of file diff --git a/src/structs/coingecko.rs b/src/structs/coingecko.rs index 5998b68..a781c56 100644 --- a/src/structs/coingecko.rs +++ b/src/structs/coingecko.rs @@ -20,7 +20,6 @@ pub struct CoinGeckoTicker { pub last_price: f64, pub base_volume: f64, pub target_volume: f64, - pub liquidity_in_usd: f64, pub bid: f64, pub ask: f64, pub high: f64, diff --git a/src/structs/mod.rs b/src/structs/mod.rs index 4078c7a..113578c 100644 --- a/src/structs/mod.rs +++ b/src/structs/mod.rs @@ -3,5 +3,6 @@ pub mod coingecko; pub mod markets; pub mod openbook; pub mod resolution; +pub mod slab; pub mod trader; pub mod tradingview; diff --git a/src/structs/slab.rs b/src/structs/slab.rs new file mode 100644 index 0000000..1e11a0a --- /dev/null +++ b/src/structs/slab.rs @@ -0,0 +1,454 @@ +use anchor_lang::prelude::Pubkey; +use arrayref::{array_refs, mut_array_refs}; +use bytemuck::{cast, cast_mut, cast_ref, cast_slice, cast_slice_mut, Pod, Zeroable}; +use futures::join; +use num_enum::{IntoPrimitive, TryFromPrimitive}; +use solana_client::nonblocking::rpc_client::RpcClient; +use sqlx::types::Decimal; +use std::{ + convert::{identity, TryFrom}, + mem::{align_of, size_of}, + num::NonZeroU64, str::FromStr, +}; + +use crate::structs::openbook::token_factor; + +use super::markets::MarketInfo; + +pub type NodeHandle = u32; + +#[derive(IntoPrimitive, TryFromPrimitive, Debug)] +#[repr(u32)] +enum NodeTag { + Uninitialized = 0, + InnerNode = 1, + LeafNode = 2, + FreeNode = 3, + LastFreeNode = 4, +} + +#[derive(Copy, Clone, IntoPrimitive, TryFromPrimitive, Debug)] +#[repr(u8)] +pub enum FeeTier { + Base, + _SRM2, + _SRM3, + _SRM4, + _SRM5, + _SRM6, + _MSRM, + Stable, +} + +#[derive(Copy, Clone)] +#[repr(packed)] +#[allow(dead_code)] +struct InnerNode { + tag: u32, + prefix_len: u32, + key: u128, + children: [u32; 2], + _padding: [u64; 5], +} +unsafe impl Zeroable for InnerNode {} +unsafe impl Pod for InnerNode {} + +impl InnerNode { + fn walk_down(&self, search_key: u128) -> (NodeHandle, bool) { + let crit_bit_mask = (1u128 << 127) >> self.prefix_len; + let crit_bit = (search_key & crit_bit_mask) != 0; + (self.children[crit_bit as usize], crit_bit) + } +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +#[repr(packed)] +pub struct LeafNode { + pub tag: u32, + pub owner_slot: u8, + pub fee_tier: u8, + pub padding: [u8; 2], + pub key: u128, + pub owner: [u64; 4], + pub quantity: u64, + pub client_order_id: u64, +} +unsafe impl Zeroable for LeafNode {} +unsafe impl Pod for LeafNode {} + +impl LeafNode { + #[inline] + pub fn new( + owner_slot: u8, + key: u128, + owner: [u64; 4], + quantity: u64, + fee_tier: FeeTier, + client_order_id: u64, + ) -> Self { + LeafNode { + tag: NodeTag::LeafNode.into(), + owner_slot, + fee_tier: fee_tier.into(), + padding: [0; 2], + key, + owner, + quantity, + client_order_id, + } + } + + #[inline] + pub fn fee_tier(&self) -> FeeTier { + FeeTier::try_from_primitive(self.fee_tier).unwrap() + } + + #[inline] + pub fn price(&self) -> NonZeroU64 { + NonZeroU64::new((self.key >> 64) as u64).unwrap() + } + + #[inline] + pub fn order_id(&self) -> u128 { + self.key + } + + #[inline] + pub fn quantity(&self) -> u64 { + self.quantity + } + + #[inline] + pub fn set_quantity(&mut self, quantity: u64) { + self.quantity = quantity; + } + + #[inline] + pub fn owner(&self) -> [u64; 4] { + self.owner + } + + #[inline] + pub fn owner_slot(&self) -> u8 { + self.owner_slot + } + + #[inline] + pub fn client_order_id(&self) -> u64 { + self.client_order_id + } +} + +#[derive(Copy, Clone)] +#[repr(packed)] +#[allow(dead_code)] +struct FreeNode { + tag: u32, + next: u32, + _padding: [u64; 8], +} +unsafe impl Zeroable for FreeNode {} +unsafe impl Pod for FreeNode {} + +const fn _const_max(a: usize, b: usize) -> usize { + let gt = (a > b) as usize; + gt * a + (1 - gt) * b +} + +const _INNER_NODE_SIZE: usize = size_of::(); +const _LEAF_NODE_SIZE: usize = size_of::(); +const _FREE_NODE_SIZE: usize = size_of::(); +const _NODE_SIZE: usize = 72; + +const _INNER_NODE_ALIGN: usize = align_of::(); +const _LEAF_NODE_ALIGN: usize = align_of::(); +const _FREE_NODE_ALIGN: usize = align_of::(); +const _NODE_ALIGN: usize = 1; + +#[derive(Copy, Clone, Debug)] +#[repr(packed)] +#[allow(dead_code)] +pub struct AnyNode { + tag: u32, + data: [u32; 17], +} +unsafe impl Zeroable for AnyNode {} +unsafe impl Pod for AnyNode {} + +enum NodeRef<'a> { + Inner(&'a InnerNode), + Leaf(&'a LeafNode), +} + +enum NodeRefMut<'a> { + Inner(&'a mut InnerNode), + Leaf(&'a mut LeafNode), +} + +impl AnyNode { + fn key(&self) -> Option { + match self.case()? { + NodeRef::Inner(inner) => Some(inner.key), + NodeRef::Leaf(leaf) => Some(leaf.key), + } + } + + fn prefix_len(&self) -> u32 { + match self.case().unwrap() { + NodeRef::Inner(&InnerNode { prefix_len, .. }) => prefix_len, + NodeRef::Leaf(_) => 128, + } + } + + fn children(&self) -> Option<[u32; 2]> { + match self.case().unwrap() { + NodeRef::Inner(&InnerNode { children, .. }) => Some(children), + NodeRef::Leaf(_) => None, + } + } + + fn case(&self) -> Option { + match NodeTag::try_from(self.tag) { + Ok(NodeTag::InnerNode) => Some(NodeRef::Inner(cast_ref(self))), + Ok(NodeTag::LeafNode) => Some(NodeRef::Leaf(cast_ref(self))), + _ => None, + } + } + + fn case_mut(&mut self) -> Option { + match NodeTag::try_from(self.tag) { + Ok(NodeTag::InnerNode) => Some(NodeRefMut::Inner(cast_mut(self))), + Ok(NodeTag::LeafNode) => Some(NodeRefMut::Leaf(cast_mut(self))), + _ => None, + } + } + + #[inline] + pub fn as_leaf(&self) -> Option<&LeafNode> { + match self.case() { + Some(NodeRef::Leaf(leaf_ref)) => Some(leaf_ref), + _ => None, + } + } + + #[inline] + pub fn as_leaf_mut(&mut self) -> Option<&mut LeafNode> { + match self.case_mut() { + Some(NodeRefMut::Leaf(leaf_ref)) => Some(leaf_ref), + _ => None, + } + } +} + +impl AsRef for InnerNode { + fn as_ref(&self) -> &AnyNode { + cast_ref(self) + } +} + +impl AsRef for LeafNode { + #[inline] + fn as_ref(&self) -> &AnyNode { + cast_ref(self) + } +} + +#[derive(Copy, Clone, Debug)] +#[repr(packed)] +struct SlabHeader { + _bump_index: u64, + _free_list_len: u64, + _free_list_head: u32, + + root_node: u32, + leaf_count: u64, +} +unsafe impl Zeroable for SlabHeader {} +unsafe impl Pod for SlabHeader {} + +const SLAB_HEADER_LEN: usize = size_of::(); + +#[cfg(debug_assertions)] +unsafe fn invariant(check: bool) { + if check { + unreachable!(); + } +} + +#[cfg(not(debug_assertions))] +#[inline(always)] +unsafe fn invariant(check: bool) { + if check { + std::hint::unreachable_unchecked(); + } +} + +/// Mainly copied from the original code, slightly modified to make working with it easier. +#[repr(transparent)] +pub struct Slab([u8]); + +impl Slab { + /// Creates a slab that holds and references the bytes + /// + /// ```compile_fail + /// let slab = { + /// let mut bytes = [10; 100]; + /// serum_dex::critbit::Slab::new(&mut bytes) + /// }; + /// ``` + #[inline] + pub fn new(raw_bytes: &mut [u8]) -> &mut Self { + let data_end = raw_bytes.len() - 7; + let bytes = &mut raw_bytes[13..data_end]; + let len_without_header = bytes.len().checked_sub(SLAB_HEADER_LEN).unwrap(); + let slop = len_without_header % size_of::(); + let truncated_len = bytes.len() - slop; + let bytes = &mut bytes[..truncated_len]; + let slab: &mut Self = unsafe { &mut *(bytes as *mut [u8] as *mut Slab) }; + slab.check_size_align(); // check alignment + slab + } + + pub fn get(&self, key: u32) -> Option<&AnyNode> { + let node = self.nodes().get(key as usize)?; + let tag = NodeTag::try_from(node.tag); + match tag { + Ok(NodeTag::InnerNode) | Ok(NodeTag::LeafNode) => Some(node), + _ => None, + } + } + + fn check_size_align(&self) { + let (header_bytes, nodes_bytes) = array_refs![&self.0, SLAB_HEADER_LEN; .. ;]; + let _header: &SlabHeader = cast_ref(header_bytes); + let _nodes: &[AnyNode] = cast_slice(nodes_bytes); + } + + fn parts(&self) -> (&SlabHeader, &[AnyNode]) { + unsafe { + invariant(self.0.len() < size_of::()); + invariant((self.0.as_ptr() as usize) % align_of::() != 0); + invariant( + ((self.0.as_ptr() as usize) + size_of::()) % align_of::() != 0, + ); + } + + let (header_bytes, nodes_bytes) = array_refs![&self.0, SLAB_HEADER_LEN; .. ;]; + let header = cast_ref(header_bytes); + let nodes = cast_slice(nodes_bytes); + (header, nodes) + } + + fn header(&self) -> &SlabHeader { + self.parts().0 + } + + fn nodes(&self) -> &[AnyNode] { + self.parts().1 + } + + fn root(&self) -> Option { + if self.header().leaf_count == 0 { + return None; + } + + Some(self.header().root_node) + } + + fn find_min_max(&self, find_max: bool) -> Option { + let mut root: NodeHandle = self.root()?; + loop { + let root_contents = self.get(root).unwrap(); + match root_contents.case().unwrap() { + NodeRef::Inner(&InnerNode { children, .. }) => { + root = children[if find_max { 1 } else { 0 }]; + continue; + } + _ => return Some(root), + } + } + } + + #[inline] + pub fn find_min(&self) -> Option<&LeafNode> { + let handle = self.find_min_max(false).unwrap(); + match self.get(handle) { + Some(node) => Some(node.as_leaf().unwrap()), + None => None, + } + } + + #[inline] + pub fn find_max(&self) -> Option<&LeafNode> { + let handle = self.find_min_max(true).unwrap(); + match self.get(handle) { + Some(node) => Some(node.as_leaf().unwrap()), + None => None, + } + } + + pub fn get_best(&self, market: &MarketInfo, bid: bool) -> Decimal { + let min = if bid { + self.find_max() + } else { + self.find_min() + }; + + let price_lots = Decimal::from(min.unwrap().key >> 64); + let base_multiplier = token_factor(market.base_decimals); + let quote_multiplier = token_factor(market.quote_decimals); + let base_lot_size = Decimal::from(market.base_lot_size); + let quote_lot_size = Decimal::from(market.quote_lot_size); + (price_lots * quote_lot_size * base_multiplier) / (base_lot_size * quote_multiplier) + } +} + +pub async fn get_best_bids_and_asks( + client: RpcClient, + markets: &Vec, +) -> (Vec, Vec) { + let bid_keys = markets + .iter() + .map(|m| Pubkey::from_str(&m.bids_key).unwrap()) + .collect::>(); + let ask_keys = markets + .iter() + .map(|m| Pubkey::from_str(&m.asks_key).unwrap()) + .collect::>(); + + // will error if more than 100 markets are used (not a good idea in general) + let (bid_results, ask_results) = join!( + client.get_multiple_accounts(&bid_keys), + client.get_multiple_accounts(&ask_keys) + ); + + let bids = bid_results.unwrap(); + let asks = ask_results.unwrap(); + + let best_bids = bids + .into_iter() + .enumerate() + .filter_map(|(index, x)| { + if let Some(mut account) = x { + let slab = Slab::new(&mut account.data); + Some(slab.get_best(&markets[index], true)) + } else { + None + } + }) + .collect::>(); + + let best_asks = asks + .into_iter() + .enumerate() + .filter_map(|(index, x)| { + if let Some(mut account) = x { + let slab = Slab::new(&mut account.data); + Some(slab.get_best(&markets[index], false)) + } else { + None + } + }) + .collect::>(); + (best_bids, best_asks) +}