@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.
- package/dist/BSSolana.d.ts +27 -28
- package/dist/BSSolana.js +48 -24
- package/dist/constants/BSSolanaConstants.d.ts +9 -13
- package/dist/constants/BSSolanaConstants.js +15 -21
- package/dist/helpers/BSSolanaCachedMethodsHelper.js +2 -2
- package/dist/helpers/BSSolanaHelper.d.ts +3 -3
- package/dist/helpers/BSSolanaHelper.js +3 -3
- package/dist/index.d.ts +11 -0
- package/dist/index.js +27 -0
- package/dist/services/blockchain-data/TatumRpcBDSSolana.d.ts +13 -14
- package/dist/services/blockchain-data/TatumRpcBDSSolana.js +25 -62
- package/dist/services/exchange/MoralisEDSSolana.d.ts +6 -6
- package/dist/services/exchange/MoralisEDSSolana.js +18 -14
- package/dist/services/explorer/SolScanESSolana.d.ts +5 -5
- package/dist/services/explorer/SolScanESSolana.js +9 -9
- package/dist/services/ledger/Web3LedgerServiceSolana.d.ts +9 -9
- package/dist/services/ledger/Web3LedgerServiceSolana.js +9 -9
- package/dist/services/nft-data/TatumRpcNDSSolana.d.ts +7 -7
- package/dist/services/nft-data/TatumRpcNDSSolana.js +4 -7
- package/dist/types.d.ts +4 -0
- package/dist/types.js +2 -0
- package/package.json +19 -20
package/dist/BSSolana.d.ts
CHANGED
|
@@ -1,36 +1,35 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
5
|
-
|
|
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:
|
|
12
|
-
bip44DerivationPath: string;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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:
|
|
24
|
-
setNetwork(
|
|
25
|
-
|
|
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):
|
|
29
|
-
generateAccountFromKey(key: string):
|
|
30
|
-
generateAccountFromPublicKey(publicKey: string):
|
|
31
|
-
transfer(param:
|
|
32
|
-
calculateTransferFee(param:
|
|
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,
|
|
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,
|
|
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.
|
|
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
|
|
95
|
-
this.nftDataService = new TatumRpcNDSSolana_1.TatumRpcNDSSolana(this
|
|
96
|
-
this.explorerService = new SolScanESSolana_1.SolScanESSolana(this
|
|
97
|
-
this.exchangeDataService = new MoralisEDSSolana_1.MoralisEDSSolana(this
|
|
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
|
-
|
|
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
|
|
103
|
-
|
|
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
|
|
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(),
|
|
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 {
|
|
2
|
-
|
|
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
|
|
5
|
-
static
|
|
6
|
-
static
|
|
7
|
-
static
|
|
8
|
-
static
|
|
9
|
-
static
|
|
10
|
-
static
|
|
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.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
]
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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 (
|
|
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 (
|
|
85
|
+
catch (_c) {
|
|
86
86
|
/* empty */
|
|
87
87
|
}
|
|
88
88
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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;
|
package/dist/index.d.ts
ADDED
|
@@ -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 {
|
|
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
|
-
|
|
3
|
+
import { IBSSolana, TBSSolanaNetworkId } from '../../types';
|
|
4
|
+
export declare class TatumRpcBDSSolana<N extends string> implements IBlockchainDataService {
|
|
5
5
|
#private;
|
|
6
|
-
static
|
|
7
|
-
static
|
|
8
|
-
maxTimeToConfirmTransactionInMs: number;
|
|
9
|
-
constructor(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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<
|
|
16
|
-
getBalance(address: string): Promise<
|
|
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,
|
|
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
|
|
69
|
-
return new web3_js_1.default.Connection(
|
|
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':
|
|
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(
|
|
77
|
+
constructor(service) {
|
|
76
78
|
_TatumRpcBDSSolana_instances.add(this);
|
|
77
|
-
this.maxTimeToConfirmTransactionInMs = 1000 * 60;
|
|
78
|
-
|
|
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,
|
|
93
|
-
__classPrivateFieldSet(this,
|
|
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,
|
|
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
|
|
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
|
-
|
|
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.
|
|
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,
|
|
2
|
-
import {
|
|
3
|
-
export declare class MoralisEDSSolana extends
|
|
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(
|
|
6
|
-
getTokenPrices({ tokens }:
|
|
7
|
-
getTokenPriceHistory(params:
|
|
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
|
|
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
|
|
32
|
+
const sub_1 = require("date-fns/sub");
|
|
33
33
|
class MoralisEDSSolana extends blockchain_service_1.CryptoCompareEDS {
|
|
34
|
-
constructor(
|
|
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,
|
|
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':
|
|
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.
|
|
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.
|
|
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 =
|
|
84
|
-
const fromDate = (0,
|
|
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:
|
|
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
|
-
|
|
108
|
+
_MoralisEDSSolana_client = new WeakMap(), _MoralisEDSSolana_service = new WeakMap(), _MoralisEDSSolana_pairAddressCache = new WeakMap();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
export declare class SolScanESSolana implements
|
|
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(
|
|
5
|
+
constructor(service: IBSSolana<N>);
|
|
6
6
|
buildTransactionUrl(hash: string): string;
|
|
7
7
|
buildContractUrl(contractHash: string): string;
|
|
8
|
-
buildNftUrl({ tokenHash }:
|
|
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,
|
|
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(
|
|
18
|
+
constructor(service) {
|
|
19
19
|
_SolScanESSolana_baseUrl.set(this, 'https://solscan.io');
|
|
20
20
|
_SolScanESSolana_queryParams.set(this, '');
|
|
21
|
-
|
|
22
|
-
if (!BSSolanaHelper_1.BSSolanaHelper.
|
|
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,
|
|
25
|
+
__classPrivateFieldSet(this, _SolScanESSolana_service, service, "f");
|
|
26
26
|
}
|
|
27
27
|
buildTransactionUrl(hash) {
|
|
28
|
-
return `${__classPrivateFieldGet(this, _SolScanESSolana_baseUrl, "f")}/tx/${__classPrivateFieldGet(this,
|
|
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,
|
|
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(),
|
|
50
|
+
_SolScanESSolana_baseUrl = new WeakMap(), _SolScanESSolana_queryParams = new WeakMap(), _SolScanESSolana_service = new WeakMap();
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
4
|
+
import { IBSSolana } from '../../types';
|
|
5
|
+
export declare class Web3LedgerServiceSolana<N extends string = string> implements ILedgerService<N> {
|
|
6
6
|
#private;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
constructor(blockchainService:
|
|
10
|
-
getAccounts(transport: Transport, untilIndexByBlockchainService?:
|
|
11
|
-
getAccount(transport: Transport, index: number): Promise<
|
|
12
|
-
signTransaction(transport: Transport, transaction: solanaSDK.Transaction, account:
|
|
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
|
|
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
|
-
|
|
35
|
+
_Web3LedgerServiceSolana_service.set(this, void 0);
|
|
36
36
|
this.emitter = new events_1.default();
|
|
37
|
-
__classPrivateFieldSet(this,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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('
|
|
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
|
-
|
|
85
|
+
_Web3LedgerServiceSolana_service = new WeakMap();
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
export declare class TatumRpcNDSSolana implements
|
|
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(
|
|
6
|
-
getNft(params:
|
|
7
|
-
getNftsByAddress({ address }:
|
|
8
|
-
hasToken({ address, collectionHash }:
|
|
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
|
|
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(
|
|
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,
|
|
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
|
-
|
|
126
|
+
_TatumRpcNDSSolana_connection = new WeakMap(), _TatumRpcNDSSolana_metaplex = new WeakMap();
|
package/dist/types.d.ts
ADDED
|
@@ -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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cityofzion/bs-solana",
|
|
3
|
-
"version": "2.0.
|
|
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.
|
|
14
|
-
"axios": "~1.
|
|
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.
|
|
19
|
-
"@bonfida/spl-name-service": "~3.0.
|
|
20
|
-
"@ledgerhq/hw-app-solana": "~7.
|
|
21
|
-
"@ledgerhq/hw-transport": "~6.
|
|
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
|
-
"
|
|
24
|
-
"@cityofzion/blockchain-service": "1.
|
|
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
|
-
"@types/jest": "
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
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.
|
|
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
|
}
|