@cryptorubic/web3 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,22 +1,24 @@
1
1
  {
2
2
  "name": "@cryptorubic/web3",
3
- "version": "0.6.5",
3
+ "version": "0.7.0",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.0",
6
6
  "bignumber.js": "9.1.2",
7
- "@cryptorubic/core": "0.6.5",
7
+ "@cryptorubic/core": "0.7.0",
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.6.5",
14
+ "@cryptorubic/tron-types": "0.7.0",
15
15
  "bitcoin-address-validation": "^2.2.3",
16
16
  "axios": "0.27.2",
17
17
  "crc-32": "^1.2.2",
18
18
  "tronweb": "^6.0.0-beta.4",
19
- "@solana/spl-token": "0.2.0"
19
+ "@solana/spl-token": "0.2.0",
20
+ "@mysten/sui": "^1.24.0",
21
+ "@suiet/wallet-sdk": "^0.3.3"
20
22
  },
21
23
  "type": "commonjs",
22
24
  "main": "./src/index.js",
@@ -0,0 +1,17 @@
1
+ import { Abi, MulticallResponse, MulticallParameters } from 'viem';
2
+ import { AbstractAdapter } from './abstract-adapter';
3
+ import { ICustomLogger, PriceTokenAmount, SuiBlockchainName, Token, TokenAmount } from '@cryptorubic/core';
4
+ import { EvmTransactionConfig } from '../../utils/models/evm-transaction-config';
5
+ import { SuiClient } from '@mysten/sui/client';
6
+ import BigNumber from 'bignumber.js';
7
+ export declare class SuiAdapter extends AbstractAdapter<SuiClient, SuiClient, SuiBlockchainName> {
8
+ constructor(rpcList: string[], logger?: ICustomLogger);
9
+ read<T>(_address: string, _abi: Abi, _method: string, _methodArgs?: unknown[]): Promise<T>;
10
+ write<T>(_address: string, _abi: Abi, _method: string, _methodArgs?: unknown[]): Promise<T>;
11
+ multicallByContract<T>(_contracts: MulticallParameters, _allowErrors?: boolean): Promise<MulticallResponse<T>[]>;
12
+ multicallByAddress<T>(_address: string, _abi: Abi, _method: string, _methodArgs?: unknown[][], _allowErrors?: boolean): Promise<MulticallResponse<T>[]>;
13
+ simulateTransaction(_config: EvmTransactionConfig, _from: string): Promise<void>;
14
+ callForTokensInfo(tokenAddresses: string[] | ReadonlyArray<string>): Promise<Token<SuiBlockchainName>[]>;
15
+ checkEnoughBalance(token: TokenAmount | PriceTokenAmount, walletAddress: string): Promise<boolean>;
16
+ getBalance(userAddress: string, tokenAddress: string): Promise<BigNumber>;
17
+ }
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SuiAdapter = void 0;
4
+ const abstract_adapter_1 = require("./abstract-adapter");
5
+ const core_1 = require("@cryptorubic/core");
6
+ const web3_pure_1 = require("../../utils/web3-pure");
7
+ const client_1 = require("@mysten/sui/client");
8
+ const bignumber_js_1 = require("bignumber.js");
9
+ class SuiAdapter extends abstract_adapter_1.AbstractAdapter {
10
+ constructor(rpcList, logger) {
11
+ super(core_1.BLOCKCHAIN_NAME.SUI, logger);
12
+ this.public = new client_1.SuiClient({ url: rpcList[0] });
13
+ }
14
+ async read(_address, _abi, _method, _methodArgs = []) {
15
+ throw new Error('Method read is not supported');
16
+ }
17
+ async write(_address, _abi, _method, _methodArgs = []) {
18
+ throw new Error('Method write is not supported');
19
+ }
20
+ async multicallByContract(_contracts, _allowErrors = true) {
21
+ throw new Error('Method multicall is not supported');
22
+ }
23
+ async multicallByAddress(_address, _abi, _method, _methodArgs = [], _allowErrors = true) {
24
+ throw new Error('Method multicall is not supported');
25
+ }
26
+ async simulateTransaction(_config, _from) { }
27
+ async callForTokensInfo(tokenAddresses) {
28
+ const nativeToken = core_1.nativeTokensList[core_1.BLOCKCHAIN_NAME.SUI];
29
+ const nativeTokenIndex = tokenAddresses.findIndex((address) => web3_pure_1.Web3Pure.isNativeAddress(core_1.BLOCKCHAIN_NAME.SUI, address));
30
+ const filteredTokenAddresses = tokenAddresses.filter((_, index) => index !== nativeTokenIndex);
31
+ // only native token in array
32
+ if (!filteredTokenAddresses.length && nativeTokenIndex !== -1) {
33
+ return [nativeToken];
34
+ }
35
+ const allTokensMeta = await Promise.all(filteredTokenAddresses.map((coinType) => this.public.getCoinMetadata({ coinType })));
36
+ const tokens = allTokensMeta.map((metadata, metaIndex) => {
37
+ if (metadata) {
38
+ if (!metadata) {
39
+ return null;
40
+ }
41
+ const token = new core_1.Token({
42
+ decimals: metadata.decimals,
43
+ symbol: metadata.symbol,
44
+ name: metadata.name,
45
+ blockchain: core_1.BLOCKCHAIN_NAME.SUI,
46
+ address: filteredTokenAddresses[metaIndex]
47
+ });
48
+ return token;
49
+ }
50
+ return null;
51
+ });
52
+ if (nativeTokenIndex === -1) {
53
+ return tokens;
54
+ }
55
+ tokens.splice(nativeTokenIndex, 0, nativeToken);
56
+ return tokens;
57
+ }
58
+ async checkEnoughBalance(token, walletAddress) {
59
+ const balance = await this.getBalance(walletAddress, token.address);
60
+ return balance.gte(token.tokenAmount);
61
+ }
62
+ async getBalance(userAddress, tokenAddress) {
63
+ const isToken = tokenAddress && !web3_pure_1.Web3Pure.isNativeAddress(core_1.BLOCKCHAIN_NAME.SUI, tokenAddress);
64
+ if (isToken) {
65
+ const balance = await this.public.getBalance({
66
+ owner: userAddress,
67
+ coinType: tokenAddress
68
+ });
69
+ return new bignumber_js_1.default(balance.totalBalance);
70
+ }
71
+ const balance = await this.public.getBalance({ owner: userAddress });
72
+ return new bignumber_js_1.default(balance.totalBalance);
73
+ }
74
+ }
75
+ exports.SuiAdapter = SuiAdapter;
@@ -2,11 +2,12 @@ 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, HttpClient, TonBlockchainName, BitcoinBlockchainName } from '@cryptorubic/core';
5
+ import { BlockchainName, EvmBlockchainName, SolanaBlockchainName, TronBlockchainName, ICustomLogger, HttpClient, TonBlockchainName, BitcoinBlockchainName, SuiBlockchainName } from '@cryptorubic/core';
6
6
  import { TonAdapter } from './adapters/ton-adapter';
