@atomiqlabs/chain-starknet 1.0.0-beta.0

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 (136) hide show
  1. package/LICENSE +201 -0
  2. package/dist/get_serialized_block.d.ts +1 -0
  3. package/dist/get_serialized_block.js +28 -0
  4. package/dist/index.d.ts +34 -0
  5. package/dist/index.js +50 -0
  6. package/dist/starknet/StarknetChainType.d.ts +9 -0
  7. package/dist/starknet/StarknetChainType.js +2 -0
  8. package/dist/starknet/StarknetInitializer.d.ts +18 -0
  9. package/dist/starknet/StarknetInitializer.js +49 -0
  10. package/dist/starknet/base/StarknetAction.d.ts +27 -0
  11. package/dist/starknet/base/StarknetAction.js +73 -0
  12. package/dist/starknet/base/StarknetBase.d.ts +34 -0
  13. package/dist/starknet/base/StarknetBase.js +29 -0
  14. package/dist/starknet/base/StarknetModule.d.ts +14 -0
  15. package/dist/starknet/base/StarknetModule.js +13 -0
  16. package/dist/starknet/base/modules/ERC20Abi.d.ts +755 -0
  17. package/dist/starknet/base/modules/ERC20Abi.js +1032 -0
  18. package/dist/starknet/base/modules/StarknetAccounts.d.ts +6 -0
  19. package/dist/starknet/base/modules/StarknetAccounts.js +24 -0
  20. package/dist/starknet/base/modules/StarknetAddresses.d.ts +9 -0
  21. package/dist/starknet/base/modules/StarknetAddresses.js +26 -0
  22. package/dist/starknet/base/modules/StarknetBlocks.d.ts +19 -0
  23. package/dist/starknet/base/modules/StarknetBlocks.js +49 -0
  24. package/dist/starknet/base/modules/StarknetEvents.d.ts +44 -0
  25. package/dist/starknet/base/modules/StarknetEvents.js +88 -0
  26. package/dist/starknet/base/modules/StarknetFees.d.ts +55 -0
  27. package/dist/starknet/base/modules/StarknetFees.js +102 -0
  28. package/dist/starknet/base/modules/StarknetSignatures.d.ts +30 -0
  29. package/dist/starknet/base/modules/StarknetSignatures.js +71 -0
  30. package/dist/starknet/base/modules/StarknetTokens.d.ts +67 -0
  31. package/dist/starknet/base/modules/StarknetTokens.js +97 -0
  32. package/dist/starknet/base/modules/StarknetTransactions.d.ts +87 -0
  33. package/dist/starknet/base/modules/StarknetTransactions.js +226 -0
  34. package/dist/starknet/btcrelay/BtcRelayAbi.d.ts +250 -0
  35. package/dist/starknet/btcrelay/BtcRelayAbi.js +341 -0
  36. package/dist/starknet/btcrelay/StarknetBtcRelay.d.ts +166 -0
  37. package/dist/starknet/btcrelay/StarknetBtcRelay.js +323 -0
  38. package/dist/starknet/btcrelay/headers/StarknetBtcHeader.d.ts +32 -0
  39. package/dist/starknet/btcrelay/headers/StarknetBtcHeader.js +74 -0
  40. package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.d.ts +52 -0
  41. package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.js +113 -0
  42. package/dist/starknet/contract/StarknetContractBase.d.ts +13 -0
  43. package/dist/starknet/contract/StarknetContractBase.js +18 -0
  44. package/dist/starknet/contract/modules/StarknetContractEvents.d.ts +40 -0
  45. package/dist/starknet/contract/modules/StarknetContractEvents.js +77 -0
  46. package/dist/starknet/events/StarknetChainEvents.d.ts +19 -0
  47. package/dist/starknet/events/StarknetChainEvents.js +51 -0
  48. package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +73 -0
  49. package/dist/starknet/events/StarknetChainEventsBrowser.js +210 -0
  50. package/dist/starknet/swaps/EscrowManagerAbi.d.ts +445 -0
  51. package/dist/starknet/swaps/EscrowManagerAbi.js +601 -0
  52. package/dist/starknet/swaps/StarknetSwapContract.d.ts +215 -0
  53. package/dist/starknet/swaps/StarknetSwapContract.js +452 -0
  54. package/dist/starknet/swaps/StarknetSwapData.d.ts +74 -0
  55. package/dist/starknet/swaps/StarknetSwapData.js +316 -0
  56. package/dist/starknet/swaps/StarknetSwapModule.d.ts +9 -0
  57. package/dist/starknet/swaps/StarknetSwapModule.js +12 -0
  58. package/dist/starknet/swaps/handlers/IHandler.d.ts +13 -0
  59. package/dist/starknet/swaps/handlers/IHandler.js +2 -0
  60. package/dist/starknet/swaps/handlers/claim/ClaimHandlers.d.ts +13 -0
  61. package/dist/starknet/swaps/handlers/claim/ClaimHandlers.js +13 -0
  62. package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.d.ts +22 -0
  63. package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.js +44 -0
  64. package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +25 -0
  65. package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +48 -0
  66. package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +26 -0
  67. package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +40 -0
  68. package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +20 -0
  69. package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +29 -0
  70. package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +64 -0
  71. package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +86 -0
  72. package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -0
  73. package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.js +27 -0
  74. package/dist/starknet/swaps/modules/StarknetLpVault.d.ts +69 -0
  75. package/dist/starknet/swaps/modules/StarknetLpVault.js +122 -0
  76. package/dist/starknet/swaps/modules/StarknetSwapClaim.d.ts +53 -0
  77. package/dist/starknet/swaps/modules/StarknetSwapClaim.js +100 -0
  78. package/dist/starknet/swaps/modules/StarknetSwapInit.d.ts +84 -0
  79. package/dist/starknet/swaps/modules/StarknetSwapInit.js +164 -0
  80. package/dist/starknet/swaps/modules/StarknetSwapRefund.d.ts +64 -0
  81. package/dist/starknet/swaps/modules/StarknetSwapRefund.js +131 -0
  82. package/dist/starknet/swaps/modules/SwapClaim.d.ts +54 -0
  83. package/dist/starknet/swaps/modules/SwapClaim.js +115 -0
  84. package/dist/starknet/swaps/modules/SwapInit.d.ts +79 -0
  85. package/dist/starknet/swaps/modules/SwapInit.js +174 -0
  86. package/dist/starknet/swaps/modules/SwapRefund.d.ts +63 -0
  87. package/dist/starknet/swaps/modules/SwapRefund.js +149 -0
  88. package/dist/starknet/wallet/StarknetKeypairWallet.d.ts +6 -0
  89. package/dist/starknet/wallet/StarknetKeypairWallet.js +26 -0
  90. package/dist/starknet/wallet/StarknetSigner.d.ts +12 -0
  91. package/dist/starknet/wallet/StarknetSigner.js +46 -0
  92. package/dist/utils/Utils.d.ts +38 -0
  93. package/dist/utils/Utils.js +255 -0
  94. package/package.json +39 -0
  95. package/src/index.ts +41 -0
  96. package/src/starknet/StarknetChainType.ts +20 -0
  97. package/src/starknet/StarknetInitializer.ts +75 -0
  98. package/src/starknet/base/StarknetAction.ts +90 -0
  99. package/src/starknet/base/StarknetBase.ts +56 -0
  100. package/src/starknet/base/StarknetModule.ts +20 -0
  101. package/src/starknet/base/modules/ERC20Abi.ts +1029 -0
  102. package/src/starknet/base/modules/StarknetAccounts.ts +26 -0
  103. package/src/starknet/base/modules/StarknetAddresses.ts +23 -0
  104. package/src/starknet/base/modules/StarknetBlocks.ts +59 -0
  105. package/src/starknet/base/modules/StarknetEvents.ts +105 -0
  106. package/src/starknet/base/modules/StarknetFees.ts +136 -0
  107. package/src/starknet/base/modules/StarknetSignatures.ts +91 -0
  108. package/src/starknet/base/modules/StarknetTokens.ts +116 -0
  109. package/src/starknet/base/modules/StarknetTransactions.ts +254 -0
  110. package/src/starknet/btcrelay/BtcRelayAbi.ts +338 -0
  111. package/src/starknet/btcrelay/StarknetBtcRelay.ts +415 -0
  112. package/src/starknet/btcrelay/headers/StarknetBtcHeader.ts +101 -0
  113. package/src/starknet/btcrelay/headers/StarknetBtcStoredHeader.ts +142 -0
  114. package/src/starknet/contract/StarknetContractBase.ts +29 -0
  115. package/src/starknet/contract/modules/StarknetContractEvents.ts +108 -0
  116. package/src/starknet/events/StarknetChainEvents.ts +63 -0
  117. package/src/starknet/events/StarknetChainEventsBrowser.ts +289 -0
  118. package/src/starknet/swaps/EscrowManagerAbi.ts +600 -0
  119. package/src/starknet/swaps/StarknetSwapContract.ts +694 -0
  120. package/src/starknet/swaps/StarknetSwapData.ts +441 -0
  121. package/src/starknet/swaps/StarknetSwapModule.ts +17 -0
  122. package/src/starknet/swaps/handlers/IHandler.ts +20 -0
  123. package/src/starknet/swaps/handlers/claim/ClaimHandlers.ts +23 -0
  124. package/src/starknet/swaps/handlers/claim/HashlockClaimHandler.ts +54 -0
  125. package/src/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +73 -0
  126. package/src/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +67 -0
  127. package/src/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +49 -0
  128. package/src/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +151 -0
  129. package/src/starknet/swaps/handlers/refund/TimelockRefundHandler.ts +39 -0
  130. package/src/starknet/swaps/modules/StarknetLpVault.ts +148 -0
  131. package/src/starknet/swaps/modules/StarknetSwapClaim.ts +142 -0
  132. package/src/starknet/swaps/modules/StarknetSwapInit.ts +226 -0
  133. package/src/starknet/swaps/modules/StarknetSwapRefund.ts +202 -0
  134. package/src/starknet/wallet/StarknetKeypairWallet.ts +34 -0
  135. package/src/starknet/wallet/StarknetSigner.ts +55 -0
  136. package/src/utils/Utils.ts +247 -0
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findLastIndex = exports.parseInitFunctionCalldata = exports.poseidonHashRange = exports.bufferToByteArray = exports.bufferToBytes31Span = exports.bytes31SpanToBuffer = exports.toBigInt = exports.bigNumberishToBuffer = exports.u32ReverseEndianness = exports.bufferToU32Array = exports.u32ArrayToBuffer = exports.calculateHash = exports.toHex = exports.tryWithRetries = exports.getLogger = exports.onceAsync = exports.timeoutPromise = exports.isUint256 = void 0;
4
+ const starknet_types_07_1 = require("starknet-types-07");
5
+ const starknet_1 = require("starknet");
6
+ const buffer_1 = require("buffer");
7
+ const StarknetSwapData_1 = require("../starknet/swaps/StarknetSwapData");
8
+ function isUint256(val) {
9
+ return val.low != null && val.high != null;
10
+ }
11
+ exports.isUint256 = isUint256;
12
+ function timeoutPromise(timeoutMillis, abortSignal) {
13
+ return new Promise((resolve, reject) => {
14
+ const timeout = setTimeout(resolve, timeoutMillis);
15
+ if (abortSignal != null)
16
+ abortSignal.addEventListener("abort", () => {
17
+ clearTimeout(timeout);
18
+ reject(new Error("Aborted"));
19
+ });
20
+ });
21
+ }
22
+ exports.timeoutPromise = timeoutPromise;
23
+ function onceAsync(executor) {
24
+ let promise;
25
+ return () => {
26
+ if (promise == null) {
27
+ promise = executor();
28
+ return promise;
29
+ }
30
+ else {
31
+ return promise.catch(() => promise = executor());
32
+ }
33
+ };
34
+ }
35
+ exports.onceAsync = onceAsync;
36
+ function getLogger(prefix) {
37
+ return {
38
+ debug: (msg, ...args) => console.debug(prefix + msg, ...args),
39
+ info: (msg, ...args) => console.info(prefix + msg, ...args),
40
+ warn: (msg, ...args) => console.warn(prefix + msg, ...args),
41
+ error: (msg, ...args) => console.error(prefix + msg, ...args)
42
+ };
43
+ }
44
+ exports.getLogger = getLogger;
45
+ const logger = getLogger("Utils: ");
46
+ async function tryWithRetries(func, retryPolicy, errorAllowed, abortSignal) {
47
+ retryPolicy = retryPolicy || {};
48
+ retryPolicy.maxRetries = retryPolicy.maxRetries || 5;
49
+ retryPolicy.delay = retryPolicy.delay || 500;
50
+ retryPolicy.exponential = retryPolicy.exponential == null ? true : retryPolicy.exponential;
51
+ let err = null;
52
+ for (let i = 0; i < retryPolicy.maxRetries; i++) {
53
+ try {
54
+ const resp = await func();
55
+ return resp;
56
+ }
57
+ catch (e) {
58
+ if (errorAllowed != null && errorAllowed(e))
59
+ throw e;
60
+ err = e;
61
+ logger.error("tryWithRetries(): error on try number: " + i, e);
62
+ }
63
+ if (abortSignal != null && abortSignal.aborted)
64
+ throw new Error("Aborted");
65
+ if (i !== retryPolicy.maxRetries - 1) {
66
+ await timeoutPromise(retryPolicy.exponential ? retryPolicy.delay * Math.pow(2, i) : retryPolicy.delay, abortSignal);
67
+ }
68
+ }
69
+ throw err;
70
+ }
71
+ exports.tryWithRetries = tryWithRetries;
72
+ function toHex(value, length = 64) {
73
+ if (value == null)
74
+ return null;
75
+ switch (typeof (value)) {
76
+ case "string":
77
+ if (value.startsWith("0x")) {
78
+ return "0x" + value.slice(2).padStart(length, "0");
79
+ }
80
+ else {
81
+ return "0x" + BigInt(value).toString(16).padStart(length, "0");
82
+ }
83
+ case "number":
84
+ case "bigint":
85
+ return "0x" + value.toString(16).padStart(length, "0");
86
+ }
87
+ return "0x" + value.toString("hex").padStart(length, "0");
88
+ }
89
+ exports.toHex = toHex;
90
+ function calculateHash(tx) {
91
+ const commonData = {
92
+ version: tx.details.version,
93
+ maxFee: tx.details.maxFee,
94
+ chainId: tx.details.chainId,
95
+ nonce: tx.details.nonce,
96
+ accountDeploymentData: tx.details.version === "0x3" ? tx.details.accountDeploymentData : null,
97
+ nonceDataAvailabilityMode: tx.details.version === "0x3" ? starknet_types_07_1.EDAMode[tx.details.nonceDataAvailabilityMode] : null,
98
+ feeDataAvailabilityMode: tx.details.version === "0x3" ? starknet_types_07_1.EDAMode[tx.details.feeDataAvailabilityMode] : null,
99
+ resourceBounds: tx.details.version === "0x3" ? tx.details.resourceBounds : null,
100
+ tip: tx.details.version === "0x3" ? tx.details.tip : null,
101
+ paymasterData: tx.details.version === "0x3" ? tx.details.paymasterData : null
102
+ };
103
+ switch (tx.type) {
104
+ case "INVOKE":
105
+ const invokeData = starknet_1.CallData.compile(tx.signed.calldata);
106
+ return tx.txId = starknet_1.hash.calculateInvokeTransactionHash({
107
+ senderAddress: tx.details.walletAddress,
108
+ compiledCalldata: invokeData,
109
+ ...commonData
110
+ });
111
+ case "DEPLOY_ACCOUNT":
112
+ const deployAccountData = starknet_1.CallData.compile(tx.signed.constructorCalldata);
113
+ return tx.txId = starknet_1.hash.calculateDeployAccountTransactionHash({
114
+ contractAddress: tx.tx.contractAddress,
115
+ classHash: tx.signed.classHash,
116
+ constructorCalldata: deployAccountData,
117
+ compiledConstructorCalldata: deployAccountData,
118
+ salt: tx.signed.addressSalt,
119
+ ...commonData
120
+ });
121
+ default:
122
+ throw new Error("Unsupported tx type!");
123
+ }
124
+ }
125
+ exports.calculateHash = calculateHash;
126
+ function u32ArrayToBuffer(arr) {
127
+ const buffer = buffer_1.Buffer.alloc(4 * arr.length);
128
+ for (let i = 0; i < arr.length; i++) {
129
+ buffer.writeUInt32BE(Number(arr[i]), i * 4);
130
+ }
131
+ return buffer;
132
+ }
133
+ exports.u32ArrayToBuffer = u32ArrayToBuffer;
134
+ function bufferToU32Array(buffer) {
135
+ const result = [];
136
+ for (let i = 0; i < buffer.length; i += 4) {
137
+ result.push(buffer.readUInt32BE(i));
138
+ }
139
+ return result;
140
+ }
141
+ exports.bufferToU32Array = bufferToU32Array;
142
+ function u32ReverseEndianness(value) {
143
+ const valueBN = BigInt(value);
144
+ return Number(((valueBN & 0xffn) << 24n) |
145
+ ((valueBN & 0xff00n) << 8n) |
146
+ ((valueBN >> 8n) & 0xff00n) |
147
+ ((valueBN >> 24n) & 0xffn));
148
+ }
149
+ exports.u32ReverseEndianness = u32ReverseEndianness;
150
+ function bigNumberishToBuffer(value, length) {
151
+ if (isUint256(value)) {
152
+ return buffer_1.Buffer.concat([bigNumberishToBuffer(value.high, 16), bigNumberishToBuffer(value.low, 16)]);
153
+ }
154
+ if (typeof (value) === "string") {
155
+ if (value.startsWith("0x")) {
156
+ value = value.slice(2);
157
+ }
158
+ else {
159
+ value = BigInt(value).toString(16);
160
+ }
161
+ }
162
+ else {
163
+ value = value.toString(16);
164
+ }
165
+ const buff = buffer_1.Buffer.from(value.padStart(length * 2, "0"), "hex");
166
+ if (buff.length > length)
167
+ return buff.subarray(buff.length - length);
168
+ return buff;
169
+ }
170
+ exports.bigNumberishToBuffer = bigNumberishToBuffer;
171
+ function toBigInt(value) {
172
+ if (value == null)
173
+ return null;
174
+ if (isUint256(value)) {
175
+ return (toBigInt(value.high) << 128n) | toBigInt(value.low);
176
+ }
177
+ if (typeof (value) === "string") {
178
+ if (!value.startsWith("0x"))
179
+ value = "0x" + value;
180
+ return BigInt(value);
181
+ }
182
+ if (typeof (value) === "bigint") {
183
+ return value;
184
+ }
185
+ return BigInt(value);
186
+ }
187
+ exports.toBigInt = toBigInt;
188
+ function bytes31SpanToBuffer(span, length) {
189
+ const buffers = [];
190
+ const numFullBytes31 = Math.floor(length / 31);
191
+ const additionalBytes = length - (numFullBytes31 * 31);
192
+ const requiredSpanLength = numFullBytes31 + (additionalBytes === 0 ? 0 : 1);
193
+ if (span.length < requiredSpanLength)
194
+ throw new Error("Not enough bytes in the felt array!");
195
+ let i = 0;
196
+ for (; i < numFullBytes31; i++) {
197
+ buffers.push(bigNumberishToBuffer(span[i], 31));
198
+ }
199
+ if (additionalBytes !== 0)
200
+ buffers.push(bigNumberishToBuffer(span[i], additionalBytes));
201
+ return buffer_1.Buffer.concat(buffers);
202
+ }
203
+ exports.bytes31SpanToBuffer = bytes31SpanToBuffer;
204
+ function bufferToBytes31Span(buffer, startIndex = 0, endIndex = buffer.length) {
205
+ const values = [];
206
+ for (let i = startIndex + 31; i < endIndex; i += 31) {
207
+ values.push(BigInt("0x" + buffer.subarray(i - 31, i).toString("hex")));
208
+ }
209
+ if (endIndex > startIndex + (values.length * 31))
210
+ values.push(BigInt("0x" + buffer.subarray(startIndex + (values.length * 31), endIndex).toString("hex")));
211
+ return values;
212
+ }
213
+ exports.bufferToBytes31Span = bufferToBytes31Span;
214
+ function bufferToByteArray(buffer, startIndex = 0, endIndex = buffer.length) {
215
+ const values = [];
216
+ for (let i = startIndex + 31; i < endIndex; i += 31) {
217
+ values.push(BigInt("0x" + buffer.subarray(i - 31, i).toString("hex")));
218
+ }
219
+ let pendingWord = BigInt(0);
220
+ let pendingWordLen = BigInt(endIndex - (startIndex + (values.length * 31)));
221
+ if (pendingWordLen !== BigInt(0)) {
222
+ pendingWord = BigInt("0x" + buffer.subarray(startIndex + (values.length * 31), endIndex).toString("hex"));
223
+ }
224
+ return [
225
+ BigInt(values.length),
226
+ ...values,
227
+ pendingWord,
228
+ pendingWordLen
229
+ ];
230
+ }
231
+ exports.bufferToByteArray = bufferToByteArray;
232
+ function poseidonHashRange(buffer, startIndex = 0, endIndex = buffer.length) {
233
+ return starknet_1.hash.computePoseidonHashOnElements(bufferToBytes31Span(buffer, startIndex, endIndex));
234
+ }
235
+ exports.poseidonHashRange = poseidonHashRange;
236
+ function parseInitFunctionCalldata(calldata, claimHandler) {
237
+ const escrow = StarknetSwapData_1.StarknetSwapData.fromSerializedFeltArray(calldata, claimHandler);
238
+ const signatureLen = Number(toBigInt(calldata.shift()));
239
+ const signature = calldata.splice(0, signatureLen);
240
+ const timeout = toBigInt(calldata.shift());
241
+ const extraDataLen = Number(toBigInt(calldata.shift()));
242
+ const extraData = calldata.splice(0, extraDataLen);
243
+ if (calldata.length !== 0)
244
+ throw new Error("Calldata not read fully!");
245
+ return { escrow, signature, timeout, extraData };
246
+ }
247
+ exports.parseInitFunctionCalldata = parseInitFunctionCalldata;
248
+ function findLastIndex(array, callback) {
249
+ for (let i = array.length - 1; i >= 0; i--) {
250
+ if (callback(array[i], i))
251
+ return i;
252
+ }
253
+ return -1;
254
+ }
255
+ exports.findLastIndex = findLastIndex;
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@atomiqlabs/chain-starknet",
3
+ "version": "1.0.0-beta.0",
4
+ "description": "Starknet specific base implementation",
5
+ "main": "./dist/index.js",
6
+ "types:": "./dist/index.d.ts",
7
+ "scripts": {
8
+ "test": "echo \"Error: no test specified\" && exit 1"
9
+ },
10
+ "files": [
11
+ "/dist",
12
+ "/src"
13
+ ],
14
+ "keywords": [
15
+ "Starknet",
16
+ "Bitcoin",
17
+ "Cross-chain",
18
+ "Cryptocurrency",
19
+ "Bridge",
20
+ "Trustless"
21
+ ],
22
+ "author": "adambor",
23
+ "license": "ISC",
24
+ "dependencies": {
25
+ "@atomiqlabs/base": "8.0.0-beta.0",
26
+ "@scure/btc-signer": "1.6.0",
27
+ "abi-wan-kanabi": "2.2.4",
28
+ "buffer": "6.0.3",
29
+ "create-hash": "1.2.0",
30
+ "randombytes": "2.1.0"
31
+ },
32
+ "peerDependencies": {
33
+ "starknet": "^6.11.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/create-hash": "1.2.6",
37
+ "typescript": "4.9.5"
38
+ }
39
+ }
package/src/index.ts ADDED
@@ -0,0 +1,41 @@
1
+ export * from "./starknet/base/StarknetAction";
2
+ export * from "./starknet/base/StarknetBase";
3
+ export * from "./starknet/base/StarknetModule";
4
+
5
+ export * from "./starknet/base/modules/StarknetFees";
6
+ export * from "./starknet/base/modules/StarknetEvents";
7
+ export * from "./starknet/base/modules/StarknetTokens";
8
+ export * from "./starknet/base/modules/StarknetAddresses";
9
+ export * from "./starknet/base/modules/StarknetTransactions";
10
+ export * from "./starknet/base/modules/StarknetSignatures";
11
+
12
+ export * from "./starknet/btcrelay/headers/StarknetBtcStoredHeader";
13
+ export * from "./starknet/btcrelay/headers/StarknetBtcHeader";
14
+ export * from "./starknet/btcrelay/StarknetBtcRelay";
15
+
16
+ export * from "./starknet/contract/modules/StarknetContractEvents";
17
+ export * from "./starknet/contract/StarknetContractBase";
18
+
19
+ export * from "./starknet/swaps/StarknetSwapContract";
20
+ export * from "./starknet/swaps/StarknetSwapData";
21
+ export * from "./starknet/swaps/StarknetSwapModule";
22
+ export * from "./starknet/swaps/modules/StarknetLpVault";
23
+ export * from "./starknet/swaps/modules/StarknetSwapClaim";
24
+ export * from "./starknet/swaps/modules/StarknetSwapInit";
25
+ export * from "./starknet/swaps/modules/StarknetSwapRefund";
26
+ export * from "./starknet/swaps/handlers/IHandler";
27
+ export * from "./starknet/swaps/handlers/refund/TimelockRefundHandler";
28
+ export * from "./starknet/swaps/handlers/claim/ClaimHandlers";
29
+ export * from "./starknet/swaps/handlers/claim/HashlockClaimHandler";
30
+ export * from "./starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler";
31
+ export * from "./starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler";
32
+ export * from "./starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler";
33
+ export * from "./starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler";
34
+
35
+ export * from "./starknet/events/StarknetChainEventsBrowser";
36
+
37
+ export * from "./starknet/wallet/StarknetSigner";
38
+ export * from "./starknet/wallet/StarknetKeypairWallet";
39
+
40
+ export * from "./starknet/StarknetChainType";
41
+ export * from "./starknet/StarknetInitializer";
@@ -0,0 +1,20 @@
1
+ import {ChainType} from "@atomiqlabs/base";
2
+ import {StarknetTx} from "./base/modules/StarknetTransactions";
3
+ import {StarknetSigner} from "./wallet/StarknetSigner";
4
+ import {StarknetSwapData} from "./swaps/StarknetSwapData";
5
+ import {StarknetSwapContract} from "./swaps/StarknetSwapContract";
6
+ import {StarknetChainEventsBrowser} from "./events/StarknetChainEventsBrowser";
7
+ import {StarknetBtcRelay} from "./btcrelay/StarknetBtcRelay";
8
+ import {StarknetPreFetchVerification} from "./swaps/modules/StarknetSwapInit";
9
+
10
+ export type StarknetChainType = ChainType<
11
+ "STARKNET",
12
+ never,
13
+ StarknetPreFetchVerification,
14
+ StarknetTx,
15
+ StarknetSigner,
16
+ StarknetSwapData,
17
+ StarknetSwapContract,
18
+ StarknetChainEventsBrowser,
19
+ StarknetBtcRelay<any>
20
+ >;
@@ -0,0 +1,75 @@
1
+ import {constants, Provider, RpcProvider} from "starknet";
2
+ import {StarknetFees} from "./base/modules/StarknetFees";
3
+ import {StarknetRetryPolicy} from "./base/StarknetBase";
4
+ import {StarknetBtcRelay} from "./btcrelay/StarknetBtcRelay";
5
+ import {StarknetSwapContract} from "./swaps/StarknetSwapContract";
6
+ import {StarknetChainEventsBrowser} from "./events/StarknetChainEventsBrowser";
7
+ import {BaseTokenType, BitcoinNetwork, BitcoinRpc, ChainData, ChainInitializer} from "@atomiqlabs/base";
8
+ import {StarknetChainType} from "./StarknetChainType";
9
+ import {StarknetSwapData} from "./swaps/StarknetSwapData";
10
+
11
+ export type StarknetAssetsType = BaseTokenType<"ETH" | "STRK">;
12
+ export const StarknetAssets: StarknetAssetsType = {
13
+ ETH: {
14
+ address: "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
15
+ decimals: 18,
16
+ displayDecimals: 9
17
+ },
18
+ STRK: {
19
+ address: "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",
20
+ decimals: 18,
21
+ displayDecimals: 9
22
+ }
23
+ } as const;
24
+
25
+ export type StarknetOptions = {
26
+ rpcUrl: string | Provider,
27
+ retryPolicy?: StarknetRetryPolicy,
28
+ chainId?: constants.StarknetChainId,
29
+
30
+ swapContract?: string,
31
+ btcRelayContract?: string,
32
+
33
+ fees?: StarknetFees
34
+ }
35
+
36
+ export function initializeStarknet(
37
+ options: StarknetOptions,
38
+ bitcoinRpc: BitcoinRpc<any>,
39
+ network: BitcoinNetwork
40
+ ): ChainData<StarknetChainType> {
41
+ const provider = typeof(options.rpcUrl)==="string" ?
42
+ new RpcProvider({nodeUrl: options.rpcUrl}) :
43
+ options.rpcUrl;
44
+
45
+ const Fees = options.fees ?? new StarknetFees(provider, "ETH");
46
+
47
+ const chainId = options.chainId ??
48
+ (network===BitcoinNetwork.MAINNET ? constants.StarknetChainId.SN_MAIN : constants.StarknetChainId.SN_SEPOLIA);
49
+
50
+ const btcRelay = new StarknetBtcRelay(
51
+ chainId, provider, bitcoinRpc, options.btcRelayContract, options.retryPolicy, Fees
52
+ );
53
+
54
+ const swapContract = new StarknetSwapContract(
55
+ chainId, provider, btcRelay, options.swapContract, options.retryPolicy, Fees
56
+ );
57
+ const chainEvents = new StarknetChainEventsBrowser(swapContract);
58
+
59
+ return {
60
+ chainId: "STARKNET",
61
+ btcRelay,
62
+ swapContract,
63
+ chainEvents,
64
+ swapDataConstructor: StarknetSwapData
65
+ }
66
+ };
67
+
68
+ export type StarknetInitializerType = ChainInitializer<StarknetOptions, StarknetChainType, StarknetAssetsType>;
69
+ export const StarknetInitializer: StarknetInitializerType = {
70
+ chainId: "STARKNET",
71
+ chainType: null as StarknetChainType,
72
+ initializer: initializeStarknet,
73
+ tokens: StarknetAssets,
74
+ options: null as StarknetOptions
75
+ } as const;
@@ -0,0 +1,90 @@
1
+ import {Call} from "starknet";
2
+ import {StarknetBase} from "./StarknetBase";
3
+ import {StarknetTx} from "./modules/StarknetTransactions";
4
+
5
+ export type StarknetGas = {l1?: number, l2?: number};
6
+
7
+ export function sumStarknetGas(a: StarknetGas, b: StarknetGas) {
8
+ return {
9
+ l1: (a?.l1 ?? 0) + (b?.l1 ?? 0),
10
+ l2: (a?.l2 ?? 0) + (b?.l2 ?? 0)
11
+ }
12
+ }
13
+
14
+ export class StarknetAction {
15
+
16
+ L1GasLimit: number;
17
+ L2GasLimit: number;
18
+ readonly mainSigner: string;
19
+ private readonly root: StarknetBase;
20
+ private readonly instructions: Call[];
21
+ private feeRate: string;
22
+
23
+ constructor(
24
+ mainSigner: string,
25
+ root: StarknetBase,
26
+ instructions: Call[] | Call = [],
27
+ gasLimit?: StarknetGas,
28
+ feeRate?: string
29
+ ) {
30
+ this.mainSigner = mainSigner;
31
+ this.root = root;
32
+ this.instructions = Array.isArray(instructions) ? instructions : [instructions];
33
+ this.L1GasLimit = gasLimit?.l1 ?? 0;
34
+ this.L2GasLimit = gasLimit?.l2 ?? 0;
35
+ this.feeRate = feeRate;
36
+ }
37
+
38
+ private estimateFeeRate(): Promise<string> {
39
+ return this.root.Fees.getFeeRate();
40
+ }
41
+
42
+ public addIx(instruction: Call, gasLimit?: StarknetGas) {
43
+ this.instructions.push(instruction);
44
+ this.L1GasLimit += gasLimit?.l1 ?? 0;
45
+ this.L2GasLimit += gasLimit?.l2 ?? 0;
46
+ }
47
+
48
+ public add(action: StarknetAction): this {
49
+ return this.addAction(action);
50
+ }
51
+
52
+ public addAction(action: StarknetAction, index: number = this.instructions.length): this {
53
+ if(action.mainSigner!==this.mainSigner) throw new Error("Actions need to have the same signer!");
54
+ if(this.L1GasLimit==null && action.L1GasLimit!=null) this.L1GasLimit = action.L1GasLimit;
55
+ if(this.L2GasLimit==null && action.L2GasLimit!=null) this.L2GasLimit = action.L2GasLimit;
56
+ if(this.L1GasLimit!=null && action.L1GasLimit!=null) this.L1GasLimit += action.L1GasLimit;
57
+ if(this.L2GasLimit!=null && action.L2GasLimit!=null) this.L2GasLimit += action.L2GasLimit;
58
+ this.instructions.splice(index, 0, ...action.instructions);
59
+ if(this.feeRate==null) this.feeRate = action.feeRate;
60
+ return this;
61
+ }
62
+
63
+ public async tx(feeRate?: string): Promise<StarknetTx> {
64
+ if(feeRate==null) feeRate = this.feeRate;
65
+ if(feeRate==null) feeRate = await this.estimateFeeRate();
66
+
67
+ return {
68
+ type: "INVOKE",
69
+ tx: this.instructions,
70
+ details: {
71
+ ...this.root.Fees.getFeeDetails(this.L1GasLimit, this.L2GasLimit, feeRate),
72
+ walletAddress: this.mainSigner,
73
+ cairoVersion: "1",
74
+ chainId: this.root.starknetChainId,
75
+ nonce: null,
76
+ accountDeploymentData: [],
77
+ skipValidate: false
78
+ }
79
+ };
80
+ }
81
+
82
+ public async addToTxs(txs: StarknetTx[], feeRate?: string): Promise<void> {
83
+ txs.push(await this.tx(feeRate));
84
+ }
85
+
86
+ public ixsLength(): number {
87
+ return this.instructions.length;
88
+ }
89
+
90
+ }
@@ -0,0 +1,56 @@
1
+ import {Provider, constants} from "starknet";
2
+ import {getLogger} from "../../utils/Utils";
3
+ import {StarknetTransactions} from "./modules/StarknetTransactions";
4
+ import {StarknetFees} from "./modules/StarknetFees";
5
+ import {StarknetAddresses} from "./modules/StarknetAddresses";
6
+ import {StarknetTokens} from "./modules/StarknetTokens";
7
+ import {StarknetEvents} from "./modules/StarknetEvents";
8
+ import {StarknetSignatures} from "./modules/StarknetSignatures";
9
+ import {StarknetAccounts} from "./modules/StarknetAccounts";
10
+ import {StarknetBlocks} from "./modules/StarknetBlocks";
11
+
12
+ export type StarknetRetryPolicy = {
13
+ maxRetries?: number,
14
+ delay?: number,
15
+ exponential?: boolean
16
+ }
17
+
18
+ export class StarknetBase {
19
+
20
+ readonly provider: Provider;
21
+ readonly retryPolicy: StarknetRetryPolicy;
22
+
23
+ public readonly starknetChainId: constants.StarknetChainId;
24
+
25
+ public Fees: StarknetFees;
26
+ public readonly Tokens: StarknetTokens;
27
+ public readonly Transactions: StarknetTransactions;
28
+ public readonly Addresses: StarknetAddresses;
29
+ public readonly Signatures: StarknetSignatures;
30
+ public readonly Events: StarknetEvents;
31
+ public readonly Accounts: StarknetAccounts;
32
+ public readonly Blocks: StarknetBlocks;
33
+
34
+ protected readonly logger = getLogger(this.constructor.name+": ");
35
+
36
+ constructor(
37
+ chainId: constants.StarknetChainId,
38
+ provider: Provider,
39
+ retryPolicy?: StarknetRetryPolicy,
40
+ solanaFeeEstimator: StarknetFees = new StarknetFees(provider)
41
+ ) {
42
+ this.starknetChainId = chainId;
43
+ this.provider = provider;
44
+ this.retryPolicy = retryPolicy;
45
+
46
+ this.Fees = solanaFeeEstimator;
47
+ this.Tokens = new StarknetTokens(this);
48
+ this.Transactions = new StarknetTransactions(this);
49
+ this.Addresses = new StarknetAddresses(this);
50
+ this.Signatures = new StarknetSignatures(this);
51
+ this.Events = new StarknetEvents(this);
52
+ this.Accounts = new StarknetAccounts(this);
53
+ this.Blocks = new StarknetBlocks(this);
54
+ }
55
+
56
+ }
@@ -0,0 +1,20 @@
1
+ import {Provider} from "starknet";
2
+ import {StarknetBase, StarknetRetryPolicy} from "./StarknetBase";
3
+ import {getLogger} from "../../utils/Utils";
4
+
5
+ export class StarknetModule {
6
+ protected readonly provider: Provider;
7
+ protected readonly retryPolicy: StarknetRetryPolicy;
8
+ protected readonly root: StarknetBase;
9
+
10
+ protected readonly logger = getLogger(this.constructor.name+": ");
11
+
12
+ constructor(
13
+ root: StarknetBase
14
+ ) {
15
+ this.provider = root.provider;
16
+ this.retryPolicy = root.retryPolicy;
17
+ this.root = root;
18
+ }
19
+
20
+ }