hodl-wallet 2.0.2 → 2.0.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.
Files changed (62) hide show
  1. package/README.md +42 -3
  2. package/dist/agent-cli.d.ts +11 -0
  3. package/dist/agent-cli.js +310 -0
  4. package/dist/agent-cli.js.map +1 -0
  5. package/dist/agent-errors.d.ts +7 -0
  6. package/dist/agent-errors.js +13 -0
  7. package/dist/agent-errors.js.map +1 -0
  8. package/dist/amounts.d.ts +3 -0
  9. package/dist/amounts.js +51 -0
  10. package/dist/amounts.js.map +1 -0
  11. package/dist/index.d.ts +6 -0
  12. package/dist/index.js +95 -37
  13. package/dist/index.js.map +1 -1
  14. package/dist/network/arb.d.ts +3 -0
  15. package/dist/network/arb.js +4 -1
  16. package/dist/network/arb.js.map +1 -1
  17. package/dist/network/avax.d.ts +3 -0
  18. package/dist/network/avax.js +3 -0
  19. package/dist/network/avax.js.map +1 -1
  20. package/dist/network/bsc.d.ts +3 -0
  21. package/dist/network/bsc.js +3 -0
  22. package/dist/network/bsc.js.map +1 -1
  23. package/dist/network/btc.d.ts +3 -0
  24. package/dist/network/btc.js +3 -0
  25. package/dist/network/btc.js.map +1 -1
  26. package/dist/network/eth.d.ts +3 -0
  27. package/dist/network/eth.js +3 -0
  28. package/dist/network/eth.js.map +1 -1
  29. package/dist/network/ftm.d.ts +3 -0
  30. package/dist/network/ftm.js +3 -0
  31. package/dist/network/ftm.js.map +1 -1
  32. package/dist/network/hyperliquid.d.ts +2 -0
  33. package/dist/network/hyperliquid.js +2 -0
  34. package/dist/network/hyperliquid.js.map +1 -1
  35. package/dist/network/lib/BaseNetwork.d.ts +8 -4
  36. package/dist/network/lib/BaseNetwork.js +1 -1
  37. package/dist/network/lib/BaseNetwork.js.map +1 -1
  38. package/dist/network/lib/BitcoinNetwork.d.ts +9 -4
  39. package/dist/network/lib/BitcoinNetwork.js +92 -8
  40. package/dist/network/lib/BitcoinNetwork.js.map +1 -1
  41. package/dist/network/lib/Web3Network.d.ts +6 -2
  42. package/dist/network/lib/Web3Network.js +156 -58
  43. package/dist/network/lib/Web3Network.js.map +1 -1
  44. package/dist/network/op.d.ts +3 -0
  45. package/dist/network/op.js +4 -1
  46. package/dist/network/op.js.map +1 -1
  47. package/dist/network/pol.d.ts +3 -0
  48. package/dist/network/pol.js +3 -0
  49. package/dist/network/pol.js.map +1 -1
  50. package/dist/network/types.d.ts +33 -3
  51. package/dist/network-registry.d.ts +9 -0
  52. package/dist/network-registry.js +50 -0
  53. package/dist/network-registry.js.map +1 -0
  54. package/dist/persist.js +1 -1
  55. package/dist/persist.js.map +1 -1
  56. package/dist/profile-lock.d.ts +14 -0
  57. package/dist/profile-lock.js +84 -0
  58. package/dist/profile-lock.js.map +1 -0
  59. package/dist/wallet-service.d.ts +73 -0
  60. package/dist/wallet-service.js +633 -0
  61. package/dist/wallet-service.js.map +1 -0
  62. package/package.json +8 -8
