@cityofzion/bs-solana 2.0.2 → 2.0.4

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.
@@ -1,36 +1,35 @@
1
- import { Account, BlockchainDataService, BlockchainService, BSCalculableFee, BSWithExplorerService, BSWithLedger, BSWithNameService, BSWithNft, ExchangeDataService, ExplorerService, GetLedgerTransport, ITokenService, Network, NftDataService, Token, TransferParam } from '@cityofzion/blockchain-service';
2
- import { BSSolanaNetworkId } from './constants/BSSolanaConstants';
1
+ import { TBSAccount, TGetLedgerTransport, IBlockchainDataService, IExchangeDataService, IExplorerService, INftDataService, ITokenService, TBSNetwork, TBSToken, TTransferParam, TPingNetworkResponse } from '@cityofzion/blockchain-service';
3
2
  import { Web3LedgerServiceSolana } from './services/ledger/Web3LedgerServiceSolana';
4
- type BSSolanaApiKeys = {
5
- moralisApiKey: string;
6
- tatumMainnetApiKey: string;
7
- tatumTestnetApiKey: string;
8
- };
9
- export declare class BSSolana<BSName extends string = string> implements BlockchainService<BSName, any>, BSCalculableFee<BSName>, BSWithNameService, BSWithLedger<BSName>, BSWithNft, BSWithExplorerService {
3
+ import { IBSSolana, TBSSolanaNetworkId } from './types';
4
+ export declare class BSSolana<N extends string = string> implements IBSSolana<N> {
10
5
  #private;
11
- name: BSName;
12
- bip44DerivationPath: string;
13
- feeToken: Token;
14
- tokens: Token[];
15
- nativeTokens: Token[];
16
- network: Network<BSSolanaNetworkId>;
17
- ledgerService: Web3LedgerServiceSolana<BSName>;
18
- exchangeDataService: ExchangeDataService;
19
- blockchainDataService: BlockchainDataService;
20
- nftDataService: NftDataService;
21
- explorerService: ExplorerService;
6
+ readonly name: N;
7
+ readonly bip44DerivationPath: string;
8
+ readonly isMultiTransferSupported: boolean;
9
+ readonly isCustomNetworkSupported: boolean;
10
+ readonly feeToken: TBSToken;
11
+ readonly tokens: TBSToken[];
12
+ readonly nativeTokens: TBSToken[];
13
+ network: TBSNetwork<TBSSolanaNetworkId>;
14
+ availableNetworkURLs: string[];
15
+ readonly availableNetworks: TBSNetwork<TBSSolanaNetworkId>[];
16
+ readonly defaultNetwork: TBSNetwork<TBSSolanaNetworkId>;
17
+ ledgerService: Web3LedgerServiceSolana<N>;
18
+ exchangeDataService: IExchangeDataService;
19
+ blockchainDataService: IBlockchainDataService;
20
+ nftDataService: INftDataService;
21
+ explorerService: IExplorerService;
22
22
  tokenService: ITokenService;
23
- constructor(name: BSName, apiKeys: BSSolanaApiKeys, network?: Network<BSSolanaNetworkId>, getLedgerTransport?: GetLedgerTransport<BSName>);
24
- setNetwork(partialNetwork: Network<BSSolanaNetworkId>): void;
25
- testNetwork(network: Network<BSSolanaNetworkId>): Promise<void>;
23
+ constructor(name: N, network?: TBSNetwork<TBSSolanaNetworkId>, getLedgerTransport?: TGetLedgerTransport<N>);
24
+ setNetwork(network: TBSNetwork<TBSSolanaNetworkId>): void;
25
+ pingNode(url: string): Promise<TPingNetworkResponse>;
26
26
  validateAddress(address: string): boolean;
27
27
  validateKey(key: string): boolean;
28
- generateAccountFromMnemonic(mnemonic: string, index: number): Account<BSName>;
29
- generateAccountFromKey(key: string): Account<BSName>;
30
- generateAccountFromPublicKey(publicKey: string): Account<BSName>;
31
- transfer(param: TransferParam<BSName>): Promise<string[]>;
32
- calculateTransferFee(param: TransferParam<BSName>): Promise<string>;
28
+ generateAccountFromMnemonic(mnemonic: string, index: number): TBSAccount<N>;
29
+ generateAccountFromKey(key: string): TBSAccount<N>;
30
+ generateAccountFromPublicKey(publicKey: string): TBSAccount<N>;
31
+ transfer(param: TTransferParam<N>): Promise<string[]>;
32
+ calculateTransferFee(param: TTransferParam<N>): Promise<string>;
33
33
  resolveNameServiceDomain(domainName: string): Promise<string>;
34
34
  validateNameServiceDomainFormat(domainName: string): boolean;
35
35
  }
36
- export {};
package/dist/BSSolana.js CHANGED
@@ -41,21 +41,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
41
41
  step((generator = generator.apply(thisArg, _arguments || [])).next());
42
42
  });
43
43
  };
44
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
45
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
46
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
47
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
48
+ };
44
49
  var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
45
50
  if (kind === "m") throw new TypeError("Private method is not writable");
46
51
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
47
52
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
48
53
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
49
54
  };
50
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
51
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
52
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
53
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
54
- };
55
55
  var __importDefault = (this && this.__importDefault) || function (mod) {
56
56
  return (mod && mod.__esModule) ? mod : { "default": mod };
57
57
  };
58
- var _BSSolana_instances, _BSSolana_connection, _BSSolana_apiKeys, _BSSolana_generateKeyPairFromKey, _BSSolana_signTransaction, _BSSolana_buildTransferParams;
58
+ var _BSSolana_instances, _BSSolana_connection, _BSSolana_generateKeyPairFromKey, _BSSolana_signTransaction, _BSSolana_buildTransferParams;
59
59
  Object.defineProperty(exports, "__esModule", { value: true });
60
60
  exports.BSSolana = void 0;
61
61
  const blockchain_service_1 = require("@cityofzion/blockchain-service");
@@ -72,35 +72,59 @@ const TatumRpcNDSSolana_1 = require("./services/nft-data/TatumRpcNDSSolana");
72
72
  const SolScanESSolana_1 = require("./services/explorer/SolScanESSolana");
73
73
  const MoralisEDSSolana_1 = require("./services/exchange/MoralisEDSSolana");
74
74
  const TokenServiceSolana_1 = require("./services/token/TokenServiceSolana");
75
+ const axios_1 = __importDefault(require("axios"));
75
76
  const KEY_BYTES_LENGTH = 64;
