@tradelayerprotocol/tradelayer 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/.claude/settings.local.json +13 -0
  2. package/.claude/skills/tl-algo/SKILL.md +255 -0
  3. package/.gitattributes +2 -0
  4. package/.github/workflows/publish.yaml +26 -0
  5. package/4mm.js +163 -0
  6. package/LICENSE +21 -0
  7. package/NPMSwapRefactor.zip +0 -0
  8. package/README.md +217 -0
  9. package/address.sh +26 -0
  10. package/algoAPI.js +581 -0
  11. package/analyzepsbt.js +92 -0
  12. package/apiEx.js +99 -0
  13. package/bb_hyperscalper.js +290 -0
  14. package/bbo_demo.js +111 -0
  15. package/buyer.js +622 -0
  16. package/client.js +50 -0
  17. package/createTxTest.js +26 -0
  18. package/createWallet.js +75 -0
  19. package/daytrader.js +531 -0
  20. package/decodeTest.js +69 -0
  21. package/fundingManager.js +144 -0
  22. package/index.js +4 -0
  23. package/listener.js +27 -0
  24. package/litecoreTxBuilder.js +1128 -0
  25. package/mmEx.js +356 -0
  26. package/networks.js +51 -0
  27. package/orderbook.js +200 -0
  28. package/package.json +34 -0
  29. package/perTradeQueue.js +36 -0
  30. package/projectsTLNPMTLNPM/package-lock.json +162 -0
  31. package/projectsTLNPMTLNPM/package.json +5 -0
  32. package/quick.js +32 -0
  33. package/quickFut.js +37 -0
  34. package/quickSell.js +37 -0
  35. package/relayerClient.js +117 -0
  36. package/run4mm.js +80 -0
  37. package/run_bbo_tracker.js +241 -0
  38. package/seller.js +443 -0
  39. package/session.js +45 -0
  40. package/setup-lin-ltc.sh +139 -0
  41. package/setup-lin.sh +203 -0
  42. package/setup-win-ltc.bat +108 -0
  43. package/setup-win.bat +167 -0
  44. package/spam_screamer_futures.js +222 -0
  45. package/tradelayer.js/.gitattributes +2 -0
  46. package/tradelayer.js/README.md +2 -0
  47. package/tradelayer.js/oldTests/activationTest.js +6 -0
  48. package/tradelayer.js/oldTests/base58.test.js +23 -0
  49. package/tradelayer.js/oldTests/base64Decode.test.js +16 -0
  50. package/tradelayer.js/oldTests/blocksRefactor.js +140 -0
  51. package/tradelayer.js/oldTests/checkVestBalance.js +25 -0
  52. package/tradelayer.js/oldTests/consensusHashProto.js +151 -0
  53. package/tradelayer.js/oldTests/contractOrderbook.js +243 -0
  54. package/tradelayer.js/oldTests/createPayload.js +0 -0
  55. package/tradelayer.js/oldTests/createTestnetAddr.js +43 -0
  56. package/tradelayer.js/oldTests/decode.js +205 -0
  57. package/tradelayer.js/oldTests/decodeTest.js +50 -0
  58. package/tradelayer.js/oldTests/displayTallyMap.js +19 -0
  59. package/tradelayer.js/oldTests/encodeDecode.js +340 -0
  60. package/tradelayer.js/oldTests/expressTest.js +29 -0
  61. package/tradelayer.js/oldTests/extractBlocksVanilla.js +214 -0
  62. package/tradelayer.js/oldTests/extractBlocksVanillaa.js +179 -0
  63. package/tradelayer.js/oldTests/extractPubkeyTest.js +60 -0
  64. package/tradelayer.js/oldTests/fillInputCacheProto.js +111 -0
  65. package/tradelayer.js/oldTests/getRawTxTest.js +22 -0
  66. package/tradelayer.js/oldTests/indexTest.js +26 -0
  67. package/tradelayer.js/oldTests/initTokensTest.js +32 -0
  68. package/tradelayer.js/oldTests/interfaceChild.js +129 -0
  69. package/tradelayer.js/oldTests/listenerChild.js +112 -0
  70. package/tradelayer.js/oldTests/opdecode.js +26 -0
  71. package/tradelayer.js/oldTests/options.js +79 -0
  72. package/tradelayer.js/oldTests/optxtest.js +116 -0
  73. package/tradelayer.js/oldTests/optxtest1.js +64 -0
  74. package/tradelayer.js/oldTests/oracle.test.js +32 -0
  75. package/tradelayer.js/oldTests/orderbook.test.js +36 -0
  76. package/tradelayer.js/oldTests/parsing.js +93 -0
  77. package/tradelayer.js/oldTests/payload.js +13 -0
  78. package/tradelayer.js/oldTests/persistenceUnitTest.js +23 -0
  79. package/tradelayer.js/oldTests/property.test.js +53 -0
  80. package/tradelayer.js/oldTests/propertyLevel.js +75 -0
  81. package/tradelayer.js/oldTests/propertyTest.js +32 -0
  82. package/tradelayer.js/oldTests/queryAddressTest.js +17 -0
  83. package/tradelayer.js/oldTests/salter.js +14 -0
  84. package/tradelayer.js/oldTests/tally.js +81 -0
  85. package/tradelayer.js/oldTests/tally.test.js +48 -0
  86. package/tradelayer.js/oldTests/tally2.js +124 -0
  87. package/tradelayer.js/oldTests/tally3.js +142 -0
  88. package/tradelayer.js/oldTests/tallyDiag.js +38 -0
  89. package/tradelayer.js/oldTests/testGetRaw.js +40 -0
  90. package/tradelayer.js/oldTests/testHexConvert.js +47 -0
  91. package/tradelayer.js/oldTests/testNewEncoding.js +96 -0
  92. package/tradelayer.js/oldTests/testNewEncoding2.js +113 -0
  93. package/tradelayer.js/oldTests/testNewEncoding3 +112 -0
  94. package/tradelayer.js/oldTests/testNewEncoding3.js +168 -0
  95. package/tradelayer.js/oldTests/testOPReturn.js +102 -0
  96. package/tradelayer.js/oldTests/testPayload.js +23 -0
  97. package/tradelayer.js/oldTests/testRaw.js +50 -0
  98. package/tradelayer.js/oldTests/testSendTooMuch.js +20 -0
  99. package/tradelayer.js/oldTests/testTxBuild +28 -0
  100. package/tradelayer.js/oldTests/testTxBuild.js +42 -0
  101. package/tradelayer.js/oldTests/tokenOrderbook.js +243 -0
  102. package/tradelayer.js/oldTests/txUtilsA.js +515 -0
  103. package/tradelayer.js/oldTests/validityUnitTest.js +53 -0
  104. package/tradelayer.js/oldTests/vaults.js +72 -0
  105. package/tradelayer.js/oldTests/volumeIndex.js +117 -0
  106. package/tradelayer.js/oldTests/volumeIndex2.js +88 -0
  107. package/tradelayer.js/output_base64.txt +1 -0
  108. package/tradelayer.js/package-lock.json +9967 -0
  109. package/tradelayer.js/package.json +61 -0
  110. package/tradelayer.js/server/index.js +88 -0
  111. package/tradelayer.js/server/litecoind.exe +0 -0
  112. package/tradelayer.js/src/activation.js +303 -0
  113. package/tradelayer.js/src/adjuster.js +77 -0
  114. package/tradelayer.js/src/amm.js +400 -0
  115. package/tradelayer.js/src/base256.js +55 -0
  116. package/tradelayer.js/src/base94.js +79 -0
  117. package/tradelayer.js/src/channels.js +1163 -0
  118. package/tradelayer.js/src/clearing.js +3109 -0
  119. package/tradelayer.js/src/clearlist.js +364 -0
  120. package/tradelayer.js/src/client.js +295 -0
  121. package/tradelayer.js/src/consensus.js +613 -0
  122. package/tradelayer.js/src/contractRegistry.js +964 -0
  123. package/tradelayer.js/src/db.js +89 -0
  124. package/tradelayer.js/src/init.js +24 -0
  125. package/tradelayer.js/src/insurance.js +347 -0
  126. package/tradelayer.js/src/interface.js +218 -0
  127. package/tradelayer.js/src/interfaceExpress.js +178 -0
  128. package/tradelayer.js/src/iou.js +509 -0
  129. package/tradelayer.js/src/listener.js +226 -0
  130. package/tradelayer.js/src/logic.js +1702 -0
  131. package/tradelayer.js/src/main.js +927 -0
  132. package/tradelayer.js/src/marginMap.js +2165 -0
  133. package/tradelayer.js/src/options.js +126 -0
  134. package/tradelayer.js/src/oracle.js +394 -0
  135. package/tradelayer.js/src/orderbook.js +4123 -0
  136. package/tradelayer.js/src/persistence.js +554 -0
  137. package/tradelayer.js/src/property.js +411 -0
  138. package/tradelayer.js/src/reOrg.js +41 -0
  139. package/tradelayer.js/src/scaling.js +145 -0
  140. package/tradelayer.js/src/tally.js +1275 -0
  141. package/tradelayer.js/src/tradeHistoryManager.js +552 -0
  142. package/tradelayer.js/src/txDecoder.js +584 -0
  143. package/tradelayer.js/src/txEncoder.js +610 -0
  144. package/tradelayer.js/src/txIndex.js +502 -0
  145. package/tradelayer.js/src/txUtils.js +1392 -0
  146. package/tradelayer.js/src/types.js +429 -0
  147. package/tradelayer.js/src/validity.js +3077 -0
  148. package/tradelayer.js/src/vaults.js +430 -0
  149. package/tradelayer.js/src/vesting.js +491 -0
  150. package/tradelayer.js/src/volumeIndex.js +618 -0
  151. package/tradelayer.js/src/walletInterface.js +220 -0
  152. package/tradelayer.js/src/walletListener.js +665 -0
  153. package/tradelayer.js/tests/256decode.js +82 -0
  154. package/tradelayer.js/tests/UTXOracle.js +205 -0
  155. package/tradelayer.js/tests/base94test.js +23 -0
  156. package/tradelayer.js/tests/cancelTxTest.js +62 -0
  157. package/tradelayer.js/tests/contractInterfaceTest.js +48 -0
  158. package/tradelayer.js/tests/decimalTest.js +65 -0
  159. package/tradelayer.js/tests/decoderTest.js +100 -0
  160. package/tradelayer.js/tests/deltaCount.js +47 -0
  161. package/tradelayer.js/tests/deltaCount2.js +60 -0
  162. package/tradelayer.js/tests/interfaceTest.js +37 -0
  163. package/tradelayer.js/tests/mainTest.js +53 -0
  164. package/tradelayer.js/tests/makeActivationTest.js +24 -0
  165. package/tradelayer.js/tests/maxHeightTest.js +49 -0
  166. package/tradelayer.js/tests/reverseHash.js +72 -0
  167. package/tradelayer.js/tests/sensitiveConsoleOutput.txt +267 -0
  168. package/tradelayer.js/tests/tallyTest.js +40 -0
  169. package/tradelayer.js/tests/testBuybacks.js +46 -0
  170. package/tradelayer.js/tests/testCodeHash.js +49 -0
  171. package/tradelayer.js/tests/testConsensusHash.js +91 -0
  172. package/tradelayer.js/tests/testDecode.js +30 -0
  173. package/tradelayer.js/tests/testEncodingLengths.js +129 -0
  174. package/tradelayer.js/tests/testGetTx +32 -0
  175. package/tradelayer.js/tests/testGetTx.js +32 -0
  176. package/tradelayer.js/tests/testHexHash.js +32 -0
  177. package/tradelayer.js/tests/testIndexHash.js +35 -0
  178. package/tradelayer.js/tests/testInitContracts.js +38 -0
  179. package/tradelayer.js/tests/testMaxConsensus.js +12 -0
  180. package/tradelayer.js/tests/testMaxSynth.js +44 -0
  181. package/tradelayer.js/tests/testMint.js +21 -0
  182. package/tradelayer.js/tests/testNetwork.js +33 -0
  183. package/tradelayer.js/tests/testOrderbookLoad.js +62 -0
  184. package/tradelayer.js/tests/testRebates.js +32 -0
  185. package/tradelayer.js/tests/testRedeem.js +22 -0
  186. package/tradelayer.js/tests/testTokenTrade.js +39 -0
  187. package/tradelayer.js/tests/testTxBuild.js +42 -0
  188. package/tradelayer.js/tests/testUTXOTrade.js +27 -0
  189. package/tradelayer.js/tests/tokenTradeHistory.js +27 -0
  190. package/tradelayer.js/tests/tradeFutures.js +40 -0
  191. package/tradelayer.js/tests/tradeHistoryExample.js +35 -0
  192. package/tradelayer.js/tests/tradeHistoryLoad.js +15 -0
  193. package/tradelayer.js/tests/txScanTest.js +134 -0
  194. package/tradelayer.js/tests/validateTest.js +136 -0
  195. package/tradelayer.js/tests/vestingTest.js +37 -0
  196. package/tradelayer.js/utils/activateMainnet.js +59 -0
  197. package/tradelayer.js/utils/activateMainnetDoge.js +63 -0
  198. package/tradelayer.js/utils/autocompactdb.js +23 -0
  199. package/tradelayer.js/utils/base64toHex.js +32 -0
  200. package/tradelayer.js/utils/broadcastDoge.js +38 -0
  201. package/tradelayer.js/utils/calcRedeem.js +19 -0
  202. package/tradelayer.js/utils/checkNetwork.js +27 -0
  203. package/tradelayer.js/utils/createAddress.js +48 -0
  204. package/tradelayer.js/utils/createAttestation.js +133 -0
  205. package/tradelayer.js/utils/createContract.js +118 -0
  206. package/tradelayer.js/utils/createOracle.js +94 -0
  207. package/tradelayer.js/utils/createwallet.js +20 -0
  208. package/tradelayer.js/utils/crossFuturesTrades.js +57 -0
  209. package/tradelayer.js/utils/crossTokenTrades.js +62 -0
  210. package/tradelayer.js/utils/dumpPriv.js +29 -0
  211. package/tradelayer.js/utils/generateChannel.js +34 -0
  212. package/tradelayer.js/utils/getInfo.js +21 -0
  213. package/tradelayer.js/utils/hardWipe.js +20 -0
  214. package/tradelayer.js/utils/hexTo64.js +16 -0
  215. package/tradelayer.js/utils/importAddress.js +28 -0
  216. package/tradelayer.js/utils/importpriv.js +20 -0
  217. package/tradelayer.js/utils/issueOracleContract.js +67 -0
  218. package/tradelayer.js/utils/issueTokens.js +41 -0
  219. package/tradelayer.js/utils/listunspent.js +66 -0
  220. package/tradelayer.js/utils/litecoinClient.js +30 -0
  221. package/tradelayer.js/utils/loadwallet.js +20 -0
  222. package/tradelayer.js/utils/publishOracle.js +113 -0
  223. package/tradelayer.js/utils/sendActivation.js +21 -0
  224. package/tradelayer.js/utils/sendChannelContractTrade.js +34 -0
  225. package/tradelayer.js/utils/sendChannelTokenTrade.js +34 -0
  226. package/tradelayer.js/utils/sendCommit.js +24 -0
  227. package/tradelayer.js/utils/sendDoge.js +62 -0
  228. package/tradelayer.js/utils/sendDogeMain.js +67 -0
  229. package/tradelayer.js/utils/sendDogeTx.js +46 -0
  230. package/tradelayer.js/utils/sendLTC.js +63 -0
  231. package/tradelayer.js/utils/sendMainnet.js +62 -0
  232. package/tradelayer.js/utils/sendTransfer.js +19 -0
  233. package/tradelayer.js/utils/sendVestTest.js +88 -0
  234. package/tradelayer.js/utils/sendWithdrawal.js +26 -0
  235. package/tradelayer.js/utils/simpleStart.js +8 -0
  236. package/tradelayer.js/utils/startStop.js +27 -0
  237. package/tradelayer.js/utils/structuredTrades.js +136 -0
  238. package/tradelayer.js/utils/verifySignature.js +90 -0
  239. package/tradelayer.js/utils/verifyWitnessAndScriptPubkey.js +41 -0
  240. package/tradelayer.js/utils/walletCache.js +172 -0
  241. package/tradelayer.js/utils/walletContractInterface.js +48 -0
  242. package/tradelayer.js/utils/walletFetchTxs.js +66 -0
  243. package/tradelayer.js/utils/walletUtils.js +97 -0
  244. package/tradelayer.js/utils/wipeDB.js +55 -0
  245. package/tradelayer.js/utils/wipeDBNotTx.js +50 -0
  246. package/txEncoder.js +529 -0
  247. package/utility.js +28 -0
  248. package/verifymessage.js +38 -0
  249. package/ws-transport.js +311 -0
