Skip to content
Next — unreleased

Defined in: packages/sage/src/scanning/index.ts:144

Focused read-only scanning projection of one derived Character.

declare const state: CharacterScanningStateSnapshot;
console.log(state.dataRunnerXp.level, state.modifiers.power.value);

readonly character: EntityRef<"character">;

Defined in: packages/sage/src/scanning/index.ts:146

readonly dataRunnerXp: CharacterXpCategoryData & {
sequenceId: number;
};

Defined in: packages/sage/src/scanning/index.ts:148

readonly sequenceId: number;

readonly kind: "characterScanningState";

Defined in: packages/sage/src/scanning/index.ts:145

readonly modifiers: {
cooldown: ScanFixedValueData;
power: ScanFixedValueData;
sequenceId: number;
};

Defined in: packages/sage/src/scanning/index.ts:151

readonly cooldown: ScanFixedValueData;
readonly power: ScanFixedValueData;
readonly sequenceId: number;

readonly profile: EntityRef<"profile">;

Defined in: packages/sage/src/scanning/index.ts:147

readonly researchTagIds: readonly number[];

Defined in: packages/sage/src/scanning/index.ts:156

toJSON(): unknown;

Defined in: packages/sage/src/scanning/index.ts:157

unknown


Defined in: packages/sage/src/scanning/index.ts:123

Focused read-only scanning projection of one Fleet.

