@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,247 @@
1
+ import {EDAMode} from "starknet-types-07";
2
+ import {BigNumberish, CallData, hash, Uint256} from "starknet";
3
+ import {StarknetTx} from "../starknet/base/modules/StarknetTransactions";
4
+ import {Buffer} from "buffer";
5
+ import {StarknetSwapData} from "../starknet/swaps/StarknetSwapData";
6
+ import {IClaimHandler} from "../starknet/swaps/handlers/claim/ClaimHandlers";
7
+
8
+ export function isUint256(val: any): val is Uint256 {
9
+ return val.low!=null && val.high!=null;
10
+ }
11
+
12
+ export function timeoutPromise(timeoutMillis: number, abortSignal?: AbortSignal): Promise<void> {
13
+ return new Promise((resolve, reject) => {
14
+ const timeout = setTimeout(resolve, timeoutMillis)
15
+ if(abortSignal!=null) abortSignal.addEventListener("abort", () => {
16
+ clearTimeout(timeout);
17
+ reject(new Error("Aborted"));
18
+ })
19
+ });
20
+ }
21
+
22
+ export function onceAsync<T>(executor: () => Promise<T>): () => Promise<T> {
23
+ let promise: Promise<T>;
24
+
25
+ return () => {
26
+ if(promise==null) {
27
+ promise = executor();
28
+ return promise;
29
+ } else {
30
+ return promise.catch(() => promise = executor());
31
+ }
32
+ }
33
+ }
34
+
35
+ export function getLogger(prefix: string) {
36
+ return {
37
+ debug: (msg, ...args) => console.debug(prefix+msg, ...args),
38
+ info: (msg, ...args) => console.info(prefix+msg, ...args),
39
+ warn: (msg, ...args) => console.warn(prefix+msg, ...args),
40
+ error: (msg, ...args) => console.error(prefix+msg, ...args)
41
+ };
42
+ }
43
+
44
+ const logger = getLogger("Utils: ");
45
+
46
+ export async function tryWithRetries<T>(func: () => Promise<T>, retryPolicy?: {
47
+ maxRetries?: number, delay?: number, exponential?: boolean
48
+ }, errorAllowed?: (e: any) => boolean, abortSignal?: AbortSignal): Promise<T> {
49
+ retryPolicy = retryPolicy || {};
50
+ retryPolicy.maxRetries = retryPolicy.maxRetries || 5;
51
+ retryPolicy.delay = retryPolicy.delay || 500;
52
+ retryPolicy.exponential = retryPolicy.exponential==null ? true : retryPolicy.exponential;
53
+
54
+ let err = null;
55
+
56
+ for(let i=0;i<retryPolicy.maxRetries;i++) {
57
+ try {
58
+ const resp: T = await func();
59
+ return resp;
60
+ } catch (e) {
61
+ if(errorAllowed!=null && errorAllowed(e)) throw e;
62
+ err = e;
63
+ logger.error("tryWithRetries(): error on try number: "+i, e);
64
+ }
65
+ if(abortSignal!=null && abortSignal.aborted) throw new Error("Aborted");
66
+ if(i!==retryPolicy.maxRetries-1) {
67
+ await timeoutPromise(
68
+ retryPolicy.exponential ? retryPolicy.delay*Math.pow(2, i) : retryPolicy.delay,
69
+ abortSignal
70
+ );
71
+ }
72
+ }
73
+
74
+ throw err;
75
+ }
76
+
77
+ export function toHex(value: number | bigint | string | Buffer, length: number = 64): string {
78
+ if(value==null) return null;
79
+ switch(typeof(value)) {
80
+ case "string":
81
+ if(value.startsWith("0x")) {
82
+ return "0x"+value.slice(2).padStart(length, "0");
83
+ } else {
84
+ return "0x"+BigInt(value).toString(16).padStart(length, "0");
85
+ }
86
+ case "number":
87
+ case "bigint":
88
+ return "0x"+value.toString(16).padStart(length, "0");
89
+ }
90
+ return "0x"+value.toString("hex").padStart(length, "0");
91
+ }
92
+
93
+ export function calculateHash(tx: StarknetTx): string {
94
+ const commonData = {
95
+ version: tx.details.version,
96
+ maxFee: tx.details.maxFee,
97
+ chainId: tx.details.chainId,
98
+ nonce: tx.details.nonce,
99
+ accountDeploymentData: tx.details.version==="0x3" ? tx.details.accountDeploymentData : null,
100
+ nonceDataAvailabilityMode: tx.details.version==="0x3" ? EDAMode[tx.details.nonceDataAvailabilityMode] : null,
101
+ feeDataAvailabilityMode: tx.details.version==="0x3" ? EDAMode[tx.details.feeDataAvailabilityMode] : null,
102
+ resourceBounds: tx.details.version==="0x3" ? tx.details.resourceBounds : null,
103
+ tip: tx.details.version==="0x3" ? tx.details.tip : null,
104
+ paymasterData: tx.details.version==="0x3" ? tx.details.paymasterData : null
105
+ };
106
+ switch(tx.type) {
107
+ case "INVOKE":
108
+ const invokeData = CallData.compile(tx.signed.calldata);
109
+ return tx.txId = hash.calculateInvokeTransactionHash({
110
+ senderAddress: tx.details.walletAddress,
111
+ compiledCalldata: invokeData,
112
+ ...commonData
113
+ });
114
+ case "DEPLOY_ACCOUNT":
115
+ const deployAccountData = CallData.compile(tx.signed.constructorCalldata);
116
+ return tx.txId = hash.calculateDeployAccountTransactionHash({
117
+ contractAddress: tx.tx.contractAddress,
118
+ classHash: tx.signed.classHash,
119
+ constructorCalldata: deployAccountData,
120
+ compiledConstructorCalldata: deployAccountData,
121
+ salt: tx.signed.addressSalt,
122
+ ...commonData
123
+ });
124
+ default:
125
+ throw new Error("Unsupported tx type!");
126
+ }
127
+ }
128
+
129
+ export function u32ArrayToBuffer(arr: BigNumberish[]): Buffer {
130
+ const buffer = Buffer.alloc(4*arr.length);
131
+ for(let i=0;i<arr.length;i++) {
132
+ buffer.writeUInt32BE(Number(arr[i]), i*4);
133
+ }
134
+ return buffer;
135
+ }
136
+
137
+ export function bufferToU32Array(buffer: Buffer): number[] {
138
+ const result: number[] = [];
139
+ for(let i=0;i<buffer.length;i+=4) {
140
+ result.push(buffer.readUInt32BE(i));
141
+ }
142
+ return result;
143
+ }
144
+
145
+ export function u32ReverseEndianness(value: number): number {
146
+ const valueBN = BigInt(value);
147
+ return Number(((valueBN & 0xFFn) << 24n) |
148
+ ((valueBN & 0xFF00n) << 8n) |
149
+ ((valueBN >> 8n) & 0xFF00n) |
150
+ ((valueBN >> 24n) & 0xFFn));
151
+ }
152
+
153
+ export function bigNumberishToBuffer(value: BigNumberish | Uint256, length: number): Buffer {
154
+ if(isUint256(value)) {
155
+ return Buffer.concat([bigNumberishToBuffer(value.high, 16), bigNumberishToBuffer(value.low, 16)])
156
+ }
157
+ if(typeof(value)==="string") {
158
+ if(value.startsWith("0x")) {
159
+ value = value.slice(2);
160
+ } else {
161
+ value = BigInt(value).toString(16);
162
+ }
163
+ } else {
164
+ value = value.toString(16);
165
+ }
166
+ const buff = Buffer.from(value.padStart(length*2, "0"), "hex");
167
+ if(buff.length > length) return buff.subarray(buff.length-length);
168
+ return buff;
169
+ }
170
+
171
+ export function toBigInt(value: BigNumberish | Uint256): bigint {
172
+ if(value==null) return null;
173
+ if(isUint256(value)) {
174
+ return (toBigInt(value.high) << 128n) | toBigInt(value.low);
175
+ }
176
+ if(typeof(value)==="string") {
177
+ if(!value.startsWith("0x")) value = "0x"+value;
178
+ return BigInt(value);
179
+ }
180
+ if(typeof(value)==="bigint") {
181
+ return value;
182
+ }
183
+ return BigInt(value);
184
+ }
185
+
186
+ export function bytes31SpanToBuffer(span: BigNumberish[], length: number): Buffer {
187
+ const buffers: Buffer[] = [];
188
+ const numFullBytes31 = Math.floor(length/31);
189
+ const additionalBytes = length - (numFullBytes31*31);
190
+ const requiredSpanLength = numFullBytes31 + (additionalBytes===0 ? 0 : 1);
191
+ if(span.length<requiredSpanLength) throw new Error("Not enough bytes in the felt array!");
192
+ let i = 0;
193
+ for(; i<numFullBytes31; i++) {
194
+ buffers.push(bigNumberishToBuffer(span[i], 31));
195
+ }
196
+ if(additionalBytes!==0) buffers.push(bigNumberishToBuffer(span[i], additionalBytes));
197
+ return Buffer.concat(buffers);
198
+ }
199
+
200
+ export function bufferToBytes31Span(buffer: Buffer, startIndex: number = 0, endIndex: number = buffer.length): BigNumberish[] {
201
+ const values: BigNumberish[] = [];
202
+ for(let i=startIndex+31;i<endIndex;i+=31) {
203
+ values.push(BigInt("0x"+buffer.subarray(i-31, i).toString("hex")));
204
+ }
205
+ if(endIndex > startIndex + (values.length*31)) values.push(BigInt("0x"+buffer.subarray(startIndex + (values.length*31), endIndex).toString("hex")));
206
+ return values;
207
+ }
208
+
209
+ export function bufferToByteArray(buffer: Buffer, startIndex: number = 0, endIndex: number = buffer.length): BigNumberish[] {
210
+ const values: BigNumberish[] = [];
211
+ for(let i=startIndex+31;i<endIndex;i+=31) {
212
+ values.push(BigInt("0x"+buffer.subarray(i-31, i).toString("hex")));
213
+ }
214
+ let pendingWord: BigNumberish = BigInt(0);
215
+ let pendingWordLen: BigNumberish = BigInt(endIndex - (startIndex + (values.length*31)));
216
+ if(pendingWordLen !== BigInt(0)) {
217
+ pendingWord = BigInt("0x"+buffer.subarray(startIndex + (values.length*31), endIndex).toString("hex"));
218
+ }
219
+ return [
220
+ BigInt(values.length),
221
+ ...values,
222
+ pendingWord,
223
+ pendingWordLen
224
+ ];
225
+ }
226
+
227
+ export function poseidonHashRange(buffer: Buffer, startIndex: number = 0, endIndex: number = buffer.length): BigNumberish {
228
+ return hash.computePoseidonHashOnElements(bufferToBytes31Span(buffer, startIndex, endIndex));
229
+ }
230
+
231
+ export function parseInitFunctionCalldata(calldata: BigNumberish[], claimHandler: IClaimHandler<any, any>): {escrow: StarknetSwapData, signature: BigNumberish[], timeout: bigint, extraData: BigNumberish[]} {
232
+ const escrow = StarknetSwapData.fromSerializedFeltArray(calldata, claimHandler);
233
+ const signatureLen = Number(toBigInt(calldata.shift()));
234
+ const signature = calldata.splice(0, signatureLen);
235
+ const timeout = toBigInt(calldata.shift());
236
+ const extraDataLen = Number(toBigInt(calldata.shift()));
237
+ const extraData = calldata.splice(0, extraDataLen);
238
+ if(calldata.length!==0) throw new Error("Calldata not read fully!");
239
+ return {escrow, signature, timeout, extraData};
240
+ }
241
+
242
+ export function findLastIndex<T>(array: T[], callback: (value: T, index: number) => boolean): number {
243
+ for(let i=array.length-1;i>=0;i--){
244
+ if(callback(array[i], i)) return i;
245
+ }
246
+ return -1;
247
+ }