@atomiqlabs/chain-solana 13.5.13 → 13.5.14

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 (131) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +73 -73
  3. package/dist/index.d.ts +81 -81
  4. package/dist/index.js +102 -102
  5. package/dist/node/index.d.ts +9 -9
  6. package/dist/node/index.js +13 -13
  7. package/dist/solana/SolanaChainType.d.ts +15 -15
  8. package/dist/solana/SolanaChainType.js +2 -2
  9. package/dist/solana/SolanaChains.d.ts +12 -12
  10. package/dist/solana/SolanaChains.js +45 -45
  11. package/dist/solana/SolanaInitializer.d.ts +94 -94
  12. package/dist/solana/SolanaInitializer.js +174 -174
  13. package/dist/solana/btcrelay/SolanaBtcRelay.d.ts +222 -222
  14. package/dist/solana/btcrelay/SolanaBtcRelay.js +455 -455
  15. package/dist/solana/btcrelay/headers/SolanaBtcHeader.d.ts +84 -84
  16. package/dist/solana/btcrelay/headers/SolanaBtcHeader.js +70 -70
  17. package/dist/solana/btcrelay/headers/SolanaBtcStoredHeader.d.ts +92 -92
  18. package/dist/solana/btcrelay/headers/SolanaBtcStoredHeader.js +109 -109
  19. package/dist/solana/btcrelay/program/programIdl.json +671 -671
  20. package/dist/solana/chain/SolanaAction.d.ts +26 -26
  21. package/dist/solana/chain/SolanaAction.js +87 -87
  22. package/dist/solana/chain/SolanaChainInterface.d.ts +224 -224
  23. package/dist/solana/chain/SolanaChainInterface.js +275 -275
  24. package/dist/solana/chain/SolanaModule.d.ts +14 -14
  25. package/dist/solana/chain/SolanaModule.js +13 -13
  26. package/dist/solana/chain/modules/SolanaAddresses.d.ts +8 -8
  27. package/dist/solana/chain/modules/SolanaAddresses.js +22 -22
  28. package/dist/solana/chain/modules/SolanaBlocks.d.ts +32 -32
  29. package/dist/solana/chain/modules/SolanaBlocks.js +78 -78
  30. package/dist/solana/chain/modules/SolanaEvents.d.ts +68 -68
  31. package/dist/solana/chain/modules/SolanaEvents.js +238 -238
  32. package/dist/solana/chain/modules/SolanaFees.d.ts +189 -189
  33. package/dist/solana/chain/modules/SolanaFees.js +434 -434
  34. package/dist/solana/chain/modules/SolanaSignatures.d.ts +24 -24
  35. package/dist/solana/chain/modules/SolanaSignatures.js +39 -39
  36. package/dist/solana/chain/modules/SolanaSlots.d.ts +33 -33
  37. package/dist/solana/chain/modules/SolanaSlots.js +72 -72
  38. package/dist/solana/chain/modules/SolanaTokens.d.ts +123 -123
  39. package/dist/solana/chain/modules/SolanaTokens.js +242 -242
  40. package/dist/solana/chain/modules/SolanaTransactions.d.ts +149 -149
  41. package/dist/solana/chain/modules/SolanaTransactions.js +445 -445
  42. package/dist/solana/connection/ConnectionWithRetries.d.ts +35 -35
  43. package/dist/solana/connection/ConnectionWithRetries.js +86 -71
  44. package/dist/solana/events/SolanaChainEvents.d.ts +45 -45
  45. package/dist/solana/events/SolanaChainEvents.js +108 -108
  46. package/dist/solana/events/SolanaChainEventsBrowser.d.ts +205 -205
  47. package/dist/solana/events/SolanaChainEventsBrowser.js +404 -404
  48. package/dist/solana/program/SolanaProgramBase.d.ts +73 -73
  49. package/dist/solana/program/SolanaProgramBase.js +54 -54
  50. package/dist/solana/program/SolanaProgramModule.d.ts +8 -8
  51. package/dist/solana/program/SolanaProgramModule.js +11 -11
  52. package/dist/solana/program/modules/SolanaProgramEvents.d.ts +53 -53
  53. package/dist/solana/program/modules/SolanaProgramEvents.js +117 -117
  54. package/dist/solana/swaps/SolanaSwapData.d.ts +333 -333
  55. package/dist/solana/swaps/SolanaSwapData.js +535 -535
  56. package/dist/solana/swaps/SolanaSwapModule.d.ts +11 -11
  57. package/dist/solana/swaps/SolanaSwapModule.js +12 -12
  58. package/dist/solana/swaps/SolanaSwapProgram.d.ts +376 -376
  59. package/dist/solana/swaps/SolanaSwapProgram.js +769 -769
  60. package/dist/solana/swaps/SwapTypeEnum.d.ts +11 -11
  61. package/dist/solana/swaps/SwapTypeEnum.js +43 -43
  62. package/dist/solana/swaps/modules/SolanaDataAccount.d.ts +95 -95
  63. package/dist/solana/swaps/modules/SolanaDataAccount.js +232 -232
  64. package/dist/solana/swaps/modules/SolanaLpVault.d.ts +69 -69
  65. package/dist/solana/swaps/modules/SolanaLpVault.js +171 -171
  66. package/dist/solana/swaps/modules/SwapClaim.d.ts +126 -126
  67. package/dist/solana/swaps/modules/SwapClaim.js +294 -294
  68. package/dist/solana/swaps/modules/SwapInit.d.ts +213 -213
  69. package/dist/solana/swaps/modules/SwapInit.js +658 -658
  70. package/dist/solana/swaps/modules/SwapRefund.d.ts +87 -87
  71. package/dist/solana/swaps/modules/SwapRefund.js +293 -293
  72. package/dist/solana/swaps/programIdl.json +945 -945
  73. package/dist/solana/swaps/programTypes.d.ts +943 -943
  74. package/dist/solana/swaps/programTypes.js +945 -945
  75. package/dist/solana/swaps/v1/programIdl.json +945 -945
  76. package/dist/solana/swaps/v1/programTypes.d.ts +943 -943
  77. package/dist/solana/swaps/v1/programTypes.js +945 -945
  78. package/dist/solana/swaps/v2/programIdl.json +952 -952
  79. package/dist/solana/swaps/v2/programTypes.d.ts +950 -950
  80. package/dist/solana/swaps/v2/programTypes.js +952 -952
  81. package/dist/solana/wallet/SolanaKeypairWallet.d.ts +29 -29
  82. package/dist/solana/wallet/SolanaKeypairWallet.js +50 -50
  83. package/dist/solana/wallet/SolanaSigner.d.ts +30 -30
  84. package/dist/solana/wallet/SolanaSigner.js +30 -30
  85. package/dist/utils/Utils.d.ts +58 -58
  86. package/dist/utils/Utils.js +170 -170
  87. package/node/index.d.ts +1 -1
  88. package/node/index.js +3 -3
  89. package/package.json +46 -46
  90. package/src/index.ts +87 -87
  91. package/src/node/index.ts +9 -9
  92. package/src/solana/SolanaChainType.ts +32 -32
  93. package/src/solana/SolanaChains.ts +46 -46
  94. package/src/solana/SolanaInitializer.ts +278 -278
  95. package/src/solana/btcrelay/SolanaBtcRelay.ts +615 -615
  96. package/src/solana/btcrelay/headers/SolanaBtcHeader.ts +116 -116
  97. package/src/solana/btcrelay/headers/SolanaBtcStoredHeader.ts +148 -148
  98. package/src/solana/btcrelay/program/programIdl.json +670 -670
  99. package/src/solana/chain/SolanaAction.ts +109 -109
  100. package/src/solana/chain/SolanaChainInterface.ts +404 -404
  101. package/src/solana/chain/SolanaModule.ts +20 -20
  102. package/src/solana/chain/modules/SolanaAddresses.ts +20 -20
  103. package/src/solana/chain/modules/SolanaBlocks.ts +89 -89
  104. package/src/solana/chain/modules/SolanaEvents.ts +271 -271
  105. package/src/solana/chain/modules/SolanaFees.ts +522 -522
  106. package/src/solana/chain/modules/SolanaSignatures.ts +39 -39
  107. package/src/solana/chain/modules/SolanaSlots.ts +85 -85
  108. package/src/solana/chain/modules/SolanaTokens.ts +300 -300
  109. package/src/solana/chain/modules/SolanaTransactions.ts +503 -503
  110. package/src/solana/connection/ConnectionWithRetries.ts +113 -96
  111. package/src/solana/events/SolanaChainEvents.ts +127 -127
  112. package/src/solana/events/SolanaChainEventsBrowser.ts +495 -495
  113. package/src/solana/program/SolanaProgramBase.ts +119 -119
  114. package/src/solana/program/SolanaProgramModule.ts +15 -15
  115. package/src/solana/program/modules/SolanaProgramEvents.ts +157 -157
  116. package/src/solana/swaps/SolanaSwapData.ts +735 -735
  117. package/src/solana/swaps/SolanaSwapModule.ts +19 -19
  118. package/src/solana/swaps/SolanaSwapProgram.ts +1074 -1074
  119. package/src/solana/swaps/SwapTypeEnum.ts +30 -30
  120. package/src/solana/swaps/modules/SolanaDataAccount.ts +302 -302
  121. package/src/solana/swaps/modules/SolanaLpVault.ts +208 -208
  122. package/src/solana/swaps/modules/SwapClaim.ts +387 -387
  123. package/src/solana/swaps/modules/SwapInit.ts +785 -785
  124. package/src/solana/swaps/modules/SwapRefund.ts +353 -353
  125. package/src/solana/swaps/v1/programIdl.json +944 -944
  126. package/src/solana/swaps/v1/programTypes.ts +1885 -1885
  127. package/src/solana/swaps/v2/programIdl.json +951 -951
  128. package/src/solana/swaps/v2/programTypes.ts +1899 -1899
  129. package/src/solana/wallet/SolanaKeypairWallet.ts +56 -56
  130. package/src/solana/wallet/SolanaSigner.ts +43 -43
  131. package/src/utils/Utils.ts +194 -194