@@ -0,0 +1,222 @@
1
+ // spam_screamer.js
2
+ 'use strict';
3
+
4
+ require('dotenv').config();
5
+ const WebSocket = require('ws');
6
+
7
+ // prefer local ./tl, fall back to npm 'tradelayer'
8
+ let ApiWrapper;
9
+ try {
10
+ ApiWrapper = require('./algoAPI.js');
11
+ } catch {
12
+ // ApiWrapper = require('tradelayer');
13
+ }
14
+
15
+
16
+ // ---- helpers ----
17
+ const toBool = (v, d = false) =>
18
+ v === undefined
19
+ ? d
20
+ : ['1', 'true', 'yes', 'on'].includes(String(v).trim().toLowerCase());
21
+
22
+ const required = (name, def) => {
23
+ const v = process.env[name] ?? def;
24
+ if (v === undefined || v === '') {
25
+ throw new Error(`Missing required env: ${name}`);
26
+ }
27
+ return v;
28
+ };
29
+
30
+ // ---- ENV CONFIG ----
31
+ const HOST = required('TL_HOST', '172.81.181.19');
32
+ const PORT = Number(process.env.TL_PORT ?? 3001);
33
+ const TESTNET = toBool(process.env.TL_TEST, true);
34
+ const TL_ON = toBool(process.env.TL_TLON, true);
35
+
36
+ const ADDRESS = required(
37
+ 'TL_ADDRESS',
38
+ 'tltc1qn006lvcx89zjnhuzdmj0rjcwnfuqn7eycw40yf'
39
+ );
40
+ const PUBKEY = required(
41
+ 'TL_PUBKEY',
42
+ '03670d8f2109ea83ad09142839a55c77a6f044dab8cb8724949931ae8ab1316677'
43
+ );
44
+ const NETWORK = required('TL_NETWORK', 'LTCTEST');
45
+
46
+ const SIZE = Number(required('SIZE', 0.1));
47
+ const SPAM_RPS = Number(process.env.SPAM_RPS ?? 10);
48
+ const MAX_IN_FLIGHT = Number(process.env.MAX_IN_FLIGHT ?? 200);
49
+
50
+ const CONTRACT = 3 //Number(process.env.ID_FOR_SALE ?? 0);
51
+ const ID_DESIRED = Number(process.env.ID_DESIRED ?? 5);
52
+
53
+ console.log(
54
+ '[env]',
55
+ { HOST, PORT, TESTNET, TL_ON, ADDRESS, PUBKEY, NETWORK, SIZE, SPAM_RPS, MAX_IN_FLIGHT }
56
+ );
57
+
58
+ // ---- INIT API ----
59
+ const api = new ApiWrapper(HOST, PORT, TESTNET, TL_ON, ADDRESS, PUBKEY, NETWORK);
60
+
61
+ // ---- Binance WebSocket feed (LTC/USDT) ----
62
+ const BINANCE_WS_URL = 'wss://stream.binance.com:9443/ws/ltcusdt@depth20@100ms';
63
+ const LEVEL_OFFSET = Number(process.env.LEVEL_OFFSET ?? 2);
64
+
65
+ let lastBook = { bids: [], asks: [] };
66
+ let bookReady = false;
67
+
68
+ function startBinanceFeed() {
69
+ const ws = new WebSocket(BINANCE_WS_URL);
70
+ ws.on('open', () => console.log('[binance] connected'));
71
+ ws.on('message', msg => {
72
+ const data = JSON.parse(msg);
73
+ if (!data.bids || !data.asks) return;
74
+ lastBook = {
75
+ bids: data.bids.map(([p, q]) => [Number(p), Number(q)]),
76
+ asks: data.asks.map(([p, q]) => [Number(p), Number(q)]),
77
+ };
78
+ bookReady = true;
79
+ });
80
+ ws.on('close', () => {
81
+ console.warn('[binance] socket closed, retrying...');
82
+ setTimeout(startBinanceFeed, 2000);
83
+ });
84
+ ws.on('error', e => console.error('[binance] error', e.message));
85
+ }
86
+
87
+ function pickPrice(action) {
88
+ if (!bookReady) return null;
89
+ if (action === 'BUY') {
90
+ const asks = lastBook.asks;
91
+ const idx = Math.min(LEVEL_OFFSET, asks.length - 1);
92
+ return asks[idx]?.[0];
93
+ } else {
94
+ const bids = lastBook.bids;
95
+ const idx = Math.min(LEVEL_OFFSET, bids.length - 1);
96
+ return bids[idx]?.[0];
97
+ }
98
+ }
99
+
100
+ // ---- Build TL order ----
101
+ function buildOrder(action, price) {
102
+ return {
103
+ type: 'FUTURES',
104
+ action,
105
+ // Set as limit order pegged to Binance depth
106
+ isLimitOrder: true,
107
+ keypair: {
108
+ address: ADDRESS,
109
+ pubkey: PUBKEY,
110
+ },
111
+ props: {
112
+ contract_id: CONTRACT,
113
+ price,
114
+ amount: SIZE,
115
+ transfer: false,
116
+ network: NETWORK
117
+ },
118
+ };
119
+ }
120
+
121
+ // ---- SPAMMER STATE ----
122
+ let inflight = 0;
123
+ let sent = 0;
124
+ let failed = 0;
125
+ let seq = 0;
126
+ let running = true;
127
+
128
+ const delay = ms => new Promise(res => setTimeout(res, ms));
129
+ async function fireOne() {
130
+ if (!running) return;
131
+ if (inflight >= MAX_IN_FLIGHT) return;
132
+ if (!bookReady) return;
133
+
134
+ inflight++;
135
+ sent++;
136
+ const n = seq++;
137
+ const action = n % 2 === 0 ? 'BUY' : 'SELL';
138
+ const price = pickPrice(action);
139
+ if (!price) {
140
+ inflight--;
141
+ return;
142
+ }
143
+
144
+ const order = buildOrder(action, price);
145
+ const requiredLtc = 0.00002 //estimateLtcForOrder(order);
146
+
147
+ try {
148
+ await api.funding.withReservation(
149
+ {
150
+ ltc: requiredLtc,
151
+ contracts: { [order.props.contract_id]: order.props.amount },
152
+ },
153
+ async (lockId) => {
154
+ const t0 = Date.now();
155
+ const uuid = await api.sendOrder(order);
156
+ const dt = Date.now() - t0;
157
+
158
+ // For now we *release* on order send, and let the real funding step
159
+ // re-reserve when it actually builds the on-chain tx.
160
+ // If you want to be stricter, return { commit: true } only after
161
+ // walletListener confirms a funding tx.
162
+ return { commit: false };
163
+ }
164
+ );
165
+ } catch (e) {
166
+ failed++;
167
+ console.error(`[err] reservation/send failed: ${e?.message || e}`);
168
+ } finally {
169
+ inflight--;
170
+ }
171
+ }
172
+
173
+ function estimateLtcForOrder(order) {
174
+ // very rough: notional + fee buffer; refine later
175
+ const px = Number(order.props.price || 0);
176
+ const amt = Number(order.props.amount || 0);
177
+
178
+ const notional = px * amt; // if fully margined you can shrink this
179
+ const feeBuf = 0.001; // 0.001 LTC fee buffer, tune properly
180
+ return notional * 0.1 + feeBuf; // e.g. 1% margin + fee
181
+ }
182
+
183
+
184
+ async function main() {
185
+ console.log('[cfg] connecting...', { HOST, PORT, TESTNET, TL_ON, NETWORK });
186
+ startBinanceFeed();
187
+ await api.delay(1500);
188
+
189
+ try {
190
+ const me = api.getMyInfo?.();
191
+ if (me?.address) console.log('[me]', me.address);
192
+ } catch {}
193
+
194
+ console.log(`[spam] starting screamer: SPAM_RPS=${SPAM_RPS}, MAX_IN_FLIGHT=${MAX_IN_FLIGHT}, SIZE=${SIZE}`);
195
+
196
+ const intervalMs = 1000 / Math.max(SPAM_RPS, 1);
197
+ const interval = setInterval(() => {
198
+ if (!running) return;
199
+ fireOne(); // fire-and-forget
200
+ }, intervalMs);
201
+
202
+ const shutdown = async () => {
203
+ if (!running) return;
204
+ running = false;
205
+ clearInterval(interval);
206
+ console.log('[shutdown] waiting for inflight orders to finish...');
207
+ while (inflight > 0) {
208
+ console.log(`[shutdown] inflight=${inflight} ...`);
209
+ await delay(500);
210
+ }
211
+ console.log(`[stats] sent=${sent}, failed=${failed}, max_inflight=${MAX_IN_FLIGHT}`);
212
+ process.exit(0);
213
+ };
214
+
215
+ process.on('SIGINT', shutdown);
216
+ process.on('SIGTERM', shutdown);
217
+ }
218
+
219
+ main().catch(e => {
220
+ console.error('[fatal]', e);
221
+ process.exit(1);
222
+ });
@@ -0,0 +1,2 @@
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
@@ -0,0 +1,2 @@
1
+ # tradelayer.js
2
+ .js rebuild of TradeLayer protocol
@@ -0,0 +1,6 @@
1
+ var testAdmin = "tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8"
2
+
3
+ // Example usage
4
+ const tokenData = { /* token details */ };
5
+ const tokenCreationMessage = await createAndRegisterToken(tokenData);
6
+ console.log(tokenCreationMessage);
@@ -0,0 +1,23 @@
1
+ const base58 = require('base-58');
2
+
3
+ // Function to encode an integer to base58
4
+ function encodeBase58(integer) {
5
+ return base58.encode(Buffer.from(integer.toString()));
6
+ }
7
+
8
+ // Function to decode a base58 string to an integer
9
+ function decodeBase58(base58String) {
10
+ return parseInt(Buffer.from(base58.decode(base58String)).toString());
11
+ }
12
+
13
+ // Example Usage:
14
+ const amount = 213456789;
15
+ const encodedBase58 = encodeBase58(amount);
16
+ //console.log("Encoded Base58:", encodedBase58);
17
+
18
+ const decodedAmount = decodeBase58(encodedBase58);
19
+ //console.log("Decoded Amount:", decodedAmount);
20
+
21
+ test('base58 encoder', () => {
22
+ expect(amount).toBe(decodedAmount);
23
+ });
@@ -0,0 +1,16 @@
1
+ function decodeBase64(encodedString) {
2
+ // Buffer is used in Node.js to handle binary data
3
+ // 'base64' specifies the current encoding of the string to be decoded
4
+ const decodedString = Buffer.from(encodedString, 'base64').toString('utf-8');
5
+ return decodedString;
6
+ }
7
+
8
+ // Example usage
9
+ const encodedString = "eyJzIjogeyJBQVBMIjogMC4yNTEzMzQyMjgyNzc5NTgzNywgIkdPT0ciOiAwLjMzMzQ0ODg2MjYwMDY5NjcsICJBTVpOIjogMC4zNzQwODEwOTg4Nzk4MTUyLCAiTlZEQSI6IDAuNTM4MDU1NTA1MTU3MTA2MiwgIlRTTEEiOiAwLjU5Nzg3OTcxNzcxNTMwNjEsICJMTFkiOiAwLjI3NjY4OTgzNjIwNDE4ODI0LCAiSlBNIjogMC4yMTc2OTk1ODA0ODg2OTkyMiwgIlhPTSI6IDAuMjYyMjk2MTMzMzUxNzYzMiwgIkFWR08iOiAwLjMyNzYyMDM5NTAwODc0MTQ2LCAiViI6IDAuMTg4NDk2MDM0NDY5ODMzNjIsICJKTkoiOiAwLjE2NDcwMTExMTkyMTc2NDY4LCAiUEciOiAwLjE1MDIwMjgzNDg2MTMzMTQzLCAiTUEiOiAwLjIwODU5MTc5MTUxNjIyODcsICJIRCI6IDAuMjM1MTYzMzg1NTE5OTkwNzgsICJBREJFIjogMC4zNDkxNjc1NzA2MzgxMDAzLCAiTVJLIjogMC4xOTMyODA0OTI1MzQyNTk5NywgIkNPU1QiOiAwLjIwMzk5MjQyMjMzODM4OTc3LCAiQ1ZYIjogMC4yNDQyNTIzMTQxMDMyMzU3LCAiQUJCViI6IDAuMTk4Mzg2MTI4Nzc5NTcyNSwgIldNVCI6IDAuMTU1Mjg2MDI4ODQ2OTMxNzcsICJQRVAiOiAwLjE1MTE0NzI4MzUxMDg2NjQsICJLTyI6IDAuMTQxOTI1MjE3OTc0MDMzMTgsICJDU0NPIjogMC4xOTc5ODI0NDkzNTI1NTk0MywgIkNSTSI6IDAuMzQzNjEzNzk5MTgwNzUyOTcsICJBQ04iOiAwLjI2MzIyOTE3NzcxMzgxMzE2LCAiTkZMWCI6IDAuNDIyNTg1NDIwODM0MzQxMzYsICJNQ0QiOiAwLjEzOTczNTQwNzAwNTU0NTcsICJMSU4iOiAwLjIwMjgzMzk4NDQxMTQxMjU3LCAiQU1EIjogMC40OTM5NTA1MDA2NzUxNjQ2LCAiQkFDIjogMC4yNjIzODI1OTU5Mzc4NjMwNiwgIk9SQ0wiOiAwLjI3NzIwNTIwODc1MDU1NDY1LCAiQ01DU0EiOiAwLjI1Mjc4NTQ4MjI2MDkyNTg0LCAiUEZFIjogMC4yMTc2ODkwODU4ODU3MjUzMywgIkFCVCI6IDAuMjExOTMyMzI3MDAzNzgxNTYsICJJTlRDIjogMC4zODg4MDQzMDQyOTQwOTQ0NiwgIkRJUyI6IDAuMzE3MjM5OTEwMDg4NzYxNCwgIlZaIjogMC4yNDE0MTAwMDc1NjYwMjIwMiwgIldGQyI6IDAuMjc4NzY0NjE0MjI2NDY3ODcsICJJTlRVIjogMC4zNDQ3NzIxMzkyNTk5OTcyLCAiQU1HTiI6IDAuMjExMTM1OTk4NjY1MzI5NDIsICJQTSI6IDAuMTc2NTEzMzAwNTU1MDk4NDIsICJRQ09NIjogMC4zNTk3ODQ3OTE0MTc0MTcxNSwgIkNPUCI6IDAuMzE0OTU4MTAyNjg5MDI4NCwgIklCTSI6IDAuMTc2OTc4Nzg1MTM2NTc4MDUsICJTUFkiOiAwLjE1NzAwNjg0MTM3NTMzMzIyLCAiUVFRIjogMC4yMTMxMzgxNTM1OTM0NzY3NH0sICJjIjogeyJBQVBMMjMxMjI5QzAwMTg1MDAwIjogeyJTIjogMTg4LjAxLCAiSyI6IDE4NS4wfSwgIkdPT0cyMzEyMjlDMDAxMzYwMDAiOiB7IlMiOiAxMzYuMzgsICJLIjogMTM2LjB9LCAiQU1aTjIzMTIyOUMwMDE0MzAwMCI6IHsiUyI6IDE0My4yLCAiSyI6IDE0My4wfSwgIk5WREEyMzEyMjlDMDA0ODUwMDAiOiB7IlMiOiA0ODguODgsICJLIjogNDg1LjB9LCAiVFNMQTIzMTIyOUMwMDI0MDAwMCI6IHsiUyI6IDI0Mi44NCwgIksiOiAyNDAuMH0sICJMTFkyMzEyMjlDMDA1ODUwMDAiOiB7IlMiOiA1ODguNTQsICJLIjogNTg1LjB9LCAiSlBNMjMxMjI5QzAwMTQ5MDAwIjogeyJTIjogMTQ5Ljc0LCAiSyI6IDE0OS4wfSwgIlhPTTIzMTIyOVAwMDEwNDAwMCI6IHsiUyI6IDEwMy42NiwgIksiOiAxMDQuMH0sICJBVkdPMjMxMjI5QzAwOTc1MDAwIjogeyJTIjogOTc1LjQsICJLIjogOTc1LjB9LCAiVjIzMTIyOUMwMDI0NTAwMCI6IHsiUyI6IDI0OC4xMSwgIksiOiAyNDUuMH0sICJKTkoyMzEyMjlDMDAxNDUwMDAiOiB7IlMiOiAxNDguOCwgIksiOiAxNDUuMH0sICJQRzIzMTIyOVAwMDE0NTAwMCI6IHsiUyI6IDE1MS40MiwgIksiOiAxNDUuMH0sICJNQTIzMTIyOVAwMDM5NTAwMCI6IHsiUyI6IDM5Ni44MywgIksiOiAzOTUuMH0sICJIRDIzMTIyOUMwMDMwNTAwMCI6IHsiUyI6IDMwOC4xOSwgIksiOiAzMDUuMH0sICJBREJFMjMxMjI5UDAwNTkwMDAwIjogeyJTIjogNTk1LjMxLCAiSyI6IDU5MC4wfSwgIk1SSzIzMTIyOVAwMDEwMjAwMCI6IHsiUyI6IDEwMS4zNSwgIksiOiAxMDIuMH0sICJDT1NUMjMxMjI5QzAwNTk1MDAwIjogeyJTIjogNTk2Ljc4LCAiSyI6IDU5NS4wfSwgIkNWWDIzMTIyOUMwMDE0NTAwMCI6IHsiUyI6IDE0NS41NiwgIksiOiAxNDUuMH0sICJBQkJWMjMxMjI5UDAwMTM4MDAwIjogeyJTIjogMTM3LjYsICJLIjogMTM4LjB9LCAiV01UMjMxMjI5QzAwMTY1MDAwIjogeyJTIjogMTY5Ljc4LCAiSyI6IDE2NS4wfSwgIlBFUDIzMTIyOUMwMDE2NTAwMCI6IHsiUyI6IDE2Ny4yNSwgIksiOiAxNjUuMH0sICJLTzIzMTIyOUMwMDA1NzAwMCI6IHsiUyI6IDU3LjIxLCAiSyI6IDU3LjB9LCAiQ1NDTzIzMTIyOUMwMDA1MzAwMCI6IHsiUyI6IDUzLjI4LCAiSyI6IDUzLjB9LCAiQ1JNMjMxMjI5UDAwMjIwMDAwIjogeyJTIjogMjE5LjQyLCAiSyI6IDIyMC4wfSwgIkFDTjIzMTIyOUMwMDMzNTAwMCI6IHsiUyI6IDMyNS41LCAiSyI6IDMzNS4wfSwgIk5GTFgyMzEyMjlDMDA0NjAwMDAiOiB7IlMiOiA0NjEuOTQsICJLIjogNDYwLjB9LCAiTUNEMjMxMjI5UDAwMjY1MDAwIjogeyJTIjogMjcwLjM5LCAiSyI6IDI2NS4wfSwgIkFNRDIzMTIyOVAwMDExOTAwMCI6IHsiUyI6IDExOC4wLCAiSyI6IDExOS4wfSwgIkJBQzIzMTIyOUMwMDAzMDAwMCI6IHsiUyI6IDI5LjYyLCAiSyI6IDMwLjB9LCAiT1JDTDIzMTIyOVAwMDExMTAwMCI6IHsiUyI6IDExNC4wNiwgIksiOiAxMTEuMH0sICJDTUNTQTIzMTIyOUMwMDA0MjAwMCI6IHsiUyI6IDQyLjUzLCAiSyI6IDQyLjB9LCAiUEZFMjMxMjI5QzAwMDMwMDAwIjogeyJTIjogMzAuMTksICJLIjogMzAuMH0sICJBQlQyMzEyMjlDMDAwOTgwMDAiOiB7IlMiOiA5OC4wLCAiSyI6IDk4LjB9LCAiSU5UQzIzMTIyOUMwMDA0MDAwMCI6IHsiUyI6IDQwLjYxLCAiSyI6IDQwLjB9LCAiRElTMjMxMjI5QzAwMDkzMDAwIjogeyJTIjogOTMuOTMsICJLIjogOTMuMH0sICJWWjIzMTIyOUMwMDAzNTAwMCI6IHsiUyI6IDM2LjAsICJLIjogMzUuMH0sICJXRkMyMzEyMjlDMDAwNDIwMDAiOiB7IlMiOiA0Mi44NCwgIksiOiA0Mi4wfSwgIkFNR04yMzEyMjlDMDAyNzAwMDAiOiB7IlMiOiAyNzMuMDMsICJLIjogMjcwLjB9LCAiUUNPTTIzMTIyOUMwMDEyODAwMCI6IHsiUyI6IDEyOC45MiwgIksiOiAxMjguMH0sICJDT1AyMzEyMjlQMDAxMTYwMDAiOiB7IlMiOiAxMTUuMDMsICJLIjogMTE2LjB9LCAiSUJNMjMxMjI5QzAwMTUyNTAwIjogeyJTIjogMTUyLjU4LCAiSyI6IDE1Mi41fSwgIlNQWTIzMTIyOUMwMDQ0OTAwMCI6IHsiUyI6IDQ0OS42OCwgIksiOiA0NDkuMH0sICJRUVEyMzEyMjlDMDAzNDkwMDAiOiB7IlMiOiAzODUuNjIsICJLIjogMzQ5LjB9fX0"
10
+ const decodedString = decodeBase64(encodedString);
11
+
12
+ //console.log(decodedString);
13
+
14
+ test('base64', async () => {
15
+ expect(decodeBase64(encodedString)[2]).toBe('s')
16
+ })
@@ -0,0 +1,140 @@
1
+ const litecoin = require('litecoin');
2
+ const fs = require('fs');
3
+ const json = require('big-json');
4
+
5
+ const client = new litecoin.Client({
6
+ host: '127.0.0.1',
7
+ port: 8332,
8
+ user: 'user',
9
+ pass: 'pass',
10
+ timeout: 10000
11
+ });
12
+
13
+ async function decodeOPReturnPayload(hexPayload) {
14
+ try {
15
+ const decodedData = Buffer.from(hexPayload, 'hex').toString('utf8');
16
+ return decodedData;
17
+ } catch (error) {
18
+ console.error('Error decoding payload:', error);
19
+ return null;
20
+ }
21
+ }
22
+
23
+ async function extractBlockData(startHeight) {
24
+ try {
25
+ const chainTip = await client.getBlockCount();
26
+ const chainHeight = chainTip;
27
+
28
+ const blockData = await getBlockData(startHeight, chainHeight);
29
+
30
+ if (blockData) {
31
+ console.log('Block data extraction completed.');
32
+ await extractProtocolTx(startHeight, blockData);
33
+ }
34
+ } catch (error) {
35
+ console.error('Error retrieving chain tip:', error);
36
+ }
37
+ }
38
+
39
+ async function getBlockData(height, chainHeight) {
40
+ try {
41
+ const blockHash = await client.getBlockHash(height);
42
+ const currentBlock = await client.getBlock(blockHash);
43
+
44
+ return currentBlock;
45
+ } catch (error) {
46
+ console.error('Error retrieving block data:', error);
47
+ return null;
48
+ }
49
+ }
50
+
51
+ async function makeFile(filename, pojo) {
52
+ const stringifyStream = json.createStringifyStream({
53
+ body: pojo
54
+ });
55
+
56
+ stringifyStream.on('data', function (strChunk) {
57
+ fs.appendFile(filename, strChunk, function (err) {
58
+ if (err) {
59
+ console.error('Error writing to file:', err);
60
+ }
61
+ });
62
+ });
63
+ }
64
+
65
+ async function extractProtocolTx(start, blockData) {
66
+ if (!blockData) {
67
+ console.error('Invalid block data. Aborting.');
68
+ return;
69
+ }
70
+
71
+ const indexPlaceholder = start;
72
+ const placement = start - startHeight;
73
+ console.log(placement, start);
74
+
75
+ const thisBlock = blockData[placement];
76
+
77
+ if (start >= startHeight + 200000) {
78
+ const obj = JSON.stringify(protocolBlocks);
79
+ await makeFile('protocolTxIndex.json', protocolBlocks);
80
+ console.log('ta da!!');
81
+ return;
82
+ }
83
+
84
+ await loopThroughBlock(thisBlock, 0);
85
+ }
86
+
87
+ async function loopThroughBlock(block, i) {
88
+ if (!block) {
89
+ console.error('Block is undefined. Aborting.');
90
+ return;
91
+ }
92
+
93
+ console.log(block.height, i, block.tx.length);
94
+
95
+ if (i >= block.tx.length) {
96
+ console.log('Block processing completed.');
97
+ await extractProtocolTx(block.height + 1, blockData);
98
+ return;
99
+ }
100
+
101
+ const tx = block.tx[i];
102
+
103
+ if (!tx || tx === '') {
104
+ console.log('Skipping empty transaction.');
105
+ await loopThroughBlock(block, i + 1);
106
+ return;
107
+ }
108
+
109
+ try {
110
+ const rawtx = await client.getRawTransaction(tx, true);
111
+ let confirmations;
112
+
113
+ try {
114
+ confirmations = rawtx.confirmations;
115
+ } catch {
116
+ console.error('Error getting confirmations.');
117
+ return await loopThroughBlock(block, i + 1);
118
+ }
119
+
120
+ const thisConfirmations = confirmations;
121
+
122
+ for (let v = 0; v < rawtx.vout.length; v++) {
123
+ // ... Rest of your code
124
+ }
125
+
126
+ // Move to the next transaction
127
+ await loopThroughBlock(block, i + 1);
128
+ } catch (error) {
129
+ console.error('Error processing transaction:', error);
130
+ // Handle the error gracefully if necessary
131
+ await loopThroughBlock(block, i + 1);
132
+ }
133
+ }
134
+
135
+ async function main() {
136
+ const startHeight = 2098224;
137
+ await extractBlockData(startHeight);
138
+ }
139
+
140
+ main();
@@ -0,0 +1,25 @@
1
+ const TallyMap = require('./tally.js');
2
+ const Logic = require('./logic.js');
3
+ const expressInterface = require('./interfaceExpress.js');
4
+
5
+ async function testSendTLVEST() {
6
+ // Initialize components
7
+ const tallyMap = TallyMap.getInstance();
8
+
9
+ // New address generated from the sendTransactionTest script
10
+ const newAddress = 'LYmNegGLoo1Vf4ZUs9k2yskfUgacRS678j'; // Replace with the actual generated address
11
+
12
+ // Wait for a few minutes to allow the transaction to be processed
13
+ /*console.log('Waiting for transaction to be processed...');
14
+ await new Promise(resolve => setTimeout(resolve, 3 * 60 * 1000)); // 3 minutes*/
15
+
16
+ // Check balances
17
+ const TLVESTPropertyId = 2; // Assuming TLVEST has property ID 2
18
+ const newAddressBalance = await expressInterface.getAllBalancesForAddress(newAddress);
19
+ console.log('New address balance:', newAddressBalance);
20
+
21
+ // Assertions (pseudo-code)
22
+ // assert(newAddressBalance.vesting === 1, 'Vesting balance should be 1 TL');
23
+ }
24
+
25
+ testSendTLVEST();
@@ -0,0 +1,151 @@
1
+ const crypto = require('crypto');
2
+
3
+ // Simulate the data structures and functions used in the C++ code
4
+ const mp_tally_map = new Map(); // Simulate tally map
5
+ const my_offers = new Map(); // Simulate offer map
6
+ const my_accepts = new Map(); // Simulate accept map
7
+ const my_crowds = new Map(); // Simulate crowd map
8
+ const msc_debug_consensus_hash = false; // Simulate debug flag
9
+
10
+ class CMPTally {
11
+ constructor() {
12
+ this.balances = new Map();
13
+ }
14
+
15
+ getMoney(propertyId, type) {
16
+ const propertyBalances = this.balances.get(propertyId);
17
+ if (propertyBalances && propertyBalances[type]) {
18
+ return propertyBalances[type];
19
+ }
20
+ return 0;
21
+ }
22
+
23
+ init() {
24
+ // Simulate initialization
25
+ }
26
+
27
+ next() {
28
+ // Simulate iterating over property IDs
29
+ return 0;
30
+ }
31
+ }
32
+
33
+ class CMPOffer {
34
+ constructor() {
35
+ // Simulate offer properties
36
+ }
37
+
38
+ getHash() {
39
+ return crypto.createHash('sha256').update('offerdata').digest('hex');
40
+ }
41
+
42
+ // Implement other methods as needed
43
+ }
44
+
45
+ class CMPAccept {
46
+ constructor() {
47
+ // Simulate accept properties
48
+ }
49
+
50
+ getHash() {
51
+ return crypto.createHash('sha256').update('acceptdata').digest('hex');
52
+ }
53
+
54
+ // Implement other methods as needed
55
+ }
56
+
57
+ class CMPCrowd {
58
+ constructor() {
59
+ // Simulate crowd properties
60
+ }
61
+
62
+ // Implement other methods as needed
63
+ }
64
+
65
+ class CMPSPInfo {
66
+ static getArgs() {
67
+ // Simulate getting command line arguments
68
+ return [];
69
+ }
70
+ }
71
+
72
+ // Helper function to generate a consensus string for hashing
73
+ function generateConsensusString(dataObj, ...args) {
74
+ // Implement the logic to generate the consensus string
75
+ return ''; // Return a placeholder for now
76
+ }
77
+
78
+ // Simulate a lock mechanism
79
+ const cs_tally = {
80
+ lock() {
81
+ // Implement locking mechanism
82
+ },
83
+ };
84
+
85
+ // Simulate printing to log
86
+ function printToLog(message) {
87
+ // Implement logging
88
+ console.log(message);
89
+ }
90
+
91
+ // Translated C++ function to JavaScript
92
+ function getConsensusHash() {
93
+ const hasher = crypto.createHash('sha256');
94
+
95
+ cs_tally.lock();
96
+
97
+ if (msc_debug_consensus_hash) printToLog('Beginning generation of current consensus hash...\n');
98
+
99
+ // Balances - Loop through the tally map and update the hash context
100
+ for (const [address, tally] of mp_tally_map.entries()) {
101
+ tally.init();
102
+ let propertyId = 0;
103
+ while ((propertyId = tally.next()) !== 0) {
104
+ const dataStr = generateConsensusString(tally, address, propertyId);
105
+ if (dataStr === '') continue;
106
+ if (msc_debug_consensus_hash) printToLog(`Adding balance data to consensus hash: ${dataStr}\n`);
107
+ hasher.update(dataStr);
108
+ }
109
+ }
110
+
111
+ // Implement the rest of the logic for DEx offers, accepts, crowdsales, and properties
112
+
113
+ // Extract the final result and return the hash
114
+ const consensusHash = hasher.digest('hex');
115
+ if (msc_debug_consensus_hash) printToLog(`Finished generation of consensus hash. Result: ${consensusHash}\n`);
116
+
117
+ return consensusHash;
118
+ }
119
+
120
+ function getBalancesHash(hashPropertyId) {
121
+ const hasher = crypto.createHash('sha256');
122
+
123
+ cs_tally.lock();
124
+
125
+ // Loop through the tally map and update the hash context for a specific property
126
+ for (const [address, tally] of mp_tally_map.entries()) {
127
+ tally.init();
128
+ let propertyId = 0;
129
+ while ((propertyId = tally.next()) !== 0) {
130
+ if (propertyId !== hashPropertyId) continue;
131
+ const dataStr = generateConsensusString(tally, address, propertyId);
132
+ if (dataStr === '') continue;
133
+ if (msc_debug_consensus_hash) printToLog(`Adding data to balances hash: ${dataStr}\n`);
134
+ hasher.update(dataStr);
135
+ }
136
+ }
137
+
138
+ const balancesHash = hasher.digest('hex');
139
+
140
+ return balancesHash;
141
+ }
142
+
143
+ // The translation is incomplete; you need to implement the missing parts for DEx, crowdsales, and properties.
144
+
145
+ // Usage
146
+ const consensusHash = getConsensusHash();
147
+ console.log(`Consensus Hash: ${consensusHash}`);
148
+
149
+ const propertyIdToHash = 1; // Replace with the property ID you want to hash
150
+ const balancesHash = getBalancesHash(propertyIdToHash);
151
+ console.log(`Balances Hash for Property ID ${propertyIdToHash}: ${balancesHash}`);