outsmart 2.0.0-alpha.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 (235) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +568 -0
  3. package/dist/cli.d.ts +44 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +1251 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/dex/byreal-clmm.d.ts +16 -0
  8. package/dist/dex/byreal-clmm.d.ts.map +1 -0
  9. package/dist/dex/byreal-clmm.js +39 -0
  10. package/dist/dex/byreal-clmm.js.map +1 -0
  11. package/dist/dex/dflow.d.ts +27 -0
  12. package/dist/dex/dflow.d.ts.map +1 -0
  13. package/dist/dex/dflow.js +200 -0
  14. package/dist/dex/dflow.js.map +1 -0
  15. package/dist/dex/fusion-amm.d.ts +44 -0
  16. package/dist/dex/fusion-amm.d.ts.map +1 -0
  17. package/dist/dex/fusion-amm.js +546 -0
  18. package/dist/dex/fusion-amm.js.map +1 -0
  19. package/dist/dex/futarchy-amm.d.ts +32 -0
  20. package/dist/dex/futarchy-amm.d.ts.map +1 -0
  21. package/dist/dex/futarchy-amm.js +443 -0
  22. package/dist/dex/futarchy-amm.js.map +1 -0
  23. package/dist/dex/futarchy-idl.d.ts +2568 -0
  24. package/dist/dex/futarchy-idl.d.ts.map +1 -0
  25. package/dist/dex/futarchy-idl.js +2570 -0
  26. package/dist/dex/futarchy-idl.js.map +1 -0
  27. package/dist/dex/futarchy-launchpad.d.ts +68 -0
  28. package/dist/dex/futarchy-launchpad.d.ts.map +1 -0
  29. package/dist/dex/futarchy-launchpad.js +377 -0
  30. package/dist/dex/futarchy-launchpad.js.map +1 -0
  31. package/dist/dex/index.d.ts +88 -0
  32. package/dist/dex/index.d.ts.map +1 -0
  33. package/dist/dex/index.js +159 -0
  34. package/dist/dex/index.js.map +1 -0
  35. package/dist/dex/jupiter-ultra.d.ts +27 -0
  36. package/dist/dex/jupiter-ultra.d.ts.map +1 -0
  37. package/dist/dex/jupiter-ultra.js +369 -0
  38. package/dist/dex/jupiter-ultra.js.map +1 -0
  39. package/dist/dex/meteora-damm-v1.d.ts +36 -0
  40. package/dist/dex/meteora-damm-v1.d.ts.map +1 -0
  41. package/dist/dex/meteora-damm-v1.js +314 -0
  42. package/dist/dex/meteora-damm-v1.js.map +1 -0
  43. package/dist/dex/meteora-damm-v2.d.ts +103 -0
  44. package/dist/dex/meteora-damm-v2.d.ts.map +1 -0
  45. package/dist/dex/meteora-damm-v2.js +1146 -0
  46. package/dist/dex/meteora-damm-v2.js.map +1 -0
  47. package/dist/dex/meteora-dbc.d.ts +38 -0
  48. package/dist/dex/meteora-dbc.d.ts.map +1 -0
  49. package/dist/dex/meteora-dbc.js +374 -0
  50. package/dist/dex/meteora-dbc.js.map +1 -0
  51. package/dist/dex/meteora-dlmm.d.ts +79 -0
  52. package/dist/dex/meteora-dlmm.d.ts.map +1 -0
  53. package/dist/dex/meteora-dlmm.js +735 -0
  54. package/dist/dex/meteora-dlmm.js.map +1 -0
  55. package/dist/dex/orca.d.ts +31 -0
  56. package/dist/dex/orca.d.ts.map +1 -0
  57. package/dist/dex/orca.js +536 -0
  58. package/dist/dex/orca.js.map +1 -0
  59. package/dist/dex/pancakeswap-clmm.d.ts +16 -0
  60. package/dist/dex/pancakeswap-clmm.d.ts.map +1 -0
  61. package/dist/dex/pancakeswap-clmm.js +39 -0
  62. package/dist/dex/pancakeswap-clmm.js.map +1 -0
  63. package/dist/dex/pumpfun-amm.d.ts +46 -0
  64. package/dist/dex/pumpfun-amm.d.ts.map +1 -0
  65. package/dist/dex/pumpfun-amm.js +692 -0
  66. package/dist/dex/pumpfun-amm.js.map +1 -0
  67. package/dist/dex/pumpfun.d.ts +41 -0
  68. package/dist/dex/pumpfun.d.ts.map +1 -0
  69. package/dist/dex/pumpfun.js +555 -0
  70. package/dist/dex/pumpfun.js.map +1 -0
  71. package/dist/dex/raydium-amm-v4.d.ts +11 -0
  72. package/dist/dex/raydium-amm-v4.d.ts.map +1 -0
  73. package/dist/dex/raydium-amm-v4.js +649 -0
  74. package/dist/dex/raydium-amm-v4.js.map +1 -0
  75. package/dist/dex/raydium-clmm.d.ts +12 -0
  76. package/dist/dex/raydium-clmm.d.ts.map +1 -0
  77. package/dist/dex/raydium-clmm.js +675 -0
  78. package/dist/dex/raydium-clmm.js.map +1 -0
  79. package/dist/dex/raydium-cpmm.d.ts +10 -0
  80. package/dist/dex/raydium-cpmm.d.ts.map +1 -0
  81. package/dist/dex/raydium-cpmm.js +613 -0
  82. package/dist/dex/raydium-cpmm.js.map +1 -0
  83. package/dist/dex/raydium-launchlab.d.ts +12 -0
  84. package/dist/dex/raydium-launchlab.d.ts.map +1 -0
  85. package/dist/dex/raydium-launchlab.js +530 -0
  86. package/dist/dex/raydium-launchlab.js.map +1 -0
  87. package/dist/dex/shared/clmm-base.d.ts +58 -0
  88. package/dist/dex/shared/clmm-base.d.ts.map +1 -0
  89. package/dist/dex/shared/clmm-base.js +891 -0
  90. package/dist/dex/shared/clmm-base.js.map +1 -0
  91. package/dist/dex/types.d.ts +601 -0
  92. package/dist/dex/types.d.ts.map +1 -0
  93. package/dist/dex/types.js +137 -0
  94. package/dist/dex/types.js.map +1 -0
  95. package/dist/dexscreener/index.d.ts +2 -0
  96. package/dist/dexscreener/index.d.ts.map +1 -0
  97. package/dist/dexscreener/index.js +18 -0
  98. package/dist/dexscreener/index.js.map +1 -0
  99. package/dist/dexscreener/info.d.ts +22 -0
  100. package/dist/dexscreener/info.d.ts.map +1 -0
  101. package/dist/dexscreener/info.js +104 -0
  102. package/dist/dexscreener/info.js.map +1 -0
  103. package/dist/helpers/check_balance.d.ts +10 -0
  104. package/dist/helpers/check_balance.d.ts.map +1 -0
  105. package/dist/helpers/check_balance.js +34 -0
  106. package/dist/helpers/check_balance.js.map +1 -0
  107. package/dist/helpers/config.d.ts +51 -0
  108. package/dist/helpers/config.d.ts.map +1 -0
  109. package/dist/helpers/config.js +118 -0
  110. package/dist/helpers/config.js.map +1 -0
  111. package/dist/helpers/index.d.ts +8 -0
  112. package/dist/helpers/index.d.ts.map +1 -0
  113. package/dist/helpers/index.js +29 -0
  114. package/dist/helpers/index.js.map +1 -0
  115. package/dist/helpers/logger.d.ts +27 -0
  116. package/dist/helpers/logger.d.ts.map +1 -0
  117. package/dist/helpers/logger.js +39 -0
  118. package/dist/helpers/logger.js.map +1 -0
  119. package/dist/helpers/token-2022.d.ts +32 -0
  120. package/dist/helpers/token-2022.d.ts.map +1 -0
  121. package/dist/helpers/token-2022.js +48 -0
  122. package/dist/helpers/token-2022.js.map +1 -0
  123. package/dist/helpers/unwrap_sol.d.ts +2 -0
  124. package/dist/helpers/unwrap_sol.d.ts.map +1 -0
  125. package/dist/helpers/unwrap_sol.js +67 -0
  126. package/dist/helpers/unwrap_sol.js.map +1 -0
  127. package/dist/helpers/util.d.ts +698 -0
  128. package/dist/helpers/util.d.ts.map +1 -0
  129. package/dist/helpers/util.js +181 -0
  130. package/dist/helpers/util.js.map +1 -0
  131. package/dist/helpers/utils.d.ts +10 -0
  132. package/dist/helpers/utils.d.ts.map +1 -0
  133. package/dist/helpers/utils.js +97 -0
  134. package/dist/helpers/utils.js.map +1 -0
  135. package/dist/helpers/wrap_sol.d.ts +3 -0
  136. package/dist/helpers/wrap_sol.d.ts.map +1 -0
  137. package/dist/helpers/wrap_sol.js +88 -0
  138. package/dist/helpers/wrap_sol.js.map +1 -0
  139. package/dist/index.d.ts +14 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +32 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/transactions/bloXroute_tips_tx_executor.d.ts +4 -0
  144. package/dist/transactions/bloXroute_tips_tx_executor.d.ts.map +1 -0
  145. package/dist/transactions/bloXroute_tips_tx_executor.js +70 -0
  146. package/dist/transactions/bloXroute_tips_tx_executor.js.map +1 -0
  147. package/dist/transactions/index.d.ts +6 -0
  148. package/dist/transactions/index.d.ts.map +1 -0
  149. package/dist/transactions/index.js +30 -0
  150. package/dist/transactions/index.js.map +1 -0
  151. package/dist/transactions/jito_tips_tx_executor.d.ts +15 -0
  152. package/dist/transactions/jito_tips_tx_executor.d.ts.map +1 -0
  153. package/dist/transactions/jito_tips_tx_executor.js +99 -0
  154. package/dist/transactions/jito_tips_tx_executor.js.map +1 -0
  155. package/dist/transactions/landing/index.d.ts +30 -0
  156. package/dist/transactions/landing/index.d.ts.map +1 -0
  157. package/dist/transactions/landing/index.js +60 -0
  158. package/dist/transactions/landing/index.js.map +1 -0
  159. package/dist/transactions/landing/nonce-manager.d.ts +116 -0
  160. package/dist/transactions/landing/nonce-manager.d.ts.map +1 -0
  161. package/dist/transactions/landing/nonce-manager.js +393 -0
  162. package/dist/transactions/landing/nonce-manager.js.map +1 -0
  163. package/dist/transactions/landing/orchestrator.d.ts +104 -0
  164. package/dist/transactions/landing/orchestrator.d.ts.map +1 -0
  165. package/dist/transactions/landing/orchestrator.js +329 -0
  166. package/dist/transactions/landing/orchestrator.js.map +1 -0
  167. package/dist/transactions/landing/providers/astralane.d.ts +12 -0
  168. package/dist/transactions/landing/providers/astralane.d.ts.map +1 -0
  169. package/dist/transactions/landing/providers/astralane.js +132 -0
  170. package/dist/transactions/landing/providers/astralane.js.map +1 -0
  171. package/dist/transactions/landing/providers/blockrazor.d.ts +11 -0
  172. package/dist/transactions/landing/providers/blockrazor.d.ts.map +1 -0
  173. package/dist/transactions/landing/providers/blockrazor.js +134 -0
  174. package/dist/transactions/landing/providers/blockrazor.js.map +1 -0
  175. package/dist/transactions/landing/providers/bloxroute.d.ts +12 -0
  176. package/dist/transactions/landing/providers/bloxroute.d.ts.map +1 -0
  177. package/dist/transactions/landing/providers/bloxroute.js +102 -0
  178. package/dist/transactions/landing/providers/bloxroute.js.map +1 -0
  179. package/dist/transactions/landing/providers/flashblock.d.ts +10 -0
  180. package/dist/transactions/landing/providers/flashblock.d.ts.map +1 -0
  181. package/dist/transactions/landing/providers/flashblock.js +102 -0
  182. package/dist/transactions/landing/providers/flashblock.js.map +1 -0
  183. package/dist/transactions/landing/providers/helius-sender.d.ts +11 -0
  184. package/dist/transactions/landing/providers/helius-sender.d.ts.map +1 -0
  185. package/dist/transactions/landing/providers/helius-sender.js +101 -0
  186. package/dist/transactions/landing/providers/helius-sender.js.map +1 -0
  187. package/dist/transactions/landing/providers/jito.d.ts +16 -0
  188. package/dist/transactions/landing/providers/jito.d.ts.map +1 -0
  189. package/dist/transactions/landing/providers/jito.js +110 -0
  190. package/dist/transactions/landing/providers/jito.js.map +1 -0
  191. package/dist/transactions/landing/providers/nextblock.d.ts +11 -0
  192. package/dist/transactions/landing/providers/nextblock.d.ts.map +1 -0
  193. package/dist/transactions/landing/providers/nextblock.js +109 -0
  194. package/dist/transactions/landing/providers/nextblock.js.map +1 -0
  195. package/dist/transactions/landing/providers/node1.d.ts +11 -0
  196. package/dist/transactions/landing/providers/node1.d.ts.map +1 -0
  197. package/dist/transactions/landing/providers/node1.js +101 -0
  198. package/dist/transactions/landing/providers/node1.js.map +1 -0
  199. package/dist/transactions/landing/providers/nozomi.d.ts +11 -0
  200. package/dist/transactions/landing/providers/nozomi.d.ts.map +1 -0
  201. package/dist/transactions/landing/providers/nozomi.js +124 -0
  202. package/dist/transactions/landing/providers/nozomi.js.map +1 -0
  203. package/dist/transactions/landing/providers/soyas.d.ts +16 -0
  204. package/dist/transactions/landing/providers/soyas.d.ts.map +1 -0
  205. package/dist/transactions/landing/providers/soyas.js +192 -0
  206. package/dist/transactions/landing/providers/soyas.js.map +1 -0
  207. package/dist/transactions/landing/providers/stellium.d.ts +11 -0
  208. package/dist/transactions/landing/providers/stellium.d.ts.map +1 -0
  209. package/dist/transactions/landing/providers/stellium.js +102 -0
  210. package/dist/transactions/landing/providers/stellium.js.map +1 -0
  211. package/dist/transactions/landing/providers/zero-slot.d.ts +10 -0
  212. package/dist/transactions/landing/providers/zero-slot.d.ts.map +1 -0
  213. package/dist/transactions/landing/providers/zero-slot.js +92 -0
  214. package/dist/transactions/landing/providers/zero-slot.js.map +1 -0
  215. package/dist/transactions/landing/tip-accounts.d.ts +22 -0
  216. package/dist/transactions/landing/tip-accounts.d.ts.map +1 -0
  217. package/dist/transactions/landing/tip-accounts.js +140 -0
  218. package/dist/transactions/landing/tip-accounts.js.map +1 -0
  219. package/dist/transactions/landing/types.d.ts +98 -0
  220. package/dist/transactions/landing/types.d.ts.map +1 -0
  221. package/dist/transactions/landing/types.js +30 -0
  222. package/dist/transactions/landing/types.js.map +1 -0
  223. package/dist/transactions/nozomi/tx-submission.d.ts +14 -0
  224. package/dist/transactions/nozomi/tx-submission.d.ts.map +1 -0
  225. package/dist/transactions/nozomi/tx-submission.js +107 -0
  226. package/dist/transactions/nozomi/tx-submission.js.map +1 -0
  227. package/dist/transactions/send-rpc.d.ts +54 -0
  228. package/dist/transactions/send-rpc.d.ts.map +1 -0
  229. package/dist/transactions/send-rpc.js +126 -0
  230. package/dist/transactions/send-rpc.js.map +1 -0
  231. package/dist/transactions/simple_tx_executor.d.ts +10 -0
  232. package/dist/transactions/simple_tx_executor.d.ts.map +1 -0
  233. package/dist/transactions/simple_tx_executor.js +33 -0
  234. package/dist/transactions/simple_tx_executor.js.map +1 -0
  235. package/package.json +112 -0
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ /**
3
+ * TX Landing Orchestrator
4
+ *
5
+ * Manages multiple TX landing providers and implements submission strategies:
6
+ * - concurrent: Fire to all enabled providers in parallel (fire-and-forget)
7
+ * Uses durable nonce for exactly-once execution safety.
8
+ * - race: Fire to all, return first accepted result
9
+ * - random: Pick 1-3 random providers + always include a fallback (nozomi)
10
+ * - sequential: Try providers in order, stop on first success
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.LandingOrchestrator = void 0;
14
+ exports.getOrchestrator = getOrchestrator;
15
+ exports.landTransaction = landTransaction;
16
+ // Provider factory imports
17
+ const zero_slot_1 = require("./providers/zero-slot");
18
+ const nozomi_1 = require("./providers/nozomi");
19
+ const helius_sender_1 = require("./providers/helius-sender");
20
+ const blockrazor_1 = require("./providers/blockrazor");
21
+ const node1_1 = require("./providers/node1");
22
+ const bloxroute_1 = require("./providers/bloxroute");
23
+ const astralane_1 = require("./providers/astralane");
24
+ const stellium_1 = require("./providers/stellium");
25
+ const flashblock_1 = require("./providers/flashblock");
26
+ const jito_1 = require("./providers/jito");
27
+ const nextblock_1 = require("./providers/nextblock");
28
+ const soyas_1 = require("./providers/soyas");
29
+ // ---------------------------------------------------------------------------
30
+ // Provider registry
31
+ // ---------------------------------------------------------------------------
32
+ const PROVIDER_FACTORIES = {
33
+ "zero-slot": zero_slot_1.createProvider,
34
+ "nozomi": nozomi_1.createProvider,
35
+ "helius-sender": helius_sender_1.createProvider,
36
+ "blockrazor": blockrazor_1.createProvider,
37
+ "node1": node1_1.createProvider,
38
+ "bloxroute": bloxroute_1.createProvider,
39
+ "astralane": astralane_1.createProvider,
40
+ "stellium": stellium_1.createProvider,
41
+ "flashblock": flashblock_1.createProvider,
42
+ "jito": jito_1.createProvider,
43
+ "nextblock": nextblock_1.createProvider,
44
+ "soyas": soyas_1.createProvider,
45
+ };
46
+ /** Default providers for concurrent snipe submission (matches source orchestrator) */
47
+ const DEFAULT_SNIPE_PROVIDERS = [
48
+ "zero-slot", "nozomi", "helius-sender", "astralane",
49
+ "stellium", "blockrazor", "flashblock", "node1", "soyas",
50
+ ];
51
+ /** Default providers for random pick strategy */
52
+ const DEFAULT_RANDOM_POOL = ["zero-slot", "nozomi", "helius-sender"];
53
+ /** Fallback provider always included in random strategy */
54
+ const RANDOM_FALLBACK = "nozomi";
55
+ // ---------------------------------------------------------------------------
56
+ // Orchestrator class
57
+ // ---------------------------------------------------------------------------
58
+ class LandingOrchestrator {
59
+ providers = new Map();
60
+ config;
61
+ nonceManager = null;
62
+ constructor(config) {
63
+ this.config = {
64
+ strategy: config?.strategy ?? "concurrent",
65
+ defaultTipSol: config?.defaultTipSol ?? 0.001,
66
+ timeoutMs: config?.timeoutMs ?? 10_000,
67
+ providers: config?.providers,
68
+ };
69
+ // Initialize all provider instances
70
+ for (const [name, factory] of Object.entries(PROVIDER_FACTORIES)) {
71
+ try {
72
+ this.providers.set(name, factory());
73
+ }
74
+ catch (e) {
75
+ // Provider failed to initialize — skip it
76
+ console.warn(`[landing] Failed to initialize provider ${name}:`, e);
77
+ }
78
+ }
79
+ }
80
+ /**
81
+ * Get all currently enabled providers.
82
+ */
83
+ getEnabledProviders() {
84
+ const names = this.config.providers ?? [...this.providers.keys()];
85
+ return names
86
+ .map((n) => this.providers.get(n))
87
+ .filter((p) => p !== undefined && p.isEnabled());
88
+ }
89
+ /**
90
+ * Get a specific provider by name.
91
+ */
92
+ getProvider(name) {
93
+ return this.providers.get(name);
94
+ }
95
+ /**
96
+ * List all registered provider names and their enabled status.
97
+ */
98
+ listProviders() {
99
+ return [...this.providers.entries()].map(([name, p]) => ({
100
+ name,
101
+ enabled: p.isEnabled(),
102
+ }));
103
+ }
104
+ /**
105
+ * Set the NonceManager for durable nonce support.
106
+ * When set, the concurrent strategy will use nonce for exactly-once execution.
107
+ */
108
+ setNonceManager(nm) {
109
+ this.nonceManager = nm;
110
+ }
111
+ /**
112
+ * Get the current NonceManager, if any.
113
+ */
114
+ getNonceManager() {
115
+ return this.nonceManager;
116
+ }
117
+ /**
118
+ * Submit a transaction using the configured strategy.
119
+ */
120
+ async submit(ixs, signer, blockhash, opts) {
121
+ const fullOpts = {
122
+ dex: opts?.dex ?? "unknown",
123
+ operation: opts?.operation ?? "swap",
124
+ tipSol: opts?.tipSol ?? this.config.defaultTipSol,
125
+ extraSigners: opts?.extraSigners,
126
+ addressLookupTables: opts?.addressLookupTables,
127
+ };
128
+ switch (this.config.strategy) {
129
+ case "concurrent":
130
+ return this.submitConcurrent(ixs, signer, blockhash, fullOpts);
131
+ case "race":
132
+ return this.submitRace(ixs, signer, blockhash, fullOpts);
133
+ case "random":
134
+ return this.submitRandom(ixs, signer, blockhash, fullOpts);
135
+ case "sequential":
136
+ return this.submitSequential(ixs, signer, blockhash, fullOpts);
137
+ default:
138
+ return this.submitConcurrent(ixs, signer, blockhash, fullOpts);
139
+ }
140
+ }
141
+ /**
142
+ * Fire to all enabled providers in parallel. Returns all results.
143
+ * This matches the source `concurrent_snipe_tx_landing` behavior.
144
+ *
145
+ * When a NonceManager is set, this method:
146
+ * 1. Fetches the current nonce value from chain
147
+ * 2. Prepends nonceAdvance as the FIRST instruction
148
+ * 3. Uses the nonce value as the blockhash
149
+ * This guarantees exactly-once execution even when 9+ providers receive
150
+ * the same transaction — the nonce is consumed by the first landing.
151
+ *
152
+ * Without nonce: falls back to race strategy with a warning.
153
+ */
154
+ async submitConcurrent(ixs, signer, blockhash, opts) {
155
+ const providers = this.getResolvedProviders(DEFAULT_SNIPE_PROVIDERS);
156
+ if (providers.length === 0) {
157
+ return [{ provider: "orchestrator", accepted: false, error: "No enabled providers" }];
158
+ }
159
+ // --- Nonce handling for concurrent safety ---
160
+ let effectiveIxs = ixs;
161
+ let effectiveBlockhash = blockhash;
162
+ if (opts.skipNonce) {
163
+ console.warn("[landing] WARNING: Concurrent submission with skipNonce=true. " +
164
+ "Risk of duplicate buys if multiple providers land the transaction.");
165
+ }
166
+ else if (this.nonceManager) {
167
+ try {
168
+ const { nonce, address } = await this.nonceManager.get();
169
+ const advanceIx = this.nonceManager.buildAdvanceIx();
170
+ // Prepend nonceAdvance as the FIRST instruction
171
+ effectiveIxs = [advanceIx, ...ixs];
172
+ // Use nonce value as blockhash
173
+ effectiveBlockhash = nonce;
174
+ console.log(`[landing] Using durable nonce ${address.toBase58().slice(0, 8)}... for concurrent submission`);
175
+ }
176
+ catch (err) {
177
+ console.warn("[landing] Failed to fetch nonce, falling back to race strategy:", err instanceof Error ? err.message : err);
178
+ return this.submitRace(ixs, signer, blockhash, opts);
179
+ }
180
+ }
181
+ else {
182
+ // No nonce manager — fall back to race (safe: first accepted wins)
183
+ console.warn("[landing] No nonce account configured for concurrent strategy. " +
184
+ "Falling back to race strategy to avoid duplicate buys. " +
185
+ "Run 'outsmart nonce create' to enable concurrent landing.");
186
+ return this.submitRace(ixs, signer, blockhash, opts);
187
+ }
188
+ const promises = providers.map((p) => this.submitWithTimeout(p, effectiveIxs, signer, effectiveBlockhash, opts));
189
+ const settled = await Promise.allSettled(promises);
190
+ return settled.map((s, i) => {
191
+ if (s.status === "fulfilled")
192
+ return s.value;
193
+ return {
194
+ provider: providers[i].name,
195
+ accepted: false,
196
+ error: String(s.reason),
197
+ };
198
+ });
199
+ }
200
+ /**
201
+ * Fire to all enabled providers, return on first accepted result.
202
+ */
203
+ async submitRace(ixs, signer, blockhash, opts) {
204
+ const providers = this.getResolvedProviders(DEFAULT_SNIPE_PROVIDERS);
205
+ if (providers.length === 0) {
206
+ return [{ provider: "orchestrator", accepted: false, error: "No enabled providers" }];
207
+ }
208
+ const promises = providers.map((p) => this.submitWithTimeout(p, ixs, signer, blockhash, opts).then((r) => {
209
+ if (r.accepted)
210
+ return r;
211
+ throw r; // reject non-accepted to keep racing
212
+ }));
213
+ try {
214
+ const winner = await Promise.any(promises);
215
+ return [winner];
216
+ }
217
+ catch {
218
+ // All rejected — collect all results
219
+ const settled = await Promise.allSettled(providers.map((p) => this.submitWithTimeout(p, ixs, signer, blockhash, opts)));
220
+ return settled.map((s, i) => {
221
+ if (s.status === "fulfilled")
222
+ return s.value;
223
+ return { provider: providers[i].name, accepted: false, error: String(s.reason) };
224
+ });
225
+ }
226
+ }
227
+ /**
228
+ * Pick 1-3 random providers + always include nozomi as fallback.
229
+ * Matches the source `randomLandTx` behavior.
230
+ */
231
+ async submitRandom(ixs, signer, blockhash, opts) {
232
+ const enabled = this.getResolvedProviders(DEFAULT_RANDOM_POOL);
233
+ if (enabled.length === 0) {
234
+ return [{ provider: "orchestrator", accepted: false, error: "No enabled providers" }];
235
+ }
236
+ // Pick a random provider from the pool
237
+ const picked = enabled[Math.floor(Math.random() * enabled.length)];
238
+ const toSend = [picked];
239
+ // Always add nozomi as fallback if it wasn't already picked
240
+ if (picked.name !== RANDOM_FALLBACK) {
241
+ const fallback = this.providers.get(RANDOM_FALLBACK);
242
+ if (fallback?.isEnabled()) {
243
+ toSend.push(fallback);
244
+ }
245
+ }
246
+ const promises = toSend.map((p) => this.submitWithTimeout(p, ixs, signer, blockhash, opts));
247
+ const settled = await Promise.allSettled(promises);
248
+ return settled.map((s, i) => {
249
+ if (s.status === "fulfilled")
250
+ return s.value;
251
+ return { provider: toSend[i].name, accepted: false, error: String(s.reason) };
252
+ });
253
+ }
254
+ /**
255
+ * Try providers in order, stop on first success.
256
+ */
257
+ async submitSequential(ixs, signer, blockhash, opts) {
258
+ const providers = this.getResolvedProviders(DEFAULT_SNIPE_PROVIDERS);
259
+ const results = [];
260
+ for (const p of providers) {
261
+ const result = await this.submitWithTimeout(p, ixs, signer, blockhash, opts);
262
+ results.push(result);
263
+ if (result.accepted)
264
+ break;
265
+ }
266
+ return results;
267
+ }
268
+ /**
269
+ * Submit with timeout wrapper.
270
+ */
271
+ async submitWithTimeout(provider, ixs, signer, blockhash, opts) {
272
+ const timeoutMs = this.config.timeoutMs ?? 10_000;
273
+ return Promise.race([
274
+ provider.submit(ixs, signer, blockhash, opts),
275
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`${provider.name} timed out after ${timeoutMs}ms`)), timeoutMs)),
276
+ ]).catch((err) => ({
277
+ provider: provider.name,
278
+ accepted: false,
279
+ error: err instanceof Error ? err.message : String(err),
280
+ }));
281
+ }
282
+ /**
283
+ * Resolve provider names to instances, filtering to enabled only.
284
+ */
285
+ getResolvedProviders(defaultNames) {
286
+ const names = this.config.providers ?? defaultNames;
287
+ return names
288
+ .map((n) => this.providers.get(n))
289
+ .filter((p) => p !== undefined && p.isEnabled());
290
+ }
291
+ /**
292
+ * Ping all providers that support it (for keep-alive).
293
+ */
294
+ async pingAll() {
295
+ const promises = [...this.providers.values()]
296
+ .filter((p) => p.isEnabled() && p.ping)
297
+ .map((p) => p.ping().catch(() => { }));
298
+ await Promise.allSettled(promises);
299
+ }
300
+ }
301
+ exports.LandingOrchestrator = LandingOrchestrator;
302
+ // ---------------------------------------------------------------------------
303
+ // Convenience factory
304
+ // ---------------------------------------------------------------------------
305
+ let _defaultOrchestrator = null;
306
+ /**
307
+ * Get or create the default orchestrator singleton.
308
+ *
309
+ * If a nonce account config exists at ~/.outsmart/nonce.json, the orchestrator
310
+ * will automatically use it for concurrent landing safety.
311
+ */
312
+ function getOrchestrator(config) {
313
+ if (!_defaultOrchestrator || config) {
314
+ _defaultOrchestrator = new LandingOrchestrator(config);
315
+ // Auto-detect nonce account if config exists
316
+ // Note: NonceManager requires connection + authority, which are lazy-loaded.
317
+ // The actual NonceManager is set up by the CLI entrypoint or by calling
318
+ // orchestrator.setNonceManager() directly. This is intentional — we don't
319
+ // want to import config.ts here (circular dependency risk).
320
+ }
321
+ return _defaultOrchestrator;
322
+ }
323
+ /**
324
+ * Convenience: submit via the default orchestrator.
325
+ */
326
+ async function landTransaction(ixs, signer, blockhash, opts) {
327
+ return getOrchestrator().submit(ixs, signer, blockhash, opts);
328
+ }
329
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/transactions/landing/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Astralane TX Landing Provider
3
+ *
4
+ * Submits transactions via Astralane's Iris HTTP JSON-RPC endpoint.
5
+ * Supports two modes:
6
+ * - "sendTransaction" for create / general operations (single tx)
7
+ * - "sendIdeal" for snipe/swap operations (two txs: high-tip + low-tip)
8
+ */
9
+ import { ILandingProvider } from "../types";
10
+ declare function createProvider(): ILandingProvider;
11
+ export { createProvider };
12
+ //# sourceMappingURL=astralane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astralane.d.ts","sourceRoot":"","sources":["../../../../src/transactions/landing/providers/astralane.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,OAAO,EACL,gBAAgB,EAKjB,MAAM,UAAU,CAAC;AAuDlB,iBAAS,cAAc,IAAI,gBAAgB,CAwG1C;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ /**
3
+ * Astralane TX Landing Provider
4
+ *
5
+ * Submits transactions via Astralane's Iris HTTP JSON-RPC endpoint.
6
+ * Supports two modes:
7
+ * - "sendTransaction" for create / general operations (single tx)
8
+ * - "sendIdeal" for snipe/swap operations (two txs: high-tip + low-tip)
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.createProvider = createProvider;
15
+ const axios_1 = __importDefault(require("axios"));
16
+ const web3_js_1 = require("@solana/web3.js");
17
+ const types_1 = require("../types");
18
+ // ---------------------------------------------------------------------------
19
+ // Config
20
+ // ---------------------------------------------------------------------------
21
+ const TIP_ACCOUNTS = [
22
+ "astra4uejePWneqNaJKuFFA8oonqCE1sqF6b45kDMZm",
23
+ "astrazznxsGUhWShqgNtAdfrzP2G83DzcWVJDxwV9bF",
24
+ "astra9xWY93QyfG6yM8zwsKsRodscjQ2uU2HKNL5prk",
25
+ "astraRVUuTHjpwEVvNBeQEgwYx9w9CFyfxjYoobCZhL",
26
+ "astraEJ2fEj8Xmy6KLG7B3VfbKfsHXhHrNdCQx7iGJK",
27
+ "astraubkDw81n4LuutzSQ8uzHCv4BhPVhfvTcYv8SKC",
28
+ "astraZW5GLFefxNPAatceHhYjfA1ciq9gvfEg2S47xk",
29
+ "astrawVNP4xDBKT7rAdxrLYiTSTdqtUr63fSMduivXK",
30
+ ];
31
+ const DEFAULT_TIP_SOL = 0.001;
32
+ // ---------------------------------------------------------------------------
33
+ // Helpers
34
+ // ---------------------------------------------------------------------------
35
+ function buildTx(ixs, signer, blockhash, opts, tipSol) {
36
+ const tipAccount = (0, types_1.pickRandom)(TIP_ACCOUNTS);
37
+ const tipIx = web3_js_1.SystemProgram.transfer({
38
+ fromPubkey: signer.publicKey,
39
+ toPubkey: new web3_js_1.PublicKey(tipAccount),
40
+ lamports: Math.round(tipSol * web3_js_1.LAMPORTS_PER_SOL),
41
+ });
42
+ const allIxs = [...ixs, tipIx];
43
+ const messageV0 = new web3_js_1.TransactionMessage({
44
+ payerKey: signer.publicKey,
45
+ recentBlockhash: blockhash,
46
+ instructions: allIxs,
47
+ }).compileToV0Message(opts.addressLookupTables);
48
+ const tx = new web3_js_1.VersionedTransaction(messageV0);
49
+ const signers = [signer, ...(opts.extraSigners ?? [])];
50
+ tx.sign(signers);
51
+ return tx;
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // Provider
55
+ // ---------------------------------------------------------------------------
56
+ function createProvider() {
57
+ return {
58
+ name: "astralane",
59
+ isEnabled() {
60
+ return !!process.env.ASTRALANE_API_KEY;
61
+ },
62
+ async submit(ixs, signer, blockhash, opts) {
63
+ const provider = this.name;
64
+ try {
65
+ const key = process.env.ASTRALANE_API_KEY || "";
66
+ if (!key) {
67
+ return { provider, accepted: false, error: "ASTRALANE_API_KEY not set" };
68
+ }
69
+ const tipSol = opts.tipSol && opts.tipSol > 0 ? opts.tipSol : DEFAULT_TIP_SOL;
70
+ const bh = (0, types_1.extractBlockhash)(blockhash);
71
+ const endpoint = `http://ams.gateway.astralane.io/iris?api-key=${key}`;
72
+ const isSnipeOrSwap = opts.operation === "snipe" || opts.operation === "buy" || opts.operation === "sell";
73
+ if (isSnipeOrSwap) {
74
+ // sendIdeal mode: two legacy txs — high tip (1.5x) and low tip (1x)
75
+ const highTipTx = buildTx(ixs, signer, bh, opts, tipSol * 1.5);
76
+ const lowTipTx = buildTx(ixs, signer, bh, opts, tipSol);
77
+ const highTipB64 = Buffer.from(highTipTx.serialize()).toString("base64");
78
+ const lowTipB64 = Buffer.from(lowTipTx.serialize()).toString("base64");
79
+ const t0 = Date.now();
80
+ const response = await axios_1.default.post(endpoint, {
81
+ jsonrpc: "2.0",
82
+ id: 1,
83
+ method: "sendIdeal",
84
+ params: [[highTipB64, lowTipB64]],
85
+ }, { timeout: 10_000 });
86
+ const latencyMs = Date.now() - t0;
87
+ const signature = response.data?.result;
88
+ if (signature) {
89
+ return { provider, accepted: true, signature, latencyMs };
90
+ }
91
+ const errMsg = response.data?.error?.message ||
92
+ JSON.stringify(response.data?.error) ||
93
+ "Unknown astralane sendIdeal error";
94
+ return { provider, accepted: false, error: errMsg, latencyMs };
95
+ }
96
+ // Default: sendTransaction mode (create_account, create_damm_pool, etc.)
97
+ const tx = buildTx(ixs, signer, bh, opts, tipSol);
98
+ const b64 = Buffer.from(tx.serialize()).toString("base64");
99
+ const t0 = Date.now();
100
+ const response = await axios_1.default.post(endpoint, {
101
+ jsonrpc: "2.0",
102
+ id: 1,
103
+ method: "sendTransaction",
104
+ params: [
105
+ b64,
106
+ { encoding: "base64", skipPreflight: true },
107
+ { mevProtect: false },
108
+ ],
109
+ }, { timeout: 10_000 });
110
+ const latencyMs = Date.now() - t0;
111
+ const signature = response.data?.result;
112
+ if (signature) {
113
+ return { provider, accepted: true, signature, latencyMs };
114
+ }
115
+ const errMsg = response.data?.error?.message ||
116
+ JSON.stringify(response.data?.error) ||
117
+ "Unknown astralane error";
118
+ return { provider, accepted: false, error: errMsg, latencyMs };
119
+ }
120
+ catch (err) {
121
+ return {
122
+ provider,
123
+ accepted: false,
124
+ error: err?.response?.data?.error?.message ||
125
+ err?.message ||
126
+ "Astralane request failed",
127
+ };
128
+ }
129
+ },
130
+ };
131
+ }
132
+ //# sourceMappingURL=astralane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astralane.js","sourceRoot":"","sources":["../../../../src/transactions/landing/providers/astralane.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Blockrazor TX Landing Provider
3
+ *
4
+ * Submits transactions via Blockrazor's custom REST endpoint.
5
+ * Uses a persistent axios client with HTTP keep-alive for lower latency.
6
+ * Implements ping() for health checks.
7
+ */
8
+ import { ILandingProvider } from "../types";
9
+ declare function createProvider(): ILandingProvider;
10
+ export { createProvider };
11
+ //# sourceMappingURL=blockrazor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockrazor.d.ts","sourceRoot":"","sources":["../../../../src/transactions/landing/providers/blockrazor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,EACL,gBAAgB,EAKjB,MAAM,UAAU,CAAC;AAoDlB,iBAAS,cAAc,IAAI,gBAAgB,CAwF1C;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * Blockrazor TX Landing Provider
4
+ *
5
+ * Submits transactions via Blockrazor's custom REST endpoint.
6
+ * Uses a persistent axios client with HTTP keep-alive for lower latency.
7
+ * Implements ping() for health checks.
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.createProvider = createProvider;
14
+ const axios_1 = __importDefault(require("axios"));
15
+ const http_1 = __importDefault(require("http"));
16
+ const https_1 = __importDefault(require("https"));
17
+ const web3_js_1 = require("@solana/web3.js");
18
+ const types_1 = require("../types");
19
+ // ---------------------------------------------------------------------------
20
+ // Config
21
+ // ---------------------------------------------------------------------------
22
+ const TIP_ACCOUNTS = [
23
+ "Gywj98ophM7GmkDdaWs4isqZnDdFCW7B46TXmKfvyqSm",
24
+ "FjmZZrFvhnqqb9ThCuMVnENaM3JGVuGWNyCAxRJcFpg9",
25
+ "6No2i3aawzHsjtThw81iq1EXPJN6rh8eSJCLaYZfKDTG",
26
+ "A9cWowVAiHe9pJfKAj3TJiN9VpbzMUq6E4kEvf5mUT22",
27
+ "68Pwb4jS7eZATjDfhmTXgRJjCiZmw1L7Huy4HNpnxJ3o",
28
+ "4ABhJh5rZPjv63RBJBuyWzBK3g9gWMUQdTZP2kiW31V9",
29
+ "B2M4NG5eyZp5SBQrSdtemzk5TqVuaWGQnowGaCBt8GyM",
30
+ "5jA59cXMKQqZAVdtopv8q3yyw9SYfiE3vUCbt7p8MfVf",
31
+ "5YktoWygr1Bp9wiS1xtMtUki1PeYuuzuCF98tqwYxf61",
32
+ "295Avbam4qGShBYK7E9H5Ldew4B3WyJGmgmXfiWdeeyV",
33
+ "EDi4rSy2LZgKJX74mbLTFk4mxoTgT6F7HxxzG2HBAFyK",
34
+ "BnGKHAC386n4Qmv9xtpBVbRaUTKixjBe3oagkPFKtoy6",
35
+ "Dd7K2Fp7AtoN8xCghKDRmyqr5U169t48Tw5fEd3wT9mq",
36
+ "AP6qExwrbRgBAVaehg4b5xHENX815sMabtBzUzVB4v8S",
37
+ ];
38
+ const DEFAULT_TIP_SOL = 0.001;
39
+ const BASE_URL = "http://amsterdam.solana.blockrazor.xyz:443";
40
+ // ---------------------------------------------------------------------------
41
+ // Persistent HTTP client with keep-alive
42
+ // ---------------------------------------------------------------------------
43
+ let _client = null;
44
+ function getClient(apiKey) {
45
+ if (!_client) {
46
+ _client = axios_1.default.create({
47
+ baseURL: BASE_URL,
48
+ timeout: 10_000,
49
+ headers: {
50
+ "Content-Type": "application/json",
51
+ apikey: apiKey,
52
+ },
53
+ httpAgent: new http_1.default.Agent({ keepAlive: true }),
54
+ httpsAgent: new https_1.default.Agent({ keepAlive: true }),
55
+ });
56
+ }
57
+ return _client;
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // Provider
61
+ // ---------------------------------------------------------------------------
62
+ function createProvider() {
63
+ return {
64
+ name: "blockrazor",
65
+ isEnabled() {
66
+ return !!process.env.BLOCKRAZOR_API_KEY;
67
+ },
68
+ async ping() {
69
+ const apiKey = process.env.BLOCKRAZOR_API_KEY || "";
70
+ if (!apiKey)
71
+ return;
72
+ const client = getClient(apiKey);
73
+ await client.get("/health");
74
+ },
75
+ async submit(ixs, signer, blockhash, opts) {
76
+ const provider = this.name;
77
+ try {
78
+ const apiKey = process.env.BLOCKRAZOR_API_KEY || "";
79
+ if (!apiKey) {
80
+ return { provider, accepted: false, error: "BLOCKRAZOR_API_KEY not set" };
81
+ }
82
+ const tipSol = opts.tipSol && opts.tipSol > 0 ? opts.tipSol : DEFAULT_TIP_SOL;
83
+ const tipAccount = (0, types_1.pickRandom)(TIP_ACCOUNTS);
84
+ // Build tip instruction
85
+ const tipIx = web3_js_1.SystemProgram.transfer({
86
+ fromPubkey: signer.publicKey,
87
+ toPubkey: new web3_js_1.PublicKey(tipAccount),
88
+ lamports: Math.round(tipSol * web3_js_1.LAMPORTS_PER_SOL),
89
+ });
90
+ // Build V0 transaction — never mutate input ixs
91
+ const allIxs = [...ixs, tipIx];
92
+ const bh = (0, types_1.extractBlockhash)(blockhash);
93
+ const message = new web3_js_1.TransactionMessage({
94
+ payerKey: signer.publicKey,
95
+ recentBlockhash: bh,
96
+ instructions: allIxs,
97
+ });
98
+ const messageV0 = message.compileToV0Message(opts.addressLookupTables);
99
+ const tx = new web3_js_1.VersionedTransaction(messageV0);
100
+ const signers = [signer, ...(opts.extraSigners ?? [])];
101
+ tx.sign(signers);
102
+ const b64 = Buffer.from(tx.serialize()).toString("base64");
103
+ const client = getClient(apiKey);
104
+ const t0 = Date.now();
105
+ const response = await client.post("/sendTransaction", {
106
+ transaction: b64,
107
+ mode: "fast",
108
+ safeWindow: 5,
109
+ RevertProtection: false,
110
+ });
111
+ const latencyMs = Date.now() - t0;
112
+ const data = response.data;
113
+ const signature = data?.signature || data?.result;
114
+ if (signature) {
115
+ return { provider, accepted: true, signature, latencyMs };
116
+ }
117
+ // Check for explicit success without signature
118
+ if (data?.success === true || data?.status === "ok") {
119
+ return { provider, accepted: true, latencyMs };
120
+ }
121
+ const errMsg = data?.error || data?.message || "Unknown blockrazor error";
122
+ return { provider, accepted: false, error: String(errMsg), latencyMs };
123
+ }
124
+ catch (err) {
125
+ return {
126
+ provider,
127
+ accepted: false,
128
+ error: err?.response?.data?.error || err?.response?.data?.message || err?.message || "blockrazor request failed",
129
+ };
130
+ }
131
+ },
132
+ };
133
+ }
134
+ //# sourceMappingURL=blockrazor.js.map