Update fills feed, disable connector-mango
This commit is contained in:
parent
cf26a885f2
commit
21f614b286
|
@ -104,7 +104,7 @@ checksum = "6b2d54853319fd101b8dd81de382bcbf3e03410a64d8928bbee85a3e7dcde483"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-attribute-access-control"
|
name = "anchor-attribute-access-control"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-syn",
|
"anchor-syn",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
@ -117,7 +117,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-attribute-account"
|
name = "anchor-attribute-account"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-syn",
|
"anchor-syn",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
@ -131,7 +131,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-attribute-constant"
|
name = "anchor-attribute-constant"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-syn",
|
"anchor-syn",
|
||||||
"proc-macro2 1.0.47",
|
"proc-macro2 1.0.47",
|
||||||
|
@ -141,7 +141,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-attribute-error"
|
name = "anchor-attribute-error"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-syn",
|
"anchor-syn",
|
||||||
"proc-macro2 1.0.47",
|
"proc-macro2 1.0.47",
|
||||||
|
@ -152,7 +152,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-attribute-event"
|
name = "anchor-attribute-event"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-syn",
|
"anchor-syn",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
@ -164,7 +164,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-attribute-interface"
|
name = "anchor-attribute-interface"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-syn",
|
"anchor-syn",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
@ -177,7 +177,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-attribute-program"
|
name = "anchor-attribute-program"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-syn",
|
"anchor-syn",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
@ -189,7 +189,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-attribute-state"
|
name = "anchor-attribute-state"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-syn",
|
"anchor-syn",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
@ -198,10 +198,26 @@ dependencies = [
|
||||||
"syn 1.0.103",
|
"syn 1.0.103",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anchor-client"
|
||||||
|
version = "0.25.0"
|
||||||
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
|
dependencies = [
|
||||||
|
"anchor-lang",
|
||||||
|
"anyhow",
|
||||||
|
"regex",
|
||||||
|
"serde",
|
||||||
|
"solana-account-decoder",
|
||||||
|
"solana-client",
|
||||||
|
"solana-sdk",
|
||||||
|
"thiserror",
|
||||||
|
"url 2.3.1",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-derive-accounts"
|
name = "anchor-derive-accounts"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-syn",
|
"anchor-syn",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
@ -213,7 +229,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-lang"
|
name = "anchor-lang"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#5d780a86dca69ef23c527217ae18358c3c9c2724"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-attribute-access-control",
|
"anchor-attribute-access-control",
|
||||||
"anchor-attribute-account",
|
"anchor-attribute-account",
|
||||||
|
@ -236,7 +252,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-spl"
|
name = "anchor-spl"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-lang",
|
"anchor-lang",
|
||||||
"solana-program",
|
"solana-program",
|
||||||
|
@ -247,7 +263,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anchor-syn"
|
name = "anchor-syn"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bs58 0.3.1",
|
"bs58 0.3.1",
|
||||||
|
@ -925,7 +941,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "checked_math"
|
name = "checked_math"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro-error",
|
"proc-macro-error",
|
||||||
"proc-macro2 1.0.47",
|
"proc-macro2 1.0.47",
|
||||||
|
@ -1003,6 +1019,36 @@ dependencies = [
|
||||||
"vec_map",
|
"vec_map",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "client"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
|
dependencies = [
|
||||||
|
"anchor-client",
|
||||||
|
"anchor-lang",
|
||||||
|
"anchor-spl",
|
||||||
|
"anyhow",
|
||||||
|
"base64 0.13.1",
|
||||||
|
"bincode",
|
||||||
|
"fixed",
|
||||||
|
"fixed-macro",
|
||||||
|
"itertools 0.10.5",
|
||||||
|
"log 0.4.17",
|
||||||
|
"mango-v4",
|
||||||
|
"pyth-sdk-solana",
|
||||||
|
"reqwest",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"serum_dex",
|
||||||
|
"shellexpand",
|
||||||
|
"solana-account-decoder",
|
||||||
|
"solana-client",
|
||||||
|
"solana-sdk",
|
||||||
|
"spl-associated-token-account",
|
||||||
|
"thiserror",
|
||||||
|
"tokio",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cloudabi"
|
name = "cloudabi"
|
||||||
version = "0.0.3"
|
version = "0.0.3"
|
||||||
|
@ -1423,6 +1469,15 @@ dependencies = [
|
||||||
"walkdir",
|
"walkdir",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dirs"
|
||||||
|
version = "4.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
|
||||||
|
dependencies = [
|
||||||
|
"dirs-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dirs-next"
|
name = "dirs-next"
|
||||||
version = "2.0.0"
|
version = "2.0.0"
|
||||||
|
@ -1433,6 +1488,17 @@ dependencies = [
|
||||||
"dirs-sys-next",
|
"dirs-sys-next",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dirs-sys"
|
||||||
|
version = "0.3.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"redox_users",
|
||||||
|
"winapi 0.3.9",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dirs-sys-next"
|
name = "dirs-sys-next"
|
||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
|
@ -2885,7 +2951,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mango-macro"
|
name = "mango-macro"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"quote 1.0.21",
|
"quote 1.0.21",
|
||||||
|
@ -2895,7 +2961,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mango-v4"
|
name = "mango-v4"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=solana-1.10.35#ca11d73be8bde6730dcdf9a6e467d6dd8341ab12"
|
source = "git+ssh://git@github.com/blockworks-foundation/mango-v4?branch=dev#19e2b8639407c8599c1f62d3b7fd282420e3c9d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anchor-lang",
|
"anchor-lang",
|
||||||
"anchor-spl",
|
"anchor-spl",
|
||||||
|
@ -2914,6 +2980,7 @@ dependencies = [
|
||||||
"serum_dex",
|
"serum_dex",
|
||||||
"solana-address-lookup-table-program",
|
"solana-address-lookup-table-program",
|
||||||
"solana-program",
|
"solana-program",
|
||||||
|
"solana-sdk",
|
||||||
"static_assertions",
|
"static_assertions",
|
||||||
"switchboard-program",
|
"switchboard-program",
|
||||||
"switchboard-utils",
|
"switchboard-utils",
|
||||||
|
@ -4880,8 +4947,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serum_dex"
|
name = "serum_dex"
|
||||||
version = "0.4.0"
|
version = "0.5.6"
|
||||||
source = "git+ssh://git@github.com/blockworks-foundation/serum-dex.git?branch=v4-compat#7033229b816af91cdeef3f14aff23a5e20be11f1"
|
source = "git+https://github.com/blockworks-foundation/serum-dex.git?branch=ckamm/find_by_key#c0b9f559daa74ec5960cc371a8bed610029a656b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayref",
|
"arrayref",
|
||||||
"bincode",
|
"bincode",
|
||||||
|
@ -4911,7 +4978,7 @@ dependencies = [
|
||||||
"bs58 0.4.0",
|
"bs58 0.4.0",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"log 0.4.17",
|
"log 0.3.9",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -4927,10 +4994,13 @@ dependencies = [
|
||||||
name = "service-mango-pnl"
|
name = "service-mango-pnl"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"anchor-client",
|
||||||
|
"anchor-lang",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"bs58 0.3.1",
|
"bs58 0.3.1",
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
|
"client",
|
||||||
"fixed",
|
"fixed",
|
||||||
"jsonrpsee",
|
"jsonrpsee",
|
||||||
"log 0.4.17",
|
"log 0.4.17",
|
||||||
|
@ -5052,6 +5122,15 @@ dependencies = [
|
||||||
"keccak",
|
"keccak",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "shellexpand"
|
||||||
|
version = "2.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4"
|
||||||
|
dependencies = [
|
||||||
|
"dirs",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shlex"
|
name = "shlex"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
@ -5461,7 +5540,7 @@ dependencies = [
|
||||||
"async-channel",
|
"async-channel",
|
||||||
"async-stream 0.2.1",
|
"async-stream 0.2.1",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"base64 0.13.1",
|
"base64 0.9.3",
|
||||||
"bs58 0.4.0",
|
"bs58 0.4.0",
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"bytes 1.2.1",
|
"bytes 1.2.1",
|
||||||
|
@ -5495,25 +5574,6 @@ dependencies = [
|
||||||
"warp",
|
"warp",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "solana-geyser-connector-mango"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"anyhow",
|
|
||||||
"async-trait",
|
|
||||||
"bs58 0.3.1",
|
|
||||||
"fixed",
|
|
||||||
"log 0.4.17",
|
|
||||||
"mango-v4",
|
|
||||||
"postgres-types",
|
|
||||||
"postgres_query",
|
|
||||||
"solana-geyser-connector-lib",
|
|
||||||
"solana-logger",
|
|
||||||
"tokio",
|
|
||||||
"tokio-postgres",
|
|
||||||
"toml",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-geyser-connector-plugin-grpc"
|
name = "solana-geyser-connector-plugin-grpc"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
12
Cargo.toml
12
Cargo.toml
|
@ -3,7 +3,7 @@ members = [
|
||||||
"geyser-plugin-grpc",
|
"geyser-plugin-grpc",
|
||||||
"lib",
|
"lib",
|
||||||
"connector-raw",
|
"connector-raw",
|
||||||
"connector-mango",
|
# "connector-mango",
|
||||||
"service-mango-fills",
|
"service-mango-fills",
|
||||||
"service-mango-pnl",
|
"service-mango-pnl",
|
||||||
]
|
]
|
||||||
|
@ -12,9 +12,7 @@ members = [
|
||||||
[patch.crates-io]
|
[patch.crates-io]
|
||||||
# for gzip encoded responses
|
# for gzip encoded responses
|
||||||
jsonrpc-core-client = { git = "https://github.com/ckamm/jsonrpc.git", branch = "ckamm/http-with-gzip" }
|
jsonrpc-core-client = { git = "https://github.com/ckamm/jsonrpc.git", branch = "ckamm/http-with-gzip" }
|
||||||
anchor-spl = { git = "ssh://git@github.com/blockworks-foundation/mango-v4", branch = "solana-1.10.35" }
|
# force usage of mango-v4 anchor submodule with 1.10.35 support
|
||||||
anchor-lang = { git = "ssh://git@github.com/blockworks-foundation/mango-v4", branch = "solana-1.10.35" }
|
anchor-spl = { git = "ssh://git@github.com/blockworks-foundation/mango-v4", branch = "dev" }
|
||||||
|
anchor-lang = { git = "ssh://git@github.com/blockworks-foundation/mango-v4", branch = "dev" }
|
||||||
[patch.'https://github.com/blockworks-foundation/serum-dex.git']
|
anchor-client = { git = "ssh://git@github.com/blockworks-foundation/mango-v4", branch = "dev" }
|
||||||
serum_dex = { git = 'ssh://git@github.com/blockworks-foundation/serum-dex.git', branch = "v4-compat" }
|
|
||||||
|
|
||||||
|
|
|
@ -14,13 +14,11 @@ use std::{
|
||||||
borrow::BorrowMut,
|
borrow::BorrowMut,
|
||||||
cmp::max,
|
cmp::max,
|
||||||
collections::{HashMap, HashSet},
|
collections::{HashMap, HashSet},
|
||||||
mem::size_of,
|
|
||||||
str::FromStr,
|
str::FromStr,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::metrics::MetricU64;
|
use crate::metrics::MetricU64;
|
||||||
use anchor_lang::AccountDeserialize;
|
use anchor_lang::AccountDeserialize;
|
||||||
use arrayref::array_ref;
|
|
||||||
use mango_v4::state::{
|
use mango_v4::state::{
|
||||||
AnyEvent, EventQueue, EventQueueHeader, EventType, FillEvent, MAX_NUM_EVENTS,
|
AnyEvent, EventQueue, EventQueueHeader, EventType, FillEvent, MAX_NUM_EVENTS,
|
||||||
};
|
};
|
||||||
|
|
|
@ -177,7 +177,7 @@ async fn main() -> anyhow::Result<()> {
|
||||||
.map(|c| c.connection_string.clone())
|
.map(|c| c.connection_string.clone())
|
||||||
.collect::<String>()
|
.collect::<String>()
|
||||||
);
|
);
|
||||||
let use_geyser = false;
|
let use_geyser = true;
|
||||||
if use_geyser {
|
if use_geyser {
|
||||||
grpc_plugin_source::process_events(
|
grpc_plugin_source::process_events(
|
||||||
&config.source,
|
&config.source,
|
||||||
|
|
|
@ -22,3 +22,6 @@ tokio = { version = "1", features = ["full"] }
|
||||||
serde = "1.0.130"
|
serde = "1.0.130"
|
||||||
serde_derive = "1.0.130"
|
serde_derive = "1.0.130"
|
||||||
mango-v4 = { git = "ssh://git@github.com/blockworks-foundation/mango-v4", branch = "dev" }
|
mango-v4 = { git = "ssh://git@github.com/blockworks-foundation/mango-v4", branch = "dev" }
|
||||||
|
client = { git = "ssh://git@github.com/blockworks-foundation/mango-v4", branch = "dev" }
|
||||||
|
anchor-lang = "0.25.0"
|
||||||
|
anchor-client = "0.25.0"
|
||||||
|
|
|
@ -8,22 +8,25 @@ use {
|
||||||
std::{
|
std::{
|
||||||
fs::File,
|
fs::File,
|
||||||
io::Read,
|
io::Read,
|
||||||
|
mem::size_of,
|
||||||
sync::{Arc, RwLock},
|
sync::{Arc, RwLock},
|
||||||
|
time::Duration,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use anchor_client::Cluster;
|
||||||
|
use anchor_lang::Discriminator;
|
||||||
|
use client::{chain_data, health_cache, AccountFetcher, Client, MangoGroupContext};
|
||||||
use fixed::types::I80F48;
|
use fixed::types::I80F48;
|
||||||
use mango::state::{DataType, MangoAccount, MangoCache, MangoGroup, MAX_PAIRS};
|
use mango_v4::state::{MangoAccount, MangoAccountValue, PerpMarketIndex};
|
||||||
use solana_geyser_connector_lib::metrics::*;
|
use solana_geyser_connector_lib::metrics::*;
|
||||||
use solana_sdk::account::ReadableAccount;
|
use solana_sdk::commitment_config::CommitmentConfig;
|
||||||
use std::mem::size_of;
|
use solana_sdk::{account::ReadableAccount, signature::Keypair};
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize)]
|
#[derive(Clone, Debug, Deserialize)]
|
||||||
pub struct PnlConfig {
|
pub struct PnlConfig {
|
||||||
pub update_interval_millis: u64,
|
pub update_interval_millis: u64,
|
||||||
pub mango_program: String,
|
pub mango_program: String,
|
||||||
pub mango_group: String,
|
pub mango_group: String,
|
||||||
pub mango_cache: String,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize)]
|
#[derive(Clone, Debug, Deserialize)]
|
||||||
|
@ -34,39 +37,54 @@ pub struct JsonRpcConfig {
|
||||||
#[derive(Clone, Debug, Deserialize)]
|
#[derive(Clone, Debug, Deserialize)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub source: SourceConfig,
|
pub source: SourceConfig,
|
||||||
|
pub snapshot_source: SnapshotSourceConfig,
|
||||||
pub metrics: MetricsConfig,
|
pub metrics: MetricsConfig,
|
||||||
pub pnl: PnlConfig,
|
pub pnl: PnlConfig,
|
||||||
pub jsonrpc_server: JsonRpcConfig,
|
pub jsonrpc_server: JsonRpcConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
type PnlData = Vec<(Pubkey, [I80F48; MAX_PAIRS])>;
|
type PnlData = Vec<(Pubkey, Vec<(PerpMarketIndex, I80F48)>)>;
|
||||||
|
|
||||||
fn compute_pnl(
|
fn compute_pnl(
|
||||||
account: &MangoAccount,
|
context: Arc<MangoGroupContext>,
|
||||||
market_index: usize,
|
account_fetcher: Arc<impl AccountFetcher>,
|
||||||
group: &MangoGroup,
|
account: &MangoAccountValue,
|
||||||
cache: &MangoCache,
|
) -> anyhow::Result<Vec<(PerpMarketIndex, I80F48)>> {
|
||||||
) -> I80F48 {
|
let health_cache = health_cache::new(&context, account_fetcher.as_ref(), account)?;
|
||||||
let perp_account = &account.perp_accounts[market_index];
|
let perp_settle_health = health_cache.perp_settle_health();
|
||||||
let perp_market_cache = &cache.perp_market_cache[market_index];
|
|
||||||
let price = cache.price_cache[market_index].price;
|
|
||||||
let contract_size = group.perp_markets[market_index].base_lot_size;
|
|
||||||
|
|
||||||
let base_pos = I80F48::from_num(perp_account.base_position * contract_size) * price;
|
let pnls = account
|
||||||
let quote_pos = perp_account.get_quote_position(&perp_market_cache);
|
.active_perp_positions()
|
||||||
base_pos + quote_pos
|
.filter_map(|pp| {
|
||||||
|
if pp.base_position_lots() != 0 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let pnl = pp.quote_position_native();
|
||||||
|
let settleable_pnl = if pnl > 0 {
|
||||||
|
pnl
|
||||||
|
} else if pnl < 0 && perp_settle_health > 0 {
|
||||||
|
pnl.max(-perp_settle_health)
|
||||||
|
} else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
Some((pp.market_index, settleable_pnl))
|
||||||
|
})
|
||||||
|
.collect::<Vec<(PerpMarketIndex, I80F48)>>();
|
||||||
|
|
||||||
|
Ok(pnls)
|
||||||
}
|
}
|
||||||
|
|
||||||
// regularly updates pnl_data from chain_data
|
// regularly updates pnl_data from chain_data
|
||||||
fn start_pnl_updater(
|
fn start_pnl_updater(
|
||||||
config: PnlConfig,
|
config: PnlConfig,
|
||||||
|
context: Arc<MangoGroupContext>,
|
||||||
|
account_fetcher: Arc<impl AccountFetcher + 'static>,
|
||||||
chain_data: Arc<RwLock<ChainData>>,
|
chain_data: Arc<RwLock<ChainData>>,
|
||||||
pnl_data: Arc<RwLock<PnlData>>,
|
pnl_data: Arc<RwLock<PnlData>>,
|
||||||
metrics_pnls_tracked: MetricU64,
|
metrics_pnls_tracked: MetricU64,
|
||||||
) {
|
) {
|
||||||
let program_pk = Pubkey::from_str(&config.mango_program).unwrap();
|
let program_pk = Pubkey::from_str(&config.mango_program).unwrap();
|
||||||
let group_pk = Pubkey::from_str(&config.mango_group).unwrap();
|
let group_pk = Pubkey::from_str(&config.mango_group).unwrap();
|
||||||
let cache_pk = Pubkey::from_str(&config.mango_cache).unwrap();
|
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
loop {
|
loop {
|
||||||
|
@ -79,33 +97,29 @@ fn start_pnl_updater(
|
||||||
|
|
||||||
// get the group and cache now
|
// get the group and cache now
|
||||||
let group = snapshot.get(&group_pk);
|
let group = snapshot.get(&group_pk);
|
||||||
let cache = snapshot.get(&cache_pk);
|
if group.is_none() {
|
||||||
if group.is_none() || cache.is_none() {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let group: &MangoGroup = bytemuck::from_bytes(group.unwrap().account.data());
|
|
||||||
let cache: &MangoCache = bytemuck::from_bytes(cache.unwrap().account.data());
|
|
||||||
|
|
||||||
let mut pnls = Vec::with_capacity(snapshot.len());
|
let mut pnls = Vec::with_capacity(snapshot.len());
|
||||||
for (pubkey, account) in snapshot.iter() {
|
for (pubkey, account) in snapshot.iter() {
|
||||||
let owner = account.account.owner();
|
let owner = account.account.owner();
|
||||||
let data = account.account.data();
|
let data = account.account.data();
|
||||||
|
|
||||||
if data.len() != size_of::<MangoAccount>()
|
if data.len() != size_of::<MangoAccount>()
|
||||||
|| data[0] != DataType::MangoAccount as u8
|
|| data[0..8] != MangoAccount::discriminator()
|
||||||
|| owner != &program_pk
|
|| owner != &program_pk
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mango_account: &MangoAccount = bytemuck::from_bytes(data);
|
let mango_account = MangoAccountValue::from_bytes(&data[8..]).unwrap();
|
||||||
if mango_account.mango_group != group_pk {
|
if mango_account.fixed.group != group_pk {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut pnl_vals = [I80F48::ZERO; MAX_PAIRS];
|
let pnl_vals =
|
||||||
for market_index in 0..MAX_PAIRS {
|
compute_pnl(context.clone(), account_fetcher.clone(), &mango_account).unwrap();
|
||||||
pnl_vals[market_index] = compute_pnl(mango_account, market_index, group, cache);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alternatively, we could prepare the sorted and limited lists for each
|
// Alternatively, we could prepare the sorted and limited lists for each
|
||||||
// market here. That would be faster and cause less contention on the pnl_data
|
// market here. That would be faster and cause less contention on the pnl_data
|
||||||
|
@ -158,11 +172,11 @@ fn start_jsonrpc_server(
|
||||||
metrics_invalid_reqs.clone().increment();
|
metrics_invalid_reqs.clone().increment();
|
||||||
return invalid("'limit' must be <= 20");
|
return invalid("'limit' must be <= 20");
|
||||||
}
|
}
|
||||||
let market_index = req.market_index as usize;
|
let market_index = req.market_index as u16;
|
||||||
if market_index >= MAX_PAIRS {
|
// if market_index >= MAX_PAIRS {
|
||||||
metrics_invalid_reqs.clone().increment();
|
// metrics_invalid_reqs.clone().increment();
|
||||||
return invalid("'market_index' must be < MAX_PAIRS");
|
// return invalid("'market_index' must be < MAX_PAIRS");
|
||||||
}
|
// }
|
||||||
if req.order != "ASC" && req.order != "DESC" {
|
if req.order != "ASC" && req.order != "DESC" {
|
||||||
metrics_invalid_reqs.clone().increment();
|
metrics_invalid_reqs.clone().increment();
|
||||||
return invalid("'order' must be ASC or DESC");
|
return invalid("'order' must be ASC or DESC");
|
||||||
|
@ -171,15 +185,29 @@ fn start_jsonrpc_server(
|
||||||
// write lock, because we sort in-place...
|
// write lock, because we sort in-place...
|
||||||
let mut pnls = pnl_data.write().unwrap();
|
let mut pnls = pnl_data.write().unwrap();
|
||||||
if req.order == "ASC" {
|
if req.order == "ASC" {
|
||||||
pnls.sort_unstable_by(|a, b| a.1[market_index].cmp(&b.1[market_index]));
|
pnls.sort_unstable_by(|a, b| {
|
||||||
|
a.1.iter()
|
||||||
|
.find(|x| x.0 == market_index)
|
||||||
|
.cmp(&b.1.iter().find(|x| x.0 == market_index))
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
pnls.sort_unstable_by(|a, b| b.1[market_index].cmp(&a.1[market_index]));
|
pnls.sort_unstable_by(|a, b| {
|
||||||
|
b.1.iter()
|
||||||
|
.find(|x| x.0 == market_index)
|
||||||
|
.cmp(&a.1.iter().find(|x| x.0 == market_index))
|
||||||
|
});
|
||||||
}
|
}
|
||||||
let response = pnls
|
let response = pnls
|
||||||
.iter()
|
.iter()
|
||||||
.take(limit)
|
.take(limit)
|
||||||
.map(|p| PnlResponseItem {
|
.map(|p| PnlResponseItem {
|
||||||
pnl: p.1[market_index].to_num::<f64>(),
|
pnl: p
|
||||||
|
.1
|
||||||
|
.iter()
|
||||||
|
.find(|x| x.0 == market_index)
|
||||||
|
.unwrap()
|
||||||
|
.1
|
||||||
|
.to_num::<f64>(),
|
||||||
pubkey: p.0.to_string(),
|
pubkey: p.0.to_string(),
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
@ -208,6 +236,28 @@ async fn main() -> anyhow::Result<()> {
|
||||||
solana_logger::setup_with_default("info");
|
solana_logger::setup_with_default("info");
|
||||||
info!("startup");
|
info!("startup");
|
||||||
|
|
||||||
|
let rpc_url = config.snapshot_source.rpc_http_url;
|
||||||
|
let ws_url = rpc_url.replace("https", "wss");
|
||||||
|
let rpc_timeout = Duration::from_secs(10);
|
||||||
|
let cluster = Cluster::Custom(rpc_url.clone(), ws_url.clone());
|
||||||
|
let commitment = CommitmentConfig::processed();
|
||||||
|
let client = Client::new(
|
||||||
|
cluster.clone(),
|
||||||
|
commitment,
|
||||||
|
&Keypair::new(),
|
||||||
|
Some(rpc_timeout),
|
||||||
|
);
|
||||||
|
let group_context = Arc::new(MangoGroupContext::new_from_rpc(
|
||||||
|
Pubkey::from_str(&config.pnl.mango_group).unwrap(),
|
||||||
|
client.cluster.clone(),
|
||||||
|
client.commitment,
|
||||||
|
)?);
|
||||||
|
let chain_data = Arc::new(RwLock::new(chain_data::ChainData::new()));
|
||||||
|
let account_fetcher = Arc::new(chain_data::AccountFetcher {
|
||||||
|
chain_data: chain_data.clone(),
|
||||||
|
rpc: client.rpc(),
|
||||||
|
});
|
||||||
|
|
||||||
let metrics_tx = metrics::start(config.metrics, "pnl".into());
|
let metrics_tx = metrics::start(config.metrics, "pnl".into());
|
||||||
|
|
||||||
let metrics_reqs =
|
let metrics_reqs =
|
||||||
|
@ -221,6 +271,8 @@ async fn main() -> anyhow::Result<()> {
|
||||||
|
|
||||||
start_pnl_updater(
|
start_pnl_updater(
|
||||||
config.pnl.clone(),
|
config.pnl.clone(),
|
||||||
|
group_context.clone(),
|
||||||
|
account_fetcher.clone(),
|
||||||
chain_data.clone(),
|
chain_data.clone(),
|
||||||
pnl_data.clone(),
|
pnl_data.clone(),
|
||||||
metrics_pnls_tracked,
|
metrics_pnls_tracked,
|
||||||
|
|
Loading…
Reference in New Issue