@atomiqlabs/chain-evm 1.0.0-dev.22

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 (146) hide show
  1. package/LICENSE +201 -0
  2. package/dist/chains/citrea/CitreaChainType.d.ts +13 -0
  3. package/dist/chains/citrea/CitreaChainType.js +2 -0
  4. package/dist/chains/citrea/CitreaInitializer.d.ts +30 -0
  5. package/dist/chains/citrea/CitreaInitializer.js +120 -0
  6. package/dist/evm/btcrelay/BtcRelayAbi.d.ts +198 -0
  7. package/dist/evm/btcrelay/BtcRelayAbi.js +261 -0
  8. package/dist/evm/btcrelay/BtcRelayTypechain.d.ts +172 -0
  9. package/dist/evm/btcrelay/BtcRelayTypechain.js +2 -0
  10. package/dist/evm/btcrelay/EVMBtcRelay.d.ts +188 -0
  11. package/dist/evm/btcrelay/EVMBtcRelay.js +419 -0
  12. package/dist/evm/btcrelay/headers/EVMBtcHeader.d.ts +33 -0
  13. package/dist/evm/btcrelay/headers/EVMBtcHeader.js +84 -0
  14. package/dist/evm/btcrelay/headers/EVMBtcStoredHeader.d.ts +56 -0
  15. package/dist/evm/btcrelay/headers/EVMBtcStoredHeader.js +123 -0
  16. package/dist/evm/chain/EVMChainInterface.d.ts +51 -0
  17. package/dist/evm/chain/EVMChainInterface.js +90 -0
  18. package/dist/evm/chain/EVMModule.d.ts +9 -0
  19. package/dist/evm/chain/EVMModule.js +13 -0
  20. package/dist/evm/chain/modules/ERC20Abi.d.ts +168 -0
  21. package/dist/evm/chain/modules/ERC20Abi.js +225 -0
  22. package/dist/evm/chain/modules/EVMAddresses.d.ts +9 -0
  23. package/dist/evm/chain/modules/EVMAddresses.js +26 -0
  24. package/dist/evm/chain/modules/EVMBlocks.d.ts +20 -0
  25. package/dist/evm/chain/modules/EVMBlocks.js +64 -0
  26. package/dist/evm/chain/modules/EVMEvents.d.ts +36 -0
  27. package/dist/evm/chain/modules/EVMEvents.js +122 -0
  28. package/dist/evm/chain/modules/EVMFees.d.ts +35 -0
  29. package/dist/evm/chain/modules/EVMFees.js +73 -0
  30. package/dist/evm/chain/modules/EVMSignatures.d.ts +29 -0
  31. package/dist/evm/chain/modules/EVMSignatures.js +68 -0
  32. package/dist/evm/chain/modules/EVMTokens.d.ts +49 -0
  33. package/dist/evm/chain/modules/EVMTokens.js +105 -0
  34. package/dist/evm/chain/modules/EVMTransactions.d.ts +89 -0
  35. package/dist/evm/chain/modules/EVMTransactions.js +216 -0
  36. package/dist/evm/contract/EVMContractBase.d.ts +22 -0
  37. package/dist/evm/contract/EVMContractBase.js +34 -0
  38. package/dist/evm/contract/EVMContractModule.d.ts +8 -0
  39. package/dist/evm/contract/EVMContractModule.js +11 -0
  40. package/dist/evm/contract/modules/EVMContractEvents.d.ts +42 -0
  41. package/dist/evm/contract/modules/EVMContractEvents.js +75 -0
  42. package/dist/evm/events/EVMChainEvents.d.ts +22 -0
  43. package/dist/evm/events/EVMChainEvents.js +67 -0
  44. package/dist/evm/events/EVMChainEventsBrowser.d.ts +86 -0
  45. package/dist/evm/events/EVMChainEventsBrowser.js +294 -0
  46. package/dist/evm/spv_swap/EVMSpvVaultContract.d.ts +64 -0
  47. package/dist/evm/spv_swap/EVMSpvVaultContract.js +410 -0
  48. package/dist/evm/spv_swap/EVMSpvVaultData.d.ts +38 -0
  49. package/dist/evm/spv_swap/EVMSpvVaultData.js +159 -0
  50. package/dist/evm/spv_swap/EVMSpvWithdrawalData.d.ts +19 -0
  51. package/dist/evm/spv_swap/EVMSpvWithdrawalData.js +55 -0
  52. package/dist/evm/spv_swap/SpvVaultContractAbi.d.ts +91 -0
  53. package/dist/evm/spv_swap/SpvVaultContractAbi.js +849 -0
  54. package/dist/evm/spv_swap/SpvVaultContractTypechain.d.ts +450 -0
  55. package/dist/evm/spv_swap/SpvVaultContractTypechain.js +2 -0
  56. package/dist/evm/swaps/EVMSwapContract.d.ts +192 -0
  57. package/dist/evm/swaps/EVMSwapContract.js +373 -0
  58. package/dist/evm/swaps/EVMSwapData.d.ts +64 -0
  59. package/dist/evm/swaps/EVMSwapData.js +254 -0
  60. package/dist/evm/swaps/EVMSwapModule.d.ts +9 -0
  61. package/dist/evm/swaps/EVMSwapModule.js +11 -0
  62. package/dist/evm/swaps/EscrowManagerAbi.d.ts +120 -0
  63. package/dist/evm/swaps/EscrowManagerAbi.js +985 -0
  64. package/dist/evm/swaps/EscrowManagerTypechain.d.ts +475 -0
  65. package/dist/evm/swaps/EscrowManagerTypechain.js +2 -0
  66. package/dist/evm/swaps/handlers/IHandler.d.ts +13 -0
  67. package/dist/evm/swaps/handlers/IHandler.js +2 -0
  68. package/dist/evm/swaps/handlers/claim/ClaimHandlers.d.ts +10 -0
  69. package/dist/evm/swaps/handlers/claim/ClaimHandlers.js +13 -0
  70. package/dist/evm/swaps/handlers/claim/HashlockClaimHandler.d.ts +20 -0
  71. package/dist/evm/swaps/handlers/claim/HashlockClaimHandler.js +39 -0
  72. package/dist/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +24 -0
  73. package/dist/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +59 -0
  74. package/dist/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +25 -0
  75. package/dist/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +51 -0
  76. package/dist/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +21 -0
  77. package/dist/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +28 -0
  78. package/dist/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +48 -0
  79. package/dist/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +63 -0
  80. package/dist/evm/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -0
  81. package/dist/evm/swaps/handlers/refund/TimelockRefundHandler.js +28 -0
  82. package/dist/evm/swaps/modules/EVMLpVault.d.ts +69 -0
  83. package/dist/evm/swaps/modules/EVMLpVault.js +131 -0
  84. package/dist/evm/swaps/modules/EVMSwapClaim.d.ts +53 -0
  85. package/dist/evm/swaps/modules/EVMSwapClaim.js +101 -0
  86. package/dist/evm/swaps/modules/EVMSwapInit.d.ts +88 -0
  87. package/dist/evm/swaps/modules/EVMSwapInit.js +241 -0
  88. package/dist/evm/swaps/modules/EVMSwapRefund.d.ts +62 -0
  89. package/dist/evm/swaps/modules/EVMSwapRefund.js +132 -0
  90. package/dist/evm/typechain/common.d.ts +50 -0
  91. package/dist/evm/typechain/common.js +2 -0
  92. package/dist/evm/wallet/EVMSigner.d.ts +9 -0
  93. package/dist/evm/wallet/EVMSigner.js +16 -0
  94. package/dist/index.d.ts +37 -0
  95. package/dist/index.js +53 -0
  96. package/dist/utils/Utils.d.ts +15 -0
  97. package/dist/utils/Utils.js +71 -0
  98. package/package.json +37 -0
  99. package/src/chains/citrea/CitreaChainType.ts +28 -0
  100. package/src/chains/citrea/CitreaInitializer.ts +167 -0
  101. package/src/evm/btcrelay/BtcRelayAbi.ts +258 -0
  102. package/src/evm/btcrelay/BtcRelayTypechain.ts +371 -0
  103. package/src/evm/btcrelay/EVMBtcRelay.ts +517 -0
  104. package/src/evm/btcrelay/headers/EVMBtcHeader.ts +110 -0
  105. package/src/evm/btcrelay/headers/EVMBtcStoredHeader.ts +153 -0
  106. package/src/evm/chain/EVMChainInterface.ts +157 -0
  107. package/src/evm/chain/EVMModule.ts +21 -0
  108. package/src/evm/chain/modules/ERC20Abi.ts +222 -0
  109. package/src/evm/chain/modules/EVMAddresses.ts +24 -0
  110. package/src/evm/chain/modules/EVMBlocks.ts +75 -0
  111. package/src/evm/chain/modules/EVMEvents.ts +139 -0
  112. package/src/evm/chain/modules/EVMFees.ts +105 -0
  113. package/src/evm/chain/modules/EVMSignatures.ts +76 -0
  114. package/src/evm/chain/modules/EVMTokens.ts +115 -0
  115. package/src/evm/chain/modules/EVMTransactions.ts +246 -0
  116. package/src/evm/contract/EVMContractBase.ts +63 -0
  117. package/src/evm/contract/EVMContractModule.ts +16 -0
  118. package/src/evm/contract/modules/EVMContractEvents.ts +102 -0
  119. package/src/evm/events/EVMChainEvents.ts +81 -0
  120. package/src/evm/events/EVMChainEventsBrowser.ts +390 -0
  121. package/src/evm/spv_swap/EVMSpvVaultContract.ts +533 -0
  122. package/src/evm/spv_swap/EVMSpvVaultData.ts +201 -0
  123. package/src/evm/spv_swap/EVMSpvWithdrawalData.ts +70 -0
  124. package/src/evm/spv_swap/SpvVaultContractAbi.ts +846 -0
  125. package/src/evm/spv_swap/SpvVaultContractTypechain.ts +685 -0
  126. package/src/evm/swaps/EVMSwapContract.ts +590 -0
  127. package/src/evm/swaps/EVMSwapData.ts +367 -0
  128. package/src/evm/swaps/EVMSwapModule.ts +16 -0
  129. package/src/evm/swaps/EscrowManagerAbi.ts +982 -0
  130. package/src/evm/swaps/EscrowManagerTypechain.ts +723 -0
  131. package/src/evm/swaps/handlers/IHandler.ts +17 -0
  132. package/src/evm/swaps/handlers/claim/ClaimHandlers.ts +20 -0
  133. package/src/evm/swaps/handlers/claim/HashlockClaimHandler.ts +47 -0
  134. package/src/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +82 -0
  135. package/src/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +76 -0
  136. package/src/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +46 -0
  137. package/src/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +115 -0
  138. package/src/evm/swaps/handlers/refund/TimelockRefundHandler.ts +38 -0
  139. package/src/evm/swaps/modules/EVMLpVault.ts +153 -0
  140. package/src/evm/swaps/modules/EVMSwapClaim.ts +141 -0
  141. package/src/evm/swaps/modules/EVMSwapInit.ts +292 -0
  142. package/src/evm/swaps/modules/EVMSwapRefund.ts +198 -0
  143. package/src/evm/typechain/common.ts +131 -0
  144. package/src/evm/wallet/EVMSigner.ts +23 -0
  145. package/src/index.ts +44 -0
  146. package/src/utils/Utils.ts +81 -0
