feat: add modified slab from serum

This commit is contained in:
dboures 2023-05-06 20:06:19 -05:00
parent 1a08501095
commit 3aafa73d45
No known key found for this signature in database
GPG Key ID: AB3790129D478852
5 changed files with 630 additions and 133 deletions

299
Cargo.lock generated
View File

@ -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",
]

View File

@ -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"

View File

@ -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,

View File

@ -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;

454
src/structs/slab.rs Normal file
View File

@ -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::<InnerNode>();
const _LEAF_NODE_SIZE: usize = size_of::<LeafNode>();
const _FREE_NODE_SIZE: usize = size_of::<FreeNode>();
const _NODE_SIZE: usize = 72;
const _INNER_NODE_ALIGN: usize = align_of::<InnerNode>();
const _LEAF_NODE_ALIGN: usize = align_of::<LeafNode>();
const _FREE_NODE_ALIGN: usize = align_of::<FreeNode>();
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<u128> {
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<NodeRef> {
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<NodeRefMut> {
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<AnyNode> for InnerNode {
fn as_ref(&self) -> &AnyNode {
cast_ref(self)
}
}
impl AsRef<AnyNode> 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::<SlabHeader>();
#[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::<AnyNode>();
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::<SlabHeader>());
invariant((self.0.as_ptr() as usize) % align_of::<SlabHeader>() != 0);
invariant(
((self.0.as_ptr() as usize) + size_of::<SlabHeader>()) % align_of::<AnyNode>() != 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<NodeHandle> {
if self.header().leaf_count == 0 {
return None;
}
Some(self.header().root_node)
}
fn find_min_max(&self, find_max: bool) -> Option<NodeHandle> {
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<MarketInfo>,
) -> (Vec<Decimal>, Vec<Decimal>) {
let bid_keys = markets
.iter()
.map(|m| Pubkey::from_str(&m.bids_key).unwrap())
.collect::<Vec<Pubkey>>();
let ask_keys = markets
.iter()
.map(|m| Pubkey::from_str(&m.asks_key).unwrap())
.collect::<Vec<Pubkey>>();
// 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::<Vec<_>>();
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::<Vec<_>>();
(best_bids, best_asks)
}