@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.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/solana/SolanaChains.d.ts +14 -0
- package/dist/solana/SolanaChains.js +18 -0
- package/dist/solana/SolanaInitializer.d.ts +18 -0
- package/dist/solana/SolanaInitializer.js +59 -0
- package/dist/solana/base/SolanaAction.js +25 -38
- package/dist/solana/base/modules/SolanaBlocks.js +18 -29
- package/dist/solana/base/modules/SolanaEvents.js +15 -26
- package/dist/solana/base/modules/SolanaFees.d.ts +4 -5
- package/dist/solana/base/modules/SolanaFees.js +168 -182
- package/dist/solana/base/modules/SolanaSlots.js +16 -29
- package/dist/solana/base/modules/SolanaTokens.d.ts +6 -7
- package/dist/solana/base/modules/SolanaTokens.js +63 -84
- package/dist/solana/base/modules/SolanaTransactions.d.ts +2 -2
- package/dist/solana/base/modules/SolanaTransactions.js +143 -165
- package/dist/solana/btcrelay/SolanaBtcRelay.d.ts +2 -3
- package/dist/solana/btcrelay/SolanaBtcRelay.js +185 -221
- package/dist/solana/events/SolanaChainEvents.js +113 -138
- package/dist/solana/events/SolanaChainEventsBrowser.js +56 -65
- package/dist/solana/program/modules/SolanaProgramEvents.js +13 -24
- package/dist/solana/swaps/SolanaSwapData.d.ts +15 -11
- package/dist/solana/swaps/SolanaSwapData.js +29 -13
- package/dist/solana/swaps/SolanaSwapProgram.d.ts +40 -41
- package/dist/solana/swaps/SolanaSwapProgram.js +212 -221
- package/dist/solana/swaps/modules/SolanaDataAccount.d.ts +2 -3
- package/dist/solana/swaps/modules/SolanaDataAccount.js +117 -141
- package/dist/solana/swaps/modules/SolanaLpVault.d.ts +4 -5
- package/dist/solana/swaps/modules/SolanaLpVault.js +87 -110
- package/dist/solana/swaps/modules/SwapClaim.d.ts +4 -4
- package/dist/solana/swaps/modules/SwapClaim.js +122 -134
- package/dist/solana/swaps/modules/SwapInit.d.ts +2 -3
- package/dist/solana/swaps/modules/SwapInit.js +254 -285
- package/dist/solana/swaps/modules/SwapRefund.d.ts +2 -3
- package/dist/solana/swaps/modules/SwapRefund.js +103 -113
- package/dist/utils/Utils.d.ts +10 -0
- package/dist/utils/Utils.js +62 -35
- package/package.json +9 -6
- package/src/index.ts +1 -0
- package/src/solana/SolanaChains.ts +16 -0
- package/src/solana/SolanaInitializer.ts +98 -0
- package/src/solana/base/SolanaBase.ts +1 -2
- package/src/solana/base/modules/SolanaEvents.ts +0 -1
- package/src/solana/base/modules/SolanaFees.ts +35 -31
- package/src/solana/base/modules/SolanaTokens.ts +26 -27
- package/src/solana/base/modules/SolanaTransactions.ts +33 -28
- package/src/solana/btcrelay/SolanaBtcRelay.ts +6 -10
- package/src/solana/events/SolanaChainEventsBrowser.ts +14 -10
- package/src/solana/program/modules/SolanaProgramEvents.ts +1 -1
- package/src/solana/swaps/SolanaSwapData.ts +38 -19
- package/src/solana/swaps/SolanaSwapProgram.ts +133 -105
- package/src/solana/swaps/modules/SolanaDataAccount.ts +4 -6
- package/src/solana/swaps/modules/SolanaLpVault.ts +18 -18
- package/src/solana/swaps/modules/SwapClaim.ts +14 -17
- package/src/solana/swaps/modules/SwapInit.ts +35 -38
- package/src/solana/swaps/modules/SwapRefund.ts +20 -23
- 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)(
|
|
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,
|
|
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:
|
|
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)(
|
|
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:
|
|
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,
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
191
|
-
|
|
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(
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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
|
|
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 (
|
|
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
|
|
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,
|
|
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
|
*
|