@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,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
|