@atomiqlabs/chain-solana 8.0.2 → 9.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 (83) hide show
  1. package/dist/index.d.ts +11 -11
  2. package/dist/index.js +11 -11
  3. package/dist/solana/SolanaChainType.d.ts +3 -2
  4. package/dist/solana/SolanaInitializer.d.ts +2 -2
  5. package/dist/solana/SolanaInitializer.js +9 -5
  6. package/dist/solana/btcrelay/SolanaBtcRelay.d.ts +4 -4
  7. package/dist/solana/btcrelay/SolanaBtcRelay.js +13 -14
  8. package/dist/solana/{base → chain}/SolanaAction.d.ts +2 -2
  9. package/dist/solana/chain/SolanaChainInterface.d.ts +58 -0
  10. package/dist/solana/chain/SolanaChainInterface.js +112 -0
  11. package/dist/solana/{base → chain}/SolanaModule.d.ts +3 -3
  12. package/dist/solana/chain/modules/SolanaAddresses.d.ts +8 -0
  13. package/dist/solana/{base → chain}/modules/SolanaAddresses.js +2 -3
  14. package/dist/solana/events/SolanaChainEventsBrowser.js +0 -1
  15. package/dist/solana/program/SolanaProgramBase.d.ts +11 -5
  16. package/dist/solana/program/SolanaProgramBase.js +7 -7
  17. package/dist/solana/program/SolanaProgramModule.d.ts +8 -0
  18. package/dist/solana/program/SolanaProgramModule.js +11 -0
  19. package/dist/solana/program/modules/SolanaProgramEvents.d.ts +4 -3
  20. package/dist/solana/program/modules/SolanaProgramEvents.js +8 -8
  21. package/dist/solana/swaps/SolanaSwapData.js +1 -1
  22. package/dist/solana/swaps/SolanaSwapModule.d.ts +6 -5
  23. package/dist/solana/swaps/SolanaSwapModule.js +5 -6
  24. package/dist/solana/swaps/SolanaSwapProgram.d.ts +4 -23
  25. package/dist/solana/swaps/SolanaSwapProgram.js +22 -98
  26. package/dist/solana/swaps/modules/SolanaDataAccount.d.ts +3 -2
  27. package/dist/solana/swaps/modules/SolanaDataAccount.js +9 -9
  28. package/dist/solana/swaps/modules/SolanaLpVault.d.ts +1 -1
  29. package/dist/solana/swaps/modules/SolanaLpVault.js +13 -13
  30. package/dist/solana/swaps/modules/SwapClaim.d.ts +3 -2
  31. package/dist/solana/swaps/modules/SwapClaim.js +15 -15
  32. package/dist/solana/swaps/modules/SwapInit.d.ts +1 -1
  33. package/dist/solana/swaps/modules/SwapInit.js +21 -21
  34. package/dist/solana/swaps/modules/SwapRefund.d.ts +1 -1
  35. package/dist/solana/swaps/modules/SwapRefund.js +17 -17
  36. package/package.json +2 -2
  37. package/src/index.ts +11 -11
  38. package/src/solana/SolanaChainType.ts +7 -2
  39. package/src/solana/SolanaInitializer.ts +13 -9
  40. package/src/solana/btcrelay/SolanaBtcRelay.ts +17 -17
  41. package/src/solana/{base → chain}/SolanaAction.ts +3 -3
  42. package/src/solana/chain/SolanaChainInterface.ts +175 -0
  43. package/src/solana/{base → chain}/SolanaModule.ts +3 -3
  44. package/src/solana/{base → chain}/modules/SolanaAddresses.ts +2 -3
  45. package/src/solana/events/SolanaChainEventsBrowser.ts +0 -1
  46. package/src/solana/program/SolanaProgramBase.ts +13 -10
  47. package/src/solana/program/SolanaProgramModule.ts +16 -0
  48. package/src/solana/program/modules/SolanaProgramEvents.ts +10 -9
  49. package/src/solana/swaps/SolanaSwapData.ts +1 -1
  50. package/src/solana/swaps/SolanaSwapModule.ts +8 -8
  51. package/src/solana/swaps/SolanaSwapProgram.ts +28 -133
  52. package/src/solana/swaps/modules/SolanaDataAccount.ts +11 -10
  53. package/src/solana/swaps/modules/SolanaLpVault.ts +15 -15
  54. package/src/solana/swaps/modules/SwapClaim.ts +17 -16
  55. package/src/solana/swaps/modules/SwapInit.ts +22 -22
  56. package/src/solana/swaps/modules/SwapRefund.ts +18 -18
  57. package/dist/solana/base/SolanaBase.d.ts +0 -36
  58. package/dist/solana/base/SolanaBase.js +0 -30
  59. package/dist/solana/base/modules/SolanaAddresses.d.ts +0 -9
  60. package/src/solana/base/SolanaBase.ts +0 -56
  61. /package/dist/solana/{base → chain}/SolanaAction.js +0 -0
  62. /package/dist/solana/{base → chain}/SolanaModule.js +0 -0
  63. /package/dist/solana/{base → chain}/modules/SolanaBlocks.d.ts +0 -0
  64. /package/dist/solana/{base → chain}/modules/SolanaBlocks.js +0 -0
  65. /package/dist/solana/{base → chain}/modules/SolanaEvents.d.ts +0 -0
  66. /package/dist/solana/{base → chain}/modules/SolanaEvents.js +0 -0
  67. /package/dist/solana/{base → chain}/modules/SolanaFees.d.ts +0 -0
  68. /package/dist/solana/{base → chain}/modules/SolanaFees.js +0 -0
  69. /package/dist/solana/{base → chain}/modules/SolanaSignatures.d.ts +0 -0
  70. /package/dist/solana/{base → chain}/modules/SolanaSignatures.js +0 -0
  71. /package/dist/solana/{base → chain}/modules/SolanaSlots.d.ts +0 -0
  72. /package/dist/solana/{base → chain}/modules/SolanaSlots.js +0 -0
  73. /package/dist/solana/{base → chain}/modules/SolanaTokens.d.ts +0 -0
  74. /package/dist/solana/{base → chain}/modules/SolanaTokens.js +0 -0
  75. /package/dist/solana/{base → chain}/modules/SolanaTransactions.d.ts +0 -0
  76. /package/dist/solana/{base → chain}/modules/SolanaTransactions.js +0 -0
  77. /package/src/solana/{base → chain}/modules/SolanaBlocks.ts +0 -0
  78. /package/src/solana/{base → chain}/modules/SolanaEvents.ts +0 -0
  79. /package/src/solana/{base → chain}/modules/SolanaFees.ts +0 -0
  80. /package/src/solana/{base → chain}/modules/SolanaSignatures.ts +0 -0
  81. /package/src/solana/{base → chain}/modules/SolanaSlots.ts +0 -0
  82. /package/src/solana/{base → chain}/modules/SolanaTokens.ts +0 -0
  83. /package/src/solana/{base → chain}/modules/SolanaTransactions.ts +0 -0
