99: Add read-only Phoenix Perps positions to EvelynPerpsService

This commit is contained in:
2026-10-23 12:11:22 +02:00
parent df5cc0eda7
commit 7e36b7ef95
17 changed files with 734 additions and 40 deletions
+25 -12
View File
@@ -436,24 +436,37 @@ Price Index beregnes og vises, mens de øvrige fem felter fortsat er nul. Legacy
`EvelynPerpsService` udleverer et immutable `PerpsSnapshot` gennem det parameterløse
`getPositionsSnapshot()`. Læsning foretager ingen integrationskald. Hub'en starter separate processer
`evelyn.perps.prod` og `evelyn.perps.test` og injicerer de tilsvarende eksisterende `JupiterPerpsService`-views.
`evelyn.perps.prod` og `evelyn.perps.test`, injicerer de tilsvarende eksisterende `JupiterPerpsService`-views
og en fælles `PhoenixPerpsService` uden positionscache registreret som `phoenix.perps.default`.
`PerpsWalletConfiguration` indeholder en `SolanaWalletId`-adresse, der også bruges som række-ID og label.
Hub'en ejer de hardcodede lister: seks PROD-adresser og én TEST-adresse fra issue #98.
Begge integrationer læser de samme wallets i det pågældende miljø.
Servicen henter åbne Jupiter-positioner asynkront ved start og venter 60 sekunder efter hvert gennemløb,
så runder ikke overlapper. Den eksisterende Solana-cache med 60 sekunders TTL bevares. Data er derfor ikke
øjeblikkelige børsdata. Positionskontoen er stabilt ID; retning og `positionSize()` vises, kendte mints
bliver SOL-PERP/BTC-PERP/ETH-PERP, og ukendte mints vises som adressen. Positioner sorteres efter konto.
Servicen henter åbne Jupiter- og Phoenix-positioner asynkront ved start og venter 60 sekunder efter hvert
fuldført gennemløb, så runder ikke overlapper. Den eksisterende Solana-cache med 60 sekunders TTL bevares
for Jupiter. Phoenix læses gennem REST med 10 sekunders timeout pr. request, mindst ét sekund mellem
request-start på tværs af miljøer og fælles cooldown ved HTTP 429. Data er periodiske snapshots.
Før første vellykkede opslag er der ingen positioner. Hver wallets succes publiceres i et nyt snapshot;
fejl logges og bevarer den wallets sidste data uden at afbryde de øvrige. Et vellykket tomt svar fjerner
positionerne, men bevarer wallet/Jupiter-gruppen. Der vises ingen indikator for forældede data.
Implementationens `close()` afbryder worker'en; consumer-API'et indeholder kun læsning.
Jupiters positionskonto er stabilt ID; retning og `positionSize()` vises, kendte mints bliver
SOL-PERP/BTC-PERP/ETH-PERP, og ukendte mints vises som adressen. Positioner sorteres efter konto.
Phoenix bruger authority-wallet og trader PDA index 0 med alle returnerede cross/isolated-subaccounts.
Kun nonzero-positioner medtages. ID og sortering bygger på PDA-index, subaccount-index og markedssymbol;
sekvensnumre indgår ikke. Retningen kommer fra signed quantity, label er fx SOL-PERP, og USD-størrelsen er
absolut base-mængde gange mark price, beregnet med decimalpræcision. Se [Phoenix-integrationen](PhoenixPerps.md)
for dokumenterede enheder, endpoints og begrænsninger.
Før første vellykkede opslag er der ingen positioner. Succes publiceres i et nyt snapshot pr. wallet/venue;
fejl logges og bevarer netop den kombinations sidste data. De øvrige venues og wallets forsøges stadig.
Et vellykket tomt svar fjerner kun den pågældende venues positioner og bevarer gruppen.
Fejl i HTTP, authentication, svarformat eller konvertering er ikke tomme porteføljer.
Der vises ingen indikator for forældede data. Implementationens `close()` afbryder worker'en;
consumer-API'et indeholder kun læsning.
EMC spørger hver miljøservice straks ved åbning og hvert tredje sekund uden at blokere JavaFX-tråden.
Skjul/luk stopper kun EMC-polling; services fortsætter. Træstruktur, tre kolonner, farver, formatering,
foldestatus og markering bevares for eksisterende rækker. Nye/lukkede positioner afstemmes efter ID.
Der er ingen sample-positioner, Phoenix-eksempler, sample-tekster, Refresh-knap eller handel.
Skjul/luk stopper kun EMC-polling; services fortsætter. Træet er wallet → venue → position med Jupiter før
Phoenix og uden et ekstra subaccount-niveau. Tre kolonner, farver, formatering, foldestatus og markering
bevares for eksisterende rækker. Nye/lukkede positioner afstemmes efter ID.
Der er ingen sample-data, Refresh-knap, handel, signering eller kontoaktivering i denne læsevej.
Den kanoniske systembeskrivelse findes i
[Evelyn: services og status](../../r35157_docs/projects/evelyn/README.md#evelynperpsservice).