scanning
Interfaces
Section titled “Interfaces”CharacterScanningStateSnapshot
Section titled “CharacterScanningStateSnapshot”Defined in: packages/sage/src/scanning/index.ts:144
Focused read-only scanning projection of one derived Character.
Example
Section titled “Example”declare const state: CharacterScanningStateSnapshot;console.log(state.dataRunnerXp.level, state.modifiers.power.value);Properties
Section titled “Properties”character
Section titled “character”readonly character: EntityRef<"character">;Defined in: packages/sage/src/scanning/index.ts:146
dataRunnerXp
Section titled “dataRunnerXp”readonly dataRunnerXp: CharacterXpCategoryData & { sequenceId: number;};Defined in: packages/sage/src/scanning/index.ts:148
Type Declaration
Section titled “Type Declaration”sequenceId
Section titled “sequenceId”readonly sequenceId: number;readonly kind: "characterScanningState";Defined in: packages/sage/src/scanning/index.ts:145
modifiers
Section titled “modifiers”readonly modifiers: { cooldown: ScanFixedValueData; power: ScanFixedValueData; sequenceId: number;};Defined in: packages/sage/src/scanning/index.ts:151
cooldown
Section titled “cooldown”readonly cooldown: ScanFixedValueData;readonly power: ScanFixedValueData;sequenceId
Section titled “sequenceId”readonly sequenceId: number;profile
Section titled “profile”readonly profile: EntityRef<"profile">;Defined in: packages/sage/src/scanning/index.ts:147
researchTagIds
Section titled “researchTagIds”readonly researchTagIds: readonly number[];Defined in: packages/sage/src/scanning/index.ts:156
Methods
Section titled “Methods”toJSON()
Section titled “toJSON()”toJSON(): unknown;Defined in: packages/sage/src/scanning/index.ts:157
Returns
Section titled “Returns”unknown
FleetScanningStateSnapshot
Section titled “FleetScanningStateSnapshot”Defined in: packages/sage/src/scanning/index.ts:123
Focused read-only scanning projection of one Fleet.
Example
Section titled “Example”declare const state: FleetScanningStateSnapshot;console.log(state.stats.power, state.cooldownEndsAtUnixSeconds);Properties
Section titled “Properties”cooldownEndsAtUnixSeconds
Section titled “cooldownEndsAtUnixSeconds”readonly cooldownEndsAtUnixSeconds: bigint;Defined in: packages/sage/src/scanning/index.ts:127
readonly fleet: EntityRef<"fleet">;Defined in: packages/sage/src/scanning/index.ts:125
readonly kind: "fleetScanningState";Defined in: packages/sage/src/scanning/index.ts:124
ownerProfile
Section titled “ownerProfile”readonly ownerProfile: EntityRef<"profile">;Defined in: packages/sage/src/scanning/index.ts:126
readonly stats: { bonus: number; cooldownSeconds: number; cost: number; power: number;};Defined in: packages/sage/src/scanning/index.ts:128
readonly bonus: number;cooldownSeconds
Section titled “cooldownSeconds”readonly cooldownSeconds: number;readonly cost: number;readonly power: number;Methods
Section titled “Methods”toJSON()
Section titled “toJSON()”toJSON(): unknown;Defined in: packages/sage/src/scanning/index.ts:134
Returns
Section titled “Returns”unknown
ScanExhaustion
Section titled “ScanExhaustion”Defined in: packages/sage/src/scanning/odds.ts:128
Client-derived exhaustion from an explicit clock and retained recovery history.
Example
Section titled “Example”declare const exhaustion: ScanExhaustion;console.log(exhaustion.exhaustionBasisPoints, exhaustion.effectiveRecoveries);Properties
Section titled “Properties”effectiveRecoveries
Section titled “effectiveRecoveries”readonly effectiveRecoveries: number;Defined in: packages/sage/src/scanning/odds.ts:131
exhaustionBasisPoints
Section titled “exhaustionBasisPoints”readonly exhaustionBasisPoints: number;Defined in: packages/sage/src/scanning/odds.ts:130
readonly kind: "client-derived-estimate";Defined in: packages/sage/src/scanning/odds.ts:129
Methods
Section titled “Methods”toJSON()
Section titled “toJSON()”toJSON(): unknown;Defined in: packages/sage/src/scanning/odds.ts:132
Returns
Section titled “Returns”unknown
ScanLootOddsOptions
Section titled “ScanLootOddsOptions”Defined in: packages/sage/src/scanning/odds.ts:84
Explicit eligibility knowledge for prospective client estimates. Empty tag arrays mean known none. Regional requirements must describe the supplied loot profile’s region. Focus defaults to any.
Example
Section titled “Example”const options: ScanLootOddsOptions = { unlockedResearchTagIds: [12], requiredRegionResearchTagIds: [], exhaustionBasisPoints: 0 };Properties
Section titled “Properties”exhaustionBasisPoints
Section titled “exhaustionBasisPoints”readonly exhaustionBasisPoints: number;Defined in: packages/sage/src/scanning/odds.ts:87
focus?
Section titled “focus?”readonly optional focus?: "any" | "industrial" | "technology" | "tactical" | "exotic";Defined in: packages/sage/src/scanning/odds.ts:88
requiredRegionResearchTagIds
Section titled “requiredRegionResearchTagIds”readonly requiredRegionResearchTagIds: readonly number[];Defined in: packages/sage/src/scanning/odds.ts:86
unlockedResearchTagIds
Section titled “unlockedResearchTagIds”readonly unlockedResearchTagIds: readonly number[];Defined in: packages/sage/src/scanning/odds.ts:85
ScanPatternCost
Section titled “ScanPatternCost”Defined in: packages/sage/src/scanning/index.ts:68
One cargo-backed scan cost.
Example
Section titled “Example”declare const cost: ScanPatternCost;console.log(cost.cargo.name, cost.multiplier.value);Properties
Section titled “Properties”readonly cargo: CargoDefinitionSummary;Defined in: packages/sage/src/scanning/index.ts:69
multiplier
Section titled “multiplier”readonly multiplier: ScanFixedValueData;Defined in: packages/sage/src/scanning/index.ts:70
ScanPatternLootOutcome
Section titled “ScanPatternLootOutcome”Defined in: packages/sage/src/scanning/index.ts:80
One cargo-backed scan outcome and its research-tag requirements.
Example
Section titled “Example”declare const outcome: ScanPatternLootOutcome;console.log(outcome.output.name, outcome.researchRequirementTagIds);Properties
Section titled “Properties”output
Section titled “output”readonly output: CargoDefinitionSummary;Defined in: packages/sage/src/scanning/index.ts:81
outputAmountRaw
Section titled “outputAmountRaw”readonly outputAmountRaw: bigint;Defined in: packages/sage/src/scanning/index.ts:82
researchRequirementTagIds
Section titled “researchRequirementTagIds”readonly researchRequirementTagIds: readonly number[];Defined in: packages/sage/src/scanning/index.ts:86
rollWeight
Section titled “rollWeight”readonly rollWeight: ScanFixedValueData;Defined in: packages/sage/src/scanning/index.ts:84
threshold
Section titled “threshold”readonly threshold: ScanFixedValueData;Defined in: packages/sage/src/scanning/index.ts:83
xpValue
Section titled “xpValue”readonly xpValue: ScanFixedValueData;Defined in: packages/sage/src/scanning/index.ts:85
ScanPatternSnapshot
Section titled “ScanPatternSnapshot”Defined in: packages/sage/src/scanning/index.ts:96
Immutable, definition-resolved ScanPattern catalog entry.
Example
Section titled “Example”declare const pattern: ScanPatternSnapshot;console.log(pattern.name, pattern.loot.length);Properties
Section titled “Properties”address
Section titled “address”readonly address: Address;Defined in: packages/sage/src/scanning/index.ts:98
blankWeight
Section titled “blankWeight”readonly blankWeight: ScanFixedValueData;Defined in: packages/sage/src/scanning/index.ts:105
blankXpValue
Section titled “blankXpValue”readonly blankXpValue: ScanFixedValueData;Defined in: packages/sage/src/scanning/index.ts:106
readonly bump: number;Defined in: packages/sage/src/scanning/index.ts:100
cooldownMultiplier
Section titled “cooldownMultiplier”readonly cooldownMultiplier: ScanFixedValueData;Defined in: packages/sage/src/scanning/index.ts:104
readonly costs: readonly ScanPatternCost[];Defined in: packages/sage/src/scanning/index.ts:108
readonly game: EntityRef<"game">;Defined in: packages/sage/src/scanning/index.ts:103
readonly id: number;Defined in: packages/sage/src/scanning/index.ts:101
readonly kind: "scanPattern";Defined in: packages/sage/src/scanning/index.ts:97
readonly loot: readonly ScanPatternLootOutcome[];Defined in: packages/sage/src/scanning/index.ts:109
readonly name: string;Defined in: packages/sage/src/scanning/index.ts:102
noiseMapCount
Section titled “noiseMapCount”readonly noiseMapCount: number;Defined in: packages/sage/src/scanning/index.ts:112
How many noise-map rows the pattern stores. The rows are opaque program data: Atlas Kit does not interpret them and offers no way to.
status
Section titled “status”readonly status: "active" | "draft" | "removed";Defined in: packages/sage/src/scanning/index.ts:107
version
Section titled “version”readonly version: number;Defined in: packages/sage/src/scanning/index.ts:99
Methods
Section titled “Methods”toJSON()
Section titled “toJSON()”toJSON(): unknown;Defined in: packages/sage/src/scanning/index.ts:113
Returns
Section titled “Returns”unknown
ScanSignalClock
Section titled “ScanSignalClock”Defined in: packages/sage/src/scanning/lifecycle.ts:16
Explicit chain clock inputs; slots and Unix seconds are independent units.
Example
Section titled “Example”const clock: ScanSignalClock = { slot: 54_000_000n, unixSeconds: 1_790_000_000n };Properties
Section titled “Properties”readonly slot: bigint;Defined in: packages/sage/src/scanning/lifecycle.ts:17
unixSeconds
Section titled “unixSeconds”readonly unixSeconds: bigint;Defined in: packages/sage/src/scanning/lifecycle.ts:18
ScanSignalTiming
Section titled “ScanSignalTiming”Defined in: packages/sage/src/scanning/lifecycle.ts:27
Timing observations from the fingerprinted client, not permission to execute a scan action.
Example
Section titled “Example”declare const result: ScanSignalTiming;console.log(result.entropy?.phase, result.cooldownRemainingSeconds);Properties
Section titled “Properties”contactExpiry
Section titled “contactExpiry”readonly contactExpiry: | Readonly<{ expired: boolean; remainingSeconds: bigint;}> | undefined;Defined in: packages/sage/src/scanning/lifecycle.ts:38
cooldownRemainingSeconds
Section titled “cooldownRemainingSeconds”readonly cooldownRemainingSeconds: bigint;Defined in: packages/sage/src/scanning/lifecycle.ts:29
entropy
Section titled “entropy”readonly entropy: | Readonly<{ deadlineSlot: bigint; phase: "expired" | "ready" | "waiting"; readyAtSlot: bigint; slotsUntilReady: bigint;}> | undefined;Defined in: packages/sage/src/scanning/lifecycle.ts:30
status
Section titled “status”readonly status: | "expired" | "absent" | "empty" | "pending-entropy" | "contact" | "no-contact" | "recovered" | "abandoned";Defined in: packages/sage/src/scanning/lifecycle.ts:28
Methods
Section titled “Methods”toJSON()
Section titled “toJSON()”toJSON(): unknown;Defined in: packages/sage/src/scanning/lifecycle.ts:40
Returns
Section titled “Returns”unknown
Type Aliases
Section titled “Type Aliases”ScanCooldownState
Section titled “ScanCooldownState”type ScanCooldownState = | { kind: "ready";} | { kind: "cooldown"; remainingSeconds: bigint;};Defined in: packages/sage/src/scanning/index.ts:170
Pure Fleet cooldown state at one explicit Unix timestamp.
Example
Section titled “Example”declare const fleet: FleetScanningStateSnapshot;const state: ScanCooldownState = deriveScanCooldownState( fleet, 1_700_000_000n,);ScanCoordinates
Section titled “ScanCoordinates”type ScanCoordinates = Immutable<ScanPointData>;Defined in: packages/sage/src/scanning/signals.ts:51
Coordinates in map units, with exact signed I8F56 storage retained per axis.
Example
Section titled “Example”declare const point: ScanCoordinates;console.log(point.x.value, point.x.raw);ScanFixedValue
Section titled “ScanFixedValue”type ScanFixedValue = ScanFixedValueData;Defined in: packages/sage/src/scanning/index.ts:48
Fixed-point scanning value with exact raw storage.
Example
Section titled “Example”const value: ScanFixedValue = { raw: 65_536n, value: 1 };ScanLootOdds
Section titled “ScanLootOdds”type ScanLootOdds = Readonly<{ basis: "prospective" | "committed"; kind: "client-derived-estimate"; provenance: Provenance; toJSON: unknown;}> & | Readonly<{ reasons: readonly UnavailableReason[]; status: "unavailable";}> | Readonly<{ contactChanceBasisPoints: number; contactProbability: number; eligibleRows: readonly Share & Readonly<{ rowIndex: ...; }>[]; excludedRows: readonly Readonly<{ reasons: readonly ...[]; rowIndex: number; }>[]; noContactProbability: number; resources: readonly Share[]; status: "available"; totalWeight: bigint;}>;Defined in: packages/sage/src/scanning/odds.ts:99
Client-derived selection estimates, never program-verified probabilities or recovery quantities. Unavailable results deliberately contain no probability fields. Conditional shares remain meaningful when contact probability is zero. Probabilities are numeric fractions from zero through one.
Example
Section titled “Example”declare const odds: ScanLootOdds;if (odds.status === 'available') console.log(odds.resources[0]?.perScanProbability);ScanLootProfileSnapshot
Section titled “ScanLootProfileSnapshot”type ScanLootProfileSnapshot = Immutable<Base<Omit<ScanLootProfileData, "loot">> & { kind: "scanLootProfile"; loot: readonly CargoRow<ScanLootProfileData["loot"][number]>[];}>;Defined in: packages/sage/src/scanning/signals.ts:111
Regional loot configuration, not a reward forecast. Weights are relative integers. Pattern eligibility is translated to IDs; opaque quantity modes remain unprojected.
Example
Section titled “Example”declare const profile: ScanLootProfileSnapshot;console.log(profile.regionId, profile.loot[0]?.cargo.name);ScanPatternDiscoveryOptions
Section titled “ScanPatternDiscoveryOptions”type ScanPatternDiscoveryOptions = Omit<DiscoveryRequest, "filters" | "strategy">;Defined in: packages/sage/src/scanning/index.ts:56
Options supported by targeted ScanPattern catalog discovery.
Example
Section titled “Example”const options: ScanPatternDiscoveryOptions = { commitment: 'confirmed' };ScanPatternPolicySnapshot
Section titled “ScanPatternPolicySnapshot”type ScanPatternPolicySnapshot = Immutable<Base<ScanPatternPolicyData> & { kind: "scanPatternPolicy";}>;Defined in: packages/sage/src/scanning/signals.ts:100
Current scan policy parameters. Basis points use 10,000 = 100%; XP stays exact raw units. Value budgets and permitted focus categories support client-derived estimates.
Example
Section titled “Example”declare const policy: ScanPatternPolicySnapshot;console.log(policy.strategy, policy.signalLifetimeSeconds);ScanRecoveryRange
Section titled “ScanRecoveryRange”type ScanRecoveryRange = | Readonly<{ kind: "no-contact";}> | Readonly<{ distanceSquaredRaw: bigint; kind: "contact"; radiusSquaredRaw: bigint; withinRange: boolean;}> & { toJSON: unknown;};Defined in: packages/sage/src/scanning/lifecycle.ts:50
Exact geometric comparison; squared raw values use a 2^112 scale, not map units. No-contact means geometry is unavailable, not that an action is allowed.
Type Declaration
Section titled “Type Declaration”toJSON()
Section titled “toJSON()”toJSON(): unknown;Returns
Section titled “Returns”unknown
Example
Section titled “Example”declare const result: ScanRecoveryRange;if (result.kind === 'contact') console.log(result.withinRange);ScanSignalSnapshot
Section titled “ScanSignalSnapshot”type ScanSignalSnapshot = Immutable<Base<Omit<ScanSignalData, | "fleet" | "ownerProfile" | "ownerCharacter" | "contact" | "receipt" | "attempt" | "noContact" | "ended">> & { attempt: NonNullable<ScanSignalData["attempt"]> | undefined; contact: | CargoRow<NonNullable<ScanSignalData["contact"]>> | undefined; ended: NonNullable<ScanSignalData["ended"]> | undefined; fleet: EntityRef<"fleet">; kind: "scanSignal"; noContact: NonNullable<ScanSignalData["noContact"]> | undefined; ownerCharacter: EntityRef<"character">; ownerProfile: EntityRef<"profile">; receipt: | CargoRow<NonNullable<ScanSignalData["receipt"]>> | undefined;}>;Defined in: packages/sage/src/scanning/signals.ts:67
Fleet signal snapshot. Empty signals have no attempt, contact or receipt. Contact/recovered cargo is resolved only for that state; no-contact has its own XP receipt.
Example
Section titled “Example”declare const signal: ScanSignalSnapshot;console.log(signal.status, signal.contact?.cargo.name);ScanSignalStatus
Section titled “ScanSignalStatus”type ScanSignalStatus = ScanSignalData["status"];Defined in: packages/sage/src/scanning/signals.ts:58
Observed signal lifecycle state; it does not predict transition eligibility.
Example
Section titled “Example”const status: ScanSignalStatus = 'pending-entropy';Functions
Section titled “Functions”deriveCommittedScanLootOdds()
Section titled “deriveCommittedScanLootOdds()”function deriveCommittedScanLootOdds( signal, policy, profile): ScanLootOdds;Defined in: packages/sage/src/scanning/odds.ts:365
Estimates a pending signal’s recorded draw using its committed rows and contact chance. Revisions AND full fingerprints must match. Current activity, focus and research do not replace committed eligibility; terminal signals are not random forecasts.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
signal | | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; attempt: | { commitSlot: bigint; contactChanceBasisPoints: number; detectedAtUnixSeconds: bigint; eligibleLootRowIndexes: readonly number[]; exhaustionBasisPoints: number; focus: "any" | "industrial" | "technology" | "tactical" | "exotic"; location: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; lootProfileContentFingerprint: string; lootProfileRevision: number; patternId: number; policyContentFingerprint: string; policyRevision: number; regionId: number; revealSlots: readonly bigint[]; } | undefined; contact: | { baseQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; expiresAtUnixSeconds: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; target: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; targetRadius: { raw: bigint; value: number; }; } | undefined; cooldownEndsAtUnixSeconds: bigint; ended: | { expiresAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; } | undefined; fleet: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "fleet"; }; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanSignal"; noContact: | { resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; ownerCharacter: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "character"; }; ownerProfile: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "profile"; }; receipt: | { acceptedQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; clippedQuantityRaw: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; recoveryHistory: { consecutiveRecoveries: number; lastRecoveryAtUnixSeconds: bigint; lastRegionId: number; }; sequence: bigint; status: | "expired" | "empty" | "pending-entropy" | "contact" | "no-contact" | "recovered" | "abandoned"; version: number; toJSON: unknown; } | undefined |
policy | | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; allowedFocusCategories: readonly ("any" | "industrial" | "technology" | "tactical" | "exotic")[]; contactChanceBasisPoints: number; contentFingerprint: string; exhaustionDecaySeconds: number; exhaustionPerRecoveryBasisPoints: number; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanPatternPolicy"; maximumExhaustionBasisPoints: number; maximumRarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; noContactXpRaw: bigint; patternId: number; recoveryXpRaw: bigint; requiredResearchTagIds: readonly number[]; revision: number; signalLifetimeSeconds: number; status: "active" | "draft" | "removed"; strategy: "broad" | "focused" | "enhanced" | "deep" | "spatial"; targetRadius: { raw: bigint; value: number; }; valueBudgetRaw: bigint; version: number; toJSON: unknown; } | undefined |
profile | | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; anchors: readonly { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }[]; contentFingerprint: string; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanLootProfile"; loot: readonly { baseQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; requiredResearchTagIds: readonly number[]; rollWeight: number; supportedPatternIds: readonly number[]; valueUnits: number; }[]; regionId: number; revision: number; riskValueMultiplierBasisPoints: number; status: "active" | "draft" | "removed"; version: number; toJSON: unknown; } | undefined |
Returns
Section titled “Returns”Example
Section titled “Example”declare const signal: ScanSignalSnapshot, policy: ScanPatternPolicySnapshot, loot: ScanLootProfileSnapshot;const odds = deriveCommittedScanLootOdds(signal, policy, loot);deriveScanCooldownState()
Section titled “deriveScanCooldownState()”function deriveScanCooldownState(fleet, atUnixSeconds): ScanCooldownState;Defined in: packages/sage/src/scanning/index.ts:460
Derives whether a Fleet scan cooldown is ready at an explicit timestamp.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
fleet | FleetScanningStateSnapshot |
atUnixSeconds | bigint |
Returns
Section titled “Returns”Example
Section titled “Example”declare const fleet: FleetScanningStateSnapshot;const state = deriveScanCooldownState(fleet, 1_700_000_000n);deriveScanExhaustion()
Section titled “deriveScanExhaustion()”function deriveScanExhaustion( policy, signal, options): ScanExhaustion;Defined in: packages/sage/src/scanning/odds.ts:447
Applies the client exhaustion decay rule with explicit region and Unix seconds, without clock reads. An absent signal means known absence of recovery history, not an unknown/unread signal. Another region, disabled decay or a clock before the last recovery produce zero exhaustion.
Parameters
Section titled “Parameters”| Parameter | Type | Description |
|---|---|---|
policy | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; allowedFocusCategories: readonly ("any" | "industrial" | "technology" | "tactical" | "exotic")[]; contactChanceBasisPoints: number; contentFingerprint: string; exhaustionDecaySeconds: number; exhaustionPerRecoveryBasisPoints: number; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanPatternPolicy"; maximumExhaustionBasisPoints: number; maximumRarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; noContactXpRaw: bigint; patternId: number; recoveryXpRaw: bigint; requiredResearchTagIds: readonly number[]; revision: number; signalLifetimeSeconds: number; status: "active" | "draft" | "removed"; strategy: "broad" | "focused" | "enhanced" | "deep" | "spatial"; targetRadius: { raw: bigint; value: number; }; valueBudgetRaw: bigint; version: number; toJSON: unknown; } | - |
policy.address | { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; } | - |
policy.address.__brand:@solana/kit | "Address" | - |
policy.address.__stringEncoding:@solana/kit | "base58" | - |
policy.address.length | number | Returns the length of a String object. |
policy.address.[iterator] | - | |
policy.address.anchor | - | |
policy.address.at | - | |
policy.address.big | - | |
policy.address.blink | - | |
policy.address.bold | - | |
policy.address.charAt | - | |
policy.address.charCodeAt | - | |
policy.address.codePointAt | - | |
policy.address.concat | - | |
policy.address.endsWith | - | |
policy.address.fixed | - | |
policy.address.fontcolor | - | |
policy.address.fontsize | - | |
policy.address.includes | - | |
policy.address.indexOf | - | |
policy.address.italics | - | |
policy.address.lastIndexOf | - | |
policy.address.link | - | |
policy.address.localeCompare | - | |
policy.address.match | - | |
policy.address.matchAll | - | |
policy.address.normalize | - | |
policy.address.padEnd | - | |
policy.address.padStart | - | |
policy.address.repeat | - | |
policy.address.replace | - | |
policy.address.replaceAll | - | |
policy.address.search | - | |
policy.address.slice | - | |
policy.address.small | - | |
policy.address.split | - | |
policy.address.startsWith | - | |
policy.address.strike | - | |
policy.address.sub | - | |
policy.address.substr | - | |
policy.address.substring | - | |
policy.address.sup | - | |
policy.address.toLocaleLowerCase | - | |
policy.address.toLocaleUpperCase | - | |
policy.address.toLowerCase | - | |
policy.address.toString | - | |
policy.address.toUpperCase | - | |
policy.address.trim | - | |
policy.address.trimEnd | - | |
policy.address.trimLeft | - | |
policy.address.trimRight | - | |
policy.address.trimStart | - | |
policy.address.valueOf | - | |
policy.allowedFocusCategories | readonly ("any" | "industrial" | "technology" | "tactical" | "exotic")[] | - |
policy.contactChanceBasisPoints | number | - |
policy.contentFingerprint | string | - |
policy.exhaustionDecaySeconds | number | - |
policy.exhaustionPerRecoveryBasisPoints | number | - |
policy.game | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; } | - |
policy.game.address | { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; } | - |
policy.game.address.__brand:@solana/kit | "Address" | - |
policy.game.address.__stringEncoding:@solana/kit | "base58" | - |
policy.game.address.length | number | Returns the length of a String object. |
policy.game.address.[iterator] | - | |
policy.game.address.anchor | - | |
policy.game.address.at | - | |
policy.game.address.big | - | |
policy.game.address.blink | - | |
policy.game.address.bold | - | |
policy.game.address.charAt | - | |
policy.game.address.charCodeAt | - | |
policy.game.address.codePointAt | - | |
policy.game.address.concat | - | |
policy.game.address.endsWith | - | |
policy.game.address.fixed | - | |
policy.game.address.fontcolor | - | |
policy.game.address.fontsize | - | |
policy.game.address.includes | - | |
policy.game.address.indexOf | - | |
policy.game.address.italics | - | |
policy.game.address.lastIndexOf | - | |
policy.game.address.link | - | |
policy.game.address.localeCompare | - | |
policy.game.address.match | - | |
policy.game.address.matchAll | - | |
policy.game.address.normalize | - | |
policy.game.address.padEnd | - | |
policy.game.address.padStart | - | |
policy.game.address.repeat | - | |
policy.game.address.replace | - | |
policy.game.address.replaceAll | - | |
policy.game.address.search | - | |
policy.game.address.slice | - | |
policy.game.address.small | - | |
policy.game.address.split | - | |
policy.game.address.startsWith | - | |
policy.game.address.strike | - | |
policy.game.address.sub | - | |
policy.game.address.substr | - | |
policy.game.address.substring | - | |
policy.game.address.sup | - | |
policy.game.address.toLocaleLowerCase | - | |
policy.game.address.toLocaleUpperCase | - | |
policy.game.address.toLowerCase | - | |
policy.game.address.toString | - | |
policy.game.address.toUpperCase | - | |
policy.game.address.trim | - | |
policy.game.address.trimEnd | - | |
policy.game.address.trimLeft | - | |
policy.game.address.trimRight | - | |
policy.game.address.trimStart | - | |
policy.game.address.valueOf | - | |
policy.game.type | "game" | - |
policy.kind | "scanPatternPolicy" | - |
policy.maximumExhaustionBasisPoints | number | - |
policy.maximumRarity | "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous" | - |
policy.noContactXpRaw | bigint | - |
policy.patternId | number | - |
policy.recoveryXpRaw | bigint | - |
policy.requiredResearchTagIds | readonly number[] | - |
policy.revision | number | - |
policy.signalLifetimeSeconds | number | - |
policy.status | "active" | "draft" | "removed" | - |
policy.strategy | "broad" | "focused" | "enhanced" | "deep" | "spatial" | - |
policy.targetRadius | { raw: bigint; value: number; } | - |
policy.targetRadius.raw | bigint | - |
policy.targetRadius.value | number | - |
policy.valueBudgetRaw | bigint | - |
policy.version | number | - |
policy.toJSON | - | |
signal | | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; attempt: | { commitSlot: bigint; contactChanceBasisPoints: number; detectedAtUnixSeconds: bigint; eligibleLootRowIndexes: readonly number[]; exhaustionBasisPoints: number; focus: "any" | "industrial" | "technology" | "tactical" | "exotic"; location: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; lootProfileContentFingerprint: string; lootProfileRevision: number; patternId: number; policyContentFingerprint: string; policyRevision: number; regionId: number; revealSlots: readonly bigint[]; } | undefined; contact: | { baseQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; expiresAtUnixSeconds: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; target: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; targetRadius: { raw: bigint; value: number; }; } | undefined; cooldownEndsAtUnixSeconds: bigint; ended: | { expiresAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; } | undefined; fleet: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "fleet"; }; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanSignal"; noContact: | { resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; ownerCharacter: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "character"; }; ownerProfile: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "profile"; }; receipt: | { acceptedQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; clippedQuantityRaw: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; recoveryHistory: { consecutiveRecoveries: number; lastRecoveryAtUnixSeconds: bigint; lastRegionId: number; }; sequence: bigint; status: | "expired" | "empty" | "pending-entropy" | "contact" | "no-contact" | "recovered" | "abandoned"; version: number; toJSON: unknown; } | undefined | - |
options | Readonly<{ regionId: number; unixSeconds: bigint; }> | - |
Returns
Section titled “Returns”Example
Section titled “Example”declare const policy: ScanPatternPolicySnapshot, signal: ScanSignalSnapshot | undefined;const exhaustion = deriveScanExhaustion(policy, signal, { regionId: 3, unixSeconds: 1_790_000_000n });deriveScanLootOdds()
Section titled “deriveScanLootOdds()”function deriveScanLootOdds( policy, profile, options): ScanLootOdds;Defined in: packages/sage/src/scanning/odds.ts:286
Estimates prospective contact and cargo-selection odds using the fingerprinted client’s eligibility rules. Requires explicit research and exhaustion knowledge. This is not full scan-launch readiness: permissions, costs, Fleet state, cooldown, target and recovery capacity are outside this calculation.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
policy | | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; allowedFocusCategories: readonly ("any" | "industrial" | "technology" | "tactical" | "exotic")[]; contactChanceBasisPoints: number; contentFingerprint: string; exhaustionDecaySeconds: number; exhaustionPerRecoveryBasisPoints: number; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanPatternPolicy"; maximumExhaustionBasisPoints: number; maximumRarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; noContactXpRaw: bigint; patternId: number; recoveryXpRaw: bigint; requiredResearchTagIds: readonly number[]; revision: number; signalLifetimeSeconds: number; status: "active" | "draft" | "removed"; strategy: "broad" | "focused" | "enhanced" | "deep" | "spatial"; targetRadius: { raw: bigint; value: number; }; valueBudgetRaw: bigint; version: number; toJSON: unknown; } | undefined |
profile | | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; anchors: readonly { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }[]; contentFingerprint: string; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanLootProfile"; loot: readonly { baseQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; requiredResearchTagIds: readonly number[]; rollWeight: number; supportedPatternIds: readonly number[]; valueUnits: number; }[]; regionId: number; revision: number; riskValueMultiplierBasisPoints: number; status: "active" | "draft" | "removed"; version: number; toJSON: unknown; } | undefined |
options | ScanLootOddsOptions |
Returns
Section titled “Returns”Example
Section titled “Example”declare const policy: ScanPatternPolicySnapshot, loot: ScanLootProfileSnapshot;const odds = deriveScanLootOdds(policy, loot, { unlockedResearchTagIds: [], requiredRegionResearchTagIds: [], exhaustionBasisPoints: 0 });deriveScanRecoveryRange()
Section titled “deriveScanRecoveryRange()”function deriveScanRecoveryRange(signal, location): ScanRecoveryRange;Defined in: packages/sage/src/scanning/lifecycle.ts:147
Compares a contact’s recovery radius with exact raw I8F56 coordinates, boundary included. Supply current raw I8F56 coordinates, not Fleet display coordinates or the original scan-attempt position. Never reconstruct exact bits from rounded values. Uses raw components only. This is geometry, not expiry, authority, capacity or instruction eligibility; an expired Contact still has measurable geometry.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
signal | | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; attempt: | { commitSlot: bigint; contactChanceBasisPoints: number; detectedAtUnixSeconds: bigint; eligibleLootRowIndexes: readonly number[]; exhaustionBasisPoints: number; focus: "any" | "industrial" | "technology" | "tactical" | "exotic"; location: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; lootProfileContentFingerprint: string; lootProfileRevision: number; patternId: number; policyContentFingerprint: string; policyRevision: number; regionId: number; revealSlots: readonly bigint[]; } | undefined; contact: | { baseQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; expiresAtUnixSeconds: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; target: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; targetRadius: { raw: bigint; value: number; }; } | undefined; cooldownEndsAtUnixSeconds: bigint; ended: | { expiresAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; } | undefined; fleet: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "fleet"; }; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanSignal"; noContact: | { resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; ownerCharacter: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "character"; }; ownerProfile: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "profile"; }; receipt: | { acceptedQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; clippedQuantityRaw: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; recoveryHistory: { consecutiveRecoveries: number; lastRecoveryAtUnixSeconds: bigint; lastRegionId: number; }; sequence: bigint; status: | "expired" | "empty" | "pending-entropy" | "contact" | "no-contact" | "recovered" | "abandoned"; version: number; toJSON: unknown; } | undefined |
location | { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; } |
location.x | { raw: bigint; value: number; } |
location.x.raw | bigint |
location.x.value | number |
location.y | { raw: bigint; value: number; } |
location.y.raw | bigint |
location.y.value | number |
Returns
Section titled “Returns”Example
Section titled “Example”declare const signal: ScanSignalSnapshot | undefined, location: ScanCoordinates;const range = deriveScanRecoveryRange(signal, location);if (range.kind === 'contact') console.log(range.withinRange);deriveScanSignalTiming()
Section titled “deriveScanSignalTiming()”function deriveScanSignalTiming(signal, clock): ScanSignalTiming;Defined in: packages/sage/src/scanning/lifecycle.ts:93
Projects signal cooldown, pending entropy and contact expiry using explicit clock values. Reveal starts at commitSlot + 10 and ends exclusively 256 slots later, matching the fingerprinted client. No network, polling, clock access or acknowledgement eligibility is implied; abandonment acknowledgement can shorten cooldown.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
signal | | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; attempt: | { commitSlot: bigint; contactChanceBasisPoints: number; detectedAtUnixSeconds: bigint; eligibleLootRowIndexes: readonly number[]; exhaustionBasisPoints: number; focus: "any" | "industrial" | "technology" | "tactical" | "exotic"; location: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; lootProfileContentFingerprint: string; lootProfileRevision: number; patternId: number; policyContentFingerprint: string; policyRevision: number; regionId: number; revealSlots: readonly bigint[]; } | undefined; contact: | { baseQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; expiresAtUnixSeconds: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; target: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; targetRadius: { raw: bigint; value: number; }; } | undefined; cooldownEndsAtUnixSeconds: bigint; ended: | { expiresAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; } | undefined; fleet: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "fleet"; }; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanSignal"; noContact: | { resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; ownerCharacter: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "character"; }; ownerProfile: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "profile"; }; receipt: | { acceptedQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; clippedQuantityRaw: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; recoveryHistory: { consecutiveRecoveries: number; lastRecoveryAtUnixSeconds: bigint; lastRegionId: number; }; sequence: bigint; status: | "expired" | "empty" | "pending-entropy" | "contact" | "no-contact" | "recovered" | "abandoned"; version: number; toJSON: unknown; } | undefined |
clock | ScanSignalClock |
Returns
Section titled “Returns”Example
Section titled “Example”declare const signal: ScanSignalSnapshot | undefined;const timing = deriveScanSignalTiming(signal, { slot: 54_000_000n, unixSeconds: 1_790_000_000n });console.log(timing.entropy?.phase);getCharacterScanningState()
Section titled “getCharacterScanningState()”function getCharacterScanningState( context, profile,options?): Promise<CharacterScanningStateSnapshot>;Defined in: packages/sage/src/scanning/index.ts:400
Derives one Character from Profile and returns focused scanning progression.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
profile | Address |
options? | ReadOptions |
Returns
Section titled “Returns”Promise<CharacterScanningStateSnapshot>
Example
Section titled “Example”declare const ctx: SageContext;declare const profile: Address;const state = await getCharacterScanningState(ctx, profile);getFleetScanningState()
Section titled “getFleetScanningState()”function getFleetScanningState( context, address,options?): Promise<FleetScanningStateSnapshot>;Defined in: packages/sage/src/scanning/index.ts:348
Reads one Fleet and returns only its translated scanning state.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
address | Address |
options? | ReadOptions |
Returns
Section titled “Returns”Promise<FleetScanningStateSnapshot>
Example
Section titled “Example”declare const ctx: SageContext;declare const fleet: Address;const state = await getFleetScanningState(ctx, fleet);getScanLootProfile()
Section titled “getScanLootProfile()”function getScanLootProfile( context, regionId, options?): Promise<{ address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; anchors: readonly { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }[]; contentFingerprint: string; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanLootProfile"; loot: readonly { baseQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; requiredResearchTagIds: readonly number[]; rollWeight: number; supportedPatternIds: readonly number[]; valueUnits: number; }[]; regionId: number; revision: number; riskValueMultiplierBasisPoints: number; status: "active" | "draft" | "removed"; version: number; toJSON: unknown;}>;Defined in: packages/sage/src/scanning/signals.ts:365
Derives and reads a required ScanLootProfile for the configured Game. Absence throws AccountNotFoundError.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
regionId | number |
options? | ReadOptions |
Returns
Section titled “Returns”Promise<{
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
anchors: readonly {
x: {
raw: bigint;
value: number;
};
y: {
raw: bigint;
value: number;
};
}[];
contentFingerprint: string;
game: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "game";
};
kind: "scanLootProfile";
loot: readonly {
baseQuantityRaw: bigint;
cargo: {
categoryId: number;
id: number;
mint: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
name: string;
storageCost: number;
};
category: "any" | "industrial" | "technology" | "tactical" | "exotic";
rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous";
requiredResearchTagIds: readonly number[];
rollWeight: number;
supportedPatternIds: readonly number[];
valueUnits: number;
}[];
regionId: number;
revision: number;
riskValueMultiplierBasisPoints: number;
status: "active" | "draft" | "removed";
version: number;
toJSON: unknown;
}>
Example
Section titled “Example”declare const ctx: SageContext, regionId: number;const snapshot = await getScanLootProfile(ctx, regionId, { refresh: true });getScanPattern()
Section titled “getScanPattern()”function getScanPattern( context, patternId,options?): Promise<ScanPatternSnapshot>;Defined in: packages/sage/src/scanning/index.ts:279
Derives and reads one required ScanPattern for the configured Game.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
patternId | number |
options? | ReadOptions |
Returns
Section titled “Returns”Promise<ScanPatternSnapshot>
Example
Section titled “Example”declare const ctx: SageContext;const pattern = await getScanPattern(ctx, 2);getScanPatternPolicy()
Section titled “getScanPatternPolicy()”function getScanPatternPolicy( context, patternId, options?): Promise<{ address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; allowedFocusCategories: readonly ("any" | "industrial" | "technology" | "tactical" | "exotic")[]; contactChanceBasisPoints: number; contentFingerprint: string; exhaustionDecaySeconds: number; exhaustionPerRecoveryBasisPoints: number; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanPatternPolicy"; maximumExhaustionBasisPoints: number; maximumRarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; noContactXpRaw: bigint; patternId: number; recoveryXpRaw: bigint; requiredResearchTagIds: readonly number[]; revision: number; signalLifetimeSeconds: number; status: "active" | "draft" | "removed"; strategy: "broad" | "focused" | "enhanced" | "deep" | "spatial"; targetRadius: { raw: bigint; value: number; }; valueBudgetRaw: bigint; version: number; toJSON: unknown;}>;Defined in: packages/sage/src/scanning/signals.ts:320
Derives and reads a required ScanPatternPolicy for the configured Game. Absence throws AccountNotFoundError.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
patternId | number |
options? | ReadOptions |
Returns
Section titled “Returns”Promise<{
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
allowedFocusCategories: readonly ("any" | "industrial" | "technology" | "tactical" | "exotic")[];
contactChanceBasisPoints: number;
contentFingerprint: string;
exhaustionDecaySeconds: number;
exhaustionPerRecoveryBasisPoints: number;
game: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "game";
};
kind: "scanPatternPolicy";
maximumExhaustionBasisPoints: number;
maximumRarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous";
noContactXpRaw: bigint;
patternId: number;
recoveryXpRaw: bigint;
requiredResearchTagIds: readonly number[];
revision: number;
signalLifetimeSeconds: number;
status: "active" | "draft" | "removed";
strategy: "broad" | "focused" | "enhanced" | "deep" | "spatial";
targetRadius: {
raw: bigint;
value: number;
};
valueBudgetRaw: bigint;
version: number;
toJSON: unknown;
}>
Example
Section titled “Example”declare const ctx: SageContext, patternId: number;const snapshot = await getScanPatternPolicy(ctx, patternId, { refresh: true });getScanPatterns()
Section titled “getScanPatterns()”function getScanPatterns(context, options?): Promise<readonly ScanPatternSnapshot[]>;Defined in: packages/sage/src/scanning/index.ts:326
Discovers the configured Game’s ScanPattern catalog with targeted filters.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
options? | ScanPatternDiscoveryOptions |
Returns
Section titled “Returns”Promise<readonly ScanPatternSnapshot[]>
Example
Section titled “Example”declare const ctx: SageContext;const patterns = await getScanPatterns(ctx);getScanSignalForFleet()
Section titled “getScanSignalForFleet()”function getScanSignalForFleet( context, fleet, options?): Promise<{ address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; attempt: | { commitSlot: bigint; contactChanceBasisPoints: number; detectedAtUnixSeconds: bigint; eligibleLootRowIndexes: readonly number[]; exhaustionBasisPoints: number; focus: "any" | "industrial" | "technology" | "tactical" | "exotic"; location: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; lootProfileContentFingerprint: string; lootProfileRevision: number; patternId: number; policyContentFingerprint: string; policyRevision: number; regionId: number; revealSlots: readonly bigint[]; } | undefined; contact: | { baseQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; expiresAtUnixSeconds: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; target: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; targetRadius: { raw: bigint; value: number; }; } | undefined; cooldownEndsAtUnixSeconds: bigint; ended: | { expiresAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; } | undefined; fleet: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "fleet"; }; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanSignal"; noContact: | { resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; ownerCharacter: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "character"; }; ownerProfile: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "profile"; }; receipt: | { acceptedQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; clippedQuantityRaw: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; recoveryHistory: { consecutiveRecoveries: number; lastRecoveryAtUnixSeconds: bigint; lastRegionId: number; }; sequence: bigint; status: | "expired" | "empty" | "pending-entropy" | "contact" | "no-contact" | "recovered" | "abandoned"; version: number; toJSON: unknown;}>;Defined in: packages/sage/src/scanning/signals.ts:267
Derives and reads a required ScanSignal for the configured Game. Absence throws AccountNotFoundError.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
fleet | Address |
options? | ReadOptions |
Returns
Section titled “Returns”Promise<{
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
attempt: | {
commitSlot: bigint;
contactChanceBasisPoints: number;
detectedAtUnixSeconds: bigint;
eligibleLootRowIndexes: readonly number[];
exhaustionBasisPoints: number;
focus: "any" | "industrial" | "technology" | "tactical" | "exotic";
location: {
x: {
raw: bigint;
value: number;
};
y: {
raw: bigint;
value: number;
};
};
lootProfileContentFingerprint: string;
lootProfileRevision: number;
patternId: number;
policyContentFingerprint: string;
policyRevision: number;
regionId: number;
revealSlots: readonly bigint[];
}
| undefined;
contact: | {
baseQuantityRaw: bigint;
cargo: {
categoryId: number;
id: number;
mint: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
name: string;
storageCost: number;
};
category: "any" | "industrial" | "technology" | "tactical" | "exotic";
expiresAtUnixSeconds: bigint;
nominalQuantityRaw: bigint;
rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous";
target: {
x: {
raw: bigint;
value: number;
};
y: {
raw: bigint;
value: number;
};
};
targetRadius: {
raw: bigint;
value: number;
};
}
| undefined;
cooldownEndsAtUnixSeconds: bigint;
ended: | {
expiresAtUnixSeconds: bigint;
terminalAtUnixSeconds: bigint;
}
| undefined;
fleet: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "fleet";
};
game: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "game";
};
kind: "scanSignal";
noContact: | {
resolvedAtUnixSeconds: bigint;
terminalAtUnixSeconds: bigint;
xpAwardedRaw: bigint;
}
| undefined;
ownerCharacter: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "character";
};
ownerProfile: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "profile";
};
receipt: | {
acceptedQuantityRaw: bigint;
cargo: {
categoryId: number;
id: number;
mint: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
name: string;
storageCost: number;
};
category: "any" | "industrial" | "technology" | "tactical" | "exotic";
clippedQuantityRaw: bigint;
nominalQuantityRaw: bigint;
rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous";
resolvedAtUnixSeconds: bigint;
terminalAtUnixSeconds: bigint;
xpAwardedRaw: bigint;
}
| undefined;
recoveryHistory: {
consecutiveRecoveries: number;
lastRecoveryAtUnixSeconds: bigint;
lastRegionId: number;
};
sequence: bigint;
status: | "expired"
| "empty"
| "pending-entropy"
| "contact"
| "no-contact"
| "recovered"
| "abandoned";
version: number;
toJSON: unknown;
}>
Example
Section titled “Example”declare const ctx: SageContext, fleet: Address;const snapshot = await getScanSignalForFleet(ctx, fleet, { refresh: true });maybeGetScanLootProfile()
Section titled “maybeGetScanLootProfile()”function maybeGetScanLootProfile( context, regionId, options?): Promise< | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; anchors: readonly { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }[]; contentFingerprint: string; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanLootProfile"; loot: readonly { baseQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; requiredResearchTagIds: readonly number[]; rollWeight: number; supportedPatternIds: readonly number[]; valueUnits: number; }[]; regionId: number; revision: number; riskValueMultiplierBasisPoints: number; status: "active" | "draft" | "removed"; version: number; toJSON: unknown;}| undefined>;Defined in: packages/sage/src/scanning/signals.ts:391
Derives and reads an optional ScanLootProfile for the configured Game. Absence returns undefined; malformed accounts still throw.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
regionId | number |
options? | ReadOptions |
Returns
Section titled “Returns”Promise<
| {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
anchors: readonly {
x: {
raw: bigint;
value: number;
};
y: {
raw: bigint;
value: number;
};
}[];
contentFingerprint: string;
game: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "game";
};
kind: "scanLootProfile";
loot: readonly {
baseQuantityRaw: bigint;
cargo: {
categoryId: number;
id: number;
mint: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
name: string;
storageCost: number;
};
category: "any" | "industrial" | "technology" | "tactical" | "exotic";
rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous";
requiredResearchTagIds: readonly number[];
rollWeight: number;
supportedPatternIds: readonly number[];
valueUnits: number;
}[];
regionId: number;
revision: number;
riskValueMultiplierBasisPoints: number;
status: "active" | "draft" | "removed";
version: number;
toJSON: unknown;
}
| undefined>
Example
Section titled “Example”declare const ctx: SageContext, regionId: number;const snapshot = await maybeGetScanLootProfile(ctx, regionId, { refresh: true });maybeGetScanPattern()
Section titled “maybeGetScanPattern()”function maybeGetScanPattern( context, patternId, options?): Promise< | ScanPatternSnapshot| undefined>;Defined in: packages/sage/src/scanning/index.ts:302
Derives and reads one optional ScanPattern for the configured Game.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
patternId | number |
options? | ReadOptions |
Returns
Section titled “Returns”Promise<
| ScanPatternSnapshot
| undefined>
Example
Section titled “Example”declare const ctx: SageContext;const pattern = await maybeGetScanPattern(ctx, 2);maybeGetScanPatternPolicy()
Section titled “maybeGetScanPatternPolicy()”function maybeGetScanPatternPolicy( context, patternId, options?): Promise< | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; allowedFocusCategories: readonly ("any" | "industrial" | "technology" | "tactical" | "exotic")[]; contactChanceBasisPoints: number; contentFingerprint: string; exhaustionDecaySeconds: number; exhaustionPerRecoveryBasisPoints: number; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanPatternPolicy"; maximumExhaustionBasisPoints: number; maximumRarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; noContactXpRaw: bigint; patternId: number; recoveryXpRaw: bigint; requiredResearchTagIds: readonly number[]; revision: number; signalLifetimeSeconds: number; status: "active" | "draft" | "removed"; strategy: "broad" | "focused" | "enhanced" | "deep" | "spatial"; targetRadius: { raw: bigint; value: number; }; valueBudgetRaw: bigint; version: number; toJSON: unknown;}| undefined>;Defined in: packages/sage/src/scanning/signals.ts:342
Derives and reads an optional ScanPatternPolicy for the configured Game. Absence returns undefined; malformed accounts still throw.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
patternId | number |
options? | ReadOptions |
Returns
Section titled “Returns”Promise<
| {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
allowedFocusCategories: readonly ("any" | "industrial" | "technology" | "tactical" | "exotic")[];
contactChanceBasisPoints: number;
contentFingerprint: string;
exhaustionDecaySeconds: number;
exhaustionPerRecoveryBasisPoints: number;
game: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "game";
};
kind: "scanPatternPolicy";
maximumExhaustionBasisPoints: number;
maximumRarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous";
noContactXpRaw: bigint;
patternId: number;
recoveryXpRaw: bigint;
requiredResearchTagIds: readonly number[];
revision: number;
signalLifetimeSeconds: number;
status: "active" | "draft" | "removed";
strategy: "broad" | "focused" | "enhanced" | "deep" | "spatial";
targetRadius: {
raw: bigint;
value: number;
};
valueBudgetRaw: bigint;
version: number;
toJSON: unknown;
}
| undefined>
Example
Section titled “Example”declare const ctx: SageContext, patternId: number;const snapshot = await maybeGetScanPatternPolicy(ctx, patternId, { refresh: true });maybeGetScanSignalForFleet()
Section titled “maybeGetScanSignalForFleet()”function maybeGetScanSignalForFleet( context, fleet, options?): Promise< | { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; attempt: | { commitSlot: bigint; contactChanceBasisPoints: number; detectedAtUnixSeconds: bigint; eligibleLootRowIndexes: readonly number[]; exhaustionBasisPoints: number; focus: "any" | "industrial" | "technology" | "tactical" | "exotic"; location: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; lootProfileContentFingerprint: string; lootProfileRevision: number; patternId: number; policyContentFingerprint: string; policyRevision: number; regionId: number; revealSlots: readonly bigint[]; } | undefined; contact: | { baseQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; expiresAtUnixSeconds: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; target: { x: { raw: bigint; value: number; }; y: { raw: bigint; value: number; }; }; targetRadius: { raw: bigint; value: number; }; } | undefined; cooldownEndsAtUnixSeconds: bigint; ended: | { expiresAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; } | undefined; fleet: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "fleet"; }; game: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "game"; }; kind: "scanSignal"; noContact: | { resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; ownerCharacter: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "character"; }; ownerProfile: { address: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; type: "profile"; }; receipt: | { acceptedQuantityRaw: bigint; cargo: { categoryId: number; id: number; mint: { [key: number]: string; __brand:@solana/kit: "Address"; __stringEncoding:@solana/kit: "base58"; length: number; [iterator]: StringIterator<string>; anchor: string; at: string | undefined; big: string; blink: string; bold: string; charAt: string; charCodeAt: number; codePointAt: number | undefined; concat: string; endsWith: boolean; fixed: string; fontcolor: string; fontsize: string; includes: boolean; indexOf: number; italics: string; lastIndexOf: number; link: string; localeCompare: number; match: RegExpMatchArray | null; matchAll: RegExpStringIterator<RegExpExecArray>; normalize: string; padEnd: string; padStart: string; repeat: string; replace: string; replaceAll: string; search: number; slice: string; small: string; split: string[]; startsWith: boolean; strike: string; sub: string; substr: string; substring: string; sup: string; toLocaleLowerCase: string; toLocaleUpperCase: string; toLowerCase: string; toString: string; toUpperCase: string; trim: string; trimEnd: string; trimLeft: string; trimRight: string; trimStart: string; valueOf: string; }; name: string; storageCost: number; }; category: "any" | "industrial" | "technology" | "tactical" | "exotic"; clippedQuantityRaw: bigint; nominalQuantityRaw: bigint; rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"; resolvedAtUnixSeconds: bigint; terminalAtUnixSeconds: bigint; xpAwardedRaw: bigint; } | undefined; recoveryHistory: { consecutiveRecoveries: number; lastRecoveryAtUnixSeconds: bigint; lastRegionId: number; }; sequence: bigint; status: | "expired" | "empty" | "pending-entropy" | "contact" | "no-contact" | "recovered" | "abandoned"; version: number; toJSON: unknown;}| undefined>;Defined in: packages/sage/src/scanning/signals.ts:293
Derives and reads an optional ScanSignal for the configured Game. Absence returns undefined; malformed accounts still throw.
Parameters
Section titled “Parameters”| Parameter | Type |
|---|---|
context | SageContext |
fleet | Address |
options? | ReadOptions |
Returns
Section titled “Returns”Promise<
| {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
attempt: | {
commitSlot: bigint;
contactChanceBasisPoints: number;
detectedAtUnixSeconds: bigint;
eligibleLootRowIndexes: readonly number[];
exhaustionBasisPoints: number;
focus: "any" | "industrial" | "technology" | "tactical" | "exotic";
location: {
x: {
raw: bigint;
value: number;
};
y: {
raw: bigint;
value: number;
};
};
lootProfileContentFingerprint: string;
lootProfileRevision: number;
patternId: number;
policyContentFingerprint: string;
policyRevision: number;
regionId: number;
revealSlots: readonly bigint[];
}
| undefined;
contact: | {
baseQuantityRaw: bigint;
cargo: {
categoryId: number;
id: number;
mint: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
name: string;
storageCost: number;
};
category: "any" | "industrial" | "technology" | "tactical" | "exotic";
expiresAtUnixSeconds: bigint;
nominalQuantityRaw: bigint;
rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous";
target: {
x: {
raw: bigint;
value: number;
};
y: {
raw: bigint;
value: number;
};
};
targetRadius: {
raw: bigint;
value: number;
};
}
| undefined;
cooldownEndsAtUnixSeconds: bigint;
ended: | {
expiresAtUnixSeconds: bigint;
terminalAtUnixSeconds: bigint;
}
| undefined;
fleet: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "fleet";
};
game: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "game";
};
kind: "scanSignal";
noContact: | {
resolvedAtUnixSeconds: bigint;
terminalAtUnixSeconds: bigint;
xpAwardedRaw: bigint;
}
| undefined;
ownerCharacter: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "character";
};
ownerProfile: {
address: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
type: "profile";
};
receipt: | {
acceptedQuantityRaw: bigint;
cargo: {
categoryId: number;
id: number;
mint: {
[key: number]: string;
__brand:@solana/kit: "Address";
__stringEncoding:@solana/kit: "base58";
length: number;
[iterator]: StringIterator<string>;
anchor: string;
at: string | undefined;
big: string;
blink: string;
bold: string;
charAt: string;
charCodeAt: number;
codePointAt: number | undefined;
concat: string;
endsWith: boolean;
fixed: string;
fontcolor: string;
fontsize: string;
includes: boolean;
indexOf: number;
italics: string;
lastIndexOf: number;
link: string;
localeCompare: number;
match: RegExpMatchArray | null;
matchAll: RegExpStringIterator<RegExpExecArray>;
normalize: string;
padEnd: string;
padStart: string;
repeat: string;
replace: string;
replaceAll: string;
search: number;
slice: string;
small: string;
split: string[];
startsWith: boolean;
strike: string;
sub: string;
substr: string;
substring: string;
sup: string;
toLocaleLowerCase: string;
toLocaleUpperCase: string;
toLowerCase: string;
toString: string;
toUpperCase: string;
trim: string;
trimEnd: string;
trimLeft: string;
trimRight: string;
trimStart: string;
valueOf: string;
};
name: string;
storageCost: number;
};
category: "any" | "industrial" | "technology" | "tactical" | "exotic";
clippedQuantityRaw: bigint;
nominalQuantityRaw: bigint;
rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous";
resolvedAtUnixSeconds: bigint;
terminalAtUnixSeconds: bigint;
xpAwardedRaw: bigint;
}
| undefined;
recoveryHistory: {
consecutiveRecoveries: number;
lastRecoveryAtUnixSeconds: bigint;
lastRegionId: number;
};
sequence: bigint;
status: | "expired"
| "empty"
| "pending-entropy"
| "contact"
| "no-contact"
| "recovered"
| "abandoned";
version: number;
toJSON: unknown;
}
| undefined>
Example
Section titled “Example”declare const ctx: SageContext, fleet: Address;const snapshot = await maybeGetScanSignalForFleet(ctx, fleet, { refresh: true });