@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.
- package/.claude/settings.local.json +13 -0
- package/.claude/skills/tl-algo/SKILL.md +255 -0
- package/.gitattributes +2 -0
- package/.github/workflows/publish.yaml +26 -0
- package/4mm.js +163 -0
- package/LICENSE +21 -0
- package/NPMSwapRefactor.zip +0 -0
- package/README.md +217 -0
- package/address.sh +26 -0
- package/algoAPI.js +581 -0
- package/analyzepsbt.js +92 -0
- package/apiEx.js +99 -0
- package/bb_hyperscalper.js +290 -0
- package/bbo_demo.js +111 -0
- package/buyer.js +622 -0
- package/client.js +50 -0
- package/createTxTest.js +26 -0
- package/createWallet.js +75 -0
- package/daytrader.js +531 -0
- package/decodeTest.js +69 -0
- package/fundingManager.js +144 -0
- package/index.js +4 -0
- package/listener.js +27 -0
- package/litecoreTxBuilder.js +1128 -0
- package/mmEx.js +356 -0
- package/networks.js +51 -0
- package/orderbook.js +200 -0
- package/package.json +34 -0
- package/perTradeQueue.js +36 -0
- package/projectsTLNPMTLNPM/package-lock.json +162 -0
- package/projectsTLNPMTLNPM/package.json +5 -0
- package/quick.js +32 -0
- package/quickFut.js +37 -0
- package/quickSell.js +37 -0
- package/relayerClient.js +117 -0
- package/run4mm.js +80 -0
- package/run_bbo_tracker.js +241 -0
- package/seller.js +443 -0
- package/session.js +45 -0
- package/setup-lin-ltc.sh +139 -0
- package/setup-lin.sh +203 -0
- package/setup-win-ltc.bat +108 -0
- package/setup-win.bat +167 -0
- package/spam_screamer_futures.js +222 -0
- package/tradelayer.js/.gitattributes +2 -0
- package/tradelayer.js/README.md +2 -0
- package/tradelayer.js/oldTests/activationTest.js +6 -0
- package/tradelayer.js/oldTests/base58.test.js +23 -0
- package/tradelayer.js/oldTests/base64Decode.test.js +16 -0
- package/tradelayer.js/oldTests/blocksRefactor.js +140 -0
- package/tradelayer.js/oldTests/checkVestBalance.js +25 -0
- package/tradelayer.js/oldTests/consensusHashProto.js +151 -0
- package/tradelayer.js/oldTests/contractOrderbook.js +243 -0
- package/tradelayer.js/oldTests/createPayload.js +0 -0
- package/tradelayer.js/oldTests/createTestnetAddr.js +43 -0
- package/tradelayer.js/oldTests/decode.js +205 -0
- package/tradelayer.js/oldTests/decodeTest.js +50 -0
- package/tradelayer.js/oldTests/displayTallyMap.js +19 -0
- package/tradelayer.js/oldTests/encodeDecode.js +340 -0
- package/tradelayer.js/oldTests/expressTest.js +29 -0
- package/tradelayer.js/oldTests/extractBlocksVanilla.js +214 -0
- package/tradelayer.js/oldTests/extractBlocksVanillaa.js +179 -0
- package/tradelayer.js/oldTests/extractPubkeyTest.js +60 -0
- package/tradelayer.js/oldTests/fillInputCacheProto.js +111 -0
- package/tradelayer.js/oldTests/getRawTxTest.js +22 -0
- package/tradelayer.js/oldTests/indexTest.js +26 -0
- package/tradelayer.js/oldTests/initTokensTest.js +32 -0
- package/tradelayer.js/oldTests/interfaceChild.js +129 -0
- package/tradelayer.js/oldTests/listenerChild.js +112 -0
- package/tradelayer.js/oldTests/opdecode.js +26 -0
- package/tradelayer.js/oldTests/options.js +79 -0
- package/tradelayer.js/oldTests/optxtest.js +116 -0
- package/tradelayer.js/oldTests/optxtest1.js +64 -0
- package/tradelayer.js/oldTests/oracle.test.js +32 -0
- package/tradelayer.js/oldTests/orderbook.test.js +36 -0
- package/tradelayer.js/oldTests/parsing.js +93 -0
- package/tradelayer.js/oldTests/payload.js +13 -0
- package/tradelayer.js/oldTests/persistenceUnitTest.js +23 -0
- package/tradelayer.js/oldTests/property.test.js +53 -0
- package/tradelayer.js/oldTests/propertyLevel.js +75 -0
- package/tradelayer.js/oldTests/propertyTest.js +32 -0
- package/tradelayer.js/oldTests/queryAddressTest.js +17 -0
- package/tradelayer.js/oldTests/salter.js +14 -0
- package/tradelayer.js/oldTests/tally.js +81 -0
- package/tradelayer.js/oldTests/tally.test.js +48 -0
- package/tradelayer.js/oldTests/tally2.js +124 -0
- package/tradelayer.js/oldTests/tally3.js +142 -0
- package/tradelayer.js/oldTests/tallyDiag.js +38 -0
- package/tradelayer.js/oldTests/testGetRaw.js +40 -0
- package/tradelayer.js/oldTests/testHexConvert.js +47 -0
- package/tradelayer.js/oldTests/testNewEncoding.js +96 -0
- package/tradelayer.js/oldTests/testNewEncoding2.js +113 -0
- package/tradelayer.js/oldTests/testNewEncoding3 +112 -0
- package/tradelayer.js/oldTests/testNewEncoding3.js +168 -0
- package/tradelayer.js/oldTests/testOPReturn.js +102 -0
- package/tradelayer.js/oldTests/testPayload.js +23 -0
- package/tradelayer.js/oldTests/testRaw.js +50 -0
- package/tradelayer.js/oldTests/testSendTooMuch.js +20 -0
- package/tradelayer.js/oldTests/testTxBuild +28 -0
- package/tradelayer.js/oldTests/testTxBuild.js +42 -0
- package/tradelayer.js/oldTests/tokenOrderbook.js +243 -0
- package/tradelayer.js/oldTests/txUtilsA.js +515 -0
- package/tradelayer.js/oldTests/validityUnitTest.js +53 -0
- package/tradelayer.js/oldTests/vaults.js +72 -0
- package/tradelayer.js/oldTests/volumeIndex.js +117 -0
- package/tradelayer.js/oldTests/volumeIndex2.js +88 -0
- package/tradelayer.js/output_base64.txt +1 -0
- package/tradelayer.js/package-lock.json +9967 -0
- package/tradelayer.js/package.json +61 -0
- package/tradelayer.js/server/index.js +88 -0
- package/tradelayer.js/server/litecoind.exe +0 -0
- package/tradelayer.js/src/activation.js +303 -0
- package/tradelayer.js/src/adjuster.js +77 -0
- package/tradelayer.js/src/amm.js +400 -0
- package/tradelayer.js/src/base256.js +55 -0
- package/tradelayer.js/src/base94.js +79 -0
- package/tradelayer.js/src/channels.js +1163 -0
- package/tradelayer.js/src/clearing.js +3109 -0
- package/tradelayer.js/src/clearlist.js +364 -0
- package/tradelayer.js/src/client.js +295 -0
- package/tradelayer.js/src/consensus.js +613 -0
- package/tradelayer.js/src/contractRegistry.js +964 -0
- package/tradelayer.js/src/db.js +89 -0
- package/tradelayer.js/src/init.js +24 -0
- package/tradelayer.js/src/insurance.js +347 -0
- package/tradelayer.js/src/interface.js +218 -0
- package/tradelayer.js/src/interfaceExpress.js +178 -0
- package/tradelayer.js/src/iou.js +509 -0
- package/tradelayer.js/src/listener.js +226 -0
- package/tradelayer.js/src/logic.js +1702 -0
- package/tradelayer.js/src/main.js +927 -0
- package/tradelayer.js/src/marginMap.js +2165 -0
- package/tradelayer.js/src/options.js +126 -0
- package/tradelayer.js/src/oracle.js +394 -0
- package/tradelayer.js/src/orderbook.js +4123 -0
- package/tradelayer.js/src/persistence.js +554 -0
- package/tradelayer.js/src/property.js +411 -0
- package/tradelayer.js/src/reOrg.js +41 -0
- package/tradelayer.js/src/scaling.js +145 -0
- package/tradelayer.js/src/tally.js +1275 -0
- package/tradelayer.js/src/tradeHistoryManager.js +552 -0
- package/tradelayer.js/src/txDecoder.js +584 -0
- package/tradelayer.js/src/txEncoder.js +610 -0
- package/tradelayer.js/src/txIndex.js +502 -0
- package/tradelayer.js/src/txUtils.js +1392 -0
- package/tradelayer.js/src/types.js +429 -0
- package/tradelayer.js/src/validity.js +3077 -0
- package/tradelayer.js/src/vaults.js +430 -0
- package/tradelayer.js/src/vesting.js +491 -0
- package/tradelayer.js/src/volumeIndex.js +618 -0
- package/tradelayer.js/src/walletInterface.js +220 -0
- package/tradelayer.js/src/walletListener.js +665 -0
- package/tradelayer.js/tests/256decode.js +82 -0
- package/tradelayer.js/tests/UTXOracle.js +205 -0
- package/tradelayer.js/tests/base94test.js +23 -0
- package/tradelayer.js/tests/cancelTxTest.js +62 -0
- package/tradelayer.js/tests/contractInterfaceTest.js +48 -0
- package/tradelayer.js/tests/decimalTest.js +65 -0
- package/tradelayer.js/tests/decoderTest.js +100 -0
- package/tradelayer.js/tests/deltaCount.js +47 -0
- package/tradelayer.js/tests/deltaCount2.js +60 -0
- package/tradelayer.js/tests/interfaceTest.js +37 -0
- package/tradelayer.js/tests/mainTest.js +53 -0
- package/tradelayer.js/tests/makeActivationTest.js +24 -0
- package/tradelayer.js/tests/maxHeightTest.js +49 -0
- package/tradelayer.js/tests/reverseHash.js +72 -0
- package/tradelayer.js/tests/sensitiveConsoleOutput.txt +267 -0
- package/tradelayer.js/tests/tallyTest.js +40 -0
- package/tradelayer.js/tests/testBuybacks.js +46 -0
- package/tradelayer.js/tests/testCodeHash.js +49 -0
- package/tradelayer.js/tests/testConsensusHash.js +91 -0
- package/tradelayer.js/tests/testDecode.js +30 -0
- package/tradelayer.js/tests/testEncodingLengths.js +129 -0
- package/tradelayer.js/tests/testGetTx +32 -0
- package/tradelayer.js/tests/testGetTx.js +32 -0
- package/tradelayer.js/tests/testHexHash.js +32 -0
- package/tradelayer.js/tests/testIndexHash.js +35 -0
- package/tradelayer.js/tests/testInitContracts.js +38 -0
- package/tradelayer.js/tests/testMaxConsensus.js +12 -0
- package/tradelayer.js/tests/testMaxSynth.js +44 -0
- package/tradelayer.js/tests/testMint.js +21 -0
- package/tradelayer.js/tests/testNetwork.js +33 -0
- package/tradelayer.js/tests/testOrderbookLoad.js +62 -0
- package/tradelayer.js/tests/testRebates.js +32 -0
- package/tradelayer.js/tests/testRedeem.js +22 -0
- package/tradelayer.js/tests/testTokenTrade.js +39 -0
- package/tradelayer.js/tests/testTxBuild.js +42 -0
- package/tradelayer.js/tests/testUTXOTrade.js +27 -0
- package/tradelayer.js/tests/tokenTradeHistory.js +27 -0
- package/tradelayer.js/tests/tradeFutures.js +40 -0
- package/tradelayer.js/tests/tradeHistoryExample.js +35 -0
- package/tradelayer.js/tests/tradeHistoryLoad.js +15 -0
- package/tradelayer.js/tests/txScanTest.js +134 -0
- package/tradelayer.js/tests/validateTest.js +136 -0
- package/tradelayer.js/tests/vestingTest.js +37 -0
- package/tradelayer.js/utils/activateMainnet.js +59 -0
- package/tradelayer.js/utils/activateMainnetDoge.js +63 -0
- package/tradelayer.js/utils/autocompactdb.js +23 -0
- package/tradelayer.js/utils/base64toHex.js +32 -0
- package/tradelayer.js/utils/broadcastDoge.js +38 -0
- package/tradelayer.js/utils/calcRedeem.js +19 -0
- package/tradelayer.js/utils/checkNetwork.js +27 -0
- package/tradelayer.js/utils/createAddress.js +48 -0
- package/tradelayer.js/utils/createAttestation.js +133 -0
- package/tradelayer.js/utils/createContract.js +118 -0
- package/tradelayer.js/utils/createOracle.js +94 -0
- package/tradelayer.js/utils/createwallet.js +20 -0
- package/tradelayer.js/utils/crossFuturesTrades.js +57 -0
- package/tradelayer.js/utils/crossTokenTrades.js +62 -0
- package/tradelayer.js/utils/dumpPriv.js +29 -0
- package/tradelayer.js/utils/generateChannel.js +34 -0
- package/tradelayer.js/utils/getInfo.js +21 -0
- package/tradelayer.js/utils/hardWipe.js +20 -0
- package/tradelayer.js/utils/hexTo64.js +16 -0
- package/tradelayer.js/utils/importAddress.js +28 -0
- package/tradelayer.js/utils/importpriv.js +20 -0
- package/tradelayer.js/utils/issueOracleContract.js +67 -0
- package/tradelayer.js/utils/issueTokens.js +41 -0
- package/tradelayer.js/utils/listunspent.js +66 -0
- package/tradelayer.js/utils/litecoinClient.js +30 -0
- package/tradelayer.js/utils/loadwallet.js +20 -0
- package/tradelayer.js/utils/publishOracle.js +113 -0
- package/tradelayer.js/utils/sendActivation.js +21 -0
- package/tradelayer.js/utils/sendChannelContractTrade.js +34 -0
- package/tradelayer.js/utils/sendChannelTokenTrade.js +34 -0
- package/tradelayer.js/utils/sendCommit.js +24 -0
- package/tradelayer.js/utils/sendDoge.js +62 -0
- package/tradelayer.js/utils/sendDogeMain.js +67 -0
- package/tradelayer.js/utils/sendDogeTx.js +46 -0
- package/tradelayer.js/utils/sendLTC.js +63 -0
- package/tradelayer.js/utils/sendMainnet.js +62 -0
- package/tradelayer.js/utils/sendTransfer.js +19 -0
- package/tradelayer.js/utils/sendVestTest.js +88 -0
- package/tradelayer.js/utils/sendWithdrawal.js +26 -0
- package/tradelayer.js/utils/simpleStart.js +8 -0
- package/tradelayer.js/utils/startStop.js +27 -0
- package/tradelayer.js/utils/structuredTrades.js +136 -0
- package/tradelayer.js/utils/verifySignature.js +90 -0
- package/tradelayer.js/utils/verifyWitnessAndScriptPubkey.js +41 -0
- package/tradelayer.js/utils/walletCache.js +172 -0
- package/tradelayer.js/utils/walletContractInterface.js +48 -0
- package/tradelayer.js/utils/walletFetchTxs.js +66 -0
- package/tradelayer.js/utils/walletUtils.js +97 -0
- package/tradelayer.js/utils/wipeDB.js +55 -0
- package/tradelayer.js/utils/wipeDBNotTx.js +50 -0
- package/txEncoder.js +529 -0
- package/utility.js +28 -0
- package/verifymessage.js +38 -0
- 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,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}`);
|