@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,584 @@
1
+ // txDecoder.js
2
+ const BigNumber = require('bignumber.js');
3
+ const base94 = require('./base94.js')
4
+ const base256 = require('./base256.js')
5
+
6
+ const Decode = {
7
+ decodeAmount : (encoded) => {
8
+ const isDecimal = encoded.endsWith('~'); // Check for decimal flag `~`
9
+ const numStr = isDecimal ? encoded.slice(0, -1) : encoded;
10
+ const value = new BigNumber(parseInt(numStr, 36));
11
+
12
+ return isDecimal ? value.div(1e8).toNumber() : value.toNumber();
13
+ },
14
+ // Decode Activate TradeLayer Transaction
15
+ decodeActivateTradeLayer(payload) {
16
+ const parts = payload.split(',');
17
+ console.log('payload '+payload)
18
+ console.log('parts '+parts[0])
19
+ console.log('split array '+parts[0].split(';'))
20
+ // Decode txType(s)
21
+ const txTypes = parts[0].includes(';')
22
+ ? parts[0].split(';').map(value => {
23
+ const num = parseInt(value, 10); // Parse as integer
24
+ return isNaN(num) ? null : num; // Handle invalid entries
25
+ })
26
+ : [parseInt(parts[0], 10)]; // Single value case
27
+
28
+ // Decode codeHash
29
+ const decodedHash = parts[1]
30
+
31
+ console.log('Decoded txTypes:', txTypes, 'Decoded Hash:', decodedHash);
32
+
33
+ return {
34
+ txTypesToActivate: txTypes.filter(txType => txType !== null), // Remove invalid txTypes
35
+ codeHash: decodedHash
36
+ };
37
+ },
38
+
39
+
40
+
41
+ // Decode Token Issue Transaction
42
+ decodeTokenIssue: (payload) => {
43
+ const parts = payload.split(',');
44
+ return {
45
+ initialAmount: parts[0] ? parseInt(parts[0], 36) : 0,
46
+ ticker: parts[1] || '',
47
+ whitelists: parts[2] ? parts[2].split(';').map(val => parseInt(val, 36)) : [],
48
+ managed: parts[3] === '1',
49
+ backupAddress: parts[4] || '',
50
+ nft: parts[5] === '1',
51
+ coloredCoinHybrid: parts[6]==='1'
52
+ };
53
+ },
54
+
55
+ // Decode Send Transaction
56
+ decodeSend(payload){
57
+ const parts = payload.split(';');
58
+ const sendAll = parts[0] === '1';
59
+ const address = parts[1] || '';
60
+ let isColoredOutput = false;
61
+
62
+ // Helper function to decode amounts correctly
63
+ decodeAmount = (encoded) => {
64
+ const isDecimal = encoded.endsWith('~'); // Check for decimal flag `~`
65
+ const numStr = isDecimal ? encoded.slice(0, -1) : encoded;
66
+ const value = new BigNumber(parseInt(numStr, 36));
67
+ if(isDecimal){console.log('decimal value encountered' +value)}
68
+ return isDecimal ? value.div(1e8).toNumber() : value.toNumber();
69
+ };
70
+
71
+ if (sendAll) {
72
+ return { sendAll, address };
73
+ } else if (parts.length === 5 || parts.length === 4) {
74
+ const propertyIds = parseInt(parts[2], 36) || 0;
75
+ const amounts = decodeAmount(parts[3] || '0');
76
+ isColoredOutput = parts[5] === '1';
77
+
78
+ return { sendAll, address, propertyIds, amounts, isColoredOutput };
79
+ } else if (parts[2].includes(',')) {
80
+ const propertyIds = (parts[2] || '').split(',').map(id => parseInt(id, 36));
81
+ const amounts = (parts[3] || '').split(',').map(decodeAmount);
82
+
83
+ return {
84
+ sendAll,
85
+ propertyIds: propertyIds.map((id, index) => ({ propertyIds: id, amounts: amounts[index] }))
86
+ };
87
+ }
88
+ },
89
+
90
+ // Decode Property ID with error handling
91
+ decodePropertyId(encodedPropertyId) {
92
+ if (encodedPropertyId.startsWith('s')) {
93
+ const trimmedEncodedPropertyId = encodedPropertyId.substring(1);
94
+ let encodedCollateralId, encodedContractId;
95
+ if (trimmedEncodedPropertyId.includes('-')) {
96
+ const parts = trimmedEncodedPropertyId.split('-');
97
+ if (parts.length === 2) {
98
+ [encodedCollateralId, encodedContractId] = parts;
99
+ } else if (parts.length === 3 && parts[0] === '') {
100
+ encodedCollateralId = parts[1];
101
+ encodedContractId = parts[2];
102
+ } else {
103
+ return `s-NaN-NaN`;
104
+ }
105
+ } else {
106
+ return `s-NaN-NaN`;
107
+ }
108
+ const collateralId = parseInt(encodedCollateralId, 36);
109
+ const contractId = parseInt(encodedContractId, 36);
110
+ if (isNaN(collateralId) || isNaN(contractId)) {
111
+ return `s-NaN-NaN`;
112
+ }
113
+ return `s-${collateralId}-${contractId}`;
114
+ } else {
115
+ const result = parseInt(encodedPropertyId, 36);
116
+ return isNaN(result) ? NaN : result;
117
+ }
118
+ },
119
+
120
+ // Decode Trade Token for UTXO Transaction
121
+ decodeTradeTokenForUTXO: (payload) => {
122
+ const parts = payload.split(',');
123
+ return {
124
+ propertyId: Decode.decodePropertyId(parts[0] || ''),
125
+ amount: new BigNumber(parts[1] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber(),
126
+ columnA: parts[2] === "1",
127
+ satsExpected: parseInt(parts[3],36),
128
+ tokenOutput: parseInt(parts[4] || '0'),
129
+ payToAddress: parseInt(parts[5] || '0'),
130
+ isColoredOutput: parts[6] === "1",
131
+ tagWithdraw: parts[7] || null
132
+ };
133
+ },
134
+
135
+ // Decode Commit Token Transaction
136
+ decodeCommitToken: (payload) => {
137
+ const parts = payload.split(',');
138
+ let propertyId = Decode.decodePropertyId(parts[0] || '');
139
+ let amount = new BigNumber(parts[1] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber();
140
+
141
+ // Handle channelAddress or reference
142
+ let channelAddress = '';
143
+ let ref = false;
144
+ if (parts[2].startsWith('ref:')) {
145
+ ref = parts[2].split(':')[1];
146
+ } else {
147
+ channelAddress = parts[2] || '';
148
+ }
149
+
150
+ // Decode payEnabled
151
+ let payEnabled = parts[3] === '1';
152
+
153
+ // Decode clearLists
154
+ let clearLists = [];
155
+ if (parts[4] && parts[4].startsWith('[') && parts[4].endsWith(']')) {
156
+ clearLists = parts[4].slice(1, -1).split(',').map(num => parseInt(num, 36));
157
+ } else if (parts[4]) {
158
+ clearLists = [parseInt(parts[4], 36)];
159
+ }
160
+
161
+ const isColoredOutput = parts[5] ==='1'
162
+
163
+ return {
164
+ propertyId,
165
+ amount,
166
+ channelAddress,
167
+ ref,
168
+ payEnabled,
169
+ clearLists,
170
+ isColoredOutput
171
+ };
172
+ },
173
+
174
+
175
+ // Decode On-chain Token for Token Transaction
176
+ decodeOnChainTokenForToken: (payload) => {
177
+ const parts = payload.split(',');
178
+ return {
179
+ propertyIdOffered: Decode.decodePropertyId(parts[0] || ''),
180
+ propertyIdDesired: Decode.decodePropertyId(parts[1] || ''),
181
+ amountOffered: new BigNumber(parts[2] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber(),
182
+ amountExpected: new BigNumber(parts[3] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber(),
183
+ stop: parts[4] === "1",
184
+ post: parts[5] === "1"
185
+ };
186
+ },
187
+
188
+ // Decode Cancel Order Transaction with guards
189
+ decodeCancelOrder: (encodedTx) => {
190
+ const elements = encodedTx.split(',');
191
+ let isContract = elements[0];
192
+ const cancelParams = {};
193
+ let offeredPropertyId, desiredPropertyId, cancelAll;
194
+
195
+ if (isContract == 1) {
196
+ isContract = true;
197
+ offeredPropertyId = Decode.decodePropertyId(elements[1] || '');
198
+ cancelAll = parseInt(elements[2] || '0', 36);
199
+ if (elements[3] && elements[3].length > 20) {
200
+ cancelParams.txid = elements[3];
201
+ } else {
202
+ cancelParams.price = elements[3] || '0';
203
+ cancelParams.side = elements[4] || '0';
204
+ }
205
+ } else {
206
+ isContract = false;
207
+ offeredPropertyId = Decode.decodePropertyId(elements[1] || '');
208
+ desiredPropertyId = Decode.decodePropertyId(elements[2] || '');
209
+ cancelAll = parseInt(elements[3] || '0', 36);
210
+ if (elements[4] && elements[4].length > 20) {
211
+ cancelParams.txid = elements[4];
212
+ } else {
213
+ const priceDecoded = new BigNumber(elements[3] || '0').dividedBy(8).toNumber();
214
+ cancelParams.price = priceDecoded;
215
+ cancelParams.side = elements[5] || '0';
216
+ }
217
+ }
218
+ return { isContract, offeredPropertyId, desiredPropertyId, cancelAll, cancelParams };
219
+ },
220
+
221
+ // Decode Create Whitelist Transaction
222
+ decodeCreateWhitelist: (payload) => {
223
+ const parts = payload.split(',');
224
+ return {
225
+ backupAddress: parts[0] || '',
226
+ name: parts[1] || '',
227
+ url: parts[2] || '',
228
+ description: parts[3] || ''
229
+ };
230
+ },
231
+
232
+ // Decode Update Admin Transaction
233
+ decodeUpdateAdmin: (payload) => {
234
+ const parts = payload.split(',');
235
+ return {
236
+ newAddress: parts[0] || '',
237
+ whitelist: parts[1] === '1',
238
+ oracle: parts[2] === '1',
239
+ token: parts[3] === '1',
240
+ id: parseInt(parts[4] || '0', 36),
241
+ updateBackup: parts[5] === '1'
242
+ };
243
+ },
244
+
245
+ // Decode Issue Attestation Transaction
246
+ decodeIssueOrRevokeAttestation: (payload) => {
247
+ const parts = payload.split(',');
248
+ console.log('decoding attestation '+JSON.stringify(parts))
249
+ return {
250
+ revoke: parts[0] === '1',
251
+ id: parseInt(parts[1] || '0', 36),
252
+ targetAddress: parts[2] || '',
253
+ metaData: parts[3].toUpperCase() || ''
254
+ };
255
+ },
256
+
257
+ // Decode AMM Pool Transaction
258
+ decodeAMMPool: (payload) => {
259
+ const parts = payload.split(',');
260
+ return {
261
+ isRedeem: parts[0] === '1',
262
+ isContract: parts[1] === '1',
263
+ id: Decode.decodePropertyId(parts[2] || ''),
264
+ amount: parseInt(parts[3] || '0', 36),
265
+ id2: Decode.decodePropertyId(parts[4] || ''),
266
+ amount2: parseInt(parts[5] || '0', 36),
267
+ optionsMaker: parseInt(parts[7] || '0'), // AMM id
268
+ optionsTaker: parseInt(parts[8] || '0'), // AMM id
269
+ strategyBlob: parts[9] || '' // free-form blob
270
+ };
271
+ },
272
+
273
+
274
+ // Decode Grant Managed Token Transaction
275
+ decodeGrantManagedToken: (payload) => {
276
+ const parts = payload.split(',');
277
+ return {
278
+ propertyId: Decode.decodePropertyId(parts[0] || ''),
279
+ amountGranted: new BigNumber(parts[1] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber(),
280
+ addressToGrantTo: parts[2] || ''
281
+ };
282
+ },
283
+
284
+ // Decode Redeem Managed Token Transaction
285
+ decodeRedeemManagedToken: (payload) => {
286
+ const parts = payload.split(',');
287
+ return {
288
+ propertyId: Decode.decodePropertyId(parts[0] || ''),
289
+ amountDestroyed: new BigNumber(parts[1] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber()
290
+ };
291
+ },
292
+
293
+ // Decode Create Oracle Transaction
294
+ decodeCreateOracle: (payload) => {
295
+ const parts = payload.split(',');
296
+ return {
297
+ ticker: parts[0] || '',
298
+ url: parts[1] || '',
299
+ backupAddress: parts[2] || '',
300
+ whitelists: parts[3] ? parts[3].split(';').map(val => parseInt(val, 36)) : [],
301
+ lag: parseInt(parts[4] || '0', 36)
302
+ };
303
+ },
304
+
305
+ // Decode Publish Oracle Data Transaction
306
+ decodePublishOracleData: (payload) => {
307
+ const parts = payload.split(',');
308
+ let data = {
309
+ oracleId: parseInt(parts[0] || '0', 36), // Decode oracleId as the first part
310
+ price: parseInt(parts[1] || '0', 36) // Adjust indices for other parts
311
+ };
312
+ data.price = new BigNumber(data.price).div(1e4).decimalPlaces(4).toNumber()
313
+ if (parts[2]) {
314
+ data.high = parseInt(parts[2], 36);
315
+ }
316
+ if (parts[3]) {
317
+ data.low = parseInt(parts[3], 36);
318
+ }
319
+ if (parts[4]) {
320
+ data.close = parseInt(parts[4], 36);
321
+ }
322
+ return data;
323
+ },
324
+
325
+ // Decode Close Oracle Transaction
326
+ decodeCloseOracle: (payload) => {
327
+ return parseInt(payload || '0', 36); // No parameters
328
+ },
329
+
330
+ // Decode Create Future Contract Series Transaction
331
+ decodeCreateFutureContractSeries: (payload) => {
332
+ const parts = payload.split(',');
333
+
334
+ // Check if the contract is native or not
335
+ const isNative = parts[0] === '1';
336
+
337
+ // Initialize onChainDataParts
338
+ let onChainDataParts = [];
339
+
340
+ // Parse onChainData only if the contract is not native
341
+ if (!isNative && parts[2]) {
342
+ onChainDataParts = parts[2].split(';').map(pair =>
343
+ pair.split(':').map(val => val ? parseInt(val, 36) : null)
344
+ );
345
+ }
346
+
347
+ console.log('decoding create contract notionalValue '+parts[4])
348
+
349
+ return {
350
+ native: isNative,
351
+ underlyingOracleId: parseInt(parts[1] || '0', 36),
352
+ onChainData: onChainDataParts,
353
+ notionalPropertyId: Decode.decodePropertyId(parts[3] || ''),
354
+ notionalValue: parseInt(parts[4] || '0',36), // Assuming notionalValue should be a float
355
+ collateralPropertyId: Decode.decodePropertyId(parts[5] || ''),
356
+ leverage: parseFloat(parts[6] || '0'), // Assuming leverage should be a float
357
+ expiryPeriod: parts[7] ? parseInt(parts[7], 36) : null,
358
+ series: parts[8] ? parseInt(parts[8], 36) : null,
359
+ inverse: parts[9] === '1',
360
+ fee: parts[10] === '1'
361
+ };
362
+ },
363
+
364
+ // Decode Exercise Derivative Transaction
365
+ decodeExerciseDerivative: (payload) => {
366
+ const [derivativeContractId, amount] = payload.split(',');
367
+ return {
368
+ derivativeContractId: parseInt(derivativeContractId || '0', 36),
369
+ amount: parseInt(amount || '0', 36)
370
+ };
371
+ },
372
+
373
+ // **✅ Decode Trade Contract Onchain**
374
+ decodeTradeContractOnchain: (payload) => {
375
+ const parts = payload.split(',');
376
+ const price = parseInt(parts[1], 36)||0
377
+ console.log('price in decode on chain contract '+price )
378
+ return {
379
+ contractId: parseInt(parts[0] || '0', 36),
380
+ price: new BigNumber(price).div(1e8).toNumber(),
381
+ amount: parseInt(parts[2] || '0', 36),
382
+ sell: parts[3] === '1',
383
+ insurance: parts[4] === '1',
384
+ reduce: parts[5] === '1',
385
+ post: parts[6] === '1',
386
+ stop: parts[7] === '1'
387
+ };
388
+ },
389
+
390
+ // Decode Trade Contract in Channel Transaction
391
+ decodeTradeContractChannel: (payload) => {
392
+ const parts = payload.split(',');
393
+ const price = parseInt(parts[1], 36)||0
394
+ return {
395
+ contractId: parseInt(parts[0] || '0', 36),
396
+ price: new BigNumber(price).div(1e8).toNumber(),
397
+ amount: parseInt(parts[2] || '0', 36),
398
+ columnAIsSeller: parts[3] === '1',
399
+ expiryBlock: parseInt(parts[4] || '0', 36),
400
+ insurance: parts[5] === '1',
401
+ columnAIsMaker: parts[6] === '1'
402
+ };
403
+ },
404
+
405
+ // Decode Trade Tokens in Channel Transaction
406
+ decodeTradeTokensChannel: (payload) => {
407
+ const parts = payload.split(',');
408
+ return {
409
+ propertyIdOffered: Decode.decodePropertyId(parts[0] || ''),
410
+ propertyIdDesired: Decode.decodePropertyId(parts[1] || ''),
411
+ amountOffered: new BigNumber(parts[2] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber(),
412
+ amountDesired: new BigNumber(parts[3] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber(),
413
+ columnAIsOfferer: parts[4] === '1',
414
+ expiryBlock: parseInt(parts[5] || '0', 36),
415
+ columnAIsMaker: parts[6] === '1',
416
+ Id1ColoredOutput: parts[7]=== '1',
417
+ Id2ColoredOutput: parts[8]=== '1'
418
+ };
419
+ },
420
+
421
+ // Decode Withdrawal Transaction
422
+ decodeWithdrawal: (payload, decodedTx) => {
423
+ const parts = payload.split(',');
424
+ let channelAddress = '';
425
+ let ref = false;
426
+
427
+ if (parts[4]?.startsWith('ref:')) {
428
+ const n = parseInt(parts[4].split(':')[1], 10);
429
+ ref = Number.isFinite(n) ? n : false;
430
+ } else {
431
+ channelAddress = parts[4] || '';
432
+ }
433
+
434
+ return {
435
+ withdrawAll: parts[0] === '1',
436
+ propertyId: Decode.decodePropertyId(parts[1] || ''),
437
+ amount: new BigNumber(parts[2] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber(),
438
+ column: parts[3] === '1',
439
+ channelAddress,
440
+ ref,
441
+ };
442
+ },
443
+
444
+
445
+ // Decode Transfer Transaction
446
+ decodeTransfer: (payload) => {
447
+ const parts = payload.split(',');
448
+ let propertyId = Decode.decodePropertyId(parts[0] || '');
449
+ let amount = new BigNumber(parts[1] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber();
450
+ let isColumnA = parts[2] === '1';
451
+
452
+ // Handle destinationAddr or reference
453
+ let toChannelAddress = '';
454
+ let ref = false;
455
+ if (parts[3].startsWith('ref:')) {
456
+ ref = parts[3].split(':')[1];
457
+ } else {
458
+ toChannelAddress = parts[3] || '';
459
+ }
460
+
461
+ // Decode pay and payRef
462
+ let pay = parts[4] === '1';
463
+ let payRef = parts[5] || '';
464
+
465
+ return {
466
+ propertyId,
467
+ amount,
468
+ isColumnA,
469
+ toChannelAddress,
470
+ ref,
471
+ pay,
472
+ payRef
473
+ };
474
+ },
475
+
476
+ // Decode Settle Channel PNL Transaction
477
+ decodeSettleChannelPNL: (payload) => {
478
+ const parts = payload.split(',');
479
+
480
+ return {
481
+ txidNeutralized1: Base256Converter.base256ToHex(parts[0] || ''), // Decode from Base 256 to Hex
482
+ txidNeutralized2: Base256Converter.base256ToHex(parts[1] || ''), // Decode from Base 256 to Hex
483
+ markPrice: parseFloat(Base94Converter.fromBase94(parts[2] || '')), // Decode from Base 94 to decimal
484
+ close: parts[3] === '1',
485
+ columnAIsSeller: parts[4]=== '1',
486
+ columnAIsMaker: parts[5]==='1',
487
+ macroBatch: parts[6] ==='1'
488
+ // Boolean flag for closing trade
489
+ };
490
+ },
491
+
492
+ // Decode Mint Synthetic Transaction
493
+ decodeMintSynthetic: (payload) => {
494
+ const parts = payload.split(',');
495
+ return {
496
+ propertyId: Decode.decodePropertyId(parts[0] || ''),
497
+ contractId: parseInt(parts[1] || '0', 36),
498
+ amount: new BigNumber(parts[2] || '0', 36)
499
+ .div(1e8)
500
+ .decimalPlaces(8, BigNumber.ROUND_DOWN)
501
+ .toNumber(),
502
+ };
503
+ },
504
+
505
+ // Decode Redeem Synthetic Transaction
506
+ decodeRedeemSynthetic: (payload) => {
507
+ const parts = payload.split(',');
508
+ return {
509
+ propertyId: parseInt(parts[0] || '0', 36),
510
+ contractId: parseInt(parts[1] || '0', 36),
511
+ amount: new BigNumber(parts[2] || '0', 36)
512
+ .div(1e8)
513
+ .decimalPlaces(8, BigNumber.ROUND_DOWN)
514
+ .toNumber(),
515
+ };
516
+ },
517
+
518
+ // Decode Pay to Tokens Transaction
519
+ decodePayToTokens: (payload) => {
520
+ const parts = payload.split(',');
521
+ return {
522
+ propertyIdTarget: parseInt(parts[0] || '0', 36),
523
+ propertyIdUsed: parseInt(parts[1] || '0', 36),
524
+ amount: new BigNumber(parts[2] || '0', 36).div(1e8).decimalPlaces(8, BigNumber.ROUND_DOWN).toNumber(),
525
+ };
526
+ },
527
+
528
+ decodeOptionTrade: (payload) => {
529
+ const parts = payload.split(',');
530
+
531
+ const result = {
532
+ ticker: parts[0], // keep full ticker string
533
+ price: Decode.decodeAmount(parts[1] || '0'),
534
+ amount: parseInt(parts[2] || '0', 36),
535
+ columnAIsSeller: parts[3]=== '1',
536
+ expiryBlock: parseInt(parts[4] || '0', 36),
537
+ columnAIsMaker: parts[5] === '1'
538
+ };
539
+
540
+ if (parts.length > 6) {
541
+ result.comboTicker = parts[6];
542
+ result.comboPrice = Decode.decodeAmount(parts[7] || '0');
543
+ result.comboAmount = parseInt(parts[8] || '0', 36);
544
+ }
545
+
546
+ return result;
547
+ },
548
+
549
+ decodeBatchMoveZkRollup: (payload) =>{
550
+ return { ordinalRevealJSON: payload };
551
+ },
552
+
553
+ // Decode Publish New Transaction Type
554
+ decodePublishNewTx: (payload) => {
555
+ return { ordinalRevealJSON: payload };
556
+ },
557
+
558
+ // Decode Create Derivative of LRC20 or RGB
559
+ decodeColoredCoin: (payload) => {
560
+ const parts = payload.split(',');
561
+
562
+ // Ensure there are enough parts to avoid undefined access
563
+ return {
564
+ encodeDecodeRecode: parseInt(parts[0], 10), // Assuming it's a numeric identifier
565
+ propertyId: parseInt(parts[1], 36), // The TL account token being encoded
566
+ satsRatio: parseInt(parts[2], 36), // How many sats of the account token
567
+ homeAddress: parts[3] || '' // Optional address, defaults to empty string if not provided
568
+ };
569
+ },
570
+
571
+ // Decode Mint Colored Coin
572
+ decodeAbstractionBridge: (payload) => {
573
+ const parts = payload.split(',');
574
+ return {
575
+ propertyId: parseInt(parts[0], 36),
576
+ amount: parseInt(parts[1], 36)
577
+ };
578
+ }
579
+
580
+ }
581
+
582
+ // ... continue decoding functions for the rest of the transactions ...
583
+
584
+ module.exports = Decode