declare const state: FleetScanningStateSnapshot;
console.log(state.stats.power, state.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

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;
readonly cooldownSeconds: number;
readonly cost: number;
readonly power: number;

toJSON(): unknown;

Defined in: packages/sage/src/scanning/index.ts:134

unknown


Defined in: packages/sage/src/scanning/odds.ts:128

Client-derived exhaustion from an explicit clock and retained recovery history.

declare const exhaustion: ScanExhaustion;
console.log(exhaustion.exhaustionBasisPoints, exhaustion.effectiveRecoveries);

readonly effectiveRecoveries: number;

Defined in: packages/sage/src/scanning/odds.ts:131

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

toJSON(): unknown;

Defined in: packages/sage/src/scanning/odds.ts:132

unknown


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.

const options: ScanLootOddsOptions = { unlockedResearchTagIds: [12], requiredRegionResearchTagIds: [], exhaustionBasisPoints: 0 };

readonly exhaustionBasisPoints: number;

Defined in: packages/sage/src/scanning/odds.ts:87

readonly optional focus?: "any" | "industrial" | "technology" | "tactical" | "exotic";

Defined in: packages/sage/src/scanning/odds.ts:88

readonly requiredRegionResearchTagIds: readonly number[];

Defined in: packages/sage/src/scanning/odds.ts:86

readonly unlockedResearchTagIds: readonly number[];

Defined in: packages/sage/src/scanning/odds.ts:85


Defined in: packages/sage/src/scanning/index.ts:68

One cargo-backed scan cost.

declare const cost: ScanPatternCost;
console.log(cost.cargo.name, cost.multiplier.value);

readonly cargo: CargoDefinitionSummary;

Defined in: packages/sage/src/scanning/index.ts:69

readonly multiplier: ScanFixedValueData;

Defined in: packages/sage/src/scanning/index.ts:70


Defined in: packages/sage/src/scanning/index.ts:80

One cargo-backed scan outcome and its research-tag requirements.

declare const outcome: ScanPatternLootOutcome;
console.log(outcome.output.name, outcome.researchRequirementTagIds);

readonly output: CargoDefinitionSummary;

Defined in: packages/sage/src/scanning/index.ts:81

readonly outputAmountRaw: bigint;

Defined in: packages/sage/src/scanning/index.ts:82

readonly researchRequirementTagIds: readonly number[];

Defined in: packages/sage/src/scanning/index.ts:86

readonly rollWeight: ScanFixedValueData;

Defined in: packages/sage/src/scanning/index.ts:84

readonly threshold: ScanFixedValueData;

Defined in: packages/sage/src/scanning/index.ts:83

readonly xpValue: ScanFixedValueData;

Defined in: packages/sage/src/scanning/index.ts:85


Defined in: packages/sage/src/scanning/index.ts:96

Immutable, definition-resolved ScanPattern catalog entry.

declare const pattern: ScanPatternSnapshot;
console.log(pattern.name, pattern.loot.length);

readonly address: Address;

Defined in: packages/sage/src/scanning/index.ts:98

readonly blankWeight: ScanFixedValueData;

Defined in: packages/sage/src/scanning/index.ts:105

readonly blankXpValue: ScanFixedValueData;

Defined in: packages/sage/src/scanning/index.ts:106

readonly bump: number;

Defined in: packages/sage/src/scanning/index.ts:100

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

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.

readonly status: "active" | "draft" | "removed";

Defined in: packages/sage/src/scanning/index.ts:107

readonly version: number;

Defined in: packages/sage/src/scanning/index.ts:99

toJSON(): unknown;

Defined in: packages/sage/src/scanning/index.ts:113

unknown


Defined in: packages/sage/src/scanning/lifecycle.ts:16

Explicit chain clock inputs; slots and Unix seconds are independent units.

const clock: ScanSignalClock = { slot: 54_000_000n, unixSeconds: 1_790_000_000n };

readonly slot: bigint;

Defined in: packages/sage/src/scanning/lifecycle.ts:17

readonly unixSeconds: bigint;

Defined in: packages/sage/src/scanning/lifecycle.ts:18


Defined in: packages/sage/src/scanning/lifecycle.ts:27

Timing observations from the fingerprinted client, not permission to execute a scan action.

declare const result: ScanSignalTiming;
console.log(result.entropy?.phase, result.cooldownRemainingSeconds);

readonly contactExpiry:
| Readonly<{
expired: boolean;
remainingSeconds: bigint;
}>
| undefined;

Defined in: packages/sage/src/scanning/lifecycle.ts:38

readonly cooldownRemainingSeconds: bigint;

Defined in: packages/sage/src/scanning/lifecycle.ts:29

readonly entropy:
| Readonly<{
deadlineSlot: bigint;
phase: "expired" | "ready" | "waiting";
readyAtSlot: bigint;
slotsUntilReady: bigint;
}>
| undefined;

Defined in: packages/sage/src/scanning/lifecycle.ts:30

readonly status:
| "expired"
| "absent"
| "empty"
| "pending-entropy"
| "contact"
| "no-contact"
| "recovered"
| "abandoned";

Defined in: packages/sage/src/scanning/lifecycle.ts:28

toJSON(): unknown;

Defined in: packages/sage/src/scanning/lifecycle.ts:40

unknown

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.

declare const fleet: FleetScanningStateSnapshot;
const state: ScanCooldownState = deriveScanCooldownState(
fleet,
1_700_000_000n,
);

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.

declare const point: ScanCoordinates;
console.log(point.x.value, point.x.raw);

type ScanFixedValue = ScanFixedValueData;

Defined in: packages/sage/src/scanning/index.ts:48

Fixed-point scanning value with exact raw storage.

const value: ScanFixedValue = { raw: 65_536n, value: 1 };

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.

declare const odds: ScanLootOdds;
if (odds.status === 'available') console.log(odds.resources[0]?.perScanProbability);

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.

declare const profile: ScanLootProfileSnapshot;
console.log(profile.regionId, profile.loot[0]?.cargo.name);

type ScanPatternDiscoveryOptions = Omit<DiscoveryRequest, "filters" | "strategy">;

Defined in: packages/sage/src/scanning/index.ts:56

Options supported by targeted ScanPattern catalog discovery.

const options: ScanPatternDiscoveryOptions = { commitment: 'confirmed' };

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.

declare const policy: ScanPatternPolicySnapshot;
console.log(policy.strategy, policy.signalLifetimeSeconds);

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.

toJSON(): unknown;

unknown

declare const result: ScanRecoveryRange;
if (result.kind === 'contact') console.log(result.withinRange);

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.

declare const signal: ScanSignalSnapshot;
console.log(signal.status, signal.contact?.cargo.name);

type ScanSignalStatus = ScanSignalData["status"];

Defined in: packages/sage/src/scanning/signals.ts:58

Observed signal lifecycle state; it does not predict transition eligibility.

const status: ScanSignalStatus = 'pending-entropy';

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.

ParameterType
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

ScanLootOdds

declare const signal: ScanSignalSnapshot, policy: ScanPatternPolicySnapshot, loot: ScanLootProfileSnapshot;
const odds = deriveCommittedScanLootOdds(signal, policy, loot);

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.

ParameterType
fleetFleetScanningStateSnapshot
atUnixSecondsbigint

ScanCooldownState

declare const fleet: FleetScanningStateSnapshot;
const state = deriveScanCooldownState(fleet, 1_700_000_000n);

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.

ParameterTypeDescription
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.lengthnumberReturns 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.allowedFocusCategoriesreadonly ("any" | "industrial" | "technology" | "tactical" | "exotic")[]-
policy.contactChanceBasisPointsnumber-
policy.contentFingerprintstring-
policy.exhaustionDecaySecondsnumber-
policy.exhaustionPerRecoveryBasisPointsnumber-
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.lengthnumberReturns 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.maximumExhaustionBasisPointsnumber-
policy.maximumRarity"common" | "uncommon" | "rare" | "epic" | "legendary" | "anomalous"-
policy.noContactXpRawbigint-
policy.patternIdnumber-
policy.recoveryXpRawbigint-
policy.requiredResearchTagIdsreadonly number[]-
policy.revisionnumber-
policy.signalLifetimeSecondsnumber-
policy.status"active" | "draft" | "removed"-
policy.strategy"broad" | "focused" | "enhanced" | "deep" | "spatial"-
policy.targetRadius{ raw: bigint; value: number; }-
policy.targetRadius.rawbigint-
policy.targetRadius.valuenumber-
policy.valueBudgetRawbigint-
policy.versionnumber-
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-
optionsReadonly<{ regionId: number; unixSeconds: bigint; }>-

ScanExhaustion

declare const policy: ScanPatternPolicySnapshot, signal: ScanSignalSnapshot | undefined;
const exhaustion = deriveScanExhaustion(policy, signal, { regionId: 3, unixSeconds: 1_790_000_000n });

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.

ParameterType
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
optionsScanLootOddsOptions

ScanLootOdds

declare const policy: ScanPatternPolicySnapshot, loot: ScanLootProfileSnapshot;
const odds = deriveScanLootOdds(policy, loot, { unlockedResearchTagIds: [], requiredRegionResearchTagIds: [], exhaustionBasisPoints: 0 });

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.

ParameterType
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.rawbigint
location.x.valuenumber
location.y{ raw: bigint; value: number; }
location.y.rawbigint
location.y.valuenumber

ScanRecoveryRange

declare const signal: ScanSignalSnapshot | undefined, location: ScanCoordinates;
const range = deriveScanRecoveryRange(signal, location);
if (range.kind === 'contact') console.log(range.withinRange);

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.

ParameterType
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
clockScanSignalClock

ScanSignalTiming

declare const signal: ScanSignalSnapshot | undefined;
const timing = deriveScanSignalTiming(signal, { slot: 54_000_000n, unixSeconds: 1_790_000_000n });
console.log(timing.entropy?.phase);

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.

ParameterType
contextSageContext
profileAddress
options?ReadOptions

Promise<CharacterScanningStateSnapshot>

declare const ctx: SageContext;
declare const profile: Address;
const state = await getCharacterScanningState(ctx, profile);

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.

ParameterType
contextSageContext
addressAddress
options?ReadOptions

Promise<FleetScanningStateSnapshot>

declare const ctx: SageContext;
declare const fleet: Address;
const state = await getFleetScanningState(ctx, fleet);

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.

ParameterType
contextSageContext
regionIdnumber
options?ReadOptions

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

declare const ctx: SageContext, regionId: number;
const snapshot = await getScanLootProfile(ctx, regionId, { refresh: true });

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.

ParameterType
contextSageContext
patternIdnumber
options?ReadOptions

Promise<ScanPatternSnapshot>

declare const ctx: SageContext;
const pattern = await getScanPattern(ctx, 2);

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.

ParameterType
contextSageContext
patternIdnumber
options?ReadOptions

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

declare const ctx: SageContext, patternId: number;
const snapshot = await getScanPatternPolicy(ctx, patternId, { refresh: true });

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.

ParameterType
contextSageContext
options?ScanPatternDiscoveryOptions

Promise<readonly ScanPatternSnapshot[]>

declare const ctx: SageContext;
const patterns = await getScanPatterns(ctx);

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.

ParameterType
contextSageContext
fleetAddress
options?ReadOptions

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

declare const ctx: SageContext, fleet: Address;
const snapshot = await getScanSignalForFleet(ctx, fleet, { refresh: true });

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.

ParameterType
contextSageContext
regionIdnumber
options?ReadOptions

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>

declare const ctx: SageContext, regionId: number;
const snapshot = await maybeGetScanLootProfile(ctx, regionId, { refresh: true });

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.

ParameterType
contextSageContext
patternIdnumber
options?ReadOptions

Promise< | ScanPatternSnapshot | undefined>

declare const ctx: SageContext;
const pattern = await maybeGetScanPattern(ctx, 2);

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.

ParameterType
contextSageContext
patternIdnumber
options?ReadOptions

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>

declare const ctx: SageContext, patternId: number;
const snapshot = await maybeGetScanPatternPolicy(ctx, patternId, { refresh: true });

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.

ParameterType
contextSageContext
fleetAddress
options?ReadOptions

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>

declare const ctx: SageContext, fleet: Address;
const snapshot = await maybeGetScanSignalForFleet(ctx, fleet, { refresh: true });