@cryptorubic/web3 0.8.17-alpha.solana.1 → 0.8.17-alpha.solana.3
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/package.json +3 -3
- package/src/lib/adapter/adapters/models/adapter-factory-params.d.ts +9 -0
- package/src/lib/adapter/adapters/models/adapter-factory-params.js +2 -0
- package/src/lib/adapter/adapters/models/solana-adapter-config.d.ts +3 -0
- package/src/lib/adapter/adapters/models/solana-adapter-config.js +2 -0
- package/src/lib/adapter/adapters/solana-adapter.d.ts +4 -1
- package/src/lib/adapter/adapters/solana-adapter.js +3 -1
- package/src/lib/adapter/adapters/utils/solana-api-service.d.ts +18 -0
- package/src/lib/adapter/adapters/utils/solana-api-service.js +49 -0
- package/src/lib/adapter/blockchain-adapter-factory.service.d.ts +4 -6
- package/src/lib/adapter/blockchain-adapter-factory.service.js +17 -18
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cryptorubic/web3",
|
|
3
|
-
"version": "0.8.17-alpha.solana.
|
|
3
|
+
"version": "0.8.17-alpha.solana.3",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"tslib": "^2.3.0",
|
|
6
6
|
"bignumber.js": "9.1.2",
|
|
7
|
-
"@cryptorubic/core": "0.8.17-alpha.solana.
|
|
7
|
+
"@cryptorubic/core": "0.8.17-alpha.solana.3",
|
|
8
8
|
"viem": "^2.19.1",
|
|
9
9
|
"web3-utils": "^4.3.1",
|
|
10
10
|
"@ton/ton": "^15.1.0",
|
|
11
11
|
"@solana/web3.js": "1.95.3",
|
|
12
12
|
"@solflare-wallet/utl-sdk": "^1.4.0",
|
|
13
13
|
"@ethersproject/bignumber": "^5.7.0",
|
|
14
|
-
"@cryptorubic/tron-types": "0.8.17-alpha.solana.
|
|
14
|
+
"@cryptorubic/tron-types": "0.8.17-alpha.solana.3",
|
|
15
15
|
"bitcoin-address-validation": "^2.2.3",
|
|
16
16
|
"axios": "0.27.2",
|
|
17
17
|
"crc-32": "^1.2.2",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { HttpClient, ICustomLogger } from '@cryptorubic/core';
|
|
2
|
+
import { SolanaAdapterConfig } from './solana-adapter-config';
|
|
3
|
+
import { TonAdapterConfig } from './ton-adapter-config';
|
|
4
|
+
export interface AdaptersFactoryParams {
|
|
5
|
+
tonParams: TonAdapterConfig;
|
|
6
|
+
solanaParams: SolanaAdapterConfig;
|
|
7
|
+
httpClient?: HttpClient;
|
|
8
|
+
createLogger?: (label: string) => ICustomLogger;
|
|
9
|
+
}
|
|
@@ -5,11 +5,14 @@ import { HttpClient, ICustomLogger, PriceTokenAmount, SolanaBlockchainName, Toke
|
|
|
5
5
|
import BigNumber from 'bignumber.js';
|
|
6
6
|
import { SolanaRawInstruction } from './models/solana-web3-types';
|
|
7
7
|
import { SolanaTxConfig } from '../../utils/models/solana-transaction-config';
|
|
8
|
+
import { SolanaApiService } from './utils/solana-api-service';
|
|
9
|
+
import { SolanaAdapterConfig } from './models/solana-adapter-config';
|
|
8
10
|
export declare const NATIVE_SOLANA_MINT_ADDRESS = "So11111111111111111111111111111111111111111";
|
|
9
11
|
export declare const DEFAULT_CU_LIMIT = 600000;
|
|
10
12
|
export declare class SolanaAdapter extends AbstractAdapter<Connection, Connection, SolanaBlockchainName> {
|
|
11
13
|
private readonly httpClient;
|
|
12
|
-
|
|
14
|
+
readonly apiService: SolanaApiService;
|
|
15
|
+
constructor(rpcList: string[], httpClient: HttpClient, solanaConfig: SolanaAdapterConfig, logger?: ICustomLogger);
|
|
13
16
|
private createPublicClient;
|
|
14
17
|
read<T>(_address: string, _abi: Abi, _method: string, _methodArgs?: unknown[]): Promise<T>;
|
|
15
18
|
write<T>(_address: string, _abi: Abi, _method: string, _methodArgs?: unknown[]): Promise<T>;
|
|
@@ -10,13 +10,15 @@ const bignumber_js_1 = require("bignumber.js");
|
|
|
10
10
|
const solana_tokens_service_1 = require("./utils/solana-tokens-service");
|
|
11
11
|
const bs58_1 = require("bs58");
|
|
12
12
|
const utils_1 = require("ethers/lib/utils");
|
|
13
|
+
const solana_api_service_1 = require("./utils/solana-api-service");
|
|
13
14
|
exports.NATIVE_SOLANA_MINT_ADDRESS = 'So11111111111111111111111111111111111111111';
|
|
14
15
|
exports.DEFAULT_CU_LIMIT = 600000;
|
|
15
16
|
class SolanaAdapter extends abstract_adapter_1.AbstractAdapter {
|
|
16
|
-
constructor(rpcList, httpClient, logger) {
|
|
17
|
+
constructor(rpcList, httpClient, solanaConfig, logger) {
|
|
17
18
|
super(core_1.BLOCKCHAIN_NAME.SOLANA, logger);
|
|
18
19
|
this.httpClient = httpClient;
|
|
19
20
|
this.public = this.createPublicClient(rpcList);
|
|
21
|
+
this.apiService = new solana_api_service_1.SolanaApiService(httpClient, this.public, solanaConfig);
|
|
20
22
|
}
|
|
21
23
|
createPublicClient(rpcList) {
|
|
22
24
|
if (!rpcList?.[0]) {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { HttpClient } from '@cryptorubic/core';
|
|
2
|
+
import { Connection, VersionedTransaction } from '@solana/web3.js';
|
|
3
|
+
import { SolanaAdapterConfig } from '../models/solana-adapter-config';
|
|
4
|
+
export declare class SolanaApiService {
|
|
5
|
+
private httpClient;
|
|
6
|
+
private readonly connection;
|
|
7
|
+
private readonly HELIUS_API_URL;
|
|
8
|
+
private readonly HELIUS_API_KEY;
|
|
9
|
+
constructor(httpClient: HttpClient, connection: Connection, solanaConfig: SolanaAdapterConfig);
|
|
10
|
+
/**
|
|
11
|
+
* @returns ComputedUnitsLimit - like gasLimit in evm
|
|
12
|
+
*/
|
|
13
|
+
getConsumedUnitsLimit(tx: VersionedTransaction): Promise<number>;
|
|
14
|
+
/**
|
|
15
|
+
* @returns ComputedUnitsPrice - like gasPrice in evm
|
|
16
|
+
*/
|
|
17
|
+
getConsumedUnitsPrice(tx: VersionedTransaction): Promise<number>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SolanaApiService = void 0;
|
|
4
|
+
const utils_1 = require("ethers/lib/utils");
|
|
5
|
+
class SolanaApiService {
|
|
6
|
+
constructor(httpClient, connection, solanaConfig) {
|
|
7
|
+
this.httpClient = httpClient;
|
|
8
|
+
this.connection = connection;
|
|
9
|
+
this.HELIUS_API_URL = 'https://mainnet.helius-rpc.com';
|
|
10
|
+
this.HELIUS_API_KEY = solanaConfig.heliusApiKey;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* @returns ComputedUnitsLimit - like gasLimit in evm
|
|
14
|
+
*/
|
|
15
|
+
async getConsumedUnitsLimit(tx) {
|
|
16
|
+
const DEFAULT_CU_LIMIT = 600000;
|
|
17
|
+
try {
|
|
18
|
+
const resp = await this.connection.simulateTransaction(tx, {
|
|
19
|
+
replaceRecentBlockhash: true
|
|
20
|
+
});
|
|
21
|
+
return resp.value.unitsConsumed ? resp.value.unitsConsumed * 1.2 : DEFAULT_CU_LIMIT;
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
console.error('Solana_simulateTransaction_Error ==> ', err);
|
|
25
|
+
return DEFAULT_CU_LIMIT;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* @returns ComputedUnitsPrice - like gasPrice in evm
|
|
30
|
+
*/
|
|
31
|
+
async getConsumedUnitsPrice(tx) {
|
|
32
|
+
if (!this.HELIUS_API_KEY) {
|
|
33
|
+
throw new Error('[SolanaApiService_getConsumedUnitsPrice] params.solanaParams.heliusApiKey is not provided in "createFactory" method to use this method');
|
|
34
|
+
}
|
|
35
|
+
const resp = await this.httpClient.post(`${this.HELIUS_API_URL}/?api-key=${this.HELIUS_API_KEY}`, {
|
|
36
|
+
jsonrpc: '2.0',
|
|
37
|
+
id: '1',
|
|
38
|
+
method: 'getPriorityFeeEstimate',
|
|
39
|
+
params: [
|
|
40
|
+
{
|
|
41
|
+
transaction: utils_1.base58.encode(tx.serialize()), // Pass the serialized transaction in Base58
|
|
42
|
+
options: { priorityLevel: 'Medium' }
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
});
|
|
46
|
+
return resp.result.priorityFeeEstimate;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.SolanaApiService = SolanaApiService;
|
|
@@ -2,21 +2,19 @@ import { SolanaAdapter } from './adapters/solana-adapter';
|
|
|
2
2
|
import { TronAdapter } from './adapters/tron-adapter';
|
|
3
3
|
import { AbstractAdapter } from './adapters/abstract-adapter';
|
|
4
4
|
import { WalletProvider } from './constants/models/wallet-provider';
|
|
5
|
-
import { BlockchainName, EvmBlockchainName, SolanaBlockchainName, TronBlockchainName, ICustomLogger,
|
|
5
|
+
import { BlockchainName, EvmBlockchainName, SolanaBlockchainName, TronBlockchainName, ICustomLogger, TonBlockchainName, BitcoinBlockchainName, SuiBlockchainName } from '@cryptorubic/core';
|
|
6
6
|
import { TonAdapter } from './adapters/ton-adapter';
|
|
7
|
-
import { TonAdapterConfig } from './adapters/models/ton-adapter-config';
|
|
8
7
|
import { EvmAdapter } from './adapters/evm-adapter';
|
|
9
8
|
import { BitcoinAdapter } from './adapters/bitcoin-adapter';
|
|
10
9
|
import { SuiAdapter } from './adapters/sui-adapter';
|
|
10
|
+
import { AdaptersFactoryParams } from './adapters/models/adapter-factory-params';
|
|
11
11
|
export declare class BlockchainAdapterFactoryService {
|
|
12
12
|
private readonly rpcList;
|
|
13
|
-
private readonly
|
|
14
|
-
private readonly httpClient?;
|
|
15
|
-
private readonly tonParams?;
|
|
13
|
+
private readonly params;
|
|
16
14
|
readonly adapterStore: Partial<Record<BlockchainName, AbstractAdapter<unknown, unknown, BlockchainName>>>;
|
|
17
15
|
protected readonly logger?: ICustomLogger;
|
|
18
16
|
private constructor();
|
|
19
|
-
static createFactory(rpcList: Partial<Record<EvmBlockchainName, string[]>>,
|
|
17
|
+
static createFactory(rpcList: Partial<Record<EvmBlockchainName, string[]>>, params: AdaptersFactoryParams): Promise<BlockchainAdapterFactoryService>;
|
|
20
18
|
getAdapter(blockchain: SolanaBlockchainName): SolanaAdapter;
|
|
21
19
|
getAdapter(blockchain: EvmBlockchainName): EvmAdapter;
|
|
22
20
|
getAdapter(blockchain: TronBlockchainName): TronAdapter;
|
|
@@ -11,22 +11,21 @@ const evm_adapter_1 = require("./adapters/evm-adapter");
|
|
|
11
11
|
const bitcoin_adapter_1 = require("./adapters/bitcoin-adapter");
|
|
12
12
|
const sui_adapter_1 = require("./adapters/sui-adapter");
|
|
13
13
|
class BlockchainAdapterFactoryService {
|
|
14
|
-
constructor(rpcList,
|
|
14
|
+
constructor(rpcList, params) {
|
|
15
15
|
this.rpcList = rpcList;
|
|
16
|
-
this.
|
|
17
|
-
this.httpClient = httpClient;
|
|
18
|
-
this.tonParams = tonParams;
|
|
16
|
+
this.params = params;
|
|
19
17
|
this.adapterStore = {};
|
|
20
18
|
this.adapterStore = this.createStorage();
|
|
21
|
-
if (this.createLogger) {
|
|
22
|
-
this.logger = this.createLogger('BlockchainAdapterFactory');
|
|
19
|
+
if (this.params.createLogger) {
|
|
20
|
+
this.logger = this.params.createLogger('BlockchainAdapterFactory');
|
|
23
21
|
}
|
|
24
22
|
}
|
|
25
|
-
static async createFactory(rpcList,
|
|
23
|
+
static async createFactory(rpcList, params) {
|
|
26
24
|
// @TODO Add default logger
|
|
27
|
-
const loggerFn = createLogger || undefined;
|
|
28
|
-
const resolvedHttpClient = httpClient ?? (await Promise.resolve().then(() => require('axios')));
|
|
29
|
-
|
|
25
|
+
const loggerFn = params.createLogger || undefined;
|
|
26
|
+
const resolvedHttpClient = params.httpClient ?? (await Promise.resolve().then(() => require('axios')));
|
|
27
|
+
params.httpClient = resolvedHttpClient;
|
|
28
|
+
return new this(rpcList, params);
|
|
30
29
|
}
|
|
31
30
|
getAdapter(blockchain) {
|
|
32
31
|
const adapter = this.adapterStore?.[blockchain];
|
|
@@ -64,24 +63,24 @@ class BlockchainAdapterFactoryService {
|
|
|
64
63
|
return new evm_adapter_1.EvmAdapter({
|
|
65
64
|
blockchain: blockchain,
|
|
66
65
|
rpcList: rpcs
|
|
67
|
-
}, this.createLogger?.(`EVM_ADAPTER_${blockchain}`));
|
|
66
|
+
}, this.params.createLogger?.(`EVM_ADAPTER_${blockchain}`));
|
|
68
67
|
}
|
|
69
68
|
}
|
|
70
69
|
if (blockchainType === core_1.CHAIN_TYPE.TRON) {
|
|
71
|
-
return new tron_adapter_1.TronAdapter(rpcs, this.createLogger?.(`TRON_ADAPTER`));
|
|
70
|
+
return new tron_adapter_1.TronAdapter(rpcs, this.params.createLogger?.(`TRON_ADAPTER`));
|
|
72
71
|
}
|
|
73
72
|
if (blockchainType === core_1.CHAIN_TYPE.SUI) {
|
|
74
|
-
return new sui_adapter_1.SuiAdapter(rpcs, this.createLogger?.(`SUI_ADAPTER`));
|
|
73
|
+
return new sui_adapter_1.SuiAdapter(rpcs, this.params.createLogger?.(`SUI_ADAPTER`));
|
|
75
74
|
}
|
|
76
75
|
if (blockchainType === core_1.CHAIN_TYPE.SOLANA) {
|
|
77
|
-
return new solana_adapter_1.SolanaAdapter(rpcs, this.httpClient, this.createLogger?.(`SOLANA_ADAPTER`));
|
|
76
|
+
return new solana_adapter_1.SolanaAdapter(rpcs, this.params.httpClient, this.params.solanaParams, this.params.createLogger?.(`SOLANA_ADAPTER`));
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
|
-
if (blockchain === core_1.BLOCKCHAIN_NAME.TON && this.tonParams?.tonApiConfig && this.tonParams?.tonClientConfig) {
|
|
81
|
-
return new ton_adapter_1.TonAdapter(this.httpClient, this.tonParams, this.createLogger?.(`TON_ADAPTER`));
|
|
79
|
+
if (blockchain === core_1.BLOCKCHAIN_NAME.TON && this.params.tonParams?.tonApiConfig && this.params.tonParams?.tonClientConfig) {
|
|
80
|
+
return new ton_adapter_1.TonAdapter(this.params.httpClient, this.params.tonParams, this.params.createLogger?.(`TON_ADAPTER`));
|
|
82
81
|
}
|
|
83
|
-
if (blockchain === core_1.BLOCKCHAIN_NAME.BITCOIN && this.httpClient) {
|
|
84
|
-
return new bitcoin_adapter_1.BitcoinAdapter(this.httpClient, this.createLogger?.(`BTC_ADAPTER`));
|
|
82
|
+
if (blockchain === core_1.BLOCKCHAIN_NAME.BITCOIN && this.params.httpClient) {
|
|
83
|
+
return new bitcoin_adapter_1.BitcoinAdapter(this.params.httpClient, this.params.createLogger?.(`BTC_ADAPTER`));
|
|
85
84
|
}
|
|
86
85
|
return null;
|
|
87
86
|
}
|