package/dist/index.d.ts CHANGED
@@ -1,17 +1,17 @@
1
1
  export * from "./solana/btcrelay/headers/SolanaBtcHeader";
2
2
  export * from "./solana/btcrelay/headers/SolanaBtcStoredHeader";
3
3
  export * from "./solana/btcrelay/SolanaBtcRelay";
4
- export * from "./solana/base/modules/SolanaAddresses";
5
- export * from "./solana/base/modules/SolanaBlocks";
6
- export * from "./solana/base/modules/SolanaEvents";
7
- export * from "./solana/base/modules/SolanaFees";
8
- export * from "./solana/base/modules/SolanaSignatures";
9
- export * from "./solana/base/modules/SolanaSlots";
10
- export * from "./solana/base/modules/SolanaTokens";
11
- export * from "./solana/base/modules/SolanaTransactions";
12
- export * from "./solana/base/SolanaAction";
13
- export * from "./solana/base/SolanaBase";
14
- export * from "./solana/base/SolanaModule";
4
+ export * from "./solana/chain/modules/SolanaAddresses";
5
+ export * from "./solana/chain/modules/SolanaBlocks";
6
+ export * from "./solana/chain/modules/SolanaEvents";
7
+ export * from "./solana/chain/modules/SolanaFees";
8
+ export * from "./solana/chain/modules/SolanaSignatures";
9
+ export * from "./solana/chain/modules/SolanaSlots";
10
+ export * from "./solana/chain/modules/SolanaTokens";
11
+ export * from "./solana/chain/modules/SolanaTransactions";
12
+ export * from "./solana/chain/SolanaAction";
13
+ export * from "./solana/chain/SolanaChainInterface";
14
+ export * from "./solana/chain/SolanaModule";
15
15
  export * from "./solana/program/modules/SolanaProgramEvents";
16
16
  export * from "./solana/program/SolanaProgramBase";
17
17
  export * from "./solana/swaps/SolanaSwapProgram";
package/dist/index.js CHANGED
@@ -17,17 +17,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./solana/btcrelay/headers/SolanaBtcHeader"), exports);
18
18
  __exportStar(require("./solana/btcrelay/headers/SolanaBtcStoredHeader"), exports);
19
19
  __exportStar(require("./solana/btcrelay/SolanaBtcRelay"), exports);
20
- __exportStar(require("./solana/base/modules/SolanaAddresses"), exports);
21
- __exportStar(require("./solana/base/modules/SolanaBlocks"), exports);
22
- __exportStar(require("./solana/base/modules/SolanaEvents"), exports);
23
- __exportStar(require("./solana/base/modules/SolanaFees"), exports);
24
- __exportStar(require("./solana/base/modules/SolanaSignatures"), exports);
25
- __exportStar(require("./solana/base/modules/SolanaSlots"), exports);
26
- __exportStar(require("./solana/base/modules/SolanaTokens"), exports);
27
- __exportStar(require("./solana/base/modules/SolanaTransactions"), exports);
28
- __exportStar(require("./solana/base/SolanaAction"), exports);
29
- __exportStar(require("./solana/base/SolanaBase"), exports);
30
- __exportStar(require("./solana/base/SolanaModule"), exports);
20
+ __exportStar(require("./solana/chain/modules/SolanaAddresses"), exports);
21
+ __exportStar(require("./solana/chain/modules/SolanaBlocks"), exports);
22
+ __exportStar(require("./solana/chain/modules/SolanaEvents"), exports);
23
+ __exportStar(require("./solana/chain/modules/SolanaFees"), exports);
24
+ __exportStar(require("./solana/chain/modules/SolanaSignatures"), exports);
25
+ __exportStar(require("./solana/chain/modules/SolanaSlots"), exports);
26
+ __exportStar(require("./solana/chain/modules/SolanaTokens"), exports);
27
+ __exportStar(require("./solana/chain/modules/SolanaTransactions"), exports);
28
+ __exportStar(require("./solana/chain/SolanaAction"), exports);
29
+ __exportStar(require("./solana/chain/SolanaChainInterface"), exports);
30
+ __exportStar(require("./solana/chain/SolanaModule"), exports);
31
31
  __exportStar(require("./solana/program/modules/SolanaProgramEvents"), exports);
32
32
  __exportStar(require("./solana/program/SolanaProgramBase"), exports);
33
33
  __exportStar(require("./solana/swaps/SolanaSwapProgram"), exports);
@@ -1,9 +1,10 @@
1
1
  import { ChainType } from "@atomiqlabs/base";
2
- import { SolanaTx } from "./base/modules/SolanaTransactions";
2
+ import { SolanaTx } from "./chain/modules/SolanaTransactions";
3
3
  import { SolanaPreFetchData, SolanaPreFetchVerification } from "./swaps/modules/SwapInit";
