s0racle-sdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -0
- package/dist/index.d.mts +182 -0
- package/dist/index.d.ts +182 -0
- package/dist/index.js +2192 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2147 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/accounts.ts","../src/client.ts","../src/idl/s0racle_program.json","../src/instructions.ts","../src/events.ts","../src/utils.ts"],"sourcesContent":["import { PublicKey } from \"@solana/web3.js\";\n\n// Geographic region of an observer node. Serializes as u8 on-chain.\nexport enum Region {\n Asia = \"Asia\",\n US = \"US\",\n EU = \"EU\",\n SouthAmerica = \"SouthAmerica\",\n Africa = \"Africa\",\n Oceania = \"Oceania\",\n Other = \"Other\",\n}\n\n// Single 10-second measurement submitted by one observer node.\nexport interface Attestation {\n slot: bigint;\n timestamp: bigint;\n avgRttUs: number;\n p95RttUs: number;\n slotLatencyMs: number;\n tpuReachable: number;\n tpuProbed: number;\n agaveCount: number;\n firedancerCount: number;\n jitoCount: number;\n solanaLabsCount: number;\n otherCount: number;\n reachableStakePct: number;\n}\n\n// Health snapshot for one geographic region. Embedded in NetworkHealth.\nexport interface RegionScore {\n region: Region;\n observerCount: number;\n healthScore: number;\n reachabilityPct: number;\n avgRttUs: number;\n slotLatencyMs: number;\n lastUpdatedSlot: bigint;\n agaveCount: number;\n firedancerCount: number;\n jitoCount: number;\n solanaLabsCount: number;\n otherCount: number;\n reachableStakePct: number;\n}\n\n// Global oracle state. Single source of truth for dApps reading network health.\nexport interface NetworkHealth {\n healthScore: number;\n tpuReachabilityPct: number;\n avgSlotLatencyMs: number;\n activeObserverCount: number;\n activeRegionCount: number;\n lastUpdatedSlot: bigint;\n lastUpdatedTs: bigint;\n // Null when no data has been recorded yet. On-chain sentinel is 255.\n minHealthEver: number | null;\n maxHealthEver: number;\n totalAttestations: bigint;\n regionScores: RegionScore[];\n agaveCount: number;\n firedancerCount: number;\n jitoCount: number;\n solanaLabsCount: number;\n otherCount: number;\n}\n\n// Per-observer state. Stores identity, region, stake, and most recent attestation.\nexport interface Observer {\n // PDA address of this observer account.\n publicKey: PublicKey;\n authority: PublicKey;\n region: Region;\n stakeLamports: bigint;\n registeredAt: bigint;\n lastAttestationSlot: bigint;\n attestationCount: bigint;\n latestAttestation: Attestation;\n isActive: boolean;\n}\n\n// Global protocol configuration.\nexport interface Registry {\n authority: PublicKey;\n // Null when no 2-step authority handoff is in progress.\n pendingAuthority: PublicKey | null;\n minStakeLamports: bigint;\n observerCount: number;\n activeCount: number;\n maxObservers: number;\n // Circuit breaker. When true, blocks new registrations and attestation submissions.\n paused: boolean;\n version: number;\n}\n\n// Emitted when an observer submits a measurement.\nexport interface AttestationSubmittedEvent {\n observer: PublicKey;\n region: Region;\n score: number;\n reachabilityPct: number;\n slotLatencyMs: number;\n slot: bigint;\n agaveCount: number;\n firedancerCount: number;\n jitoCount: number;\n solanaLabsCount: number;\n otherCount: number;\n reachableStakePct: number;\n}\n\n// Emitted when an observer registers.\nexport interface ObserverRegisteredEvent {\n observer: PublicKey;\n region: Region;\n stakeLamports: bigint;\n}\n\n// Emitted when an observer deregisters.\nexport interface ObserverDeregisteredEvent {\n observer: PublicKey;\n}\n\n// Emitted when an observer is slashed by the authority.\nexport interface ObserverSlashedEvent {\n observer: PublicKey;\n slashBps: number;\n amountSlashed: bigint;\n}\n\n// Emitted when protocol config is updated.\nexport interface ConfigUpdatedEvent {\n minStakeLamports: bigint | null;\n maxObservers: number | null;\n paused: boolean | null;\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport type {\n Attestation,\n NetworkHealth,\n Observer,\n Region,\n RegionScore,\n Registry,\n} from \"./types.js\";\n\n// Deployed s0nar program ID on Solana devnet.\nexport const PROGRAM_ID = new PublicKey(\n \"2paXpX8Ze3tvYezviSwQJSSihG3LbrDiD7SNsaFwgTow\",\n);\n\n// Staleness threshold for attestations and region scores. Roughly 60 seconds at 400ms per slot.\nconst STALE_SLOTS = 150n;\n\n// Registry layout version this SDK was built against. A mismatch suggests the program\n// has been upgraded with an incompatible layout and consumers should upgrade the SDK.\nconst SUPPORTED_REGISTRY_VERSION = 1;\n\n// PDA derivation\n\n// Derives the registry PDA from the seed \"registry\".\nexport function getRegistryPDA(\n programId: PublicKey = PROGRAM_ID,\n): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([Buffer.from(\"registry\")], programId);\n}\n\n// Derives the network health PDA from the seed \"network_health\".\nexport function getNetworkHealthPDA(\n programId: PublicKey = PROGRAM_ID,\n): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"network_health\")],\n programId,\n );\n}\n\n// Derives an observer PDA from the seed \"observer\" and the observer pubkey.\nexport function getObserverPDA(\n observer: PublicKey,\n programId: PublicKey = PROGRAM_ID,\n): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"observer\"), observer.toBuffer()],\n programId,\n );\n}\n\n// Helpers\n\n// Normalises Anchor u64 / i64 values (BN, number, or bigint) into a single bigint type.\nfunction toBigInt(val: BN | number | bigint): bigint {\n if (typeof val === \"bigint\") return val;\n if (typeof val === \"number\") return BigInt(val);\n return BigInt(val.toString());\n}\n\n// Converts an Anchor enum variant (object like { us: {} }) or string into our Region enum.\nfunction toRegion(val: Record<string, object> | string): Region {\n const key = typeof val === \"string\" ? val : (Object.keys(val)[0] ?? \"other\");\n const normalized = key.charAt(0).toUpperCase() + key.slice(1).toLowerCase();\n const map: Record<string, Region> = {\n Asia: \"Asia\",\n Us: \"US\",\n Eu: \"EU\",\n Southamerica: \"SouthAmerica\",\n Africa: \"Africa\",\n Oceania: \"Oceania\",\n Other: \"Other\",\n } as Record<string, Region>;\n return (map[normalized] ?? \"Other\") as Region;\n}\n\n// Maps a raw Anchor Attestation struct to the clean consumer type.\n// Anchor returns camelCase keys regardless of the snake_case names in the IDL.\nfunction decodeAttestation(raw: Record<string, unknown>): Attestation {\n return {\n slot: toBigInt(raw[\"slot\"] as BN),\n timestamp: toBigInt(raw[\"timestamp\"] as BN),\n avgRttUs: raw[\"avgRttUs\"] as number,\n p95RttUs: raw[\"p95RttUs\"] as number,\n slotLatencyMs: raw[\"slotLatencyMs\"] as number,\n tpuReachable: raw[\"tpuReachable\"] as number,\n tpuProbed: raw[\"tpuProbed\"] as number,\n agaveCount: raw[\"agaveCount\"] as number,\n firedancerCount: raw[\"firedancerCount\"] as number,\n jitoCount: raw[\"jitoCount\"] as number,\n solanaLabsCount: raw[\"solanaLabsCount\"] as number,\n otherCount: raw[\"otherCount\"] as number,\n reachableStakePct: raw[\"reachableStakePct\"] as number,\n };\n}\n\n// Maps a raw Anchor RegionScore struct to the clean consumer type. Internal running totals are dropped.\nfunction decodeRegionScore(raw: Record<string, unknown>): RegionScore {\n return {\n region: toRegion(raw[\"region\"] as Record<string, object>),\n observerCount: raw[\"observerCount\"] as number,\n healthScore: raw[\"healthScore\"] as number,\n reachabilityPct: raw[\"reachabilityPct\"] as number,\n avgRttUs: raw[\"avgRttUs\"] as number,\n slotLatencyMs: raw[\"slotLatencyMs\"] as number,\n lastUpdatedSlot: toBigInt(raw[\"lastUpdatedSlot\"] as BN),\n agaveCount: raw[\"agaveCount\"] as number,\n firedancerCount: raw[\"firedancerCount\"] as number,\n jitoCount: raw[\"jitoCount\"] as number,\n solanaLabsCount: raw[\"solanaLabsCount\"] as number,\n otherCount: raw[\"otherCount\"] as number,\n reachableStakePct: raw[\"reachableStakePct\"] as number,\n };\n}\n\n// Account decoders\n\n// Decodes the raw NetworkHealthAccount into the clean NetworkHealth type.\n// Converts the 255 sentinel for minHealthEver into null when no data has been recorded yet.\nexport function decodeNetworkHealth(\n raw: Record<string, unknown>,\n): NetworkHealth {\n const minRaw = raw[\"minHealthEver\"] as number;\n return {\n healthScore: raw[\"healthScore\"] as number,\n tpuReachabilityPct: raw[\"tpuReachabilityPct\"] as number,\n avgSlotLatencyMs: raw[\"avgSlotLatencyMs\"] as number,\n activeObserverCount: raw[\"activeObserverCount\"] as number,\n activeRegionCount: raw[\"activeRegionCount\"] as number,\n lastUpdatedSlot: toBigInt(raw[\"lastUpdatedSlot\"] as BN),\n lastUpdatedTs: toBigInt(raw[\"lastUpdatedTs\"] as BN),\n minHealthEver: minRaw === 255 ? null : minRaw,\n maxHealthEver: raw[\"maxHealthEver\"] as number,\n totalAttestations: toBigInt(raw[\"totalAttestations\"] as BN),\n regionScores: (raw[\"regionScores\"] as Record<string, unknown>[]).map(\n decodeRegionScore,\n ),\n agaveCount: raw[\"agaveCount\"] as number,\n firedancerCount: raw[\"firedancerCount\"] as number,\n jitoCount: raw[\"jitoCount\"] as number,\n solanaLabsCount: raw[\"solanaLabsCount\"] as number,\n otherCount: raw[\"otherCount\"] as number,\n };\n}\n\n// Decodes the raw ObserverAccount into the clean Observer type.\n// The PDA address is passed in since Anchor does not include it in the raw payload.\nexport function decodeObserver(\n raw: Record<string, unknown>,\n publicKey: PublicKey,\n): Observer {\n return {\n publicKey,\n authority: raw[\"authority\"] as PublicKey,\n region: toRegion(raw[\"region\"] as Record<string, object>),\n stakeLamports: toBigInt(raw[\"stakeLamports\"] as BN),\n registeredAt: toBigInt(raw[\"registeredAt\"] as BN),\n lastAttestationSlot: toBigInt(raw[\"lastAttestationSlot\"] as BN),\n attestationCount: toBigInt(raw[\"attestationCount\"] as BN),\n latestAttestation: decodeAttestation(\n raw[\"latestAttestation\"] as Record<string, unknown>,\n ),\n isActive: raw[\"isActive\"] as boolean,\n };\n}\n\n// Decodes the raw RegistryAccount into the clean Registry type.\n// Warns when the on-chain version does not match SUPPORTED_REGISTRY_VERSION.\n// Warning rather than throwing so consumers can override and proceed.\nexport function decodeRegistry(raw: Record<string, unknown>): Registry {\n const version = raw[\"version\"] as number;\n if (version !== SUPPORTED_REGISTRY_VERSION) {\n console.warn(\n `s0racle-sdk: registry version ${version} is not supported by this SDK ` +\n `(expected ${SUPPORTED_REGISTRY_VERSION}). Upgrade s0racle-sdk to a compatible version.`,\n );\n }\n const pending = raw[\"pendingAuthority\"] as PublicKey | null | undefined;\n return {\n authority: raw[\"authority\"] as PublicKey,\n pendingAuthority: pending ?? null,\n minStakeLamports: toBigInt(raw[\"minStakeLamports\"] as BN),\n observerCount: raw[\"observerCount\"] as number,\n activeCount: raw[\"activeCount\"] as number,\n maxObservers: raw[\"maxObservers\"] as number,\n paused: raw[\"paused\"] as boolean,\n version: raw[\"version\"] as number,\n };\n}\n\nexport { STALE_SLOTS };\n","import {\n AnchorProvider,\n Program,\n type Idl,\n type Wallet,\n} from \"@coral-xyz/anchor\";\nimport {\n Connection,\n Keypair,\n PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport idlJson from \"./idl/s0racle_program.json\";\nimport {\n PROGRAM_ID,\n decodeNetworkHealth,\n decodeObserver,\n decodeRegistry,\n getNetworkHealthPDA,\n getObserverPDA,\n getRegistryPDA,\n} from \"./accounts.js\";\nimport {\n buildAcceptAuthority,\n buildCrankAggregation,\n buildDeregisterObserver,\n buildInitialize,\n buildProposeAuthority,\n buildRegisterObserver,\n buildSlashObserver,\n buildSubmitAttestation,\n buildUpdateConfig,\n type SubmitAttestationParams,\n type UpdateConfigParams,\n} from \"./instructions.js\";\nimport {\n decodeAttestationSubmitted,\n decodeConfigUpdated,\n decodeObserverDeregistered,\n decodeObserverRegistered,\n decodeObserverSlashed,\n} from \"./events.js\";\nimport type {\n AttestationSubmittedEvent,\n ConfigUpdatedEvent,\n NetworkHealth,\n Observer,\n ObserverDeregisteredEvent,\n ObserverRegisteredEvent,\n ObserverSlashedEvent,\n Region,\n Registry,\n} from \"./types.js\";\n\nexport interface S0racleClientOptions {\n connection: Connection;\n programId?: PublicKey;\n wallet?: Wallet;\n}\n\nexport interface S0racleClient {\n readonly programId: PublicKey;\n readonly connection: Connection;\n // Reads\n getNetworkHealth(): Promise<NetworkHealth>;\n getRegistry(): Promise<Registry>;\n getObserver(observerPubkey: PublicKey): Promise<Observer>;\n getAllObservers(): Promise<Observer[]>;\n getObserversByRegion(region: Region): Promise<Observer[]>;\n // Instruction builders\n registerObserver(\n observer: PublicKey,\n region: Region,\n ): Promise<TransactionInstruction>;\n submitAttestation(\n authority: PublicKey,\n params: SubmitAttestationParams,\n ): Promise<TransactionInstruction>;\n deregisterObserver(\n caller: PublicKey,\n observerWallet: PublicKey,\n ): Promise<TransactionInstruction>;\n crankAggregation(\n cranker: PublicKey,\n observerAccounts: PublicKey[],\n ): Promise<TransactionInstruction>;\n initialize(\n authority: PublicKey,\n minStakeLamports: bigint,\n maxObservers: number,\n ): Promise<TransactionInstruction>;\n slashObserver(\n authority: PublicKey,\n observerWallet: PublicKey,\n treasury: PublicKey,\n slashBps: number,\n ): Promise<TransactionInstruction>;\n updateConfig(\n authority: PublicKey,\n params: UpdateConfigParams,\n ): Promise<TransactionInstruction>;\n proposeAuthority(\n authority: PublicKey,\n newAuthority: PublicKey,\n ): Promise<TransactionInstruction>;\n acceptAuthority(newAuthority: PublicKey): Promise<TransactionInstruction>;\n // Event subscriptions. Each method returns a numeric listener id passed to removeEventListener to stop receiving events.\n onAttestationSubmitted(\n callback: (event: AttestationSubmittedEvent, slot: number) => void,\n ): number;\n onObserverRegistered(\n callback: (event: ObserverRegisteredEvent, slot: number) => void,\n ): number;\n onObserverDeregistered(\n callback: (event: ObserverDeregisteredEvent, slot: number) => void,\n ): number;\n onObserverSlashed(\n callback: (event: ObserverSlashedEvent, slot: number) => void,\n ): number;\n onConfigUpdated(\n callback: (event: ConfigUpdatedEvent, slot: number) => void,\n ): number;\n removeEventListener(listenerId: number): Promise<void>;\n}\n\n// Stable system program address used as the dummy wallet pubkey for read-only clients.\n// Surfacing the system program in any logs that print the wallet pubkey clearly signals \"no real wallet\".\nconst READ_ONLY_PUBKEY = new PublicKey(\"11111111111111111111111111111111\");\n\n// Builds a dummy wallet for read-only usage. Anchor requires a wallet but reads never sign.\nfunction createReadOnlyWallet(): Wallet {\n return {\n publicKey: READ_ONLY_PUBKEY,\n payer: Keypair.generate(),\n signTransaction: async <T extends Transaction | VersionedTransaction>(\n tx: T,\n ): Promise<T> => tx,\n signAllTransactions: async <T extends Transaction | VersionedTransaction>(\n txs: T[],\n ): Promise<T[]> => txs,\n };\n}\n\n// Factory that creates a configured client. Pass a wallet for write ops, omit for read-only.\nexport function createS0racleClient(opts: S0racleClientOptions): S0racleClient {\n const { connection } = opts;\n const programId = opts.programId ?? PROGRAM_ID;\n const wallet = opts.wallet ?? createReadOnlyWallet();\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: \"confirmed\",\n });\n const idl = { ...(idlJson as Idl), address: programId.toBase58() };\n const program = new Program(idl, provider);\n\n // Fetches the global oracle account with health score, region breakdowns, and aggregates.\n async function getNetworkHealth(): Promise<NetworkHealth> {\n const [pda] = getNetworkHealthPDA(programId);\n const raw = await (\n program.account as Record<\n string,\n { fetch: (key: PublicKey) => Promise<unknown> }\n >\n )[\"networkHealthAccount\"]!.fetch(pda);\n return decodeNetworkHealth(raw as Record<string, unknown>);\n }\n\n // Fetches protocol config including authority, min stake, observer counts, and paused state.\n async function getRegistry(): Promise<Registry> {\n const [pda] = getRegistryPDA(programId);\n const raw = await (\n program.account as Record<\n string,\n { fetch: (key: PublicKey) => Promise<unknown> }\n >\n )[\"registryAccount\"]!.fetch(pda);\n return decodeRegistry(raw as Record<string, unknown>);\n }\n\n // Fetches a single observer by its authority pubkey, including stake, region, and latest attestation.\n async function getObserver(observerPubkey: PublicKey): Promise<Observer> {\n const [pda] = getObserverPDA(observerPubkey, programId);\n const raw = await (\n program.account as Record<\n string,\n { fetch: (key: PublicKey) => Promise<unknown> }\n >\n )[\"observerAccount\"]!.fetch(pda);\n return decodeObserver(raw as Record<string, unknown>, pda);\n }\n\n // Fetches every registered observer via getProgramAccounts. Can be heavy with many observers.\n async function getAllObservers(): Promise<Observer[]> {\n const all = await (\n program.account as Record<\n string,\n {\n all: () => Promise<Array<{ publicKey: PublicKey; account: unknown }>>;\n }\n >\n )[\"observerAccount\"]!.all();\n return all.map((entry) =>\n decodeObserver(entry.account as Record<string, unknown>, entry.publicKey),\n );\n }\n\n // Returns observers filtered by region. Uses getAllObservers internally.\n async function getObserversByRegion(region: Region): Promise<Observer[]> {\n const all = await getAllObservers();\n return all.filter((o) => o.region === region);\n }\n\n return {\n programId,\n connection,\n // Reads\n getNetworkHealth,\n getRegistry,\n getObserver,\n getAllObservers,\n getObserversByRegion,\n // Instruction builders\n registerObserver: (observer, region) =>\n buildRegisterObserver(program, observer, region),\n submitAttestation: (authority, params) =>\n buildSubmitAttestation(program, authority, params),\n deregisterObserver: (caller, observerWallet) =>\n buildDeregisterObserver(program, caller, observerWallet),\n crankAggregation: (cranker, observerAccounts) =>\n buildCrankAggregation(program, cranker, observerAccounts),\n initialize: (authority, minStakeLamports, maxObservers) =>\n buildInitialize(program, authority, minStakeLamports, maxObservers),\n slashObserver: (authority, observerWallet, treasury, slashBps) =>\n buildSlashObserver(\n program,\n authority,\n observerWallet,\n treasury,\n slashBps,\n ),\n updateConfig: (authority, params) =>\n buildUpdateConfig(program, authority, params),\n proposeAuthority: (authority, newAuthority) =>\n buildProposeAuthority(program, authority, newAuthority),\n acceptAuthority: (newAuthority) =>\n buildAcceptAuthority(program, newAuthority),\n // Event subscriptions\n onAttestationSubmitted: (callback) =>\n program.addEventListener(\"attestationSubmitted\", (raw, slot) =>\n callback(\n decodeAttestationSubmitted(raw as Record<string, unknown>),\n slot,\n ),\n ),\n onObserverRegistered: (callback) =>\n program.addEventListener(\"observerRegistered\", (raw, slot) =>\n callback(\n decodeObserverRegistered(raw as Record<string, unknown>),\n slot,\n ),\n ),\n onObserverDeregistered: (callback) =>\n program.addEventListener(\"observerDeregistered\", (raw, slot) =>\n callback(\n decodeObserverDeregistered(raw as Record<string, unknown>),\n slot,\n ),\n ),\n onObserverSlashed: (callback) =>\n program.addEventListener(\"observerSlashed\", (raw, slot) =>\n callback(decodeObserverSlashed(raw as Record<string, unknown>), slot),\n ),\n onConfigUpdated: (callback) =>\n program.addEventListener(\"configUpdated\", (raw, slot) =>\n callback(decodeConfigUpdated(raw as Record<string, unknown>), slot),\n ),\n removeEventListener: (listenerId) =>\n program.removeEventListener(listenerId),\n };\n}\n","{\n \"address\": \"2paXpX8Ze3tvYezviSwQJSSihG3LbrDiD7SNsaFwgTow\",\n \"metadata\": {\n \"name\": \"s0racle_program\",\n \"version\": \"0.1.0\",\n \"spec\": \"0.1.0\",\n \"description\": \"Created with Anchor\"\n },\n \"instructions\": [\n {\n \"name\": \"accept_authority\",\n \"discriminator\": [\n 107,\n 86,\n 198,\n 91,\n 33,\n 12,\n 107,\n 160\n ],\n \"accounts\": [\n {\n \"name\": \"registry\",\n \"writable\": true\n },\n {\n \"name\": \"new_authority\",\n \"signer\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"crank_aggregation\",\n \"discriminator\": [\n 37,\n 116,\n 43,\n 137,\n 4,\n 13,\n 88,\n 26\n ],\n \"accounts\": [\n {\n \"name\": \"cranker\",\n \"signer\": true\n },\n {\n \"name\": \"network_health\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 110,\n 101,\n 116,\n 119,\n 111,\n 114,\n 107,\n 95,\n 104,\n 101,\n 97,\n 108,\n 116,\n 104\n ]\n }\n ]\n }\n },\n {\n \"name\": \"registry_account\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 114,\n 101,\n 103,\n 105,\n 115,\n 116,\n 114,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"clock\",\n \"address\": \"SysvarC1ock11111111111111111111111111111111\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"deregister_observer\",\n \"discriminator\": [\n 16,\n 4,\n 225,\n 8,\n 113,\n 188,\n 135,\n 196\n ],\n \"accounts\": [\n {\n \"name\": \"caller\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"observer_wallet\",\n \"docs\": [\n \"Recipient of returned stake lamports on deregistration.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"observer_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 111,\n 98,\n 115,\n 101,\n 114,\n 118,\n 101,\n 114\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"observer_wallet\"\n }\n ]\n }\n },\n {\n \"name\": \"registry\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 114,\n 101,\n 103,\n 105,\n 115,\n 116,\n 114,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"initialize\",\n \"discriminator\": [\n 175,\n 175,\n 109,\n 31,\n 13,\n 152,\n 155,\n 237\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"registry\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 114,\n 101,\n 103,\n 105,\n 115,\n 116,\n 114,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"network_health\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 110,\n 101,\n 116,\n 119,\n 111,\n 114,\n 107,\n 95,\n 104,\n 101,\n 97,\n 108,\n 116,\n 104\n ]\n }\n ]\n }\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"min_stake_lamports\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"max_observers\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"propose_authority\",\n \"discriminator\": [\n 20,\n 148,\n 236,\n 198,\n 76,\n 119,\n 99,\n 142\n ],\n \"accounts\": [\n {\n \"name\": \"registry\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 114,\n 101,\n 103,\n 105,\n 115,\n 116,\n 114,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"authority\",\n \"signer\": true,\n \"relations\": [\n \"registry\"\n ]\n }\n ],\n \"args\": [\n {\n \"name\": \"new_authority\",\n \"type\": \"pubkey\"\n }\n ]\n },\n {\n \"name\": \"register_observer\",\n \"discriminator\": [\n 95,\n 238,\n 80,\n 77,\n 247,\n 96,\n 2,\n 225\n ],\n \"accounts\": [\n {\n \"name\": \"observer\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"observer_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 111,\n 98,\n 115,\n 101,\n 114,\n 118,\n 101,\n 114\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"observer\"\n }\n ]\n }\n },\n {\n \"name\": \"registry\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 114,\n 101,\n 103,\n 105,\n 115,\n 116,\n 114,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"region\",\n \"type\": {\n \"defined\": {\n \"name\": \"Region\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"slash_observer\",\n \"discriminator\": [\n 203,\n 50,\n 98,\n 246,\n 173,\n 53,\n 118,\n 177\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"signer\": true,\n \"relations\": [\n \"registry\"\n ]\n },\n {\n \"name\": \"observer_wallet\"\n },\n {\n \"name\": \"observer_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 111,\n 98,\n 115,\n 101,\n 114,\n 118,\n 101,\n 114\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"observer_wallet\"\n }\n ]\n }\n },\n {\n \"name\": \"registry\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 114,\n 101,\n 103,\n 105,\n 115,\n 116,\n 114,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"treasury\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"slash_bps\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"submit_attestation\",\n \"discriminator\": [\n 238,\n 220,\n 255,\n 105,\n 183,\n 211,\n 40,\n 83\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"writable\": true,\n \"signer\": true,\n \"relations\": [\n \"observer_account\"\n ]\n },\n {\n \"name\": \"observer_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 111,\n 98,\n 115,\n 101,\n 114,\n 118,\n 101,\n 114\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"authority\"\n }\n ]\n }\n },\n {\n \"name\": \"network_health\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 110,\n 101,\n 116,\n 119,\n 111,\n 114,\n 107,\n 95,\n 104,\n 101,\n 97,\n 108,\n 116,\n 104\n ]\n }\n ]\n }\n },\n {\n \"name\": \"registry\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 114,\n 101,\n 103,\n 105,\n 115,\n 116,\n 114,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"clock\",\n \"address\": \"SysvarC1ock11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"tpu_reachable\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"tpu_probed\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"avg_rtt_us\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"p95_rtt_us\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"slot_latency_ms\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"agave_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"firedancer_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"jito_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"solana_labs_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"other_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"reachable_stake_pct\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"update_config\",\n \"discriminator\": [\n 29,\n 158,\n 252,\n 191,\n 10,\n 83,\n 219,\n 99\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"signer\": true,\n \"relations\": [\n \"registry\"\n ]\n },\n {\n \"name\": \"registry\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 114,\n 101,\n 103,\n 105,\n 115,\n 116,\n 114,\n 121\n ]\n }\n ]\n }\n }\n ],\n \"args\": [\n {\n \"name\": \"min_stake_lamports\",\n \"type\": {\n \"option\": \"u64\"\n }\n },\n {\n \"name\": \"max_observers\",\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"paused\",\n \"type\": {\n \"option\": \"bool\"\n }\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"NetworkHealthAccount\",\n \"discriminator\": [\n 90,\n 218,\n 55,\n 105,\n 239,\n 131,\n 43,\n 68\n ]\n },\n {\n \"name\": \"ObserverAccount\",\n \"discriminator\": [\n 119,\n 24,\n 204,\n 152,\n 164,\n 169,\n 5,\n 101\n ]\n },\n {\n \"name\": \"RegistryAccount\",\n \"discriminator\": [\n 113,\n 93,\n 106,\n 201,\n 100,\n 166,\n 146,\n 98\n ]\n }\n ],\n \"events\": [\n {\n \"name\": \"AttestationSubmitted\",\n \"discriminator\": [\n 177,\n 213,\n 117,\n 225,\n 166,\n 11,\n 54,\n 218\n ]\n },\n {\n \"name\": \"ConfigUpdated\",\n \"discriminator\": [\n 40,\n 241,\n 230,\n 122,\n 11,\n 19,\n 198,\n 194\n ]\n },\n {\n \"name\": \"ObserverDeregistered\",\n \"discriminator\": [\n 78,\n 251,\n 104,\n 71,\n 5,\n 145,\n 253,\n 95\n ]\n },\n {\n \"name\": \"ObserverRegistered\",\n \"discriminator\": [\n 33,\n 248,\n 190,\n 137,\n 191,\n 38,\n 49,\n 56\n ]\n },\n {\n \"name\": \"ObserverSlashed\",\n \"discriminator\": [\n 132,\n 0,\n 84,\n 231,\n 39,\n 179,\n 32,\n 211\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 6000,\n \"name\": \"ValueCannotBeZero\",\n \"msg\": \"Value cannot be zero\"\n },\n {\n \"code\": 6001,\n \"name\": \"RegistryPaused\",\n \"msg\": \"Registry is currently paused\"\n },\n {\n \"code\": 6002,\n \"name\": \"MaxObserversReached\",\n \"msg\": \"Maximum number of observers has been reached\"\n },\n {\n \"code\": 6003,\n \"name\": \"InsufficientLamports\",\n \"msg\": \"Insufficient Lamports\"\n },\n {\n \"code\": 6004,\n \"name\": \"UnauthorizedObserver\",\n \"msg\": \"Unauthorized Observer\"\n },\n {\n \"code\": 6005,\n \"name\": \"ObserverNotActive\",\n \"msg\": \"Observer is not active\"\n },\n {\n \"code\": 6006,\n \"name\": \"ZeroValidatorsProbed\",\n \"msg\": \"Zero validators probed\"\n },\n {\n \"code\": 6007,\n \"name\": \"InsufficientValidatorsProbed\",\n \"msg\": \"Insufficient validators probed\"\n },\n {\n \"code\": 6008,\n \"name\": \"InvalidReachabilityCount\",\n \"msg\": \"Invalid reachability count\"\n },\n {\n \"code\": 6009,\n \"name\": \"InvalidLatencyValue\",\n \"msg\": \"Invalid latency submitted\"\n },\n {\n \"code\": 6010,\n \"name\": \"StaleAttestation\",\n \"msg\": \"Stale attestation\"\n },\n {\n \"code\": 6011,\n \"name\": \"NoActiveObservers\",\n \"msg\": \"No active observers\"\n },\n {\n \"code\": 6012,\n \"name\": \"ObserverAlreadyInActive\",\n \"msg\": \"Observer already inactive\"\n },\n {\n \"code\": 6013,\n \"name\": \"UnAuthorizedCaller\",\n \"msg\": \"Unauthorized caller\"\n },\n {\n \"code\": 6014,\n \"name\": \"InsufficientBalanceForRefund\",\n \"msg\": \"Insufficient balance in PDA for stake refund\"\n },\n {\n \"code\": 6015,\n \"name\": \"InvalidSlashBps\",\n \"msg\": \"Invalid slash basis points - must be <= 10000\"\n },\n {\n \"code\": 6016,\n \"name\": \"ObserverNotFound\",\n \"msg\": \"Observer not found\"\n },\n {\n \"code\": 6017,\n \"name\": \"InsufficientBalanceForSlash\",\n \"msg\": \"Insufficient balance in PDA for slash\"\n },\n {\n \"code\": 6018,\n \"name\": \"InvalidPendingAuthority\",\n \"msg\": \"Invalid or no pending authority for registry\"\n },\n {\n \"code\": 6019,\n \"name\": \"MaxObserversCannotBeLessThanActiveObservers\",\n \"msg\": \"Max observers cannot be less than active observers\"\n }\n ],\n \"types\": [\n {\n \"name\": \"Attestation\",\n \"docs\": [\n \"Single 10-second measurement from one observer node\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"slot\",\n \"docs\": [\n \"Solana slot this measurement covers\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"timestamp\",\n \"docs\": [\n \"Timestamp of the measurement\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"avg_rtt_us\",\n \"docs\": [\n \"Average RTT of the QUIC probe\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"p95_rtt_us\",\n \"docs\": [\n \"P95 RTT of the QUIC probe\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"slot_latency_ms\",\n \"docs\": [\n \"Slot latency of the QUIC probe\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"tpu_reachable\",\n \"docs\": [\n \"Validators reachable via QUIC probe\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"tpu_probed\",\n \"docs\": [\n \"Total validators probed this round\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"agave_count\",\n \"docs\": [\n \"Client distributions\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"firedancer_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"jito_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"solana_labs_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"other_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"reachable_stake_pct\",\n \"docs\": [\n \"% of total stake (by lamports) reachable via QUIC probe\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"AttestationSubmitted\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"observer\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"region\",\n \"type\": {\n \"defined\": {\n \"name\": \"Region\"\n }\n }\n },\n {\n \"name\": \"score\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"reachability_pct\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"slot_latency_ms\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"slot\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"agave_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"firedancer_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"jito_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"solana_labs_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"other_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"reachable_stake_pct\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"ConfigUpdated\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"min_stake_lamports\",\n \"type\": {\n \"option\": \"u64\"\n }\n },\n {\n \"name\": \"max_observers\",\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"paused\",\n \"type\": {\n \"option\": \"bool\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"NetworkHealthAccount\",\n \"docs\": [\n \"Global oracle account - the single source of truth for dApps and UI reads\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"health_score\",\n \"docs\": [\n \"The health score of the network\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"tpu_reachability_pct\",\n \"docs\": [\n \"TPU reachability % averaged across all regions\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"avg_slot_latency_ms\",\n \"docs\": [\n \"Average slot latency in milliseconds\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"active_observer_count\",\n \"docs\": [\n \"Number of active observers that contributed to this score\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"active_region_count\",\n \"docs\": [\n \"Number of regions with fresh attestations\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"last_updated_slot\",\n \"docs\": [\n \"Slot of last aggregation — dApps check this for staleness\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"last_updated_ts\",\n \"docs\": [\n \"Unix timestamp of last update\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"min_health_ever\",\n \"docs\": [\n \"Lowest health score ever recorded\",\n \"Note: Initialized to 255 (u8::MAX) which represents \\\"no data yet\\\".\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"max_health_ever\",\n \"docs\": [\n \"Highest health score ever recorded\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"total_attestations\",\n \"docs\": [\n \"Total attestations ever submitted across all observers\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"region_scores\",\n \"docs\": [\n \"One entry per region\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"RegionScore\"\n }\n },\n 7\n ]\n }\n },\n {\n \"name\": \"agave_count\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"firedancer_count\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"jito_count\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"solana_labs_count\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"other_count\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"bump\",\n \"docs\": [\n \"PDA bump seed\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"ObserverAccount\",\n \"docs\": [\n \"Per-observer state - stores identity, region, stake and latest measurement\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"authority\",\n \"docs\": [\n \"The authority of the observer\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"region\",\n \"docs\": [\n \"The region of the observer\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"Region\"\n }\n }\n },\n {\n \"name\": \"stake_lamports\",\n \"docs\": [\n \"The stake of the observer\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"registered_at\",\n \"docs\": [\n \"The timestamp when the observer was registered\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"last_attestation_slot\",\n \"docs\": [\n \"Solana slot of the most recent attestation submitted\",\n \"Used for staleness check in crank_aggregation\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"attestation_count\",\n \"docs\": [\n \"The number of attestations submitted by the observer\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"latest_attestation\",\n \"docs\": [\n \"The latest attestation submitted by the observer\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"Attestation\"\n }\n }\n },\n {\n \"name\": \"is_active\",\n \"docs\": [\n \"Whether the observer is active\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"bump\",\n \"docs\": [\n \"The bump seed for the PDA\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"ObserverDeregistered\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"observer\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"ObserverRegistered\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"observer\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"region\",\n \"type\": {\n \"defined\": {\n \"name\": \"Region\"\n }\n }\n },\n {\n \"name\": \"stake_lamports\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"ObserverSlashed\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"observer\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"slash_bps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"amount_slashed\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"Region\",\n \"docs\": [\n \"Geographic region of an observer node - serializes as u8 on-chain\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Asia\"\n },\n {\n \"name\": \"US\"\n },\n {\n \"name\": \"EU\"\n },\n {\n \"name\": \"SouthAmerica\"\n },\n {\n \"name\": \"Africa\"\n },\n {\n \"name\": \"Oceania\"\n },\n {\n \"name\": \"Other\"\n }\n ]\n }\n },\n {\n \"name\": \"RegionScore\",\n \"docs\": [\n \"Health snapshot for one geographic region - embedded in NetworkHealthAccount\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"region\",\n \"docs\": [\n \"Which region this entry represents\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"Region\"\n }\n }\n },\n {\n \"name\": \"observer_count\",\n \"docs\": [\n \"Number of observer contributions currently represented in this region aggregate\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"health_score\",\n \"docs\": [\n \"Health score from this region\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"reachability_pct\",\n \"docs\": [\n \"TPU reachability % from this region\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"avg_rtt_us\",\n \"docs\": [\n \"Average RTT from this region in microseconds\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"slot_latency_ms\",\n \"docs\": [\n \"Slot propagation latency from this region (ms)\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"last_updated_slot\",\n \"docs\": [\n \"Slot when this region last reported\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_health_score\",\n \"docs\": [\n \"Running total of health scores for observers in this region\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"total_reachability_pct\",\n \"docs\": [\n \"Running total of reachability percentages for observers in this region\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"total_avg_rtt_us\",\n \"docs\": [\n \"Running total of RTT values for observers in this region\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_slot_latency_ms\",\n \"docs\": [\n \"Running total of slot latency values for observers in this region\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"agave_count\",\n \"docs\": [\n \"Client distribution counts for this region\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"firedancer_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"jito_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"solana_labs_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"other_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"total_agave_count\",\n \"docs\": [\n \"Running totals\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"total_firedancer_count\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"total_jito_count\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"total_solana_labs_count\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"total_other_count\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"reachable_stake_pct\",\n \"docs\": [\n \"Stake-weighted reachability for this region\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"total_reachable_stake_pct\",\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"RegistryAccount\",\n \"docs\": [\n \"Global registry - tracks all observer nodes and program config\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"authority\",\n \"docs\": [\n \"Admin key\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pending_authority\",\n \"docs\": [\n \"Pending authority for handoff\"\n ],\n \"type\": {\n \"option\": \"pubkey\"\n }\n },\n {\n \"name\": \"min_stake_lamports\",\n \"docs\": [\n \"Minimum stake required to observe\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"observer_count\",\n \"docs\": [\n \"Number of observers\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"active_count\",\n \"docs\": [\n \"Currently active accounts\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_observers\",\n \"docs\": [\n \"Maximum number of observers\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"paused\",\n \"docs\": [\n \"Paused flag\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"version\",\n \"docs\": [\n \"Version of the registry\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"bump\",\n \"docs\": [\n \"Bump seed for the PDA\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n }\n ],\n \"constants\": [\n {\n \"name\": \"SEED\",\n \"type\": \"string\",\n \"value\": \"\\\"anchor\\\"\"\n }\n ]\n}","import { Program } from \"@coral-xyz/anchor\";\nimport BN from \"bn.js\";\nimport {\n PublicKey,\n TransactionInstruction,\n type AccountMeta,\n} from \"@solana/web3.js\";\nimport {\n getNetworkHealthPDA,\n getObserverPDA,\n getRegistryPDA,\n} from \"./accounts.js\";\nimport { Region } from \"./types.js\";\n\nconst CLOCK_SYSVAR = new PublicKey(\n \"SysvarC1ock11111111111111111111111111111111\",\n);\n\n// Converts our Region enum into Anchor's enum input format like { us: {} }.\nfunction toAnchorRegion(region: Region): Record<string, Record<string, never>> {\n const map: Record<Region, string> = {\n [Region.Asia]: \"asia\",\n [Region.US]: \"us\",\n [Region.EU]: \"eu\",\n [Region.SouthAmerica]: \"southAmerica\",\n [Region.Africa]: \"africa\",\n [Region.Oceania]: \"oceania\",\n [Region.Other]: \"other\",\n };\n return { [map[region]]: {} };\n}\n\n// Casts the loosely-typed methods namespace so we can call instructions by name.\ntype AnchorMethods = Record<\n string,\n (...args: unknown[]) => {\n accounts: (accounts: Record<string, PublicKey>) => {\n remainingAccounts: (accounts: AccountMeta[]) => {\n instruction: () => Promise<TransactionInstruction>;\n };\n instruction: () => Promise<TransactionInstruction>;\n };\n }\n>;\n\n// Registers a new observer with the given region. Observer signer pays rent and stake.\nexport async function buildRegisterObserver(\n program: Program,\n observer: PublicKey,\n region: Region,\n): Promise<TransactionInstruction> {\n const programId = program.programId;\n const [observerAccount] = getObserverPDA(observer, programId);\n const [registry] = getRegistryPDA(programId);\n return (program.methods as unknown as AnchorMethods)[\"registerObserver\"]!(\n toAnchorRegion(region),\n )\n .accounts({ observer, observerAccount, registry })\n .instruction();\n}\n\n// Params for a single attestation submission.\nexport interface SubmitAttestationParams {\n tpuReachable: number;\n tpuProbed: number;\n avgRttUs: number;\n p95RttUs: number;\n slotLatencyMs: number;\n agaveCount: number;\n firedancerCount: number;\n jitoCount: number;\n solanaLabsCount: number;\n otherCount: number;\n reachableStakePct: number;\n}\n\n// Submits a 10-second measurement. Authority must be the observer's authority key.\nexport async function buildSubmitAttestation(\n program: Program,\n authority: PublicKey,\n params: SubmitAttestationParams,\n): Promise<TransactionInstruction> {\n const programId = program.programId;\n const [observerAccount] = getObserverPDA(authority, programId);\n const [networkHealth] = getNetworkHealthPDA(programId);\n const [registry] = getRegistryPDA(programId);\n return (program.methods as unknown as AnchorMethods)[\"submitAttestation\"]!(\n params.tpuReachable,\n params.tpuProbed,\n params.avgRttUs,\n params.p95RttUs,\n params.slotLatencyMs,\n params.agaveCount,\n params.firedancerCount,\n params.jitoCount,\n params.solanaLabsCount,\n params.otherCount,\n params.reachableStakePct,\n )\n .accounts({\n authority,\n observerAccount,\n networkHealth,\n registry,\n clock: CLOCK_SYSVAR,\n })\n .instruction();\n}\n\n// Deregisters an observer and returns the staked lamports to observerWallet.\n// Caller must be either the observer wallet or the registry authority.\nexport async function buildDeregisterObserver(\n program: Program,\n caller: PublicKey,\n observerWallet: PublicKey,\n): Promise<TransactionInstruction> {\n const programId = program.programId;\n const [observerAccount] = getObserverPDA(observerWallet, programId);\n const [registry] = getRegistryPDA(programId);\n return (program.methods as unknown as AnchorMethods)[\"deregisterObserver\"]!()\n .accounts({ caller, observerWallet, observerAccount, registry })\n .instruction();\n}\n\n// Permissionless full recomputation of NetworkHealth. Pass all observer PDAs as remaining accounts.\nexport async function buildCrankAggregation(\n program: Program,\n cranker: PublicKey,\n observerAccounts: PublicKey[],\n): Promise<TransactionInstruction> {\n const programId = program.programId;\n const [networkHealth] = getNetworkHealthPDA(programId);\n const [registryAccount] = getRegistryPDA(programId);\n const remaining: AccountMeta[] = observerAccounts.map((pubkey) => ({\n pubkey,\n isSigner: false,\n isWritable: false,\n }));\n return (program.methods as unknown as AnchorMethods)[\"crankAggregation\"]!()\n .accounts({\n cranker,\n networkHealth,\n registryAccount,\n clock: CLOCK_SYSVAR,\n })\n .remainingAccounts(remaining)\n .instruction();\n}\n\n// Bootstraps the protocol. Called once. Authority becomes the registry admin.\nexport async function buildInitialize(\n program: Program,\n authority: PublicKey,\n minStakeLamports: bigint,\n maxObservers: number,\n): Promise<TransactionInstruction> {\n const programId = program.programId;\n const [registry] = getRegistryPDA(programId);\n const [networkHealth] = getNetworkHealthPDA(programId);\n return (program.methods as unknown as AnchorMethods)[\"initialize\"]!(\n new BN(minStakeLamports.toString()),\n maxObservers,\n )\n .accounts({ authority, registry, networkHealth })\n .instruction();\n}\n\n// Slashes an observer's stake. Authority must match the registry authority. slashBps is 0 to 10000.\nexport async function buildSlashObserver(\n program: Program,\n authority: PublicKey,\n observerWallet: PublicKey,\n treasury: PublicKey,\n slashBps: number,\n): Promise<TransactionInstruction> {\n const programId = program.programId;\n const [observerAccount] = getObserverPDA(observerWallet, programId);\n const [registry] = getRegistryPDA(programId);\n return (program.methods as unknown as AnchorMethods)[\"slashObserver\"]!(\n slashBps,\n )\n .accounts({\n authority,\n observerWallet,\n observerAccount,\n registry,\n treasury,\n })\n .instruction();\n}\n\n// Optional updates to protocol config. Pass null for fields you do not want to change.\nexport interface UpdateConfigParams {\n minStakeLamports: bigint | null;\n maxObservers: number | null;\n paused: boolean | null;\n}\n\n// Updates protocol config. Authority-only.\nexport async function buildUpdateConfig(\n program: Program,\n authority: PublicKey,\n params: UpdateConfigParams,\n): Promise<TransactionInstruction> {\n const programId = program.programId;\n const [registry] = getRegistryPDA(programId);\n const minStake =\n params.minStakeLamports != null\n ? new BN(params.minStakeLamports.toString())\n : null;\n return (program.methods as unknown as AnchorMethods)[\"updateConfig\"]!(\n minStake,\n params.maxObservers,\n params.paused,\n )\n .accounts({ authority, registry })\n .instruction();\n}\n\n// Step 1 of authority handoff. Current authority proposes a new authority.\nexport async function buildProposeAuthority(\n program: Program,\n authority: PublicKey,\n newAuthority: PublicKey,\n): Promise<TransactionInstruction> {\n const programId = program.programId;\n const [registry] = getRegistryPDA(programId);\n return (program.methods as unknown as AnchorMethods)[\"proposeAuthority\"]!(\n newAuthority,\n )\n .accounts({ authority, registry })\n .instruction();\n}\n\n// Step 2 of authority handoff. The proposed authority claims the role.\nexport async function buildAcceptAuthority(\n program: Program,\n newAuthority: PublicKey,\n): Promise<TransactionInstruction> {\n const programId = program.programId;\n const [registry] = getRegistryPDA(programId);\n return (program.methods as unknown as AnchorMethods)[\"acceptAuthority\"]!()\n .accounts({ newAuthority, registry })\n .instruction();\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport type {\n AttestationSubmittedEvent,\n ConfigUpdatedEvent,\n ObserverDeregisteredEvent,\n ObserverRegisteredEvent,\n ObserverSlashedEvent,\n Region,\n} from \"./types.js\";\n\n// Anchor returns event payloads with the same camelCase keys as accounts.\n\nfunction toBigInt(val: BN | number | bigint): bigint {\n if (typeof val === \"bigint\") return val;\n if (typeof val === \"number\") return BigInt(val);\n return BigInt(val.toString());\n}\n\nfunction toRegion(val: Record<string, object> | string): Region {\n const key = typeof val === \"string\" ? val : (Object.keys(val)[0] ?? \"other\");\n const normalized = key.charAt(0).toUpperCase() + key.slice(1).toLowerCase();\n const map: Record<string, Region> = {\n Asia: \"Asia\",\n Us: \"US\",\n Eu: \"EU\",\n Southamerica: \"SouthAmerica\",\n Africa: \"Africa\",\n Oceania: \"Oceania\",\n Other: \"Other\",\n } as Record<string, Region>;\n return (map[normalized] ?? \"Other\") as Region;\n}\n\nexport function decodeAttestationSubmitted(\n raw: Record<string, unknown>,\n): AttestationSubmittedEvent {\n return {\n observer: raw[\"observer\"] as PublicKey,\n region: toRegion(raw[\"region\"] as Record<string, object>),\n score: raw[\"score\"] as number,\n reachabilityPct: raw[\"reachabilityPct\"] as number,\n slotLatencyMs: raw[\"slotLatencyMs\"] as number,\n slot: toBigInt(raw[\"slot\"] as BN),\n agaveCount: raw[\"agaveCount\"] as number,\n firedancerCount: raw[\"firedancerCount\"] as number,\n jitoCount: raw[\"jitoCount\"] as number,\n solanaLabsCount: raw[\"solanaLabsCount\"] as number,\n otherCount: raw[\"otherCount\"] as number,\n reachableStakePct: raw[\"reachableStakePct\"] as number,\n };\n}\n\nexport function decodeObserverRegistered(\n raw: Record<string, unknown>,\n): ObserverRegisteredEvent {\n return {\n observer: raw[\"observer\"] as PublicKey,\n region: toRegion(raw[\"region\"] as Record<string, object>),\n stakeLamports: toBigInt(raw[\"stakeLamports\"] as BN),\n };\n}\n\nexport function decodeObserverDeregistered(\n raw: Record<string, unknown>,\n): ObserverDeregisteredEvent {\n return {\n observer: raw[\"observer\"] as PublicKey,\n };\n}\n\nexport function decodeObserverSlashed(\n raw: Record<string, unknown>,\n): ObserverSlashedEvent {\n return {\n observer: raw[\"observer\"] as PublicKey,\n slashBps: raw[\"slashBps\"] as number,\n amountSlashed: toBigInt(raw[\"amountSlashed\"] as BN),\n };\n}\n\nexport function decodeConfigUpdated(\n raw: Record<string, unknown>,\n): ConfigUpdatedEvent {\n const minStake = raw[\"minStakeLamports\"];\n const maxObs = raw[\"maxObservers\"];\n const paused = raw[\"paused\"];\n return {\n minStakeLamports:\n minStake != null ? toBigInt(minStake as BN) : null,\n maxObservers: maxObs != null ? (maxObs as number) : null,\n paused: paused != null ? (paused as boolean) : null,\n };\n}\n","import { STALE_SLOTS } from \"./accounts.js\";\nimport { Region } from \"./types.js\";\nimport type { NetworkHealth, Observer, RegionScore } from \"./types.js\";\n\n// Health score thresholds.\nconst DEFAULT_DEGRADED_THRESHOLD = 70;\nconst DEFAULT_CRITICAL_THRESHOLD = 40;\n\n// Returns true when the network health account has not been updated within STALE_SLOTS of currentSlot.\nexport function isStale(\n networkHealth: NetworkHealth,\n currentSlot: bigint,\n): boolean {\n return currentSlot - networkHealth.lastUpdatedSlot > STALE_SLOTS;\n}\n\n// Returns true when the observer has not submitted an attestation within STALE_SLOTS of currentSlot.\nexport function isObserverStale(\n observer: Observer,\n currentSlot: bigint,\n): boolean {\n return currentSlot - observer.lastAttestationSlot > STALE_SLOTS;\n}\n\n// Returns true when the health score falls below the degraded threshold (default 70).\nexport function isDegraded(\n networkHealth: NetworkHealth,\n threshold: number = DEFAULT_DEGRADED_THRESHOLD,\n): boolean {\n return networkHealth.healthScore < threshold;\n}\n\n// Returns the network status based on score and optional staleness.\n// When currentSlot is provided and the data is stale, returns \"stale\" regardless of score.\n// Consumers reading the oracle for write paths should always pass currentSlot.\nexport function healthStatus(\n networkHealth: NetworkHealth,\n currentSlot?: bigint,\n): \"healthy\" | \"degraded\" | \"critical\" | \"stale\" {\n if (currentSlot !== undefined && isStale(networkHealth, currentSlot)) {\n return \"stale\";\n }\n if (networkHealth.healthScore < DEFAULT_CRITICAL_THRESHOLD) return \"critical\";\n if (networkHealth.healthScore < DEFAULT_DEGRADED_THRESHOLD) return \"degraded\";\n return \"healthy\";\n}\n\n// Human-readable label for a region, suitable for UI display.\nexport function regionLabel(region: Region): string {\n switch (region) {\n case Region.Asia:\n return \"Asia\";\n case Region.US:\n return \"United States\";\n case Region.EU:\n return \"Europe\";\n case Region.SouthAmerica:\n return \"South America\";\n case Region.Africa:\n return \"Africa\";\n case Region.Oceania:\n return \"Oceania\";\n case Region.Other:\n return \"Other\";\n }\n}\n\n// Converts a lamports bigint into a SOL number with full precision.\nexport function lamportsToSol(lamports: bigint): number {\n return Number(lamports) / 1_000_000_000;\n}\n\n// Computes the latency component score using the on-chain formula.\n// 400ms ceiling. Anything at or above 400ms scores 0.\nexport function latencyScore(slotLatencyMs: number): number {\n if (slotLatencyMs >= 400) return 0;\n return Math.floor(((400 - slotLatencyMs) * 100) / 400);\n}\n\n// Returns true when stake-weighted reach is below the 67% consensus threshold.\n// At this point the network cannot finalize — dApps should halt high-value writes.\nexport function isConsensusCritical(reachableStakePct: number): boolean {\n return reachableStakePct < 67;\n}\n\n// Human-readable status for stake-weighted reachability.\nexport function stakeReachStatus(\n reachableStakePct: number,\n): \"healthy\" | \"degraded\" | \"critical\" {\n if (reachableStakePct >= 80) return \"healthy\";\n if (reachableStakePct >= 67) return \"degraded\";\n return \"critical\";\n}\n\n// Returns the dominant client for a region by count.\n// Useful for dashboard labels and staking strategy hints.\nexport function dominantClient(\n region: RegionScore,\n): \"agave\" | \"firedancer\" | \"jito\" | \"other\" {\n const counts = {\n agave: region.agaveCount,\n firedancer: region.firedancerCount,\n jito: region.jitoCount,\n other: region.otherCount + region.solanaLabsCount,\n };\n return Object.entries(counts).sort((a, b) => b[1] - a[1])[0]![0] as\n | \"agave\"\n | \"firedancer\"\n | \"jito\"\n | \"other\";\n}\n\n// Computes client diversity index (0-100). 100 = perfectly even across all clients.\n// 0 = complete monoculture. Uses simplified Herfindahl-Hirschman Index inverted.\nexport function clientDiversityIndex(region: RegionScore): number {\n const total =\n region.agaveCount +\n region.firedancerCount +\n region.jitoCount +\n region.solanaLabsCount +\n region.otherCount;\n if (total === 0) return 0;\n const shares = [\n region.agaveCount,\n region.firedancerCount,\n region.jitoCount,\n region.solanaLabsCount,\n region.otherCount,\n ].map((c) => c / total);\n const hhi = shares.reduce((sum, s) => sum + s * s, 0);\n // HHI ranges 0.2 (perfectly even across 5) to 1.0 (monoculture). Invert and normalize.\n return Math.round((1 - hhi) * 125);\n}\n"],"mappings":"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AA,YACF;AAAA,YACA,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,cACN;AAAA,YACF;AAAA,YACA,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,cACN;AAAA,YACF;AAAA,YACA,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,cACN;AAAA,YACF;AAAA,YACA,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,cACN;AAAA,YACF;AAAA,YACA,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,cACN;AAAA,YACF;AAAA,YACA,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,cACN;AAAA,YACF;AAAA,YACA,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,cACN;AAAA,YACF;AAAA,YACA,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,cACN;AAAA,YACF;AAAA,YACA,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,cACN;AAAA,YACF;AAAA,YACA,MAAQ;AAAA,UACV;AA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","names":["Region","PublicKey","Program","PublicKey","BN","PublicKey","PublicKey","BN","toBigInt","toRegion","PublicKey","Program"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "s0racle-sdk",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "TypeScript SDK for reading s0racle network health data from Solana",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"dev": "tsup --watch",
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"clean": "rm -rf dist",
|
|
25
|
+
"prepublishOnly": "npm run build"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"solana",
|
|
29
|
+
"s0racle",
|
|
30
|
+
"network-health",
|
|
31
|
+
"oracle",
|
|
32
|
+
"sdk"
|
|
33
|
+
],
|
|
34
|
+
"author": "mishalturkane",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "git+https://github.com/s0racle/s0racle-sdk.git"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://s0racle.xyz",
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/s0racle/s0racle-sdk/issues"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@coral-xyz/anchor": "^0.32.1",
|
|
46
|
+
"@solana/web3.js": "^1.98.4",
|
|
47
|
+
"bn.js": "^5.2.3"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/bn.js": "^5.2.0",
|
|
51
|
+
"@types/node": "^25.6.0",
|
|
52
|
+
"tsup": "^8.5.1",
|
|
53
|
+
"typescript": "^6.0.3"
|
|
54
|
+
}
|
|
55
|
+
}
|