@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,113 @@
|
|
|
1
|
+
// Encode the transaction to base 256
|
|
2
|
+
function encodeOmniTransaction(type, params) {
|
|
3
|
+
const payload = [type];
|
|
4
|
+
|
|
5
|
+
switch (type) {
|
|
6
|
+
case 1:
|
|
7
|
+
payload.push(params.initialAmount.toString(16)); // Convert integer to hex
|
|
8
|
+
payload.push(params.ticker);
|
|
9
|
+
payload.push(params.whitelists || 0);
|
|
10
|
+
break;
|
|
11
|
+
case 2:
|
|
12
|
+
payload.push(params.propertyId.toString(16)); // Convert integer to hex
|
|
13
|
+
payload.push(params.amount.toString(16)); // Convert integer to hex
|
|
14
|
+
break;
|
|
15
|
+
case 3:
|
|
16
|
+
payload.push(params.propertyId.toString(16)); // Convert integer to hex
|
|
17
|
+
payload.push(params.amount.toString(16)); // Convert integer to hex
|
|
18
|
+
payload.push(params.satsExpected.toString(16)); // Convert integer to hex
|
|
19
|
+
break;
|
|
20
|
+
case 4:
|
|
21
|
+
payload.push(params.propertyId.toString(16)); // Convert integer to hex
|
|
22
|
+
payload.push(params.amount.toString(16)); // Convert integer to hex
|
|
23
|
+
break;
|
|
24
|
+
case 5:
|
|
25
|
+
payload.push(params.propertyId.toString(16)); // Convert integer to hex
|
|
26
|
+
payload.push(params.propertyIdDesired.toString(16)); // Convert integer to hex
|
|
27
|
+
payload.push(params.amountOffered.toString(16)); // Convert integer to hex
|
|
28
|
+
payload.push(params.amountExpected.toString(16)); // Convert integer to hex
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
throw new Error("Unknown transaction type");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Join all the elements of the payload into a single string, separated by commas
|
|
35
|
+
const encodedPayload = payload.join(',');
|
|
36
|
+
|
|
37
|
+
return encodedPayload;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Decode the base 256 payload to a transaction object
|
|
41
|
+
function decodeOmniTransaction(encodedPayload) {
|
|
42
|
+
if (encodedPayload.startsWith("tl")) {
|
|
43
|
+
encodedPayload = encodedPayload.substr(2); // Remove the "tl" marker
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const parts = encodedPayload.split(',');
|
|
47
|
+
|
|
48
|
+
const type = parseInt(parts[0], 10); // Parse the type as a regular integer
|
|
49
|
+
const params = {};
|
|
50
|
+
|
|
51
|
+
let index = 1;
|
|
52
|
+
|
|
53
|
+
switch (type) {
|
|
54
|
+
case 1:
|
|
55
|
+
params.initialAmount = parseInt(parts[index], 16); // Convert hex to integer
|
|
56
|
+
index++;
|
|
57
|
+
params.ticker = parts[index];
|
|
58
|
+
index++;
|
|
59
|
+
params.whitelists = parts.slice(index).map(value => parseInt(value, 10));
|
|
60
|
+
break;
|
|
61
|
+
case 2:
|
|
62
|
+
params.propertyId = parseInt(parts[index], 16); // Convert hex to integer
|
|
63
|
+
index++;
|
|
64
|
+
params.amount = parseInt(parts[index], 16); // Convert hex to integer
|
|
65
|
+
break;
|
|
66
|
+
case 3:
|
|
67
|
+
params.propertyId = parseInt(parts[index], 16); // Convert hex to integer
|
|
68
|
+
index++;
|
|
69
|
+
params.amount = parseInt(parts[index], 16); // Convert hex to integer
|
|
70
|
+
index++;
|
|
71
|
+
params.satsExpected = parseInt(parts[index], 16); // Convert hex to integer
|
|
72
|
+
break;
|
|
73
|
+
case 4:
|
|
74
|
+
params.propertyId = parseInt(parts[index], 16); // Convert hex to integer
|
|
75
|
+
index++;
|
|
76
|
+
params.amount = parseInt(parts[index], 16); // Convert hex to integer
|
|
77
|
+
break;
|
|
78
|
+
case 5:
|
|
79
|
+
params.propertyId = parseInt(parts[index], 16); // Convert hex to integer
|
|
80
|
+
index++;
|
|
81
|
+
params.propertyIdDesired = parseInt(parts[index], 16); // Convert hex to integer
|
|
82
|
+
index++;
|
|
83
|
+
params.amountOffered = parseInt(parts[index], 16); // Convert hex to integer
|
|
84
|
+
index++;
|
|
85
|
+
params.amountExpected = parseInt(parts[index], 16); // Convert hex to integer
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
throw new Error("Unknown transaction type");
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return { type, params };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Logic test: Check if the encoded payload is <= 40 bytes
|
|
95
|
+
function isPayloadSizeValid(encodedPayload) {
|
|
96
|
+
return encodedPayload.length <= 40;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Example Usage:
|
|
100
|
+
const tx = encodeOmniTransaction(1, {
|
|
101
|
+
propertyId: 12342,
|
|
102
|
+
initialAmount: 10000557964,
|
|
103
|
+
ticker: "TOKEN",
|
|
104
|
+
whitelists: [122, 234, 612, 1212312]
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const encodedPayloadWithMarker = `tl${tx}`; // Prepend "tl" marker
|
|
108
|
+
|
|
109
|
+
console.log("Encoded Payload with Marker:", encodedPayloadWithMarker);
|
|
110
|
+
console.log("Is Payload Size Valid:", isPayloadSizeValid(encodedPayloadWithMarker));
|
|
111
|
+
|
|
112
|
+
const decodedTx = decodeOmniTransaction(encodedPayloadWithMarker.substr(2)); // Remove the "tl" marker when decoding
|
|
113
|
+
console.log("Decoded Transaction:", decodedTx);
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
const bs58 = require('bs58');
|
|
2
|
+
|
|
3
|
+
// Encode the transaction to base 256
|
|
4
|
+
function encodeOmniTransaction(type, params) {
|
|
5
|
+
const payload = [type];
|
|
6
|
+
|
|
7
|
+
switch (type) {
|
|
8
|
+
case 1:
|
|
9
|
+
payload.push(bs58.encode(Buffer.from(params.initialAmount.toString(), 'hex')));
|
|
10
|
+
payload.push(params.ticker.length); // Include the length of the ticker
|
|
11
|
+
payload.push(bs58.encode(Buffer.from(params.ticker, 'utf8'))); // Convert ticker to base 58
|
|
12
|
+
payload.push(params.whitelists || 0);
|
|
13
|
+
break;
|
|
14
|
+
case 2:
|
|
15
|
+
payload.push(bs58.encode(Buffer.from(params.propertyId.toString(), 'hex')));
|
|
16
|
+
payload.push(bs58.encode(Buffer.from(params.amount.toString(), 'hex')));
|
|
17
|
+
break;
|
|
18
|
+
case 3:
|
|
19
|
+
payload.push(bs58.encode(Buffer.from(params.propertyId.toString(), 'hex')));
|
|
20
|
+
payload.push(bs58.encode(Buffer.from(params.amount.toString(), 'hex')));
|
|
21
|
+
payload.push(bs58.encode(Buffer.from(params.satsExpected.toString(), 'hex')));
|
|
22
|
+
break;
|
|
23
|
+
case 4:
|
|
24
|
+
payload.push(bs58.encode(Buffer.from(params.propertyId.toString(), 'hex')));
|
|
25
|
+
payload.push(bs58.encode(Buffer.from(params.amount.toString(), 'hex')));
|
|
26
|
+
break;
|
|
27
|
+
case 5:
|
|
28
|
+
payload.push(bs58.encode(Buffer.from(params.propertyId.toString(), 'hex')));
|
|
29
|
+
payload.push(bs58.encode(Buffer.from(params.propertyIdDesired.toString(), 'hex')));
|
|
30
|
+
payload.push(bs58.encode(Buffer.from(params.amountOffered.toString(), 'hex')));
|
|
31
|
+
payload.push(bs58.encode(Buffer.from(params.amountExpected.toString(), 'hex')));
|
|
32
|
+
break;
|
|
33
|
+
default:
|
|
34
|
+
throw new Error("Unknown transaction type");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Join all the elements of the payload into a single string, separated by commas
|
|
38
|
+
const encodedPayload = payload.map(item => item.toString()).join(',');
|
|
39
|
+
|
|
40
|
+
return encodedPayload;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Decode the base 256 payload to a transaction object
|
|
44
|
+
function decodeOmniTransaction(encodedPayload) {
|
|
45
|
+
if (encodedPayload.startsWith("tl")) {
|
|
46
|
+
encodedPayload = encodedPayload.substr(2); // Remove the "tl" marker
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const parts = encodedPayload.split(',');
|
|
50
|
+
|
|
51
|
+
const type = parseInt(parts[0], 10); // Parse the type as a regular integer
|
|
52
|
+
const params = {};
|
|
53
|
+
|
|
54
|
+
let index = 1;
|
|
55
|
+
|
|
56
|
+
switch (type) {
|
|
57
|
+
case 1:
|
|
58
|
+
params.initialAmount = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
59
|
+
index++;
|
|
60
|
+
const tickerLength = parseInt(parts[index], 10);
|
|
61
|
+
index++;
|
|
62
|
+
params.ticker = bs58.decode(parts[index]).toString('utf8');
|
|
63
|
+
index++;
|
|
64
|
+
params.whitelists = parseInt(parts[index], 10);
|
|
65
|
+
break;
|
|
66
|
+
case 2:
|
|
67
|
+
params.propertyId = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
68
|
+
index++;
|
|
69
|
+
params.amount = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
70
|
+
break;
|
|
71
|
+
case 3:
|
|
72
|
+
params.propertyId = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
73
|
+
index++;
|
|
74
|
+
params.amount = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
75
|
+
index++;
|
|
76
|
+
params.satsExpected = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
77
|
+
break;
|
|
78
|
+
case 4:
|
|
79
|
+
params.propertyId = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
80
|
+
index++;
|
|
81
|
+
params.amount = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
82
|
+
break;
|
|
83
|
+
case 5:
|
|
84
|
+
params.propertyId = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
85
|
+
index++;
|
|
86
|
+
params.propertyIdDesired = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
87
|
+
index++;
|
|
88
|
+
params.amountOffered = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
89
|
+
index++;
|
|
90
|
+
params.amountExpected = parseInt(bs58.decode(parts[index]).toString('hex'), 16);
|
|
91
|
+
break;
|
|
92
|
+
default:
|
|
93
|
+
throw new Error("Unknown transaction type");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return { type, params };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Example Usage:
|
|
100
|
+
const tx = encodeOmniTransaction(1, {
|
|
101
|
+
initialAmount: 557964,
|
|
102
|
+
ticker: "TOKEN",
|
|
103
|
+
whitelists: [2, 4, 6, 12],
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const encodedPayloadWithMarker = `tl${tx}`; // Prepend "tl" marker
|
|
107
|
+
|
|
108
|
+
console.log("Encoded Payload with Marker:", encodedPayloadWithMarker);
|
|
109
|
+
console.log("Is Payload Size Valid:", isPayloadSizeValid(encodedPayloadWithMarker));
|
|
110
|
+
|
|
111
|
+
const decodedTx = decodeOmniTransaction(encodedPayloadWithMarker.substr(2)); // Remove the "tl" marker when decoding
|
|
112
|
+
console.log("Decoded Transaction:", decodedTx);
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
f// Encode the transaction to base 256
|
|
2
|
+
function encodeOmniTransaction(type, params) {
|
|
3
|
+
const payload = [type];
|
|
4
|
+
|
|
5
|
+
switch (type) {
|
|
6
|
+
case 1:
|
|
7
|
+
payload.push(params.initialAmount.toString(36)); // Convert integer to hex
|
|
8
|
+
payload.push(params.ticker);
|
|
9
|
+
payload.push(params.whitelists.map(val => val.toString(36)).join(',')); // Convert integers to hex and join with commas
|
|
10
|
+
break;
|
|
11
|
+
case 2:
|
|
12
|
+
payload.push(params.propertyId.toString(36)); // Convert integer to hex
|
|
13
|
+
payload.push(params.amount.toString(36)); // Convert integer to hex
|
|
14
|
+
break;
|
|
15
|
+
case 3:
|
|
16
|
+
payload.push(params.propertyId.toString(36)); // Convert integer to hex
|
|
17
|
+
payload.push(params.amount.toString(36)); // Convert integer to hex
|
|
18
|
+
payload.push(params.satsExpected.toString(36)); // Convert integer to hex
|
|
19
|
+
break;
|
|
20
|
+
case 4:
|
|
21
|
+
payload.push(params.propertyId.toString(36)); // Convert integer to hex
|
|
22
|
+
payload.push(params.amount.toString(36)); // Convert integer to hex
|
|
23
|
+
break;
|
|
24
|
+
case 5:
|
|
25
|
+
payload.push(params.propertyId.toString(36)); // Convert integer to hex
|
|
26
|
+
payload.push(params.propertyIdDesired.toString(36)); // Convert integer to hex
|
|
27
|
+
payload.push(params.amountOffered.toString(36)); // Convert integer to hex
|
|
28
|
+
payload.push(params.amountExpected.toString(36)); // Convert integer to hex
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
throw new Error("Unknown transaction type");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Join all the elements of the payload into a single string, separated by commas
|
|
35
|
+
const encodedPayload = payload.join(',');
|
|
36
|
+
|
|
37
|
+
return encodedPayload;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Decode the base 256 payload to a transaction object
|
|
41
|
+
function decodeOmniTransaction(encodedPayload) {
|
|
42
|
+
if (encodedPayload.startsWith("tl")) {
|
|
43
|
+
encodedPayload = encodedPayload.substr(2); // Remove the "tl" marker
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const parts = encodedPayload.split(',');
|
|
47
|
+
|
|
48
|
+
const type = parseInt(parts[0], 16); // Parse the type as a hex integer
|
|
49
|
+
const params = {};
|
|
50
|
+
|
|
51
|
+
let index = 1;
|
|
52
|
+
|
|
53
|
+
switch (type) {
|
|
54
|
+
case 1:
|
|
55
|
+
params.initialAmount = parseInt(parts[index], 36); // Convert hex to integer
|
|
56
|
+
index++;
|
|
57
|
+
params.ticker = parts[index];
|
|
58
|
+
index++;
|
|
59
|
+
params.whitelists = [];
|
|
60
|
+
while (index < parts.length) {
|
|
61
|
+
params.whitelists.push(parseInt(parts[index], 36)); // Convert hex to integer
|
|
62
|
+
index++;
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
case 2:
|
|
66
|
+
params.propertyId = parseInt(parts[index], 36); // Convert hex to integer
|
|
67
|
+
index++;
|
|
68
|
+
params.amount = parseInt(parts[index], 36); // Convert hex to integer
|
|
69
|
+
break;
|
|
70
|
+
case 3:
|
|
71
|
+
params.propertyId = parseInt(parts[index], 36); // Convert hex to integer
|
|
72
|
+
index++;
|
|
73
|
+
params.amount = parseInt(parts[index], 36); // Convert hex to integer
|
|
74
|
+
index++;
|
|
75
|
+
params.satsExpected = parseInt(parts[index], 36); // Convert hex to integer
|
|
76
|
+
break;
|
|
77
|
+
case 4:
|
|
78
|
+
params.propertyId = parseInt(parts[index], 36); // Convert hex to integer
|
|
79
|
+
index++;
|
|
80
|
+
params.amount = parseInt(parts[index], 36); // Convert hex to integer
|
|
81
|
+
break;
|
|
82
|
+
case 5:
|
|
83
|
+
params.propertyId = parseInt(parts[index], 36); // Convert hex to integer
|
|
84
|
+
index++;
|
|
85
|
+
params.propertyIdDesired = parseInt(parts[index], 36); // Convert hex to integer
|
|
86
|
+
index++;
|
|
87
|
+
params.amountOffered = parseInt(parts[index], 36); // Convert hex to integer
|
|
88
|
+
index++;
|
|
89
|
+
params.amountExpected = parseInt(parts[index], 36); // Convert hex to integer
|
|
90
|
+
break;
|
|
91
|
+
default:
|
|
92
|
+
throw new Error("Unknown transaction type");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return { type, params };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Logic test: Check if the encoded payload is <= 40 bytes
|
|
99
|
+
function isPayloadSizeValid(encodedPayload) {
|
|
100
|
+
return encodedPayload.length <= 40;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Function to prepend "tl" marker to encoded payload
|
|
104
|
+
function prependTlMarker(encodedPayload) {
|
|
105
|
+
return `tl${encodedPayload}`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Test Cases
|
|
109
|
+
const tx1 = encodeOmniTransaction(1, {
|
|
110
|
+
propertyId: 12342,
|
|
111
|
+
initialAmount: 10000.557964,
|
|
112
|
+
ticker: "TOKEN",
|
|
113
|
+
whitelists: [122, 234, 612, 1212312]
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const encodedPayloadWithMarker1 = prependTlMarker(tx1);
|
|
117
|
+
|
|
118
|
+
const tx2 = encodeOmniTransaction(2, {
|
|
119
|
+
propertyId: 54321,
|
|
120
|
+
amount: 87654321.00000000,
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const encodedPayloadWithMarker2 = prependTlMarker(tx2);
|
|
124
|
+
|
|
125
|
+
const tx3 = encodeOmniTransaction(3, {
|
|
126
|
+
propertyId: 98765,
|
|
127
|
+
amount: 12345678.00000000,
|
|
128
|
+
satsExpected: 8765432,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const encodedPayloadWithMarker3 = prependTlMarker(tx3);
|
|
132
|
+
|
|
133
|
+
const tx4 = encodeOmniTransaction(4, {
|
|
134
|
+
propertyId: 13579,
|
|
135
|
+
amount: 246813579.00000000,
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const encodedPayloadWithMarker4 = prependTlMarker(tx4);
|
|
139
|
+
|
|
140
|
+
const tx5 = encodeOmniTransaction(5, {
|
|
141
|
+
propertyId: 11111,
|
|
142
|
+
propertyIdDesired: 99999,
|
|
143
|
+
amountOffered: 123456789.00000000,
|
|
144
|
+
amountExpected: 87654322334.00000000,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
const encodedPayloadWithMarker5 = prependTlMarker(tx5);
|
|
148
|
+
|
|
149
|
+
// Display Test Results
|
|
150
|
+
console.log("Encoded Transaction 1:", encodedPayloadWithMarker1);
|
|
151
|
+
console.log("Is Transaction 1 Payload Size Valid:", isPayloadSizeValid(encodedPayloadWithMarker1));
|
|
152
|
+
console.log("Decoded Transaction 1:", decodeOmniTransaction(encodedPayloadWithMarker1).params);
|
|
153
|
+
|
|
154
|
+
console.log("Encoded Transaction 2:", encodedPayloadWithMarker2);
|
|
155
|
+
console.log("Is Transaction 2 Payload Size Valid:", isPayloadSizeValid(encodedPayloadWithMarker2));
|
|
156
|
+
console.log("Decoded Transaction 2:", decodeOmniTransaction(encodedPayloadWithMarker2).params);
|
|
157
|
+
|
|
158
|
+
console.log("Encoded Transaction 3:", encodedPayloadWithMarker3);
|
|
159
|
+
console.log("Is Transaction 3 Payload Size Valid:", isPayloadSizeValid(encodedPayloadWithMarker3));
|
|
160
|
+
console.log("Decoded Transaction 3:", decodeOmniTransaction(encodedPayloadWithMarker3).params);
|
|
161
|
+
|
|
162
|
+
console.log("Encoded Transaction 4:", encodedPayloadWithMarker4);
|
|
163
|
+
console.log("Is Transaction 4 Payload Size Valid:", isPayloadSizeValid(encodedPayloadWithMarker4));
|
|
164
|
+
console.log("Decoded Transaction 4:", decodeOmniTransaction(encodedPayloadWithMarker4).params);
|
|
165
|
+
|
|
166
|
+
console.log("Encoded Transaction 5:", encodedPayloadWithMarker5);
|
|
167
|
+
console.log("Is Transaction 5 Payload Size Valid:", isPayloadSizeValid(encodedPayloadWithMarker5));
|
|
168
|
+
console.log("Decoded Transaction 5:", decodeOmniTransaction(encodedPayloadWithMarker5).params);
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
const litecoin = require('litecoin');
|
|
2
|
+
|
|
3
|
+
const client = new litecoin.Client({
|
|
4
|
+
host: '127.0.0.1',
|
|
5
|
+
port: 8332, // Litecoin RPC port (default is 9332)
|
|
6
|
+
user: 'user',
|
|
7
|
+
pass: 'pass',
|
|
8
|
+
timeout: 10000
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
var hasOPReturn= true;
|
|
12
|
+
var payload =""
|
|
13
|
+
var payload2= ""
|
|
14
|
+
var senderVout =0
|
|
15
|
+
|
|
16
|
+
const tx = "70d0cc07326bd1c55dbada54217d211933f1eef59fefd869aa12dfeb9fd6347d";
|
|
17
|
+
|
|
18
|
+
console.log("Fetching raw transaction...");
|
|
19
|
+
|
|
20
|
+
/*client.cmd('createwallet',function(err,wallet){
|
|
21
|
+
console.log(wallet)
|
|
22
|
+
})*/
|
|
23
|
+
|
|
24
|
+
client.getRawTransaction(tx, true, function (err, rawtx) {
|
|
25
|
+
if (err) {
|
|
26
|
+
console.error("Error:", err);
|
|
27
|
+
} else {
|
|
28
|
+
console.log(rawtx)
|
|
29
|
+
var confirmations=confirmations
|
|
30
|
+
for (let v = 0; v < rawtx.vout.length; v++) {
|
|
31
|
+
console.log(v)
|
|
32
|
+
var vout = rawtx.vout[v];
|
|
33
|
+
var ASMstring = vout.scriptPubKey.asm.slice(0,9);
|
|
34
|
+
payload2=JSON.stringify(rawtx.vout[2].scriptPubKey.asm)
|
|
35
|
+
console.log(ASMstring)
|
|
36
|
+
if (ASMstring === "OP_RETURN" && confirmations >= 1) {
|
|
37
|
+
hasOPReturn=true
|
|
38
|
+
var payload = vout.scriptPubKey.asm.slice(11,vout.scriptPubKey.asm.length);
|
|
39
|
+
console.log(payload)
|
|
40
|
+
var marker =decode(payload.slice(0,1))
|
|
41
|
+
|
|
42
|
+
var txObj = { tx: tx, payload: payload, marker: marker };
|
|
43
|
+
console.log(decodedPayload,marker,txObj)
|
|
44
|
+
if (marker === "om") {
|
|
45
|
+
marker = payload.slice(0,3)
|
|
46
|
+
txObj.marker=marker
|
|
47
|
+
payload=payload.slice(4,payload.length)
|
|
48
|
+
txObj.payload=payload
|
|
49
|
+
omniTxCount+=1
|
|
50
|
+
console.log("Omni tx "+omniTxCount)
|
|
51
|
+
thisBlockOm.push(txObj);
|
|
52
|
+
}
|
|
53
|
+
if (marker === "tl") {
|
|
54
|
+
payload=payload.slice(2,payload.length)
|
|
55
|
+
txObj.payload=payload
|
|
56
|
+
thisBlockTl.push(txObj);
|
|
57
|
+
}
|
|
58
|
+
} else if (ASMstring === "OP_RETURN" && confirmations === 0) {
|
|
59
|
+
hasOPReturn=true
|
|
60
|
+
var payload = vout.scriptPubKey.asm.split(' ');
|
|
61
|
+
var decodedPayload = decodeOPReturnPayload(payload);
|
|
62
|
+
var marker = decodedPayload.slice(0, 1);
|
|
63
|
+
var txObj = { tx: tx, payload: payload, decode: decode, marker: marker };
|
|
64
|
+
if (marker === "om" || marker === "tl") {
|
|
65
|
+
memPool.push(tx);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Parse the sender (first input)
|
|
70
|
+
const sender = rawtx.vin[0].txid
|
|
71
|
+
const senderVout = rawtx.vin[0].vout
|
|
72
|
+
|
|
73
|
+
// Parse the reference address (second output)
|
|
74
|
+
const referenceAddress = rawtx.vout[1].scriptPubKey.addresses[0]
|
|
75
|
+
const referenceValue = rawtx.vout[1].value;
|
|
76
|
+
|
|
77
|
+
const changeAddress=rawtx.vout[0].scriptPubKey.addresses[0]
|
|
78
|
+
const changeValue = rawtx.vout[0].value;
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
console.log('Sender:', sender);
|
|
82
|
+
console.log('Reference Address:', referenceAddress);
|
|
83
|
+
console.log('Reference Value (Satoshi):', referenceValue);
|
|
84
|
+
console.log('Change Address:', changeAddress);
|
|
85
|
+
console.log('Change Value (Satoshi):', changeValue);
|
|
86
|
+
|
|
87
|
+
if (hasOPReturn) {
|
|
88
|
+
console.log('OP_Return Output Data:', payload2.slice(10,payload2.length-1) );
|
|
89
|
+
const stringBuffer = Buffer.from(payload2.slice(10,payload2.length-1), 'hex');
|
|
90
|
+
console.log(stringBuffer)
|
|
91
|
+
const text = stringBuffer.toString('utf8');
|
|
92
|
+
console.log("decoded hex: "+text);
|
|
93
|
+
} else {
|
|
94
|
+
console.log('No OP_Return Output found in the transaction.');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
client.getRawTransaction(sender, true, function(err,rawtx){
|
|
98
|
+
var senderAddress=rawtx.vout[senderVout].scriptPubKey.addresses[0]
|
|
99
|
+
console.log("Sender Address "+senderAddress)
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function testPayloadSeparation(hexPayload) {
|
|
2
|
+
// Decode from hex to plaintext
|
|
3
|
+
const asmBuffer = new Buffer(hexPayload, "hex");
|
|
4
|
+
const message = asmBuffer.toString();
|
|
5
|
+
console.log(message);
|
|
6
|
+
// Assuming the payload format is 'tlXX' where XX are digits
|
|
7
|
+
if (!plaintextPayload.startsWith('tl')) {
|
|
8
|
+
throw new Error('Invalid payload');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const marker = plaintextPayload.substring(0, 2); // 'tl'
|
|
12
|
+
const restOfPayload = plaintextPayload.substring(2); // '00' in this case
|
|
13
|
+
|
|
14
|
+
const transactionId = restOfPayload.charAt(0); // First '0'
|
|
15
|
+
const otherData = restOfPayload.substring(1); // Second '0'
|
|
16
|
+
|
|
17
|
+
console.log(`Marker: ${marker}`);
|
|
18
|
+
console.log(`Transaction ID: ${transactionId}`);
|
|
19
|
+
console.log(`Other Data: ${otherData}`);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Example usage
|
|
23
|
+
testPayloadSeparation('808479860');
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const Litecoin = require('litecoin'); // Replace with actual library import
|
|
2
|
+
const async = require('async')
|
|
3
|
+
const STANDARD_FEE = 0.0001; // Standard fee in LTC
|
|
4
|
+
const client = new Litecoin.Client({
|
|
5
|
+
host: '127.0.0.1',
|
|
6
|
+
port: 18332,
|
|
7
|
+
user: 'user',
|
|
8
|
+
pass: 'pass',
|
|
9
|
+
timeout: 10000
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const util = require('util');
|
|
13
|
+
// ... rest of your setup ...
|
|
14
|
+
|
|
15
|
+
// Promisify the createRawTransaction function
|
|
16
|
+
client.createRawTransaction = util.promisify(client.createRawTransaction);
|
|
17
|
+
|
|
18
|
+
async function createRawTransaction() {
|
|
19
|
+
try {
|
|
20
|
+
const inputs = [{
|
|
21
|
+
"txid": "57dbb47d8db6249b720421d78052e6f168664f3c062f1fbe187270ff5edd4dc5",
|
|
22
|
+
"vout": 1
|
|
23
|
+
}];
|
|
24
|
+
|
|
25
|
+
// Specify the output with the address and amount (example amount here is 0.01 LTC)
|
|
26
|
+
const outputs = {
|
|
27
|
+
"tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8": 0.01
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const rawTx = await client.createRawTransaction(inputs, outputs);
|
|
31
|
+
if (rawTx) {
|
|
32
|
+
console.log('Raw Transaction:', rawTx);
|
|
33
|
+
} else {
|
|
34
|
+
console.log('Raw Transaction is undefined. Check if litecoind is running and accepting RPC commands.');
|
|
35
|
+
}
|
|
36
|
+
return rawTx;
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.error('Error creating raw transaction:', error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
createRawTransaction();
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
/*client.createRawTransaction([{txid:"57dbb47d8db6249b720421d78052e6f168664f3c062f1fbe187270ff5edd4dc5",vout:1}],[{
|
|
46
|
+
"tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8": 0.01
|
|
47
|
+
}],function(err,data){
|
|
48
|
+
if(err){console.log(err)}
|
|
49
|
+
console.log(data)
|
|
50
|
+
})*/
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const Logic = require('./Logic'); // Assuming Logic is the module with your business logic
|
|
2
|
+
const TxUtils = require('./TxUtils'); // Assuming TxUtils contains your utility functions
|
|
3
|
+
|
|
4
|
+
async function testSendLargeAmount() {
|
|
5
|
+
// Initialize components
|
|
6
|
+
const adminAddress = 'tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8'; // Replace with actual admin address
|
|
7
|
+
const TLVESTPropertyId = 2; // Assuming TLVEST has property ID 2
|
|
8
|
+
const largeAmount = 2000000;
|
|
9
|
+
// Send a large amount of TLVEST from admin address
|
|
10
|
+
try {
|
|
11
|
+
const sendTxId = await TxUtils.sendTransaction(adminAddress, 'LNmiS6p8z3KuHHx3q6Jf6x6TfcyptE68oP', TLVESTPropertyId, largeAmount, false);
|
|
12
|
+
console.log('Send Transaction ID:', sendTxId);
|
|
13
|
+
} catch (error) {
|
|
14
|
+
console.log('Expected error:', error.message);
|
|
15
|
+
// Assertions (pseudo-code)
|
|
16
|
+
// assert(error.message.includes('Insufficient balance'), 'Transaction should be invalid due to insufficient balance');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
testSendLargeAmount();
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const Litecoin = require('litecoin'); // Replace with actual library import
|
|
2
|
+
const util = require('util');
|
|
3
|
+
const bitcore = require('bitcore-lib-ltc');
|
|
4
|
+
|
|
5
|
+
const client = new Litecoin.Client({
|
|
6
|
+
host: '127.0.0.1',
|
|
7
|
+
port: 18332,
|
|
8
|
+
user: 'user',
|
|
9
|
+
pass: 'pass',
|
|
10
|
+
timeout: 10000
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
var privateKey = new litecore.PrivateKey('L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy');
|
|
15
|
+
var utxo = {
|
|
16
|
+
"txId" : "115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986",
|
|
17
|
+
"outputIndex" : 0,
|
|
18
|
+
"address" : "17XBj6iFEsf8kzDMGQk5ghZipxX49VXuaV",
|
|
19
|
+
"script" : "76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac",
|
|
20
|
+
"satoshis" : 50000
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
var transaction = new litecore.Transaction()
|
|
24
|
+
.from(utxo)
|
|
25
|
+
.to('tltc1qq95gckx4lg8c9pvcajh5kgg5ahdk5t6mjyyynl', 15000)
|
|
26
|
+
.sign(privateKey);
|
|
27
|
+
|
|
28
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const Litecoin = require('litecoin'); // Replace with actual library import
|
|
2
|
+
const util = require('util');
|
|
3
|
+
const litecore = require('bitcore-lib-ltc');
|
|
4
|
+
const txUtils = require('C:/projects/tradelayer.js/txUtilsA.js')
|
|
5
|
+
const fee = 1000
|
|
6
|
+
|
|
7
|
+
const client = new Litecoin.Client({
|
|
8
|
+
host: '127.0.0.1',
|
|
9
|
+
port: 18332,
|
|
10
|
+
user: 'user',
|
|
11
|
+
pass: 'pass',
|
|
12
|
+
timeout: 10000
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const sendrawtransactionAsync = util.promisify(client.cmd.bind(client, 'sendrawtransaction'));
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
//var privateKey = new litecore.PrivateKey('tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8');
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
async function main(){
|
|
22
|
+
// Define the minimum amount in satoshis
|
|
23
|
+
const minAmountSatoshis = 15000; // Adjust this value as needed
|
|
24
|
+
|
|
25
|
+
// Find a suitable UTXO
|
|
26
|
+
var utxo = await txUtils.findSuitableUTXO('tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8', minAmountSatoshis);
|
|
27
|
+
console.log(utxo)
|
|
28
|
+
var transaction = new litecore.Transaction()
|
|
29
|
+
.from(utxo)
|
|
30
|
+
.to('tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8', 14000)
|
|
31
|
+
.addData('litecore rocks')
|
|
32
|
+
.change('tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8')
|
|
33
|
+
.fee(fee)
|
|
34
|
+
.sign('cNGCJhHBSQM2Kedc8Zc6x9VYe9dQuvanqfS61D3tczZnDD3HwYUW');
|
|
35
|
+
const serializedTx = transaction.serialize();
|
|
36
|
+
const txid = await sendrawtransactionAsync(serializedTx);
|
|
37
|
+
console.log(txid)
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
main()
|