4
4
  import { SolanaSigner } from "./wallet/SolanaSigner";
5
5
  import { SolanaSwapProgram } from "./swaps/SolanaSwapProgram";
6
6
  import { SolanaSwapData } from "./swaps/SolanaSwapData";
7
7
  import { SolanaChainEventsBrowser } from "./events/SolanaChainEventsBrowser";
8
8
  import { SolanaBtcRelay } from "./btcrelay/SolanaBtcRelay";
9
- export type SolanaChainType = ChainType<"SOLANA", SolanaPreFetchData, SolanaPreFetchVerification, SolanaTx, SolanaSigner, SolanaSwapData, SolanaSwapProgram, SolanaChainEventsBrowser, SolanaBtcRelay<any>>;
9
+ import { SolanaChainInterface } from "./chain/SolanaChainInterface";
10
+ export type SolanaChainType = ChainType<"SOLANA", SolanaPreFetchData, SolanaPreFetchVerification, SolanaTx, SolanaSigner, SolanaSwapData, SolanaSwapProgram, SolanaChainInterface, SolanaChainEventsBrowser, SolanaBtcRelay<any>, never, never, never>;
@@ -1,8 +1,8 @@
1
1
  import { BaseTokenType, BitcoinNetwork, BitcoinRpc, ChainData, ChainInitializer, IStorageManager, StorageObject } from "@atomiqlabs/base";
2
2
  import { Connection } from "@solana/web3.js";
3
3
  import { StoredDataAccount } from "./swaps/modules/SolanaDataAccount";
4
- import { SolanaRetryPolicy } from "./base/SolanaBase";
5
- import { SolanaFees } from "./base/modules/SolanaFees";
4
+ import { SolanaRetryPolicy } from "./chain/SolanaChainInterface";
5
+ import { SolanaFees } from "./chain/modules/SolanaFees";
6
6
  import { SolanaChainType } from "./SolanaChainType";
7
7
  export type SolanaAssetsType = BaseTokenType<"WBTC" | "USDC" | "USDT" | "SOL" | "BONK">;
