@atomiqlabs/chain-solana 7.3.8 → 8.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 (57) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +1 -0
  3. package/dist/solana/SolanaChains.d.ts +14 -0
  4. package/dist/solana/SolanaChains.js +18 -0
  5. package/dist/solana/SolanaInitializer.d.ts +18 -0
  6. package/dist/solana/SolanaInitializer.js +59 -0
  7. package/dist/solana/base/SolanaAction.js +25 -38
  8. package/dist/solana/base/modules/SolanaBlocks.js +18 -29
  9. package/dist/solana/base/modules/SolanaEvents.js +15 -26
  10. package/dist/solana/base/modules/SolanaFees.d.ts +4 -5
  11. package/dist/solana/base/modules/SolanaFees.js +168 -182
  12. package/dist/solana/base/modules/SolanaSlots.js +16 -29
  13. package/dist/solana/base/modules/SolanaTokens.d.ts +6 -7
  14. package/dist/solana/base/modules/SolanaTokens.js +63 -84
  15. package/dist/solana/base/modules/SolanaTransactions.d.ts +2 -2
  16. package/dist/solana/base/modules/SolanaTransactions.js +143 -165
  17. package/dist/solana/btcrelay/SolanaBtcRelay.d.ts +2 -3
  18. package/dist/solana/btcrelay/SolanaBtcRelay.js +185 -221
  19. package/dist/solana/events/SolanaChainEvents.js +113 -138
  20. package/dist/solana/events/SolanaChainEventsBrowser.js +56 -65
  21. package/dist/solana/program/modules/SolanaProgramEvents.js +13 -24
  22. package/dist/solana/swaps/SolanaSwapData.d.ts +15 -11
  23. package/dist/solana/swaps/SolanaSwapData.js +29 -13
  24. package/dist/solana/swaps/SolanaSwapProgram.d.ts +40 -41
  25. package/dist/solana/swaps/SolanaSwapProgram.js +212 -221
  26. package/dist/solana/swaps/modules/SolanaDataAccount.d.ts +2 -3
  27. package/dist/solana/swaps/modules/SolanaDataAccount.js +117 -141
  28. package/dist/solana/swaps/modules/SolanaLpVault.d.ts +4 -5
  29. package/dist/solana/swaps/modules/SolanaLpVault.js +87 -110
  30. package/dist/solana/swaps/modules/SwapClaim.d.ts +4 -4
  31. package/dist/solana/swaps/modules/SwapClaim.js +122 -134
  32. package/dist/solana/swaps/modules/SwapInit.d.ts +2 -3
  33. package/dist/solana/swaps/modules/SwapInit.js +254 -285
  34. package/dist/solana/swaps/modules/SwapRefund.d.ts +2 -3
  35. package/dist/solana/swaps/modules/SwapRefund.js +103 -113
  36. package/dist/utils/Utils.d.ts +10 -0
  37. package/dist/utils/Utils.js +62 -35
  38. package/package.json +9 -6
  39. package/src/index.ts +1 -0
  40. package/src/solana/SolanaChains.ts +16 -0
  41. package/src/solana/SolanaInitializer.ts +98 -0
  42. package/src/solana/base/SolanaBase.ts +1 -2
  43. package/src/solana/base/modules/SolanaEvents.ts +0 -1
  44. package/src/solana/base/modules/SolanaFees.ts +35 -31
  45. package/src/solana/base/modules/SolanaTokens.ts +26 -27
  46. package/src/solana/base/modules/SolanaTransactions.ts +33 -28
  47. package/src/solana/btcrelay/SolanaBtcRelay.ts +6 -10
  48. package/src/solana/events/SolanaChainEventsBrowser.ts +14 -10
  49. package/src/solana/program/modules/SolanaProgramEvents.ts +1 -1
  50. package/src/solana/swaps/SolanaSwapData.ts +38 -19
  51. package/src/solana/swaps/SolanaSwapProgram.ts +133 -105
  52. package/src/solana/swaps/modules/SolanaDataAccount.ts +4 -6
  53. package/src/solana/swaps/modules/SolanaLpVault.ts +18 -18
  54. package/src/solana/swaps/modules/SwapClaim.ts +14 -17
  55. package/src/solana/swaps/modules/SwapInit.ts +35 -38
  56. package/src/solana/swaps/modules/SwapRefund.ts +20 -23
  57. package/src/utils/Utils.ts +35 -0
