@aephia/atlas-kit 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +124 -0
  3. package/dist/bindings.d.ts +11 -0
  4. package/dist/bindings.d.ts.map +1 -0
  5. package/dist/bindings.js +11 -0
  6. package/dist/bindings.js.map +1 -0
  7. package/dist/cargo/actions/index.d.ts +122 -0
  8. package/dist/cargo/actions/index.d.ts.map +1 -0
  9. package/dist/cargo/actions/index.js +526 -0
  10. package/dist/cargo/actions/index.js.map +1 -0
  11. package/dist/cargo/index.d.ts +77 -0
  12. package/dist/cargo/index.d.ts.map +1 -0
  13. package/dist/cargo/index.js +102 -0
  14. package/dist/cargo/index.js.map +1 -0
  15. package/dist/claim-stakes/index.d.ts +64 -0
  16. package/dist/claim-stakes/index.d.ts.map +1 -0
  17. package/dist/claim-stakes/index.js +97 -0
  18. package/dist/claim-stakes/index.js.map +1 -0
  19. package/dist/client/context.d.ts +21 -0
  20. package/dist/client/context.d.ts.map +1 -0
  21. package/dist/client/context.js +1374 -0
  22. package/dist/client/context.js.map +1 -0
  23. package/dist/client/contracts.d.ts +671 -0
  24. package/dist/client/contracts.d.ts.map +1 -0
  25. package/dist/client/contracts.js +2 -0
  26. package/dist/client/contracts.js.map +1 -0
  27. package/dist/client/deployments.d.ts +3 -0
  28. package/dist/client/deployments.d.ts.map +1 -0
  29. package/dist/client/deployments.js +2 -0
  30. package/dist/client/deployments.js.map +1 -0
  31. package/dist/client/errors.d.ts +227 -0
  32. package/dist/client/errors.d.ts.map +1 -0
  33. package/dist/client/errors.js +288 -0
  34. package/dist/client/errors.js.map +1 -0
  35. package/dist/client/index.d.ts +7 -0
  36. package/dist/client/index.d.ts.map +1 -0
  37. package/dist/client/index.js +5 -0
  38. package/dist/client/index.js.map +1 -0
  39. package/dist/client/lifecycle.d.ts +4 -0
  40. package/dist/client/lifecycle.d.ts.map +1 -0
  41. package/dist/client/lifecycle.js +10 -0
  42. package/dist/client/lifecycle.js.map +1 -0
  43. package/dist/client/provider-errors.d.ts +9 -0
  44. package/dist/client/provider-errors.d.ts.map +1 -0
  45. package/dist/client/provider-errors.js +12 -0
  46. package/dist/client/provider-errors.js.map +1 -0
  47. package/dist/client/reconciliation.d.ts +10 -0
  48. package/dist/client/reconciliation.d.ts.map +1 -0
  49. package/dist/client/reconciliation.js +9 -0
  50. package/dist/client/reconciliation.js.map +1 -0
  51. package/dist/client/refs.d.ts +23 -0
  52. package/dist/client/refs.d.ts.map +1 -0
  53. package/dist/client/refs.js +12 -0
  54. package/dist/client/refs.js.map +1 -0
  55. package/dist/combat/index.d.ts +256 -0
  56. package/dist/combat/index.d.ts.map +1 -0
  57. package/dist/combat/index.js +222 -0
  58. package/dist/combat/index.js.map +1 -0
  59. package/dist/crafting/index.d.ts +308 -0
  60. package/dist/crafting/index.d.ts.map +1 -0
  61. package/dist/crafting/index.js +400 -0
  62. package/dist/crafting/index.js.map +1 -0
  63. package/dist/factions/index.d.ts +292 -0
  64. package/dist/factions/index.d.ts.map +1 -0
  65. package/dist/factions/index.js +334 -0
  66. package/dist/factions/index.js.map +1 -0
  67. package/dist/fleets/actions/index.d.ts +200 -0
  68. package/dist/fleets/actions/index.d.ts.map +1 -0
  69. package/dist/fleets/actions/index.js +854 -0
  70. package/dist/fleets/actions/index.js.map +1 -0
  71. package/dist/fleets/index.d.ts +100 -0
  72. package/dist/fleets/index.d.ts.map +1 -0
  73. package/dist/fleets/index.js +124 -0
  74. package/dist/fleets/index.js.map +1 -0
  75. package/dist/identity/index.d.ts +225 -0
  76. package/dist/identity/index.d.ts.map +1 -0
  77. package/dist/identity/index.js +341 -0
  78. package/dist/identity/index.js.map +1 -0
  79. package/dist/index.d.ts +401 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +519 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/internal/c4/adapter.d.ts +6 -0
  84. package/dist/internal/c4/adapter.d.ts.map +1 -0
  85. package/dist/internal/c4/adapter.js +2 -0
  86. package/dist/internal/c4/adapter.js.map +1 -0
  87. package/dist/internal/c4/bindings.d.ts +4 -0
  88. package/dist/internal/c4/bindings.d.ts.map +1 -0
  89. package/dist/internal/c4/bindings.js +4 -0
  90. package/dist/internal/c4/bindings.js.map +1 -0
  91. package/dist/internal/c4/character-modifier.d.ts +5 -0
  92. package/dist/internal/c4/character-modifier.d.ts.map +1 -0
  93. package/dist/internal/c4/character-modifier.js +100 -0
  94. package/dist/internal/c4/character-modifier.js.map +1 -0
  95. package/dist/internal/c4/claim-stake.d.ts +140 -0
  96. package/dist/internal/c4/claim-stake.d.ts.map +1 -0
  97. package/dist/internal/c4/claim-stake.js +205 -0
  98. package/dist/internal/c4/claim-stake.js.map +1 -0
  99. package/dist/internal/c4/combat.d.ts +98 -0
  100. package/dist/internal/c4/combat.d.ts.map +1 -0
  101. package/dist/internal/c4/combat.js +232 -0
  102. package/dist/internal/c4/combat.js.map +1 -0
  103. package/dist/internal/c4/crafting.d.ts +170 -0
  104. package/dist/internal/c4/crafting.d.ts.map +1 -0
  105. package/dist/internal/c4/crafting.js +387 -0
  106. package/dist/internal/c4/crafting.js.map +1 -0
  107. package/dist/internal/c4/factions.d.ts +248 -0
  108. package/dist/internal/c4/factions.d.ts.map +1 -0
  109. package/dist/internal/c4/factions.js +589 -0
  110. package/dist/internal/c4/factions.js.map +1 -0
  111. package/dist/internal/c4/fleet-crew-binding.d.ts +12 -0
  112. package/dist/internal/c4/fleet-crew-binding.d.ts.map +1 -0
  113. package/dist/internal/c4/fleet-crew-binding.js +51 -0
  114. package/dist/internal/c4/fleet-crew-binding.js.map +1 -0
  115. package/dist/internal/c4/fleet.d.ts +310 -0
  116. package/dist/internal/c4/fleet.d.ts.map +1 -0
  117. package/dist/internal/c4/fleet.js +393 -0
  118. package/dist/internal/c4/fleet.js.map +1 -0
  119. package/dist/internal/c4/game.d.ts +192 -0
  120. package/dist/internal/c4/game.d.ts.map +1 -0
  121. package/dist/internal/c4/game.js +396 -0
  122. package/dist/internal/c4/game.js.map +1 -0
  123. package/dist/internal/c4/identity.d.ts +193 -0
  124. package/dist/internal/c4/identity.d.ts.map +1 -0
  125. package/dist/internal/c4/identity.js +180 -0
  126. package/dist/internal/c4/identity.js.map +1 -0
  127. package/dist/internal/c4/loot-layout.d.ts +20 -0
  128. package/dist/internal/c4/loot-layout.d.ts.map +1 -0
  129. package/dist/internal/c4/loot-layout.js +29 -0
  130. package/dist/internal/c4/loot-layout.js.map +1 -0
  131. package/dist/internal/c4/loyalty.d.ts +102 -0
  132. package/dist/internal/c4/loyalty.d.ts.map +1 -0
  133. package/dist/internal/c4/loyalty.js +318 -0
  134. package/dist/internal/c4/loyalty.js.map +1 -0
  135. package/dist/internal/c4/market.d.ts +112 -0
  136. package/dist/internal/c4/market.d.ts.map +1 -0
  137. package/dist/internal/c4/market.js +247 -0
  138. package/dist/internal/c4/market.js.map +1 -0
  139. package/dist/internal/c4/pda.d.ts +6 -0
  140. package/dist/internal/c4/pda.d.ts.map +1 -0
  141. package/dist/internal/c4/pda.js +45 -0
  142. package/dist/internal/c4/pda.js.map +1 -0
  143. package/dist/internal/c4/profile-faction.d.ts +14 -0
  144. package/dist/internal/c4/profile-faction.d.ts.map +1 -0
  145. package/dist/internal/c4/profile-faction.js +69 -0
  146. package/dist/internal/c4/profile-faction.js.map +1 -0
  147. package/dist/internal/c4/rewards.d.ts +135 -0
  148. package/dist/internal/c4/rewards.d.ts.map +1 -0
  149. package/dist/internal/c4/rewards.js +305 -0
  150. package/dist/internal/c4/rewards.js.map +1 -0
  151. package/dist/internal/c4/scanning.d.ts +85 -0
  152. package/dist/internal/c4/scanning.d.ts.map +1 -0
  153. package/dist/internal/c4/scanning.js +180 -0
  154. package/dist/internal/c4/scanning.js.map +1 -0
  155. package/dist/internal/c4/starbase.d.ts +186 -0
  156. package/dist/internal/c4/starbase.d.ts.map +1 -0
  157. package/dist/internal/c4/starbase.js +259 -0
  158. package/dist/internal/c4/starbase.js.map +1 -0
  159. package/dist/internal/c4/world.d.ts +294 -0
  160. package/dist/internal/c4/world.d.ts.map +1 -0
  161. package/dist/internal/c4/world.js +417 -0
  162. package/dist/internal/c4/world.js.map +1 -0
  163. package/dist/internal/cargo.d.ts +65 -0
  164. package/dist/internal/cargo.d.ts.map +1 -0
  165. package/dist/internal/cargo.js +46 -0
  166. package/dist/internal/cargo.js.map +1 -0
  167. package/dist/internal/claim-stake.d.ts +31 -0
  168. package/dist/internal/claim-stake.d.ts.map +1 -0
  169. package/dist/internal/claim-stake.js +20 -0
  170. package/dist/internal/claim-stake.js.map +1 -0
  171. package/dist/internal/fleet.d.ts +165 -0
  172. package/dist/internal/fleet.d.ts.map +1 -0
  173. package/dist/internal/fleet.js +179 -0
  174. package/dist/internal/fleet.js.map +1 -0
  175. package/dist/internal/game-context.d.ts +4 -0
  176. package/dist/internal/game-context.d.ts.map +1 -0
  177. package/dist/internal/game-context.js +9 -0
  178. package/dist/internal/game-context.js.map +1 -0
  179. package/dist/internal/immutable-tree.d.ts +5 -0
  180. package/dist/internal/immutable-tree.d.ts.map +1 -0
  181. package/dist/internal/immutable-tree.js +47 -0
  182. package/dist/internal/immutable-tree.js.map +1 -0
  183. package/dist/internal/json.d.ts +7 -0
  184. package/dist/internal/json.d.ts.map +1 -0
  185. package/dist/internal/json.js +33 -0
  186. package/dist/internal/json.js.map +1 -0
  187. package/dist/internal/planning/authorization-adapter.d.ts +63 -0
  188. package/dist/internal/planning/authorization-adapter.d.ts.map +1 -0
  189. package/dist/internal/planning/authorization-adapter.js +222 -0
  190. package/dist/internal/planning/authorization-adapter.js.map +1 -0
  191. package/dist/internal/read-meta.d.ts +84 -0
  192. package/dist/internal/read-meta.d.ts.map +1 -0
  193. package/dist/internal/read-meta.js +28 -0
  194. package/dist/internal/read-meta.js.map +1 -0
  195. package/dist/internal/resolved-snapshot.d.ts +3 -0
  196. package/dist/internal/resolved-snapshot.d.ts.map +1 -0
  197. package/dist/internal/resolved-snapshot.js +11 -0
  198. package/dist/internal/resolved-snapshot.js.map +1 -0
  199. package/dist/internal/zink/provider.d.ts +9 -0
  200. package/dist/internal/zink/provider.d.ts.map +1 -0
  201. package/dist/internal/zink/provider.js +213 -0
  202. package/dist/internal/zink/provider.js.map +1 -0
  203. package/dist/loyalty/index.d.ts +195 -0
  204. package/dist/loyalty/index.d.ts.map +1 -0
  205. package/dist/loyalty/index.js +289 -0
  206. package/dist/loyalty/index.js.map +1 -0
  207. package/dist/markets/index.d.ts +195 -0
  208. package/dist/markets/index.d.ts.map +1 -0
  209. package/dist/markets/index.js +232 -0
  210. package/dist/markets/index.js.map +1 -0
  211. package/dist/mining/index.d.ts +156 -0
  212. package/dist/mining/index.d.ts.map +1 -0
  213. package/dist/mining/index.js +236 -0
  214. package/dist/mining/index.js.map +1 -0
  215. package/dist/planning/assembly.d.ts +42 -0
  216. package/dist/planning/assembly.d.ts.map +1 -0
  217. package/dist/planning/assembly.js +141 -0
  218. package/dist/planning/assembly.js.map +1 -0
  219. package/dist/planning/composition.d.ts +4 -0
  220. package/dist/planning/composition.d.ts.map +1 -0
  221. package/dist/planning/composition.js +76 -0
  222. package/dist/planning/composition.js.map +1 -0
  223. package/dist/planning/execution.d.ts +93 -0
  224. package/dist/planning/execution.d.ts.map +1 -0
  225. package/dist/planning/execution.js +549 -0
  226. package/dist/planning/execution.js.map +1 -0
  227. package/dist/planning/index.d.ts +219 -0
  228. package/dist/planning/index.d.ts.map +1 -0
  229. package/dist/planning/index.js +375 -0
  230. package/dist/planning/index.js.map +1 -0
  231. package/dist/planning/plan-instances.d.ts +3 -0
  232. package/dist/planning/plan-instances.d.ts.map +1 -0
  233. package/dist/planning/plan-instances.js +8 -0
  234. package/dist/planning/plan-instances.js.map +1 -0
  235. package/dist/planning/plan-sequence-checkpoint.d.ts +154 -0
  236. package/dist/planning/plan-sequence-checkpoint.d.ts.map +1 -0
  237. package/dist/planning/plan-sequence-checkpoint.js +449 -0
  238. package/dist/planning/plan-sequence-checkpoint.js.map +1 -0
  239. package/dist/planning/plan-sequence-execution.d.ts +72 -0
  240. package/dist/planning/plan-sequence-execution.d.ts.map +1 -0
  241. package/dist/planning/plan-sequence-execution.js +410 -0
  242. package/dist/planning/plan-sequence-execution.js.map +1 -0
  243. package/dist/planning/plan-sequence.d.ts +244 -0
  244. package/dist/planning/plan-sequence.d.ts.map +1 -0
  245. package/dist/planning/plan-sequence.js +264 -0
  246. package/dist/planning/plan-sequence.js.map +1 -0
  247. package/dist/planning/simulation.d.ts +50 -0
  248. package/dist/planning/simulation.d.ts.map +1 -0
  249. package/dist/planning/simulation.js +69 -0
  250. package/dist/planning/simulation.js.map +1 -0
  251. package/dist/registry/combat.d.ts +5 -0
  252. package/dist/registry/combat.d.ts.map +1 -0
  253. package/dist/registry/combat.js +7 -0
  254. package/dist/registry/combat.js.map +1 -0
  255. package/dist/registry/index.d.ts +138 -0
  256. package/dist/registry/index.d.ts.map +1 -0
  257. package/dist/registry/index.js +397 -0
  258. package/dist/registry/index.js.map +1 -0
  259. package/dist/rewards/index.d.ts +202 -0
  260. package/dist/rewards/index.d.ts.map +1 -0
  261. package/dist/rewards/index.js +290 -0
  262. package/dist/rewards/index.js.map +1 -0
  263. package/dist/scanning/index.d.ts +185 -0
  264. package/dist/scanning/index.d.ts.map +1 -0
  265. package/dist/scanning/index.js +207 -0
  266. package/dist/scanning/index.js.map +1 -0
  267. package/dist/starbases/actions/index.d.ts +60 -0
  268. package/dist/starbases/actions/index.d.ts.map +1 -0
  269. package/dist/starbases/actions/index.js +245 -0
  270. package/dist/starbases/actions/index.js.map +1 -0
  271. package/dist/starbases/index.d.ts +165 -0
  272. package/dist/starbases/index.d.ts.map +1 -0
  273. package/dist/starbases/index.js +213 -0
  274. package/dist/starbases/index.js.map +1 -0
  275. package/dist/world/index.d.ts +180 -0
  276. package/dist/world/index.d.ts.map +1 -0
  277. package/dist/world/index.js +265 -0
  278. package/dist/world/index.js.map +1 -0
  279. package/package.json +140 -0