@@ -1,232 +1,232 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SolanaDataAccount = exports.StoredDataAccount = void 0;
4
- const SolanaSwapModule_1 = require("../SolanaSwapModule");
5
- const web3_js_1 = require("@solana/web3.js");
6
- const SolanaAction_1 = require("../../chain/SolanaAction");
7
- const SolanaSigner_1 = require("../../wallet/SolanaSigner");
8
- const utils_1 = require("@noble/hashes/utils");
9
- class StoredDataAccount {
10
- constructor(accountKeyOrData, owner) {
11
- if (accountKeyOrData instanceof web3_js_1.PublicKey && owner instanceof web3_js_1.PublicKey) {
12
- this.accountKey = accountKeyOrData;
13
- this.owner = owner;
14
- }
15
- else {
16
- this.accountKey = new web3_js_1.PublicKey(accountKeyOrData.accountKey);
17
- this.owner = new web3_js_1.PublicKey(accountKeyOrData.owner);
18
- }
19
- }
20
- serialize() {
21
- return {
22
- accountKey: this.accountKey.toBase58(),
23
- owner: this.owner.toBase58()
24
- };
25
- }
26
- }
27
- exports.StoredDataAccount = StoredDataAccount;
28
- class SolanaDataAccount extends SolanaSwapModule_1.SolanaSwapModule {
29
- /**
30
- * Action for initialization of the data account
31
- *
32
- * @param signer
33
- * @param accountKey
34
- * @param dataLength
35
- * @private
36
- */
37
- async InitDataAccount(signer, accountKey, dataLength) {
38
- const accountSize = this.program.version === "v2"
39
- ? 40 + dataLength
40
- : 32 + dataLength;
41
- const lamportsDeposit = await this.connection.getMinimumBalanceForRentExemption(accountSize);
42
- return new SolanaAction_1.SolanaAction(signer, this.root, [
43
- web3_js_1.SystemProgram.createAccount({
44
- fromPubkey: signer,
45
- newAccountPubkey: accountKey.publicKey,
46
- lamports: lamportsDeposit,
47
- space: accountSize,
48
- programId: this.swapProgram.programId
49
- }),
50
- await this.swapProgram.methods
51
- .initData()
52
- .accounts({
53
- signer,
54
- data: accountKey.publicKey
55
- })
56
- .instruction(),
57
- ], SolanaDataAccount.CUCosts.DATA_CREATE, undefined, [accountKey]);
58
- }
59
- /**
60
- * Action for closing the specific data account
61
- *
62
- * @param signer
63
- * @param publicKey
64
- */
65
- async CloseDataAccount(signer, publicKey) {
66
- return new SolanaAction_1.SolanaAction(signer, this.root, await this.swapProgram.methods
67
- .closeData()
68
- .accounts({
69
- signer,
70
- data: publicKey
71
- })
72
- .instruction(), SolanaDataAccount.CUCosts.DATA_REMOVE, await this.root.Fees.getFeeRate([signer, publicKey]));
73
- }
74
- /**
75
- * Action for writing data to a data account, writes up to sizeLimit starting from the offset position of the
76
- * provided writeData buffer
77
- *
78
- * @param signer
79
- * @param accountKey account public key to write to
80
- * @param writeData buffer holding the write data
81
- * @param offset data from buffer starting at offset are written
82
- * @param sizeLimit maximum amount of data to be written to the data account in this action
83
- * @private
84
- * @returns {Promise<{bytesWritten: number, action: SolanaAction}>} bytes written to the data account & action
85
- */
86
- async WriteData(signer, accountKey, writeData, offset, sizeLimit) {
87
- const writeLen = Math.min(writeData.length - offset, sizeLimit);
88
- return {
89
- bytesWritten: writeLen,
90
- action: new SolanaAction_1.SolanaAction(signer, this.root, await this.swapProgram.methods
91
- .writeData(offset, writeData.slice(offset, offset + writeLen))
92
- .accounts({
93
- signer,
94
- data: accountKey.publicKey
95
- })
96
- .instruction(), SolanaDataAccount.CUCosts.DATA_WRITE)
97
- };
98
- }
99
- constructor(chainInterface, program, storage) {
100
- super(chainInterface, program);
101
- this.SwapTxDataAlt = this.program._keypair((reversedTxId, signer) => [Buffer.from(signer.secretKey), reversedTxId]);
102
- this.SwapTxDataAltBuffer = this.program._keypair((reversedTxId, secret) => [secret, reversedTxId]);
103
- this.storage = storage;
104
- }
105
- /**
106
- * Saves data account to the storage, the storage is required such that we are able to close the accounts later
107
- * manually in case the claim doesn't happen (expires due to fees, etc.)
108
- *
109
- * @param signer
110
- * @param publicKey
111
- * @private
112
- */
113
- saveDataAccount(signer, publicKey) {
114
- return this.storage.saveData(publicKey.toBase58(), new StoredDataAccount(publicKey, signer));
115
- }
116
- /**
117
- * Initializes the data account handler, loads the existing data accounts which should be checked and closed
118
- */
119
- async init() {
120
- await this.storage.init();
121
- const loadedData = await this.storage.loadData(StoredDataAccount);
122
- this.logger.info("init(): initialized & loaded stored data accounts, count: " + loadedData.length);
123
- }
124
- /**
125
- * Removes data account from the list of accounts that should be checked for reclaiming the locked SOL, this should
126
- * be called after a batch of transactions claiming the swap was confirmed
127
- *
128
- * @param publicKey
129
- */
130
- removeDataAccount(publicKey) {
131
- return this.storage.removeData(publicKey.toBase58());
132
- }
133
- async getDataAccountsInfo(signer) {
134
- const closePublicKeys = [];
135
- let totalLocked = 0n;
136
- for (let key in this.storage.data) {
137
- const { accountKey, owner } = this.storage.data[key];
138
- if (!owner.equals(signer))
139
- continue;
140
- try {
141
- const fetchedDataAccount = await this.connection.getAccountInfo(accountKey);
142
- if (fetchedDataAccount == null || fetchedDataAccount.lamports === 0 || fetchedDataAccount.data.length === 0) {
143
- await this.removeDataAccount(accountKey);
144
- continue;
145
- }
146
- closePublicKeys.push(accountKey);
147
- totalLocked += BigInt(fetchedDataAccount.lamports);
148
- }
149
- catch (e) { }
150
- }
151
- return {
152
- closePublicKeys,
153
- count: closePublicKeys.length,
154
- totalValue: totalLocked
155
- };
156
- }
157
- /**
158
- * Sweeps all old data accounts, reclaiming the SOL locked in the PDAs
159
- */
160
- async sweepDataAccounts(signer) {
161
- const { closePublicKeys, totalValue } = await this.getDataAccountsInfo(signer.getPublicKey());
162
- if (closePublicKeys.length === 0) {
163
- this.logger.debug("sweepDataAccounts(): no old data accounts found, no need to close any!");
164
- return { txIds: [], count: 0, totalValue: 0n };
165
- }
166
- this.logger.debug("sweepDataAccounts(): closing old data accounts: ", closePublicKeys);
167
- let txns = [];
168
- for (let publicKey of closePublicKeys) {
169
- await (await this.CloseDataAccount(signer.getPublicKey(), publicKey)).addToTxs(txns);
170
- }
171
- const result = await this.root.Transactions.sendAndConfirm(signer, txns, true, undefined, true);
172
- this.logger.info("sweepDataAccounts(): old data accounts closed: " +
173
- closePublicKeys.map(pk => pk.toBase58()).join());
174
- for (let publicKey of closePublicKeys) {
175
- await this.removeDataAccount(publicKey);
176
- }
177
- return {
178
- txIds: result,
179
- count: closePublicKeys.length,
180
- totalValue: totalValue
181
- };
182
- }
183
- /**
184
- * Adds the transactions writing (and also initializing if it doesn't exist) data to the data account
185
- *
186
- * @param signer
187
- * @param reversedTxId reversed btc tx id is used to derive the data account address
188
- * @param writeData full data to be written to the data account
189
- * @param txs solana transactions array, where txns for writing & initializing will be added
190
- * @param feeRate fee rate to use for the transactions
191
- */
192
- async addTxsWriteData(signer, reversedTxId, writeData, txs, feeRate) {
193
- let txDataKey;
194
- let fetchedDataAccount = null;
195
- if (signer instanceof SolanaSigner_1.SolanaSigner && signer.keypair != null) {
196
- txDataKey = this.SwapTxDataAlt(reversedTxId, signer.keypair);
197
- fetchedDataAccount = await this.connection.getAccountInfo(txDataKey.publicKey);
198
- }
199
- else {
200
- const secret = Buffer.from((0, utils_1.randomBytes)(32));
201
- txDataKey = this.SwapTxDataAltBuffer(reversedTxId, secret);
202
- }
203
- const signerKey = signer instanceof SolanaSigner_1.SolanaSigner ? signer.getPublicKey() : signer;
204
- let pointer = 0;
205
- if (fetchedDataAccount == null) {
206
- const action = new SolanaAction_1.SolanaAction(signerKey, this.root);
207
- action.add(await this.InitDataAccount(signerKey, txDataKey, writeData.length));
208
- const { bytesWritten, action: writeAction } = await this.WriteData(signerKey, txDataKey, writeData, pointer, 420);
209
- this.logger.debug("addTxsWriteData(): Write partial data (" + pointer + " .. " + (pointer + bytesWritten) + ")/" + writeData.length +
210
- " key: " + txDataKey.publicKey.toBase58());
211
- pointer += bytesWritten;
212
- action.add(writeAction);
213
- await action.addToTxs(txs, feeRate);
214
- await this.saveDataAccount(signerKey, txDataKey.publicKey);
215
- }
216
- while (pointer < writeData.length) {
217
- const { bytesWritten, action } = await this.WriteData(signerKey, txDataKey, writeData, pointer, 950);
218
- this.logger.debug("addTxsWriteData(): Write partial data (" + pointer + " .. " + (pointer + bytesWritten) + ")/" + writeData.length +
219
- " key: " + txDataKey.publicKey.toBase58());
220
- pointer += bytesWritten;
221
- await action.addToTxs(txs, feeRate);
222
- }
223
- return txDataKey.publicKey;
224
- }
225
- }
226
- exports.SolanaDataAccount = SolanaDataAccount;
227
- SolanaDataAccount.CUCosts = {
228
- DATA_REMOVE: 50000,
229
- DATA_CREATE_AND_WRITE: 15000,
230
- DATA_CREATE: 5000,
231
- DATA_WRITE: 15000
232
- };
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SolanaDataAccount = exports.StoredDataAccount = void 0;
4
+ const SolanaSwapModule_1 = require("../SolanaSwapModule");
5
+ const web3_js_1 = require("@solana/web3.js");
6
+ const SolanaAction_1 = require("../../chain/SolanaAction");
7
+ const SolanaSigner_1 = require("../../wallet/SolanaSigner");
8
+ const utils_1 = require("@noble/hashes/utils");
9
+ class StoredDataAccount {
10
+ constructor(accountKeyOrData, owner) {
11
+ if (accountKeyOrData instanceof web3_js_1.PublicKey && owner instanceof web3_js_1.PublicKey) {
12
+ this.accountKey = accountKeyOrData;
13
+ this.owner = owner;
14
+ }
15
+ else {
16
+ this.accountKey = new web3_js_1.PublicKey(accountKeyOrData.accountKey);
17
+ this.owner = new web3_js_1.PublicKey(accountKeyOrData.owner);
18
+ }
19
+ }
20
+ serialize() {
21
+ return {
22
+ accountKey: this.accountKey.toBase58(),
23
+ owner: this.owner.toBase58()
24
+ };
25
+ }
26
+ }
27
+ exports.StoredDataAccount = StoredDataAccount;
28
+ class SolanaDataAccount extends SolanaSwapModule_1.SolanaSwapModule {
29
+ /**
30
+ * Action for initialization of the data account
31
+ *
32
+ * @param signer
33
+ * @param accountKey
34
+ * @param dataLength
35
+ * @private
36
+ */
37
+ async InitDataAccount(signer, accountKey, dataLength) {
38
+ const accountSize = this.program.version === "v2"
39
+ ? 40 + dataLength
40
+ : 32 + dataLength;
41
+ const lamportsDeposit = await this.connection.getMinimumBalanceForRentExemption(accountSize);
42
+ return new SolanaAction_1.SolanaAction(signer, this.root, [
43
+ web3_js_1.SystemProgram.createAccount({
44
+ fromPubkey: signer,
45
+ newAccountPubkey: accountKey.publicKey,
46
+ lamports: lamportsDeposit,
47
+ space: accountSize,
48
+ programId: this.swapProgram.programId
49
+ }),
50
+ await this.swapProgram.methods
51
+ .initData()
52
+ .accounts({
53
+ signer,
54
+ data: accountKey.publicKey
55
+ })
56
+ .instruction(),
57
+ ], SolanaDataAccount.CUCosts.DATA_CREATE, undefined, [accountKey]);
58
+ }
59
+ /**
60
+ * Action for closing the specific data account
61
+ *
62
+ * @param signer
63
+ * @param publicKey
64
+ */
65
+ async CloseDataAccount(signer, publicKey) {
66
+ return new SolanaAction_1.SolanaAction(signer, this.root, await this.swapProgram.methods
67
+ .closeData()
68
+ .accounts({
69
+ signer,
70
+ data: publicKey
71
+ })
72
+ .instruction(), SolanaDataAccount.CUCosts.DATA_REMOVE, await this.root.Fees.getFeeRate([signer, publicKey]));
73
+ }
74
+ /**
75
+ * Action for writing data to a data account, writes up to sizeLimit starting from the offset position of the
76
+ * provided writeData buffer
77
+ *
78
+ * @param signer
79
+ * @param accountKey account public key to write to
80
+ * @param writeData buffer holding the write data
81
+ * @param offset data from buffer starting at offset are written
82
+ * @param sizeLimit maximum amount of data to be written to the data account in this action
83
+ * @private
84
+ * @returns {Promise<{bytesWritten: number, action: SolanaAction}>} bytes written to the data account & action
85
+ */
86
+ async WriteData(signer, accountKey, writeData, offset, sizeLimit) {
87
+ const writeLen = Math.min(writeData.length - offset, sizeLimit);
88
+ return {
89
+ bytesWritten: writeLen,
90
+ action: new SolanaAction_1.SolanaAction(signer, this.root, await this.swapProgram.methods
91
+ .writeData(offset, writeData.slice(offset, offset + writeLen))
92
+ .accounts({
93
+ signer,
94
+ data: accountKey.publicKey
95
+ })
96
+ .instruction(), SolanaDataAccount.CUCosts.DATA_WRITE)
97
+ };
98
+ }
99
+ constructor(chainInterface, program, storage) {
100
+ super(chainInterface, program);
101
+ this.SwapTxDataAlt = this.program._keypair((reversedTxId, signer) => [Buffer.from(signer.secretKey), reversedTxId]);
102
+ this.SwapTxDataAltBuffer = this.program._keypair((reversedTxId, secret) => [secret, reversedTxId]);
103
+ this.storage = storage;
104
+ }
105
+ /**
106
+ * Saves data account to the storage, the storage is required such that we are able to close the accounts later
107
+ * manually in case the claim doesn't happen (expires due to fees, etc.)
108
+ *
109
+ * @param signer
110
+ * @param publicKey
111
+ * @private
112
+ */
113
+ saveDataAccount(signer, publicKey) {
114
+ return this.storage.saveData(publicKey.toBase58(), new StoredDataAccount(publicKey, signer));
115
+ }
116
+ /**
117
+ * Initializes the data account handler, loads the existing data accounts which should be checked and closed
118
+ */
119
+ async init() {
120
+ await this.storage.init();
121
+ const loadedData = await this.storage.loadData(StoredDataAccount);
122
+ this.logger.info("init(): initialized & loaded stored data accounts, count: " + loadedData.length);
123
+ }
124
+ /**
125
+ * Removes data account from the list of accounts that should be checked for reclaiming the locked SOL, this should
126
+ * be called after a batch of transactions claiming the swap was confirmed
127
+ *
128
+ * @param publicKey
129
+ */
130
+ removeDataAccount(publicKey) {
131
+ return this.storage.removeData(publicKey.toBase58());
132
+ }
133
+ async getDataAccountsInfo(signer) {
134
+ const closePublicKeys = [];
135
+ let totalLocked = 0n;
136
+ for (let key in this.storage.data) {
137
+ const { accountKey, owner } = this.storage.data[key];
138
+ if (!owner.equals(signer))
139
+ continue;
140
+ try {
141
+ const fetchedDataAccount = await this.connection.getAccountInfo(accountKey);
142
+ if (fetchedDataAccount == null || fetchedDataAccount.lamports === 0 || fetchedDataAccount.data.length === 0) {
143
+ await this.removeDataAccount(accountKey);
144
+ continue;
145
+ }
146
+ closePublicKeys.push(accountKey);
147
+ totalLocked += BigInt(fetchedDataAccount.lamports);
148
+ }
149
+ catch (e) { }
150
+ }
151
+ return {
152
+ closePublicKeys,
153
+ count: closePublicKeys.length,
154
+ totalValue: totalLocked
155
+ };
156
+ }
157
+ /**
158
+ * Sweeps all old data accounts, reclaiming the SOL locked in the PDAs
159
+ */
160
+ async sweepDataAccounts(signer) {
161
+ const { closePublicKeys, totalValue } = await this.getDataAccountsInfo(signer.getPublicKey());
162
+ if (closePublicKeys.length === 0) {
163
+ this.logger.debug("sweepDataAccounts(): no old data accounts found, no need to close any!");
164
+ return { txIds: [], count: 0, totalValue: 0n };
165
+ }
166
+ this.logger.debug("sweepDataAccounts(): closing old data accounts: ", closePublicKeys);
167
+ let txns = [];
168
+ for (let publicKey of closePublicKeys) {
169
+ await (await this.CloseDataAccount(signer.getPublicKey(), publicKey)).addToTxs(txns);
170
+ }
171
+ const result = await this.root.Transactions.sendAndConfirm(signer, txns, true, undefined, true);
172
+ this.logger.info("sweepDataAccounts(): old data accounts closed: " +
173
+ closePublicKeys.map(pk => pk.toBase58()).join());
174
+ for (let publicKey of closePublicKeys) {
175
+ await this.removeDataAccount(publicKey);
176
+ }
177
+ return {
178
+ txIds: result,
179
+ count: closePublicKeys.length,
180
+ totalValue: totalValue
181
+ };
182
+ }
183
+ /**
184
+ * Adds the transactions writing (and also initializing if it doesn't exist) data to the data account
185
+ *
186
+ * @param signer
187
+ * @param reversedTxId reversed btc tx id is used to derive the data account address
188
+ * @param writeData full data to be written to the data account
189
+ * @param txs solana transactions array, where txns for writing & initializing will be added
190
+ * @param feeRate fee rate to use for the transactions
191
+ */
192
+ async addTxsWriteData(signer, reversedTxId, writeData, txs, feeRate) {
193
+ let txDataKey;
194
+ let fetchedDataAccount = null;
195
+ if (signer instanceof SolanaSigner_1.SolanaSigner && signer.keypair != null) {
196
+ txDataKey = this.SwapTxDataAlt(reversedTxId, signer.keypair);
197
+ fetchedDataAccount = await this.connection.getAccountInfo(txDataKey.publicKey);
198
+ }
199
+ else {
200
+ const secret = Buffer.from((0, utils_1.randomBytes)(32));
201
+ txDataKey = this.SwapTxDataAltBuffer(reversedTxId, secret);
202
+ }
203
+ const signerKey = signer instanceof SolanaSigner_1.SolanaSigner ? signer.getPublicKey() : signer;
204
+ let pointer = 0;
205
+ if (fetchedDataAccount == null) {
206
+ const action = new SolanaAction_1.SolanaAction(signerKey, this.root);
207
+ action.add(await this.InitDataAccount(signerKey, txDataKey, writeData.length));
208
+ const { bytesWritten, action: writeAction } = await this.WriteData(signerKey, txDataKey, writeData, pointer, 420);
209
+ this.logger.debug("addTxsWriteData(): Write partial data (" + pointer + " .. " + (pointer + bytesWritten) + ")/" + writeData.length +
210
+ " key: " + txDataKey.publicKey.toBase58());
211
+ pointer += bytesWritten;
212
+ action.add(writeAction);
213
+ await action.addToTxs(txs, feeRate);
214
+ await this.saveDataAccount(signerKey, txDataKey.publicKey);
215
+ }
216
+ while (pointer < writeData.length) {
217
+ const { bytesWritten, action } = await this.WriteData(signerKey, txDataKey, writeData, pointer, 950);
218
+ this.logger.debug("addTxsWriteData(): Write partial data (" + pointer + " .. " + (pointer + bytesWritten) + ")/" + writeData.length +
219
+ " key: " + txDataKey.publicKey.toBase58());
220
+ pointer += bytesWritten;
221
+ await action.addToTxs(txs, feeRate);
222
+ }
223
+ return txDataKey.publicKey;
224
+ }
225
+ }
226
+ exports.SolanaDataAccount = SolanaDataAccount;
227
+ SolanaDataAccount.CUCosts = {
228
+ DATA_REMOVE: 50000,
229
+ DATA_CREATE_AND_WRITE: 15000,
230
+ DATA_CREATE: 5000,
231
+ DATA_WRITE: 15000
232
+ };
@@ -1,69 +1,69 @@
1
- import { SolanaSwapModule } from "../SolanaSwapModule";
2
- import { PublicKey } from "@solana/web3.js";
3
- import { SolanaTx } from "../../chain/modules/SolanaTransactions";
4
- import { IntermediaryReputationType } from "@atomiqlabs/base";
5
- export declare class SolanaLpVault extends SolanaSwapModule {
6
- private static readonly CUCosts;
7
- /**
8
- * Action for withdrawing funds from the LP vault
9
- *
10
- * @param signer
11
- * @param token
12
- * @param amount
13
- * @private
14
- */
15
- private Withdraw;
16
- /**
17
- * Action for depositing funds to the LP vault
18
- *
19
- * @param signer
20
- * @param token
21
- * @param amount
22
- * @private
23
- */
24
- private Deposit;
25
- /**
26
- * Returns intermediary's reputation & vault balance for a specific token
27
- *
28
- * @param address
29
- * @param token
30
- */
31
- getIntermediaryData(address: PublicKey, token: PublicKey): Promise<{
32
- balance: bigint;
33
- reputation: IntermediaryReputationType;
34
- } | null>;
35
- /**
36
- * Returns intermediary's reputation for a specific token
37
- *
38
- * @param address
39
- * @param token
40
- */
41
- getIntermediaryReputation(address: PublicKey, token: PublicKey): Promise<IntermediaryReputationType | null>;
42
- /**
43
- * Returns the balance of the token an intermediary has in his LP vault
44
- *
45
- * @param address
46
- * @param token
47
- */
48
- getIntermediaryBalance(address: PublicKey, token: PublicKey): Promise<bigint>;
49
- /**
50
- * Creates transactions for withdrawing funds from the LP vault, creates ATA if it doesn't exist and unwraps
51
- * WSOL to SOL if required
52
- *
53
- * @param signer
54
- * @param token
55
- * @param amount
56
- * @param feeRate
57
- */
58
- txsWithdraw(signer: PublicKey, token: PublicKey, amount: bigint, feeRate?: string): Promise<SolanaTx[]>;
59
- /**
60
- * Creates transaction for depositing funds into the LP vault, wraps SOL to WSOL if required
61
- *
62
- * @param signer
63
- * @param token
64
- * @param amount
65
- * @param feeRate
66
- */
67
- txsDeposit(signer: PublicKey, token: PublicKey, amount: bigint, feeRate?: string): Promise<SolanaTx[]>;
68
- getFeeRate(signer: PublicKey, token: PublicKey): Promise<string>;
69
- }
1
+ import { SolanaSwapModule } from "../SolanaSwapModule";
2
+ import { PublicKey } from "@solana/web3.js";
3
+ import { SolanaTx } from "../../chain/modules/SolanaTransactions";
4
+ import { IntermediaryReputationType } from "@atomiqlabs/base";
5
+ export declare class SolanaLpVault extends SolanaSwapModule {
6
+ private static readonly CUCosts;
7
+ /**
8
+ * Action for withdrawing funds from the LP vault
9
+ *
10
+ * @param signer
11
+ * @param token
12
+ * @param amount
13
+ * @private
14
+ */
15
+ private Withdraw;
16
+ /**
17
+ * Action for depositing funds to the LP vault
18
+ *
19
+ * @param signer
20
+ * @param token
21
+ * @param amount
22
+ * @private
23
+ */
24
+ private Deposit;
25
+ /**
26
+ * Returns intermediary's reputation & vault balance for a specific token
27
+ *
28
+ * @param address
29
+ * @param token
30
+ */
31
+ getIntermediaryData(address: PublicKey, token: PublicKey): Promise<{
32
+ balance: bigint;
33
+ reputation: IntermediaryReputationType;
34
+ } | null>;
35
+ /**
36
+ * Returns intermediary's reputation for a specific token
37
+ *
38
+ * @param address
39
+ * @param token
40
+ */
41
+ getIntermediaryReputation(address: PublicKey, token: PublicKey): Promise<IntermediaryReputationType | null>;
42
+ /**
43
+ * Returns the balance of the token an intermediary has in his LP vault
44
+ *
45
+ * @param address
46
+ * @param token
47
+ */
48
+ getIntermediaryBalance(address: PublicKey, token: PublicKey): Promise<bigint>;
49
+ /**
50
+ * Creates transactions for withdrawing funds from the LP vault, creates ATA if it doesn't exist and unwraps
51
+ * WSOL to SOL if required
52
+ *
53
+ * @param signer
54
+ * @param token
55
+ * @param amount
56
+ * @param feeRate
57
+ */
58
+ txsWithdraw(signer: PublicKey, token: PublicKey, amount: bigint, feeRate?: string): Promise<SolanaTx[]>;
59
+ /**
60
+ * Creates transaction for depositing funds into the LP vault, wraps SOL to WSOL if required
61
+ *
62
+ * @param signer
63
+ * @param token
64
+ * @param amount
65
+ * @param feeRate
66
+ */
67
+ txsDeposit(signer: PublicKey, token: PublicKey, amount: bigint, feeRate?: string): Promise<SolanaTx[]>;
68
+ getFeeRate(signer: PublicKey, token: PublicKey): Promise<string>;
69
+ }