@cryptorubic/web3 0.3.2 → 0.3.4-simulation-timeout.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 +4 -3
- package/src/index.d.ts +2 -0
- package/src/index.js +2 -0
- package/src/lib/adapter/adapters/bitcoin-adapter.d.ts +14 -0
- package/src/lib/adapter/adapters/bitcoin-adapter.js +65 -0
- package/src/lib/adapter/adapters/evm-adapter.d.ts +1 -1
- package/src/lib/adapter/adapters/evm-adapter.js +6 -3
- package/src/lib/adapter/adapters/models/btc-wallet-provider.d.ts +10 -0
- package/src/lib/adapter/adapters/models/btc-wallet-provider.js +2 -0
- package/src/lib/adapter/blockchain-adapter-factory.service.d.ts +3 -1
- package/src/lib/adapter/blockchain-adapter-factory.service.js +11 -0
- package/src/lib/adapter/constants/models/wallet-provider.d.ts +3 -0
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cryptorubic/web3",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4-simulation-timeout.0",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"tslib": "^2.3.0",
|
|
6
6
|
"bignumber.js": "9.1.2",
|
|
7
|
-
"@cryptorubic/core": "0.3.
|
|
7
|
+
"@cryptorubic/core": "0.3.4-simulation-timeout.0",
|
|
8
|
+
"viem": "^2.19.1",
|
|
8
9
|
"web3-utils": "^4.3.1",
|
|
9
10
|
"@ton/ton": "^15.1.0",
|
|
10
11
|
"@solana/web3.js": "1.95.3",
|
|
11
12
|
"@solflare-wallet/utl-sdk": "^1.4.0",
|
|
12
13
|
"@ethersproject/bignumber": "^5.7.0",
|
|
13
|
-
"@cryptorubic/tron-types": "0.3.
|
|
14
|
+
"@cryptorubic/tron-types": "0.3.4-simulation-timeout.0",
|
|
14
15
|
"bitcoin-address-validation": "^2.2.3",
|
|
15
16
|
"axios": "0.27.2",
|
|
16
17
|
"crc-32": "^1.2.2",
|
package/src/index.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export * from './lib/adapter/adapters/models/tonapi-models';
|
|
|
23
23
|
export * from './lib/adapter/adapters/models/toncenter-types';
|
|
24
24
|
export * from './lib/adapter/adapters/models/approve-adapter';
|
|
25
25
|
export * from './lib/adapter/adapters/models/gas-price';
|
|
26
|
+
export * from './lib/adapter/adapters/models/btc-wallet-provider';
|
|
27
|
+
export * from './lib/adapter/adapters/bitcoin-adapter';
|
|
26
28
|
export * from './lib/utils/web3-pure';
|
|
27
29
|
export * from './lib/utils/models/evm-transaction-config';
|
|
28
30
|
export * from './lib/utils/web3-types/bitcoin-web3-pure';
|
package/src/index.js
CHANGED
|
@@ -23,6 +23,8 @@ tslib_1.__exportStar(require("./lib/adapter/adapters/models/tonapi-models"), exp
|
|
|
23
23
|
tslib_1.__exportStar(require("./lib/adapter/adapters/models/toncenter-types"), exports);
|
|
24
24
|
tslib_1.__exportStar(require("./lib/adapter/adapters/models/approve-adapter"), exports);
|
|
25
25
|
tslib_1.__exportStar(require("./lib/adapter/adapters/models/gas-price"), exports);
|
|
26
|
+
tslib_1.__exportStar(require("./lib/adapter/adapters/models/btc-wallet-provider"), exports);
|
|
27
|
+
tslib_1.__exportStar(require("./lib/adapter/adapters/bitcoin-adapter"), exports);
|
|
26
28
|
// utils aka web3pure
|
|
27
29
|
tslib_1.__exportStar(require("./lib/utils/web3-pure"), exports);
|
|
28
30
|
tslib_1.__exportStar(require("./lib/utils/models/evm-transaction-config"), exports);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BitcoinBlockchainName, BlockchainName, HttpClient, ICustomLogger, Token } from '@cryptorubic/core';
|
|
2
|
+
import BigNumber from 'bignumber.js';
|
|
3
|
+
import { AbstractAdapter } from './abstract-adapter';
|
|
4
|
+
import { BasicTransactionOptions } from './models/basic-transaction-options';
|
|
5
|
+
import { BtcWallet } from './models/btc-wallet-provider';
|
|
6
|
+
export declare class BitcoinAdapter extends AbstractAdapter<BtcWallet, BtcWallet, BitcoinBlockchainName> {
|
|
7
|
+
private readonly httpClient;
|
|
8
|
+
constructor(httpClient: HttpClient, logger?: ICustomLogger);
|
|
9
|
+
getBalance(userAddress: string): Promise<BigNumber>;
|
|
10
|
+
callForTokensInfo(tokenAddresses: string[] | ReadonlyArray<string>): Promise<Token<BlockchainName>[]>;
|
|
11
|
+
read<T>(args: unknown): Promise<T>;
|
|
12
|
+
write(args: unknown): Promise<string>;
|
|
13
|
+
transfer(recipient: string, amount: string, fromAddress: string, memo?: string, options?: BasicTransactionOptions): Promise<string>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BitcoinAdapter = void 0;
|
|
4
|
+
const core_1 = require("@cryptorubic/core");
|
|
5
|
+
const bignumber_js_1 = require("bignumber.js");
|
|
6
|
+
const abstract_adapter_1 = require("./abstract-adapter");
|
|
7
|
+
class BitcoinAdapter extends abstract_adapter_1.AbstractAdapter {
|
|
8
|
+
constructor(httpClient, logger) {
|
|
9
|
+
super(core_1.BLOCKCHAIN_NAME.BITCOIN, logger);
|
|
10
|
+
this.httpClient = httpClient;
|
|
11
|
+
}
|
|
12
|
+
async getBalance(userAddress) {
|
|
13
|
+
const url = `https://api.blockcypher.com/v1/btc/main/addrs/${userAddress}/balance`;
|
|
14
|
+
const response = await this.httpClient.get(url);
|
|
15
|
+
return new bignumber_js_1.default(response.final_balance);
|
|
16
|
+
}
|
|
17
|
+
async callForTokensInfo(tokenAddresses) {
|
|
18
|
+
return [core_1.nativeTokensList[core_1.BLOCKCHAIN_NAME.BITCOIN]];
|
|
19
|
+
}
|
|
20
|
+
read(args) {
|
|
21
|
+
throw new Error('Not implemented');
|
|
22
|
+
}
|
|
23
|
+
write(args) {
|
|
24
|
+
throw new Error('Not implemented');
|
|
25
|
+
}
|
|
26
|
+
async transfer(recipient, amount, fromAddress, memo, options) {
|
|
27
|
+
const hashPromise = new Promise((resolve, reject) => {
|
|
28
|
+
this.wallet.request({
|
|
29
|
+
method: 'transfer',
|
|
30
|
+
params: [
|
|
31
|
+
{
|
|
32
|
+
feeRate: 10,
|
|
33
|
+
from: fromAddress,
|
|
34
|
+
recipient,
|
|
35
|
+
amount: {
|
|
36
|
+
amount,
|
|
37
|
+
decimals: 8,
|
|
38
|
+
},
|
|
39
|
+
...(memo && { memo }),
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
}, (error, txHash) => {
|
|
43
|
+
if (error) {
|
|
44
|
+
reject(error);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
options?.onTransactionHash?.(txHash);
|
|
48
|
+
resolve(txHash);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
try {
|
|
53
|
+
const hash = await hashPromise;
|
|
54
|
+
if (typeof hash === 'string') {
|
|
55
|
+
// const statusData = this.getSrcStatusRecursive(srcTxHash, BLOCKCHAIN_NAME.BITCOIN, 300_000);
|
|
56
|
+
return hash;
|
|
57
|
+
}
|
|
58
|
+
throw new Error();
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw new Error('Failed to transfer funds');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.BitcoinAdapter = BitcoinAdapter;
|
|
@@ -18,7 +18,7 @@ export declare class EvmAdapter extends AbstractAdapter<PublicActions & PublicCl
|
|
|
18
18
|
multicallByContract<T>(contracts: MulticallParameters, allowErrors?: boolean): Promise<MulticallResponse<T>[]>;
|
|
19
19
|
multicallByAddress<T>(address: string, abi: Abi, method: string, methodArgs?: unknown[][], allowErrors?: boolean): Promise<MulticallResponse<T>[]>;
|
|
20
20
|
static encodeMethodCall(contractAddress: string, contractAbi: Abi, method: string, parameters?: unknown[], value?: string): EvmTransactionConfig;
|
|
21
|
-
simulateTransaction(config: EvmTransactionConfig, from: string): Promise<string>;
|
|
21
|
+
simulateTransaction(config: EvmTransactionConfig, from: string, timeout?: number): Promise<string>;
|
|
22
22
|
callForTokensInfo(tokenAddresses: string[] | ReadonlyArray<string>): Promise<Token<EvmBlockchainName>[]>;
|
|
23
23
|
getGasPrice(): Promise<string>;
|
|
24
24
|
checkEnoughBalance(token: TokenAmount | PriceTokenAmount, walletAddress: string, amount?: BigNumber): Promise<boolean>;
|
|
@@ -137,7 +137,7 @@ class EvmAdapter extends abstract_adapter_1.AbstractAdapter {
|
|
|
137
137
|
throw err;
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
|
-
async simulateTransaction(config, from) {
|
|
140
|
+
async simulateTransaction(config, from, timeout = 15000) {
|
|
141
141
|
try {
|
|
142
142
|
const callParams = {
|
|
143
143
|
account: from,
|
|
@@ -145,8 +145,11 @@ class EvmAdapter extends abstract_adapter_1.AbstractAdapter {
|
|
|
145
145
|
to: config.to,
|
|
146
146
|
...(config.value && { value: BigInt(config.value) }),
|
|
147
147
|
};
|
|
148
|
-
const gasLimitWei = await
|
|
149
|
-
|
|
148
|
+
const gasLimitWei = await Promise.race([
|
|
149
|
+
this.public.estimateGas(callParams),
|
|
150
|
+
new Promise((_, reject) => setTimeout(() => reject('Timeout'), timeout))
|
|
151
|
+
]);
|
|
152
|
+
return gasLimitWei?.toString();
|
|
150
153
|
}
|
|
151
154
|
catch (err) {
|
|
152
155
|
this.logger?.customError('Error while simulating transaction', err);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface BtcWallet {
|
|
2
|
+
on: (event: string, callback: (...args: unknown[]) => void) => unknown;
|
|
3
|
+
request<T>(args: {
|
|
4
|
+
method: string;
|
|
5
|
+
params: unknown[];
|
|
6
|
+
}, fn: (error: Error, txHash: string) => unknown): Promise<{
|
|
7
|
+
error: null | Error;
|
|
8
|
+
result: T;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
@@ -2,10 +2,11 @@ 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 } from '@cryptorubic/core';
|
|
5
|
+
import { BlockchainName, EvmBlockchainName, SolanaBlockchainName, TronBlockchainName, ICustomLogger, HttpClient, TonBlockchainName, BitcoinBlockchainName } 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
|
+
import { BitcoinAdapter } from './adapters/bitcoin-adapter';
|
|
9
10
|
export declare class BlockchainAdapterFactoryService {
|
|
10
11
|
private readonly rpcList;
|
|
11
12
|
private readonly createLogger?;
|
|
@@ -19,6 +20,7 @@ export declare class BlockchainAdapterFactoryService {
|
|
|
19
20
|
getAdapter(blockchain: EvmBlockchainName): EvmAdapter;
|
|
20
21
|
getAdapter(blockchain: TronBlockchainName): TronAdapter;
|
|
21
22
|
getAdapter(blockchain: TonBlockchainName): TonAdapter;
|
|
23
|
+
getAdapter(blockchain: BitcoinBlockchainName): BitcoinAdapter;
|
|
22
24
|
private createStorage;
|
|
23
25
|
private createAdapter;
|
|
24
26
|
connectWallet(walletProvider: WalletProvider): void;
|
|
@@ -8,6 +8,7 @@ const viem_1 = require("viem");
|
|
|
8
8
|
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
|
+
const bitcoin_adapter_1 = require("./adapters/bitcoin-adapter");
|
|
11
12
|
class BlockchainAdapterFactoryService {
|
|
12
13
|
constructor(rpcList, createLogger, httpClient, tonParams) {
|
|
13
14
|
this.rpcList = rpcList;
|
|
@@ -46,6 +47,7 @@ class BlockchainAdapterFactoryService {
|
|
|
46
47
|
return [blockchain, null];
|
|
47
48
|
});
|
|
48
49
|
const tonAdapter = this.createAdapter(core_1.BLOCKCHAIN_NAME.TON, []);
|
|
50
|
+
const btcAdapter = this.createAdapter(core_1.BLOCKCHAIN_NAME.BITCOIN, []);
|
|
49
51
|
adapters.push(tonAdapter
|
|
50
52
|
? [core_1.BLOCKCHAIN_NAME.TON, tonAdapter]
|
|
51
53
|
: [core_1.BLOCKCHAIN_NAME.TON, null]);
|
|
@@ -85,6 +87,9 @@ class BlockchainAdapterFactoryService {
|
|
|
85
87
|
this.tonParams?.tonClientConfig) {
|
|
86
88
|
return new ton_adapter_1.TonAdapter(this.httpClient, this.tonParams, this.createLogger?.(`TON_ADAPTER`));
|
|
87
89
|
}
|
|
90
|
+
if (blockchain === core_1.BLOCKCHAIN_NAME.BITCOIN && this.httpClient) {
|
|
91
|
+
return new bitcoin_adapter_1.BitcoinAdapter(this.httpClient, this.createLogger?.(`BTC_ADAPTER`));
|
|
92
|
+
}
|
|
88
93
|
return null;
|
|
89
94
|
}
|
|
90
95
|
connectWallet(walletProvider) {
|
|
@@ -117,6 +122,12 @@ class BlockchainAdapterFactoryService {
|
|
|
117
122
|
store.wallet = walletProvider[core_1.CHAIN_TYPE.TON].core;
|
|
118
123
|
store.walletAddress = walletProvider[core_1.CHAIN_TYPE.TON].address;
|
|
119
124
|
}
|
|
125
|
+
if (walletProvider?.[core_1.CHAIN_TYPE.BITCOIN]?.core &&
|
|
126
|
+
this.adapterStore?.[core_1.BLOCKCHAIN_NAME.BITCOIN]) {
|
|
127
|
+
const store = this.adapterStore[core_1.BLOCKCHAIN_NAME.BITCOIN];
|
|
128
|
+
store.wallet = walletProvider[core_1.CHAIN_TYPE.BITCOIN].core;
|
|
129
|
+
store.walletAddress = walletProvider[core_1.CHAIN_TYPE.BITCOIN].address;
|
|
130
|
+
}
|
|
120
131
|
}
|
|
121
132
|
}
|
|
122
133
|
exports.BlockchainAdapterFactoryService = BlockchainAdapterFactoryService;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CHAIN_TYPE } from '@cryptorubic/core';
|
|
2
2
|
import { SolanaWeb3 } from './solana-web3';
|
|
3
3
|
import { TronWeb } from 'tronweb';
|
|
4
|
+
import { BtcWallet } from '../../adapters/models/btc-wallet-provider';
|
|
4
5
|
export interface WalletProviderCore<T = any> {
|
|
5
6
|
/**
|
|
6
7
|
* Core provider.
|
|
@@ -17,6 +18,7 @@ export type EvmWalletProviderCore = WalletProviderCore<{
|
|
|
17
18
|
export type TronWalletProviderCore = WalletProviderCore<typeof TronWeb>;
|
|
18
19
|
export type SolanaWalletProviderCore = WalletProviderCore<SolanaWeb3>;
|
|
19
20
|
export type TonWaleltProviderCore = WalletProviderCore<unknown>;
|
|
21
|
+
export type BitcoinWalletProviderCore = WalletProviderCore<BtcWallet>;
|
|
20
22
|
/**
|
|
21
23
|
* Stores wallet core and information about current user, used to make `send` transactions.
|
|
22
24
|
*/
|
|
@@ -25,6 +27,7 @@ interface IWalletProvider {
|
|
|
25
27
|
readonly [CHAIN_TYPE.TRON]?: TronWalletProviderCore;
|
|
26
28
|
readonly [CHAIN_TYPE.SOLANA]?: SolanaWalletProviderCore;
|
|
27
29
|
readonly [CHAIN_TYPE.TON]?: TonWaleltProviderCore;
|
|
30
|
+
readonly [CHAIN_TYPE.BITCOIN]?: BitcoinWalletProviderCore;
|
|
28
31
|
}
|
|
29
32
|
export type WalletProvider = Partial<IWalletProvider>;
|
|
30
33
|
export {};
|