@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,84 @@
1
+ import { StarknetSwapData } from "../StarknetSwapData";
2
+ import { StarknetSwapModule } from "../StarknetSwapModule";
3
+ import { StarknetSigner } from "../../wallet/StarknetSigner";
4
+ import { StarknetTx } from "../../base/modules/StarknetTransactions";
5
+ export type StarknetPreFetchVerification = {
6
+ pendingBlockTime?: number;
7
+ };
8
+ export declare class StarknetSwapInit extends StarknetSwapModule {
9
+ private static readonly GasCosts;
10
+ /**
11
+ * bare Init action based on the data passed in swapData
12
+ *
13
+ * @param swapData
14
+ * @param timeout
15
+ * @param signature
16
+ * @private
17
+ */
18
+ private Init;
19
+ /**
20
+ * Returns auth prefix to be used with a specific swap, payIn=true & payIn=false use different prefixes (these
21
+ * actually have no meaning for the smart contract/solana program in the Solana case)
22
+ *
23
+ * @param swapData
24
+ * @private
25
+ */
26
+ private getAuthPrefix;
27
+ preFetchForInitSignatureVerification(): Promise<StarknetPreFetchVerification>;
28
+ /**
29
+ * Signs swap initialization authorization, using data from preFetchedBlockData if provided & still valid (subject
30
+ * to SIGNATURE_PREFETCH_DATA_VALIDITY)
31
+ *
32
+ * @param signer
33
+ * @param swapData
34
+ * @param authorizationTimeout
35
+ * @public
36
+ */
37
+ signSwapInitialization(signer: StarknetSigner, swapData: StarknetSwapData, authorizationTimeout: number): Promise<{
38
+ prefix: string;
39
+ timeout: string;
40
+ signature: string;
41
+ }>;
42
+ /**
43
+ * Checks whether the provided signature data is valid, using preFetchedData if provided and still valid
44
+ *
45
+ * @param swapData
46
+ * @param timeout
47
+ * @param prefix
48
+ * @param signature
49
+ * @param preFetchData
50
+ * @public
51
+ */
52
+ isSignatureValid(swapData: StarknetSwapData, timeout: string, prefix: string, signature: string, preFetchData?: StarknetPreFetchVerification): Promise<null>;
53
+ /**
54
+ * Gets expiry of the provided signature data, this is a minimum of slot expiry & swap signature expiry
55
+ *
56
+ * @param timeout
57
+ * @public
58
+ */
59
+ getSignatureExpiry(timeout: string): Promise<number>;
60
+ /**
61
+ * Checks whether signature is expired for good, compares the timestamp to the current "pending" block timestamp
62
+ *
63
+ * @param timeout
64
+ * @param preFetchData
65
+ * @public
66
+ */
67
+ isSignatureExpired(timeout: string, preFetchData?: StarknetPreFetchVerification): Promise<boolean>;
68
+ /**
69
+ * Creates init transaction with a valid signature from an LP
70
+ *
71
+ * @param swapData swap to initialize
72
+ * @param timeout init signature timeout
73
+ * @param prefix init signature prefix
74
+ * @param signature init signature
75
+ * @param skipChecks whether to skip signature validity checks
76
+ * @param feeRate fee rate to use for the transaction
77
+ */
78
+ txsInit(swapData: StarknetSwapData, timeout: string, prefix: string, signature: string, skipChecks?: boolean, feeRate?: string): Promise<StarknetTx[]>;
79
+ /**
80
+ * Get the estimated solana fee of the init transaction, this includes the required deposit for creating swap PDA
81
+ * and also deposit for ATAs
82
+ */
83
+ getInitFee(swapData?: StarknetSwapData, feeRate?: string): Promise<bigint>;
84
+ }
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetSwapInit = void 0;
4
+ const base_1 = require("@atomiqlabs/base");
5
+ const Utils_1 = require("../../../utils/Utils");
6
+ const buffer_1 = require("buffer");
7
+ const StarknetAction_1 = require("../../base/StarknetAction");
8
+ const StarknetSwapModule_1 = require("../StarknetSwapModule");
9
+ const StarknetFees_1 = require("../../base/modules/StarknetFees");
10
+ const Initialize = [
11
+ { name: 'Swap hash', type: 'felt' },
12
+ { name: 'Timeout', type: 'timestamp' }
13
+ ];
14
+ class StarknetSwapInit extends StarknetSwapModule_1.StarknetSwapModule {
15
+ /**
16
+ * bare Init action based on the data passed in swapData
17
+ *
18
+ * @param swapData
19
+ * @param timeout
20
+ * @param signature
21
+ * @private
22
+ */
23
+ Init(swapData, timeout, signature) {
24
+ return new StarknetAction_1.StarknetAction(swapData.payIn ? swapData.offerer : swapData.claimer, this.root, this.contract.populateTransaction.initialize(swapData.toEscrowStruct(), signature, timeout, swapData.extraData == null || swapData.extraData === "" ? [] : (0, Utils_1.bufferToBytes31Span)(buffer_1.Buffer.from(swapData.extraData, "hex")).map(Utils_1.toHex)), swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN : StarknetSwapInit.GasCosts.INIT);
25
+ }
26
+ /**
27
+ * Returns auth prefix to be used with a specific swap, payIn=true & payIn=false use different prefixes (these
28
+ * actually have no meaning for the smart contract/solana program in the Solana case)
29
+ *
30
+ * @param swapData
31
+ * @private
32
+ */
33
+ getAuthPrefix(swapData) {
34
+ return swapData.isPayIn() ? "claim_initialize" : "initialize";
35
+ }
36
+ async preFetchForInitSignatureVerification() {
37
+ return {
38
+ pendingBlockTime: await this.root.Blocks.getBlockTime("pending")
39
+ };
40
+ }
41
+ /**
42
+ * Signs swap initialization authorization, using data from preFetchedBlockData if provided & still valid (subject
43
+ * to SIGNATURE_PREFETCH_DATA_VALIDITY)
44
+ *
45
+ * @param signer
46
+ * @param swapData
47
+ * @param authorizationTimeout
48
+ * @public
49
+ */
50
+ async signSwapInitialization(signer, swapData, authorizationTimeout) {
51
+ const authTimeout = Math.floor(Date.now() / 1000) + authorizationTimeout;
52
+ const signature = await this.root.Signatures.signTypedMessage(signer, Initialize, "Initialize", {
53
+ "Swap hash": "0x" + swapData.getEscrowHash(),
54
+ "Timeout": (0, Utils_1.toHex)(authTimeout)
55
+ });
56
+ return {
57
+ prefix: this.getAuthPrefix(swapData),
58
+ timeout: authTimeout.toString(10),
59
+ signature
60
+ };
61
+ }
62
+ /**
63
+ * Checks whether the provided signature data is valid, using preFetchedData if provided and still valid
64
+ *
65
+ * @param swapData
66
+ * @param timeout
67
+ * @param prefix
68
+ * @param signature
69
+ * @param preFetchData
70
+ * @public
71
+ */
72
+ async isSignatureValid(swapData, timeout, prefix, signature, preFetchData) {
73
+ const sender = swapData.isPayIn() ? swapData.offerer : swapData.claimer;
74
+ const signer = swapData.isPayIn() ? swapData.claimer : swapData.offerer;
75
+ if (!swapData.isPayIn() && await this.root.isExpired(sender.toString(), swapData)) {
76
+ throw new base_1.SignatureVerificationError("Swap will expire too soon!");
77
+ }
78
+ if (prefix !== this.getAuthPrefix(swapData))
79
+ throw new base_1.SignatureVerificationError("Invalid prefix");
80
+ const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
81
+ const timeoutBN = BigInt(timeout);
82
+ const isExpired = (timeoutBN - currentTimestamp) < BigInt(this.root.authGracePeriod);
83
+ if (isExpired)
84
+ throw new base_1.SignatureVerificationError("Authorization expired!");
85
+ if (await this.isSignatureExpired(timeout, preFetchData))
86
+ throw new base_1.SignatureVerificationError("Authorization expired!");
87
+ const valid = await this.root.Signatures.isValidSignature(signature, signer, Initialize, "Initialize", {
88
+ "Swap hash": "0x" + swapData.getEscrowHash(),
89
+ "Timeout": (0, Utils_1.toHex)(timeoutBN)
90
+ });
91
+ if (!valid)
92
+ throw new base_1.SignatureVerificationError("Invalid signature!");
93
+ return null;
94
+ }
95
+ /**
96
+ * Gets expiry of the provided signature data, this is a minimum of slot expiry & swap signature expiry
97
+ *
98
+ * @param timeout
99
+ * @public
100
+ */
101
+ async getSignatureExpiry(timeout) {
102
+ const now = Date.now();
103
+ const timeoutExpiryTime = (parseInt(timeout) - this.root.authGracePeriod) * 1000;
104
+ if (timeoutExpiryTime < now)
105
+ return 0;
106
+ return timeoutExpiryTime;
107
+ }
108
+ /**
109
+ * Checks whether signature is expired for good, compares the timestamp to the current "pending" block timestamp
110
+ *
111
+ * @param timeout
112
+ * @param preFetchData
113
+ * @public
114
+ */
115
+ async isSignatureExpired(timeout, preFetchData) {
116
+ if (preFetchData == null || preFetchData.pendingBlockTime == null) {
117
+ preFetchData = await this.preFetchForInitSignatureVerification();
118
+ }
119
+ return preFetchData.pendingBlockTime > parseInt(timeout);
120
+ }
121
+ /**
122
+ * Creates init transaction with a valid signature from an LP
123
+ *
124
+ * @param swapData swap to initialize
125
+ * @param timeout init signature timeout
126
+ * @param prefix init signature prefix
127
+ * @param signature init signature
128
+ * @param skipChecks whether to skip signature validity checks
129
+ * @param feeRate fee rate to use for the transaction
130
+ */
131
+ async txsInit(swapData, timeout, prefix, signature, skipChecks, feeRate) {
132
+ const sender = swapData.isPayIn() ? swapData.offerer : swapData.claimer;
133
+ if (!skipChecks) {
134
+ const [_, payStatus] = await Promise.all([
135
+ (0, Utils_1.tryWithRetries)(() => this.isSignatureValid(swapData, timeout, prefix, signature), this.retryPolicy, (e) => e instanceof base_1.SignatureVerificationError),
136
+ (0, Utils_1.tryWithRetries)(() => this.root.getCommitStatus(sender, swapData), this.retryPolicy)
137
+ ]);
138
+ if (payStatus !== base_1.SwapCommitStatus.NOT_COMMITED)
139
+ throw new base_1.SwapDataVerificationError("Invoice already being paid for or paid");
140
+ }
141
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
142
+ const initAction = this.Init(swapData, BigInt(timeout), JSON.parse(signature));
143
+ if (swapData.payIn)
144
+ initAction.addAction(this.root.Tokens.Approve(sender, this.contract.address, swapData.token, swapData.amount), 0); //Add erc20 approve
145
+ if (swapData.getTotalDeposit() !== 0n)
146
+ initAction.addAction(this.root.Tokens.Approve(sender, this.contract.address, swapData.feeToken, swapData.getTotalDeposit()), 0); //Add deposit erc20 approve
147
+ this.logger.debug("txsInitPayIn(): create swap init TX, swap: " + swapData.getClaimHash() +
148
+ " feerate: " + feeRate);
149
+ return [await initAction.tx(feeRate)];
150
+ }
151
+ /**
152
+ * Get the estimated solana fee of the init transaction, this includes the required deposit for creating swap PDA
153
+ * and also deposit for ATAs
154
+ */
155
+ async getInitFee(swapData, feeRate) {
156
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
157
+ return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN.l1 : StarknetSwapInit.GasCosts.INIT.l1, feeRate);
158
+ }
159
+ }
160
+ exports.StarknetSwapInit = StarknetSwapInit;
161
+ StarknetSwapInit.GasCosts = {
162
+ INIT: { l1: 500, l2: 0 },
163
+ INIT_PAY_IN: { l1: 1000, l2: 0 },
164
+ };
@@ -0,0 +1,64 @@
1
+ import { StarknetSwapModule } from "../StarknetSwapModule";
2
+ import { StarknetSwapData } from "../StarknetSwapData";
3
+ import { StarknetSwapContract } from "../StarknetSwapContract";
4
+ import { StarknetTx } from "../../base/modules/StarknetTransactions";
5
+ import { StarknetSigner } from "../../wallet/StarknetSigner";
6
+ export declare class StarknetSwapRefund extends StarknetSwapModule {
7
+ private static readonly GasCosts;
8
+ /**
9
+ * Action for generic Refund instruction
10
+ *
11
+ * @param signer
12
+ * @param swapData
13
+ * @param witness
14
+ * @param handlerGas
15
+ * @constructor
16
+ * @private
17
+ */
18
+ private Refund;
19
+ /**
20
+ * Action for cooperative refunding with signature
21
+ *
22
+ * @param sender
23
+ * @param swapData
24
+ * @param timeout
25
+ * @param signature
26
+ * @constructor
27
+ * @private
28
+ */
29
+ private RefundWithSignature;
30
+ constructor(root: StarknetSwapContract);
31
+ signSwapRefund(signer: StarknetSigner, swapData: StarknetSwapData, authorizationTimeout: number): Promise<{
32
+ prefix: string;
33
+ timeout: string;
34
+ signature: string;
35
+ }>;
36
+ isSignatureValid(swapData: StarknetSwapData, timeout: string, prefix: string, signature: string): Promise<null>;
37
+ /**
38
+ * Creates transactions required for refunding timed out swap
39
+ *
40
+ * @param signer
41
+ * @param swapData swap data to refund
42
+ * @param check whether to check if swap is already expired and refundable
43
+ * @param feeRate fee rate to be used for the transactions
44
+ * @param witnessData
45
+ */
46
+ txsRefund<T>(signer: string, swapData: StarknetSwapData, check?: boolean, feeRate?: string, witnessData?: T): Promise<StarknetTx[]>;
47
+ /**
48
+ * Creates transactions required for refunding the swap with authorization signature, also unwraps WSOL to SOL
49
+ *
50
+ * @param signer
51
+ * @param swapData swap data to refund
52
+ * @param timeout signature timeout
53
+ * @param prefix signature prefix of the counterparty
54
+ * @param signature signature of the counterparty
55
+ * @param check whether to check if swap is committed before attempting refund
56
+ * @param feeRate fee rate to be used for the transactions
57
+ */
58
+ txsRefundWithAuthorization(signer: string, swapData: StarknetSwapData, timeout: string, prefix: string, signature: string, check?: boolean, feeRate?: string): Promise<StarknetTx[]>;
59
+ /**
60
+ * Get the estimated solana transaction fee of the refund transaction, in the worst case scenario in case where the
61
+ * ATA needs to be initialized again (i.e. adding the ATA rent exempt lamports to the fee)
62
+ */
63
+ getRefundFee(swapData: StarknetSwapData, feeRate?: string): Promise<bigint>;
64
+ }
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetSwapRefund = void 0;
4
+ const base_1 = require("@atomiqlabs/base");
5
+ const Utils_1 = require("../../../utils/Utils");
6
+ const StarknetSwapModule_1 = require("../StarknetSwapModule");
7
+ const StarknetAction_1 = require("../../base/StarknetAction");
8
+ const StarknetFees_1 = require("../../base/modules/StarknetFees");
9
+ const Refund = [
10
+ { name: 'Swap hash', type: 'felt' },
11
+ { name: 'Timeout', type: 'timestamp' }
12
+ ];
13
+ class StarknetSwapRefund extends StarknetSwapModule_1.StarknetSwapModule {
14
+ /**
15
+ * Action for generic Refund instruction
16
+ *
17
+ * @param signer
18
+ * @param swapData
19
+ * @param witness
20
+ * @param handlerGas
21
+ * @constructor
22
+ * @private
23
+ */
24
+ Refund(signer, swapData, witness, handlerGas) {
25
+ return new StarknetAction_1.StarknetAction(signer, this.root, this.contract.populateTransaction.refund(swapData.toEscrowStruct(), witness), (0, StarknetAction_1.sumStarknetGas)(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, handlerGas));
26
+ }
27
+ /**
28
+ * Action for cooperative refunding with signature
29
+ *
30
+ * @param sender
31
+ * @param swapData
32
+ * @param timeout
33
+ * @param signature
34
+ * @constructor
35
+ * @private
36
+ */
37
+ RefundWithSignature(sender, swapData, timeout, signature) {
38
+ return new StarknetAction_1.StarknetAction(sender, this.root, this.contract.populateTransaction.cooperative_refund(swapData.toEscrowStruct(), signature, BigInt(timeout)), swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND);
39
+ }
40
+ constructor(root) {
41
+ super(root);
42
+ }
43
+ async signSwapRefund(signer, swapData, authorizationTimeout) {
44
+ const authPrefix = "refund";
45
+ const authTimeout = Math.floor(Date.now() / 1000) + authorizationTimeout;
46
+ const signature = await this.root.Signatures.signTypedMessage(signer, Refund, "Refund", {
47
+ "Swap hash": "0x" + swapData.getEscrowHash(),
48
+ "Timeout": (0, Utils_1.toHex)(authTimeout)
49
+ });
50
+ return {
51
+ prefix: authPrefix,
52
+ timeout: authTimeout.toString(10),
53
+ signature: signature
54
+ };
55
+ }
56
+ async isSignatureValid(swapData, timeout, prefix, signature) {
57
+ if (prefix !== "refund")
58
+ throw new base_1.SignatureVerificationError("Invalid prefix");
59
+ const expiryTimestamp = BigInt(timeout);
60
+ const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
61
+ const isExpired = (expiryTimestamp - currentTimestamp) < BigInt(this.root.authGracePeriod);
62
+ if (isExpired)
63
+ throw new base_1.SignatureVerificationError("Authorization expired!");
64
+ const valid = await this.root.Signatures.isValidSignature(signature, swapData.claimer, Refund, "Refund", {
65
+ "Swap hash": "0x" + swapData.getEscrowHash(),
66
+ "Timeout": (0, Utils_1.toHex)(expiryTimestamp)
67
+ });
68
+ if (!valid) {
69
+ throw new base_1.SignatureVerificationError("Invalid signature!");
70
+ }
71
+ return null;
72
+ }
73
+ /**
74
+ * Creates transactions required for refunding timed out swap
75
+ *
76
+ * @param signer
77
+ * @param swapData swap data to refund
78
+ * @param check whether to check if swap is already expired and refundable
79
+ * @param feeRate fee rate to be used for the transactions
80
+ * @param witnessData
81
+ */
82
+ async txsRefund(signer, swapData, check, feeRate, witnessData) {
83
+ const refundHandler = this.root.refundHandlersByAddress[swapData.refundHandler.toLowerCase()];
84
+ if (refundHandler == null)
85
+ throw new Error("Invalid refund handler");
86
+ if (check && !await (0, Utils_1.tryWithRetries)(() => this.root.isRequestRefundable(swapData.offerer.toString(), swapData), this.retryPolicy)) {
87
+ throw new base_1.SwapDataVerificationError("Not refundable yet!");
88
+ }
89
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
90
+ const { initialTxns, witness } = await refundHandler.getWitness(signer, swapData, witnessData, feeRate);
91
+ const action = this.Refund(signer, swapData, witness, refundHandler.getGas(swapData));
92
+ await action.addToTxs(initialTxns, feeRate);
93
+ this.logger.debug("txsRefund(): creating refund transaction, swap: " + swapData.getClaimHash());
94
+ return initialTxns;
95
+ }
96
+ /**
97
+ * Creates transactions required for refunding the swap with authorization signature, also unwraps WSOL to SOL
98
+ *
99
+ * @param signer
100
+ * @param swapData swap data to refund
101
+ * @param timeout signature timeout
102
+ * @param prefix signature prefix of the counterparty
103
+ * @param signature signature of the counterparty
104
+ * @param check whether to check if swap is committed before attempting refund
105
+ * @param feeRate fee rate to be used for the transactions
106
+ */
107
+ async txsRefundWithAuthorization(signer, swapData, timeout, prefix, signature, check, feeRate) {
108
+ if (check && !await (0, Utils_1.tryWithRetries)(() => this.root.isCommited(swapData), this.retryPolicy)) {
109
+ throw new base_1.SwapDataVerificationError("Not correctly committed");
110
+ }
111
+ await (0, Utils_1.tryWithRetries)(() => this.isSignatureValid(swapData, timeout, prefix, signature), this.retryPolicy, (e) => e instanceof base_1.SignatureVerificationError);
112
+ const action = this.RefundWithSignature(signer, swapData, timeout, JSON.parse(signature));
113
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
114
+ this.logger.debug("txsRefundWithAuthorization(): creating refund transaction, swap: " + swapData.getClaimHash() +
115
+ " auth expiry: " + timeout + " signature: " + signature);
116
+ return [await action.tx(feeRate)];
117
+ }
118
+ /**
119
+ * Get the estimated solana transaction fee of the refund transaction, in the worst case scenario in case where the
120
+ * ATA needs to be initialized again (i.e. adding the ATA rent exempt lamports to the fee)
121
+ */
122
+ async getRefundFee(swapData, feeRate) {
123
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
124
+ return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT.l1 : StarknetSwapRefund.GasCosts.REFUND.l1, feeRate);
125
+ }
126
+ }
127
+ exports.StarknetSwapRefund = StarknetSwapRefund;
128
+ StarknetSwapRefund.GasCosts = {
129
+ REFUND: { l1: 750, l2: 0 },
130
+ REFUND_PAY_OUT: { l1: 1250, l2: 0 }
131
+ };
@@ -0,0 +1,54 @@
1
+ import { RelaySynchronizer } from "@atomiqlabs/base";
2
+ import * as BN from "bn.js";
3
+ import { StarknetSwapModule } from "../StarknetSwapModule";
4
+ import { StarknetSwapData } from "../StarknetSwapData";
5
+ import { StarknetTx } from "../../base/modules/StarknetTransactions";
6
+ import { StarknetBtcStoredHeader } from "../../btcrelay/headers/StarknetBtcStoredHeader";
7
+ export declare class SwapClaim extends StarknetSwapModule {
8
+ private static readonly GasCosts;
9
+ /**
10
+ * Claim action which uses the provided witness for claiming the swap
11
+ *
12
+ * @param signer
13
+ * @param swapData
14
+ * @param witness
15
+ * @param claimHandlerGas
16
+ * @constructor
17
+ * @private
18
+ */
19
+ private Claim;
20
+ /**
21
+ * Creates transactions claiming the swap using a secret (for HTLC swaps)
22
+ *
23
+ * @param signer
24
+ * @param swapData swap to claim
25
+ * @param secret hex encoded secret pre-image to the HTLC hash
26
+ * @param checkExpiry whether to check if the swap is already expired (trying to claim an expired swap with a secret
27
+ * is dangerous because we might end up revealing the secret to the counterparty without being able to claim the swap)
28
+ * @param feeRate fee rate to use for the transaction
29
+ */
30
+ txsClaimWithSecret(signer: string, swapData: StarknetSwapData, secret: string, checkExpiry?: boolean, feeRate?: string): Promise<StarknetTx[]>;
31
+ /**
32
+ * Creates transaction claiming the swap using a confirmed transaction data (for BTC on-chain swaps)
33
+ *
34
+ * @param signer
35
+ * @param swapData swap to claim
36
+ * @param tx bitcoin transaction that satisfies the swap condition
37
+ * @param requiredConfirmations
38
+ * @param vout vout of the bitcoin transaction that satisfies the swap condition
39
+ * @param commitedHeader commited header data from btc relay (fetched internally if null)
40
+ * @param synchronizer optional synchronizer to use in case we need to sync up the btc relay ourselves
41
+ * @param feeRate fee rate to be used for the transactions
42
+ */
43
+ txsClaimWithTxData(signer: string, swapData: StarknetSwapData, tx: {
44
+ blockhash: string;
45
+ confirmations: number;
46
+ txid: string;
47
+ hex: string;
48
+ height: number;
49
+ }, requiredConfirmations: number, vout: number, commitedHeader?: StarknetBtcStoredHeader, synchronizer?: RelaySynchronizer<StarknetBtcStoredHeader, StarknetTx, any>, feeRate?: string): Promise<StarknetTx[] | null>;
50
+ /**
51
+ * Get the estimated starknet transaction fee of the claim transaction
52
+ */
53
+ getClaimFee(swapData: StarknetSwapData, feeRate?: string): Promise<BN>;
54
+ }
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SwapClaim = void 0;
13
+ const base_1 = require("@atomiqlabs/base");
14
+ const Utils_1 = require("../../../utils/Utils");
15
+ const StarknetSwapModule_1 = require("../StarknetSwapModule");
16
+ const StarknetAction_1 = require("../../base/StarknetAction");
17
+ const StarknetFees_1 = require("../../base/modules/StarknetFees");
18
+ class SwapClaim extends StarknetSwapModule_1.StarknetSwapModule {
19
+ /**
20
+ * Claim action which uses the provided witness for claiming the swap
21
+ *
22
+ * @param signer
23
+ * @param swapData
24
+ * @param witness
25
+ * @param claimHandlerGas
26
+ * @constructor
27
+ * @private
28
+ */
29
+ Claim(signer, swapData, witness, claimHandlerGas) {
30
+ return new StarknetAction_1.StarknetAction(signer, this.root, this.contract.populateTransaction.claim(swapData.toEscrowStruct(), witness), (0, StarknetAction_1.sumStarknetGas)(swapData.payOut ? SwapClaim.GasCosts.CLAIM_PAY_OUT : SwapClaim.GasCosts.CLAIM, claimHandlerGas));
31
+ }
32
+ /**
33
+ * Creates transactions claiming the swap using a secret (for HTLC swaps)
34
+ *
35
+ * @param signer
36
+ * @param swapData swap to claim
37
+ * @param secret hex encoded secret pre-image to the HTLC hash
38
+ * @param checkExpiry whether to check if the swap is already expired (trying to claim an expired swap with a secret
39
+ * is dangerous because we might end up revealing the secret to the counterparty without being able to claim the swap)
40
+ * @param feeRate fee rate to use for the transaction
41
+ */
42
+ txsClaimWithSecret(signer, swapData, secret, checkExpiry, feeRate) {
43
+ return __awaiter(this, void 0, void 0, function* () {
44
+ //We need to be sure that this transaction confirms in time, otherwise we reveal the secret to the counterparty
45
+ // and won't claim the funds
46
+ if (checkExpiry && (yield this.root.isExpired(swapData.claimer.toString(), swapData))) {
47
+ throw new base_1.SwapDataVerificationError("Not enough time to reliably pay the invoice");
48
+ }
49
+ const claimHandler = this.root.claimHandlersByAddress[swapData.claimHandler.toLowerCase()];
50
+ if (claimHandler == null)
51
+ throw new base_1.SwapDataVerificationError("Unknown claim handler!");
52
+ if (claimHandler.getType() !== base_1.ChainSwapType.HTLC)
53
+ throw new base_1.SwapDataVerificationError("Invalid claim handler!");
54
+ feeRate !== null && feeRate !== void 0 ? feeRate : (feeRate = yield this.root.Fees.getFeeRate());
55
+ const { initialTxns, witness } = yield claimHandler.getWitness(signer, swapData, secret, feeRate);
56
+ const action = this.Claim(signer, swapData, witness, claimHandler.getGas(swapData));
57
+ yield action.addToTxs(initialTxns, feeRate);
58
+ this.logger.debug("txsClaimWithSecret(): creating claim transaction, swap: " + swapData.getClaimHash() + " witness: ", witness.map(Utils_1.toHex));
59
+ return initialTxns;
60
+ });
61
+ }
62
+ /**
63
+ * Creates transaction claiming the swap using a confirmed transaction data (for BTC on-chain swaps)
64
+ *
65
+ * @param signer
66
+ * @param swapData swap to claim
67
+ * @param tx bitcoin transaction that satisfies the swap condition
68
+ * @param requiredConfirmations
69
+ * @param vout vout of the bitcoin transaction that satisfies the swap condition
70
+ * @param commitedHeader commited header data from btc relay (fetched internally if null)
71
+ * @param synchronizer optional synchronizer to use in case we need to sync up the btc relay ourselves
72
+ * @param feeRate fee rate to be used for the transactions
73
+ */
74
+ txsClaimWithTxData(signer, swapData, tx, requiredConfirmations, vout, commitedHeader, synchronizer, feeRate) {
75
+ return __awaiter(this, void 0, void 0, function* () {
76
+ const claimHandler = this.root.claimHandlersByAddress[swapData.claimHandler.toLowerCase()];
77
+ if (claimHandler == null)
78
+ throw new base_1.SwapDataVerificationError("Unknown claim handler!");
79
+ if (claimHandler.getType() !== base_1.ChainSwapType.CHAIN_NONCED &&
80
+ claimHandler.getType() !== base_1.ChainSwapType.CHAIN_TXID &&
81
+ claimHandler.getType() !== base_1.ChainSwapType.CHAIN)
82
+ throw new base_1.SwapDataVerificationError("Invalid claim handler!");
83
+ feeRate !== null && feeRate !== void 0 ? feeRate : (feeRate = yield this.root.Fees.getFeeRate());
84
+ const { initialTxns, witness } = yield claimHandler.getWitness(signer, swapData, {
85
+ tx,
86
+ vout,
87
+ requiredConfirmations,
88
+ commitedHeader,
89
+ btcRelay: this.root.btcRelay,
90
+ synchronizer,
91
+ }, feeRate);
92
+ const action = this.Claim(signer, swapData, witness, claimHandler.getGas(swapData));
93
+ yield action.addToTxs(initialTxns, feeRate);
94
+ return initialTxns;
95
+ });
96
+ }
97
+ /**
98
+ * Get the estimated starknet transaction fee of the claim transaction
99
+ */
100
+ getClaimFee(swapData, feeRate) {
101
+ return __awaiter(this, void 0, void 0, function* () {
102
+ feeRate !== null && feeRate !== void 0 ? feeRate : (feeRate = yield this.root.Fees.getFeeRate());
103
+ let gasRequired = swapData.payOut ? SwapClaim.GasCosts.CLAIM_PAY_OUT : SwapClaim.GasCosts.CLAIM;
104
+ const claimHandler = this.root.claimHandlersByAddress[swapData.claimHandler.toLowerCase()];
105
+ if (claimHandler != null)
106
+ gasRequired = (0, StarknetAction_1.sumStarknetGas)(gasRequired, claimHandler.getGas(swapData));
107
+ return StarknetFees_1.StarknetFees.getGasFee(gasRequired.l1, feeRate);
108
+ });
109
+ }
110
+ }
111
+ exports.SwapClaim = SwapClaim;
112
+ SwapClaim.GasCosts = {
113
+ CLAIM: { l1: 500, l2: 0 },
114
+ CLAIM_PAY_OUT: { l1: 1000, l2: 0 }
115
+ };