@@ -1,9 +1,9 @@
1
- import type { BaseNetworkContract, NetworkConfig, SignedTransaction, TransferOptions, WalletAccount } from '../types.js';
1
+ import type { AssetBalance, BaseNetworkContract, NetworkConfig, PreparedTransfer, SignedTransaction, TransactionStatus, TransferOptions, WalletAccount } from '../types.js';
2
2
  export default abstract class BaseNetwork implements BaseNetworkContract {
3
3
  config: NetworkConfig;
4
4
  name: string;
5
5
  constructor(config: NetworkConfig);
6
- abstract getBalance(address: string): Promise<string | number>;
6
+ abstract getBalance(address: string): Promise<string>;
7
7
  abstract transfer(from: WalletAccount, to: string, amount: number | string, options?: TransferOptions): Promise<SignedTransaction | string | unknown>;
8
8
  abstract transferToken(from: WalletAccount, to: string, amount: number | string, tokenSymbol: string, options?: TransferOptions): Promise<SignedTransaction | string | unknown>;
9
9
  abstract estimateGas(transaction: unknown): Promise<unknown>;
@@ -14,7 +14,11 @@ export default abstract class BaseNetwork implements BaseNetworkContract {
14
14
  abstract accountFromMnemonic(mnemonic: string): Promise<WalletAccount>;
15
15
  abstract createAccountFromMnemonic(wordCount?: 12 | 24): Promise<WalletAccount>;
16
16
  abstract validateMnemonic(mnemonic: string): boolean;
17
- abstract getTokenBalance(address: string, tokenSymbol: string): Promise<string | number>;
18
- getTokenBalances(address: string): Promise<Array<[string, string | number]>>;
17
+ abstract getTokenBalance(address: string, tokenSymbol: string): Promise<string>;
18
+ abstract getAssetBalance(address: string, asset: string): Promise<AssetBalance>;
19
+ abstract validateAddress(address: string): boolean;
20
+ abstract prepareTransfer(from: WalletAccount, to: string, amount: string, asset: string, options?: TransferOptions): Promise<PreparedTransfer>;
21
+ abstract getTransactionStatus(transactionHash: string): Promise<TransactionStatus>;
22
+ getTokenBalances(address: string): Promise<Array<[string, string]>>;
19
23
  abstract sendSignedTransaction(signedTx: SignedTransaction | string): Promise<unknown>;
20
24
  }
@@ -8,7 +8,7 @@ export default class BaseNetwork {
8
8
  async getTokenBalances(address) {
9
9
  const balances = [];
10
10
  const nativeBalance = await this.getBalance(address);
11
- balances.push([this.config.nativeToken, Number(nativeBalance)]);
11
+ balances.push([this.config.nativeToken, nativeBalance]);
12
12
  for (const symbol of Object.keys(this.config.tokens)) {
13
13
  const tokenBalance = await this.getTokenBalance(address, symbol);
14
14
  balances.push([symbol, tokenBalance]);
@@ -1 +1 @@
1
- {"version":3,"file":"BaseNetwork.js","sourceRoot":"","sources":["../../../network/lib/BaseNetwork.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,OAAO,OAAgB,WAAW;IACrC,MAAM,CAAgB;IACtB,IAAI,CAAS;IAEb,YAAY,MAAqB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC5B,CAAC;IAqCD,KAAK,CAAC,gBAAgB,CAAC,OAAe;QAClC,MAAM,QAAQ,GAAqC,EAAE,CAAC;QAEtD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAEhE,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACjE,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CAGJ"}
1
+ {"version":3,"file":"BaseNetwork.js","sourceRoot":"","sources":["../../../network/lib/BaseNetwork.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,OAAO,OAAgB,WAAW;IACrC,MAAM,CAAgB;IACtB,IAAI,CAAS;IAEb,YAAY,MAAqB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC5B,CAAC;IAmDD,KAAK,CAAC,gBAAgB,CAAC,OAAe;QAClC,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAE7C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;QAExD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACjE,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CAGJ"}
@@ -1,5 +1,5 @@
1
1
  import BaseNetwork from './BaseNetwork.js';
2
- import type { NetworkConfig, SignedTransaction, TransferOptions, WalletAccount } from '../types.js';
2
+ import type { AssetBalance, NetworkConfig, PreparedTransfer, SignedTransaction, TransactionStatus, TransferOptions, WalletAccount } from '../types.js';
3
3
  type BitcoinUtxo = {
4
4
  txid: string;
5
5
  vout: number;
@@ -16,9 +16,13 @@ export default class BitcoinNetwork extends BaseNetwork {
16
16
  private network;
17
17
  private url;
18
18
  constructor(config: NetworkConfig);
19
- getBalance(address: string): Promise<number>;
20
- getTokenBalance(address: string, tokenSymbol: string): Promise<number>;
19
+ validateAddress(address: string): boolean;
20
+ getBalance(address: string): Promise<string>;
21
+ getAssetBalance(address: string, asset: string): Promise<AssetBalance>;
22
+ getTokenBalance(address: string, tokenSymbol: string): Promise<string>;
21
23
  transfer(from: WalletAccount, to: string, amount: number | string, options?: TransferOptions): Promise<string>;
24
+ private buildTransaction;
25
+ prepareTransfer(from: WalletAccount, to: string, amount: string, asset: string, options?: TransferOptions): Promise<PreparedTransfer>;
22
26
  getTransaction(txid: string): Promise<string>;
23
27
  estimateTxSize(numInputs: number, numOutputs: number): number;
24
28
  createAccountDetails(keyPair: BitcoinKeyPair): WalletAccount;
@@ -28,11 +32,12 @@ export default class BitcoinNetwork extends BaseNetwork {
28
32
  accountFromMnemonic(mnemonic: string): Promise<WalletAccount>;
29
33
  createAccountFromMnemonic(wordCount?: 12 | 24): Promise<WalletAccount>;
30
34
  validateMnemonic(mnemonic: string): boolean;
31
- satoshisToBTC(satoshis: number): number;
35
+ satoshisToBTC(satoshis: number): string;
32
36
  BTCToSatoshis(btc: number | string): number;
33
37
  getUTXOs(address: string): Promise<BitcoinUtxo[]>;
34
38
  handleNativeTransfer(from: WalletAccount, to: string, amount: number | string, options?: TransferOptions): Promise<string>;
35
39
  sendSignedTransaction(signedTx: SignedTransaction | string): Promise<BitcoinBroadcastResult>;
40
+ getTransactionStatus(transactionHash: string): Promise<TransactionStatus>;
36
41
  fetchFromApi(path: string, options: RequestInit | undefined, responseType: 'text'): Promise<string>;
37
42
  fetchFromApi<T>(path: string, options?: RequestInit, responseType?: 'json'): Promise<T>;
38
43
  transferToken(): Promise<never>;
@@ -4,6 +4,7 @@ import bip39 from 'bip39';
4
4
  import * as ecc from 'tiny-secp256k1';
5
5
  import { BIP32Factory } from 'bip32';
6
6
  import { ECPairFactory } from 'ecpair';
7
+ import { formatUnits, parseDecimalToUnits } from '../../amounts.js';
7
8
  const bip32 = BIP32Factory(ecc);
8
9
  const ECPair = ECPairFactory(ecc);
9
10
  export default class BitcoinNetwork extends BaseNetwork {
@@ -15,14 +16,37 @@ export default class BitcoinNetwork extends BaseNetwork {
15
16
  this.network = networkName === 'testnet' ? bitcoin.networks.testnet : bitcoin.networks.bitcoin;
16
17
  this.url = config.url;
17
18
  }
19
+ validateAddress(address) {
20
+ try {
21
+ bitcoin.address.toOutputScript(address, this.network);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
18
28
  async getBalance(address) {
29
+ return (await this.getAssetBalance(address, this.config.nativeToken)).amount;
30
+ }
31
+ async getAssetBalance(address, asset) {
32
+ if (asset.toUpperCase() !== this.config.nativeToken) {
33
+ throw new Error(`Token ${asset} not supported on Bitcoin network`);
34
+ }
35
+ if (!this.validateAddress(address)) {
36
+ throw new Error('Invalid Bitcoin address.');
37
+ }
19
38
  try {
20
39
  const data = await this.fetchFromApi(`/address/${address}`);
21
40
  const chainStats = data.chain_stats;
22
41
  const mempoolStats = data.mempool_stats;
23
42
  const balance = (chainStats.funded_txo_sum - chainStats.spent_txo_sum) +
24
43
  (mempoolStats.funded_txo_sum - mempoolStats.spent_txo_sum);
25
- return this.satoshisToBTC(balance);
44
+ return {
45
+ asset: this.config.nativeToken,
46
+ amount: formatUnits(BigInt(balance), 8),
47
+ baseUnits: balance.toString(),
48
+ decimals: 8
49
+ };
26
50
  }
27
51
  catch (error) {
28
52
  const message = error instanceof Error ? error.message : String(error);
@@ -36,10 +60,23 @@ export default class BitcoinNetwork extends BaseNetwork {
36
60
  throw new Error(`Token ${tokenSymbol} not supported on Bitcoin network`);
37
61
  }
38
62
  async transfer(from, to, amount, options = {}) {
63
+ return (await this.buildTransaction(from, to, amount.toString(), options)).rawTransaction;
64
+ }
65
+ async buildTransaction(from, to, amount, options) {
66
+ if (!this.validateAddress(from.address) || !this.validateAddress(to)) {
67
+ throw new Error('Invalid Bitcoin address.');
68
+ }
39
69
  try {
40
70
  const utxos = await this.getUTXOs(from.address);
41
- const satoshis = this.BTCToSatoshis(amount);
42
- const feeRate = options.feeRate || 10;
71
+ const amountBaseUnits = parseDecimalToUnits(amount, 8);
72
+ if (amountBaseUnits > BigInt(Number.MAX_SAFE_INTEGER)) {
73
+ throw new Error('Bitcoin amount exceeds the safe transaction range.');
74
+ }
75
+ const satoshis = Number(amountBaseUnits);
76
+ const feeRate = options.feeRate ?? this.config.feeRate;
77
+ if (typeof feeRate !== 'number' || !Number.isInteger(feeRate) || feeRate <= 0) {
78
+ throw new Error('Bitcoin fee rate must be configured as a positive integer.');
79
+ }
43
80
  const psbt = new bitcoin.Psbt({ network: this.network });
44
81
  psbt.setVersion(2);
45
82
  psbt.setLocktime(0);
@@ -58,20 +95,22 @@ export default class BitcoinNetwork extends BaseNetwork {
58
95
  break;
59
96
  }
60
97
  }
61
- if (totalInputValue < satoshis + feeRate) {
98
+ const estimatedFee = this.estimateTxSize(psbt.inputCount, 2) * feeRate;
99
+ if (totalInputValue < satoshis + estimatedFee) {
62
100
  throw new Error('Insufficient balance for the transaction including fees.');
63
101
  }
64
102
  psbt.addOutput({
65
103
  address: to,
66
104
  value: satoshis
67
105
  });
68
- const estimatedFee = this.estimateTxSize(psbt.inputCount, 2) * feeRate;
69
106
  const changeValue = totalInputValue - satoshis - estimatedFee;
107
+ let returnedChange = 0;
70
108
  if (changeValue > 546) {
71
109
  psbt.addOutput({
72
110
  address: from.address,
73
111
  value: changeValue
74
112
  });
113
+ returnedChange = changeValue;
75
114
  }
76
115
  const keyPair = ECPair.fromWIF(from.privateKey, this.network);
77
116
  for (let i = 0; i < psbt.inputCount; i++) {
@@ -84,13 +123,40 @@ export default class BitcoinNetwork extends BaseNetwork {
84
123
  }
85
124
  }
86
125
  psbt.finalizeAllInputs();
87
- return psbt.extractTransaction().toHex();
126
+ return {
127
+ rawTransaction: psbt.extractTransaction().toHex(),
128
+ feeBaseUnits: BigInt(totalInputValue - satoshis - returnedChange),
129
+ amountBaseUnits
130
+ };
88
131
  }
89
132
  catch (error) {
90
133
  const message = error instanceof Error ? error.message : String(error);
91
134
  throw new Error(`Failed to create transaction: ${message}`);
92
135
  }
93
136
  }
137
+ async prepareTransfer(from, to, amount, asset, options = {}) {
138
+ if (asset.toUpperCase() !== this.config.nativeToken) {
139
+ throw new Error(`Token ${asset} not supported on Bitcoin network`);
140
+ }
141
+ const built = await this.buildTransaction(from, to, amount, options);
142
+ const transaction = bitcoin.Transaction.fromHex(built.rawTransaction);
143
+ return {
144
+ from: from.address,
145
+ to,
146
+ asset: this.config.nativeToken,
147
+ amount: formatUnits(built.amountBaseUnits, 8),
148
+ amountBaseUnits: built.amountBaseUnits.toString(),
149
+ fee: {
150
+ asset: this.config.nativeToken,
151
+ amount: formatUnits(built.feeBaseUnits, 8),
152
+ baseUnits: built.feeBaseUnits.toString(),
153
+ decimals: 8,
154
+ estimated: true
155
+ },
156
+ transactionHash: transaction.getId(),
157
+ rawTransaction: built.rawTransaction
158
+ };
159
+ }
94
160
  async getTransaction(txid) {
95
161
  try {
96
162
  return await this.fetchFromApi(`/tx/${txid}/hex`, {}, 'text');
@@ -181,10 +247,14 @@ export default class BitcoinNetwork extends BaseNetwork {
181
247
  return bip39.validateMnemonic(mnemonic);
182
248
  }
183
249
  satoshisToBTC(satoshis) {
184
- return satoshis / 100000000;
250
+ return formatUnits(BigInt(satoshis), 8);
185
251
  }
186
252
  BTCToSatoshis(btc) {
187
- return Math.floor(Number(btc) * 100000000);
253
+ const units = parseDecimalToUnits(btc.toString(), 8);
254
+ if (units > BigInt(Number.MAX_SAFE_INTEGER)) {
255
+ throw new Error('Bitcoin amount exceeds the safe transaction range.');
256
+ }
257
+ return Number(units);
188
258
  }
189
259
  async getUTXOs(address) {
190
260
  try {
@@ -218,6 +288,20 @@ export default class BitcoinNetwork extends BaseNetwork {
218
288
  throw new Error(`Failed to broadcast transaction: ${message}`);
219
289
  }
220
290
  }
291
+ async getTransactionStatus(transactionHash) {
292
+ const response = await fetch(`${this.url}/tx/${transactionHash}/status`);
293
+ if (response.status === 404) {
294
+ return { state: 'not_found', transactionHash };
295
+ }
296
+ if (!response.ok) {
297
+ throw new Error(`Failed to get transaction status: ${response.status} ${response.statusText}`);
298
+ }
299
+ const status = await response.json();
300
+ return {
301
+ state: status.confirmed ? 'confirmed' : 'submitted',
302
+ transactionHash
303
+ };
304
+ }
221
305
  async fetchFromApi(path, options = {}, responseType = 'json') {
222
306
  const response = await fetch(`${this.url}${path}`, options);
223
307
  if (!response.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"BitcoinNetwork.js","sourceRoot":"","sources":["../../../network/lib/BitcoinNetwork.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BitcoinNetwork.js","sourceRoot":"","sources":["../../../network/lib/BitcoinNetwork.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import BaseNetwork from './BaseNetwork.js';
2
2
  import { Web3 } from 'web3';
3
- import type { NetworkConfig, SignedTransaction, TransferOptions, WalletAccount } from '../types.js';
3
+ import type { AssetBalance, NetworkConfig, PreparedTransfer, SignedTransaction, TransactionStatus, TransferOptions, WalletAccount } from '../types.js';
4
4
  export default class Web3Network extends BaseNetwork {
5
5
  private web3;
6
6
  constructor(config: NetworkConfig);
7
7
  private formatPrivateKey;
8
+ validateAddress(address: string): boolean;
8
9
  getBalance(address: string): Promise<string>;
9
10
  transfer(from: WalletAccount, to: string, amount: number | string, options?: TransferOptions): Promise<SignedTransaction>;
10
11
  transferToken(from: WalletAccount, to: string, amount: number | string, tokenSymbol: string, options?: TransferOptions): Promise<SignedTransaction>;
@@ -12,7 +13,10 @@ export default class Web3Network extends BaseNetwork {
12
13
  getGasPrice(): Promise<bigint>;
13
14
  handleERC20Transfer(account: WalletAccount, token: string, recipient: string, amount: number | string): Promise<SignedTransaction>;
14
15
  handleNativeTransfer(account: WalletAccount, recipient: string, amount: number | string): Promise<SignedTransaction>;
15
- getTokenBalance(address: string, tokenSymbol: string): Promise<string | number>;
16
+ getTokenBalance(address: string, tokenSymbol: string): Promise<string>;
17
+ getAssetBalance(address: string, asset: string): Promise<AssetBalance>;
18
+ prepareTransfer(from: WalletAccount, to: string, amount: string, asset: string, options?: TransferOptions): Promise<PreparedTransfer>;
19
+ getTransactionStatus(transactionHash: string): Promise<TransactionStatus>;
16
20
  validatePrivateKey(privateKey: string): boolean;
17
21
  privateKeyToAccount(privateKey: string): Promise<WalletAccount>;
18
22
  createAccount(): Promise<WalletAccount>;
@@ -3,6 +3,7 @@ import { Web3 } from 'web3';
3
3
  import { ERC20_ABI } from '../abis/erc20.js';
4
4
  import bip39 from 'bip39';
5
5
  import hdkey from 'hdkey';
6
+ import { formatUnits, parseDecimalToUnits } from '../../amounts.js';
6
7
  export default class Web3Network extends BaseNetwork {
7
8
  web3;
8
9
  constructor(config) {
@@ -12,43 +13,26 @@ export default class Web3Network extends BaseNetwork {
12
13
  formatPrivateKey(privateKey) {
13
14
  return privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;
14
15
  }
16
+ validateAddress(address) {
17
+ return this.web3.utils.isAddress(address);
18
+ }
15
19
  async getBalance(address) {
16
20
  const balanceWei = await this.web3.eth.getBalance(address);
17
- return this.web3.utils.fromWei(balanceWei, 'ether');
21
+ return formatUnits(balanceWei, 18);
18
22
  }
19
23
  async transfer(from, to, amount, options = {}) {
20
- const gasPrice = await this.getGasPrice();
21
- const gasLimit = options.gasLimit || 21000;
22
- const tx = {
23
- from: from.address,
24
- to,
25
- value: this.web3.utils.toWei(amount.toString(), 'ether'),
26
- gas: gasLimit,
27
- gasPrice,
28
- ...(this.config.chainId !== undefined ? { chainId: this.config.chainId } : {})
24
+ const prepared = await this.prepareTransfer(from, to, amount.toString(), this.config.nativeToken, options);
25
+ return {
26
+ rawTransaction: prepared.rawTransaction,
27
+ transactionHash: prepared.transactionHash
29
28
  };
30
- return this.web3.eth.accounts.signTransaction(tx, from.privateKey);
31
29
  }
32
30
  async transferToken(from, to, amount, tokenSymbol, options = {}) {
33
- const tokenConfig = this.config.tokens[tokenSymbol];
34
- if (!tokenConfig)
35
- throw new Error(`Token ${tokenSymbol} not supported`);
36
- const contract = new this.web3.eth.Contract(ERC20_ABI, tokenConfig.address);
37
- const decimals = Number(await contract.methods.decimals().call());
38
- const numericAmount = typeof amount === 'number' ? amount : Number(amount);
39
- const value = BigInt(numericAmount * (10 ** decimals));
40
- const data = contract.methods.transfer(to, value.toString()).encodeABI();
41
- const gasLimit = options.gasLimit || 100000;
42
- const gasPrice = await this.getGasPrice();
43
- const tx = {
44
- from: from.address,
45
- to: tokenConfig.address,
46
- data,
47
- gas: gasLimit,
48
- gasPrice,
49
- ...(this.config.chainId !== undefined ? { chainId: this.config.chainId } : {})
31
+ const prepared = await this.prepareTransfer(from, to, amount.toString(), tokenSymbol, options);
32
+ return {
33
+ rawTransaction: prepared.rawTransaction,
34
+ transactionHash: prepared.transactionHash
50
35
  };
51
- return this.web3.eth.accounts.signTransaction(tx, from.privateKey);
52
36
  }
53
37
  async estimateGas(transaction) {
54
38
  return this.web3.eth.estimateGas(transaction);
@@ -57,24 +41,7 @@ export default class Web3Network extends BaseNetwork {
57
41
  return this.web3.eth.getGasPrice();
58
42
  }
59
43
  async handleERC20Transfer(account, token, recipient, amount) {
60
- const tokenConfig = this.config.tokens[token];
61
- if (!tokenConfig)
62
- throw new Error(`Token ${token} not supported`);
63
- const contract = new this.web3.eth.Contract(ERC20_ABI, tokenConfig.address);
64
- const decimals = parseInt(await contract.methods.decimals().call(), 10);
65
- const weiAmount = BigInt(this.web3.utils.toWei(amount, 'ether'));
66
- const adjustedAmount = weiAmount / (10n ** BigInt(18 - decimals));
67
- const data = contract.methods.transfer(recipient, adjustedAmount.toString()).encodeABI();
68
- const gasLimit = 100000;
69
- const gasPrice = await this.web3.eth.getGasPrice();
70
- const tx = {
71
- from: account.address,
72
- to: tokenConfig.address,
73
- data: data,
74
- gas: gasLimit,
75
- gasPrice: gasPrice,
76
- };
77
- return this.web3.eth.accounts.signTransaction(tx, account.privateKey);
44
+ return this.transferToken(account, recipient, amount, token);
78
45
  }
79
46
  async handleNativeTransfer(account, recipient, amount) {
80
47
  const gasPrice = await this.getGasPrice();
@@ -87,16 +54,137 @@ export default class Web3Network extends BaseNetwork {
87
54
  return this.transfer(account, recipient, amount, { gasLimit, gasPrice });
88
55
  }
89
56
  async getTokenBalance(address, tokenSymbol) {
90
- if (tokenSymbol === this.config.nativeToken) {
91
- return await this.getBalance(address);
57
+ return (await this.getAssetBalance(address, tokenSymbol)).amount;
58
+ }
59
+ async getAssetBalance(address, asset) {
60
+ if (!this.validateAddress(address)) {
61
+ throw new Error('Invalid EVM address.');
62
+ }
63
+ const symbol = asset.toUpperCase();
64
+ if (symbol === this.config.nativeToken) {
65
+ const baseUnits = await this.web3.eth.getBalance(address);
66
+ return {
67
+ asset: symbol,
68
+ amount: formatUnits(baseUnits, 18),
69
+ baseUnits: baseUnits.toString(),
70
+ decimals: 18
71
+ };
72
+ }
73
+ const tokenConfig = this.config.tokens[symbol];
74
+ if (!tokenConfig) {
75
+ throw new Error(`Token ${symbol} not supported`);
92
76
  }
93
- const tokenConfig = this.config.tokens[tokenSymbol];
94
- if (!tokenConfig)
95
- throw new Error(`Token ${tokenSymbol} not supported`);
96
77
  const contract = new this.web3.eth.Contract(ERC20_ABI, tokenConfig.address);
97
- const balance = String(await contract.methods.balanceOf(address).call());
78
+ const baseUnits = String(await contract.methods.balanceOf(address).call());
98
79
  const decimals = Number(await contract.methods.decimals().call());
99
- return Number((BigInt(balance) * 100n) / (10n ** BigInt(decimals))) / 100;
80
+ if (!Number.isInteger(decimals) || decimals < 0) {
81
+ throw new Error(`Token ${symbol} returned invalid decimals.`);
82
+ }
83
+ return {
84
+ asset: symbol,
85
+ amount: formatUnits(baseUnits, decimals),
86
+ baseUnits,
87
+ decimals
88
+ };
89
+ }
90
+ async prepareTransfer(from, to, amount, asset, options = {}) {
91
+ if (!this.validateAddress(from.address) || !this.validateAddress(to)) {
92
+ throw new Error('Invalid EVM address.');
93
+ }
94
+ const configuredChainId = this.config.chainId;
95
+ if (configuredChainId === undefined) {
96
+ throw new Error(`Network ${this.config.id} does not define a chain ID.`);
97
+ }
98
+ const providerChainId = Number(await this.web3.eth.getChainId());
99
+ if (providerChainId !== configuredChainId) {
100
+ throw new Error(`RPC chain ID mismatch: expected ${configuredChainId}, received ${providerChainId}.`);
101
+ }
102
+ const symbol = asset.toUpperCase();
103
+ const balance = await this.getAssetBalance(from.address, symbol);
104
+ const amountBaseUnits = parseDecimalToUnits(amount, balance.decimals);
105
+ if (BigInt(balance.baseUnits) < amountBaseUnits) {
106
+ throw new Error(`Insufficient ${symbol} balance.`);
107
+ }
108
+ const gasPrice = options.gasPrice !== undefined
109
+ ? BigInt(options.gasPrice)
110
+ : await this.getGasPrice();
111
+ const nonce = await this.web3.eth.getTransactionCount(from.address, 'pending');
112
+ let transaction;
113
+ if (symbol === this.config.nativeToken) {
114
+ transaction = {
115
+ from: from.address,
116
+ to,
117
+ value: amountBaseUnits.toString()
118
+ };
119
+ }
120
+ else {
121
+ const tokenConfig = this.config.tokens[symbol];
122
+ if (!tokenConfig) {
123
+ throw new Error(`Token ${symbol} not supported`);
124
+ }
125
+ const contract = new this.web3.eth.Contract(ERC20_ABI, tokenConfig.address);
126
+ transaction = {
127
+ from: from.address,
128
+ to: tokenConfig.address,
129
+ data: contract.methods.transfer(to, amountBaseUnits.toString()).encodeABI(),
130
+ value: '0'
131
+ };
132
+ }
133
+ const gas = options.gasLimit !== undefined
134
+ ? BigInt(options.gasLimit)
135
+ : await this.web3.eth.estimateGas(transaction);
136
+ const feeBaseUnits = gas * gasPrice;
137
+ const nativeBalance = await this.getAssetBalance(from.address, this.config.nativeToken);
138
+ const requiredNative = symbol === this.config.nativeToken
139
+ ? amountBaseUnits + feeBaseUnits
140
+ : feeBaseUnits;
141
+ if (BigInt(nativeBalance.baseUnits) < requiredNative) {
142
+ throw new Error(`Insufficient ${this.config.nativeToken} balance for amount and fee.`);
143
+ }
144
+ const signed = await this.web3.eth.accounts.signTransaction({
145
+ ...transaction,
146
+ nonce,
147
+ gas,
148
+ gasPrice,
149
+ chainId: configuredChainId
150
+ }, from.privateKey);
151
+ if (!signed.rawTransaction) {
152
+ throw new Error('Failed to create a signed transaction.');
153
+ }
154
+ const transactionHash = signed.transactionHash || this.web3.utils.keccak256(signed.rawTransaction);
155
+ if (!transactionHash) {
156
+ throw new Error('Failed to calculate transaction hash.');
157
+ }
158
+ return {
159
+ from: from.address,
160
+ to,
161
+ asset: symbol,
162
+ amount: formatUnits(amountBaseUnits, balance.decimals),
163
+ amountBaseUnits: amountBaseUnits.toString(),
164
+ fee: {
165
+ asset: this.config.nativeToken,
166
+ amount: formatUnits(feeBaseUnits, 18),
167
+ baseUnits: feeBaseUnits.toString(),
168
+ decimals: 18,
169
+ estimated: true
170
+ },
171
+ transactionHash,
172
+ rawTransaction: signed.rawTransaction
173
+ };
174
+ }
175
+ async getTransactionStatus(transactionHash) {
176
+ const receipt = await this.web3.eth.getTransactionReceipt(transactionHash);
177
+ if (receipt) {
178
+ return {
179
+ state: isFailedReceiptStatus(receipt.status) ? 'failed' : 'confirmed',
180
+ transactionHash
181
+ };
182
+ }
183
+ const transaction = await this.web3.eth.getTransaction(transactionHash);
184
+ return {
185
+ state: transaction ? 'submitted' : 'not_found',
186
+ transactionHash
187
+ };
100
188
  }
101
189
  validatePrivateKey(privateKey) {
102
190
  if (!privateKey) {
@@ -148,13 +236,23 @@ export default class Web3Network extends BaseNetwork {
148
236
  return bip39.validateMnemonic(mnemonic);
149
237
  }
150
238
  async sendSignedTransaction(signedTx) {
239
+ let receipt;
151
240
  if (typeof signedTx === 'string') {
152
- return this.web3.eth.sendSignedTransaction(signedTx);
241
+ receipt = await this.web3.eth.sendSignedTransaction(signedTx);
153
242
  }
154
- if (!signedTx.rawTransaction) {
155
- throw new Error('Signed transaction rawTransaction is required.');
243
+ else {
244
+ if (!signedTx.rawTransaction) {
245
+ throw new Error('Signed transaction rawTransaction is required.');
246
+ }
247
+ receipt = await this.web3.eth.sendSignedTransaction(signedTx.rawTransaction);
156
248
  }
157
- return this.web3.eth.sendSignedTransaction(signedTx.rawTransaction);
249
+ if (isFailedReceiptStatus(receipt.status)) {
250
+ throw new Error('Transaction was mined but reverted.');
251
+ }
252
+ return receipt;
158
253
  }
159
254
  }
255
+ function isFailedReceiptStatus(status) {
256
+ return status === false || status === 0 || status === 0n || status === '0x0';
257
+ }
160
258
  //# sourceMappingURL=Web3Network.js.map