7
7
  import { TonAdapterConfig } from './adapters/models/ton-adapter-config';
8
8
  import { EvmAdapter } from './adapters/evm-adapter';
9
9
  import { BitcoinAdapter } from './adapters/bitcoin-adapter';
10
+ import { SuiAdapter } from './adapters/sui-adapter';
10
11
  export declare class BlockchainAdapterFactoryService {
11
12
  private readonly rpcList;
12
13
  private readonly createLogger?;
@@ -21,6 +22,7 @@ export declare class BlockchainAdapterFactoryService {
21
22
  getAdapter(blockchain: TronBlockchainName): TronAdapter;
22
23
  getAdapter(blockchain: TonBlockchainName): TonAdapter;
23
24
  getAdapter(blockchain: BitcoinBlockchainName): BitcoinAdapter;
25
+ getAdapter(blockchain: SuiBlockchainName): SuiAdapter;
24
26
  private createStorage;
25
27
  private createAdapter;
26
28
  connectWallet(walletProvider: WalletProvider): void;
@@ -9,6 +9,7 @@ const core_1 = require("@cryptorubic/core");
9
9
  const ton_adapter_1 = require("./adapters/ton-adapter");
10
10
  const evm_adapter_1 = require("./adapters/evm-adapter");
11
11
  const bitcoin_adapter_1 = require("./adapters/bitcoin-adapter");
12
+ const sui_adapter_1 = require("./adapters/sui-adapter");
12
13
  class BlockchainAdapterFactoryService {
13
14
  constructor(rpcList, createLogger, httpClient, tonParams) {
14
15
  this.rpcList = rpcList;
@@ -75,6 +76,9 @@ class BlockchainAdapterFactoryService {
75
76
  if (blockchainType === core_1.CHAIN_TYPE.TRON) {
76
77
  return new tron_adapter_1.TronAdapter(rpcs, this.createLogger?.(`TRON_ADAPTER`));
77
78
  }
79
+ if (blockchainType === core_1.CHAIN_TYPE.SUI) {
80
+ return new sui_adapter_1.SuiAdapter(rpcs, this.createLogger?.(`SUI_ADAPTER`));
81
+ }
78
82
  if (blockchainType === core_1.CHAIN_TYPE.SOLANA) {
79
83
  return new solana_adapter_1.SolanaAdapter(rpcs, this.createLogger?.(`SOLANA_ADAPTER`));
80
84
  }
@@ -109,6 +113,11 @@ class BlockchainAdapterFactoryService {
109
113
  store.wallet = walletProvider[core_1.CHAIN_TYPE.TRON].core;
110
114
  store.walletAddress = walletProvider[core_1.CHAIN_TYPE.TRON].address;
111
115
  }
116
+ if (walletProvider?.[core_1.CHAIN_TYPE.SUI]?.core && this.adapterStore?.[core_1.BLOCKCHAIN_NAME.SUI]) {
117
+ const store = this.adapterStore[core_1.BLOCKCHAIN_NAME.SUI];
118
+ store.wallet = walletProvider[core_1.CHAIN_TYPE.SUI].core;
119
+ store.walletAddress = walletProvider[core_1.CHAIN_TYPE.SUI].address;
120
+ }
112
121
  if (walletProvider?.[core_1.CHAIN_TYPE.TON]?.core && this.adapterStore?.[core_1.BLOCKCHAIN_NAME.TON]) {
113
122
  const store = this.adapterStore[core_1.BLOCKCHAIN_NAME.TON];
114
123
  store.wallet = walletProvider[core_1.CHAIN_TYPE.TON].core;
@@ -2,6 +2,7 @@ import { CHAIN_TYPE } from '@cryptorubic/core';
2
2
  import { SolanaWeb3 } from './solana-web3';
3
3
  import { TronWeb } from 'tronweb';
4
4
  import { BtcWallet } from '../../adapters/models/btc-wallet-provider';
5
+ import { WalletAdapter } from '@suiet/wallet-sdk';
5
6
  export interface WalletProviderCore<T = any> {
6
7
  /**
7
8
  * Core provider.
@@ -19,6 +20,7 @@ export type TronWalletProviderCore = WalletProviderCore<typeof TronWeb>;
19
20
  export type SolanaWalletProviderCore = WalletProviderCore<SolanaWeb3>;
20
21
  export type TonWaleltProviderCore = WalletProviderCore<unknown>;
21
22
  export type BitcoinWalletProviderCore = WalletProviderCore<BtcWallet>;
23
+ export type SuiWalletProviderCore = WalletProviderCore<WalletAdapter>;
22
24
  /**
23
25
  * Stores wallet core and information about current user, used to make `send` transactions.
24
26
  */
@@ -28,6 +30,7 @@ interface IWalletProvider {
28
30
  readonly [CHAIN_TYPE.SOLANA]?: SolanaWalletProviderCore;
29
31
  readonly [CHAIN_TYPE.TON]?: TonWaleltProviderCore;
30
32
  readonly [CHAIN_TYPE.BITCOIN]?: BitcoinWalletProviderCore;
33
+ readonly [CHAIN_TYPE.SUI]?: SuiWalletProviderCore;
31
34
  }
32
35
  export type WalletProvider = Partial<IWalletProvider>;
33
36
  export {};
@@ -23,6 +23,7 @@ export declare const changeNowEvmSupportedBlockchain: {
23
23
  export type ChangenowEvmCrossChainSupportedBlockchain = keyof typeof changeNowEvmSupportedBlockchain;
24
24
  export declare const changenowApiBlockchain: {
25
25
  THETA: string;
26
+ SUI: string;
26
27
  FLARE: string;
27
28
  FILECOIN: string;
28
29
  EOS: string;
@@ -29,6 +29,7 @@ exports.changenowApiBlockchain = {
29
29
  ...exports.changeNowEvmSupportedBlockchain,
30
30
  // Non evm
31
31
  [core_1.BLOCKCHAIN_NAME.THETA]: 'theta',
32
+ [core_1.BLOCKCHAIN_NAME.SUI]: 'sui',
32
33
  [core_1.BLOCKCHAIN_NAME.FLARE]: 'flr',
33
34
  [core_1.BLOCKCHAIN_NAME.FILECOIN]: 'fil',
34
35
  [core_1.BLOCKCHAIN_NAME.EOS]: 'eos',
@@ -10,8 +10,10 @@ const icp_web3_pure_1 = require("../web3-types/icp-web3-pure");
10
10
  const solana_web3_pure_1 = require("../web3-types/solana-web3-pure");
11
11
  const common_web3_pure_1 = require("../web3-types/common-web3-pure");
12
12
  const ton_web3_pure_1 = require("../web3-types/ton-web3-pure");
13
+ const sui_web3_pure_1 = require("../web3-types/sui-web3-pure");
13
14
  exports.web3PureStore = {
14
15
  [core_1.CHAIN_TYPE.EVM]: new evm_web3_pure_1.EvmWeb3Pure(),
16
+ [core_1.CHAIN_TYPE.SUI]: new sui_web3_pure_1.SuiWeb3Pure(),
15
17
  [core_1.CHAIN_TYPE.TRON]: new tron_web3_pure_1.TronWeb3Pure(),
16
18
  [core_1.CHAIN_TYPE.BITCOIN]: new bitcoin_web3_pure_1.BitcoinWeb3Pure(),
17
19
  [core_1.CHAIN_TYPE.ICP]: new icp_web3_pure_1.IcpWeb3Pure(),
@@ -7,7 +7,7 @@ class SolanaWeb3Pure extends common_web3_pure_1.CommonWeb3Pure {
7
7
  constructor() {
8
8
  super({
9
9
  cnApiKey: changenow_api_blockchain_1.changenowApiBlockchain.SOLANA,
10
- regex: /^[1-9A-HJ-NP-Za-km-z]{32,44}$/
10
+ regex: /^0[xX][a-fA-F0-9]{64}$/
11
11
  });
12
12
  this.nativeTokenAddress = 'So11111111111111111111111111111111111111111';
13
13
  }
@@ -0,0 +1,8 @@
1
+ import { CommonWeb3Pure } from './common-web3-pure';
2
+ export declare class SuiWeb3Pure extends CommonWeb3Pure {
3
+ readonly nativeTokenAddress = "0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI";
4
+ readonly emptyAddress = "0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI";
5
+ static compareAddress(addressA: string, addressB: string): boolean;
6
+ isAddressCorrect(address: string): Promise<boolean>;
7
+ constructor();
8
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SuiWeb3Pure = void 0;
4
+ const common_web3_pure_1 = require("./common-web3-pure");
5
+ const core_1 = require("@cryptorubic/core");
6
+ const bignumber_js_1 = require("bignumber.js");
7
+ class SuiWeb3Pure extends common_web3_pure_1.CommonWeb3Pure {
8
+ static compareAddress(addressA, addressB) {
9
+ const pureAddressA = addressA.split(':')[0];
10
+ const pureAddressB = addressB.split(':')[0];
11
+ return (0, core_1.compareAddresses)(new bignumber_js_1.default(pureAddressA).toFixed(), new bignumber_js_1.default(pureAddressB).toFixed());
12
+ }
13
+ async isAddressCorrect(address) {
14
+ if (this.regEx) {
15
+ return this.regEx.test(address);
16
+ }
17
+ throw new Error(`Validation function is not implemented for ${this.constructor.name}`);
18
+ }
19
+ constructor() {
20
+ super({
21
+ regex: /(^0[xX][a-fA-F0-9]{64}::[a-z0-9]*::[A-Z0-9]*$)|(^0[xX][a-fA-F0-9]{64}$)/
22
+ });
23
+ this.nativeTokenAddress = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI';
24
+ this.emptyAddress = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI';
25
+ }
26
+ }
27
+ exports.SuiWeb3Pure = SuiWeb3Pure;