@@ -1,27 +1,12 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.SolanaTokens = void 0;
13
4
  const SolanaModule_1 = require("../SolanaModule");
14
5
  const web3_js_1 = require("@solana/web3.js");
15
6
  const spl_token_1 = require("@solana/spl-token");
16
- const BN = require("bn.js");
17
7
  const SolanaAction_1 = require("../SolanaAction");
18
8
  const Utils_1 = require("../../../utils/Utils");
19
9
  class SolanaTokens extends SolanaModule_1.SolanaModule {
20
- constructor() {
21
- super(...arguments);
22
- this.WSOL_ADDRESS = new web3_js_1.PublicKey("So11111111111111111111111111111111111111112");
23
- this.SPL_ATA_RENT_EXEMPT = 2039280;
24
- }
25
10
  /**
26
11
  * Creates an ATA for a specific public key & token, the ATA creation is paid for by the underlying provider's
27
12
  * public key
@@ -47,14 +32,14 @@ class SolanaTokens extends SolanaModule_1.SolanaModule {
47
32
  * @constructor
48
33
  */
49
34
  Wrap(publicKey, amount, initAta) {
50
- const ata = (0, spl_token_1.getAssociatedTokenAddressSync)(this.WSOL_ADDRESS, publicKey, true);
35
+ const ata = (0, spl_token_1.getAssociatedTokenAddressSync)(SolanaTokens.WSOL_ADDRESS, publicKey, true);
51
36
  const action = new SolanaAction_1.SolanaAction(publicKey, this.root);
52
37
  if (initAta)
53
- action.addIx((0, spl_token_1.createAssociatedTokenAccountInstruction)(publicKey, ata, publicKey, this.WSOL_ADDRESS), SolanaTokens.CUCosts.ATA_INIT);
38
+ action.addIx((0, spl_token_1.createAssociatedTokenAccountInstruction)(publicKey, ata, publicKey, SolanaTokens.WSOL_ADDRESS), SolanaTokens.CUCosts.ATA_INIT);
54
39
  action.addIx(web3_js_1.SystemProgram.transfer({
55
40
  fromPubkey: publicKey,
56
41
  toPubkey: ata,
57
- lamports: BigInt(amount.toString(10))
42
+ lamports: amount
58
43
  }), SolanaTokens.CUCosts.WRAP_SOL);
59
44
  action.addIx((0, spl_token_1.createSyncNativeInstruction)(ata));
60
45
  return action;
@@ -66,7 +51,7 @@ class SolanaTokens extends SolanaModule_1.SolanaModule {
66
51
  * @constructor
67
52
  */
68
53
  Unwrap(publicKey) {
69
- const ata = (0, spl_token_1.getAssociatedTokenAddressSync)(this.WSOL_ADDRESS, publicKey, true);
54
+ const ata = (0, spl_token_1.getAssociatedTokenAddressSync)(SolanaTokens.WSOL_ADDRESS, publicKey, true);
70
55
  return new SolanaAction_1.SolanaAction(publicKey, this.root, (0, spl_token_1.createCloseAccountInstruction)(ata, publicKey, publicKey), SolanaTokens.CUCosts.ATA_CLOSE);
71
56
  }
72
57
  /**
@@ -82,7 +67,7 @@ class SolanaTokens extends SolanaModule_1.SolanaModule {
82
67
  return new SolanaAction_1.SolanaAction(signer, this.root, web3_js_1.SystemProgram.transfer({
83
68
  fromPubkey: signer,
84
69
  toPubkey: recipient,
85
- lamports: BigInt(amount.toString(10))
70
+ lamports: amount
86
71
  }), SolanaTokens.CUCosts.TRANSFER_SOL);
87
72
  }
88
73
  /**
@@ -98,7 +83,7 @@ class SolanaTokens extends SolanaModule_1.SolanaModule {
98
83
  Transfer(signer, recipient, token, amount) {
99
84
  const srcAta = (0, spl_token_1.getAssociatedTokenAddressSync)(token, signer, true);
100
85
  const dstAta = (0, spl_token_1.getAssociatedTokenAddressSync)(token, recipient, true);
101
- return new SolanaAction_1.SolanaAction(signer, this.root, (0, spl_token_1.createTransferInstruction)(srcAta, dstAta, signer, BigInt(amount.toString(10))), SolanaTokens.CUCosts.TRANSFER);
86
+ return new SolanaAction_1.SolanaAction(signer, this.root, (0, spl_token_1.createTransferInstruction)(srcAta, dstAta, signer, amount), SolanaTokens.CUCosts.TRANSFER);
102
87
  }
103
88
  /**
104
89
  * Creates transactions for sending SOL (the native token)
@@ -109,23 +94,21 @@ class SolanaTokens extends SolanaModule_1.SolanaModule {
109
94
  * @param feeRate fee rate to use for the transactions
110
95
  * @private
111
96
  */
112
- txsTransferSol(signer, amount, recipient, feeRate) {
113
- return __awaiter(this, void 0, void 0, function* () {
114
- const wsolAta = (0, spl_token_1.getAssociatedTokenAddressSync)(this.WSOL_ADDRESS, signer, true);
115
- const shouldUnwrap = yield this.ataExists(wsolAta);
116
- const action = new SolanaAction_1.SolanaAction(signer, this.root);
117
- if (shouldUnwrap) {
118
- feeRate = feeRate || (yield this.root.Fees.getFeeRate([signer, recipient, wsolAta]));
119
- action.add(this.Unwrap(signer));
120
- }
121
- else {
122
- feeRate = feeRate || (yield this.root.Fees.getFeeRate([signer, recipient]));
123
- }
124
- action.add(this.SolTransfer(signer, recipient, amount));
125
- this.logger.debug("txsTransferSol(): transfer native solana TX created, recipient: " + recipient.toString() +
126
- " amount: " + amount.toString(10) + " unwrapping: " + shouldUnwrap);
127
- return [yield action.tx(feeRate)];
128
- });
97
+ async txsTransferSol(signer, amount, recipient, feeRate) {
98
+ const wsolAta = (0, spl_token_1.getAssociatedTokenAddressSync)(SolanaTokens.WSOL_ADDRESS, signer, true);
99
+ const shouldUnwrap = await this.ataExists(wsolAta);
100
+ const action = new SolanaAction_1.SolanaAction(signer, this.root);
101
+ if (shouldUnwrap) {
102
+ feeRate = feeRate || await this.root.Fees.getFeeRate([signer, recipient, wsolAta]);
103
+ action.add(this.Unwrap(signer));
104
+ }
105
+ else {
106
+ feeRate = feeRate || await this.root.Fees.getFeeRate([signer, recipient]);
107
+ }
108
+ action.add(this.SolTransfer(signer, recipient, amount));
109
+ this.logger.debug("txsTransferSol(): transfer native solana TX created, recipient: " + recipient.toString() +
110
+ " amount: " + amount.toString(10) + " unwrapping: " + shouldUnwrap);
111
+ return [await action.tx(feeRate)];
129
112
  }
130
113
  /**
131
114
  * Creates transactions for sending the over the tokens
@@ -137,21 +120,19 @@ class SolanaTokens extends SolanaModule_1.SolanaModule {
137
120
  * @param feeRate fee rate to use for the transactions
138
121
  * @private
139
122
  */
140
- txsTransferTokens(signer, token, amount, recipient, feeRate) {
141
- return __awaiter(this, void 0, void 0, function* () {
142
- const srcAta = (0, spl_token_1.getAssociatedTokenAddressSync)(token, signer, true);
143
- const dstAta = (0, spl_token_1.getAssociatedTokenAddressSync)(token, recipient, true);
144
- feeRate = feeRate || (yield this.root.Fees.getFeeRate([signer, srcAta, dstAta]));
145
- const initAta = !(yield this.ataExists(dstAta));
146
- const action = new SolanaAction_1.SolanaAction(signer, this.root);
147
- if (initAta) {
148
- action.add(this.InitAta(signer, recipient, token));
149
- }
150
- action.add(this.Transfer(signer, recipient, token, amount));
151
- this.logger.debug("txsTransferTokens(): transfer TX created, recipient: " + recipient.toString() +
152
- " token: " + token.toString() + " amount: " + amount.toString(10) + " initAta: " + initAta);
153
- return [yield action.tx(feeRate)];
154
- });
123
+ async txsTransferTokens(signer, token, amount, recipient, feeRate) {
124
+ const srcAta = (0, spl_token_1.getAssociatedTokenAddressSync)(token, signer, true);
125
+ const dstAta = (0, spl_token_1.getAssociatedTokenAddressSync)(token, recipient, true);
126
+ feeRate = feeRate || await this.root.Fees.getFeeRate([signer, srcAta, dstAta]);
127
+ const initAta = !await this.ataExists(dstAta);
128
+ const action = new SolanaAction_1.SolanaAction(signer, this.root);
129
+ if (initAta) {
130
+ action.add(this.InitAta(signer, recipient, token));
131
+ }
132
+ action.add(this.Transfer(signer, recipient, token, amount));
133
+ this.logger.debug("txsTransferTokens(): transfer TX created, recipient: " + recipient.toString() +
134
+ " token: " + token.toString() + " amount: " + amount.toString(10) + " initAta: " + initAta);
135
+ return [await action.tx(feeRate)];
155
136
  }
156
137
  ///////////////////
157
138
  //// Tokens
@@ -186,17 +167,15 @@ class SolanaTokens extends SolanaModule_1.SolanaModule {
186
167
  *
187
168
  * @param ata
188
169
  */
189
- ataExists(ata) {
190
- return __awaiter(this, void 0, void 0, function* () {
191
- const account = yield (0, Utils_1.tryWithRetries)(() => this.getATAOrNull(ata), this.retryPolicy);
192
- return account != null;
193
- });
170
+ async ataExists(ata) {
171
+ const account = await (0, Utils_1.tryWithRetries)(() => this.getATAOrNull(ata), this.retryPolicy);
172
+ return account != null;
194
173
  }
195
174
  /**
196
175
  * Returns the rent exempt deposit required to initiate the ATA
197
176
  */
198
177
  getATARentExemptLamports() {
199
- return Promise.resolve(new BN(this.SPL_ATA_RENT_EXEMPT));
178
+ return Promise.resolve(BigInt(SolanaTokens.SPL_ATA_RENT_EXEMPT));
200
179
  }
201
180
  /**
202
181
  * Returns the token balance of the public key
@@ -204,35 +183,33 @@ class SolanaTokens extends SolanaModule_1.SolanaModule {
204
183
  * @param publicKey
205
184
  * @param token
206
185
  */
207
- getTokenBalance(publicKey, token) {
208
- return __awaiter(this, void 0, void 0, function* () {
209
- const ata = (0, spl_token_1.getAssociatedTokenAddressSync)(token, publicKey, true);
210
- const [ataAccount, balance] = yield Promise.all([
211
- this.getATAOrNull(ata),
212
- (token != null && token.equals(this.WSOL_ADDRESS)) ? this.connection.getBalance(publicKey) : Promise.resolve(null)
213
- ]);
214
- let ataExists = ataAccount != null;
215
- let sum = new BN(0);
216
- if (ataExists) {
217
- sum = sum.add(new BN(ataAccount.amount.toString()));
218
- }
219
- if (balance != null) {
220
- let balanceLamports = new BN(balance);
221
- if (!ataExists)
222
- balanceLamports = balanceLamports.sub(yield this.getATARentExemptLamports());
223
- if (!balanceLamports.isNeg())
224
- sum = sum.add(balanceLamports);
225
- }
226
- this.logger.debug("getTokenBalance(): token balance fetched, token: " + token.toString() +
227
- " address: " + publicKey.toString() + " amount: " + sum.toString());
228
- return { balance: sum, ataExists };
229
- });
186
+ async getTokenBalance(publicKey, token) {
187
+ const ata = (0, spl_token_1.getAssociatedTokenAddressSync)(token, publicKey, true);
188
+ const [ataAccount, balance] = await Promise.all([
189
+ this.getATAOrNull(ata),
190
+ (token != null && token.equals(SolanaTokens.WSOL_ADDRESS)) ? this.connection.getBalance(publicKey) : Promise.resolve(null)
191
+ ]);
192
+ let ataExists = ataAccount != null;
193
+ let sum = 0n;
194
+ if (ataExists) {
195
+ sum += ataAccount.amount;
196
+ }
197
+ if (balance != null) {
198
+ let balanceLamports = BigInt(balance);
199
+ if (!ataExists)
200
+ balanceLamports = balanceLamports - await this.getATARentExemptLamports();
201
+ if (balanceLamports >= 0n)
202
+ sum += balanceLamports;
203
+ }
204
+ this.logger.debug("getTokenBalance(): token balance fetched, token: " + token.toString() +
205
+ " address: " + publicKey.toString() + " amount: " + sum.toString());
206
+ return { balance: sum, ataExists };
230
207
  }
231
208
  /**
232
209
  * Returns the native currency address, we use WSOL address as placeholder for SOL
233
210
  */
234
211
  getNativeCurrencyAddress() {
235
- return this.WSOL_ADDRESS;
212
+ return SolanaTokens.WSOL_ADDRESS;
236
213
  }
237
214
  /**
238
215
  * Parses string base58 representation of the token address to a PublicKey object
@@ -253,7 +230,7 @@ class SolanaTokens extends SolanaModule_1.SolanaModule {
253
230
  * @param feeRate fee rate to use for the transaction
254
231
  */
255
232
  txsTransfer(signer, token, amount, dstAddress, feeRate) {
256
- if (this.WSOL_ADDRESS.equals(token)) {
233
+ if (SolanaTokens.WSOL_ADDRESS.equals(token)) {
257
234
  return this.txsTransferSol(signer, amount, dstAddress, feeRate);
258
235
  }
259
236
  return this.txsTransferTokens(signer, token, amount, dstAddress, feeRate);
@@ -267,3 +244,5 @@ SolanaTokens.CUCosts = {
267
244
  TRANSFER: 50000,
268
245
  TRANSFER_SOL: 5000
269
246
  };
247
+ SolanaTokens.WSOL_ADDRESS = new web3_js_1.PublicKey("So11111111111111111111111111111111111111112");
248
+ SolanaTokens.SPL_ATA_RENT_EXEMPT = 2039280;
@@ -80,7 +80,7 @@ export declare class SolanaTransactions extends SolanaModule {
80
80
  * optionally waits for confirmation of a batch of solana transactions
81
81
  *
82
82
  * @param signer
83
- * @param txs transactions to send
83
+ * @param _txs
84
84
  * @param waitForConfirmation whether to wait for transaction confirmations (this also makes sure the transactions
85
85
  * are re-sent at regular intervals)
86
86
  * @param abortSignal abort signal to abort waiting for transaction confirmations
@@ -88,7 +88,7 @@ export declare class SolanaTransactions extends SolanaModule {
88
88
  * are executed in order)
89
89
  * @param onBeforePublish a callback called before every transaction is published
90
90
  */
91
- sendAndConfirm(signer: SolanaSigner, txs: SolanaTx[], waitForConfirmation?: boolean, abortSignal?: AbortSignal, parallel?: boolean, onBeforePublish?: (txId: string, rawTx: string) => Promise<void>): Promise<string[]>;
91
+ sendAndConfirm(signer: SolanaSigner, _txs: SolanaTx[], waitForConfirmation?: boolean, abortSignal?: AbortSignal, parallel?: boolean, onBeforePublish?: (txId: string, rawTx: string) => Promise<void>): Promise<string[]>;
92
92
  /**
93
93
  * Serializes the solana transaction, saves the transaction, signers & last valid blockheight
94
94
  *