@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,694 @@
1
+ import {
2
+ BigIntBufferUtils,
3
+ ChainSwapType,
4
+ IntermediaryReputationType,
5
+ RelaySynchronizer,
6
+ SignatureData,
7
+ SwapCommitStatus,
8
+ SwapContract,
9
+ TransactionConfirmationOptions
10
+ } from "@atomiqlabs/base";
11
+ import {Buffer} from "buffer";
12
+ import {EscrowManagerAbi} from "./EscrowManagerAbi";
13
+ import {StarknetContractBase} from "../contract/StarknetContractBase";
14
+ import {StarknetTx} from "../base/modules/StarknetTransactions";
15
+ import {StarknetSigner} from "../wallet/StarknetSigner";
16
+ import {BigNumberish, constants, ec, Provider, stark} from "starknet";
17
+ import {StarknetRetryPolicy} from "../base/StarknetBase";
18
+ import {StarknetFees} from "../base/modules/StarknetFees";
19
+ import {StarknetBtcRelay} from "../btcrelay/StarknetBtcRelay";
20
+ import {StarknetSwapData} from "./StarknetSwapData";
21
+ import {bigNumberishToBuffer, toHex} from "../../utils/Utils";
22
+ import {TimelockRefundHandler} from "./handlers/refund/TimelockRefundHandler";
23
+ import {StarknetKeypairWallet} from "../wallet/StarknetKeypairWallet";
24
+ import {StarknetLpVault} from "./modules/StarknetLpVault";
25
+ import {StarknetPreFetchVerification, StarknetSwapInit} from "./modules/StarknetSwapInit";
26
+ import {StarknetSwapRefund} from "./modules/StarknetSwapRefund";
27
+ import {claimHandlersList, IClaimHandler} from "./handlers/claim/ClaimHandlers";
28
+ import {StarknetSwapClaim} from "./modules/StarknetSwapClaim";
29
+ import {IHandler} from "./handlers/IHandler";
30
+ import {StarknetBtcStoredHeader} from "../btcrelay/headers/StarknetBtcStoredHeader";
31
+ import * as createHash from "create-hash";
32
+
33
+ const ESCROW_STATE_COMMITTED = 1;
34
+ const ESCROW_STATE_CLAIMED = 2;
35
+ const ESCROW_STATE_REFUNDED = 3;
36
+
37
+ const swapContractAddreses = {
38
+ [constants.StarknetChainId.SN_SEPOLIA]: "0x035e9a06faa09ee78d7c8f4722687e4f3c8d8094860cc5092704b26a50f8a43f",
39
+ [constants.StarknetChainId.SN_MAIN]: "0x00b30f3bf0702d2570036c786a4b329816f99eecf36368cf74da0c0dfd67634d"
40
+ };
41
+
42
+ const defaultClaimAddresses = {
43
+ [constants.StarknetChainId.SN_SEPOLIA]: {
44
+ [ChainSwapType.HTLC]: "0x04a57ea54d4637c352aad1bbee046868926a11702216a0aaf7eeec1568be2d7b",
45
+ [ChainSwapType.CHAIN_TXID]: "0x04c7cde88359e14b6f6f779f8b9d8310cee37e91a6f143f855ae29fab33c396e",
46
+ [ChainSwapType.CHAIN]: "0x051bef6f5fd12e2832a7d38653bdfc8eb84ba7eb7a4aada5b87ef38a9999cf17",
47
+ [ChainSwapType.CHAIN_NONCED]: "0x050e50eacd16da414f2c3a7c3570fd5e248974c6fe757d41acbf72d2836fa0a1"
48
+ },
49
+ [constants.StarknetChainId.SN_MAIN]: {
50
+ [ChainSwapType.HTLC]: "0x0421c59a5442ccc430288c71ae606f2ca94dda7c8cd7c101f0865fa264853989",
51
+ [ChainSwapType.CHAIN_TXID]: "0x03aad3b184fa6484e3f8dde6a45a2c2512460a3fb4893112694b68645b50ce2e",
52
+ [ChainSwapType.CHAIN]: "0x012a938e57af955a4c96c49900731f572670bf1b7e120f99a7fe7d1f5d75cb8a",
53
+ [ChainSwapType.CHAIN_NONCED]: "0x04a0cad6b9d9ed790ce3eb95bddc22663168f0d50d24adaf7495b344609874a7"
54
+ }
55
+ }
56
+
57
+ const defaultRefundAddresses = {
58
+ [constants.StarknetChainId.SN_SEPOLIA]: {
59
+ timelock: "0x0726415752e78da4549e09da7824ae20b45539ca1fca71c93b349887cc0cac0d"
60
+ },
61
+ [constants.StarknetChainId.SN_MAIN]: {
62
+ timelock: "0x014ceb49916bb9228d8179db0c480147fab2dab71e17cfd7eca9c214eeb427e2"
63
+ }
64
+ }
65
+
66
+ export class StarknetSwapContract
67
+ extends StarknetContractBase<typeof EscrowManagerAbi>
68
+ implements SwapContract<
69
+ StarknetSwapData,
70
+ StarknetTx,
71
+ never,
72
+ StarknetPreFetchVerification,
73
+ StarknetSigner,
74
+ "STARKNET"
75
+ > {
76
+
77
+ ////////////////////////
78
+ //// Constants
79
+ readonly chainId: "STARKNET" = "STARKNET";
80
+
81
+ ////////////////////////
82
+ //// Timeouts
83
+ readonly claimWithSecretTimeout: number = 180;
84
+ readonly claimWithTxDataTimeout: number = 180;
85
+ readonly refundTimeout: number = 180;
86
+ readonly claimGracePeriod: number = 10*60;
87
+ readonly refundGracePeriod: number = 10*60;
88
+ readonly authGracePeriod: number = 30;
89
+
90
+ ////////////////////////
91
+ //// Services
92
+ readonly Init: StarknetSwapInit;
93
+ readonly Refund: StarknetSwapRefund;
94
+ readonly Claim: StarknetSwapClaim;
95
+ readonly LpVault: StarknetLpVault;
96
+
97
+ ////////////////////////
98
+ //// Handlers
99
+ readonly claimHandlersByAddress: {[address: string]: IClaimHandler<any, any>} = {};
100
+ readonly claimHandlersBySwapType: {[type in ChainSwapType]?: IClaimHandler<any, any>} = {};
101
+
102
+ readonly refundHandlersByAddress: {[address: string]: IHandler<any, any>} = {};
103
+ readonly timelockRefundHandler: IHandler<any, any>;
104
+
105
+ readonly btcRelay: StarknetBtcRelay<any>;
106
+
107
+ constructor(
108
+ chainId: constants.StarknetChainId,
109
+ provider: Provider,
110
+ btcRelay: StarknetBtcRelay<any>,
111
+ contractAddress: string = swapContractAddreses[chainId],
112
+ retryPolicy?: StarknetRetryPolicy,
113
+ solanaFeeEstimator: StarknetFees = new StarknetFees(provider),
114
+ handlerAddresses?: {
115
+ refund?: {
116
+ timelock?: string
117
+ },
118
+ claim?: {
119
+ [type in ChainSwapType]?: string
120
+ }
121
+ }
122
+ ) {
123
+ super(chainId, provider, contractAddress, EscrowManagerAbi, retryPolicy, solanaFeeEstimator);
124
+ this.Init = new StarknetSwapInit(this);
125
+ this.Refund = new StarknetSwapRefund(this);
126
+ this.Claim = new StarknetSwapClaim(this);
127
+ this.LpVault = new StarknetLpVault(this);
128
+
129
+ this.btcRelay = btcRelay;
130
+
131
+ handlerAddresses ??= {};
132
+ handlerAddresses.refund ??= {};
133
+ handlerAddresses.refund = {...defaultRefundAddresses[chainId], ...handlerAddresses.refund};
134
+ handlerAddresses.claim ??= {};
135
+ handlerAddresses.claim = {...defaultClaimAddresses[chainId], ...handlerAddresses.claim};
136
+
137
+ claimHandlersList.forEach(handlerCtor => {
138
+ const handler = new handlerCtor(handlerAddresses.claim[handlerCtor.type]);
139
+ this.claimHandlersByAddress[handler.address] = handler;
140
+ this.claimHandlersBySwapType[handlerCtor.type] = handler;
141
+ });
142
+
143
+ this.timelockRefundHandler = new TimelockRefundHandler(handlerAddresses.refund.timelock);
144
+ this.refundHandlersByAddress[this.timelockRefundHandler.address] = this.timelockRefundHandler;
145
+ }
146
+
147
+ async start(): Promise<void> {
148
+ }
149
+
150
+ ////////////////////////////////////////////
151
+ //// Signatures
152
+ preFetchForInitSignatureVerification(): Promise<StarknetPreFetchVerification> {
153
+ return this.Init.preFetchForInitSignatureVerification();
154
+ }
155
+
156
+ getInitSignature(signer: StarknetSigner, swapData: StarknetSwapData, authorizationTimeout: number, preFetchedBlockData?: never, feeRate?: string): Promise<SignatureData> {
157
+ return this.Init.signSwapInitialization(signer, swapData, authorizationTimeout);
158
+ }
159
+
160
+ isValidInitAuthorization(swapData: StarknetSwapData, {timeout, prefix, signature}, feeRate?: string, preFetchedData?: StarknetPreFetchVerification): Promise<Buffer> {
161
+ return this.Init.isSignatureValid(swapData, timeout, prefix, signature, preFetchedData);
162
+ }
163
+
164
+ getInitAuthorizationExpiry(swapData: StarknetSwapData, {timeout, prefix, signature}, preFetchedData?: StarknetPreFetchVerification): Promise<number> {
165
+ return this.Init.getSignatureExpiry(timeout);
166
+ }
167
+
168
+ isInitAuthorizationExpired(swapData: StarknetSwapData, {timeout, prefix, signature}): Promise<boolean> {
169
+ return this.Init.isSignatureExpired(timeout);
170
+ }
171
+
172
+ getRefundSignature(signer: StarknetSigner, swapData: StarknetSwapData, authorizationTimeout: number): Promise<SignatureData> {
173
+ return this.Refund.signSwapRefund(signer, swapData, authorizationTimeout);
174
+ }
175
+
176
+ isValidRefundAuthorization(swapData: StarknetSwapData, {timeout, prefix, signature}): Promise<Buffer> {
177
+ return this.Refund.isSignatureValid(swapData, timeout, prefix, signature);
178
+ }
179
+
180
+ getDataSignature(signer: StarknetSigner, data: Buffer): Promise<string> {
181
+ return this.Signatures.getDataSignature(signer, data);
182
+ }
183
+
184
+ isValidDataSignature(data: Buffer, signature: string, publicKey: string): Promise<boolean> {
185
+ return this.Signatures.isValidDataSignature(data, signature, publicKey);
186
+ }
187
+
188
+ ////////////////////////////////////////////
189
+ //// Swap data utils
190
+ /**
191
+ * Checks whether the claim is claimable by us, that means not expired, we are claimer & the swap is commited
192
+ *
193
+ * @param signer
194
+ * @param data
195
+ */
196
+ async isClaimable(signer: string, data: StarknetSwapData): Promise<boolean> {
197
+ if(!data.isClaimer(signer)) return false;
198
+ if(await this.isExpired(signer, data)) return false;
199
+ return await this.isCommited(data);
200
+ }
201
+
202
+ /**
203
+ * Checks whether a swap is commited, i.e. the swap still exists on-chain and was not claimed nor refunded
204
+ *
205
+ * @param swapData
206
+ */
207
+ async isCommited(swapData: StarknetSwapData): Promise<boolean> {
208
+ const data = await this.contract.get_hash_state("0x"+swapData.getEscrowHash());
209
+ return Number(data.state)===ESCROW_STATE_COMMITTED;
210
+ }
211
+
212
+ /**
213
+ * Checks whether the swap is expired, takes into consideration possible on-chain time skew, therefore for claimer
214
+ * the swap expires a bit sooner than it should've & for the offerer it expires a bit later
215
+ *
216
+ * @param signer
217
+ * @param data
218
+ */
219
+ isExpired(signer: string, data: StarknetSwapData): Promise<boolean> {
220
+ let currentTimestamp: bigint = BigInt(Math.floor(Date.now()/1000));
221
+ if(data.isClaimer(signer)) currentTimestamp = currentTimestamp - BigInt(this.refundGracePeriod);
222
+ if(data.isOfferer(signer)) currentTimestamp = currentTimestamp + BigInt(this.claimGracePeriod);
223
+ return Promise.resolve(data.getExpiry() < currentTimestamp);
224
+ }
225
+
226
+ /**
227
+ * Checks if the swap is refundable by us, checks if we are offerer, if the swap is already expired & if the swap
228
+ * is still commited
229
+ *
230
+ * @param signer
231
+ * @param data
232
+ */
233
+ async isRequestRefundable(signer: string, data: StarknetSwapData): Promise<boolean> {
234
+ //Swap can only be refunded by the offerer
235
+ if(!data.isOfferer(signer)) return false;
236
+ if(!(await this.isExpired(signer, data))) return false;
237
+ return await this.isCommited(data);
238
+ }
239
+
240
+ getHashForTxId(txId: string, confirmations: number) {
241
+ return bigNumberishToBuffer(this.claimHandlersBySwapType[ChainSwapType.CHAIN_TXID].getCommitment({
242
+ txId,
243
+ confirmations,
244
+ btcRelay: this.btcRelay
245
+ }), 32);
246
+ }
247
+
248
+ /**
249
+ * Get the swap payment hash to be used for an on-chain swap, uses poseidon hash of the value
250
+ *
251
+ * @param outputScript output script required to claim the swap
252
+ * @param amount sats sent required to claim the swap
253
+ * @param confirmations
254
+ * @param nonce swap nonce uniquely identifying the transaction to prevent replay attacks
255
+ */
256
+ getHashForOnchain(outputScript: Buffer, amount: bigint, confirmations: number, nonce?: bigint): Buffer {
257
+ let result: BigNumberish;
258
+ if(nonce==null || nonce === 0n) {
259
+ result = this.claimHandlersBySwapType[ChainSwapType.CHAIN].getCommitment({
260
+ output: outputScript,
261
+ amount,
262
+ confirmations,
263
+ btcRelay: this.btcRelay
264
+ });
265
+ } else {
266
+ result = this.claimHandlersBySwapType[ChainSwapType.CHAIN_NONCED].getCommitment({
267
+ output: outputScript,
268
+ amount,
269
+ nonce,
270
+ confirmations,
271
+ btcRelay: this.btcRelay
272
+ });
273
+ }
274
+ return bigNumberishToBuffer(result, 32);
275
+ }
276
+
277
+ /**
278
+ * Get the swap payment hash to be used for a lightning htlc swap, uses poseidon hash of the sha256 hash of the preimage
279
+ *
280
+ * @param paymentHash payment hash of the HTLC
281
+ */
282
+ getHashForHtlc(paymentHash: Buffer): Buffer {
283
+ return bigNumberishToBuffer(this.claimHandlersBySwapType[ChainSwapType.HTLC].getCommitment(paymentHash), 32);
284
+ }
285
+
286
+ getExtraData(outputScript: Buffer, amount: bigint, confirmations: number, nonce?: bigint): Buffer {
287
+ if(nonce==null) nonce = 0n;
288
+ const txoHash = createHash("sha256").update(Buffer.concat([
289
+ BigIntBufferUtils.toBuffer(amount, "le", 8),
290
+ outputScript
291
+ ])).digest();
292
+ return Buffer.concat([
293
+ txoHash,
294
+ BigIntBufferUtils.toBuffer(nonce, "be", 8),
295
+ BigIntBufferUtils.toBuffer(BigInt(confirmations), "be", 2)
296
+ ]);
297
+ }
298
+
299
+
300
+ ////////////////////////////////////////////
301
+ //// Swap data getters
302
+ /**
303
+ * Gets the status of the specific swap, this also checks if we are offerer/claimer & checks for expiry (to see
304
+ * if swap is refundable)
305
+ *
306
+ * @param signer
307
+ * @param data
308
+ */
309
+ async getCommitStatus(signer: string, data: StarknetSwapData): Promise<SwapCommitStatus> {
310
+ const escrowHash = data.getEscrowHash();
311
+ const stateData = await this.contract.get_hash_state("0x"+escrowHash);
312
+ const state = Number(stateData.state);
313
+ switch(state) {
314
+ case ESCROW_STATE_COMMITTED:
315
+ if(data.isOfferer(signer) && await this.isExpired(signer,data)) return SwapCommitStatus.REFUNDABLE;
316
+ return SwapCommitStatus.COMMITED;
317
+ case ESCROW_STATE_CLAIMED:
318
+ return SwapCommitStatus.PAID;
319
+ default:
320
+ if(await this.isExpired(signer, data)) return SwapCommitStatus.EXPIRED;
321
+ return SwapCommitStatus.NOT_COMMITED;
322
+ }
323
+ }
324
+
325
+ /**
326
+ * Checks the status of the specific payment hash
327
+ *
328
+ * @param paymentHash
329
+ */
330
+ async getPaymentHashStatus(paymentHash: string): Promise<SwapCommitStatus> {
331
+ //TODO: Noop
332
+ return SwapCommitStatus.NOT_COMMITED;
333
+ }
334
+
335
+ /**
336
+ * Returns the data committed for a specific payment hash, or null if no data is currently commited for
337
+ * the specific swap
338
+ *
339
+ * @param paymentHashHex
340
+ */
341
+ async getCommitedData(paymentHashHex: string): Promise<StarknetSwapData> {
342
+ //TODO: Noop
343
+ return null;
344
+ }
345
+
346
+ ////////////////////////////////////////////
347
+ //// Swap data initializer
348
+ createSwapData(
349
+ type: ChainSwapType,
350
+ offerer: string,
351
+ claimer: string,
352
+ token: string,
353
+ amount: bigint,
354
+ paymentHash: string,
355
+ sequence: bigint,
356
+ expiry: bigint,
357
+ payIn: boolean,
358
+ payOut: boolean,
359
+ securityDeposit: bigint,
360
+ claimerBounty: bigint,
361
+ depositToken: string = this.Tokens.getNativeCurrencyAddress()
362
+ ): Promise<StarknetSwapData> {
363
+ return Promise.resolve(new StarknetSwapData(
364
+ offerer,
365
+ claimer,
366
+ token,
367
+ this.timelockRefundHandler.address,
368
+ this.claimHandlersBySwapType?.[type]?.address,
369
+ payOut,
370
+ payIn,
371
+ payIn, //For now track reputation for all payIn swaps
372
+ sequence,
373
+ "0x"+paymentHash,
374
+ toHex(expiry),
375
+ amount,
376
+ depositToken,
377
+ securityDeposit,
378
+ claimerBounty,
379
+ type,
380
+ null,
381
+ []
382
+ ));
383
+ }
384
+
385
+ ////////////////////////////////////////////
386
+ //// Utils
387
+ async getBalance(signer: string, tokenAddress: string, inContract: boolean): Promise<bigint> {
388
+ if(inContract) return await this.getIntermediaryBalance(signer, tokenAddress);
389
+
390
+ //TODO: For native token we should discount the cost of deploying an account if it is not deployed yet
391
+ return await this.Tokens.getTokenBalance(signer, tokenAddress);
392
+ }
393
+
394
+ getIntermediaryData(address: string, token: string): Promise<{
395
+ balance: bigint,
396
+ reputation: IntermediaryReputationType
397
+ }> {
398
+ return this.LpVault.getIntermediaryData(address, token);
399
+ }
400
+
401
+ getIntermediaryReputation(address: string, token: string): Promise<IntermediaryReputationType> {
402
+ return this.LpVault.getIntermediaryReputation(address, token);
403
+ }
404
+
405
+ getIntermediaryBalance(address: string, token: string): Promise<bigint> {
406
+ return this.LpVault.getIntermediaryBalance(address, token);
407
+ }
408
+
409
+ isValidAddress(address: string): boolean {
410
+ return this.Addresses.isValidAddress(address);
411
+ }
412
+
413
+ getNativeCurrencyAddress(): string {
414
+ return this.Tokens.getNativeCurrencyAddress();
415
+ }
416
+
417
+ ////////////////////////////////////////////
418
+ //// Transaction initializers
419
+ async txsClaimWithSecret(
420
+ signer: string | StarknetSigner,
421
+ swapData: StarknetSwapData,
422
+ secret: string,
423
+ checkExpiry?: boolean,
424
+ initAta?: boolean,
425
+ feeRate?: string,
426
+ skipAtaCheck?: boolean
427
+ ): Promise<StarknetTx[]> {
428
+ return this.Claim.txsClaimWithSecret(typeof(signer)==="string" ? signer : signer.getAddress(), swapData, secret, checkExpiry, feeRate)
429
+ }
430
+
431
+ async txsClaimWithTxData(
432
+ signer: string | StarknetSigner,
433
+ swapData: StarknetSwapData,
434
+ tx: { blockhash: string, confirmations: number, txid: string, hex: string, height: number },
435
+ requiredConfirmations: number,
436
+ vout: number,
437
+ commitedHeader?: StarknetBtcStoredHeader,
438
+ synchronizer?: RelaySynchronizer<StarknetBtcStoredHeader, StarknetTx, any>,
439
+ initAta?: boolean,
440
+ feeRate?: string
441
+ ): Promise<StarknetTx[] | null> {
442
+ return this.Claim.txsClaimWithTxData(
443
+ typeof(signer)==="string" ? signer : signer.getAddress(),
444
+ swapData,
445
+ tx,
446
+ requiredConfirmations,
447
+ vout,
448
+ commitedHeader,
449
+ synchronizer,
450
+ feeRate
451
+ );
452
+ }
453
+
454
+ txsRefund(signer: string, swapData: StarknetSwapData, check?: boolean, initAta?: boolean, feeRate?: string): Promise<StarknetTx[]> {
455
+ return this.Refund.txsRefund(signer, swapData, check, feeRate);
456
+ }
457
+
458
+ txsRefundWithAuthorization(signer: string, swapData: StarknetSwapData, {timeout, prefix, signature}, check?: boolean, initAta?: boolean, feeRate?: string): Promise<StarknetTx[]> {
459
+ return this.Refund.txsRefundWithAuthorization(signer, swapData, timeout, prefix,signature, check, feeRate);
460
+ }
461
+
462
+ txsInit(swapData: StarknetSwapData, {timeout, prefix, signature}, skipChecks?: boolean, feeRate?: string): Promise<StarknetTx[]> {
463
+ return this.Init.txsInit(swapData, timeout, prefix, signature, skipChecks, feeRate);
464
+ }
465
+
466
+ txsWithdraw(signer: string, token: string, amount: bigint, feeRate?: string): Promise<StarknetTx[]> {
467
+ return this.LpVault.txsWithdraw(signer, token, amount, feeRate);
468
+ }
469
+
470
+ txsDeposit(signer: string, token: string, amount: bigint, feeRate?: string): Promise<StarknetTx[]> {
471
+ return this.LpVault.txsDeposit(signer, token, amount, feeRate);
472
+ }
473
+
474
+ txsTransfer(signer: string, token: string, amount: bigint, dstAddress: string, feeRate?: string): Promise<StarknetTx[]> {
475
+ return this.Tokens.txsTransfer(signer, token, amount, dstAddress, feeRate);
476
+ }
477
+
478
+ ////////////////////////////////////////////
479
+ //// Executors
480
+ async claimWithSecret(
481
+ signer: StarknetSigner,
482
+ swapData: StarknetSwapData,
483
+ secret: string,
484
+ checkExpiry?: boolean,
485
+ initAta?: boolean,
486
+ txOptions?: TransactionConfirmationOptions
487
+ ): Promise<string> {
488
+ const result = await this.Claim.txsClaimWithSecret(signer.getAddress(), swapData, secret, checkExpiry, txOptions?.feeRate);
489
+ const [signature] = await this.Transactions.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
490
+ return signature;
491
+ }
492
+
493
+ async claimWithTxData(
494
+ signer: StarknetSigner,
495
+ swapData: StarknetSwapData,
496
+ tx: { blockhash: string, confirmations: number, txid: string, hex: string, height: number },
497
+ requiredConfirmations: number,
498
+ vout: number,
499
+ commitedHeader?: StarknetBtcStoredHeader,
500
+ synchronizer?: RelaySynchronizer<StarknetBtcStoredHeader, StarknetTx, any>,
501
+ initAta?: boolean,
502
+ txOptions?: TransactionConfirmationOptions
503
+ ): Promise<string> {
504
+ const txs = await this.Claim.txsClaimWithTxData(
505
+ signer.getAddress(), swapData, tx, requiredConfirmations, vout,
506
+ commitedHeader, synchronizer, txOptions?.feeRate
507
+ );
508
+ if(txs===null) throw new Error("Btc relay not synchronized to required blockheight!");
509
+
510
+ //TODO: This doesn't return proper tx signature
511
+ const [signature] = await this.Transactions.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal);
512
+
513
+ return signature;
514
+ }
515
+
516
+ async refund(
517
+ signer: StarknetSigner,
518
+ swapData: StarknetSwapData,
519
+ check?: boolean,
520
+ initAta?: boolean,
521
+ txOptions?: TransactionConfirmationOptions
522
+ ): Promise<string> {
523
+ let result = await this.txsRefund(signer.getAddress(), swapData, check, initAta, txOptions?.feeRate);
524
+
525
+ const [signature] = await this.Transactions.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
526
+
527
+ return signature;
528
+ }
529
+
530
+ async refundWithAuthorization(
531
+ signer: StarknetSigner,
532
+ swapData: StarknetSwapData,
533
+ signature: SignatureData,
534
+ check?: boolean,
535
+ initAta?: boolean,
536
+ txOptions?: TransactionConfirmationOptions
537
+ ): Promise<string> {
538
+ let result = await this.txsRefundWithAuthorization(signer.getAddress(), swapData, signature, check, initAta, txOptions?.feeRate);
539
+
540
+ const [txSignature] = await this.Transactions.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
541
+
542
+ return txSignature;
543
+ }
544
+
545
+ async init(
546
+ signer: StarknetSigner,
547
+ swapData: StarknetSwapData,
548
+ signature: SignatureData,
549
+ skipChecks?: boolean,
550
+ txOptions?: TransactionConfirmationOptions
551
+ ): Promise<string> {
552
+ if(swapData.isPayIn()) {
553
+ if(!swapData.isOfferer(signer.getAddress())) throw new Error("Invalid signer provided!");
554
+ } else {
555
+ if(!swapData.isClaimer(signer.getAddress())) throw new Error("Invalid signer provided!");
556
+ }
557
+
558
+ let result = await this.txsInit(swapData, signature, skipChecks, txOptions?.feeRate);
559
+
560
+ const [txSignature] = await this.Transactions.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
561
+
562
+ return txSignature;
563
+ }
564
+
565
+ async withdraw(
566
+ signer: StarknetSigner,
567
+ token: string,
568
+ amount: bigint,
569
+ txOptions?: TransactionConfirmationOptions
570
+ ): Promise<string> {
571
+ const txs = await this.LpVault.txsWithdraw(signer.getAddress(), token, amount, txOptions?.feeRate);
572
+ const [txId] = await this.Transactions.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal, false);
573
+ return txId;
574
+ }
575
+
576
+ async deposit(
577
+ signer: StarknetSigner,
578
+ token: string,
579
+ amount: bigint,
580
+ txOptions?: TransactionConfirmationOptions
581
+ ): Promise<string> {
582
+ const txs = await this.LpVault.txsDeposit(signer.getAddress(), token, amount, txOptions?.feeRate);
583
+ const [txId] = await this.Transactions.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal, false);
584
+ return txId;
585
+ }
586
+
587
+ async transfer(
588
+ signer: StarknetSigner,
589
+ token: string,
590
+ amount: bigint,
591
+ dstAddress: string,
592
+ txOptions?: TransactionConfirmationOptions
593
+ ): Promise<string> {
594
+ const txs = await this.Tokens.txsTransfer(signer.getAddress(), token, amount, dstAddress, txOptions?.feeRate);
595
+ const [txId] = await this.Transactions.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal, false);
596
+ return txId;
597
+ }
598
+
599
+ ////////////////////////////////////////////
600
+ //// Transactions
601
+ sendAndConfirm(
602
+ signer: StarknetSigner,
603
+ txs: StarknetTx[],
604
+ waitForConfirmation?: boolean,
605
+ abortSignal?: AbortSignal,
606
+ parallel?: boolean,
607
+ onBeforePublish?: (txId: string, rawTx: string) => Promise<void>
608
+ ): Promise<string[]> {
609
+ return this.Transactions.sendAndConfirm(signer, txs, waitForConfirmation, abortSignal, parallel, onBeforePublish);
610
+ }
611
+
612
+ serializeTx(tx: StarknetTx): Promise<string> {
613
+ return this.Transactions.serializeTx(tx);
614
+ }
615
+
616
+ deserializeTx(txData: string): Promise<StarknetTx> {
617
+ return this.Transactions.deserializeTx(txData);
618
+ }
619
+
620
+ getTxIdStatus(txId: string): Promise<"not_found" | "pending" | "success" | "reverted"> {
621
+ return this.Transactions.getTxIdStatus(txId);
622
+ }
623
+
624
+ getTxStatus(tx: string): Promise<"not_found" | "pending" | "success" | "reverted"> {
625
+ return this.Transactions.getTxStatus(tx);
626
+ }
627
+
628
+ ////////////////////////////////////////////
629
+ //// Fees
630
+ getInitPayInFeeRate(offerer?: string, claimer?: string, token?: string, paymentHash?: string): Promise<string> {
631
+ return this.Fees.getFeeRate();
632
+ }
633
+
634
+ getInitFeeRate(offerer?: string, claimer?: string, token?: string, paymentHash?: string): Promise<string> {
635
+ return this.Fees.getFeeRate();
636
+ }
637
+
638
+ getRefundFeeRate(swapData: StarknetSwapData): Promise<string> {
639
+ return this.Fees.getFeeRate();
640
+ }
641
+
642
+ getClaimFeeRate(signer: string, swapData: StarknetSwapData): Promise<string> {
643
+ return this.Fees.getFeeRate();
644
+ }
645
+
646
+ getClaimFee(signer: string, swapData: StarknetSwapData, feeRate?: string): Promise<bigint> {
647
+ return this.Claim.getClaimFee(swapData, feeRate);
648
+ }
649
+
650
+ /**
651
+ * Get the estimated solana fee of the commit transaction
652
+ */
653
+ getCommitFee(swapData: StarknetSwapData, feeRate?: string): Promise<bigint> {
654
+ return this.Init.getInitFee(swapData, feeRate);
655
+ }
656
+
657
+ /**
658
+ * Get the estimated solana transaction fee of the refund transaction
659
+ */
660
+ getRefundFee(swapData: StarknetSwapData, feeRate?: string): Promise<bigint> {
661
+ return this.Refund.getRefundFee(swapData, feeRate);
662
+ }
663
+
664
+ ///////////////////////////////////
665
+ //// Callbacks & handlers
666
+ offBeforeTxReplace(callback: (oldTx: string, oldTxId: string, newTx: string, newTxId: string) => Promise<void>): boolean {
667
+ return true;
668
+ }
669
+
670
+ onBeforeTxReplace(callback: (oldTx: string, oldTxId: string, newTx: string, newTxId: string) => Promise<void>): void {}
671
+
672
+ onBeforeTxSigned(callback: (tx: StarknetTx) => Promise<void>): void {
673
+ this.Transactions.onBeforeTxSigned(callback);
674
+ }
675
+
676
+ offBeforeTxSigned(callback: (tx: StarknetTx) => Promise<void>): boolean {
677
+ return this.Transactions.offBeforeTxSigned(callback);
678
+ }
679
+
680
+ isValidToken(tokenIdentifier: string): boolean {
681
+ return this.Tokens.isValidToken(tokenIdentifier);
682
+ }
683
+
684
+ randomAddress(): string {
685
+ return stark.randomAddress();
686
+ }
687
+
688
+ randomSigner(): StarknetSigner {
689
+ const privateKey = "0x"+Buffer.from(ec.starkCurve.utils.randomPrivateKey()).toString("hex");
690
+ const wallet = new StarknetKeypairWallet(this.provider, privateKey);
691
+ return new StarknetSigner(wallet);
692
+ }
693
+
694
+ }