@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.
- package/LICENSE +201 -201
- package/README.md +73 -73
- package/dist/index.d.ts +81 -81
- package/dist/index.js +102 -102
- package/dist/node/index.d.ts +9 -9
- package/dist/node/index.js +13 -13
- package/dist/solana/SolanaChainType.d.ts +15 -15
- package/dist/solana/SolanaChainType.js +2 -2
- package/dist/solana/SolanaChains.d.ts +12 -12
- package/dist/solana/SolanaChains.js +45 -45
- package/dist/solana/SolanaInitializer.d.ts +94 -94
- package/dist/solana/SolanaInitializer.js +174 -174
- package/dist/solana/btcrelay/SolanaBtcRelay.d.ts +222 -222
- package/dist/solana/btcrelay/SolanaBtcRelay.js +455 -455
- package/dist/solana/btcrelay/headers/SolanaBtcHeader.d.ts +84 -84
- package/dist/solana/btcrelay/headers/SolanaBtcHeader.js +70 -70
- package/dist/solana/btcrelay/headers/SolanaBtcStoredHeader.d.ts +92 -92
- package/dist/solana/btcrelay/headers/SolanaBtcStoredHeader.js +109 -109
- package/dist/solana/btcrelay/program/programIdl.json +671 -671
- package/dist/solana/chain/SolanaAction.d.ts +26 -26
- package/dist/solana/chain/SolanaAction.js +87 -87
- package/dist/solana/chain/SolanaChainInterface.d.ts +224 -224
- package/dist/solana/chain/SolanaChainInterface.js +275 -275
- package/dist/solana/chain/SolanaModule.d.ts +14 -14
- package/dist/solana/chain/SolanaModule.js +13 -13
- package/dist/solana/chain/modules/SolanaAddresses.d.ts +8 -8
- package/dist/solana/chain/modules/SolanaAddresses.js +22 -22
- package/dist/solana/chain/modules/SolanaBlocks.d.ts +32 -32
- package/dist/solana/chain/modules/SolanaBlocks.js +78 -78
- package/dist/solana/chain/modules/SolanaEvents.d.ts +68 -68
- package/dist/solana/chain/modules/SolanaEvents.js +238 -238
- package/dist/solana/chain/modules/SolanaFees.d.ts +189 -189
- package/dist/solana/chain/modules/SolanaFees.js +434 -434
- package/dist/solana/chain/modules/SolanaSignatures.d.ts +24 -24
- package/dist/solana/chain/modules/SolanaSignatures.js +39 -39
- package/dist/solana/chain/modules/SolanaSlots.d.ts +33 -33
- package/dist/solana/chain/modules/SolanaSlots.js +72 -72
- package/dist/solana/chain/modules/SolanaTokens.d.ts +123 -123
- package/dist/solana/chain/modules/SolanaTokens.js +242 -242
- package/dist/solana/chain/modules/SolanaTransactions.d.ts +149 -149
- package/dist/solana/chain/modules/SolanaTransactions.js +445 -445
- package/dist/solana/connection/ConnectionWithRetries.d.ts +35 -35
- package/dist/solana/connection/ConnectionWithRetries.js +86 -71
- package/dist/solana/events/SolanaChainEvents.d.ts +45 -45
- package/dist/solana/events/SolanaChainEvents.js +108 -108
- package/dist/solana/events/SolanaChainEventsBrowser.d.ts +205 -205
- package/dist/solana/events/SolanaChainEventsBrowser.js +404 -404
- package/dist/solana/program/SolanaProgramBase.d.ts +73 -73
- package/dist/solana/program/SolanaProgramBase.js +54 -54
- package/dist/solana/program/SolanaProgramModule.d.ts +8 -8
- package/dist/solana/program/SolanaProgramModule.js +11 -11
- package/dist/solana/program/modules/SolanaProgramEvents.d.ts +53 -53
- package/dist/solana/program/modules/SolanaProgramEvents.js +117 -117
- package/dist/solana/swaps/SolanaSwapData.d.ts +333 -333
- package/dist/solana/swaps/SolanaSwapData.js +535 -535
- package/dist/solana/swaps/SolanaSwapModule.d.ts +11 -11
- package/dist/solana/swaps/SolanaSwapModule.js +12 -12
- package/dist/solana/swaps/SolanaSwapProgram.d.ts +376 -376
- package/dist/solana/swaps/SolanaSwapProgram.js +769 -769
- package/dist/solana/swaps/SwapTypeEnum.d.ts +11 -11
- package/dist/solana/swaps/SwapTypeEnum.js +43 -43
- package/dist/solana/swaps/modules/SolanaDataAccount.d.ts +95 -95
- package/dist/solana/swaps/modules/SolanaDataAccount.js +232 -232
- package/dist/solana/swaps/modules/SolanaLpVault.d.ts +69 -69
- package/dist/solana/swaps/modules/SolanaLpVault.js +171 -171
- package/dist/solana/swaps/modules/SwapClaim.d.ts +126 -126
- package/dist/solana/swaps/modules/SwapClaim.js +294 -294
- package/dist/solana/swaps/modules/SwapInit.d.ts +213 -213
- package/dist/solana/swaps/modules/SwapInit.js +658 -658
- package/dist/solana/swaps/modules/SwapRefund.d.ts +87 -87
- package/dist/solana/swaps/modules/SwapRefund.js +293 -293
- package/dist/solana/swaps/programIdl.json +945 -945
- package/dist/solana/swaps/programTypes.d.ts +943 -943
- package/dist/solana/swaps/programTypes.js +945 -945
- package/dist/solana/swaps/v1/programIdl.json +945 -945
- package/dist/solana/swaps/v1/programTypes.d.ts +943 -943
- package/dist/solana/swaps/v1/programTypes.js +945 -945
- package/dist/solana/swaps/v2/programIdl.json +952 -952
- package/dist/solana/swaps/v2/programTypes.d.ts +950 -950
- package/dist/solana/swaps/v2/programTypes.js +952 -952
- package/dist/solana/wallet/SolanaKeypairWallet.d.ts +29 -29
- package/dist/solana/wallet/SolanaKeypairWallet.js +50 -50
- package/dist/solana/wallet/SolanaSigner.d.ts +30 -30
- package/dist/solana/wallet/SolanaSigner.js +30 -30
- package/dist/utils/Utils.d.ts +58 -58
- package/dist/utils/Utils.js +170 -170
- package/node/index.d.ts +1 -1
- package/node/index.js +3 -3
- package/package.json +46 -46
- package/src/index.ts +87 -87
- package/src/node/index.ts +9 -9
- package/src/solana/SolanaChainType.ts +32 -32
- package/src/solana/SolanaChains.ts +46 -46
- package/src/solana/SolanaInitializer.ts +278 -278
- package/src/solana/btcrelay/SolanaBtcRelay.ts +615 -615
- package/src/solana/btcrelay/headers/SolanaBtcHeader.ts +116 -116
- package/src/solana/btcrelay/headers/SolanaBtcStoredHeader.ts +148 -148
- package/src/solana/btcrelay/program/programIdl.json +670 -670
- package/src/solana/chain/SolanaAction.ts +109 -109
- package/src/solana/chain/SolanaChainInterface.ts +404 -404
- package/src/solana/chain/SolanaModule.ts +20 -20
- package/src/solana/chain/modules/SolanaAddresses.ts +20 -20
- package/src/solana/chain/modules/SolanaBlocks.ts +89 -89
- package/src/solana/chain/modules/SolanaEvents.ts +271 -271
- package/src/solana/chain/modules/SolanaFees.ts +522 -522
- package/src/solana/chain/modules/SolanaSignatures.ts +39 -39
- package/src/solana/chain/modules/SolanaSlots.ts +85 -85
- package/src/solana/chain/modules/SolanaTokens.ts +300 -300
- package/src/solana/chain/modules/SolanaTransactions.ts +503 -503
- package/src/solana/connection/ConnectionWithRetries.ts +113 -96
- package/src/solana/events/SolanaChainEvents.ts +127 -127
- package/src/solana/events/SolanaChainEventsBrowser.ts +495 -495
- package/src/solana/program/SolanaProgramBase.ts +119 -119
- package/src/solana/program/SolanaProgramModule.ts +15 -15
- package/src/solana/program/modules/SolanaProgramEvents.ts +157 -157
- package/src/solana/swaps/SolanaSwapData.ts +735 -735
- package/src/solana/swaps/SolanaSwapModule.ts +19 -19
- package/src/solana/swaps/SolanaSwapProgram.ts +1074 -1074
- package/src/solana/swaps/SwapTypeEnum.ts +30 -30
- package/src/solana/swaps/modules/SolanaDataAccount.ts +302 -302
- package/src/solana/swaps/modules/SolanaLpVault.ts +208 -208
- package/src/solana/swaps/modules/SwapClaim.ts +387 -387
- package/src/solana/swaps/modules/SwapInit.ts +785 -785
- package/src/solana/swaps/modules/SwapRefund.ts +353 -353
- package/src/solana/swaps/v1/programIdl.json +944 -944
- package/src/solana/swaps/v1/programTypes.ts +1885 -1885
- package/src/solana/swaps/v2/programIdl.json +951 -951
- package/src/solana/swaps/v2/programTypes.ts +1899 -1899
- package/src/solana/wallet/SolanaKeypairWallet.ts +56 -56
- package/src/solana/wallet/SolanaSigner.ts +43 -43
- package/src/utils/Utils.ts +194 -194
|
@@ -1,278 +1,278 @@
|
|
|
1
|
-
import {
|
|
2
|
-
BaseTokenType,
|
|
3
|
-
BitcoinNetwork,
|
|
4
|
-
BitcoinRpc,
|
|
5
|
-
ChainData,
|
|
6
|
-
ChainInitializer,
|
|
7
|
-
IStorageManager,
|
|
8
|
-
StorageObject
|
|
9
|
-
} from "@atomiqlabs/base";
|
|
10
|
-
import {Connection} from "@solana/web3.js";
|
|
11
|
-
import {StoredDataAccount} from "./swaps/modules/SolanaDataAccount";
|
|
12
|
-
import {SolanaChainInterface, SolanaRetryPolicy} from "./chain/SolanaChainInterface";
|
|
13
|
-
import {SolanaFees} from "./chain/modules/SolanaFees";
|
|
14
|
-
import {SolanaChainType} from "./SolanaChainType";
|
|
15
|
-
import {SolanaBtcRelay} from "./btcrelay/SolanaBtcRelay";
|
|
16
|
-
import {SolanaChains} from "./SolanaChains";
|
|
17
|
-
import {SolanaSwapProgram} from "./swaps/SolanaSwapProgram";
|
|
18
|
-
import {SolanaChainEventsBrowser} from "./events/SolanaChainEventsBrowser";
|
|
19
|
-
import {SolanaSwapData, SolanaSwapDataV1, SolanaSwapDataV2} from "./swaps/SolanaSwapData";
|
|
20
|
-
|
|
21
|
-
const chainId = "SOLANA" as const;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Token assets available on Solana
|
|
25
|
-
* @category Chain Interface
|
|
26
|
-
*/
|
|
27
|
-
export type SolanaAssetsType = BaseTokenType<"WBTC" | "USDC" | "USDT" | "SOL" | "BONK">;
|
|
28
|
-
const SolanaAssets: SolanaAssetsType = {
|
|
29
|
-
WBTC: {
|
|
30
|
-
address: "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh",
|
|
31
|
-
decimals: 8
|
|
32
|
-
},
|
|
33
|
-
USDC: {
|
|
34
|
-
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
|
|
35
|
-
decimals: 6
|
|
36
|
-
},
|
|
37
|
-
USDT: {
|
|
38
|
-
address: "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
|
|
39
|
-
decimals: 6
|
|
40
|
-
},
|
|
41
|
-
SOL: {
|
|
42
|
-
address: "So11111111111111111111111111111111111111112",
|
|
43
|
-
decimals: 9
|
|
44
|
-
},
|
|
45
|
-
BONK: {
|
|
46
|
-
address: "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
|
|
47
|
-
decimals: 5
|
|
48
|
-
}
|
|
49
|
-
} as const;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Configuration options for initializing Solana chain
|
|
53
|
-
* @category Chain Interface
|
|
54
|
-
*/
|
|
55
|
-
export type SolanaSwapperOptions = {
|
|
56
|
-
/**
|
|
57
|
-
* RPC url or {@link Connection} object to use for Solana network access
|
|
58
|
-
*/
|
|
59
|
-
rpcUrl: string | Connection,
|
|
60
|
-
/**
|
|
61
|
-
* Storage backend to use for storing ephemeral data submission accounts, i.e. accounts that are used
|
|
62
|
-
* to submit large amount of data to an instruction that would otherwise be bigger than the transaction
|
|
63
|
-
* size limit - used for submitting bitcoin transaction proofs for PrTLC swaps
|
|
64
|
-
*/
|
|
65
|
-
dataAccountStorage?: IStorageManager<StoredDataAccount>,
|
|
66
|
-
/**
|
|
67
|
-
* Retry policy to be used for Solana RPC calls and transaction submission
|
|
68
|
-
*/
|
|
69
|
-
retryPolicy?: SolanaRetryPolicy,
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Optional Solana program address of the BTC Relay contract, uses the canonical deployment by default
|
|
73
|
-
*/
|
|
74
|
-
btcRelayContract?: string,
|
|
75
|
-
/**
|
|
76
|
-
* Optional Solana program address of the Swap contract, uses the canonical deployment by default
|
|
77
|
-
*/
|
|
78
|
-
swapContract?: string,
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Solana fee API to use for fetching Solana network fees
|
|
82
|
-
*/
|
|
83
|
-
fees?: SolanaFees
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Initialize Solana chain integration
|
|
88
|
-
*
|
|
89
|
-
* @param version
|
|
90
|
-
* @param options Options for initializing the Solana chain
|
|
91
|
-
* @param bitcoinRpc Bitcoin RPC to use for bitcoin read access
|
|
92
|
-
* @param network Bitcoin network to use - determines Solana program addresses to use by default
|
|
93
|
-
* @param storageCtor Storage constructor used to create storage backend for ephemeral data submission accounts,
|
|
94
|
-
* i.e. accounts that are used to submit large amount of data to an instruction that would otherwise be bigger
|
|
95
|
-
* than the transaction size limit - used for submitting bitcoin transaction proofs for PrTLC swaps
|
|
96
|
-
*
|
|
97
|
-
* @category Chain Interface
|
|
98
|
-
*/
|
|
99
|
-
function _initializeSolana<Version extends "v1" | "v2">(
|
|
100
|
-
version: Version,
|
|
101
|
-
options: SolanaSwapperOptions,
|
|
102
|
-
bitcoinRpc: BitcoinRpc<any>,
|
|
103
|
-
network: BitcoinNetwork,
|
|
104
|
-
storageCtor: <T extends StorageObject>(name: string) => IStorageManager<T>
|
|
105
|
-
): ChainData<SolanaChainType<Version>> {
|
|
106
|
-
const connection = typeof(options.rpcUrl)==="string" ?
|
|
107
|
-
new Connection(options.rpcUrl) :
|
|
108
|
-
options.rpcUrl;
|
|
109
|
-
|
|
110
|
-
const Fees = options.fees ?? new SolanaFees(connection, 200000, 4, 100);
|
|
111
|
-
const chainInterface = new SolanaChainInterface(connection, options.retryPolicy ?? {transactionResendInterval: 1000}, Fees);
|
|
112
|
-
|
|
113
|
-
const versionedContracts: {
|
|
114
|
-
[version in "v1" | "v2"]?: {
|
|
115
|
-
btcRelay: SolanaBtcRelay<any>;
|
|
116
|
-
swapContract: SolanaSwapProgram<Version>;
|
|
117
|
-
swapDataConstructor: new (data: any) => SolanaSwapData;
|
|
118
|
-
spvVaultContract: never;
|
|
119
|
-
spvVaultDataConstructor: never;
|
|
120
|
-
spvVaultWithdrawalDataConstructor: never;
|
|
121
|
-
}
|
|
122
|
-
} = {};
|
|
123
|
-
|
|
124
|
-
if(options.btcRelayContract || options.swapContract) {
|
|
125
|
-
// Initialize only that version
|
|
126
|
-
const btcRelayContractAddress = options.btcRelayContract ?? SolanaChains[network]?.addresses[version]?.btcRelayContract;
|
|
127
|
-
const swapContractAddress = options.swapContract ?? SolanaChains[network]?.addresses[version]?.swapContract;
|
|
128
|
-
if(btcRelayContractAddress==null) throw new Error(`Unsupported bitcoin network for Solana, using default version ${version}: ${BitcoinNetwork[network]}, please pass a custom deployment btc relay program address!`);
|
|
129
|
-
if(swapContractAddress==null) throw new Error(`Unsupported bitcoin network for Solana, using default version ${version}: ${BitcoinNetwork[network]}, please pass a custom deployment swap program address!`);
|
|
130
|
-
|
|
131
|
-
const btcRelay = new SolanaBtcRelay(chainInterface, bitcoinRpc, btcRelayContractAddress);
|
|
132
|
-
const swapContract = new SolanaSwapProgram(
|
|
133
|
-
chainInterface,
|
|
134
|
-
btcRelay,
|
|
135
|
-
options.dataAccountStorage || storageCtor("solAccounts"),
|
|
136
|
-
swapContractAddress,
|
|
137
|
-
network,
|
|
138
|
-
version
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
versionedContracts[version] = {
|
|
142
|
-
btcRelay,
|
|
143
|
-
swapContract: swapContract as SolanaSwapProgram<Version>,
|
|
144
|
-
swapDataConstructor: version==="v1" ? SolanaSwapDataV1 : SolanaSwapDataV2,
|
|
145
|
-
spvVaultContract: null as never,
|
|
146
|
-
spvVaultDataConstructor: null as never,
|
|
147
|
-
spvVaultWithdrawalDataConstructor: null as never
|
|
148
|
-
};
|
|
149
|
-
} else {
|
|
150
|
-
// Initialize all versions
|
|
151
|
-
const solanaChainData = SolanaChains[network];
|
|
152
|
-
if(solanaChainData==null) throw new Error(`Unsupported bitcoin network for Solana: ${BitcoinNetwork[network]}, please pass a custom deployment program addresses!`);
|
|
153
|
-
|
|
154
|
-
for(let _version in solanaChainData.addresses) {
|
|
155
|
-
const version = _version as "v1" | "v2";
|
|
156
|
-
const btcRelay = new SolanaBtcRelay(chainInterface, bitcoinRpc, solanaChainData.addresses[version]!.btcRelayContract);
|
|
157
|
-
const swapContract = new SolanaSwapProgram(
|
|
158
|
-
chainInterface,
|
|
159
|
-
btcRelay,
|
|
160
|
-
options.dataAccountStorage || storageCtor("solAccounts"),
|
|
161
|
-
solanaChainData.addresses[version]!.swapContract,
|
|
162
|
-
network,
|
|
163
|
-
version
|
|
164
|
-
);
|
|
165
|
-
|
|
166
|
-
versionedContracts[version] = {
|
|
167
|
-
btcRelay,
|
|
168
|
-
swapContract: swapContract as SolanaSwapProgram<Version>,
|
|
169
|
-
swapDataConstructor: version==="v1" ? SolanaSwapDataV1 : SolanaSwapDataV2,
|
|
170
|
-
spvVaultContract: null as never,
|
|
171
|
-
spvVaultDataConstructor: null as never,
|
|
172
|
-
spvVaultWithdrawalDataConstructor: null as never
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const chainEvents = new SolanaChainEventsBrowser(connection, versionedContracts);
|
|
178
|
-
|
|
179
|
-
const defaults = versionedContracts[version];
|
|
180
|
-
if(defaults==null) throw new Error(`Unsupported bitcoin network for Solana, using default version ${version}: ${BitcoinNetwork[network]}, please pass a custom deployment program addresses!`);
|
|
181
|
-
|
|
182
|
-
return {
|
|
183
|
-
chainId,
|
|
184
|
-
chainInterface,
|
|
185
|
-
btcRelay: defaults.btcRelay,
|
|
186
|
-
swapContract: defaults.swapContract as SolanaSwapProgram<Version>,
|
|
187
|
-
chainEvents,
|
|
188
|
-
swapDataConstructor: defaults.swapDataConstructor,
|
|
189
|
-
spvVaultContract: defaults.spvVaultContract,
|
|
190
|
-
spvVaultDataConstructor: defaults.spvVaultDataConstructor,
|
|
191
|
-
spvVaultWithdrawalDataConstructor: defaults.spvVaultWithdrawalDataConstructor,
|
|
192
|
-
|
|
193
|
-
defaultVersion: version,
|
|
194
|
-
versions: versionedContracts
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Initialize Solana chain integration using the v1 as the default version of the contracts
|
|
200
|
-
*
|
|
201
|
-
* @param options Options for initializing the Solana chain
|
|
202
|
-
* @param bitcoinRpc Bitcoin RPC to use for bitcoin read access
|
|
203
|
-
* @param network Bitcoin network to use - determines Solana program addresses to use by default
|
|
204
|
-
* @param storageCtor Storage constructor used to create storage backend for ephemeral data submission accounts,
|
|
205
|
-
* i.e. accounts that are used to submit large amount of data to an instruction that would otherwise be bigger
|
|
206
|
-
* than the transaction size limit - used for submitting bitcoin transaction proofs for PrTLC swaps
|
|
207
|
-
*
|
|
208
|
-
* @category Chain Interface
|
|
209
|
-
*/
|
|
210
|
-
export function initializeSolana(
|
|
211
|
-
options: SolanaSwapperOptions,
|
|
212
|
-
bitcoinRpc: BitcoinRpc<any>,
|
|
213
|
-
network: BitcoinNetwork,
|
|
214
|
-
storageCtor: <T extends StorageObject>(name: string) => IStorageManager<T>
|
|
215
|
-
): ChainData<SolanaChainType<"v1">> {
|
|
216
|
-
return _initializeSolana("v1", options, bitcoinRpc, network, storageCtor);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Initialize Solana chain integration using the new v2 version as the default version of the contracts
|
|
221
|
-
*
|
|
222
|
-
* @param options Options for initializing the Solana chain
|
|
223
|
-
* @param bitcoinRpc Bitcoin RPC to use for bitcoin read access
|
|
224
|
-
* @param network Bitcoin network to use - determines Solana program addresses to use by default
|
|
225
|
-
* @param storageCtor Storage constructor used to create storage backend for ephemeral data submission accounts,
|
|
226
|
-
* i.e. accounts that are used to submit large amount of data to an instruction that would otherwise be bigger
|
|
227
|
-
* than the transaction size limit - used for submitting bitcoin transaction proofs for PrTLC swaps
|
|
228
|
-
*
|
|
229
|
-
* @category Chain Interface
|
|
230
|
-
*/
|
|
231
|
-
export function initializeSolanaV2(
|
|
232
|
-
options: SolanaSwapperOptions,
|
|
233
|
-
bitcoinRpc: BitcoinRpc<any>,
|
|
234
|
-
network: BitcoinNetwork,
|
|
235
|
-
storageCtor: <T extends StorageObject>(name: string) => IStorageManager<T>
|
|
236
|
-
): ChainData<SolanaChainType<"v2">> {
|
|
237
|
-
return _initializeSolana("v2", options, bitcoinRpc, network, storageCtor);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Type definition for the Solana chain initializer
|
|
242
|
-
*
|
|
243
|
-
* @category Chain Interface
|
|
244
|
-
*/
|
|
245
|
-
export type SolanaInitializerType<Version extends "v1" | "v2" = "v1"> = ChainInitializer<SolanaSwapperOptions, SolanaChainType<Version>, SolanaAssetsType>;
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Solana chain initializer instance, used in the SwapperFactory constructor in the SDK library
|
|
249
|
-
*
|
|
250
|
-
* Uses the legacy v1 version of the contract as the default exported version, this doesn't support the new
|
|
251
|
-
* v2 lightning network flow, use the {@link SolanaInitializerV2} to initialize the SDK with the v2
|
|
252
|
-
* contracts as the default, which do have an explicit support for new lightning network swap flow
|
|
253
|
-
*
|
|
254
|
-
* @category Chain Interface
|
|
255
|
-
*/
|
|
256
|
-
export const SolanaInitializer: SolanaInitializerType<"v1"> = {
|
|
257
|
-
chainId,
|
|
258
|
-
chainType: null as unknown as SolanaChainType<"v1">,
|
|
259
|
-
initializer: initializeSolana,
|
|
260
|
-
tokens: SolanaAssets,
|
|
261
|
-
options: null as unknown as SolanaSwapperOptions
|
|
262
|
-
} as const;
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Solana chain initializer instance, used in the SwapperFactory constructor in the SDK library
|
|
266
|
-
*
|
|
267
|
-
* Uses the new v2 version of the contracts as default exported version, supported the new lightning network
|
|
268
|
-
* swap flow.
|
|
269
|
-
*
|
|
270
|
-
* @category Chain Interface
|
|
271
|
-
*/
|
|
272
|
-
export const SolanaInitializerV2: SolanaInitializerType<"v2"> = {
|
|
273
|
-
chainId,
|
|
274
|
-
chainType: null as unknown as SolanaChainType<"v2">,
|
|
275
|
-
initializer: initializeSolanaV2,
|
|
276
|
-
tokens: SolanaAssets,
|
|
277
|
-
options: null as unknown as SolanaSwapperOptions
|
|
278
|
-
} as const;
|
|
1
|
+
import {
|
|
2
|
+
BaseTokenType,
|
|
3
|
+
BitcoinNetwork,
|
|
4
|
+
BitcoinRpc,
|
|
5
|
+
ChainData,
|
|
6
|
+
ChainInitializer,
|
|
7
|
+
IStorageManager,
|
|
8
|
+
StorageObject
|
|
9
|
+
} from "@atomiqlabs/base";
|
|
10
|
+
import {Connection} from "@solana/web3.js";
|
|
11
|
+
import {StoredDataAccount} from "./swaps/modules/SolanaDataAccount";
|
|
12
|
+
import {SolanaChainInterface, SolanaRetryPolicy} from "./chain/SolanaChainInterface";
|
|
13
|
+
import {SolanaFees} from "./chain/modules/SolanaFees";
|
|
14
|
+
import {SolanaChainType} from "./SolanaChainType";
|
|
15
|
+
import {SolanaBtcRelay} from "./btcrelay/SolanaBtcRelay";
|
|
16
|
+
import {SolanaChains} from "./SolanaChains";
|
|
17
|
+
import {SolanaSwapProgram} from "./swaps/SolanaSwapProgram";
|
|
18
|
+
import {SolanaChainEventsBrowser} from "./events/SolanaChainEventsBrowser";
|
|
19
|
+
import {SolanaSwapData, SolanaSwapDataV1, SolanaSwapDataV2} from "./swaps/SolanaSwapData";
|
|
20
|
+
|
|
21
|
+
const chainId = "SOLANA" as const;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Token assets available on Solana
|
|
25
|
+
* @category Chain Interface
|
|
26
|
+
*/
|
|
27
|
+
export type SolanaAssetsType = BaseTokenType<"WBTC" | "USDC" | "USDT" | "SOL" | "BONK">;
|
|
28
|
+
const SolanaAssets: SolanaAssetsType = {
|
|
29
|
+
WBTC: {
|
|
30
|
+
address: "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh",
|
|
31
|
+
decimals: 8
|
|
32
|
+
},
|
|
33
|
+
USDC: {
|
|
34
|
+
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
|
|
35
|
+
decimals: 6
|
|
36
|
+
},
|
|
37
|
+
USDT: {
|
|
38
|
+
address: "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
|
|
39
|
+
decimals: 6
|
|
40
|
+
},
|
|
41
|
+
SOL: {
|
|
42
|
+
address: "So11111111111111111111111111111111111111112",
|
|
43
|
+
decimals: 9
|
|
44
|
+
},
|
|
45
|
+
BONK: {
|
|
46
|
+
address: "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
|
|
47
|
+
decimals: 5
|
|
48
|
+
}
|
|
49
|
+
} as const;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Configuration options for initializing Solana chain
|
|
53
|
+
* @category Chain Interface
|
|
54
|
+
*/
|
|
55
|
+
export type SolanaSwapperOptions = {
|
|
56
|
+
/**
|
|
57
|
+
* RPC url or {@link Connection} object to use for Solana network access
|
|
58
|
+
*/
|
|
59
|
+
rpcUrl: string | Connection,
|
|
60
|
+
/**
|
|
61
|
+
* Storage backend to use for storing ephemeral data submission accounts, i.e. accounts that are used
|
|
62
|
+
* to submit large amount of data to an instruction that would otherwise be bigger than the transaction
|
|
63
|
+
* size limit - used for submitting bitcoin transaction proofs for PrTLC swaps
|
|
64
|
+
*/
|
|
65
|
+
dataAccountStorage?: IStorageManager<StoredDataAccount>,
|
|
66
|
+
/**
|
|
67
|
+
* Retry policy to be used for Solana RPC calls and transaction submission
|
|
68
|
+
*/
|
|
69
|
+
retryPolicy?: SolanaRetryPolicy,
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Optional Solana program address of the BTC Relay contract, uses the canonical deployment by default
|
|
73
|
+
*/
|
|
74
|
+
btcRelayContract?: string,
|
|
75
|
+
/**
|
|
76
|
+
* Optional Solana program address of the Swap contract, uses the canonical deployment by default
|
|
77
|
+
*/
|
|
78
|
+
swapContract?: string,
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Solana fee API to use for fetching Solana network fees
|
|
82
|
+
*/
|
|
83
|
+
fees?: SolanaFees
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Initialize Solana chain integration
|
|
88
|
+
*
|
|
89
|
+
* @param version
|
|
90
|
+
* @param options Options for initializing the Solana chain
|
|
91
|
+
* @param bitcoinRpc Bitcoin RPC to use for bitcoin read access
|
|
92
|
+
* @param network Bitcoin network to use - determines Solana program addresses to use by default
|
|
93
|
+
* @param storageCtor Storage constructor used to create storage backend for ephemeral data submission accounts,
|
|
94
|
+
* i.e. accounts that are used to submit large amount of data to an instruction that would otherwise be bigger
|
|
95
|
+
* than the transaction size limit - used for submitting bitcoin transaction proofs for PrTLC swaps
|
|
96
|
+
*
|
|
97
|
+
* @category Chain Interface
|
|
98
|
+
*/
|
|
99
|
+
function _initializeSolana<Version extends "v1" | "v2">(
|
|
100
|
+
version: Version,
|
|
101
|
+
options: SolanaSwapperOptions,
|
|
102
|
+
bitcoinRpc: BitcoinRpc<any>,
|
|
103
|
+
network: BitcoinNetwork,
|
|
104
|
+
storageCtor: <T extends StorageObject>(name: string) => IStorageManager<T>
|
|
105
|
+
): ChainData<SolanaChainType<Version>> {
|
|
106
|
+
const connection = typeof(options.rpcUrl)==="string" ?
|
|
107
|
+
new Connection(options.rpcUrl) :
|
|
108
|
+
options.rpcUrl;
|
|
109
|
+
|
|
110
|
+
const Fees = options.fees ?? new SolanaFees(connection, 200000, 4, 100);
|
|
111
|
+
const chainInterface = new SolanaChainInterface(connection, options.retryPolicy ?? {transactionResendInterval: 1000}, Fees);
|
|
112
|
+
|
|
113
|
+
const versionedContracts: {
|
|
114
|
+
[version in "v1" | "v2"]?: {
|
|
115
|
+
btcRelay: SolanaBtcRelay<any>;
|
|
116
|
+
swapContract: SolanaSwapProgram<Version>;
|
|
117
|
+
swapDataConstructor: new (data: any) => SolanaSwapData;
|
|
118
|
+
spvVaultContract: never;
|
|
119
|
+
spvVaultDataConstructor: never;
|
|
120
|
+
spvVaultWithdrawalDataConstructor: never;
|
|
121
|
+
}
|
|
122
|
+
} = {};
|
|
123
|
+
|
|
124
|
+
if(options.btcRelayContract || options.swapContract) {
|
|
125
|
+
// Initialize only that version
|
|
126
|
+
const btcRelayContractAddress = options.btcRelayContract ?? SolanaChains[network]?.addresses[version]?.btcRelayContract;
|
|
127
|
+
const swapContractAddress = options.swapContract ?? SolanaChains[network]?.addresses[version]?.swapContract;
|
|
128
|
+
if(btcRelayContractAddress==null) throw new Error(`Unsupported bitcoin network for Solana, using default version ${version}: ${BitcoinNetwork[network]}, please pass a custom deployment btc relay program address!`);
|
|
129
|
+
if(swapContractAddress==null) throw new Error(`Unsupported bitcoin network for Solana, using default version ${version}: ${BitcoinNetwork[network]}, please pass a custom deployment swap program address!`);
|
|
130
|
+
|
|
131
|
+
const btcRelay = new SolanaBtcRelay(chainInterface, bitcoinRpc, btcRelayContractAddress);
|
|
132
|
+
const swapContract = new SolanaSwapProgram(
|
|
133
|
+
chainInterface,
|
|
134
|
+
btcRelay,
|
|
135
|
+
options.dataAccountStorage || storageCtor("solAccounts"),
|
|
136
|
+
swapContractAddress,
|
|
137
|
+
network,
|
|
138
|
+
version
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
versionedContracts[version] = {
|
|
142
|
+
btcRelay,
|
|
143
|
+
swapContract: swapContract as SolanaSwapProgram<Version>,
|
|
144
|
+
swapDataConstructor: version==="v1" ? SolanaSwapDataV1 : SolanaSwapDataV2,
|
|
145
|
+
spvVaultContract: null as never,
|
|
146
|
+
spvVaultDataConstructor: null as never,
|
|
147
|
+
spvVaultWithdrawalDataConstructor: null as never
|
|
148
|
+
};
|
|
149
|
+
} else {
|
|
150
|
+
// Initialize all versions
|
|
151
|
+
const solanaChainData = SolanaChains[network];
|
|
152
|
+
if(solanaChainData==null) throw new Error(`Unsupported bitcoin network for Solana: ${BitcoinNetwork[network]}, please pass a custom deployment program addresses!`);
|
|
153
|
+
|
|
154
|
+
for(let _version in solanaChainData.addresses) {
|
|
155
|
+
const version = _version as "v1" | "v2";
|
|
156
|
+
const btcRelay = new SolanaBtcRelay(chainInterface, bitcoinRpc, solanaChainData.addresses[version]!.btcRelayContract);
|
|
157
|
+
const swapContract = new SolanaSwapProgram(
|
|
158
|
+
chainInterface,
|
|
159
|
+
btcRelay,
|
|
160
|
+
options.dataAccountStorage || storageCtor("solAccounts"),
|
|
161
|
+
solanaChainData.addresses[version]!.swapContract,
|
|
162
|
+
network,
|
|
163
|
+
version
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
versionedContracts[version] = {
|
|
167
|
+
btcRelay,
|
|
168
|
+
swapContract: swapContract as SolanaSwapProgram<Version>,
|
|
169
|
+
swapDataConstructor: version==="v1" ? SolanaSwapDataV1 : SolanaSwapDataV2,
|
|
170
|
+
spvVaultContract: null as never,
|
|
171
|
+
spvVaultDataConstructor: null as never,
|
|
172
|
+
spvVaultWithdrawalDataConstructor: null as never
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const chainEvents = new SolanaChainEventsBrowser(connection, versionedContracts);
|
|
178
|
+
|
|
179
|
+
const defaults = versionedContracts[version];
|
|
180
|
+
if(defaults==null) throw new Error(`Unsupported bitcoin network for Solana, using default version ${version}: ${BitcoinNetwork[network]}, please pass a custom deployment program addresses!`);
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
chainId,
|
|
184
|
+
chainInterface,
|
|
185
|
+
btcRelay: defaults.btcRelay,
|
|
186
|
+
swapContract: defaults.swapContract as SolanaSwapProgram<Version>,
|
|
187
|
+
chainEvents,
|
|
188
|
+
swapDataConstructor: defaults.swapDataConstructor,
|
|
189
|
+
spvVaultContract: defaults.spvVaultContract,
|
|
190
|
+
spvVaultDataConstructor: defaults.spvVaultDataConstructor,
|
|
191
|
+
spvVaultWithdrawalDataConstructor: defaults.spvVaultWithdrawalDataConstructor,
|
|
192
|
+
|
|
193
|
+
defaultVersion: version,
|
|
194
|
+
versions: versionedContracts
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Initialize Solana chain integration using the v1 as the default version of the contracts
|
|
200
|
+
*
|
|
201
|
+
* @param options Options for initializing the Solana chain
|
|
202
|
+
* @param bitcoinRpc Bitcoin RPC to use for bitcoin read access
|
|
203
|
+
* @param network Bitcoin network to use - determines Solana program addresses to use by default
|
|
204
|
+
* @param storageCtor Storage constructor used to create storage backend for ephemeral data submission accounts,
|
|
205
|
+
* i.e. accounts that are used to submit large amount of data to an instruction that would otherwise be bigger
|
|
206
|
+
* than the transaction size limit - used for submitting bitcoin transaction proofs for PrTLC swaps
|
|
207
|
+
*
|
|
208
|
+
* @category Chain Interface
|
|
209
|
+
*/
|
|
210
|
+
export function initializeSolana(
|
|
211
|
+
options: SolanaSwapperOptions,
|
|
212
|
+
bitcoinRpc: BitcoinRpc<any>,
|
|
213
|
+
network: BitcoinNetwork,
|
|
214
|
+
storageCtor: <T extends StorageObject>(name: string) => IStorageManager<T>
|
|
215
|
+
): ChainData<SolanaChainType<"v1">> {
|
|
216
|
+
return _initializeSolana("v1", options, bitcoinRpc, network, storageCtor);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Initialize Solana chain integration using the new v2 version as the default version of the contracts
|
|
221
|
+
*
|
|
222
|
+
* @param options Options for initializing the Solana chain
|
|
223
|
+
* @param bitcoinRpc Bitcoin RPC to use for bitcoin read access
|
|
224
|
+
* @param network Bitcoin network to use - determines Solana program addresses to use by default
|
|
225
|
+
* @param storageCtor Storage constructor used to create storage backend for ephemeral data submission accounts,
|
|
226
|
+
* i.e. accounts that are used to submit large amount of data to an instruction that would otherwise be bigger
|
|
227
|
+
* than the transaction size limit - used for submitting bitcoin transaction proofs for PrTLC swaps
|
|
228
|
+
*
|
|
229
|
+
* @category Chain Interface
|
|
230
|
+
*/
|
|
231
|
+
export function initializeSolanaV2(
|
|
232
|
+
options: SolanaSwapperOptions,
|
|
233
|
+
bitcoinRpc: BitcoinRpc<any>,
|
|
234
|
+
network: BitcoinNetwork,
|
|
235
|
+
storageCtor: <T extends StorageObject>(name: string) => IStorageManager<T>
|
|
236
|
+
): ChainData<SolanaChainType<"v2">> {
|
|
237
|
+
return _initializeSolana("v2", options, bitcoinRpc, network, storageCtor);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Type definition for the Solana chain initializer
|
|
242
|
+
*
|
|
243
|
+
* @category Chain Interface
|
|
244
|
+
*/
|
|
245
|
+
export type SolanaInitializerType<Version extends "v1" | "v2" = "v1"> = ChainInitializer<SolanaSwapperOptions, SolanaChainType<Version>, SolanaAssetsType>;
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Solana chain initializer instance, used in the SwapperFactory constructor in the SDK library
|
|
249
|
+
*
|
|
250
|
+
* Uses the legacy v1 version of the contract as the default exported version, this doesn't support the new
|
|
251
|
+
* v2 lightning network flow, use the {@link SolanaInitializerV2} to initialize the SDK with the v2
|
|
252
|
+
* contracts as the default, which do have an explicit support for new lightning network swap flow
|
|
253
|
+
*
|
|
254
|
+
* @category Chain Interface
|
|
255
|
+
*/
|
|
256
|
+
export const SolanaInitializer: SolanaInitializerType<"v1"> = {
|
|
257
|
+
chainId,
|
|
258
|
+
chainType: null as unknown as SolanaChainType<"v1">,
|
|
259
|
+
initializer: initializeSolana,
|
|
260
|
+
tokens: SolanaAssets,
|
|
261
|
+
options: null as unknown as SolanaSwapperOptions
|
|
262
|
+
} as const;
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Solana chain initializer instance, used in the SwapperFactory constructor in the SDK library
|
|
266
|
+
*
|
|
267
|
+
* Uses the new v2 version of the contracts as default exported version, supported the new lightning network
|
|
268
|
+
* swap flow.
|
|
269
|
+
*
|
|
270
|
+
* @category Chain Interface
|
|
271
|
+
*/
|
|
272
|
+
export const SolanaInitializerV2: SolanaInitializerType<"v2"> = {
|
|
273
|
+
chainId,
|
|
274
|
+
chainType: null as unknown as SolanaChainType<"v2">,
|
|
275
|
+
initializer: initializeSolanaV2,
|
|
276
|
+
tokens: SolanaAssets,
|
|
277
|
+
options: null as unknown as SolanaSwapperOptions
|
|
278
|
+
} as const;
|