8
8
  export type SolanaSwapperOptions = {
@@ -2,7 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SolanaInitializer = exports.initializeSolana = void 0;
4
4
  const web3_js_1 = require("@solana/web3.js");
5
- const SolanaFees_1 = require("./base/modules/SolanaFees");
5
+ const SolanaChainInterface_1 = require("./chain/SolanaChainInterface");
6
+ const SolanaFees_1 = require("./chain/modules/SolanaFees");
6
7
  const SolanaBtcRelay_1 = require("./btcrelay/SolanaBtcRelay");
7
8
  const SolanaChains_1 = require("./SolanaChains");
8
9
  const SolanaSwapProgram_1 = require("./swaps/SolanaSwapProgram");
@@ -36,8 +37,9 @@ function initializeSolana(options, bitcoinRpc, network, storageCtor) {
36
37
  new web3_js_1.Connection(options.rpcUrl) :
37
38
  options.rpcUrl;
38
39
  const Fees = options.fees ?? new SolanaFees_1.SolanaFees(connection, 200000, 4, 100);
39
- const btcRelay = new SolanaBtcRelay_1.SolanaBtcRelay(connection, bitcoinRpc, options.btcRelayContract ?? SolanaChains_1.SolanaChains[network].addresses.btcRelayContract, Fees);
40
- const swapContract = new SolanaSwapProgram_1.SolanaSwapProgram(connection, btcRelay, options.dataAccountStorage || storageCtor("solAccounts"), options.swapContract ?? SolanaChains_1.SolanaChains[network].addresses.swapContract, options.retryPolicy ?? { transactionResendInterval: 1000 }, Fees);
40
+ const chainInterface = new SolanaChainInterface_1.SolanaChainInterface(connection, options.retryPolicy ?? { transactionResendInterval: 1000 }, Fees);
41
+ const btcRelay = new SolanaBtcRelay_1.SolanaBtcRelay(chainInterface, bitcoinRpc, options.btcRelayContract ?? SolanaChains_1.SolanaChains[network].addresses.btcRelayContract);
42
+ const swapContract = new SolanaSwapProgram_1.SolanaSwapProgram(chainInterface, btcRelay, options.dataAccountStorage || storageCtor("solAccounts"), options.swapContract ?? SolanaChains_1.SolanaChains[network].addresses.swapContract);
41
43
  const chainEvents = new SolanaChainEventsBrowser_1.SolanaChainEventsBrowser(connection, swapContract);
42
44
  return {
43
45
  chainId,
@@ -45,8 +47,10 @@ function initializeSolana(options, bitcoinRpc, network, storageCtor) {
45
47
  swapContract,
46
48
  chainEvents,
47
49
  swapDataConstructor: SolanaSwapData_1.SolanaSwapData,
48
- //These are defined here to keep the data from old SolLightning-sdk, not needed for other chains
49
- storagePrefix: "SOLv4-" + network + "-"
50
+ chainInterface,
51
+ spvVaultContract: null,
52
+ spvVaultDataConstructor: null,
53
+ spvVaultWithdrawalDataConstructor: null
50
54
  };
51
55
  }
52
56
  exports.initializeSolana = initializeSolana;
@@ -1,12 +1,12 @@
1
1
  /// <reference types="node" />
2
- import { Connection, PublicKey, Signer, Transaction } from "@solana/web3.js";
2
+ import { PublicKey, Signer, Transaction } from "@solana/web3.js";
3
3
  import { SolanaBtcStoredHeader } from "./headers/SolanaBtcStoredHeader";
4
4
  import { BitcoinRpc, BtcBlock, BtcRelay } from "@atomiqlabs/base";
5
5
  import { SolanaProgramBase } from "../program/SolanaProgramBase";
6
- import { SolanaAction } from "../base/SolanaAction";
6
+ import { SolanaAction } from "../chain/SolanaAction";
7
7
  import { Buffer } from "buffer";
8
- import { SolanaFees } from "../base/modules/SolanaFees";
9
8
  import { SolanaSigner } from "../wallet/SolanaSigner";
9
+ import { SolanaChainInterface } from "../chain/SolanaChainInterface";
10
10
  export declare class SolanaBtcRelay<B extends BtcBlock> extends SolanaProgramBase<any> implements BtcRelay<SolanaBtcStoredHeader, {
11
11
  tx: Transaction;
12
12
  signers: Signer[];
@@ -43,7 +43,7 @@ export declare class SolanaBtcRelay<B extends BtcBlock> extends SolanaProgramBas
43
43
  readonly maxHeadersPerTx: number;
44
44
  readonly maxForkHeadersPerTx: number;
45
45
  readonly maxShortForkHeadersPerTx: number;
46
- constructor(connection: Connection, bitcoinRpc: BitcoinRpc<B>, programAddress?: string, solanaFeeEstimator?: SolanaFees);
46
+ constructor(chainInterface: SolanaChainInterface, bitcoinRpc: BitcoinRpc<B>, programAddress?: string);
47
47
  /**
48
48
  * Gets set of block commitments representing current main chain from the mainState
49
49
  *
@@ -7,9 +7,8 @@ const SolanaBtcHeader_1 = require("./headers/SolanaBtcHeader");
7
7
  const programIdl = require("./program/programIdl.json");
8
8
  const base_1 = require("@atomiqlabs/base");
9
9
  const SolanaProgramBase_1 = require("../program/SolanaProgramBase");
10
- const SolanaAction_1 = require("../base/SolanaAction");
10
+ const SolanaAction_1 = require("../chain/SolanaAction");
11
11
  const buffer_1 = require("buffer");
12
- const SolanaFees_1 = require("../base/modules/SolanaFees");
13
12
  const BN = require("bn.js");
14
13
  const MAX_CLOSE_IX_PER_TX = 10;
15
14
  function serializeBlockHeader(e) {
@@ -37,7 +36,7 @@ class SolanaBtcRelay extends SolanaProgramBase_1.SolanaProgramBase {
37
36
  */
38
37
  async Initialize(signer, header, epochStart, pastBlocksTimestamps) {
39
38
  const serializedBlock = serializeBlockHeader(header);
40
- return new SolanaAction_1.SolanaAction(signer, this, await this.program.methods
39
+ return new SolanaAction_1.SolanaAction(signer, this.Chain, await this.program.methods
41
40
  .initialize(serializedBlock, header.getHeight(), header.getChainWork(), epochStart, pastBlocksTimestamps)
42
41
  .accounts({
43
42
  signer,
@@ -60,7 +59,7 @@ class SolanaBtcRelay extends SolanaProgramBase_1.SolanaProgramBase {
60
59
  * @param committedHeader
61
60
  */
62
61
  async Verify(signer, reversedTxId, confirmations, position, reversedMerkleProof, committedHeader) {
63
- return new SolanaAction_1.SolanaAction(signer, this, await this.program.methods
62
+ return new SolanaAction_1.SolanaAction(signer, this.Chain, await this.program.methods
64
63
  .verifyTransaction(reversedTxId, confirmations, position, reversedMerkleProof, committedHeader)
65
64
  .accounts({
66
65
  signer,
@@ -69,7 +68,7 @@ class SolanaBtcRelay extends SolanaProgramBase_1.SolanaProgramBase {
69
68
  .instruction(), null, null, null, true);
70
69
  }
71
70
  async CloseForkAccount(signer, forkId) {
72
- return new SolanaAction_1.SolanaAction(signer, this, await this.program.methods
71
+ return new SolanaAction_1.SolanaAction(signer, this.Chain, await this.program.methods
73
72
  .closeForkAccount(new BN(forkId))
74
73
  .accounts({
75
74
  signer,
@@ -78,8 +77,8 @@ class SolanaBtcRelay extends SolanaProgramBase_1.SolanaProgramBase {
78
77
  })
79
78
  .instruction(), 20000);
80
79
  }
81
- constructor(connection, bitcoinRpc, programAddress, solanaFeeEstimator = new SolanaFees_1.SolanaFees(connection)) {
82
- super(connection, programIdl, programAddress, null, solanaFeeEstimator);
80
+ constructor(chainInterface, bitcoinRpc, programAddress) {
81
+ super(chainInterface, programIdl, programAddress);
83
82
  this.BtcRelayMainState = this.pda("state");
84
83
  this.BtcRelayHeader = this.pda("header", (hash) => [hash]);
85
84
  this.BtcRelayFork = this.pda("fork", (forkId, pubkey) => [new BN(forkId).toArrayLike(buffer_1.Buffer, "le", 8), pubkey.toBuffer()]);
@@ -140,8 +139,8 @@ class SolanaBtcRelay extends SolanaProgramBase_1.SolanaProgramBase {
140
139
  }))
141
140
  .transaction();
142
141
  tx.feePayer = signer;
143
- this.Fees.applyFeeRateBegin(tx, null, feeRate);
144
- this.Fees.applyFeeRateEnd(tx, null, feeRate);
142
+ this.Chain.Fees.applyFeeRateBegin(tx, null, feeRate);
143
+ this.Chain.Fees.applyFeeRateEnd(tx, null, feeRate);
145
144
  const computedCommitedHeaders = this.computeCommitedHeaders(storedHeader, blockHeaderObj);
146
145
  const lastStoredHeader = computedCommitedHeaders[computedCommitedHeaders.length - 1];
147
146
  if (forkId !== 0 && base_1.StatePredictorUtils.gtBuffer(buffer_1.Buffer.from(lastStoredHeader.chainWork), tipWork)) {
@@ -366,7 +365,7 @@ class SolanaBtcRelay extends SolanaProgramBase_1.SolanaProgramBase {
366
365
  const mainState = await this.program.account.mainState.fetch(this.BtcRelayMainState);
367
366
  let forkId = mainState.forkCounter.toNumber();
368
367
  const txs = [];
369
- let action = new SolanaAction_1.SolanaAction(signer.getPublicKey(), this);
368
+ let action = new SolanaAction_1.SolanaAction(signer.getPublicKey(), this.Chain);
370
369
  let lastCheckedId = lastSweepId;
371
370
  for (let i = lastSweepId == null ? 0 : lastSweepId + 1; i <= forkId; i++) {
372
371
  lastCheckedId = i;
@@ -378,14 +377,14 @@ class SolanaBtcRelay extends SolanaProgramBase_1.SolanaProgramBase {
378
377
  action.add(await this.CloseForkAccount(signer.getPublicKey(), i));
379
378
  if (action.ixsLength() >= MAX_CLOSE_IX_PER_TX) {
380
379
  await action.addToTxs(txs);
381
- action = new SolanaAction_1.SolanaAction(signer.getPublicKey(), this);
380
+ action = new SolanaAction_1.SolanaAction(signer.getPublicKey(), this.Chain);
382
381
  }
383
382
  }
384
383
  if (action.ixsLength() >= MAX_CLOSE_IX_PER_TX) {
385
384
  await action.addToTxs(txs);
386
385
  }
387
386
  if (txs.length > 0) {
388
- const signatures = await this.Transactions.sendAndConfirm(signer, txs, true);
387
+ const signatures = await this.Chain.sendAndConfirm(signer, txs, true);
389
388
  this.logger.info("sweepForkData(): forks swept, signatures: " + signatures.join());
390
389
  }
391
390
  return lastCheckedId;
@@ -422,7 +421,7 @@ class SolanaBtcRelay extends SolanaProgramBase_1.SolanaProgramBase {
422
421
  */
423
422
  getMainFeeRate(signer) {
424
423
  const _signer = signer == null ? null : new web3_js_1.PublicKey(signer);
425
- return this.Fees.getFeeRate(_signer == null ? [this.BtcRelayMainState] : [
424
+ return this.Chain.Fees.getFeeRate(_signer == null ? [this.BtcRelayMainState] : [
426
425
  _signer,
427
426
  this.BtcRelayMainState
428
427
  ]);
@@ -432,7 +431,7 @@ class SolanaBtcRelay extends SolanaProgramBase_1.SolanaProgramBase {
432
431
  */
433
432
  getForkFeeRate(signer, forkId) {
434
433
  const _signer = new web3_js_1.PublicKey(signer);
435
- return this.Fees.getFeeRate([
434
+ return this.Chain.Fees.getFeeRate([
436
435
  _signer,
437
436
  this.BtcRelayMainState,
438
437
  this.BtcRelayFork(forkId, _signer)
@@ -1,6 +1,6 @@
1
1
  import { PublicKey, Signer, TransactionInstruction } from "@solana/web3.js";
2
2
  import { SolanaTx } from "./modules/SolanaTransactions";
3
- import { SolanaBase } from "./SolanaBase";
3
+ import { SolanaChainInterface } from "./SolanaChainInterface";
4
4
  export declare class SolanaAction {
5
5
  computeBudget: number;
6
6
  readonly mainSigner: PublicKey;
@@ -9,7 +9,7 @@ export declare class SolanaAction {
9
9
  private feeRate;
10
10
  private readonly signers;
11
11
  private firstIxBeforeComputeBudget;
12
- constructor(mainSigner: PublicKey, root: SolanaBase, instructions?: TransactionInstruction[] | TransactionInstruction, computeBudget?: number, feeRate?: string, signers?: Signer[], firstIxBeforeComputeBudget?: boolean);
12
+ constructor(mainSigner: PublicKey, root: SolanaChainInterface, instructions?: TransactionInstruction[] | TransactionInstruction, computeBudget?: number, feeRate?: string, signers?: Signer[], firstIxBeforeComputeBudget?: boolean);
13
13
  private estimateFee;
14
14
  addIx(instruction: TransactionInstruction, computeBudget?: number, signers?: Signer[]): void;
15
15
  add(action: SolanaAction): this;
@@ -0,0 +1,58 @@
1
+ /// <reference types="node" />
2
+ import { Connection, SendOptions } from "@solana/web3.js";
3
+ import { SolanaFees } from "./modules/SolanaFees";
4
+ import { SolanaBlocks } from "./modules/SolanaBlocks";
5
+ import { SolanaSlots } from "./modules/SolanaSlots";
6
+ import { SolanaTokens } from "./modules/SolanaTokens";
7
+ import { SolanaTransactions, SolanaTx } from "./modules/SolanaTransactions";
8
+ import { SolanaSignatures } from "./modules/SolanaSignatures";
9
+ import { SolanaEvents } from "./modules/SolanaEvents";
10
+ import { ChainInterface, TransactionConfirmationOptions } from "@atomiqlabs/base";
11
+ import { SolanaSigner } from "../wallet/SolanaSigner";
12
+ import { Buffer } from "buffer";
13
+ export type SolanaRetryPolicy = {
14
+ maxRetries?: number;
15
+ delay?: number;
16
+ exponential?: boolean;
17
+ transactionResendInterval?: number;
18
+ };
19
+ export declare class SolanaChainInterface implements ChainInterface<SolanaTx, SolanaSigner, "SOLANA"> {
20
+ readonly chainId = "SOLANA";
21
+ readonly SLOT_TIME = 400;
22
+ readonly TX_SLOT_VALIDITY = 151;
23
+ readonly connection: Connection;
24
+ readonly retryPolicy: SolanaRetryPolicy;
25
+ readonly Blocks: SolanaBlocks;
26
+ Fees: SolanaFees;
27
+ readonly Slots: SolanaSlots;
28
+ readonly Tokens: SolanaTokens;
29
+ readonly Transactions: SolanaTransactions;
30
+ readonly Signatures: SolanaSignatures;
31
+ readonly Events: SolanaEvents;
32
+ protected readonly logger: {
33
+ debug: (msg: any, ...args: any[]) => void;
34
+ info: (msg: any, ...args: any[]) => void;
35
+ warn: (msg: any, ...args: any[]) => void;
36
+ error: (msg: any, ...args: any[]) => void;
37
+ };
38
+ constructor(connection: Connection, retryPolicy?: SolanaRetryPolicy, solanaFeeEstimator?: SolanaFees);
39
+ getBalance(signer: string, tokenAddress: string): Promise<bigint>;
40
+ isValidAddress(address: string): boolean;
41
+ getNativeCurrencyAddress(): string;
42
+ txsTransfer(signer: string, token: string, amount: bigint, dstAddress: string, feeRate?: string): Promise<SolanaTx[]>;
43
+ transfer(signer: SolanaSigner, token: string, amount: bigint, dstAddress: string, txOptions?: TransactionConfirmationOptions): Promise<string>;
44
+ sendAndConfirm(signer: SolanaSigner, txs: SolanaTx[], waitForConfirmation?: boolean, abortSignal?: AbortSignal, parallel?: boolean, onBeforePublish?: (txId: string, rawTx: string) => Promise<void>): Promise<string[]>;
45
+ serializeTx(tx: SolanaTx): Promise<string>;
46
+ deserializeTx(txData: string): Promise<SolanaTx>;
47
+ getTxIdStatus(txId: string): Promise<"not_found" | "pending" | "success" | "reverted">;
48
+ getTxStatus(tx: string): Promise<"not_found" | "pending" | "success" | "reverted">;
49
+ offBeforeTxReplace(callback: (oldTx: string, oldTxId: string, newTx: string, newTxId: string) => Promise<void>): boolean;
50
+ onBeforeTxReplace(callback: (oldTx: string, oldTxId: string, newTx: string, newTxId: string) => Promise<void>): void;
51
+ onBeforeTxSigned(callback: (tx: SolanaTx) => Promise<void>): void;
52
+ offBeforeTxSigned(callback: (tx: SolanaTx) => Promise<void>): boolean;
53
+ onSendTransaction(callback: (tx: Buffer, options?: SendOptions) => Promise<string>): void;
54
+ offSendTransaction(callback: (tx: Buffer, options?: SendOptions) => Promise<string>): boolean;
55
+ isValidToken(tokenIdentifier: string): boolean;
56
+ randomAddress(): string;
57
+ randomSigner(): SolanaSigner;
58
+ }
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SolanaChainInterface = void 0;
4
+ const web3_js_1 = require("@solana/web3.js");
5
+ const SolanaFees_1 = require("./modules/SolanaFees");
6
+ const SolanaBlocks_1 = require("./modules/SolanaBlocks");
7
+ const SolanaSlots_1 = require("./modules/SolanaSlots");
8
+ const SolanaTokens_1 = require("./modules/SolanaTokens");
9
+ const SolanaTransactions_1 = require("./modules/SolanaTransactions");
10
+ const SolanaSignatures_1 = require("./modules/SolanaSignatures");
11
+ const SolanaEvents_1 = require("./modules/SolanaEvents");
12
+ const Utils_1 = require("../../utils/Utils");
13
+ const SolanaAddresses_1 = require("./modules/SolanaAddresses");
14
+ const SolanaSigner_1 = require("../wallet/SolanaSigner");
15
+ const SolanaKeypairWallet_1 = require("../wallet/SolanaKeypairWallet");
16
+ class SolanaChainInterface {
17
+ constructor(connection, retryPolicy, solanaFeeEstimator = new SolanaFees_1.SolanaFees(connection)) {
18
+ this.chainId = "SOLANA";
19
+ this.SLOT_TIME = 400;
20
+ this.TX_SLOT_VALIDITY = 151;
21
+ this.logger = (0, Utils_1.getLogger)(this.constructor.name + ": ");
22
+ this.connection = connection;
23
+ this.retryPolicy = retryPolicy;
24
+ this.Blocks = new SolanaBlocks_1.SolanaBlocks(this);
25
+ this.Fees = solanaFeeEstimator;
26
+ this.Slots = new SolanaSlots_1.SolanaSlots(this);
27
+ this.Tokens = new SolanaTokens_1.SolanaTokens(this);
28
+ this.Transactions = new SolanaTransactions_1.SolanaTransactions(this);
29
+ this.Signatures = new SolanaSignatures_1.SolanaSignatures(this);
30
+ this.Events = new SolanaEvents_1.SolanaEvents(this);
31
+ }
32
+ async getBalance(signer, tokenAddress) {
33
+ const token = new web3_js_1.PublicKey(tokenAddress);
34
+ const publicKey = new web3_js_1.PublicKey(signer);
35
+ let { balance } = await this.Tokens.getTokenBalance(publicKey, token);
36
+ if (token.equals(SolanaTokens_1.SolanaTokens.WSOL_ADDRESS)) {
37
+ const accountRentExemptCost = 1000000n;
38
+ balance = balance - accountRentExemptCost;
39
+ if (balance < 0n)
40
+ balance = 0n;
41
+ }
42
+ this.logger.debug("getBalance(): token balance, token: " + token.toBase58() + " balance: " + balance.toString(10));
43
+ return balance;
44
+ }
45
+ isValidAddress(address) {
46
+ return SolanaAddresses_1.SolanaAddresses.isValidAddress(address);
47
+ }
48
+ getNativeCurrencyAddress() {
49
+ return this.Tokens.getNativeCurrencyAddress().toString();
50
+ }
51
+ txsTransfer(signer, token, amount, dstAddress, feeRate) {
52
+ return this.Tokens.txsTransfer(new web3_js_1.PublicKey(signer), new web3_js_1.PublicKey(token), amount, new web3_js_1.PublicKey(dstAddress), feeRate);
53
+ }
54
+ async transfer(signer, token, amount, dstAddress, txOptions) {
55
+ const txs = await this.Tokens.txsTransfer(signer.getPublicKey(), new web3_js_1.PublicKey(token), amount, new web3_js_1.PublicKey(dstAddress), txOptions?.feeRate);
56
+ const [txId] = await this.Transactions.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal, false);
57
+ return txId;
58
+ }
59
+ ////////////////////////////////////////////
60
+ //// Transactions
61
+ sendAndConfirm(signer, txs, waitForConfirmation, abortSignal, parallel, onBeforePublish) {
62
+ return this.Transactions.sendAndConfirm(signer, txs, waitForConfirmation, abortSignal, parallel, onBeforePublish);
63
+ }
64
+ serializeTx(tx) {
65
+ return this.Transactions.serializeTx(tx);
66
+ }
67
+ deserializeTx(txData) {
68
+ return this.Transactions.deserializeTx(txData);
69
+ }
70
+ getTxIdStatus(txId) {
71
+ return this.Transactions.getTxIdStatus(txId);
72
+ }
73
+ getTxStatus(tx) {
74
+ return this.Transactions.getTxStatus(tx);
75
+ }
76
+ ///////////////////////////////////
77
+ //// Callbacks & handlers
78
+ offBeforeTxReplace(callback) {
79
+ return true;
80
+ }
81
+ onBeforeTxReplace(callback) { }
82
+ onBeforeTxSigned(callback) {
83
+ this.Transactions.onBeforeTxSigned(callback);
84
+ }
85
+ offBeforeTxSigned(callback) {
86
+ return this.Transactions.offBeforeTxSigned(callback);
87
+ }
88
+ onSendTransaction(callback) {
89
+ this.Transactions.onSendTransaction(callback);
90
+ }
91
+ offSendTransaction(callback) {
92
+ return this.Transactions.offSendTransaction(callback);
93
+ }
94
+ isValidToken(tokenIdentifier) {
95
+ try {
96
+ new web3_js_1.PublicKey(tokenIdentifier);
97
+ return true;
98
+ }
99
+ catch (e) {
100
+ return false;
101
+ }
102
+ }
103
+ randomAddress() {
104
+ return web3_js_1.Keypair.generate().publicKey.toString();
105
+ }
106
+ randomSigner() {
107
+ const keypair = web3_js_1.Keypair.generate();
108
+ const wallet = new SolanaKeypairWallet_1.SolanaKeypairWallet(keypair);
109
+ return new SolanaSigner_1.SolanaSigner(wallet, keypair);
110
+ }
111
+ }
112
+ exports.SolanaChainInterface = SolanaChainInterface;
@@ -1,14 +1,14 @@
1
1
  import { Connection } from "@solana/web3.js";
2
- import { SolanaBase, SolanaRetryPolicy } from "./SolanaBase";
2
+ import { SolanaChainInterface, SolanaRetryPolicy } from "./SolanaChainInterface";
3
3
  export declare class SolanaModule {
4
4
  protected readonly connection: Connection;
5
5
  protected readonly retryPolicy: SolanaRetryPolicy;
6
- protected readonly root: SolanaBase;
6
+ protected readonly root: SolanaChainInterface;
7
7
  protected readonly logger: {
8
8
  debug: (msg: any, ...args: any[]) => void;
9
9
  info: (msg: any, ...args: any[]) => void;
10
10
  warn: (msg: any, ...args: any[]) => void;
11
11
  error: (msg: any, ...args: any[]) => void;
12
12
  };
13
- constructor(root: SolanaBase);
13
+ constructor(root: SolanaChainInterface);
14
14
  }
@@ -0,0 +1,8 @@
1
+ export declare class SolanaAddresses {
2
+ /**
3
+ * Checks whether an address is a valid Solana address (base58 encoded ed25519 public key)
4
+ *
5
+ * @param address
6
+ */
7
+ static isValidAddress(address: string): boolean;
8
+ }
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SolanaAddresses = void 0;
4
- const SolanaModule_1 = require("../SolanaModule");
5
4
  const web3_js_1 = require("@solana/web3.js");
6
- class SolanaAddresses extends SolanaModule_1.SolanaModule {
5
+ class SolanaAddresses {
7
6
  ///////////////////
8
7
  //// Address utils
9
8
  /**
@@ -11,7 +10,7 @@ class SolanaAddresses extends SolanaModule_1.SolanaModule {
11
10
  *
12
11
  * @param address
13
12
  */
14
- isValidAddress(address) {
13
+ static isValidAddress(address) {
15
14
  try {
16
15
  return web3_js_1.PublicKey.isOnCurve(address);
17
16
  }
@@ -127,7 +127,6 @@ class SolanaChainEventsBrowser {
127
127
  break;
128
128
  }
129
129
  parsedEvent.meta = {
130
- blockTime: eventObject.blockTime,
131
130
  timestamp: eventObject.blockTime,
132
131
  txId: eventObject.signature
133
132
  };
@@ -1,17 +1,23 @@
1
1
  /// <reference types="node" />
2
2
  import { Idl, Program } from "@coral-xyz/anchor";
3
- import { SolanaFees } from "../base/modules/SolanaFees";
4
- import { SolanaBase, SolanaRetryPolicy } from "../base/SolanaBase";
3
+ import { SolanaChainInterface } from "../chain/SolanaChainInterface";
5
4
  import { SolanaProgramEvents } from "./modules/SolanaProgramEvents";
6
- import { Connection, Keypair, PublicKey } from "@solana/web3.js";
5
+ import { Keypair, PublicKey } from "@solana/web3.js";
7
6
  import { Buffer } from "buffer";
8
7
  /**
9
8
  * Base class providing program specific utilities
10
9
  */
11
- export declare class SolanaProgramBase<T extends Idl> extends SolanaBase {
10
+ export declare class SolanaProgramBase<T extends Idl> {
11
+ protected readonly logger: {
12
+ debug: (msg: any, ...args: any[]) => void;
13
+ info: (msg: any, ...args: any[]) => void;
14
+ warn: (msg: any, ...args: any[]) => void;
15
+ error: (msg: any, ...args: any[]) => void;
16
+ };
12
17
  program: Program<T>;
13
18
  readonly Events: SolanaProgramEvents<T>;
14
- constructor(connection: Connection, programIdl: any, programAddress?: string, retryPolicy?: SolanaRetryPolicy, solanaFeeEstimator?: SolanaFees);
19
+ readonly Chain: SolanaChainInterface;
20
+ constructor(chainInterface: SolanaChainInterface, programIdl: any, programAddress?: string);
15
21
  /**
16
22
  * Derives static PDA address from the seed
17
23
  *
@@ -2,21 +2,21 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SolanaProgramBase = void 0;
4
4
  const anchor_1 = require("@coral-xyz/anchor");
5
- const SolanaFees_1 = require("../base/modules/SolanaFees");
6
- const SolanaBase_1 = require("../base/SolanaBase");
7
5
  const SolanaProgramEvents_1 = require("./modules/SolanaProgramEvents");
8
6
  const web3_js_1 = require("@solana/web3.js");
9
7
  const sha2_1 = require("@noble/hashes/sha2");
10
8
  const buffer_1 = require("buffer");
11
9
  const SolanaKeypairWallet_1 = require("../wallet/SolanaKeypairWallet");
10
+ const Utils_1 = require("../../utils/Utils");
12
11
  /**
13
12
  * Base class providing program specific utilities
14
13
  */
15
- class SolanaProgramBase extends SolanaBase_1.SolanaBase {
16
- constructor(connection, programIdl, programAddress, retryPolicy, solanaFeeEstimator = new SolanaFees_1.SolanaFees(connection)) {
17
- super(connection, retryPolicy, solanaFeeEstimator);
18
- this.program = new anchor_1.Program(programIdl, programAddress || programIdl.metadata.address, new anchor_1.AnchorProvider(connection, new SolanaKeypairWallet_1.SolanaKeypairWallet(web3_js_1.Keypair.generate()), {}));
19
- this.Events = new SolanaProgramEvents_1.SolanaProgramEvents(this);
14
+ class SolanaProgramBase {
15
+ constructor(chainInterface, programIdl, programAddress) {
16
+ this.logger = (0, Utils_1.getLogger)(this.constructor.name + ": ");
17
+ this.Chain = chainInterface;
18
+ this.program = new anchor_1.Program(programIdl, programAddress || programIdl.metadata.address, new anchor_1.AnchorProvider(chainInterface.connection, new SolanaKeypairWallet_1.SolanaKeypairWallet(web3_js_1.Keypair.generate()), {}));
19
+ this.Events = new SolanaProgramEvents_1.SolanaProgramEvents(chainInterface, this);
20
20
  }
21
21
  pda(seed, func) {
22
22
  if (func == null) {
@@ -0,0 +1,8 @@
1
+ import { SolanaModule } from "../chain/SolanaModule";
2
+ import { Idl } from "@coral-xyz/anchor";
3
+ import { SolanaProgramBase } from "./SolanaProgramBase";
4
+ import { SolanaChainInterface } from "../chain/SolanaChainInterface";
5
+ export declare class SolanaProgramModule<IDL extends Idl> extends SolanaModule {
6
+ protected readonly program: SolanaProgramBase<IDL>;
7
+ constructor(chainInterface: SolanaChainInterface, program: SolanaProgramBase<IDL>);
8
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SolanaProgramModule = void 0;
4
+ const SolanaModule_1 = require("../chain/SolanaModule");
5
+ class SolanaProgramModule extends SolanaModule_1.SolanaModule {
6
+ constructor(chainInterface, program) {
7
+ super(chainInterface);
8
+ this.program = program;
9
+ }
10
+ }
11
+ exports.SolanaProgramModule = SolanaProgramModule;
@@ -1,8 +1,9 @@
1
- import { SolanaEvents } from "../../base/modules/SolanaEvents";
1
+ import { SolanaEvents } from "../../chain/modules/SolanaEvents";
2
2
  import { DecodeType, Event, Idl, IdlTypes } from "@coral-xyz/anchor";
3
3
  import { IdlField, IdlInstruction } from "@coral-xyz/anchor/dist/cjs/idl";
4
4
  import { ParsedMessage, PublicKey } from "@solana/web3.js";
5
5
  import { SolanaProgramBase } from "../SolanaProgramBase";
6
+ import { SolanaChainInterface } from "../../chain/SolanaChainInterface";
6
7
  type DecodedFieldOrNull<D, Defined> = D extends IdlField ? DecodeType<D["type"], Defined> : unknown;
7
8
  type ArgsTuple<A extends IdlField[], Defined> = {
8
9
  [K in A[number]["name"]]: DecodedFieldOrNull<Extract<A[number], {
@@ -21,9 +22,9 @@ export type ProgramEvent<IDL extends Idl> = Event<IDL["events"][number], Record<
21
22
  export declare class SolanaProgramEvents<IDL extends Idl> extends SolanaEvents {
22
23
  private readonly programCoder;
23
24
  private readonly eventParser;
24
- readonly root: SolanaProgramBase<any>;
25
+ private readonly program;
25
26
  private readonly nameMappedInstructions;
26
- constructor(root: SolanaProgramBase<IDL>);
27
+ constructor(chain: SolanaChainInterface, program: SolanaProgramBase<IDL>);
27
28
  /**
28
29
  * Gets events from specific transaction as specified by signature, events are ordered from newest to oldest
29
30
  *