@@ -0,0 +1,305 @@
1
+ import { ATLAS_REWARD_CONFIG_DISCRIMINATOR, ATLAS_REWARD_REGISTRY_DISCRIMINATOR, ATLAS_REWARD_TREASURY_DISCRIMINATOR, LOOT_DISCRIMINATOR, SAGE_PROGRAM_ADDRESS, getAtlasRewardConfigDecoder, getAtlasRewardRegistryDecoder, getAtlasRewardTreasuryDecoder, getLootDecoder, } from '@staratlas/dev-sage';
2
+ import { getAddressEncoder, getBytesEncoder, getProgramDerivedAddress, } from '@solana/kit';
3
+ import { AccountDecodeError, InvalidAccountOwnerError, InvalidDiscriminatorError, MissingGameContextError, } from '../../client/errors.js';
4
+ import { deriveAtlasRewardConfigAddress } from './pda.js';
5
+ import { assertLootLayout, LOOT_FILTER_OFFSETS, LOOT_MINIMUM_DATA_LENGTH, } from './loot-layout.js';
6
+ const REGISTRY_DATA_LENGTH = 126;
7
+ const CONFIG_DATA_LENGTH = 1_610;
8
+ const TREASURY_MINIMUM_DATA_LENGTH = 46;
9
+ const NO_PENDING_CONFIG_VERSION = 0xffff_ffff;
10
+ const REGISTRY_DISCRIMINATOR = Object.freeze(Array.from(ATLAS_REWARD_REGISTRY_DISCRIMINATOR));
11
+ const CONFIG_DISCRIMINATOR = Object.freeze(Array.from(ATLAS_REWARD_CONFIG_DISCRIMINATOR));
12
+ const TREASURY_DISCRIMINATOR = Object.freeze(Array.from(ATLAS_REWARD_TREASURY_DISCRIMINATOR));
13
+ const REWARD_LOOT_DISCRIMINATOR = Object.freeze(Array.from(LOOT_DISCRIMINATOR));
14
+ export { LOOT_FILTER_OFFSETS as REWARD_LOOT_FILTER_OFFSETS } from './loot-layout.js';
15
+ /** Audited read and deferred-action relationships for ATLAS rewards. */
16
+ export const REWARD_RELATIONSHIPS = Object.freeze([
17
+ {
18
+ from: 'game | game + config version',
19
+ kind: 'derived',
20
+ mechanism: 'AtlasRewardRegistry, AtlasRewardConfig, and AtlasRewardTreasury PDA seeds',
21
+ to: 'reward registry | config | treasury',
22
+ },
23
+ {
24
+ from: 'registry | loot',
25
+ kind: 'stored',
26
+ mechanism: 'registry config/epoch selectors and Loot reward commitment fields',
27
+ to: 'config | epoch | reward commitment',
28
+ },
29
+ {
30
+ from: 'config | treasury | loot',
31
+ kind: 'nested',
32
+ mechanism: 'reward rates, curves, cargo reserves, and commitment legs',
33
+ to: 'reward values',
34
+ },
35
+ {
36
+ from: 'rewards',
37
+ kind: 'instruction-only',
38
+ mechanism: 'funding, advancement, settlement, and sweeping co-accounts are not durable relations',
39
+ to: 'actions',
40
+ },
41
+ {
42
+ from: 'profile',
43
+ kind: 'discovered',
44
+ mechanism: 'validated Loot discovery exposes only reward-bearing Loot references',
45
+ to: 'loot[]',
46
+ },
47
+ ]);
48
+ function hasDiscriminator(data, discriminator) {
49
+ return discriminator.every((byte, index) => data[index] === byte);
50
+ }
51
+ function validate(account, type, discriminator, minimumLength, exact) {
52
+ if (account.owner !== SAGE_PROGRAM_ADDRESS) {
53
+ throw new InvalidAccountOwnerError(type, account.address, SAGE_PROGRAM_ADDRESS, account.owner);
54
+ }
55
+ if (account.data.length < discriminator.length ||
56
+ !hasDiscriminator(account.data, discriminator)) {
57
+ throw new InvalidDiscriminatorError(type, account.address);
58
+ }
59
+ if ((exact && account.data.length !== minimumLength) ||
60
+ (!exact && account.data.length < minimumLength)) {
61
+ throw new AccountDecodeError(type, account.address, new RangeError(`Expected ${exact ? 'exactly' : 'at least'} ${minimumLength} account bytes, received ${account.data.length}.`));
62
+ }
63
+ }
64
+ function decodeExactly(account, type, read) {
65
+ try {
66
+ const [decoded, offset] = read(account.data, 0);
67
+ if (offset !== account.data.length) {
68
+ throw new RangeError(`Decoded ${offset} of ${account.data.length} account bytes.`);
69
+ }
70
+ return decoded;
71
+ }
72
+ catch (cause) {
73
+ throw new AccountDecodeError(type, account.address, cause);
74
+ }
75
+ }
76
+ function translateRegistry(value) {
77
+ const noPending = value.pendingConfigVersion === NO_PENDING_CONFIG_VERSION;
78
+ if (noPending !== (value.pendingEffectiveEpoch === 0n)) {
79
+ throw new RangeError('AtlasRewardRegistry pending config sentinel is inconsistent.');
80
+ }
81
+ return {
82
+ activeConfigVersion: value.activeConfigVersion,
83
+ bump: value.bump,
84
+ currentEpoch: value.currentEpoch,
85
+ currentEpochEndsAtUnixSeconds: value.currentEpochEndsAt,
86
+ currentEpochStartedAtUnixSeconds: value.currentEpochStartedAt,
87
+ game: value.gameId,
88
+ initialEpochOffsetSeconds: value.initialEpochOffsetSecs,
89
+ latestConfigVersion: value.latestConfigVersion,
90
+ pendingConfig: noPending
91
+ ? { kind: 'none' }
92
+ : {
93
+ configVersion: value.pendingConfigVersion,
94
+ effectiveEpoch: value.pendingEffectiveEpoch,
95
+ kind: 'pending',
96
+ },
97
+ version: value.version,
98
+ };
99
+ }
100
+ function translateConfig(value) {
101
+ if (value.enabled !== 0 && value.enabled !== 1) {
102
+ throw new RangeError(`Unsupported AtlasRewardConfig enabled flag ${value.enabled}.`);
103
+ }
104
+ if (value.upgradeLpRateCount > value.upgradeLpRates.length ||
105
+ value.salvageEntryCount > value.salvageEntries.length) {
106
+ throw new RangeError('AtlasRewardConfig authored entry counts exceed fixed storage.');
107
+ }
108
+ return {
109
+ activeMedallion: {
110
+ buyerPriceAtlasRaw: value.activeMedallion.buyerPrice,
111
+ cargoId: value.activeMedallion.cargoId,
112
+ generation: value.activeMedallion.generation,
113
+ },
114
+ atlasBankInactivityExpirySeconds: value.atlasBankInactivityExpirySecs,
115
+ bump: value.bump,
116
+ claimSettlementWindowSeconds: value.claimSettlementWindowSecs,
117
+ configVersion: value.configVersion,
118
+ createdAtUnixSeconds: value.createdAt,
119
+ effectiveEpoch: value.effectiveEpoch,
120
+ enabled: value.enabled === 1,
121
+ epochLengthSeconds: value.epochLenSecs,
122
+ factionPoolLeverRaw: value.factionPoolLever,
123
+ game: value.gameId,
124
+ kingSystemCurveRaw: value.kingSystemCurve.map((row) => [...row]),
125
+ lossModelTargetBps: [...value.lossModelTargetBps],
126
+ medallionBuybackCapPerEpochRaw: value.medallionBuybackCapPerEpoch,
127
+ pveLpRateBps: value.pveLpRateBps,
128
+ pvpMedallionRateBps: value.pvpMedallionRateBps,
129
+ repairKitLpRateRaw: value.repairKitLpRate,
130
+ rewardLootReclaimSeconds: value.rewardLootReclaimSecs,
131
+ rewardReserveLowBalanceThresholdRaw: value.rewardReserveLowBalanceThreshold,
132
+ salvageEntries: value.salvageEntries
133
+ .slice(0, value.salvageEntryCount)
134
+ .map((entry) => ({
135
+ cargoId: entry.cargoId,
136
+ referenceValueAtlasRaw: entry.referenceValue,
137
+ weight: entry.weight,
138
+ })),
139
+ salvageEvRateBps: value.salvageEvRateBps,
140
+ sourceFlags: value.sourceFlags,
141
+ starbaseDestructionMedallionsRaw: [...value.starbaseDestructionMedallions],
142
+ upgradeLpRates: value.upgradeLpRates
143
+ .slice(0, value.upgradeLpRateCount)
144
+ .map((entry) => ({
145
+ cargoId: entry.cargoId,
146
+ lpPerRawUnit: entry.lpPerRawUnit,
147
+ })),
148
+ version: value.version,
149
+ };
150
+ }
151
+ function translateTreasury(value) {
152
+ return {
153
+ bump: value.bump,
154
+ game: value.gameId,
155
+ reserves: [...value.reserves].map(([cargoId, quantityRaw]) => ({
156
+ cargoId,
157
+ quantityRaw,
158
+ })),
159
+ version: value.version,
160
+ };
161
+ }
162
+ export const atlasRewardRegistryAccountDefinition = Object.freeze({
163
+ decode(account) {
164
+ validate(account, 'atlasRewardRegistry', REGISTRY_DISCRIMINATOR, REGISTRY_DATA_LENGTH, true);
165
+ const decoded = decodeExactly(account, 'atlasRewardRegistry', (bytes, offset) => getAtlasRewardRegistryDecoder().read(bytes, offset));
166
+ try {
167
+ return translateRegistry(decoded);
168
+ }
169
+ catch (cause) {
170
+ throw new AccountDecodeError('atlasRewardRegistry', account.address, cause);
171
+ }
172
+ },
173
+ discriminator: REGISTRY_DISCRIMINATOR,
174
+ minimumDataLength: REGISTRY_DATA_LENGTH,
175
+ programAddress: SAGE_PROGRAM_ADDRESS,
176
+ type: 'atlasRewardRegistry',
177
+ validate(account) {
178
+ validate(account, 'atlasRewardRegistry', REGISTRY_DISCRIMINATOR, REGISTRY_DATA_LENGTH, true);
179
+ },
180
+ });
181
+ export const atlasRewardConfigAccountDefinition = Object.freeze({
182
+ decode(account) {
183
+ validate(account, 'atlasRewardConfig', CONFIG_DISCRIMINATOR, CONFIG_DATA_LENGTH, true);
184
+ const decoded = decodeExactly(account, 'atlasRewardConfig', (bytes, offset) => getAtlasRewardConfigDecoder().read(bytes, offset));
185
+ try {
186
+ return translateConfig(decoded);
187
+ }
188
+ catch (cause) {
189
+ throw new AccountDecodeError('atlasRewardConfig', account.address, cause);
190
+ }
191
+ },
192
+ discriminator: CONFIG_DISCRIMINATOR,
193
+ minimumDataLength: CONFIG_DATA_LENGTH,
194
+ programAddress: SAGE_PROGRAM_ADDRESS,
195
+ type: 'atlasRewardConfig',
196
+ validate(account) {
197
+ validate(account, 'atlasRewardConfig', CONFIG_DISCRIMINATOR, CONFIG_DATA_LENGTH, true);
198
+ },
199
+ });
200
+ export const atlasRewardTreasuryAccountDefinition = Object.freeze({
201
+ decode(account) {
202
+ validate(account, 'atlasRewardTreasury', TREASURY_DISCRIMINATOR, TREASURY_MINIMUM_DATA_LENGTH, false);
203
+ return translateTreasury(decodeExactly(account, 'atlasRewardTreasury', (bytes, offset) => getAtlasRewardTreasuryDecoder().read(bytes, offset)));
204
+ },
205
+ discriminator: TREASURY_DISCRIMINATOR,
206
+ minimumDataLength: TREASURY_MINIMUM_DATA_LENGTH,
207
+ programAddress: SAGE_PROGRAM_ADDRESS,
208
+ type: 'atlasRewardTreasury',
209
+ validate(account) {
210
+ validate(account, 'atlasRewardTreasury', TREASURY_DISCRIMINATOR, TREASURY_MINIMUM_DATA_LENGTH, false);
211
+ },
212
+ });
213
+ function translateRewardLoot(account, value) {
214
+ assertLootLayout(account, value);
215
+ const reward = value.rewardStatus === 0
216
+ ? { kind: 'none' }
217
+ : {
218
+ committedAtUnixSeconds: value.rewardCommittedAt,
219
+ configVersion: value.rewardConfigVersion,
220
+ ...(value.rewardStatus === 1
221
+ ? { kind: 'committed' }
222
+ : value.rewardStatus === 2
223
+ ? { kind: 'resolved' }
224
+ : { kind: 'unknown', rawStatus: value.rewardStatus }),
225
+ legs: value.rewardLegs.slice(0, value.rewardLegCount).map((leg) => ({
226
+ medallionsRaw: leg.medallions,
227
+ recipient: leg.recipient,
228
+ salvageTargetValueAtlasRaw: leg.salvageTargetValue,
229
+ })),
230
+ slot: value.rewardCommitSlot,
231
+ };
232
+ return {
233
+ game: value.gameId,
234
+ profile: value.profile,
235
+ reward,
236
+ version: value.version,
237
+ };
238
+ }
239
+ export const rewardLootAccountDefinition = Object.freeze({
240
+ decode(account) {
241
+ validate(account, 'loot', REWARD_LOOT_DISCRIMINATOR, LOOT_MINIMUM_DATA_LENGTH, false);
242
+ return translateRewardLoot(account, decodeExactly(account, 'loot', (bytes, offset) => getLootDecoder().read(bytes, offset)));
243
+ },
244
+ discriminator: REWARD_LOOT_DISCRIMINATOR,
245
+ minimumDataLength: LOOT_MINIMUM_DATA_LENGTH,
246
+ programAddress: SAGE_PROGRAM_ADDRESS,
247
+ type: 'loot',
248
+ validate(account) {
249
+ validate(account, 'loot', REWARD_LOOT_DISCRIMINATOR, LOOT_MINIMUM_DATA_LENGTH, false);
250
+ },
251
+ });
252
+ export function buildRewardLootDiscoveryFilters(game, profile) {
253
+ return Object.freeze([
254
+ {
255
+ bytes: new Uint8Array(LOOT_DISCRIMINATOR),
256
+ offset: LOOT_FILTER_OFFSETS.discriminator,
257
+ },
258
+ {
259
+ bytes: new Uint8Array(getAddressEncoder().encode(game)),
260
+ offset: LOOT_FILTER_OFFSETS.game,
261
+ },
262
+ {
263
+ bytes: new Uint8Array(getAddressEncoder().encode(profile)),
264
+ offset: LOOT_FILTER_OFFSETS.profile,
265
+ },
266
+ ]);
267
+ }
268
+ export async function discoverRewardLootAccounts(context, profile, options = {}) {
269
+ const game = context.game;
270
+ if (game === undefined)
271
+ throw new MissingGameContextError();
272
+ const candidates = await context.data.discover(rewardLootAccountDefinition, {
273
+ ...options,
274
+ filters: buildRewardLootDiscoveryFilters(game, profile),
275
+ strategy: 'targeted-program-accounts',
276
+ });
277
+ for (const candidate of candidates) {
278
+ if (candidate.data.game !== game || candidate.data.profile !== profile) {
279
+ throw new AccountDecodeError('loot', candidate.address, new RangeError('Decoded Loot fields contradicted reward discovery filters.'), `Loot ${candidate.address} does not belong to the requested Game ${game} and Profile ${profile}. Refresh discovery and verify the configured Game and Profile before retrying.`);
280
+ }
281
+ }
282
+ return candidates;
283
+ }
284
+ export async function deriveAtlasRewardRegistryAddress(game) {
285
+ const [address] = await getProgramDerivedAddress({
286
+ programAddress: SAGE_PROGRAM_ADDRESS,
287
+ seeds: [
288
+ getBytesEncoder().encode(new TextEncoder().encode('AtlasRewardRegistry')),
289
+ getAddressEncoder().encode(game),
290
+ ],
291
+ });
292
+ return address;
293
+ }
294
+ export { deriveAtlasRewardConfigAddress };
295
+ export async function deriveAtlasRewardTreasuryAddress(game) {
296
+ const [address] = await getProgramDerivedAddress({
297
+ programAddress: SAGE_PROGRAM_ADDRESS,
298
+ seeds: [
299
+ getBytesEncoder().encode(new TextEncoder().encode('AtlasRewardTreasury')),
300
+ getAddressEncoder().encode(game),
301
+ ],
302
+ });
303
+ return address;
304
+ }
305
+ //# sourceMappingURL=rewards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewards.js","sourceRoot":"","sources":["../../../src/internal/c4/rewards.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,mCAAmC,EACnC,mCAAmC,EACnC,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC3B,6BAA6B,EAC7B,6BAA6B,EAC7B,cAAc,GAKf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAUrB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,8BAA8B,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AACxC,MAAM,yBAAyB,GAAG,WAAW,CAAC;AAE9C,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAC1C,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAChD,CAAC;AACF,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CACxC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAC9C,CAAC;AACF,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAC1C,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAChD,CAAC;AACF,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAEhF,OAAO,EAAE,mBAAmB,IAAI,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAErF,wEAAwE;AACxE,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC;IAChD;QACE,IAAI,EAAE,8BAA8B;QACpC,IAAI,EAAE,SAAS;QACf,SAAS,EACP,2EAA2E;QAC7E,EAAE,EAAE,qCAAqC;KAC1C;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,QAAQ;QACd,SAAS,EACP,mEAAmE;QACrE,EAAE,EAAE,oCAAoC;KACzC;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,2DAA2D;QACtE,EAAE,EAAE,eAAe;KACpB;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,kBAAkB;QACxB,SAAS,EACP,sFAAsF;QACxF,EAAE,EAAE,SAAS;KACd;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,YAAY;QAClB,SAAS,EACP,sEAAsE;QACxE,EAAE,EAAE,QAAQ;KACb;CACO,CAAC,CAAC;AAqGZ,SAAS,gBAAgB,CAAC,IAAgB,EAAE,aAAgC;IAC1E,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,QAAQ,CACf,OAAmB,EACnB,IAIU,EACV,aAAgC,EAChC,aAAqB,EACrB,KAAc;IAEd,IAAI,OAAO,CAAC,KAAK,KAAK,oBAAoB,EAAE,CAAC;QAC3C,MAAM,IAAI,wBAAwB,CAChC,IAAI,EACJ,OAAO,CAAC,OAAO,EACf,oBAAoB,EACpB,OAAO,CAAC,KAAK,CACd,CAAC;IACJ,CAAC;IACD,IACE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;QAC1C,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,EAC9C,CAAC;QACD,MAAM,IAAI,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IACD,IACE,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC;QAChD,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,EAC/C,CAAC;QACD,MAAM,IAAI,kBAAkB,CAC1B,IAAI,EACJ,OAAO,CAAC,OAAO,EACf,IAAI,UAAU,CACZ,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,IAAI,aAAa,4BAA4B,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAC9G,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,OAAmB,EACnB,IAIU,EACV,IAAiE;IAEjE,IAAI,CAAC;QACH,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,UAAU,CAClB,WAAW,MAAM,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAC7D,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,KAA0B;IAE1B,MAAM,SAAS,GAAG,KAAK,CAAC,oBAAoB,KAAK,yBAAyB,CAAC;IAC3E,IAAI,SAAS,KAAK,CAAC,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,UAAU,CAClB,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,6BAA6B,EAAE,KAAK,CAAC,kBAAkB;QACvD,gCAAgC,EAAE,KAAK,CAAC,qBAAqB;QAC7D,IAAI,EAAE,KAAK,CAAC,MAAM;QAClB,yBAAyB,EAAE,KAAK,CAAC,sBAAsB;QACvD,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,aAAa,EAAE,SAAS;YACtB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;YAClB,CAAC,CAAC;gBACE,aAAa,EAAE,KAAK,CAAC,oBAAoB;gBACzC,cAAc,EAAE,KAAK,CAAC,qBAAqB;gBAC3C,IAAI,EAAE,SAAS;aAChB;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,KAAwB;IAExB,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,UAAU,CAClB,8CAA8C,KAAK,CAAC,OAAO,GAAG,CAC/D,CAAC;IACJ,CAAC;IACD,IACE,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM;QACtD,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,EACrD,CAAC;QACD,MAAM,IAAI,UAAU,CAClB,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO;QACL,eAAe,EAAE;YACf,kBAAkB,EAAE,KAAK,CAAC,eAAe,CAAC,UAAU;YACpD,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,OAAO;YACtC,UAAU,EAAE,KAAK,CAAC,eAAe,CAAC,UAAU;SAC7C;QACD,gCAAgC,EAAE,KAAK,CAAC,6BAA6B;QACrE,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,4BAA4B,EAAE,KAAK,CAAC,yBAAyB;QAC7D,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,oBAAoB,EAAE,KAAK,CAAC,SAAS;QACrC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,CAAC;QAC5B,kBAAkB,EAAE,KAAK,CAAC,YAAY;QACtC,mBAAmB,EAAE,KAAK,CAAC,gBAAgB;QAC3C,IAAI,EAAE,KAAK,CAAC,MAAM;QAClB,kBAAkB,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAChE,kBAAkB,EAAE,CAAC,GAAG,KAAK,CAAC,kBAAkB,CAAC;QACjD,8BAA8B,EAAE,KAAK,CAAC,2BAA2B;QACjE,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,kBAAkB,EAAE,KAAK,CAAC,eAAe;QACzC,wBAAwB,EAAE,KAAK,CAAC,qBAAqB;QACrD,mCAAmC,EAAE,KAAK,CAAC,gCAAgC;QAC3E,cAAc,EAAE,KAAK,CAAC,cAAc;aACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;aACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,sBAAsB,EAAE,KAAK,CAAC,cAAc;YAC5C,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;QACL,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,gCAAgC,EAAE,CAAC,GAAG,KAAK,CAAC,6BAA6B,CAAC;QAC1E,cAAc,EAAE,KAAK,CAAC,cAAc;aACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC;aAClC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,YAAY;SACjC,CAAC,CAAC;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,KAA0B;IAE1B,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,MAAM;QAClB,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7D,OAAO;YACP,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,oCAAoC,GAC/C,MAAM,CAAC,MAAM,CAAC;IACZ,MAAM,CAAC,OAAmB;QACxB,QAAQ,CACN,OAAO,EACP,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,IAAI,CACL,CAAC;QACF,MAAM,OAAO,GAAG,aAAa,CAC3B,OAAO,EACP,qBAAqB,EACrB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,6BAA6B,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CACvE,CAAC;QACF,IAAI,CAAC;YACH,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,kBAAkB,CAC1B,qBAAqB,EACrB,OAAO,CAAC,OAAO,EACf,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IACD,aAAa,EAAE,sBAAsB;IACrC,iBAAiB,EAAE,oBAAoB;IACvC,cAAc,EAAE,oBAAoB;IACpC,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,CAAC,OAAmB;QAC1B,QAAQ,CACN,OAAO,EACP,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,IAAI,CACL,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,kCAAkC,GAC7C,MAAM,CAAC,MAAM,CAAC;IACZ,MAAM,CAAC,OAAmB;QACxB,QAAQ,CACN,OAAO,EACP,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,IAAI,CACL,CAAC;QACF,MAAM,OAAO,GAAG,aAAa,CAC3B,OAAO,EACP,mBAAmB,EACnB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,2BAA2B,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CACrE,CAAC;QACF,IAAI,CAAC;YACH,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,kBAAkB,CAC1B,mBAAmB,EACnB,OAAO,CAAC,OAAO,EACf,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IACD,aAAa,EAAE,oBAAoB;IACnC,iBAAiB,EAAE,kBAAkB;IACrC,cAAc,EAAE,oBAAoB;IACpC,IAAI,EAAE,mBAAmB;IACzB,QAAQ,CAAC,OAAmB;QAC1B,QAAQ,CACN,OAAO,EACP,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,IAAI,CACL,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,oCAAoC,GAC/C,MAAM,CAAC,MAAM,CAAC;IACZ,MAAM,CAAC,OAAmB;QACxB,QAAQ,CACN,OAAO,EACP,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,KAAK,CACN,CAAC;QACF,OAAO,iBAAiB,CACtB,aAAa,CAAC,OAAO,EAAE,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAC9D,6BAA6B,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CACpD,CACF,CAAC;IACJ,CAAC;IACD,aAAa,EAAE,sBAAsB;IACrC,iBAAiB,EAAE,4BAA4B;IAC/C,cAAc,EAAE,oBAAoB;IACpC,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,CAAC,OAAmB;QAC1B,QAAQ,CACN,OAAO,EACP,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,KAAK,CACN,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEL,SAAS,mBAAmB,CAC1B,OAAmB,EACnB,KAAW;IAEX,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjC,MAAM,MAAM,GACV,KAAK,CAAC,YAAY,KAAK,CAAC;QACtB,CAAC,CAAE,EAAE,IAAI,EAAE,MAAM,EAAY;QAC7B,CAAC,CAAC;YACE,sBAAsB,EAAE,KAAK,CAAC,iBAAiB;YAC/C,aAAa,EAAE,KAAK,CAAC,mBAAmB;YACxC,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC;gBAC1B,CAAC,CAAC,EAAE,IAAI,EAAE,WAAoB,EAAE;gBAChC,CAAC,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC;oBACxB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE;oBAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,SAAkB,EAAE,SAAS,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;YAClE,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAClE,aAAa,EAAE,GAAG,CAAC,UAAU;gBAC7B,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,0BAA0B,EAAE,GAAG,CAAC,kBAAkB;aACnD,CAAC,CAAC;YACH,IAAI,EAAE,KAAK,CAAC,gBAAgB;SAC7B,CAAC;IACR,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,MAAM;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM;QACN,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GACtC,MAAM,CAAC,MAAM,CAAC;IACZ,MAAM,CAAC,OAAmB;QACxB,QAAQ,CACN,OAAO,EACP,MAAM,EACN,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,CACN,CAAC;QACF,OAAO,mBAAmB,CACxB,OAAO,EACP,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAC/C,cAAc,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CACrC,CACF,CAAC;IACJ,CAAC;IACD,aAAa,EAAE,yBAAyB;IACxC,iBAAiB,EAAE,wBAAwB;IAC3C,cAAc,EAAE,oBAAoB;IACpC,IAAI,EAAE,MAAM;IACZ,QAAQ,CAAC,OAAmB;QAC1B,QAAQ,CACN,OAAO,EACP,MAAM,EACN,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,CACN,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEL,MAAM,UAAU,+BAA+B,CAC7C,IAAa,EACb,OAAgB;IAEhB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB;YACE,KAAK,EAAE,IAAI,UAAU,CAAC,kBAAkB,CAAC;YACzC,MAAM,EAAE,mBAAmB,CAAC,aAAa;SAC1C;QACD;YACE,KAAK,EAAE,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,EAAE,mBAAmB,CAAC,IAAI;SACjC;QACD;YACE,KAAK,EAAE,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,EAAE,mBAAmB,CAAC,OAAO;SACpC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAoB,EACpB,OAAgB,EAChB,UAA0D,EAAE;IAE5D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,2BAA2B,EAAE;QAC1E,GAAG,OAAO;QACV,OAAO,EAAE,+BAA+B,CAAC,IAAI,EAAE,OAAO,CAAC;QACvD,QAAQ,EAAE,2BAA2B;KACtC,CAAC,CAAC;IACH,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACvE,MAAM,IAAI,kBAAkB,CAC1B,MAAM,EACN,SAAS,CAAC,OAAO,EACjB,IAAI,UAAU,CACZ,4DAA4D,CAC7D,EACD,QAAQ,SAAS,CAAC,OAAO,0CAA0C,IAAI,gBAAgB,OAAO,iFAAiF,CAChL,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,IAAa;IAEb,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,wBAAwB,CAAC;QAC/C,cAAc,EAAE,oBAAoB;QACpC,KAAK,EAAE;YACL,eAAe,EAAE,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACzE,iBAAiB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;SACjC;KACF,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,8BAA8B,EAAE,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,IAAa;IAEb,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,wBAAwB,CAAC;QAC/C,cAAc,EAAE,oBAAoB;QACpC,KAAK,EAAE;YACL,eAAe,EAAE,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACzE,iBAAiB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;SACjC;KACF,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,85 @@
1
+ import type { Address, DiscoveryRequest, ProgramAccountFilter, SageContext, SnapshotEnvelope } from '../../client/contracts.js';
2
+ import type { C4AccountAdapter } from './adapter.js';
3
+ /** Stable ScanPattern offsets verified against the pinned generated codec. */
4
+ export declare const SCAN_PATTERN_FILTER_OFFSETS: Readonly<{
5
+ discriminator: 0;
6
+ game: 76;
7
+ }>;
8
+ /** Audited read and deferred-action relationships for scanning. */
9
+ export declare const SCANNING_RELATIONSHIPS: readonly [{
10
+ readonly from: "game + pattern id";
11
+ readonly kind: "derived";
12
+ readonly mechanism: "ScanPattern PDA seeds";
13
+ readonly to: "scanPattern";
14
+ }, {
15
+ readonly from: "scanPattern | fleet | character";
16
+ readonly kind: "stored";
17
+ readonly mechanism: "cargo/research ids, Fleet cooldown, and Character data-runner state";
18
+ readonly to: "cargo | research tags | scanning state";
19
+ }, {
20
+ readonly from: "scanPattern";
21
+ readonly kind: "nested";
22
+ readonly mechanism: "costs, loot outcomes, requirements, and noise maps";
23
+ readonly to: "scan configuration";
24
+ }, {
25
+ readonly from: "scanning";
26
+ readonly kind: "instruction-only";
27
+ readonly mechanism: "scan execution and cargo/crew co-accounts are not durable relations";
28
+ readonly to: "actions";
29
+ }, {
30
+ readonly from: "game";
31
+ readonly kind: "discovered";
32
+ readonly mechanism: "targeted ScanPattern discriminator and Game filters";
33
+ readonly to: "scanPattern[]";
34
+ }];
35
+ export interface ScanFixedValueData {
36
+ readonly value: number;
37
+ readonly raw: bigint;
38
+ }
39
+ export interface ScanPatternCostData {
40
+ readonly cargoId: number;
41
+ readonly multiplier: ScanFixedValueData;
42
+ }
43
+ export interface ScanPatternLootData {
44
+ readonly outputCargoId: number;
45
+ readonly outputAmountRaw: bigint;
46
+ readonly threshold: ScanFixedValueData;
47
+ readonly rollWeight: ScanFixedValueData;
48
+ readonly xpValue: ScanFixedValueData;
49
+ readonly researchRequirementTagIds: readonly number[];
50
+ }
51
+ export interface ScanNoiseMapData {
52
+ readonly noiseMapType: number;
53
+ readonly noisePowerFunction: number;
54
+ readonly xMultiplier: ScanFixedValueData;
55
+ readonly yMultiplier: ScanFixedValueData;
56
+ readonly zMultiplier: ScanFixedValueData;
57
+ readonly xCenter: ScanFixedValueData;
58
+ readonly yCenter: ScanFixedValueData;
59
+ readonly originMaxDistance: ScanFixedValueData;
60
+ readonly weight: ScanFixedValueData;
61
+ readonly seedOffset: number;
62
+ }
63
+ /** Fully translated ScanPattern account data before cargo resolution. */
64
+ export interface ScanPatternAccountData {
65
+ readonly version: number;
66
+ readonly bump: number;
67
+ readonly id: number;
68
+ readonly name: string;
69
+ readonly game: Address;
70
+ readonly cooldownMultiplier: ScanFixedValueData;
71
+ readonly blankWeight: ScanFixedValueData;
72
+ readonly blankXpValue: ScanFixedValueData;
73
+ readonly status: 'draft' | 'active';
74
+ readonly costs: readonly ScanPatternCostData[];
75
+ readonly loot: readonly ScanPatternLootData[];
76
+ readonly noiseMaps: readonly ScanNoiseMapData[];
77
+ }
78
+ export declare const scanPatternAccountDefinition: C4AccountAdapter<ScanPatternAccountData>;
79
+ /** Derives one ScanPattern address from Game and u16 pattern id. */
80
+ export declare function deriveScanPatternAddress(game: Address, patternId: number): Promise<Address>;
81
+ /** Builds stable targeted filters for the ScanPattern catalog of one Game. */
82
+ export declare function buildScanPatternDiscoveryFilters(game: Address): readonly ProgramAccountFilter[];
83
+ /** Discovers ScanPatterns by stable Game fields and revalidates every hint. */
84
+ export declare function discoverScanPatternAccounts(context: SageContext, options?: Omit<DiscoveryRequest, 'filters' | 'strategy'>): Promise<readonly SnapshotEnvelope<ScanPatternAccountData>[]>;
85
+ //# sourceMappingURL=scanning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanning.d.ts","sourceRoot":"","sources":["../../../src/internal/c4/scanning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ import { SCAN_PATTERN_DISCRIMINATOR, SAGE_PROGRAM_ADDRESS, ScanPatternStatus, getScanPatternDecoder, } from '@staratlas/dev-sage';
2
+ import { getAddressEncoder, getBytesEncoder, getProgramDerivedAddress, getU16Encoder, } from '@solana/kit';
3
+ import { AccountDecodeError, InvalidEntityIdError, InvalidAccountOwnerError, InvalidDiscriminatorError, MissingGameContextError, } from '../../client/errors.js';
4
+ const SCAN_PATTERN_MINIMUM_DATA_LENGTH = 133;
5
+ const SCAN_PATTERN_ACCOUNT_DISCRIMINATOR = Object.freeze(Array.from(SCAN_PATTERN_DISCRIMINATOR));
6
+ /** Stable ScanPattern offsets verified against the pinned generated codec. */
7
+ export const SCAN_PATTERN_FILTER_OFFSETS = Object.freeze({
8
+ discriminator: 0,
9
+ game: 76,
10
+ });
11
+ /** Audited read and deferred-action relationships for scanning. */
12
+ export const SCANNING_RELATIONSHIPS = Object.freeze([
13
+ {
14
+ from: 'game + pattern id',
15
+ kind: 'derived',
16
+ mechanism: 'ScanPattern PDA seeds',
17
+ to: 'scanPattern',
18
+ },
19
+ {
20
+ from: 'scanPattern | fleet | character',
21
+ kind: 'stored',
22
+ mechanism: 'cargo/research ids, Fleet cooldown, and Character data-runner state',
23
+ to: 'cargo | research tags | scanning state',
24
+ },
25
+ {
26
+ from: 'scanPattern',
27
+ kind: 'nested',
28
+ mechanism: 'costs, loot outcomes, requirements, and noise maps',
29
+ to: 'scan configuration',
30
+ },
31
+ {
32
+ from: 'scanning',
33
+ kind: 'instruction-only',
34
+ mechanism: 'scan execution and cargo/crew co-accounts are not durable relations',
35
+ to: 'actions',
36
+ },
37
+ {
38
+ from: 'game',
39
+ kind: 'discovered',
40
+ mechanism: 'targeted ScanPattern discriminator and Game filters',
41
+ to: 'scanPattern[]',
42
+ },
43
+ ]);
44
+ function fixed(value) {
45
+ return { raw: value.raw, value: value.toNumber() };
46
+ }
47
+ function hasDiscriminator(data, discriminator) {
48
+ return discriminator.every((byte, index) => data[index] === byte);
49
+ }
50
+ function validateScanPatternAccount(account) {
51
+ if (account.owner !== SAGE_PROGRAM_ADDRESS) {
52
+ throw new InvalidAccountOwnerError('scanPattern', account.address, SAGE_PROGRAM_ADDRESS, account.owner);
53
+ }
54
+ if (account.data.length < SCAN_PATTERN_ACCOUNT_DISCRIMINATOR.length ||
55
+ !hasDiscriminator(account.data, SCAN_PATTERN_ACCOUNT_DISCRIMINATOR)) {
56
+ throw new InvalidDiscriminatorError('scanPattern', account.address);
57
+ }
58
+ if (account.data.length < SCAN_PATTERN_MINIMUM_DATA_LENGTH) {
59
+ throw new AccountDecodeError('scanPattern', account.address, new RangeError(`Expected at least ${SCAN_PATTERN_MINIMUM_DATA_LENGTH} ScanPattern account bytes, received ${account.data.length}.`));
60
+ }
61
+ }
62
+ function decodeExactly(account) {
63
+ try {
64
+ const [decoded, offset] = getScanPatternDecoder().read(account.data, 0);
65
+ if (offset !== account.data.length) {
66
+ throw new RangeError(`Decoded ${offset} of ${account.data.length} ScanPattern account bytes; trailing bytes are not accepted.`);
67
+ }
68
+ return decoded;
69
+ }
70
+ catch (cause) {
71
+ throw new AccountDecodeError('scanPattern', account.address, cause);
72
+ }
73
+ }
74
+ function status(value) {
75
+ switch (value) {
76
+ case ScanPatternStatus.Draft:
77
+ return 'draft';
78
+ case ScanPatternStatus.Active:
79
+ return 'active';
80
+ }
81
+ }
82
+ function translateScanPattern(account, value) {
83
+ for (const entry of value.lootTable) {
84
+ if (entry.researchRequirementCount > entry.researchRequirements.length) {
85
+ throw new AccountDecodeError('scanPattern', account.address, new RangeError('ScanPattern research requirement count exceeds its fixed list.'), `ScanPattern ${account.address} contains inconsistent research requirements. Refresh the account and verify the pinned binding version before retrying.`);
86
+ }
87
+ }
88
+ return {
89
+ blankWeight: fixed(value.blankWeight),
90
+ blankXpValue: fixed(value.blankXpValue),
91
+ bump: value.bump,
92
+ cooldownMultiplier: fixed(value.cooldownMultiplier),
93
+ costs: value.cost.map((cost) => ({
94
+ cargoId: cost.cargo,
95
+ multiplier: fixed(cost.costMultiplier),
96
+ })),
97
+ game: value.gameId,
98
+ id: value.scanPatternId,
99
+ loot: value.lootTable.map((entry) => ({
100
+ outputAmountRaw: entry.outputAmount,
101
+ outputCargoId: entry.output,
102
+ researchRequirementTagIds: entry.researchRequirements.slice(0, entry.researchRequirementCount),
103
+ rollWeight: fixed(entry.rollWeight),
104
+ threshold: fixed(entry.threshold),
105
+ xpValue: fixed(entry.xpValue),
106
+ })),
107
+ name: value.name.replace(/\0/gu, '').trim(),
108
+ noiseMaps: value.noiseMaps.map((noise) => ({
109
+ noiseMapType: noise.noiseMapType,
110
+ noisePowerFunction: noise.noisePowerFunction,
111
+ originMaxDistance: fixed(noise.originMaxDistance),
112
+ seedOffset: noise.seedOffset,
113
+ weight: fixed(noise.weight),
114
+ xCenter: fixed(noise.xCenter),
115
+ xMultiplier: fixed(noise.xMultiplier),
116
+ yCenter: fixed(noise.yCenter),
117
+ yMultiplier: fixed(noise.yMultiplier),
118
+ zMultiplier: fixed(noise.zMultiplier),
119
+ })),
120
+ status: status(value.status),
121
+ version: value.version,
122
+ };
123
+ }
124
+ export const scanPatternAccountDefinition = Object.freeze({
125
+ decode(account) {
126
+ validateScanPatternAccount(account);
127
+ return translateScanPattern(account, decodeExactly(account));
128
+ },
129
+ discriminator: SCAN_PATTERN_ACCOUNT_DISCRIMINATOR,
130
+ minimumDataLength: SCAN_PATTERN_MINIMUM_DATA_LENGTH,
131
+ programAddress: SAGE_PROGRAM_ADDRESS,
132
+ type: 'scanPattern',
133
+ validate: validateScanPatternAccount,
134
+ });
135
+ /** Derives one ScanPattern address from Game and u16 pattern id. */
136
+ export async function deriveScanPatternAddress(game, patternId) {
137
+ if (!Number.isInteger(patternId) || patternId < 0 || patternId > 65_535) {
138
+ throw new InvalidEntityIdError('scanPattern', patternId);
139
+ }
140
+ const [address] = await getProgramDerivedAddress({
141
+ programAddress: SAGE_PROGRAM_ADDRESS,
142
+ seeds: [
143
+ getBytesEncoder().encode(new Uint8Array([83, 99, 97, 110, 80, 97, 116, 116, 101, 114, 110])),
144
+ getAddressEncoder().encode(game),
145
+ getU16Encoder().encode(patternId),
146
+ ],
147
+ });
148
+ return address;
149
+ }
150
+ /** Builds stable targeted filters for the ScanPattern catalog of one Game. */
151
+ export function buildScanPatternDiscoveryFilters(game) {
152
+ return Object.freeze([
153
+ {
154
+ bytes: new Uint8Array(SCAN_PATTERN_DISCRIMINATOR),
155
+ offset: SCAN_PATTERN_FILTER_OFFSETS.discriminator,
156
+ },
157
+ {
158
+ bytes: new Uint8Array(getAddressEncoder().encode(game)),
159
+ offset: SCAN_PATTERN_FILTER_OFFSETS.game,
160
+ },
161
+ ]);
162
+ }
163
+ /** Discovers ScanPatterns by stable Game fields and revalidates every hint. */
164
+ export async function discoverScanPatternAccounts(context, options = {}) {
165
+ const game = context.game;
166
+ if (game === undefined)
167
+ throw new MissingGameContextError();
168
+ const patterns = await context.data.discover(scanPatternAccountDefinition, {
169
+ ...options,
170
+ filters: buildScanPatternDiscoveryFilters(game),
171
+ strategy: 'targeted-program-accounts',
172
+ });
173
+ for (const candidate of patterns) {
174
+ if (candidate.data.game !== game) {
175
+ throw new AccountDecodeError('scanPattern', candidate.address, new RangeError('The decoded ScanPattern Game contradicted discovery filters.'), `A discovered ScanPattern candidate did not match configured Game ${game} after decoding. Verify the provider, cluster, and pinned ScanPattern filter offsets before retrying.`);
176
+ }
177
+ }
178
+ return patterns;
179
+ }
180
+ //# sourceMappingURL=scanning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanning.js","sourceRoot":"","sources":["../../../src/internal/c4/scanning.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,aAAa,GACd,MAAM,aAAa,CAAC;AAUrB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,gCAAgC,GAAG,GAAG,CAAC;AAC7C,MAAM,kCAAkC,GAAG,MAAM,CAAC,MAAM,CACtD,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CACvC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,MAAM,CAAC;IACvD,aAAa,EAAE,CAAC;IAChB,IAAI,EAAE,EAAE;CACT,CAAC,CAAC;AAEH,mEAAmE;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC;IAClD;QACE,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,uBAAuB;QAClC,EAAE,EAAE,aAAa;KAClB;IACD;QACE,IAAI,EAAE,iCAAiC;QACvC,IAAI,EAAE,QAAQ;QACd,SAAS,EACP,qEAAqE;QACvE,EAAE,EAAE,wCAAwC;KAC7C;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,oDAAoD;QAC/D,EAAE,EAAE,oBAAoB;KACzB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,kBAAkB;QACxB,SAAS,EACP,qEAAqE;QACvE,EAAE,EAAE,SAAS;KACd;IACD;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,YAAY;QAClB,SAAS,EAAE,qDAAqD;QAChE,EAAE,EAAE,eAAe;KACpB;CACO,CAAC,CAAC;AAkDZ,SAAS,KAAK,CAAC,KAAmD;IAChE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAgB,EAChB,aAAgC;IAEhC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAmB;IACrD,IAAI,OAAO,CAAC,KAAK,KAAK,oBAAoB,EAAE,CAAC;QAC3C,MAAM,IAAI,wBAAwB,CAChC,aAAa,EACb,OAAO,CAAC,OAAO,EACf,oBAAoB,EACpB,OAAO,CAAC,KAAK,CACd,CAAC;IACJ,CAAC;IACD,IACE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,kCAAkC,CAAC,MAAM;QAC/D,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,kCAAkC,CAAC,EACnE,CAAC;QACD,MAAM,IAAI,yBAAyB,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,gCAAgC,EAAE,CAAC;QAC3D,MAAM,IAAI,kBAAkB,CAC1B,aAAa,EACb,OAAO,CAAC,OAAO,EACf,IAAI,UAAU,CACZ,qBAAqB,gCAAgC,wCAAwC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CACpH,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAmB;IACxC,IAAI,CAAC;QACH,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,qBAAqB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,UAAU,CAClB,WAAW,MAAM,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,8DAA8D,CAC1G,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,kBAAkB,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,KAAwB;IACtC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,iBAAiB,CAAC,KAAK;YAC1B,OAAO,OAAO,CAAC;QACjB,KAAK,iBAAiB,CAAC,MAAM;YAC3B,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAmB,EACnB,KAAkB;IAElB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,wBAAwB,GAAG,KAAK,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;YACvE,MAAM,IAAI,kBAAkB,CAC1B,aAAa,EACb,OAAO,CAAC,OAAO,EACf,IAAI,UAAU,CACZ,gEAAgE,CACjE,EACD,eAAe,OAAO,CAAC,OAAO,0HAA0H,CACzJ,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;QACrC,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC;QACnD,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/B,OAAO,EAAE,IAAI,CAAC,KAAK;YACnB,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;SACvC,CAAC,CAAC;QACH,IAAI,EAAE,KAAK,CAAC,MAAM;QAClB,EAAE,EAAE,KAAK,CAAC,aAAa;QACvB,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpC,eAAe,EAAE,KAAK,CAAC,YAAY;YACnC,aAAa,EAAE,KAAK,CAAC,MAAM;YAC3B,yBAAyB,EAAE,KAAK,CAAC,oBAAoB,CAAC,KAAK,CACzD,CAAC,EACD,KAAK,CAAC,wBAAwB,CAC/B;YACD,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;YACjC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QACH,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;QAC3C,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC;YACjD,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YAC3B,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;YAC7B,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;YACrC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;YAC7B,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;YACrC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;SACtC,CAAC,CAAC;QACH,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GACvC,MAAM,CAAC,MAAM,CAAC;IACZ,MAAM,CAAC,OAAmB;QACxB,0BAA0B,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,oBAAoB,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,aAAa,EAAE,kCAAkC;IACjD,iBAAiB,EAAE,gCAAgC;IACnD,cAAc,EAAE,oBAAoB;IACpC,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,0BAA0B;CACrC,CAAC,CAAC;AAEL,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAa,EACb,SAAiB;IAEjB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,MAAM,EAAE,CAAC;QACxE,MAAM,IAAI,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,wBAAwB,CAAC;QAC/C,cAAc,EAAE,oBAAoB;QACpC,KAAK,EAAE;YACL,eAAe,EAAE,CAAC,MAAM,CACtB,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CACnE;YACD,iBAAiB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;YAChC,aAAa,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;SAClC;KACF,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,gCAAgC,CAC9C,IAAa;IAEb,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB;YACE,KAAK,EAAE,IAAI,UAAU,CAAC,0BAA0B,CAAC;YACjD,MAAM,EAAE,2BAA2B,CAAC,aAAa;SAClD;QACD;YACE,KAAK,EAAE,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,EAAE,2BAA2B,CAAC,IAAI;SACzC;KACF,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAoB,EACpB,UAA0D,EAAE;IAE5D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,4BAA4B,EAAE;QACzE,GAAG,OAAO;QACV,OAAO,EAAE,gCAAgC,CAAC,IAAI,CAAC;QAC/C,QAAQ,EAAE,2BAA2B;KACtC,CAAC,CAAC;IACH,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;QACjC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,kBAAkB,CAC1B,aAAa,EACb,SAAS,CAAC,OAAO,EACjB,IAAI,UAAU,CACZ,8DAA8D,CAC/D,EACD,oEAAoE,IAAI,uGAAuG,CAChL,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}