@@ -0,0 +1,88 @@
1
+ import { EVMSwapModule } from "../EVMSwapModule";
2
+ import { EVMSwapData } from "../EVMSwapData";
3
+ import { EVMSigner } from "../../wallet/EVMSigner";
4
+ import { EVMTx } from "../../chain/modules/EVMTransactions";
5
+ export type EVMPreFetchVerification = {
6
+ safeBlockTime?: number;
7
+ };
8
+ export declare class EVMSwapInit extends EVMSwapModule {
9
+ private static readonly GasCosts;
10
+ /**
11
+ * bare Init action based on the data passed in swapData
12
+ *
13
+ * @param sender
14
+ * @param swapData
15
+ * @param timeout
16
+ * @param signature
17
+ * @param feeRate
18
+ * @private
19
+ */
20
+ private Init;
21
+ /**
22
+ * Returns auth prefix to be used with a specific swap, payIn=true & payIn=false use different prefixes (these
23
+ * actually have no meaning for the smart contract in the EVM case)
24
+ *
25
+ * @param swapData
26
+ * @private
27
+ */
28
+ private getAuthPrefix;
29
+ preFetchForInitSignatureVerification(): Promise<EVMPreFetchVerification>;
30
+ /**
31
+ * Signs swap initialization authorization, using data from preFetchedBlockData if provided & still valid (subject
32
+ * to SIGNATURE_PREFETCH_DATA_VALIDITY)
33
+ *
34
+ * @param signer
35
+ * @param swapData
36
+ * @param authorizationTimeout
37
+ * @public
38
+ */
39
+ signSwapInitialization(signer: EVMSigner, swapData: EVMSwapData, authorizationTimeout: number): Promise<{
40
+ prefix: string;
41
+ timeout: string;
42
+ signature: string;
43
+ }>;
44
+ /**
45
+ * Checks whether the provided signature data is valid, using preFetchedData if provided and still valid
46
+ *
47
+ * @param sender
48
+ * @param swapData
49
+ * @param timeout
50
+ * @param prefix
51
+ * @param signature
52
+ * @param preFetchData
53
+ * @public
54
+ */
55
+ isSignatureValid(sender: string, swapData: EVMSwapData, timeout: string, prefix: string, signature: string, preFetchData?: EVMPreFetchVerification): Promise<null>;
56
+ /**
57
+ * Gets expiry of the provided signature data, this is a minimum of slot expiry & swap signature expiry
58
+ *
59
+ * @param timeout
60
+ * @public
61
+ */
62
+ getSignatureExpiry(timeout: string): Promise<number>;
63
+ /**
64
+ * Checks whether signature is expired for good, compares the timestamp to the current "pending" block timestamp
65
+ *
66
+ * @param timeout
67
+ * @param preFetchData
68
+ * @public
69
+ */
70
+ isSignatureExpired(timeout: string, preFetchData?: EVMPreFetchVerification): Promise<boolean>;
71
+ /**
72
+ * Creates init transaction with a valid signature from an LP
73
+ *
74
+ * @param sender
75
+ * @param swapData swap to initialize
76
+ * @param timeout init signature timeout
77
+ * @param prefix init signature prefix
78
+ * @param signature init signature
79
+ * @param skipChecks whether to skip signature validity checks
80
+ * @param feeRate fee rate to use for the transaction
81
+ */
82
+ txsInit(sender: string, swapData: EVMSwapData, timeout: string, prefix: string, signature: string, skipChecks?: boolean, feeRate?: string): Promise<EVMTx[]>;
83
+ /**
84
+ * Get the estimated solana fee of the init transaction, this includes the required deposit for creating swap PDA
85
+ * and also deposit for ATAs
86
+ */
87
+ getInitFee(swapData?: EVMSwapData, feeRate?: string): Promise<bigint>;
88
+ }
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVMSwapInit = void 0;
4
+ const base_1 = require("@atomiqlabs/base");
5
+ const EVMSwapModule_1 = require("../EVMSwapModule");
6
+ const ethers_1 = require("ethers");
7
+ const EVMFees_1 = require("../../chain/modules/EVMFees");
8
+ const Utils_1 = require("../../../utils/Utils");
9
+ const Initialize = [
10
+ { name: "swapHash", type: "bytes32" },
11
+ { name: "offerer", type: "address" },
12
+ { name: "claimer", type: "address" },
13
+ { name: "amount", type: "uint256" },
14
+ { name: "token", type: "address" },
15
+ { name: "payIn", type: "bool" },
16
+ { name: "payOut", type: "bool" },
17
+ { name: "trackingReputation", type: "bool" },
18
+ { name: "claimHandler", type: "address" },
19
+ { name: "claimData", type: "bytes32" },
20
+ { name: "refundHandler", type: "address" },
21
+ { name: "refundData", type: "bytes32" },
22
+ { name: "securityDeposit", type: "uint256" },
23
+ { name: "claimerBounty", type: "uint256" },
24
+ { name: "depositToken", type: "address" },
25
+ { name: "claimActionHash", type: "bytes32" },
26
+ { name: "deadline", type: "uint256" },
27
+ { name: "extraDataHash", type: "bytes32" }
28
+ ];
29
+ class EVMSwapInit extends EVMSwapModule_1.EVMSwapModule {
30
+ /**
31
+ * bare Init action based on the data passed in swapData
32
+ *
33
+ * @param sender
34
+ * @param swapData
35
+ * @param timeout
36
+ * @param signature
37
+ * @param feeRate
38
+ * @private
39
+ */
40
+ async Init(sender, swapData, timeout, signature, feeRate) {
41
+ let value = 0n;
42
+ if (swapData.isToken(this.root.getNativeCurrencyAddress()))
43
+ value += swapData.getAmount();
44
+ if (swapData.isDepositToken(this.root.getNativeCurrencyAddress()))
45
+ value += swapData.getTotalDeposit();
46
+ const tx = await this.swapContract.initialize.populateTransaction(swapData.toEscrowStruct(), signature, timeout, "0x" + (swapData.extraData ?? ""), {
47
+ value
48
+ });
49
+ tx.from = sender;
50
+ EVMFees_1.EVMFees.applyFeeRate(tx, swapData.isPayIn() ? EVMSwapInit.GasCosts.INIT_PAY_IN : EVMSwapInit.GasCosts.INIT, feeRate);
51
+ return tx;
52
+ }
53
+ /**
54
+ * Returns auth prefix to be used with a specific swap, payIn=true & payIn=false use different prefixes (these
55
+ * actually have no meaning for the smart contract in the EVM case)
56
+ *
57
+ * @param swapData
58
+ * @private
59
+ */
60
+ getAuthPrefix(swapData) {
61
+ return swapData.isPayIn() ? "claim_initialize" : "initialize";
62
+ }
63
+ async preFetchForInitSignatureVerification() {
64
+ return {
65
+ safeBlockTime: await this.root.Blocks.getBlockTime(this.root.config.safeBlockTag)
66
+ };
67
+ }
68
+ /**
69
+ * Signs swap initialization authorization, using data from preFetchedBlockData if provided & still valid (subject
70
+ * to SIGNATURE_PREFETCH_DATA_VALIDITY)
71
+ *
72
+ * @param signer
73
+ * @param swapData
74
+ * @param authorizationTimeout
75
+ * @public
76
+ */
77
+ async signSwapInitialization(signer, swapData, authorizationTimeout) {
78
+ const authExpiry = Math.floor(Date.now() / 1000) + authorizationTimeout;
79
+ const signature = await this.root.Signatures.signTypedMessage(this.contract.contractAddress, signer, Initialize, "Initialize", {
80
+ "swapHash": "0x" + swapData.getEscrowHash(),
81
+ "offerer": swapData.offerer,
82
+ "claimer": swapData.claimer,
83
+ "amount": swapData.amount,
84
+ "token": swapData.token,
85
+ "payIn": swapData.isPayIn(),
86
+ "payOut": swapData.isPayOut(),
87
+ "trackingReputation": swapData.reputation,
88
+ "claimHandler": swapData.claimHandler,
89
+ "claimData": "0x" + swapData.getClaimHash(),
90
+ "refundHandler": swapData.refundHandler,
91
+ "refundData": swapData.refundData.startsWith("0x") ? swapData.refundData : "0x" + swapData.refundData,
92
+ "securityDeposit": swapData.securityDeposit,
93
+ "claimerBounty": swapData.claimerBounty,
94
+ "depositToken": swapData.depositToken,
95
+ "claimActionHash": ethers_1.ZeroHash,
96
+ "deadline": authExpiry,
97
+ "extraDataHash": (0, ethers_1.keccak256)("0x" + (swapData.extraData ?? ""))
98
+ });
99
+ return {
100
+ prefix: this.getAuthPrefix(swapData),
101
+ timeout: authExpiry.toString(10),
102
+ signature
103
+ };
104
+ }
105
+ /**
106
+ * Checks whether the provided signature data is valid, using preFetchedData if provided and still valid
107
+ *
108
+ * @param sender
109
+ * @param swapData
110
+ * @param timeout
111
+ * @param prefix
112
+ * @param signature
113
+ * @param preFetchData
114
+ * @public
115
+ */
116
+ async isSignatureValid(sender, swapData, timeout, prefix, signature, preFetchData) {
117
+ if (!swapData.isOfferer(sender) && !swapData.isClaimer(sender))
118
+ throw new base_1.SignatureVerificationError("TX sender not offerer nor claimer");
119
+ const signer = swapData.isOfferer(sender) ? swapData.claimer : swapData.offerer;
120
+ if (await this.contract.isExpired(sender, swapData)) {
121
+ throw new base_1.SignatureVerificationError("Swap will expire too soon!");
122
+ }
123
+ if (prefix !== this.getAuthPrefix(swapData))
124
+ throw new base_1.SignatureVerificationError("Invalid prefix");
125
+ const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
126
+ const timeoutBN = BigInt(timeout);
127
+ const isExpired = (timeoutBN - currentTimestamp) < BigInt(this.contract.authGracePeriod);
128
+ if (isExpired)
129
+ throw new base_1.SignatureVerificationError("Authorization expired!");
130
+ if (await this.isSignatureExpired(timeout, preFetchData))
131
+ throw new base_1.SignatureVerificationError("Authorization expired!");
132
+ const valid = await this.root.Signatures.isValidSignature(this.contract.contractAddress, signature, signer, Initialize, "Initialize", {
133
+ "swapHash": "0x" + swapData.getEscrowHash(),
134
+ "offerer": swapData.offerer,
135
+ "claimer": swapData.claimer,
136
+ "amount": swapData.amount,
137
+ "token": swapData.token,
138
+ "payIn": swapData.isPayIn(),
139
+ "payOut": swapData.isPayOut(),
140
+ "trackingReputation": swapData.reputation,
141
+ "claimHandler": swapData.claimHandler,
142
+ "claimData": "0x" + swapData.getClaimHash(),
143
+ "refundHandler": swapData.refundHandler,
144
+ "refundData": swapData.refundData.startsWith("0x") ? swapData.refundData : "0x" + swapData.refundData,
145
+ "securityDeposit": swapData.securityDeposit,
146
+ "claimerBounty": swapData.claimerBounty,
147
+ "depositToken": swapData.depositToken,
148
+ "claimActionHash": ethers_1.ZeroHash,
149
+ "deadline": timeoutBN,
150
+ "extraDataHash": (0, ethers_1.keccak256)("0x" + (swapData.extraData ?? ""))
151
+ });
152
+ if (!valid)
153
+ throw new base_1.SignatureVerificationError("Invalid signature!");
154
+ return null;
155
+ }
156
+ /**
157
+ * Gets expiry of the provided signature data, this is a minimum of slot expiry & swap signature expiry
158
+ *
159
+ * @param timeout
160
+ * @public
161
+ */
162
+ async getSignatureExpiry(timeout) {
163
+ const now = Date.now();
164
+ const timeoutExpiryTime = (parseInt(timeout) - this.contract.authGracePeriod) * 1000;
165
+ if (timeoutExpiryTime < now)
166
+ return 0;
167
+ return timeoutExpiryTime;
168
+ }
169
+ /**
170
+ * Checks whether signature is expired for good, compares the timestamp to the current "pending" block timestamp
171
+ *
172
+ * @param timeout
173
+ * @param preFetchData
174
+ * @public
175
+ */
176
+ async isSignatureExpired(timeout, preFetchData) {
177
+ if (preFetchData == null || preFetchData.safeBlockTime == null) {
178
+ preFetchData = await this.preFetchForInitSignatureVerification();
179
+ }
180
+ return preFetchData.safeBlockTime > parseInt(timeout);
181
+ }
182
+ /**
183
+ * Creates init transaction with a valid signature from an LP
184
+ *
185
+ * @param sender
186
+ * @param swapData swap to initialize
187
+ * @param timeout init signature timeout
188
+ * @param prefix init signature prefix
189
+ * @param signature init signature
190
+ * @param skipChecks whether to skip signature validity checks
191
+ * @param feeRate fee rate to use for the transaction
192
+ */
193
+ async txsInit(sender, swapData, timeout, prefix, signature, skipChecks, feeRate) {
194
+ var _a;
195
+ if (swapData.isClaimer(sender) && swapData.isPayIn() &&
196
+ swapData.isToken(this.root.getNativeCurrencyAddress()))
197
+ throw new Error("Cannot initialize as claimer for payIn=true and native currency!");
198
+ if (!skipChecks) {
199
+ const [_, payStatus] = await Promise.all([
200
+ swapData.isOfferer(sender) && !swapData.reputation ? Promise.resolve() : (0, Utils_1.tryWithRetries)(() => this.isSignatureValid(sender, swapData, timeout, prefix, signature), this.retryPolicy, (e) => e instanceof base_1.SignatureVerificationError),
201
+ (0, Utils_1.tryWithRetries)(() => this.contract.getCommitStatus(sender, swapData), this.retryPolicy)
202
+ ]);
203
+ if (payStatus.type !== base_1.SwapCommitStateType.NOT_COMMITED)
204
+ throw new base_1.SwapDataVerificationError("Invoice already being paid for or paid");
205
+ }
206
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
207
+ const txs = [];
208
+ const requiredApprovals = {};
209
+ if (swapData.payIn && swapData.isOfferer(sender)) {
210
+ if (!swapData.isToken(this.root.getNativeCurrencyAddress())) {
211
+ requiredApprovals[swapData.token.toLowerCase()] = swapData.amount;
212
+ }
213
+ }
214
+ if (swapData.getTotalDeposit() !== 0n) {
215
+ if (!swapData.isDepositToken(this.root.getNativeCurrencyAddress())) {
216
+ requiredApprovals[_a = swapData.depositToken.toLowerCase()] ?? (requiredApprovals[_a] = 0n);
217
+ requiredApprovals[swapData.depositToken.toLowerCase()] += swapData.getTotalDeposit();
218
+ }
219
+ }
220
+ for (let tokenAddress in requiredApprovals) {
221
+ txs.push(await this.root.Tokens.Approve(sender, tokenAddress, requiredApprovals[tokenAddress], this.contract.contractAddress, feeRate));
222
+ }
223
+ txs.push(await this.Init(sender, swapData, BigInt(timeout), signature ?? "0x", feeRate));
224
+ this.logger.debug("txsInitPayIn(): create swap init TX, swap: " + swapData.getClaimHash() +
225
+ " feerate: " + feeRate);
226
+ return txs;
227
+ }
228
+ /**
229
+ * Get the estimated solana fee of the init transaction, this includes the required deposit for creating swap PDA
230
+ * and also deposit for ATAs
231
+ */
232
+ async getInitFee(swapData, feeRate) {
233
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
234
+ return EVMFees_1.EVMFees.getGasFee(swapData.payIn ? EVMSwapInit.GasCosts.INIT_PAY_IN : EVMSwapInit.GasCosts.INIT, feeRate);
235
+ }
236
+ }
237
+ exports.EVMSwapInit = EVMSwapInit;
238
+ EVMSwapInit.GasCosts = {
239
+ INIT: 100000,
240
+ INIT_PAY_IN: 130000,
241
+ };
@@ -0,0 +1,62 @@
1
+ import { EVMSwapModule } from "../EVMSwapModule";
2
+ import { EVMSwapData } from "../EVMSwapData";
3
+ import { EVMSigner } from "../../wallet/EVMSigner";
4
+ import { EVMTx } from "../../chain/modules/EVMTransactions";
5
+ export declare class EVMSwapRefund extends EVMSwapModule {
6
+ private static readonly GasCosts;
7
+ /**
8
+ * Action for generic Refund instruction
9
+ *
10
+ * @param signer
11
+ * @param swapData
12
+ * @param witness
13
+ * @param feeRate
14
+ * @param handlerGas
15
+ * @private
16
+ */
17
+ private Refund;
18
+ /**
19
+ * Action for cooperative refunding with signature
20
+ *
21
+ * @param sender
22
+ * @param swapData
23
+ * @param timeout
24
+ * @param signature
25
+ * @param feeRate
26
+ * @private
27
+ */
28
+ private RefundWithSignature;
29
+ signSwapRefund(signer: EVMSigner, swapData: EVMSwapData, authorizationTimeout: number): Promise<{
30
+ prefix: string;
31
+ timeout: string;
32
+ signature: string;
33
+ }>;
34
+ isSignatureValid(swapData: EVMSwapData, timeout: string, prefix: string, signature: string): Promise<null>;
35
+ /**
36
+ * Creates transactions required for refunding timed out swap
37
+ *
38
+ * @param signer
39
+ * @param swapData swap data to refund
40
+ * @param check whether to check if swap is already expired and refundable
41
+ * @param feeRate fee rate to be used for the transactions
42
+ * @param witnessData
43
+ */
44
+ txsRefund<T>(signer: string, swapData: EVMSwapData, check?: boolean, feeRate?: string, witnessData?: T): Promise<EVMTx[]>;
45
+ /**
46
+ * Creates transactions required for refunding the swap with authorization signature, also unwraps WSOL to SOL
47
+ *
48
+ * @param signer
49
+ * @param swapData swap data to refund
50
+ * @param timeout signature timeout
51
+ * @param prefix signature prefix of the counterparty
52
+ * @param signature signature of the counterparty
53
+ * @param check whether to check if swap is committed before attempting refund
54
+ * @param feeRate fee rate to be used for the transactions
55
+ */
56
+ txsRefundWithAuthorization(signer: string, swapData: EVMSwapData, timeout: string, prefix: string, signature: string, check?: boolean, feeRate?: string): Promise<EVMTx[]>;
57
+ /**
58
+ * Get the estimated solana transaction fee of the refund transaction, in the worst case scenario in case where the
59
+ * ATA needs to be initialized again (i.e. adding the ATA rent exempt lamports to the fee)
60
+ */
61
+ getRefundFee(swapData: EVMSwapData, feeRate?: string): Promise<bigint>;
62
+ }
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVMSwapRefund = void 0;
4
+ const base_1 = require("@atomiqlabs/base");
5
+ const Utils_1 = require("../../../utils/Utils");
6
+ const EVMSwapModule_1 = require("../EVMSwapModule");
7
+ const EVMFees_1 = require("../../chain/modules/EVMFees");
8
+ const Refund = [
9
+ { name: "swapHash", type: "bytes32" },
10
+ { name: "timeout", type: "uint256" }
11
+ ];
12
+ class EVMSwapRefund extends EVMSwapModule_1.EVMSwapModule {
13
+ /**
14
+ * Action for generic Refund instruction
15
+ *
16
+ * @param signer
17
+ * @param swapData
18
+ * @param witness
19
+ * @param feeRate
20
+ * @param handlerGas
21
+ * @private
22
+ */
23
+ async Refund(signer, swapData, witness, feeRate, handlerGas) {
24
+ const tx = await this.swapContract.refund.populateTransaction(swapData.toEscrowStruct(), witness);
25
+ tx.from = signer;
26
+ EVMFees_1.EVMFees.applyFeeRate(tx, (swapData.payIn ? EVMSwapRefund.GasCosts.REFUND_PAY_OUT : EVMSwapRefund.GasCosts.REFUND) + (handlerGas ?? 0), feeRate);
27
+ return tx;
28
+ }
29
+ /**
30
+ * Action for cooperative refunding with signature
31
+ *
32
+ * @param sender
33
+ * @param swapData
34
+ * @param timeout
35
+ * @param signature
36
+ * @param feeRate
37
+ * @private
38
+ */
39
+ async RefundWithSignature(sender, swapData, timeout, signature, feeRate) {
40
+ const tx = await this.swapContract.cooperativeRefund.populateTransaction(swapData.toEscrowStruct(), signature, BigInt(timeout));
41
+ tx.from = sender;
42
+ EVMFees_1.EVMFees.applyFeeRate(tx, swapData.payIn ? EVMSwapRefund.GasCosts.REFUND_PAY_OUT : EVMSwapRefund.GasCosts.REFUND, feeRate);
43
+ return tx;
44
+ }
45
+ async signSwapRefund(signer, swapData, authorizationTimeout) {
46
+ const authPrefix = "refund";
47
+ const authTimeout = Math.floor(Date.now() / 1000) + authorizationTimeout;
48
+ const signature = await this.root.Signatures.signTypedMessage(this.contract.contractAddress, signer, Refund, "Refund", {
49
+ "swapHash": "0x" + swapData.getEscrowHash(),
50
+ "timeout": BigInt(authTimeout)
51
+ });
52
+ return {
53
+ prefix: authPrefix,
54
+ timeout: authTimeout.toString(10),
55
+ signature: signature
56
+ };
57
+ }
58
+ async isSignatureValid(swapData, timeout, prefix, signature) {
59
+ if (prefix !== "refund")
60
+ throw new base_1.SignatureVerificationError("Invalid prefix");
61
+ const expiryTimestamp = BigInt(timeout);
62
+ const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
63
+ const isExpired = (expiryTimestamp - currentTimestamp) < BigInt(this.contract.authGracePeriod);
64
+ if (isExpired)
65
+ throw new base_1.SignatureVerificationError("Authorization expired!");
66
+ const valid = await this.root.Signatures.isValidSignature(this.contract.contractAddress, signature, swapData.claimer, Refund, "Refund", {
67
+ "swapHash": "0x" + swapData.getEscrowHash(),
68
+ "timeout": BigInt(expiryTimestamp)
69
+ });
70
+ if (!valid) {
71
+ throw new base_1.SignatureVerificationError("Invalid signature!");
72
+ }
73
+ return null;
74
+ }
75
+ /**
76
+ * Creates transactions required for refunding timed out swap
77
+ *
78
+ * @param signer
79
+ * @param swapData swap data to refund
80
+ * @param check whether to check if swap is already expired and refundable
81
+ * @param feeRate fee rate to be used for the transactions
82
+ * @param witnessData
83
+ */
84
+ async txsRefund(signer, swapData, check, feeRate, witnessData) {
85
+ const refundHandler = this.contract.refundHandlersByAddress[swapData.refundHandler.toLowerCase()];
86
+ if (refundHandler == null)
87
+ throw new Error("Invalid refund handler");
88
+ if (check && !await (0, Utils_1.tryWithRetries)(() => this.contract.isRequestRefundable(swapData.offerer.toString(), swapData), this.retryPolicy)) {
89
+ throw new base_1.SwapDataVerificationError("Not refundable yet!");
90
+ }
91
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
92
+ const { initialTxns, witness } = await refundHandler.getWitness(signer, swapData, witnessData, feeRate);
93
+ const tx = await this.Refund(signer, swapData, witness, feeRate, refundHandler.getGas(swapData));
94
+ this.logger.debug("txsRefund(): creating refund transaction, swap: " + swapData.getClaimHash());
95
+ return [...initialTxns, tx];
96
+ }
97
+ /**
98
+ * Creates transactions required for refunding the swap with authorization signature, also unwraps WSOL to SOL
99
+ *
100
+ * @param signer
101
+ * @param swapData swap data to refund
102
+ * @param timeout signature timeout
103
+ * @param prefix signature prefix of the counterparty
104
+ * @param signature signature of the counterparty
105
+ * @param check whether to check if swap is committed before attempting refund
106
+ * @param feeRate fee rate to be used for the transactions
107
+ */
108
+ async txsRefundWithAuthorization(signer, swapData, timeout, prefix, signature, check, feeRate) {
109
+ if (check && !await (0, Utils_1.tryWithRetries)(() => this.contract.isCommited(swapData), this.retryPolicy)) {
110
+ throw new base_1.SwapDataVerificationError("Not correctly committed");
111
+ }
112
+ await (0, Utils_1.tryWithRetries)(() => this.isSignatureValid(swapData, timeout, prefix, signature), this.retryPolicy, (e) => e instanceof base_1.SignatureVerificationError);
113
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
114
+ const tx = await this.RefundWithSignature(signer, swapData, timeout, signature, feeRate);
115
+ this.logger.debug("txsRefundWithAuthorization(): creating refund transaction, swap: " + swapData.getClaimHash() +
116
+ " auth expiry: " + timeout + " signature: " + signature);
117
+ return [tx];
118
+ }
119
+ /**
120
+ * Get the estimated solana transaction fee of the refund transaction, in the worst case scenario in case where the
121
+ * ATA needs to be initialized again (i.e. adding the ATA rent exempt lamports to the fee)
122
+ */
123
+ async getRefundFee(swapData, feeRate) {
124
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
125
+ return EVMFees_1.EVMFees.getGasFee(swapData.payIn ? EVMSwapRefund.GasCosts.REFUND_PAY_OUT : EVMSwapRefund.GasCosts.REFUND, feeRate);
126
+ }
127
+ }
128
+ exports.EVMSwapRefund = EVMSwapRefund;
129
+ EVMSwapRefund.GasCosts = {
130
+ REFUND: 100000,
131
+ REFUND_PAY_OUT: 130000
132
+ };
@@ -0,0 +1,50 @@
1
+ import type { FunctionFragment, Typed, EventFragment, ContractTransaction, ContractTransactionResponse, DeferredTopicFilter, EventLog, TransactionRequest, LogDescription } from "ethers";
2
+ export interface TypedDeferredTopicFilter<_TCEvent extends TypedContractEvent> extends DeferredTopicFilter {
3
+ }
4
+ export interface TypedContractEvent<InputTuple extends Array<any> = any, OutputTuple extends Array<any> = any, OutputObject = any> {
5
+ (...args: Partial<InputTuple>): TypedDeferredTopicFilter<TypedContractEvent<InputTuple, OutputTuple, OutputObject>>;
6
+ name: string;
7
+ fragment: EventFragment;
8
+ getFragment(...args: Partial<InputTuple>): EventFragment;
9
+ }
10
+ type __TypechainAOutputTuple<T> = T extends TypedContractEvent<infer _U, infer W> ? W : never;
11
+ type __TypechainOutputObject<T> = T extends TypedContractEvent<infer _U, infer _W, infer V> ? V : never;
12
+ export interface TypedEventLog<TCEvent extends TypedContractEvent> extends Omit<EventLog, "args"> {
13
+ args: __TypechainAOutputTuple<TCEvent> & __TypechainOutputObject<TCEvent>;
14
+ }
15
+ export interface TypedLogDescription<TCEvent extends TypedContractEvent> extends Omit<LogDescription, "args"> {
16
+ args: __TypechainAOutputTuple<TCEvent> & __TypechainOutputObject<TCEvent>;
17
+ }
18
+ export type TypedListener<TCEvent extends TypedContractEvent> = (...listenerArg: [
19
+ ...__TypechainAOutputTuple<TCEvent>,
20
+ TypedEventLog<TCEvent>,
21
+ ...undefined[]
22
+ ]) => void;
23
+ export type MinEthersFactory<C, ARGS> = {
24
+ deploy(...a: ARGS[]): Promise<C>;
25
+ };
26
+ export type GetContractTypeFromFactory<F> = F extends MinEthersFactory<infer C, any> ? C : never;
27
+ export type GetARGsTypeFromFactory<F> = F extends MinEthersFactory<any, any> ? Parameters<F["deploy"]> : never;
28
+ export type StateMutability = "nonpayable" | "payable" | "view";
29
+ export type BaseOverrides = Omit<TransactionRequest, "to" | "data">;
30
+ export type NonPayableOverrides = Omit<BaseOverrides, "value" | "blockTag" | "enableCcipRead">;
31
+ export type PayableOverrides = Omit<BaseOverrides, "blockTag" | "enableCcipRead">;
32
+ export type ViewOverrides = Omit<TransactionRequest, "to" | "data">;
33
+ export type Overrides<S extends StateMutability> = S extends "nonpayable" ? NonPayableOverrides : S extends "payable" ? PayableOverrides : ViewOverrides;
34
+ export type PostfixOverrides<A extends Array<any>, S extends StateMutability> = A | [...A, Overrides<S>];
35
+ export type ContractMethodArgs<A extends Array<any>, S extends StateMutability> = PostfixOverrides<{
36
+ [I in keyof A]-?: A[I] | Typed;
37
+ }, S>;
38
+ export type DefaultReturnType<R> = R extends Array<any> ? R[0] : R;
39
+ export interface TypedContractMethod<A extends Array<any> = Array<any>, R = any, S extends StateMutability = "payable"> {
40
+ (...args: ContractMethodArgs<A, S>): S extends "view" ? Promise<DefaultReturnType<R>> : Promise<ContractTransactionResponse>;
41
+ name: string;
42
+ fragment: FunctionFragment;
43
+ getFragment(...args: ContractMethodArgs<A, S>): FunctionFragment;
44
+ populateTransaction(...args: ContractMethodArgs<A, S>): Promise<ContractTransaction>;
45
+ staticCall(...args: ContractMethodArgs<A, "view">): Promise<DefaultReturnType<R>>;
46
+ send(...args: ContractMethodArgs<A, S>): Promise<ContractTransactionResponse>;
47
+ estimateGas(...args: ContractMethodArgs<A, S>): Promise<bigint>;
48
+ staticCallResult(...args: ContractMethodArgs<A, "view">): Promise<R>;
49
+ }
50
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ import { AbstractSigner } from "@atomiqlabs/base";
2
+ import { Signer } from "ethers";
3
+ export declare class EVMSigner implements AbstractSigner {
4
+ account: Signer;
5
+ readonly address: string;
6
+ constructor(account: Signer, address: string);
7
+ getNonce(): Promise<number>;
8
+ getAddress(): string;
9
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVMSigner = void 0;
4
+ class EVMSigner {
5
+ constructor(account, address) {
6
+ this.account = account;
7
+ this.address = address;
8
+ }
9
+ getNonce() {
10
+ return Promise.resolve(null);
11
+ }
12
+ getAddress() {
13
+ return this.address;
14
+ }
15
+ }
16
+ exports.EVMSigner = EVMSigner;
@@ -0,0 +1,37 @@
1
+ export * from "./evm/btcrelay/headers/EVMBtcHeader";
2
+ export * from "./evm/btcrelay/headers/EVMBtcStoredHeader";
3
+ export * from "./evm/btcrelay/EVMBtcRelay";
4
+ export * from "./evm/chain/EVMChainInterface";
5
+ export * from "./evm/chain/EVMModule";
6
+ export * from "./evm/chain/modules/EVMAddresses";
7
+ export * from "./evm/chain/modules/EVMBlocks";
8
+ export * from "./evm/chain/modules/EVMEvents";
9
+ export * from "./evm/chain/modules/EVMFees";
10
+ export * from "./evm/chain/modules/EVMSignatures";
11
+ export * from "./evm/chain/modules/EVMTokens";
12
+ export * from "./evm/chain/modules/EVMTransactions";
13
+ export * from "./evm/contract/modules/EVMContractEvents";
14
+ export * from "./evm/contract/EVMContractBase";
15
+ export * from "./evm/contract/EVMContractModule";
16
+ export * from "./evm/events/EVMChainEventsBrowser";
17
+ export * from "./evm/spv_swap/EVMSpvVaultContract";
18
+ export * from "./evm/spv_swap/EVMSpvWithdrawalData";
19
+ export * from "./evm/spv_swap/EVMSpvVaultData";
20
+ export * from "./evm/swaps/EVMSwapContract";
21
+ export * from "./evm/swaps/EVMSwapData";
22
+ export * from "./evm/swaps/EVMSwapModule";
23
+ export * from "./evm/swaps/modules/EVMLpVault";
24
+ export * from "./evm/swaps/modules/EVMSwapInit";
25
+ export * from "./evm/swaps/modules/EVMSwapClaim";
26
+ export * from "./evm/swaps/modules/EVMSwapRefund";
27
+ export * from "./evm/swaps/handlers/IHandler";
28
+ export * from "./evm/swaps/handlers/refund/TimelockRefundHandler";
29
+ export * from "./evm/swaps/handlers/claim/ClaimHandlers";
30
+ export * from "./evm/swaps/handlers/claim/HashlockClaimHandler";
31
+ export * from "./evm/swaps/handlers/claim/btc/IBitcoinClaimHandler";
32
+ export * from "./evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler";
33
+ export * from "./evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler";
34
+ export * from "./evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler";
35
+ export * from "./evm/wallet/EVMSigner";
36
+ export * from "./chains/citrea/CitreaInitializer";
37
+ export * from "./chains/citrea/CitreaChainType";