76
77
  class BSSolana {
77
- constructor(name, apiKeys, network, getLedgerTransport) {
78
+ constructor(name, network, getLedgerTransport) {
78
79
  _BSSolana_instances.add(this);
80
+ this.isMultiTransferSupported = true;
81
+ this.isCustomNetworkSupported = false;
79
82
  _BSSolana_connection.set(this, void 0);
80
- _BSSolana_apiKeys.set(this, void 0);
81
- network = network !== null && network !== void 0 ? network : BSSolanaConstants_1.BSSolanaConstants.DEFAULT_NETWORK;
82
83
  this.name = name;
83
84
  this.bip44DerivationPath = BSSolanaConstants_1.BSSolanaConstants.DEFAULT_BIP44_DERIVATION_PATH;
84
85
  this.ledgerService = new Web3LedgerServiceSolana_1.Web3LedgerServiceSolana(this, getLedgerTransport);
85
- __classPrivateFieldSet(this, _BSSolana_apiKeys, apiKeys, "f");
86
- this.setNetwork(network);
87
- }
88
- setNetwork(partialNetwork) {
89
86
  this.tokens = [BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN];
90
87
  this.nativeTokens = [BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN];
91
88
  this.feeToken = BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN;
92
- this.network = partialNetwork;
89
+ this.availableNetworks = BSSolanaConstants_1.BSSolanaConstants.ALL_NETWORKS;
90
+ this.defaultNetwork = BSSolanaConstants_1.BSSolanaConstants.MAINNET_NETWORK;
91
+ this.setNetwork(network !== null && network !== void 0 ? network : this.defaultNetwork);
92
+ }
93
+ setNetwork(network) {
94
+ const availableURLs = BSSolanaConstants_1.BSSolanaConstants.RPC_LIST_BY_NETWORK_ID[network.id] || [];
95
+ const isValidNetwork = blockchain_service_1.BSUtilsHelper.validateNetwork(network, this.availableNetworks, availableURLs);
96
+ if (!isValidNetwork) {
97
+ throw new Error(`Network with id ${network.id} is not available for ${this.name}`);
98
+ }
99
+ this.network = network;
100
+ this.availableNetworkURLs = availableURLs;
93
101
  this.tokenService = new TokenServiceSolana_1.TokenServiceSolana();
94
- this.blockchainDataService = new TatumRpcBDSSolana_1.TatumRpcBDSSolana(this.network, this.feeToken, __classPrivateFieldGet(this, _BSSolana_apiKeys, "f").tatumMainnetApiKey, __classPrivateFieldGet(this, _BSSolana_apiKeys, "f").tatumTestnetApiKey);
95
- this.nftDataService = new TatumRpcNDSSolana_1.TatumRpcNDSSolana(this.network, __classPrivateFieldGet(this, _BSSolana_apiKeys, "f").tatumMainnetApiKey, __classPrivateFieldGet(this, _BSSolana_apiKeys, "f").tatumTestnetApiKey);
96
- this.explorerService = new SolScanESSolana_1.SolScanESSolana(this.network, this.tokenService);
97
- this.exchangeDataService = new MoralisEDSSolana_1.MoralisEDSSolana(this.network, __classPrivateFieldGet(this, _BSSolana_apiKeys, "f").moralisApiKey);
102
+ this.blockchainDataService = new TatumRpcBDSSolana_1.TatumRpcBDSSolana(this);
103
+ this.nftDataService = new TatumRpcNDSSolana_1.TatumRpcNDSSolana(this);
104
+ this.explorerService = new SolScanESSolana_1.SolScanESSolana(this);
105
+ this.exchangeDataService = new MoralisEDSSolana_1.MoralisEDSSolana(this);
98
106
  __classPrivateFieldSet(this, _BSSolana_connection, new web3_js_1.default.Connection(this.network.url), "f");
99
107
  }
100
- testNetwork(network) {
108
+ // This method is done manually because we need to ensure that the request is aborted after timeout
109
+ pingNode(url) {
101
110
  return __awaiter(this, void 0, void 0, function* () {
102
- const connection = new web3_js_1.default.Connection(network.url);
103
- yield connection.getBlockHeight();
111
+ const abortController = new AbortController();
112
+ const timeout = setTimeout(() => {
113
+ abortController.abort();
114
+ }, 5000);
115
+ const timeStart = Date.now();
116
+ const response = yield axios_1.default.post(url, {
117
+ jsonrpc: '2.0',
118
+ id: 1234,
119
+ method: 'getBlockHeight',
120
+ }, { timeout: 5000, signal: abortController.signal });
121
+ clearTimeout(timeout);
122
+ const latency = Date.now() - timeStart;
123
+ return {
124
+ latency,
125
+ url,
126
+ height: response.data.result,
127
+ };
104
128
  });
105
129
  }
106
130
  validateAddress(address) {
@@ -119,7 +143,7 @@ class BSSolana {
119
143
  catch (_a) {
120
144
  keyBuffer = Uint8Array.from(key.split(',').map(Number));
121
145
  }
122
- if (keyBuffer.length !== KEY_BYTES_LENGTH) {
146
+ if ((keyBuffer === null || keyBuffer === void 0 ? void 0 : keyBuffer.length) !== KEY_BYTES_LENGTH) {
123
147
  return false;
124
148
  }
125
149
  return true;
@@ -127,7 +151,7 @@ class BSSolana {
127
151
  generateAccountFromMnemonic(mnemonic, index) {
128
152
  const bip44Path = this.bip44DerivationPath.replace('?', index.toString());
129
153
  const seed = bip39.mnemonicToSeedSync(mnemonic);
130
- const hd = slip10_js_1.default.fromMasterSeed(seed.toString('hex'));
154
+ const hd = slip10_js_1.default.fromMasterSeed(seed);
131
155
  const keypair = web3_js_1.default.Keypair.fromSeed(hd.derive(bip44Path).privateKey);
132
156
  const key = bs58_1.default.encode(keypair.secretKey);
133
157
  const address = keypair.publicKey.toBase58();
@@ -200,7 +224,7 @@ class BSSolana {
200
224
  }
201
225
  }
202
226
  exports.BSSolana = BSSolana;
203
- _BSSolana_connection = new WeakMap(), _BSSolana_apiKeys = new WeakMap(), _BSSolana_instances = new WeakSet(), _BSSolana_generateKeyPairFromKey = function _BSSolana_generateKeyPairFromKey(key) {
227
+ _BSSolana_connection = new WeakMap(), _BSSolana_instances = new WeakSet(), _BSSolana_generateKeyPairFromKey = function _BSSolana_generateKeyPairFromKey(key) {
204
228
  let keyBuffer;
205
229
  try {
206
230
  keyBuffer = bs58_1.default.decode(key);
@@ -1,15 +1,11 @@
1
- import { Network, NetworkId, Token } from '@cityofzion/blockchain-service';
2
- export type BSSolanaNetworkId = NetworkId<'mainnet-beta' | 'devnet'>;
1
+ import { TBSNetwork, TBSToken } from '@cityofzion/blockchain-service';
2
+ import { TBSSolanaNetworkId } from '../types';
3
3
  export declare class BSSolanaConstants {
4
- static DEFAULT_BIP44_DERIVATION_PATH: string;
5
- static RPC_LIST_BY_NETWORK_ID: Partial<Record<BSSolanaNetworkId, string[]>>;
6
- static MAINNET_NETWORK_IDS: BSSolanaNetworkId[];
7
- static TESTNET_NETWORK_IDS: BSSolanaNetworkId[];
8
- static ALL_NETWORK_IDS: BSSolanaNetworkId[];
9
- static MAINNET_NETWORKS: Network<BSSolanaNetworkId>[];
10
- static TESTNET_NETWORKS: Network<BSSolanaNetworkId>[];
11
- static ALL_NETWORKS: Network<BSSolanaNetworkId>[];
12
- static DEFAULT_NETWORK: Network<BSSolanaNetworkId>;
13
- static NATIVE_TOKEN: Token;
14
- static NATIVE_WRAPPED_HASH: string;
4
+ static readonly DEFAULT_BIP44_DERIVATION_PATH = "m/44'/501'/?'/0'";
5
+ static readonly NATIVE_TOKEN: TBSToken;
6
+ static readonly NATIVE_WRAPPED_HASH = "So11111111111111111111111111111111111111112";
7
+ static readonly RPC_LIST_BY_NETWORK_ID: Partial<Record<TBSSolanaNetworkId, string[]>>;
8
+ static readonly MAINNET_NETWORK: TBSNetwork<TBSSolanaNetworkId>;
9
+ static readonly TESTNET_NETWORK: TBSNetwork<TBSSolanaNetworkId>;
10
+ static readonly ALL_NETWORKS: TBSNetwork<TBSSolanaNetworkId>[];
15
11
  }
@@ -7,28 +7,22 @@ class BSSolanaConstants {
7
7
  exports.BSSolanaConstants = BSSolanaConstants;
8
8
  _a = BSSolanaConstants;
9
9
  BSSolanaConstants.DEFAULT_BIP44_DERIVATION_PATH = "m/44'/501'/?'/0'";
10
+ BSSolanaConstants.NATIVE_TOKEN = { symbol: 'SOL', name: 'SOL', decimals: 9, hash: '-' };
11
+ BSSolanaConstants.NATIVE_WRAPPED_HASH = 'So11111111111111111111111111111111111111112';
10
12
  BSSolanaConstants.RPC_LIST_BY_NETWORK_ID = {
11
13
  'mainnet-beta': ['https://api.mainnet-beta.solana.com'],
12
14
  devnet: ['https://api.devnet.solana.com'],
13
15
  };
14
- BSSolanaConstants.MAINNET_NETWORK_IDS = ['mainnet-beta'];
15
- BSSolanaConstants.TESTNET_NETWORK_IDS = ['devnet'];
16
- BSSolanaConstants.ALL_NETWORK_IDS = [..._a.MAINNET_NETWORK_IDS, ..._a.TESTNET_NETWORK_IDS];
17
- BSSolanaConstants.MAINNET_NETWORKS = [
18
- {
19
- id: 'mainnet-beta',
20
- name: 'Mainnet Beta',
21
- url: _a.RPC_LIST_BY_NETWORK_ID['mainnet-beta'][0],
22
- },
23
- ];
24
- BSSolanaConstants.TESTNET_NETWORKS = [
25
- {
26
- id: 'devnet',
27
- name: 'Devnet',
28
- url: _a.RPC_LIST_BY_NETWORK_ID['devnet'][0],
29
- },
30
- ];
31
- BSSolanaConstants.ALL_NETWORKS = [..._a.MAINNET_NETWORKS, ..._a.TESTNET_NETWORKS];
32
- BSSolanaConstants.DEFAULT_NETWORK = _a.MAINNET_NETWORKS[0];
33
- BSSolanaConstants.NATIVE_TOKEN = { symbol: 'SOL', name: 'SOL', decimals: 9, hash: '-' };
34
- BSSolanaConstants.NATIVE_WRAPPED_HASH = 'So11111111111111111111111111111111111111112';
16
+ BSSolanaConstants.MAINNET_NETWORK = {
17
+ id: 'mainnet-beta',
18
+ name: 'Mainnet Beta',
19
+ url: _a.RPC_LIST_BY_NETWORK_ID['mainnet-beta'][0],
20
+ type: 'mainnet',
21
+ };
22
+ BSSolanaConstants.TESTNET_NETWORK = {
23
+ id: 'devnet',
24
+ name: 'Devnet',
25
+ url: _a.RPC_LIST_BY_NETWORK_ID['devnet'][0],
26
+ type: 'testnet',
27
+ };
28
+ BSSolanaConstants.ALL_NETWORKS = [_a.MAINNET_NETWORK, _a.TESTNET_NETWORK];
@@ -75,14 +75,14 @@ class BSSolanaCachedMethodsHelper {
75
75
  metadata = nftMetadata;
76
76
  }
77
77
  }
78
- catch (error) {
78
+ catch (_b) {
79
79
  try {
80
80
  const tokenMetadata = yield metaplexInstance.tokens().findMintByAddress({
81
81
  address: new web3_js_1.default.PublicKey(tokenHash),
82
82
  });
83
83
  metadata = Object.assign(Object.assign({}, tokenMetadata), { name: tokenMetadata.currency.symbol });
84
84
  }
85
- catch (_b) {
85
+ catch (_c) {
86
86
  /* empty */
87
87
  }
88
88
  }
@@ -1,7 +1,7 @@
1
- import { Network } from '@cityofzion/blockchain-service';
2
- import { BSSolanaNetworkId } from '../constants/BSSolanaConstants';
1
+ import { TBSNetwork } from '@cityofzion/blockchain-service';
2
+ import { TBSSolanaNetworkId } from '../types';
3
3
  export declare class BSSolanaHelper {
4
- static isMainnet(network: Network<BSSolanaNetworkId>): boolean;
5
4
  static fixBip44Path(bip44Path: string): string;
6
5
  static getBip44Path(path: string, index: number): string;
6
+ static isMainnetNetwork(network: TBSNetwork<TBSSolanaNetworkId>): boolean;
7
7
  }
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BSSolanaHelper = void 0;
4
4
  const BSSolanaConstants_1 = require("../constants/BSSolanaConstants");
5
5
  class BSSolanaHelper {
6
- static isMainnet(network) {
7
- return BSSolanaConstants_1.BSSolanaConstants.MAINNET_NETWORK_IDS.includes(network.id);
8
- }
9
6
  static fixBip44Path(bip44Path) {
10
7
  return bip44Path.replace('m/', '');
11
8
  }
12
9
  static getBip44Path(path, index) {
13
10
  return this.fixBip44Path(path.replace('?', index.toString()));
14
11
  }
12
+ static isMainnetNetwork(network) {
13
+ return BSSolanaConstants_1.BSSolanaConstants.MAINNET_NETWORK.id === network.id && network.type === 'mainnet';
14
+ }
15
15
  }
16
16
  exports.BSSolanaHelper = BSSolanaHelper;
@@ -0,0 +1,11 @@
1
+ export * from './constants/BSSolanaConstants';
2
+ export * from './helpers/BSSolanaCachedMethodsHelper';
3
+ export * from './helpers/BSSolanaHelper';
4
+ export * from './services/blockchain-data/TatumRpcBDSSolana';
5
+ export * from './services/exchange/MoralisEDSSolana';
6
+ export * from './services/explorer/SolScanESSolana';
7
+ export * from './services/ledger/Web3LedgerServiceSolana';
8
+ export * from './services/nft-data/TatumRpcNDSSolana';
9
+ export * from './services/token/TokenServiceSolana';
10
+ export * from './BSSolana';
11
+ export * from './types';
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./constants/BSSolanaConstants"), exports);
18
+ __exportStar(require("./helpers/BSSolanaCachedMethodsHelper"), exports);
19
+ __exportStar(require("./helpers/BSSolanaHelper"), exports);
20
+ __exportStar(require("./services/blockchain-data/TatumRpcBDSSolana"), exports);
21
+ __exportStar(require("./services/exchange/MoralisEDSSolana"), exports);
22
+ __exportStar(require("./services/explorer/SolScanESSolana"), exports);
23
+ __exportStar(require("./services/ledger/Web3LedgerServiceSolana"), exports);
24
+ __exportStar(require("./services/nft-data/TatumRpcNDSSolana"), exports);
25
+ __exportStar(require("./services/token/TokenServiceSolana"), exports);
26
+ __exportStar(require("./BSSolana"), exports);
27
+ __exportStar(require("./types"), exports);
@@ -1,19 +1,18 @@
1
- import { BalanceResponse, BlockchainDataService, ContractResponse, ExportTransactionsByAddressParams, FullTransactionsByAddressParams, FullTransactionsByAddressResponse, Network, RpcResponse, Token, TransactionResponse, TransactionsByAddressParams, TransactionsByAddressResponse } from '@cityofzion/blockchain-service';
2
- import { BSSolanaNetworkId } from '../../constants/BSSolanaConstants';
1
+ import { TBalanceResponse, ContractResponse, TExportTransactionsByAddressParams, TFullTransactionsByAddressParams, TFullTransactionsByAddressResponse, IBlockchainDataService, TBSNetwork, TBSToken, TTransactionResponse, TTransactionsByAddressParams, TTransactionsByAddressResponse } from '@cityofzion/blockchain-service';
3
2
  import solanaSDK from '@solana/web3.js';
4
- export declare class TatumRpcBDSSolana implements BlockchainDataService {
3
+ import { IBSSolana, TBSSolanaNetworkId } from '../../types';
4
+ export declare class TatumRpcBDSSolana<N extends string> implements IBlockchainDataService {
5
5
  #private;
6
- static tatumUrlByNetworkId: Record<BSSolanaNetworkId, string>;
7
- static getTatumConnection(network: Network<BSSolanaNetworkId>, apiKey: string): solanaSDK.Connection;
8
- maxTimeToConfirmTransactionInMs: number;
9
- constructor(network: Network<BSSolanaNetworkId>, feeToken: Token, mainnetApiKey: string, testnetApiKey: string);
10
- getFullTransactionsByAddress(_params: FullTransactionsByAddressParams): Promise<FullTransactionsByAddressResponse>;
11
- exportFullTransactionsByAddress(_params: ExportTransactionsByAddressParams): Promise<string>;
12
- getTransaction(txid: string): Promise<TransactionResponse>;
13
- getTransactionsByAddress(params: TransactionsByAddressParams): Promise<TransactionsByAddressResponse>;
6
+ static URL_BY_NETWORK_ID: Record<TBSSolanaNetworkId, string>;
7
+ static getConnection(network: TBSNetwork<TBSSolanaNetworkId>): solanaSDK.Connection;
8
+ readonly maxTimeToConfirmTransactionInMs: number;
9
+ constructor(service: IBSSolana<N>);
10
+ getTransaction(txid: string): Promise<TTransactionResponse>;
11
+ getTransactionsByAddress(params: TTransactionsByAddressParams): Promise<TTransactionsByAddressResponse>;
12
+ getFullTransactionsByAddress(_params: TFullTransactionsByAddressParams): Promise<TFullTransactionsByAddressResponse>;
13
+ exportFullTransactionsByAddress(_params: TExportTransactionsByAddressParams): Promise<string>;
14
14
  getContract(_contractHash: string): Promise<ContractResponse>;
15
- getTokenInfo(tokenHash: string): Promise<Token>;
16
- getBalance(address: string): Promise<BalanceResponse[]>;
15
+ getTokenInfo(tokenHash: string): Promise<TBSToken>;
16
+ getBalance(address: string): Promise<TBalanceResponse[]>;
17
17
  getBlockHeight(): Promise<number>;
18
- getRpcList(): Promise<RpcResponse[]>;
19
18
  }
@@ -55,7 +55,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
55
55
  var __importDefault = (this && this.__importDefault) || function (mod) {
56
56
  return (mod && mod.__esModule) ? mod : { "default": mod };
57
57
  };
58
- var _TatumRpcBDSSolana_instances, _TatumRpcBDSSolana_network, _TatumRpcBDSSolana_feeToken, _TatumRpcBDSSolana_connection, _TatumRpcBDSSolana_mainnetApiKey, _TatumRpcBDSSolana_testnetApiKey, _TatumRpcBDSSolana_functionByProgramIdAndMethod, _TatumRpcBDSSolana_parseSplTransferCheckedInstruction, _TatumRpcBDSSolana_parseSplTransferInstruction, _TatumRpcBDSSolana_parseSystemInstruction, _TatumRpcBDSSolana_parseInstruction;
58
+ var _TatumRpcBDSSolana_instances, _TatumRpcBDSSolana_service, _TatumRpcBDSSolana_connection, _TatumRpcBDSSolana_functionByProgramIdAndMethod, _TatumRpcBDSSolana_parseSplTransferCheckedInstruction, _TatumRpcBDSSolana_parseSplTransferInstruction, _TatumRpcBDSSolana_parseSystemInstruction, _TatumRpcBDSSolana_parseInstruction;
59
59
  Object.defineProperty(exports, "__esModule", { value: true });
60
60
  exports.TatumRpcBDSSolana = void 0;
61
61
  const blockchain_service_1 = require("@cityofzion/blockchain-service");
@@ -65,21 +65,20 @@ const solanaSplSDK = __importStar(require("@solana/spl-token"));
65
65
  const BSSolanaCachedMethodsHelper_1 = require("../../helpers/BSSolanaCachedMethodsHelper");
66
66
  const BSSolanaHelper_1 = require("../../helpers/BSSolanaHelper");
67
67
  class TatumRpcBDSSolana {
68
- static getTatumConnection(network, apiKey) {
69
- return new web3_js_1.default.Connection(this.tatumUrlByNetworkId[network.id], {
68
+ static getConnection(network) {
69
+ return new web3_js_1.default.Connection(TatumRpcBDSSolana.URL_BY_NETWORK_ID[network.id], {
70
70
  httpHeaders: {
71
- 'x-api-key': apiKey,
71
+ 'x-api-key': BSSolanaHelper_1.BSSolanaHelper.isMainnetNetwork(network)
72
+ ? process.env.TATUM_MAINNET_API_KEY
73
+ : process.env.TATUM_TESTNET_API_KEY,
72
74
  },
73
75
  });
74
76
  }
75
- constructor(network, feeToken, mainnetApiKey, testnetApiKey) {
77
+ constructor(service) {
76
78
  _TatumRpcBDSSolana_instances.add(this);
77
- this.maxTimeToConfirmTransactionInMs = 1000 * 60;
78
- _TatumRpcBDSSolana_network.set(this, void 0);
79
- _TatumRpcBDSSolana_feeToken.set(this, void 0);
79
+ this.maxTimeToConfirmTransactionInMs = 1000 * 60; // 1 minutes
80
+ _TatumRpcBDSSolana_service.set(this, void 0);
80
81
  _TatumRpcBDSSolana_connection.set(this, void 0);
81
- _TatumRpcBDSSolana_mainnetApiKey.set(this, void 0);
82
- _TatumRpcBDSSolana_testnetApiKey.set(this, void 0);
83
82
  _TatumRpcBDSSolana_functionByProgramIdAndMethod.set(this, {
84
83
  [solanaSplSDK.TOKEN_PROGRAM_ID.toString()]: {
85
84
  transferChecked: __classPrivateFieldGet(this, _TatumRpcBDSSolana_instances, "m", _TatumRpcBDSSolana_parseSplTransferCheckedInstruction).bind(this),
@@ -89,17 +88,8 @@ class TatumRpcBDSSolana {
89
88
  transfer: __classPrivateFieldGet(this, _TatumRpcBDSSolana_instances, "m", _TatumRpcBDSSolana_parseSystemInstruction).bind(this),
90
89
  },
91
90
  });
92
- __classPrivateFieldSet(this, _TatumRpcBDSSolana_network, network, "f");
93
- __classPrivateFieldSet(this, _TatumRpcBDSSolana_feeToken, feeToken, "f");
94
- __classPrivateFieldSet(this, _TatumRpcBDSSolana_mainnetApiKey, mainnetApiKey, "f");
95
- __classPrivateFieldSet(this, _TatumRpcBDSSolana_testnetApiKey, testnetApiKey, "f");
96
- __classPrivateFieldSet(this, _TatumRpcBDSSolana_connection, TatumRpcBDSSolana.getTatumConnection(network, BSSolanaHelper_1.BSSolanaHelper.isMainnet(network) ? mainnetApiKey : testnetApiKey), "f");
97
- }
98
- getFullTransactionsByAddress(_params) {
99
- throw new Error('Method not implemented.');
100
- }
101
- exportFullTransactionsByAddress(_params) {
102
- throw new Error('Method not implemented.');
91
+ __classPrivateFieldSet(this, _TatumRpcBDSSolana_service, service, "f");
92
+ __classPrivateFieldSet(this, _TatumRpcBDSSolana_connection, TatumRpcBDSSolana.getConnection(service.network), "f");
103
93
  }
104
94
  getTransaction(txid) {
105
95
  return __awaiter(this, void 0, void 0, function* () {
@@ -128,7 +118,7 @@ class TatumRpcBDSSolana {
128
118
  /* empty */
129
119
  }
130
120
  }
131
- const feeBn = blockchain_service_1.BSBigNumberHelper.fromDecimals(transaction.meta.fee, __classPrivateFieldGet(this, _TatumRpcBDSSolana_feeToken, "f").decimals);
121
+ const feeBn = blockchain_service_1.BSBigNumberHelper.fromDecimals(transaction.meta.fee, __classPrivateFieldGet(this, _TatumRpcBDSSolana_service, "f").feeToken.decimals);
132
122
  const fee = blockchain_service_1.BSBigNumberHelper.toNumber(feeBn);
133
123
  return {
134
124
  block: transaction.slot,
@@ -161,9 +151,19 @@ class TatumRpcBDSSolana {
161
151
  };
162
152
  });
163
153
  }
154
+ getFullTransactionsByAddress(_params) {
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ throw new Error('Method not supported.');
157
+ });
158
+ }
159
+ exportFullTransactionsByAddress(_params) {
160
+ return __awaiter(this, void 0, void 0, function* () {
161
+ throw new Error('Method not supported.');
162
+ });
163
+ }
164
164
  getContract(_contractHash) {
165
165
  return __awaiter(this, void 0, void 0, function* () {
166
- throw new Error('Method not implemented.');
166
+ throw new Error('Method not supported.');
167
167
  });
168
168
  }
169
169
  getTokenInfo(tokenHash) {
@@ -218,46 +218,9 @@ class TatumRpcBDSSolana {
218
218
  return yield __classPrivateFieldGet(this, _TatumRpcBDSSolana_connection, "f").getBlockHeight();
219
219
  });
220
220
  }
221
- getRpcList() {
222
- return __awaiter(this, void 0, void 0, function* () {
223
- const list = [];
224
- const urls = BSSolanaConstants_1.BSSolanaConstants.RPC_LIST_BY_NETWORK_ID[__classPrivateFieldGet(this, _TatumRpcBDSSolana_network, "f").id];
225
- if (!urls) {
226
- throw new Error('RPC list not found');
227
- }
228
- const promises = urls.map(url => {
229
- // eslint-disable-next-line no-async-promise-executor
230
- return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
231
- const timeout = setTimeout(() => {
232
- resolve();
233
- }, 5000);
234
- try {
235
- const connection = TatumRpcBDSSolana.getTatumConnection(Object.assign(Object.assign({}, __classPrivateFieldGet(this, _TatumRpcBDSSolana_network, "f")), { url }), BSSolanaHelper_1.BSSolanaHelper.isMainnet(__classPrivateFieldGet(this, _TatumRpcBDSSolana_network, "f")) ? __classPrivateFieldGet(this, _TatumRpcBDSSolana_mainnetApiKey, "f") : __classPrivateFieldGet(this, _TatumRpcBDSSolana_testnetApiKey, "f"));
236
- const timeStart = Date.now();
237
- const height = yield connection.getBlockHeight();
238
- const latency = Date.now() - timeStart;
239
- list.push({
240
- url,
241
- height,
242
- latency,
243
- });
244
- }
245
- catch (_a) {
246
- /* empty */
247
- }
248
- finally {
249
- resolve();
250
- clearTimeout(timeout);
251
- }
252
- }));
253
- });
254
- yield Promise.allSettled(promises);
255
- return list;
256
- });
257
- }
258
221
  }
259
222
  exports.TatumRpcBDSSolana = TatumRpcBDSSolana;
260
- _TatumRpcBDSSolana_network = new WeakMap(), _TatumRpcBDSSolana_feeToken = new WeakMap(), _TatumRpcBDSSolana_connection = new WeakMap(), _TatumRpcBDSSolana_mainnetApiKey = new WeakMap(), _TatumRpcBDSSolana_testnetApiKey = new WeakMap(), _TatumRpcBDSSolana_functionByProgramIdAndMethod = new WeakMap(), _TatumRpcBDSSolana_instances = new WeakSet(), _TatumRpcBDSSolana_parseSplTransferCheckedInstruction = function _TatumRpcBDSSolana_parseSplTransferCheckedInstruction(instruction, allInstructions) {
223
+ _TatumRpcBDSSolana_service = new WeakMap(), _TatumRpcBDSSolana_connection = new WeakMap(), _TatumRpcBDSSolana_functionByProgramIdAndMethod = new WeakMap(), _TatumRpcBDSSolana_instances = new WeakSet(), _TatumRpcBDSSolana_parseSplTransferCheckedInstruction = function _TatumRpcBDSSolana_parseSplTransferCheckedInstruction(instruction, allInstructions) {
261
224
  return __awaiter(this, void 0, void 0, function* () {
262
225
  var _a;
263
226
  const info = instruction.parsed.info;
@@ -402,7 +365,7 @@ _TatumRpcBDSSolana_network = new WeakMap(), _TatumRpcBDSSolana_feeToken = new We
402
365
  throw new Error('Unsupported instruction');
403
366
  });
404
367
  };
405
- TatumRpcBDSSolana.tatumUrlByNetworkId = {
368
+ TatumRpcBDSSolana.URL_BY_NETWORK_ID = {
406
369
  'mainnet-beta': 'https://solana-mainnet.gateway.tatum.io/',
407
370
  devnet: 'https://solana-devnet.gateway.tatum.io',
408
371
  };
@@ -1,8 +1,8 @@
1
- import { CryptoCompareEDS, ExchangeDataService, GetTokenPriceHistoryParams, GetTokenPricesParams, Network, TokenPricesHistoryResponse, TokenPricesResponse } from '@cityofzion/blockchain-service';
2
- import { BSSolanaNetworkId } from '../../constants/BSSolanaConstants';
3
- export declare class MoralisEDSSolana extends CryptoCompareEDS implements ExchangeDataService {
1
+ import { CryptoCompareEDS, TGetTokenPriceHistoryParams, TGetTokenPricesParams, TTokenPricesHistoryResponse, TTokenPricesResponse } from '@cityofzion/blockchain-service';
2
+ import { IBSSolana } from '../../types';
3
+ export declare class MoralisEDSSolana<N extends string> extends CryptoCompareEDS {
4
4
  #private;
5
- constructor(network: Network<BSSolanaNetworkId>, apiKey: string);
6
- getTokenPrices({ tokens }: GetTokenPricesParams): Promise<TokenPricesResponse[]>;
7
- getTokenPriceHistory(params: GetTokenPriceHistoryParams): Promise<TokenPricesHistoryResponse[]>;
5
+ constructor(service: IBSSolana<N>);
6
+ getTokenPrices({ tokens }: TGetTokenPricesParams): Promise<TTokenPricesResponse[]>;
7
+ getTokenPriceHistory(params: TGetTokenPriceHistoryParams): Promise<TTokenPricesHistoryResponse[]>;
8
8
  }
@@ -22,31 +22,31 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
22
22
  var __importDefault = (this && this.__importDefault) || function (mod) {
23
23
  return (mod && mod.__esModule) ? mod : { "default": mod };
24
24
  };
25
- var _MoralisEDSSolana_network, _MoralisEDSSolana_client, _MoralisEDSSolana_pairAddressCache;
25
+ var _MoralisEDSSolana_client, _MoralisEDSSolana_service, _MoralisEDSSolana_pairAddressCache;
26
26
  Object.defineProperty(exports, "__esModule", { value: true });
27
27
  exports.MoralisEDSSolana = void 0;
28
28
  const blockchain_service_1 = require("@cityofzion/blockchain-service");
29
29
  const BSSolanaHelper_1 = require("../../helpers/BSSolanaHelper");
30
30
  const BSSolanaConstants_1 = require("../../constants/BSSolanaConstants");
31
31
  const axios_1 = __importDefault(require("axios"));
32
- const dayjs_1 = __importDefault(require("dayjs"));
32
+ const sub_1 = require("date-fns/sub");
33
33
  class MoralisEDSSolana extends blockchain_service_1.CryptoCompareEDS {
34
- constructor(network, apiKey) {
34
+ constructor(service) {
35
35
  super();
36
- _MoralisEDSSolana_network.set(this, void 0);
37
36
  _MoralisEDSSolana_client.set(this, void 0);
37
+ _MoralisEDSSolana_service.set(this, void 0);
38
38
  _MoralisEDSSolana_pairAddressCache.set(this, new Map());
39
- __classPrivateFieldSet(this, _MoralisEDSSolana_network, network, "f");
39
+ __classPrivateFieldSet(this, _MoralisEDSSolana_service, service, "f");
40
40
  __classPrivateFieldSet(this, _MoralisEDSSolana_client, axios_1.default.create({
41
41
  baseURL: 'https://solana-gateway.moralis.io',
42
42
  headers: {
43
- 'X-API-Key': apiKey,
43
+ 'X-API-Key': process.env.MORALIS_API_KEY,
44
44
  },
45
45
  }), "f");
46
46
  }
47
47
  getTokenPrices(_a) {
48
48
  return __awaiter(this, arguments, void 0, function* ({ tokens }) {
49
- if (!BSSolanaHelper_1.BSSolanaHelper.isMainnet(__classPrivateFieldGet(this, _MoralisEDSSolana_network, "f")))
49
+ if (!BSSolanaHelper_1.BSSolanaHelper.isMainnetNetwork(__classPrivateFieldGet(this, _MoralisEDSSolana_service, "f").network))
50
50
  throw new Error('Exchange is only available on mainnet');
51
51
  const promises = tokens.map((token) => __awaiter(this, void 0, void 0, function* () {
52
52
  const hash = token.hash === BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN.hash ? BSSolanaConstants_1.BSSolanaConstants.NATIVE_WRAPPED_HASH : token.hash;
@@ -69,7 +69,7 @@ class MoralisEDSSolana extends blockchain_service_1.CryptoCompareEDS {
69
69
  }
70
70
  getTokenPriceHistory(params) {
71
71
  return __awaiter(this, void 0, void 0, function* () {
72
- if (!BSSolanaHelper_1.BSSolanaHelper.isMainnet(__classPrivateFieldGet(this, _MoralisEDSSolana_network, "f")))
72
+ if (!BSSolanaHelper_1.BSSolanaHelper.isMainnetNetwork(__classPrivateFieldGet(this, _MoralisEDSSolana_service, "f").network))
73
73
  throw new Error('Exchange is only available on mainnet');
74
74
  const tokenHash = params.token.hash === BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN.hash
75
75
  ? BSSolanaConstants_1.BSSolanaConstants.NATIVE_WRAPPED_HASH
@@ -80,19 +80,23 @@ class MoralisEDSSolana extends blockchain_service_1.CryptoCompareEDS {
80
80
  __classPrivateFieldGet(this, _MoralisEDSSolana_pairAddressCache, "f").set(tokenHash, priceResponse.data.pairAddress);
81
81
  pairAddress = priceResponse.data.pairAddress;
82
82
  }
83
- const toDate = (0, dayjs_1.default)().unix();
84
- const fromDate = (0, dayjs_1.default)().subtract(params.limit, params.type).unix();
83
+ const toDate = new Date();
84
+ const fromDate = (0, sub_1.sub)(params.limit, {
85
+ [params.type === 'day' ? 'days' : 'hours']: params.limit,
86
+ });
87
+ const toDateTimestamp = toDate.getTime() / 1000;
88
+ const fromDateTimestamp = fromDate.getTime() / 1000;
85
89
  const pricesHistoryResponse = yield __classPrivateFieldGet(this, _MoralisEDSSolana_client, "f").get(`token/mainnet/pairs/${pairAddress}/ohlcv`, {
86
90
  params: {
87
91
  timeframe: params.type === 'day' ? '1d' : '1h',
88
92
  currency: 'usd',
89
93
  limit: params.limit,
90
- toDate,
91
- fromDate,
94
+ toDate: toDateTimestamp,
95
+ fromDate: fromDateTimestamp,
92
96
  },
93
97
  });
94
98
  const pricesHistory = pricesHistoryResponse.data.result.map(price => ({
95
- timestamp: (0, dayjs_1.default)(price.timestamp).unix(),
99
+ timestamp: new Date().getTime() / 1000,
96
100
  token: params.token,
97
101
  usdPrice: price.close,
98
102
  }));
@@ -101,4 +105,4 @@ class MoralisEDSSolana extends blockchain_service_1.CryptoCompareEDS {
101
105
  }
102
106
  }
103
107
  exports.MoralisEDSSolana = MoralisEDSSolana;
104
- _MoralisEDSSolana_network = new WeakMap(), _MoralisEDSSolana_client = new WeakMap(), _MoralisEDSSolana_pairAddressCache = new WeakMap();
108
+ _MoralisEDSSolana_client = new WeakMap(), _MoralisEDSSolana_service = new WeakMap(), _MoralisEDSSolana_pairAddressCache = new WeakMap();
@@ -1,11 +1,11 @@
1
- import { BuildNftUrlParams, ExplorerService, Network, TokenService } from '@cityofzion/blockchain-service';
2
- import { BSSolanaNetworkId } from '../../constants/BSSolanaConstants';
3
- export declare class SolScanESSolana implements ExplorerService {
1
+ import { TBuildNftUrlParams, IExplorerService } from '@cityofzion/blockchain-service';
2
+ import { IBSSolana } from '../../types';
3
+ export declare class SolScanESSolana<N extends string> implements IExplorerService {
4
4
  #private;
5
- constructor(network: Network<BSSolanaNetworkId>, tokenService: TokenService);
5
+ constructor(service: IBSSolana<N>);
6
6
  buildTransactionUrl(hash: string): string;
7
7
  buildContractUrl(contractHash: string): string;
8
- buildNftUrl({ tokenHash }: BuildNftUrlParams): string;
8
+ buildNftUrl({ tokenHash }: TBuildNftUrlParams): string;
9
9
  getAddressTemplateUrl(): string | undefined;
10
10
  getTxTemplateUrl(): string;
11
11
  getNftTemplateUrl(): string;
@@ -10,25 +10,25 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _SolScanESSolana_baseUrl, _SolScanESSolana_queryParams, _SolScanESSolana_tokenService;
13
+ var _SolScanESSolana_baseUrl, _SolScanESSolana_queryParams, _SolScanESSolana_service;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.SolScanESSolana = void 0;
16
16
  const BSSolanaHelper_1 = require("../../helpers/BSSolanaHelper");
17
17
  class SolScanESSolana {
18
- constructor(network, tokenService) {
18
+ constructor(service) {
19
19
  _SolScanESSolana_baseUrl.set(this, 'https://solscan.io');
20
20
  _SolScanESSolana_queryParams.set(this, '');
21
- _SolScanESSolana_tokenService.set(this, void 0);
22
- if (!BSSolanaHelper_1.BSSolanaHelper.isMainnet(network)) {
23
- __classPrivateFieldSet(this, _SolScanESSolana_queryParams, `?cluster=${network.id}`, "f");
21
+ _SolScanESSolana_service.set(this, void 0);
22
+ if (!BSSolanaHelper_1.BSSolanaHelper.isMainnetNetwork(service.network)) {
23
+ __classPrivateFieldSet(this, _SolScanESSolana_queryParams, `?cluster=${service.network.id}`, "f");
24
24
  }
25
- __classPrivateFieldSet(this, _SolScanESSolana_tokenService, tokenService, "f");
25
+ __classPrivateFieldSet(this, _SolScanESSolana_service, service, "f");
26
26
  }
27
27
  buildTransactionUrl(hash) {
28
- return `${__classPrivateFieldGet(this, _SolScanESSolana_baseUrl, "f")}/tx/${__classPrivateFieldGet(this, _SolScanESSolana_tokenService, "f").normalizeHash(hash)}${__classPrivateFieldGet(this, _SolScanESSolana_queryParams, "f")}`;
28
+ return `${__classPrivateFieldGet(this, _SolScanESSolana_baseUrl, "f")}/tx/${__classPrivateFieldGet(this, _SolScanESSolana_service, "f").tokenService.normalizeHash(hash)}${__classPrivateFieldGet(this, _SolScanESSolana_queryParams, "f")}`;
29
29
  }
30
30
  buildContractUrl(contractHash) {
31
- return `${__classPrivateFieldGet(this, _SolScanESSolana_baseUrl, "f")}/token/${__classPrivateFieldGet(this, _SolScanESSolana_tokenService, "f").normalizeHash(contractHash)}${__classPrivateFieldGet(this, _SolScanESSolana_queryParams, "f")}`;
31
+ return `${__classPrivateFieldGet(this, _SolScanESSolana_baseUrl, "f")}/token/${__classPrivateFieldGet(this, _SolScanESSolana_service, "f").tokenService.normalizeHash(contractHash)}${__classPrivateFieldGet(this, _SolScanESSolana_queryParams, "f")}`;
32
32
  }
33
33
  buildNftUrl({ tokenHash }) {
34
34
  return this.buildContractUrl(tokenHash);
@@ -47,4 +47,4 @@ class SolScanESSolana {
47
47
  }
48
48
  }
49
49
  exports.SolScanESSolana = SolScanESSolana;
50
- _SolScanESSolana_baseUrl = new WeakMap(), _SolScanESSolana_queryParams = new WeakMap(), _SolScanESSolana_tokenService = new WeakMap();
50
+ _SolScanESSolana_baseUrl = new WeakMap(), _SolScanESSolana_queryParams = new WeakMap(), _SolScanESSolana_service = new WeakMap();
@@ -1,13 +1,13 @@
1
- import { Account, LedgerService, LedgerServiceEmitter, GetLedgerTransport, UntilIndexRecord } from '@cityofzion/blockchain-service';
2
- import { BSSolana } from '../../BSSolana';
1
+ import { TBSAccount, TLedgerServiceEmitter, TGetLedgerTransport, TUntilIndexRecord, ILedgerService } from '@cityofzion/blockchain-service';
3
2
  import Transport from '@ledgerhq/hw-transport';
4
3
  import solanaSDK from '@solana/web3.js';
5
- export declare class Web3LedgerServiceSolana<BSName extends string = string> implements LedgerService<BSName> {
4
+ import { IBSSolana } from '../../types';
5
+ export declare class Web3LedgerServiceSolana<N extends string = string> implements ILedgerService<N> {
6
6
  #private;
7
- emitter: LedgerServiceEmitter;
8
- getLedgerTransport?: GetLedgerTransport<BSName>;
9
- constructor(blockchainService: BSSolana<BSName>, getLedgerTransport?: GetLedgerTransport<BSName>);
10
- getAccounts(transport: Transport, untilIndexByBlockchainService?: UntilIndexRecord<BSName>): Promise<Account<BSName>[]>;
11
- getAccount(transport: Transport, index: number): Promise<Account<BSName>>;
12
- signTransaction(transport: Transport, transaction: solanaSDK.Transaction, account: Account<BSName>): Promise<Buffer<ArrayBufferLike>>;
7
+ readonly getLedgerTransport?: TGetLedgerTransport<N>;
8
+ emitter: TLedgerServiceEmitter;
9
+ constructor(blockchainService: IBSSolana<N>, getLedgerTransport?: TGetLedgerTransport<N>);
10
+ getAccounts(transport: Transport, untilIndexByBlockchainService?: TUntilIndexRecord<N>): Promise<TBSAccount<N>[]>;
11
+ getAccount(transport: Transport, index: number): Promise<TBSAccount<N>>;
12
+ signTransaction(transport: Transport, transaction: solanaSDK.Transaction, account: TBSAccount<N>): Promise<Buffer<ArrayBufferLike>>;
13
13
  }
@@ -22,7 +22,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
22
22
  var __importDefault = (this && this.__importDefault) || function (mod) {
23
23
  return (mod && mod.__esModule) ? mod : { "default": mod };
24
24
  };
25
- var _Web3LedgerServiceSolana_blockchainService;
25
+ var _Web3LedgerServiceSolana_service;
26
26
  Object.defineProperty(exports, "__esModule", { value: true });
27
27
  exports.Web3LedgerServiceSolana = void 0;
28
28
  const blockchain_service_1 = require("@cityofzion/blockchain-service");
@@ -32,24 +32,24 @@ const web3_js_1 = __importDefault(require("@solana/web3.js"));
32
32
  const BSSolanaHelper_1 = require("../../helpers/BSSolanaHelper");
33
33
  class Web3LedgerServiceSolana {
34
34
  constructor(blockchainService, getLedgerTransport) {
35
- _Web3LedgerServiceSolana_blockchainService.set(this, void 0);
35
+ _Web3LedgerServiceSolana_service.set(this, void 0);
36
36
  this.emitter = new events_1.default();
37
- __classPrivateFieldSet(this, _Web3LedgerServiceSolana_blockchainService, blockchainService, "f");
37
+ __classPrivateFieldSet(this, _Web3LedgerServiceSolana_service, blockchainService, "f");
38
38
  this.getLedgerTransport = getLedgerTransport;
39
39
  }
40
40
  getAccounts(transport, untilIndexByBlockchainService) {
41
41
  return __awaiter(this, void 0, void 0, function* () {
42
- const accountsByBlockchainService = yield (0, blockchain_service_1.generateAccountForBlockchainService)([__classPrivateFieldGet(this, _Web3LedgerServiceSolana_blockchainService, "f")], (_service, index) => __awaiter(this, void 0, void 0, function* () {
42
+ const accountsByBlockchainService = yield (0, blockchain_service_1.generateAccountForBlockchainService)([__classPrivateFieldGet(this, _Web3LedgerServiceSolana_service, "f")], (_service, index) => __awaiter(this, void 0, void 0, function* () {
43
43
  return this.getAccount(transport, index);
44
44
  }), untilIndexByBlockchainService);
45
- const accounts = accountsByBlockchainService.get(__classPrivateFieldGet(this, _Web3LedgerServiceSolana_blockchainService, "f").name);
45
+ const accounts = accountsByBlockchainService.get(__classPrivateFieldGet(this, _Web3LedgerServiceSolana_service, "f").name);
46
46
  return accounts !== null && accounts !== void 0 ? accounts : [];
47
47
  });
48
48
  }
49
49
  getAccount(transport, index) {
50
50
  return __awaiter(this, void 0, void 0, function* () {
51
51
  const ledgerApp = new hw_app_solana_1.default(transport);
52
- const bip44Path = BSSolanaHelper_1.BSSolanaHelper.getBip44Path(__classPrivateFieldGet(this, _Web3LedgerServiceSolana_blockchainService, "f").bip44DerivationPath, index);
52
+ const bip44Path = BSSolanaHelper_1.BSSolanaHelper.getBip44Path(__classPrivateFieldGet(this, _Web3LedgerServiceSolana_service, "f").bip44DerivationPath, index);
53
53
  const publicKey = yield blockchain_service_1.BSUtilsHelper.retry(() => __awaiter(this, void 0, void 0, function* () {
54
54
  const response = yield ledgerApp.getAddress(bip44Path);
55
55
  return new web3_js_1.default.PublicKey(response.address);
@@ -61,7 +61,7 @@ class Web3LedgerServiceSolana {
61
61
  type: 'publicKey',
62
62
  bip44Path,
63
63
  isHardware: true,
64
- blockchain: __classPrivateFieldGet(this, _Web3LedgerServiceSolana_blockchainService, "f").name,
64
+ blockchain: __classPrivateFieldGet(this, _Web3LedgerServiceSolana_service, "f").name,
65
65
  };
66
66
  });
67
67
  }
@@ -69,7 +69,7 @@ class Web3LedgerServiceSolana {
69
69
  return __awaiter(this, void 0, void 0, function* () {
70
70
  var _a, _b;
71
71
  if (!account.bip44Path)
72
- throw new Error('Account must have bip44Path to sign with Ledger');
72
+ throw new Error('TBSAccount must have bip44Path to sign with Ledger');
73
73
  const ledgerApp = new hw_app_solana_1.default(transport);
74
74
  const serializedTransaction = transaction.compileMessage().serialize();
75
75
  (_a = this.emitter) === null || _a === void 0 ? void 0 : _a.emit('getSignatureStart');
@@ -82,4 +82,4 @@ class Web3LedgerServiceSolana {
82
82
  }
83
83
  }
84
84
  exports.Web3LedgerServiceSolana = Web3LedgerServiceSolana;
85
- _Web3LedgerServiceSolana_blockchainService = new WeakMap();
85
+ _Web3LedgerServiceSolana_service = new WeakMap();
@@ -1,9 +1,9 @@
1
- import { GetNftParam, GetNftsByAddressParams, HasTokenParam, Network, NftDataService, NftResponse, NftsResponse } from '@cityofzion/blockchain-service';
2
- import { BSSolanaNetworkId } from '../../constants/BSSolanaConstants';
3
- export declare class TatumRpcNDSSolana implements NftDataService {
1
+ import { TGetNftParam, TGetNftsByAddressParams, THasTokenParam, INftDataService, TNftResponse, TNftsResponse } from '@cityofzion/blockchain-service';
2
+ import { IBSSolana } from '../../types';
3
+ export declare class TatumRpcNDSSolana<N extends string> implements INftDataService {
4
4
  #private;
5
- constructor(network: Network<BSSolanaNetworkId>, mainnetApiKey: string, testnetApiKey: string);
6
- getNft(params: GetNftParam): Promise<NftResponse>;
7
- getNftsByAddress({ address }: GetNftsByAddressParams): Promise<NftsResponse>;
8
- hasToken({ address, collectionHash }: HasTokenParam): Promise<boolean>;
5
+ constructor(service: IBSSolana<N>);
6
+ getNft(params: TGetNftParam): Promise<TNftResponse>;
7
+ getNftsByAddress({ address }: TGetNftsByAddressParams): Promise<TNftsResponse>;
8
+ hasToken({ address, collectionHash }: THasTokenParam): Promise<boolean>;
9
9
  }
@@ -19,21 +19,18 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
19
19
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
20
20
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
21
21
  };
22
- var _TatumRpcNDSSolana_network, _TatumRpcNDSSolana_connection, _TatumRpcNDSSolana_metaplex;
22
+ var _TatumRpcNDSSolana_connection, _TatumRpcNDSSolana_metaplex;
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.TatumRpcNDSSolana = void 0;
25
25
  const web3_js_1 = require("@solana/web3.js");
26
26
  const js_1 = require("@metaplex-foundation/js");
27
27
  const BSSolanaCachedMethodsHelper_1 = require("../../helpers/BSSolanaCachedMethodsHelper");
28
28
  const TatumRpcBDSSolana_1 = require("../blockchain-data/TatumRpcBDSSolana");
29
- const BSSolanaHelper_1 = require("../../helpers/BSSolanaHelper");
30
29
  class TatumRpcNDSSolana {
31
- constructor(network, mainnetApiKey, testnetApiKey) {
32
- _TatumRpcNDSSolana_network.set(this, void 0);
30
+ constructor(service) {
33
31
  _TatumRpcNDSSolana_connection.set(this, void 0);
34
32
  _TatumRpcNDSSolana_metaplex.set(this, void 0);
35
- __classPrivateFieldSet(this, _TatumRpcNDSSolana_network, network, "f");
36
- __classPrivateFieldSet(this, _TatumRpcNDSSolana_connection, TatumRpcBDSSolana_1.TatumRpcBDSSolana.getTatumConnection(__classPrivateFieldGet(this, _TatumRpcNDSSolana_network, "f"), BSSolanaHelper_1.BSSolanaHelper.isMainnet(network) ? mainnetApiKey : testnetApiKey), "f");
33
+ __classPrivateFieldSet(this, _TatumRpcNDSSolana_connection, TatumRpcBDSSolana_1.TatumRpcBDSSolana.getConnection(service.network), "f");
37
34
  __classPrivateFieldSet(this, _TatumRpcNDSSolana_metaplex, js_1.Metaplex.make(__classPrivateFieldGet(this, _TatumRpcNDSSolana_connection, "f")), "f");
38
35
  }
39
36
  getNft(params) {
@@ -126,4 +123,4 @@ class TatumRpcNDSSolana {
126
123
  }
127
124
  }
128
125
  exports.TatumRpcNDSSolana = TatumRpcNDSSolana;
129
- _TatumRpcNDSSolana_network = new WeakMap(), _TatumRpcNDSSolana_connection = new WeakMap(), _TatumRpcNDSSolana_metaplex = new WeakMap();
126
+ _TatumRpcNDSSolana_connection = new WeakMap(), _TatumRpcNDSSolana_metaplex = new WeakMap();
@@ -0,0 +1,4 @@
1
+ import { IBlockchainService, IBSWithExplorer, IBSWithFee, IBSWithLedger, IBSWithNameService, IBSWithNft, TBSNetworkId } from '@cityofzion/blockchain-service';
2
+ export type TBSSolanaNetworkId = TBSNetworkId<'mainnet-beta' | 'devnet'>;
3
+ export interface IBSSolana<N extends string = string> extends IBlockchainService<N, TBSSolanaNetworkId>, IBSWithFee<N>, IBSWithNameService, IBSWithLedger<N>, IBSWithNft, IBSWithExplorer {
4
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cityofzion/bs-solana",
3
- "version": "2.0.2",
3
+ "version": "2.0.4",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": "https://github.com/CityOfZion/blockchain-services",
@@ -10,34 +10,33 @@
10
10
  "/dist"
11
11
  ],
12
12
  "dependencies": {
13
- "@solana/web3.js": "~1.98.0",
14
- "axios": "~1.11.0",
13
+ "@solana/web3.js": "~1.98.4",
14
+ "axios": "~1.12.2",
15
15
  "bip39": "~3.1.0",
16
16
  "micro-key-producer": "~0.7.5",
17
17
  "bs58": "~6.0.0",
18
- "@solana/spl-token": "~0.4.12",
19
- "@bonfida/spl-name-service": "~3.0.9",
20
- "@ledgerhq/hw-app-solana": "~7.2.4",
21
- "@ledgerhq/hw-transport": "~6.30.5",
18
+ "@solana/spl-token": "~0.4.14",
19
+ "@bonfida/spl-name-service": "~3.0.16",
20
+ "@ledgerhq/hw-app-solana": "~7.5.4",
21
+ "@ledgerhq/hw-transport": "~6.31.11",
22
22
  "@metaplex-foundation/js": "~0.20.1",
23
- "dayjs": "~1.11.13",
24
- "@cityofzion/blockchain-service": "1.21.2"
23
+ "date-fns": "~4.1.0",
24
+ "@cityofzion/blockchain-service": "1.22.1"
25
25
  },
26
26
  "devDependencies": {
27
- "@ledgerhq/hw-transport-node-hid": "~6.28.5",
28
- "@types/jest": "29.5.3",
29
- "@typescript-eslint/eslint-plugin": "^6.5.0",
30
- "@typescript-eslint/parser": "^6.5.0",
31
- "eslint": "^8.48.0",
32
- "jest": "29.6.2",
33
- "ts-jest": "29.1.1",
27
+ "@ledgerhq/hw-transport-node-hid": "~6.29.12",
28
+ "@types/jest": "~30.0.0",
29
+ "eslint": "~9.36.0",
30
+ "jest": "~30.1.3",
31
+ "ts-jest": "~29.4.4",
34
32
  "ts-node": "~10.9.2",
35
- "typescript": "5.7.3"
33
+ "typescript": "~5.9.2"
36
34
  },
37
35
  "scripts": {
38
- "build": "tsc --project tsconfig.build.json",
39
- "test": "jest --config jest.config.ts",
36
+ "build": "rm -rf ./dist && tsc --project tsconfig.build.json",
37
+ "test": "jest -i --config jest.config.ts",
40
38
  "lint": "eslint .",
41
- "format": "eslint --fix"
39
+ "format": "eslint --fix",
40
+ "package": "npm run build && npm pack"
42
41
  }
43
42
  }