rubic-sdk 5.50.5-alpha.solana.4 → 5.50.5-alpha.solana.40
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/lib/common/tokens/token.d.ts +2 -0
- package/lib/common/tokens/token.js +5 -2
- package/lib/common/tokens/token.js.map +1 -1
- package/lib/core/blockchain/web3-private-service/web3-private/solana-web3-private/models/solana-transaction-options.d.ts +1 -0
- package/lib/core/blockchain/web3-private-service/web3-private/solana-web3-private/solana-web3-private.d.ts +3 -1
- package/lib/core/blockchain/web3-private-service/web3-private/solana-web3-private/solana-web3-private.js +31 -2
- package/lib/core/blockchain/web3-private-service/web3-private/solana-web3-private/solana-web3-private.js.map +1 -1
- package/lib/core/blockchain/web3-public-service/web3-public/models/supported-token-field.d.ts +1 -1
- package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/models/solana-token.d.ts +6 -0
- package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/services/solana-tokens-api-service.d.ts +0 -6
- package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/services/solana-tokens-api-service.js +0 -31
- package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/services/solana-tokens-api-service.js.map +1 -1
- package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/services/solana-tokens-service.d.ts +14 -0
- package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/services/solana-tokens-service.js +106 -0
- package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/services/solana-tokens-service.js.map +1 -0
- package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/solana-web3-public.d.ts +13 -3
- package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/solana-web3-public.js +73 -71
- package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/solana-web3-public.js.map +1 -1
- package/lib/core/blockchain/web3-public-service/web3-public/web3-public.js +0 -10
- package/lib/core/blockchain/web3-public-service/web3-public/web3-public.js.map +1 -1
- package/lib/features/common/models/swap-transaction-options.d.ts +1 -0
- package/lib/features/common/providers/dln/dln-api-service.d.ts +1 -1
- package/lib/features/common/providers/dln/dln-api-service.js +14 -10
- package/lib/features/common/providers/dln/dln-api-service.js.map +1 -1
- package/lib/features/common/providers/unizen/services/unizen-api-service.js +3 -3
- package/lib/features/common/providers/unizen/services/unizen-api-service.js.map +1 -1
- package/lib/features/cross-chain/calculation-manager/providers/debridge-provider/chains/debridge-solana-cross-chain-trade.js +5 -1
- package/lib/features/cross-chain/calculation-manager/providers/debridge-provider/chains/debridge-solana-cross-chain-trade.js.map +1 -1
- package/lib/features/cross-chain/calculation-manager/providers/lifi-provider/chains/lifi-solana-cross-chain-trade.js +5 -1
- package/lib/features/cross-chain/calculation-manager/providers/lifi-provider/chains/lifi-solana-cross-chain-trade.js.map +1 -1
- package/lib/features/cross-chain/calculation-manager/providers/lifi-provider/services/lifi-api-service.d.ts +0 -1
- package/lib/features/cross-chain/calculation-manager/providers/lifi-provider/services/lifi-api-service.js +2 -6
- package/lib/features/cross-chain/calculation-manager/providers/lifi-provider/services/lifi-api-service.js.map +1 -1
- package/lib/features/on-chain/calculation-manager/providers/aggregators/dln/chains/dln-solana-on-chain-trade.js +1 -1
- package/lib/features/on-chain/calculation-manager/providers/aggregators/dln/chains/dln-solana-on-chain-trade.js.map +1 -1
- package/lib/features/on-chain/calculation-manager/providers/aggregators/dln/constants/dln-on-chain-supported-blockchains.d.ts +1 -1
- package/lib/features/on-chain/calculation-manager/providers/aggregators/dln/constants/dln-on-chain-supported-blockchains.js +8 -8
- package/lib/features/on-chain/calculation-manager/providers/aggregators/dln/constants/dln-on-chain-supported-blockchains.js.map +1 -1
- package/lib/features/on-chain/calculation-manager/providers/aggregators/lifi/chains/lifi-solana-on-chain-trade.js +1 -1
- package/lib/features/on-chain/calculation-manager/providers/aggregators/lifi/chains/lifi-solana-on-chain-trade.js.map +1 -1
- package/lib/features/on-chain/calculation-manager/providers/aggregators/lifi/services/lifi-on-chain-api-service.js +0 -2
- package/lib/features/on-chain/calculation-manager/providers/aggregators/lifi/services/lifi-on-chain-api-service.js.map +1 -1
- package/lib/features/on-chain/calculation-manager/providers/aggregators/okuswap/constants/okuswap-api.d.ts +1 -1
- package/lib/features/on-chain/calculation-manager/providers/aggregators/okuswap/constants/okuswap-api.js +2 -2
- package/lib/features/on-chain/calculation-manager/providers/aggregators/okuswap/constants/okuswap-api.js.map +1 -1
- package/lib/features/on-chain/calculation-manager/providers/aggregators/okuswap/services/okuswap-api-service.js +3 -3
- package/lib/features/on-chain/calculation-manager/providers/aggregators/okuswap/services/okuswap-api-service.js.map +1 -1
- package/lib/features/on-chain/calculation-manager/providers/common/on-chain-aggregator/aggregator-solana-on-chain-trade-abstract.d.ts +1 -1
- package/lib/features/on-chain/calculation-manager/providers/common/on-chain-aggregator/aggregator-solana-on-chain-trade-abstract.js +4 -5
- package/lib/features/on-chain/calculation-manager/providers/common/on-chain-aggregator/aggregator-solana-on-chain-trade-abstract.js.map +1 -1
- package/lib/features/on-chain/calculation-manager/providers/common/on-chain-trade/solana-on-chain-trade/solana-on-chain-trade.js +3 -2
- package/lib/features/on-chain/calculation-manager/providers/common/on-chain-trade/solana-on-chain-trade/solana-on-chain-trade.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
@@ -6,6 +6,7 @@ export type TokenStruct<T extends BlockchainName = BlockchainName> = {
|
|
6
6
|
name: string;
|
7
7
|
symbol: string;
|
8
8
|
decimals: number;
|
9
|
+
image?: string;
|
9
10
|
};
|
10
11
|
/**
|
11
12
|
* Contains main token's fields.
|
@@ -29,6 +30,7 @@ export declare class Token<T extends BlockchainName = BlockchainName> {
|
|
29
30
|
readonly name: string;
|
30
31
|
readonly symbol: string;
|
31
32
|
readonly decimals: number;
|
33
|
+
readonly image: string | undefined;
|
32
34
|
get isNative(): boolean;
|
33
35
|
get isWrapped(): boolean;
|
34
36
|
constructor(tokenStruct: TokenStruct<T>);
|
@@ -39,7 +39,8 @@ class Token {
|
|
39
39
|
...tokenBaseStruct,
|
40
40
|
name: tokenInfo.name,
|
41
41
|
symbol: tokenInfo.symbol,
|
42
|
-
decimals: parseInt(tokenInfo.decimals)
|
42
|
+
decimals: parseInt(tokenInfo.decimals),
|
43
|
+
...('image' in tokenInfo && { image: tokenInfo.image })
|
43
44
|
});
|
44
45
|
}
|
45
46
|
/**
|
@@ -66,7 +67,8 @@ class Token {
|
|
66
67
|
blockchain,
|
67
68
|
name: tokenInfo.name,
|
68
69
|
symbol: tokenInfo.symbol,
|
69
|
-
decimals: parseInt(tokenInfo.decimals)
|
70
|
+
decimals: parseInt(tokenInfo.decimals),
|
71
|
+
...('image' in tokenInfo && { image: tokenInfo.image })
|
70
72
|
});
|
71
73
|
});
|
72
74
|
}
|
@@ -96,6 +98,7 @@ class Token {
|
|
96
98
|
this.name = tokenStruct.name;
|
97
99
|
this.symbol = tokenStruct.symbol;
|
98
100
|
this.decimals = tokenStruct.decimals;
|
101
|
+
this.image = tokenStruct.image;
|
99
102
|
}
|
100
103
|
isEqualTo(token) {
|
101
104
|
return (token.blockchain === this.blockchain && (0, blockchain_1.compareAddresses)(token.address, this.address));
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/common/tokens/token.ts"],"names":[],"mappings":";;;AAAA,uEAAkE;AAClE,6EAA6E;AAE7E,4DAA+D;AAC/D,gFAA6F;AAE7F,kGAA8F;AAC9F,qGAAgG;AAChG,uEAAmE;AACnE,yDAAsD;AAEtD,qEAA+D;
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/common/tokens/token.ts"],"names":[],"mappings":";;;AAAA,uEAAkE;AAClE,6EAA6E;AAE7E,4DAA+D;AAC/D,gFAA6F;AAE7F,kGAA8F;AAC9F,qGAAgG;AAChG,uEAAmE;AACnE,yDAAsD;AAEtD,qEAA+D;AAW/D;;GAEG;AACH,MAAa,KAAK;IACd;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,WAAW,CAC3B,eAAmC;QAEnC,IAAI,eAAe,CAAC,UAAU,KAAK,iCAAe,CAAC,OAAO,EAAE,CAAC;YACzD,OAAO,gCAAgB,CAAC,iCAAe,CAAC,OAAO,CAAa,CAAC;QACjE,CAAC;QACD,IAAI,eAAe,CAAC,UAAU,KAAK,iCAAe,CAAC,GAAG,EAAE,CAAC;YACrD,OAAO,gCAAgB,CAAC,iCAAe,CAAC,GAAG,CAAa,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,uCAAiB,CAAC,qBAAqB,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,+BAAa,CACnB,GAAG,eAAe,CAAC,UAAU,6CAA6C,CAC7E,CAAC;QACN,CAAC;QACD,MAAM,UAAU,GAAG,mBAAQ,CAAC,iBAAiB,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE7E,IACI,SAAS,CAAC,QAAQ,KAAK,SAAS;YAChC,SAAS,CAAC,IAAI,KAAK,SAAS;YAC5B,SAAS,CAAC,MAAM,KAAK,SAAS,EAChC,CAAC;YACC,MAAM,IAAI,+BAAa,CAAC,2BAA2B,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,IAAI,KAAK,CAAC;YACb,GAAG,eAAe;YAClB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;YACtC,GAAG,CAAC,OAAO,IAAI,SAAS,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;SAC1D,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,YAAY,CAC5B,eAAiD,EACjD,UAAa;QAEb,IAAI,CAAC,uCAAiB,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,+BAAa,CAAC,GAAG,UAAU,6CAA6C,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,UAAU,GAAG,mBAAQ,CAAC,iBAAiB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAEtE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;YACtC,IACI,SAAS,CAAC,QAAQ,KAAK,SAAS;gBAChC,SAAS,CAAC,IAAI,KAAK,SAAS;gBAC5B,SAAS,CAAC,MAAM,KAAK,SAAS,EAChC,CAAC;gBACC,MAAM,IAAI,+BAAa,CAAC,2BAA2B,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,MAAM,IAAI,+BAAa,CAAC,2BAA2B,CAAC,CAAC;YACzD,CAAC;YAED,OAAO,IAAI,KAAK,CAAC;gBACb,OAAO;gBACP,UAAU;gBACV,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACtC,GAAG,CAAC,OAAO,IAAI,SAAS,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;aAC1D,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,iBAAiB,CAAC,MAAe;QAC3C,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAcD,IAAW,QAAQ;QACf,MAAM,SAAS,GAAc,kCAAe,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE3E,IAAI,SAAS,IAAI,oBAAQ,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjE,OAAO,oBAAQ,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,KAAK,oBAAQ,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC;IACnE,CAAC;IAED,IAAW,SAAS;QAChB,MAAM,OAAO,GAAG,kCAAc,CAAC,IAAI,CAAC,UAAU,CAAW,CAAC;QAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,IAAA,6BAAgB,EAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,YAAY,WAA2B;QACnC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;IACnC,CAAC;IAEM,SAAS,CAAC,KAAsB;QACnC,OAAO,CACH,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,IAAI,IAAA,6BAAgB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CACxF,CAAC;IACN,CAAC;IAEM,eAAe,CAAC,MAAyB;QAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAEM,KAAK,CAAC,WAAkC;QAC3C,OAAO,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC;CACJ;AA1ID,sBA0IC"}
|
@@ -7,6 +7,8 @@ export declare class SolanaWeb3Private extends Web3Private {
|
|
7
7
|
private readonly solanaWeb3;
|
8
8
|
protected readonly Web3Pure: typeof SolanaWeb3Pure;
|
9
9
|
getBlockchainName(): Promise<BlockchainName | undefined>;
|
10
|
-
sendTransaction(options
|
10
|
+
sendTransaction(options: SolanaTransactionOptions): Promise<string>;
|
11
|
+
private updatePriorityFee;
|
12
|
+
private encodeNumberToArrayLE;
|
11
13
|
constructor(solanaWeb3: SolanaWeb3);
|
12
14
|
}
|
@@ -12,15 +12,21 @@ class SolanaWeb3Private extends web3_private_1.Web3Private {
|
|
12
12
|
async getBlockchainName() {
|
13
13
|
return blockchain_name_1.BLOCKCHAIN_NAME.SOLANA;
|
14
14
|
}
|
15
|
-
async sendTransaction(options
|
15
|
+
async sendTransaction(options) {
|
16
16
|
try {
|
17
17
|
const web3Public = injector_1.Injector.web3PublicService.getWeb3Public(blockchain_name_1.BLOCKCHAIN_NAME.SOLANA);
|
18
18
|
const decodedData = options.data.startsWith('0x')
|
19
19
|
? Buffer.from(options.data.slice(2), 'hex')
|
20
20
|
: utils_1.base64.decode(options.data);
|
21
|
-
const tx = web3_js_1.VersionedTransaction.deserialize(decodedData);
|
22
21
|
const { blockhash } = await web3Public.getRecentBlockhash();
|
22
|
+
const tx = web3_js_1.VersionedTransaction.deserialize(decodedData);
|
23
23
|
tx.message.recentBlockhash = blockhash;
|
24
|
+
const [computedUnitsPrice, computedUnitsLimit] = await Promise.all([
|
25
|
+
web3Public.getConsumedUnitsPrice(tx),
|
26
|
+
web3Public.simulateTransaction(tx)
|
27
|
+
]);
|
28
|
+
console.log('sendTransaction_SOLANA', { computedUnitsPrice, computedUnitsLimit });
|
29
|
+
this.updatePriorityFee(tx, computedUnitsPrice, computedUnitsLimit);
|
24
30
|
const { signature } = await this.solanaWeb3.signAndSendTransaction(tx);
|
25
31
|
options.onTransactionHash?.(signature);
|
26
32
|
return signature;
|
@@ -30,6 +36,29 @@ class SolanaWeb3Private extends web3_private_1.Web3Private {
|
|
30
36
|
throw evm_web3_private_1.EvmWeb3Private.parseError(err);
|
31
37
|
}
|
32
38
|
}
|
39
|
+
updatePriorityFee(tx, computeUnitPrice, computeUnitLimit) {
|
40
|
+
const computeBudgetOfset = 1;
|
41
|
+
const computeUnitPriceData = tx.message.compiledInstructions[1].data;
|
42
|
+
const encodedPrice = this.encodeNumberToArrayLE(computeUnitPrice, 8);
|
43
|
+
for (let i = 0; i < encodedPrice.length; i++) {
|
44
|
+
computeUnitPriceData[i + computeBudgetOfset] = encodedPrice[i];
|
45
|
+
}
|
46
|
+
if (computeUnitLimit) {
|
47
|
+
const computeUnitLimitData = tx.message.compiledInstructions[0].data;
|
48
|
+
const encodedLimit = this.encodeNumberToArrayLE(computeUnitLimit, 4);
|
49
|
+
for (let i = 0; i < encodedLimit.length; i++) {
|
50
|
+
computeUnitLimitData[i + computeBudgetOfset] = encodedLimit[i];
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
encodeNumberToArrayLE(num, arraySize) {
|
55
|
+
const result = new Uint8Array(arraySize);
|
56
|
+
for (let i = 0; i < arraySize; i++) {
|
57
|
+
result[i] = Number(num & 0xff);
|
58
|
+
num >>= 8;
|
59
|
+
}
|
60
|
+
return result;
|
61
|
+
}
|
33
62
|
constructor(solanaWeb3) {
|
34
63
|
super(solanaWeb3.publicKey?.toString() || '');
|
35
64
|
this.solanaWeb3 = solanaWeb3;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solana-web3-private.js","sourceRoot":"","sources":["../../../../../../src/core/blockchain/web3-private-service/web3-private/solana-web3-private/solana-web3-private.ts"],"names":[],"mappings":";;;AAAA,6CAAuD;AACvD,4CAA0C;AAC1C,gFAA6F;AAC7F,8HAAyH;AAGzH,qGAAiG;AACjG,sHAAiH;AACjH,yDAAsD;AAGtD,MAAa,iBAAkB,SAAQ,0BAAW;IAGvC,KAAK,CAAC,iBAAiB;QAC1B,OAAO,iCAAe,CAAC,MAAM,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,
|
1
|
+
{"version":3,"file":"solana-web3-private.js","sourceRoot":"","sources":["../../../../../../src/core/blockchain/web3-private-service/web3-private/solana-web3-private/solana-web3-private.ts"],"names":[],"mappings":"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"}
|
package/lib/core/blockchain/web3-public-service/web3-public/models/supported-token-field.d.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export type SupportedTokenField = 'decimals' | 'symbol' | 'name';
|
1
|
+
export type SupportedTokenField = 'decimals' | 'symbol' | 'name' | 'image';
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import { PublicKey } from '@solana/web3.js';
|
1
2
|
export interface SolanaToken {
|
2
3
|
name: string;
|
3
4
|
symbol: string;
|
@@ -7,3 +8,8 @@ export interface SolanaToken {
|
|
7
8
|
decimals: number | null;
|
8
9
|
holders?: number | null;
|
9
10
|
}
|
11
|
+
export interface SolanaTokensFetchingResp {
|
12
|
+
tokensList: SolanaToken[];
|
13
|
+
notFetchedMints: PublicKey[];
|
14
|
+
hasNotFetchedTokens: boolean;
|
15
|
+
}
|
@@ -1,14 +1,8 @@
|
|
1
1
|
import { SolanaToken } from '../models/solana-token';
|
2
|
-
interface TokenList {
|
3
|
-
preparedTokens: SolanaToken[];
|
4
|
-
addresses: string[];
|
5
|
-
}
|
6
2
|
export declare class SolanaTokensApiService {
|
7
3
|
private static readonly apiEndpoint;
|
8
4
|
private static readonly xApiKey;
|
9
5
|
static getTokensList(tokenAddresses: string[]): Promise<{
|
10
6
|
content: SolanaToken[];
|
11
7
|
}>;
|
12
|
-
static prepareTokens(tokenAddresses: string[]): TokenList;
|
13
8
|
}
|
14
|
-
export {};
|
@@ -1,7 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.SolanaTokensApiService = void 0;
|
4
|
-
const blockchain_1 = require("../../../../../../common/utils/blockchain");
|
5
4
|
const injector_1 = require("../../../../../injector/injector");
|
6
5
|
class SolanaTokensApiService {
|
7
6
|
static getTokensList(tokenAddresses) {
|
@@ -11,36 +10,6 @@ class SolanaTokensApiService {
|
|
11
10
|
}
|
12
11
|
});
|
13
12
|
}
|
14
|
-
static prepareTokens(tokenAddresses) {
|
15
|
-
const preparedTokens = [
|
16
|
-
{
|
17
|
-
name: 'Happy Cat',
|
18
|
-
symbol: 'HAPPY',
|
19
|
-
logoURI: null,
|
20
|
-
address: 'HAPPYwgFcjEJDzRtfWE6tiHE9zGdzpNky2FvjPHsvvGZ',
|
21
|
-
decimals: 9
|
22
|
-
},
|
23
|
-
{
|
24
|
-
name: 'Just a chill guy',
|
25
|
-
symbol: 'CHILLGUY',
|
26
|
-
logoURI: 'https://ipfs.io/ipfs/Qmckb3nWWHyoJKtX3FeagfmDZXNVqiXM4nKkYsTnygm2Ah',
|
27
|
-
address: 'Df6yfrKC8kZE3KNkrHERKzAetSxbrWeniQfyJY4Jpump',
|
28
|
-
decimals: 6
|
29
|
-
}
|
30
|
-
];
|
31
|
-
return tokenAddresses.reduce((list, address) => {
|
32
|
-
const existedToken = preparedTokens.find(token => (0, blockchain_1.compareAddresses)(token.address, address));
|
33
|
-
return existedToken
|
34
|
-
? {
|
35
|
-
preparedTokens: [...list.preparedTokens, existedToken],
|
36
|
-
addresses: list.addresses
|
37
|
-
}
|
38
|
-
: {
|
39
|
-
preparedTokens: list.preparedTokens,
|
40
|
-
addresses: [...list.addresses, address]
|
41
|
-
};
|
42
|
-
}, { preparedTokens: [], addresses: [] });
|
43
|
-
}
|
44
13
|
}
|
45
14
|
exports.SolanaTokensApiService = SolanaTokensApiService;
|
46
15
|
SolanaTokensApiService.apiEndpoint = 'https://x-api.rubic.exchange/sol_token_list';
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solana-tokens-api-service.js","sourceRoot":"","sources":["../../../../../../../src/core/blockchain/web3-public-service/web3-public/solana-web3-public/services/solana-tokens-api-service.ts"],"names":[],"mappings":";;;AAAA,
|
1
|
+
{"version":3,"file":"solana-tokens-api-service.js","sourceRoot":"","sources":["../../../../../../../src/core/blockchain/web3-public-service/web3-public/solana-web3-public/services/solana-tokens-api-service.ts"],"names":[],"mappings":";;;AAAA,yDAAsD;AAItD,MAAa,sBAAsB;IAKxB,MAAM,CAAC,aAAa,CAAC,cAAwB;QAChD,OAAO,mBAAQ,CAAC,UAAU,CAAC,IAAI,CAC3B,GAAG,IAAI,CAAC,WAAW,uBAAuB,EAC1C,EAAE,SAAS,EAAE,cAAc,EAAE,EAC7B;YACI,OAAO,EAAE;gBACL,MAAM,EAAE,IAAI,CAAC,OAAO;aACvB;SACJ,CACJ,CAAC;IACN,CAAC;;AAfL,wDAgBC;AAf2B,kCAAW,GAAG,6CAA6C,CAAC;AAE5D,8BAAO,GAAG,8CAA8C,CAAC"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import { Connection, PublicKey } from '@solana/web3.js';
|
2
|
+
import { SolanaToken } from '../models/solana-token';
|
3
|
+
export declare class SolanaTokensService {
|
4
|
+
private connection;
|
5
|
+
private tokensOrder;
|
6
|
+
private initialMints;
|
7
|
+
constructor(connection: Connection);
|
8
|
+
fetchTokensData(mints: PublicKey[]): Promise<SolanaToken[]>;
|
9
|
+
private fetchTokensFromBackend;
|
10
|
+
private fetchTokensFromMetaplex;
|
11
|
+
private fetchTokensFromSplApi;
|
12
|
+
private sortTokensByIdx;
|
13
|
+
private getNotFetchedTokensList;
|
14
|
+
}
|
@@ -0,0 +1,106 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.SolanaTokensService = void 0;
|
7
|
+
const spl_token_1 = require("@solana/spl-token");
|
8
|
+
const utl_sdk_1 = require("@solflare-wallet/utl-sdk");
|
9
|
+
const blockchain_1 = require("../../../../../../common/utils/blockchain");
|
10
|
+
const p_timeout_1 = __importDefault(require("../../../../../../common/utils/p-timeout"));
|
11
|
+
const solana_tokens_api_service_1 = require("./solana-tokens-api-service");
|
12
|
+
class SolanaTokensService {
|
13
|
+
constructor(connection) {
|
14
|
+
// key - address of token, value - idx of token in initial tokensAddress
|
15
|
+
this.tokensOrder = {};
|
16
|
+
this.initialMints = [];
|
17
|
+
this.connection = connection;
|
18
|
+
}
|
19
|
+
async fetchTokensData(mints) {
|
20
|
+
const tokensAddresses = mints.map(mint => mint.toString());
|
21
|
+
this.initialMints = mints;
|
22
|
+
this.tokensOrder = tokensAddresses.reduce((acc, address, idx) => ({ ...acc, [address.toLowerCase()]: idx }), {});
|
23
|
+
const fromBackend = await this.fetchTokensFromBackend(mints);
|
24
|
+
if (!fromBackend.hasNotFetchedTokens)
|
25
|
+
return this.sortTokensByIdx(fromBackend.tokensList);
|
26
|
+
const fromMetaplex = await this.fetchTokensFromMetaplex(fromBackend.notFetchedMints, fromBackend.tokensList);
|
27
|
+
const backendWithMetaplexTokens = this.sortTokensByIdx([
|
28
|
+
...fromBackend.tokensList,
|
29
|
+
...fromMetaplex.tokensList
|
30
|
+
]);
|
31
|
+
if (!fromMetaplex.hasNotFetchedTokens)
|
32
|
+
return backendWithMetaplexTokens;
|
33
|
+
const fromSplApi = await this.fetchTokensFromSplApi(fromMetaplex.notFetchedMints, backendWithMetaplexTokens);
|
34
|
+
return this.sortTokensByIdx([
|
35
|
+
...fromBackend.tokensList,
|
36
|
+
...fromMetaplex.tokensList,
|
37
|
+
...fromSplApi.tokensList
|
38
|
+
]);
|
39
|
+
}
|
40
|
+
async fetchTokensFromBackend(mints) {
|
41
|
+
try {
|
42
|
+
const tokensAddresses = mints.map(mint => mint.toString());
|
43
|
+
const { content: notSortedTokensList } = await (0, p_timeout_1.default)(solana_tokens_api_service_1.SolanaTokensApiService.getTokensList(tokensAddresses), 4000, new Error('Api Timeout!'));
|
44
|
+
const notFetchedMints = this.getNotFetchedTokensList(notSortedTokensList);
|
45
|
+
return {
|
46
|
+
tokensList: notSortedTokensList,
|
47
|
+
notFetchedMints,
|
48
|
+
hasNotFetchedTokens: notFetchedMints.length > 0
|
49
|
+
};
|
50
|
+
}
|
51
|
+
catch {
|
52
|
+
return {
|
53
|
+
tokensList: [],
|
54
|
+
notFetchedMints: [...mints],
|
55
|
+
hasNotFetchedTokens: true
|
56
|
+
};
|
57
|
+
}
|
58
|
+
}
|
59
|
+
async fetchTokensFromMetaplex(mints, prevTokensList) {
|
60
|
+
const config = new utl_sdk_1.UtlConfig({
|
61
|
+
connection: this.connection,
|
62
|
+
timeout: 5000
|
63
|
+
});
|
64
|
+
const tokenSDK = new utl_sdk_1.Client(config);
|
65
|
+
const metaplexTokens = await tokenSDK.getFromMetaplex(mints).catch(() => []);
|
66
|
+
const notSortedTokensList = [...prevTokensList, ...metaplexTokens];
|
67
|
+
const notFetchedMints = this.getNotFetchedTokensList(notSortedTokensList);
|
68
|
+
return {
|
69
|
+
tokensList: metaplexTokens,
|
70
|
+
notFetchedMints,
|
71
|
+
hasNotFetchedTokens: notFetchedMints.length > 0
|
72
|
+
};
|
73
|
+
}
|
74
|
+
async fetchTokensFromSplApi(mints, prevTokensList) {
|
75
|
+
const splApiResp = await Promise.all(mints.map(mint => (0, spl_token_1.getMint)(this.connection, mint, 'confirmed'))).catch(() => []);
|
76
|
+
const splApiTokens = splApiResp.filter(Boolean).map(token => ({
|
77
|
+
name: `Token ${token.address.toString().slice(0, 10)}`,
|
78
|
+
symbol: `Token ${token.address.toString().slice(0, 10)}`,
|
79
|
+
logoURI: null,
|
80
|
+
decimals: token.decimals,
|
81
|
+
address: token.address.toString(),
|
82
|
+
verified: token.isInitialized
|
83
|
+
}));
|
84
|
+
const notSortedTokensList = [...prevTokensList, ...splApiTokens];
|
85
|
+
const notFetchedMints = this.getNotFetchedTokensList(notSortedTokensList);
|
86
|
+
return {
|
87
|
+
tokensList: notSortedTokensList,
|
88
|
+
notFetchedMints,
|
89
|
+
hasNotFetchedTokens: notFetchedMints.length > 0
|
90
|
+
};
|
91
|
+
}
|
92
|
+
sortTokensByIdx(notSortedList) {
|
93
|
+
const sortedList = [];
|
94
|
+
for (const token of notSortedList) {
|
95
|
+
const originalIdx = this.tokensOrder[token.address.toLowerCase()];
|
96
|
+
sortedList[originalIdx] = token;
|
97
|
+
}
|
98
|
+
return sortedList;
|
99
|
+
}
|
100
|
+
getNotFetchedTokensList(tokensList) {
|
101
|
+
const notFetchedTokensList = this.initialMints.filter(mint => tokensList.every(token => !(0, blockchain_1.compareAddresses)(token.address, mint.toString())));
|
102
|
+
return notFetchedTokensList;
|
103
|
+
}
|
104
|
+
}
|
105
|
+
exports.SolanaTokensService = SolanaTokensService;
|
106
|
+
//# sourceMappingURL=solana-tokens-service.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"solana-tokens-service.js","sourceRoot":"","sources":["../../../../../../../src/core/blockchain/web3-public-service/web3-public/solana-web3-public/services/solana-tokens-service.ts"],"names":[],"mappings":"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"}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { BlockhashWithExpiryBlockHeight, Connection } from '@solana/web3.js';
|
1
|
+
import { BlockhashWithExpiryBlockHeight, Connection, VersionedTransaction } from '@solana/web3.js';
|
2
2
|
import BigNumber from 'bignumber.js';
|
3
3
|
import { Web3PrimitiveType } from '../../../models/web3-primitive-type';
|
4
4
|
import { ContractMulticallResponse } from '../models/contract-multicall-response';
|
@@ -13,13 +13,25 @@ import { AbiItem } from 'web3-utils';
|
|
13
13
|
*/
|
14
14
|
export declare class SolanaWeb3Public extends Web3Public {
|
15
15
|
private readonly connection;
|
16
|
+
private readonly HELIUS_API_URL;
|
17
|
+
private readonly MAX_TRANSFER_COST;
|
16
18
|
constructor(connection: Connection);
|
19
|
+
/**
|
20
|
+
* @returns ComputedUnitsLimit - like gasLimit in evm
|
21
|
+
*/
|
22
|
+
simulateTransaction(tx: VersionedTransaction): Promise<number>;
|
23
|
+
/**
|
24
|
+
* @returns ComputedUnitsPrice - like gasPrice in evm
|
25
|
+
*/
|
26
|
+
getConsumedUnitsPrice(tx: VersionedTransaction): Promise<number>;
|
27
|
+
getLastComputeUnits(): Promise<BigNumber>;
|
17
28
|
getBlockNumber(): Promise<number>;
|
18
29
|
multicallContractsMethods<Output extends Web3PrimitiveType>(_contractAbi: AbiItem[], _contractsData: {
|
19
30
|
contractAddress: string;
|
20
31
|
methodsData: MethodData[];
|
21
32
|
}[]): Promise<ContractMulticallResponse<Output>[][]>;
|
22
33
|
getTransactionStatus(hash: string): Promise<TxStatus>;
|
34
|
+
callForTokenInfo(tokenAddress: string, tokenFields?: SupportedTokenField[]): Promise<Partial<Record<SupportedTokenField, string>>>;
|
23
35
|
callForTokensInfo(tokenAddresses: string[] | ReadonlyArray<string>, tokenFields?: SupportedTokenField[]): Promise<Partial<Record<SupportedTokenField, string>>[]>;
|
24
36
|
getBalance(userAddress: string, tokenAddress: string): Promise<BigNumber>;
|
25
37
|
getTokenBalance(address: string, tokenAddress: string): Promise<BigNumber>;
|
@@ -29,8 +41,6 @@ export declare class SolanaWeb3Public extends Web3Public {
|
|
29
41
|
gasPrice?: string;
|
30
42
|
gas?: string;
|
31
43
|
}): Promise<T>;
|
32
|
-
private fetchMints;
|
33
|
-
private hasNotFetchedTokens;
|
34
44
|
healthCheck(timeoutMs?: number): Promise<boolean>;
|
35
45
|
/**
|
36
46
|
* Gets balance of multiple tokens.
|
package/lib/core/blockchain/web3-public-service/web3-public/solana-web3-public/solana-web3-public.js
CHANGED
@@ -1,10 +1,4 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
7
|
-
};
|
8
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
9
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
10
4
|
};
|
@@ -12,18 +6,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
6
|
exports.SolanaWeb3Public = void 0;
|
13
7
|
const spl_token_1 = require("@solana/spl-token");
|
14
8
|
const web3_js_1 = require("@solana/web3.js");
|
15
|
-
const utl_sdk_1 = require("@solflare-wallet/utl-sdk");
|
16
9
|
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
10
|
+
const utils_1 = require("ethers/lib/utils");
|
17
11
|
const rxjs_1 = require("rxjs");
|
18
12
|
const native_tokens_1 = require("../../../../../common/tokens/constants/native-tokens");
|
19
|
-
const blockchain_1 = require("../../../../../common/utils/blockchain");
|
20
|
-
const decorators_1 = require("../../../../../common/utils/decorators");
|
21
13
|
const native_solana_mint_address_1 = require("../../../constants/solana/native-solana-mint-address");
|
22
14
|
const blockchain_name_1 = require("../../../models/blockchain-name");
|
23
15
|
const tx_status_1 = require("../models/tx-status");
|
24
16
|
const web3_public_1 = require("../web3-public");
|
25
17
|
const solana_web3_pure_1 = require("../../../web3-pure/typed-web3-pure/solana-web3-pure/solana-web3-pure");
|
26
|
-
const
|
18
|
+
const injector_1 = require("../../../../injector/injector");
|
19
|
+
const solana_tokens_service_1 = require("./services/solana-tokens-service");
|
27
20
|
/**
|
28
21
|
* Class containing methods for calling contracts in order to obtain information from the blockchain.
|
29
22
|
* To send transaction or execute contract method use {@link Web3Private}.
|
@@ -32,6 +25,56 @@ class SolanaWeb3Public extends web3_public_1.Web3Public {
|
|
32
25
|
constructor(connection) {
|
33
26
|
super(blockchain_name_1.BLOCKCHAIN_NAME.SOLANA);
|
34
27
|
this.connection = connection;
|
28
|
+
this.HELIUS_API_URL = 'https://mainnet.helius-rpc.com';
|
29
|
+
this.MAX_TRANSFER_COST = 10000;
|
30
|
+
}
|
31
|
+
/**
|
32
|
+
* @returns ComputedUnitsLimit - like gasLimit in evm
|
33
|
+
*/
|
34
|
+
async simulateTransaction(tx) {
|
35
|
+
const DEFAULT_CU_LIMIT = 600000;
|
36
|
+
try {
|
37
|
+
const resp = await this.connection.simulateTransaction(tx, {
|
38
|
+
replaceRecentBlockhash: true
|
39
|
+
});
|
40
|
+
return resp.value.unitsConsumed || DEFAULT_CU_LIMIT;
|
41
|
+
}
|
42
|
+
catch (err) {
|
43
|
+
console.error('Solana_simulateTransaction_Error ==> ', err);
|
44
|
+
return DEFAULT_CU_LIMIT;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
/**
|
48
|
+
* @returns ComputedUnitsPrice - like gasPrice in evm
|
49
|
+
*/
|
50
|
+
async getConsumedUnitsPrice(tx) {
|
51
|
+
const resp = await injector_1.Injector.httpClient.post(`${this.HELIUS_API_URL}/?api-key=f6b96e37-e267-4b67-8790-84bdf8748c39`, {
|
52
|
+
jsonrpc: '2.0',
|
53
|
+
id: '1',
|
54
|
+
method: 'getPriorityFeeEstimate',
|
55
|
+
params: [
|
56
|
+
{
|
57
|
+
transaction: utils_1.base58.encode(tx.serialize()), // Pass the serialized transaction in Base58
|
58
|
+
options: { priorityLevel: 'VeryHigh' }
|
59
|
+
}
|
60
|
+
]
|
61
|
+
});
|
62
|
+
return resp.result.priorityFeeEstimate;
|
63
|
+
}
|
64
|
+
/* like gasLimit in evm */
|
65
|
+
async getLastComputeUnits() {
|
66
|
+
const latestSlot = await this.connection.getSlot();
|
67
|
+
const block = await this.connection.getParsedBlock(latestSlot, {
|
68
|
+
transactionDetails: 'full',
|
69
|
+
maxSupportedTransactionVersion: 0
|
70
|
+
});
|
71
|
+
const onlyDeFiSwaps = block.transactions.filter(tx => Number(tx.meta?.computeUnitsConsumed) > this.MAX_TRANSFER_COST);
|
72
|
+
const maxUnits = onlyDeFiSwaps.reduce((maxUnits, tx) => {
|
73
|
+
const computeUnits = Number(tx.meta?.computeUnitsConsumed);
|
74
|
+
return maxUnits > computeUnits ? maxUnits : computeUnits;
|
75
|
+
}, 0);
|
76
|
+
console.log('%cLAST_BLOCK ===> ', 'color: pink; font-size: 20px;', { block, maxUnits });
|
77
|
+
return new bignumber_js_1.default(maxUnits);
|
35
78
|
}
|
36
79
|
getBlockNumber() {
|
37
80
|
return this.connection.getBlockHeight('finalized');
|
@@ -56,25 +99,33 @@ class SolanaWeb3Public extends web3_public_1.Web3Public {
|
|
56
99
|
return tx_status_1.TX_STATUS.PENDING;
|
57
100
|
}
|
58
101
|
}
|
59
|
-
async
|
102
|
+
async callForTokenInfo(tokenAddress, tokenFields = ['decimals', 'symbol', 'name', 'image']) {
|
103
|
+
return (await this.callForTokensInfo([tokenAddress], tokenFields))[0];
|
104
|
+
}
|
105
|
+
async callForTokensInfo(tokenAddresses, tokenFields = ['decimals', 'symbol', 'name', 'image']) {
|
60
106
|
const nativeTokenIndex = tokenAddresses.findIndex(address => this.Web3Pure.isNativeAddress(address));
|
61
107
|
const filteredTokenAddresses = tokenAddresses.filter((_, index) => index !== nativeTokenIndex);
|
62
|
-
const { preparedTokens, addresses } = solana_tokens_api_service_1.SolanaTokensApiService.prepareTokens(filteredTokenAddresses);
|
63
|
-
const mints = addresses.map(address => new web3_js_1.PublicKey(address));
|
64
|
-
const tokensMint = await this.fetchMints(mints);
|
65
|
-
const fetchedTokens = tokensMint.map(token => {
|
66
|
-
const entries = tokenFields.map(field => [field, token?.[field]]);
|
67
|
-
return Object.fromEntries(entries);
|
68
|
-
});
|
69
|
-
const tokens = [...fetchedTokens, ...preparedTokens];
|
70
|
-
if (nativeTokenIndex === -1) {
|
71
|
-
return tokens;
|
72
|
-
}
|
73
108
|
const blockchainNativeToken = native_tokens_1.nativeTokensList[this.blockchainName];
|
74
109
|
const nativeToken = {
|
75
110
|
...blockchainNativeToken,
|
76
111
|
decimals: blockchainNativeToken.decimals.toString()
|
77
112
|
};
|
113
|
+
// only native token in array
|
114
|
+
if (!filteredTokenAddresses.length && nativeTokenIndex !== -1) {
|
115
|
+
return [nativeToken];
|
116
|
+
}
|
117
|
+
const mints = filteredTokenAddresses.map(address => new web3_js_1.PublicKey(address));
|
118
|
+
const tokensMint = await new solana_tokens_service_1.SolanaTokensService(this.connection).fetchTokensData(mints);
|
119
|
+
const tokens = tokensMint.map(token => {
|
120
|
+
const data = tokenFields.reduce((acc, fieldName) => ({
|
121
|
+
...acc,
|
122
|
+
[fieldName]: fieldName === 'image' ? token.logoURI : token[fieldName]
|
123
|
+
}), {});
|
124
|
+
return data;
|
125
|
+
});
|
126
|
+
if (nativeTokenIndex === -1) {
|
127
|
+
return tokens;
|
128
|
+
}
|
78
129
|
tokens.splice(nativeTokenIndex, 0, nativeToken);
|
79
130
|
return tokens;
|
80
131
|
}
|
@@ -94,52 +145,6 @@ class SolanaWeb3Public extends web3_public_1.Web3Public {
|
|
94
145
|
async callContractMethod(_contractAddress, _contractAbi, _methodName, _methodArguments = [], _options = {}) {
|
95
146
|
throw new Error('Method call is not supported');
|
96
147
|
}
|
97
|
-
async fetchMints(mints) {
|
98
|
-
const tokensAddresses = mints.map(mint => mint.toString());
|
99
|
-
let tokensList = [];
|
100
|
-
let notFetchedList = [];
|
101
|
-
const m = await (0, spl_token_1.getMint)(this.connection, mints[0], 'confirmed');
|
102
|
-
const tokenData = await (0, spl_token_1.getTokenMetadata)(this.connection, mints[0], 'confirmed').catch(err => err);
|
103
|
-
const rpcResp = await this.connection
|
104
|
-
.getAccountInfo(mints[0], 'confirmed')
|
105
|
-
.catch(err => err);
|
106
|
-
console.log(`%cMINT`, 'color: aqua; font-sie: 20px;', { mint: m, tokenData, rpcResp });
|
107
|
-
try {
|
108
|
-
const { content } = await solana_tokens_api_service_1.SolanaTokensApiService.getTokensList(tokensAddresses);
|
109
|
-
tokensList = content;
|
110
|
-
notFetchedList = mints.filter(mint => tokensList.some(token => !(0, blockchain_1.compareAddresses)(token.address, mint.toString())));
|
111
|
-
}
|
112
|
-
catch { }
|
113
|
-
if (!this.hasNotFetchedTokens(notFetchedList))
|
114
|
-
return tokensList;
|
115
|
-
const config = new utl_sdk_1.UtlConfig({
|
116
|
-
connection: this.connection,
|
117
|
-
timeout: 5000
|
118
|
-
});
|
119
|
-
const tokenSDK = new utl_sdk_1.Client(config);
|
120
|
-
const metaplexTokens = await tokenSDK.getFromMetaplex(notFetchedList);
|
121
|
-
notFetchedList = mints.filter(mint => [...tokensList, ...metaplexTokens].some(token => !(0, blockchain_1.compareAddresses)(token.address, mint.toString())));
|
122
|
-
if (!this.hasNotFetchedTokens(notFetchedList))
|
123
|
-
return [...tokensList, ...metaplexTokens];
|
124
|
-
// const splApiResp = await Promise.all(
|
125
|
-
notFetchedList.map(mint => (0, spl_token_1.getTokenMetadata)(this.connection, mint, 'confirmed'));
|
126
|
-
// );
|
127
|
-
// const splApiTokens = splApiResp.filter(Boolean).map(
|
128
|
-
// token =>
|
129
|
-
// ({
|
130
|
-
// name: token!.name,
|
131
|
-
// symbol: token!.symbol,
|
132
|
-
// logoURI: token!.uri,
|
133
|
-
// decimals: Number(token?.additionalMetadata?.[0]?.[0] || 9),
|
134
|
-
// address: token!.mint.toString(),
|
135
|
-
// verified: true
|
136
|
-
// } as SolanaToken)
|
137
|
-
// );
|
138
|
-
return [...tokensList, ...metaplexTokens];
|
139
|
-
}
|
140
|
-
hasNotFetchedTokens(notFetchedList) {
|
141
|
-
return notFetchedList.length > 0;
|
142
|
-
}
|
143
148
|
healthCheck(timeoutMs = 4000) {
|
144
149
|
const request = this.connection.getBalanceAndContext(new web3_js_1.PublicKey('DVLwQbEaw5txuduQwvfbNP3sXvjawHqaoMuGMKZx15bQ'), 'confirmed');
|
145
150
|
return (0, rxjs_1.firstValueFrom)((0, rxjs_1.from)(request).pipe((0, rxjs_1.timeout)(timeoutMs), (0, rxjs_1.map)(result => Boolean(result)), (0, rxjs_1.catchError)((err) => {
|
@@ -194,7 +199,4 @@ class SolanaWeb3Public extends web3_public_1.Web3Public {
|
|
194
199
|
}
|
195
200
|
}
|
196
201
|
exports.SolanaWeb3Public = SolanaWeb3Public;
|
197
|
-
__decorate([
|
198
|
-
decorators_1.Cache
|
199
|
-
], SolanaWeb3Public.prototype, "callForTokensInfo", null);
|
200
202
|
//# sourceMappingURL=solana-web3-public.js.map
|